Multi Docker sur un serveur (Hetzner)

Hello,

Est-il possible techniquement d’avoir plusieurs Docker sur un même serveur ?

Je m’explique : j’ai plusieurs noms de domaines et sous-domaines. J’aimerai me servir d’un seul serveur chez Hetzner pour pouvoir gérer plusieurs Directus (genre api1.nomdedomaine.com, api2.nomdedomaine.com, etc)

Le but est de ne pas payer à chaque fois pour un nouveau serveur, mais plutôt d’en utiliser qu’un seul pour faire différents tests de développement de web services (avoir plusieurs Directus en parallèle). Je sais bien qu’un seul ne suffira pas en production, mais je ne recherche pas les performances pour le moment. J’ai bien conscience qu’un vrai webservice en développement devra avoir son propre serveur, dimensionné en conséquence.

S’il est donc possible de procéder ainsi, je suis preneur d’un début de piste. Je ne trouve rien sur Google. J’ai déjà essayé de jouer avec les ports et différents users, mais à un moment ça coince (ou alors je m’y prends mal, mais ça semble devenir un sac de noeud)…

Merci et bonne soirée :slight_smile:

Bonjour,

Oui c’est tout à fait possible en utilisant un reverse proxy d’avoir plusieurs services, plusieurs sous-domaines sur un même serveur (et heureusement) ^^.
Tu peux aller voir du côté de nginx (https://www.nginx.com/) ou traefik (Traefik Proxy Documentation - Traefik) qui est plus orienté conteneurs si tu utilises Docker.

Perso j’ai un petit VPS qui contient plusieurs services avec plusieurs sous-domaines. C’est largement suffisant pour le dev.

1 « J'aime »

Merci @Mrt1 pour ta réponse.

Sur le point de me plonger dans la doc de Traefik qui semble répondre à mon problème, je me suis dit que j’allais tout de même tenter quelque chose avec Docker et le fichier compose.yml. J’ai toujours pensé que la solution pouvait être là et j’ai tout remis à plat et mis mes neurones en marche. Résultat, j’ai trouvé une solution « simple », qui ne demande que très peu de manipulations et qui s’utilise, comme moi, avec un serveur de type Hetzner et une image avec Docker directement installé (cf le cours sur Docker de @mbritto). En fait, j’adore développer et écrire du code, mais je n’aime pas passer des heures à configurer un serveur, ce n’est pas mon rayon.

Il suffit donc simplement de définir les fichiers compose.yml et Caddyfile comme je le montre ci-dessous. Dans cet exemple il y a 2 serveurs en parallèle, mais on peut très bien imaginer augmenter le nombre en fonction des ressources disponibles et nécessaires pour chacun d’eux.

Le fichier compose.yml :

version: "3"
services:

  caddy:
    image: caddy:2.7
    restart: always
    cap_add:
      - NET_ADMIN
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - ./caddy/Caddyfile:/etc/caddy/Caddyfile
      - ./caddy/data:/data
      - ./caddy/config:/config

  database1:
    restart: always
    image: postgis/postgis:13-master
    volumes:
      - ./data/database1:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: "directus"
      POSTGRES_PASSWORD_FILE: "/run/secrets/database_password1"
      POSTGRES_DB: "directus"
      PGPORT: 61432
    secrets:
      - database_password1

  database2:
    restart: always
    image: postgis/postgis:13-master
    volumes:
      - ./data/database2:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: "directus"
      POSTGRES_PASSWORD_FILE: "/run/secrets/database_password2"
      POSTGRES_DB: "directus"
      PGPORT: 62432
    secrets:
      - database_password2

  directus1:
    restart: always
    image: directus/directus:10.10.4
    ports:
      - 8155:8155
    volumes:
      - ./directus1/uploads:/directus/uploads
    depends_on:
      - database1
    environment:
      KEY: "08ff164b-723a-428f-b89f-7a010264a72f"
      SECRET_FILE: "/run/secrets/directus_secret_key1"
      LOG_LEVEL: "info"
      PORT: 8155
      DB_CLIENT: "pg"
      DB_HOST: "database1"
      DB_PORT: "61432"
      DB_DATABASE: "directus"
      DB_USER: "directus"
      DB_PASSWORD_FILE: "/run/secrets/database_password1"
      ADMIN_EMAIL: "[email protected]"
      ADMIN_PASSWORD_FILE: "/run/secrets/directus_admin_password1"
      PUBLIC_URL: "https://api1.myserver.com"
    secrets:
      - database_password1
      - directus_secret_key1
      - directus_admin_password1

  directus2:
    restart: always
    image: directus/directus:10.10.4
    ports:
      - 8255:8255
    volumes:
      - ./directus2/uploads:/directus/uploads
    depends_on:
      - database2
    environment:
      KEY: "0c787822-d115-47e4-8984-c5f14298d24b"
      SECRET_FILE: "/run/secrets/directus_secret_key2"
      LOG_LEVEL: "info"
      PORT: 8255
      DB_CLIENT: "pg"
      DB_HOST: "database2"
      DB_PORT: "62432"
      DB_DATABASE: "directus"
      DB_USER: "directus"
      DB_PASSWORD_FILE: "/run/secrets/database_password2"

      ADMIN_EMAIL: "[email protected]"
      ADMIN_PASSWORD_FILE: "/run/secrets/directus_admin_password2"
      PUBLIC_URL: "https://api2.myserver.com"

    secrets:
      - database_password2
      - directus_secret_key2
      - directus_admin_password2

secrets:
  # server 1
  database_password1:
    file: ./secrets1/database_password.txt
  directus_secret_key1:
    file: ./secrets1/directus_secret_key.txt
  directus_admin_password1:
    file: ./secrets1/directus_admin_password.txt

  # server 2
  database_password2:
    file: ./secrets2/database_password.txt
  directus_secret_key2:
    file: ./secrets2/directus_secret_key.txt
  directus_admin_password2:
    file: ./secrets2/directus_admin_password.txt

Le fichier Caddyfile (que je mets dans le sous-répertoire ./caddy) :

api1.myserver.com {
  reverse_proxy http://directus1:8155
}

api2.myserver.com {
  reverse_proxy http://directus2:8255 
}

Je crée également 2 dossiers « secrets1 » et « secrets2 » à la racine, soit un dossier par serveur, contenant chacun les fichiers .txt avec les mots de passe respectifs :

  • database_password.txt
  • directus_secret_key.txt
  • directus_admin_password.txt

Ne pas oublier de donner les droits d’écriture aux sous-dossiers « uploads » dans les dossiers « ./directus1 » et « ./directus2 » qui sont créés lors du déploiement du fichier compose.yml.

Inutile aussi de rappeler de faire pointer les DNS api1.myserver.com et api2.myserver.com vers l’adresse IP du serveur.

Voilà j’espère donc que cela servira à quelques-uns, notamment pour tester différents projets en cours de développement. C’est bien entendu encore perfectible, mais je suis déjà très content de ce résultat, qui va bien me faciliter la vie :wink:

Je vais essayer de rédiger un petit tuto, en détaillant la création étape par étape. Reste à savoir encore où l’héberger.

++

2 « J'aime »