Docker: Déployer avec GitHub Actions

Découvrez comment déployer vos conteneurs Docker avec GitHub Actions

👋 Bienvenue sur la documentation de Stackhero !

Stackhero propose une solution Docker cloud CaaS (Containers as a Service) prête à l'emploi qui offre de nombreux avantages, notamment :

  • Déployez facilement vos conteneurs en production avec un simple docker-compose up.
  • Nom de domaine personnalisable sécurisé en HTTPS (par exemple, https://api.votre-entreprise.com, https://www.votre-entreprise.com, https://backoffice.votre-entreprise.com).
  • Performance optimale et sécurité renforcée grâce à une VM privée et dédiée.
  • Mises à jour simplifiées en un clic.

Gagnez du temps et simplifiez-vous la vie : il suffit de 5 minutes pour essayer la solution Docker CaaS cloud hosting de Stackhero et déployer vos conteneurs en production !

GitHub Actions facilite l'automatisation de tâches comme le déploiement de vos conteneurs Docker sur des serveurs de production. Dans ce guide, vous allez découvrir comment configurer GitHub Actions de manière sécurisée et fiable pour déployer vos conteneurs Docker sur des environnements de staging et de production.

Pour cette configuration, vous allez maintenir deux branches : staging et production. À chaque fois que vous poussez du code sur l'une de ces branches, le déploiement sera automatiquement effectué sur l'instance Stackhero correspondante.

Avoir une instance de staging n'est pas obligatoire. Vous pouvez suivre ce guide en utilisant uniquement une instance de production. Cependant, pour limiter les risques et déployer en production en toute confiance, il est fortement recommandé de disposer à la fois d'une instance de staging et d'une instance de production. Il s'agit d'une pratique standard dans l'industrie et d'une bonne pratique qui permet d'éviter de nombreux problèmes potentiels.

Avant de commencer, assurez-vous de disposer d'un compte GitHub et d'un repository hébergeant votre code.

Commencez par vous connecter à votre tableau de bord Stackhero et créez deux services Stackhero, un pour le staging et un pour la production. Pour rester organisé et limiter les erreurs, vous pouvez renommer ces services en "Staging" et "Production".

Vous n'avez pas encore de compte Stackhero ? Vous pouvez en créer un gratuitement en deux minutes, puis déployer vos services Docker cloud en quelques clics seulement.

Exemple de services DockerExemple de services Docker

Pour permettre à GitHub Actions de se connecter à votre service Docker Stackhero, vous aurez besoin de deux informations : le nom de domaine de votre service et le mot de passe des certificats.

  1. Dans le tableau de bord Stackhero, sélectionnez votre service Docker "production" et cliquez sur le bouton "Configurer".

    Obtenir les paramètres du serviceObtenir les paramètres du service

  2. Copiez à la fois le "Nom de domaine" et le "Mot de passe des certificats Docker" pour les utiliser dans les étapes suivantes.

    Obtenir les paramètres du serviceObtenir les paramètres du service

  1. Dans GitHub, ouvrez votre projet.

  2. Allez dans Settings > Environments, puis cliquez sur New environment.

    Configuration des environnements GitHubConfiguration des environnements GitHub

  3. Dans le champ Name, saisissez "production" et validez.

    Définir l'environnementDéfinir l'environnement

  4. Cliquez sur le bouton No restriction et choisissez Selected branches and tags.

    Définir les restrictions d'environnementDéfinir les restrictions d'environnement

  5. Cliquez sur Add deployment branch or tag rule, saisissez "production" dans le champ Name pattern, puis cliquez sur Add rule.

    Définir la branche d'environnementDéfinir la branche d'environnement Définir la branche d'environnementDéfinir la branche d'environnement

  6. Sous Environment secrets, cliquez sur Add secret.

    Ajouter un secretAjouter un secret

  7. Pour le secret, utilisez STACKHERO_CERTIFICATES_PASSWORD comme nom et collez votre mot de passe de certificats dans le champ Value.

    Définir le secret du mot de passe des certificatsDéfinir le secret du mot de passe des certificats

  8. Sous Environment variables, cliquez sur Add variable.

    Définir les variablesDéfinir les variables

  9. Utilisez STACKHERO_ENDPOINT comme nom et collez l'endpoint de votre service Docker dans le champ Value. Vous trouverez cet endpoint dans votre tableau de bord Stackhero.

    Définir la variable endpointDéfinir la variable endpoint

Si vous avez personnalisé le nom de domaine de votre service, pensez à utiliser votre domaine personnalisé à la place de <XXXXXX>.stackhero-network.com.

Si le fichier docker-compose.yml est déjà à la racine de votre projet et que vous n'avez pas besoin de le personnaliser, vous pouvez passer cette section.

Par défaut, GitHub Actions recherche le fichier docker-compose.yml à la racine de votre projet. Si vous souhaitez utiliser un autre fichier ou une configuration différente, vous pouvez adapter la commande de déploiement. Par exemple, si vous utilisez notre boilerplate Node.js et Docker pour bien démarrer, vous pouvez créer une nouvelle variable d'environnement appelée STACKHERO_DEPLOY_COMMAND et la définir ainsi :

docker compose --env-file env.list --file docker/docker-compose.yml --file docker/docker-compose.production.yml up --build --remove-orphans -d

Sur votre machine locale, placez-vous dans votre dépôt Git et créez un dossier nommé .github/workflows. Dans ce dossier, créez un fichier nommé deploy-to-stackhero.yml avec le contenu suivant :

# File: .github/workflows/deploy-to-stackhero.yml

name: Deploy to Stackhero
description: Deploy branch "${{ github.ref_name }}" to Stackhero

on:
  push:
    # Ces branches déclenchent l'action de déploiement lors d'un push.
    # Veillez à créer un environnement correspondant au nom de la branche dans GitHub (dans Settings > Environments).
    # Ajoutez ensuite le secret STACKHERO_CERTIFICATES_PASSWORD et la variable STACKHERO_ENDPOINT dans cet environnement.
    branches: [ "production", "staging" ]

jobs:
  Deploy:
    environment: ${{ github.ref_name }}
    runs-on: ubuntu-latest
    steps:
    - uses: stackhero-io/github-actions-deploy-docker-containers-to-stackhero@v1
      with:
        # Le secret STACKHERO_CERTIFICATES_PASSWORD et la variable STACKHERO_ENDPOINT doivent être définis dans l'environnement de branche correspondant sur GitHub.
        certificates_password: ${{ secrets.STACKHERO_CERTIFICATES_PASSWORD }}
        endpoint: ${{ vars.STACKHERO_ENDPOINT }}
        # deployment_command est optionnel. Utilisez-le si vous souhaitez personnaliser la commande Docker Compose.
        deployment_command: ${{ vars.STACKHERO_DEPLOY_COMMAND }}

Vous pouvez valider vos modifications avec :

git add -A .
git commit -m "Add GitHub Actions to deploy to Stackhero"

Pour créer une branche production, exécutez :

git checkout -b production

Puis poussez votre branche production sur GitHub :

git push --set-upstream origin production

Une fois votre code poussé, GitHub Actions le déploiera automatiquement sur votre instance Stackhero de production. Vous pouvez suivre la progression du déploiement dans l'onglet Actions de votre projet GitHub.

GitHub Actions ayant déployé en productionGitHub Actions ayant déployé en production

C'est tout. Votre configuration est maintenant prête pour déployer automatiquement votre code en production avec GitHub Actions.

La mise en place de l'environnement de staging suit les mêmes étapes que pour la production. Il suffit de répéter le processus en utilisant staging à la place de production.

Ensuite, créez une branche staging avec :

git checkout -b staging

Et poussez votre branche staging sur GitHub :

git push --set-upstream origin staging

Après cela, GitHub Actions déploiera automatiquement votre branche staging sur l'instance Docker dédiée au staging.

Vous pouvez définir des variables d'environnement dans votre projet GitHub qui seront accessibles dans votre fichier docker-compose.yml. C'est très utile si vous souhaitez déployer sur des domaines différents (par exemple, staging.my-company.com pour le staging et my-company.com pour la production).

  1. Dans GitHub, allez dans Settings > Environments et créez une variable d'environnement nommée WEBSITE_DOMAIN.
  2. Pour l'environnement de staging, définissez WEBSITE_DOMAIN sur "staging.my-company.com".
  3. Pour l'environnement de production, définissez WEBSITE_DOMAIN sur "my-company.com".

Ensuite, mettez à jour votre fichier .github/workflows/deploy-to-stackhero.yml pour transmettre la variable WEBSITE_DOMAIN à l'action GitHub Stackhero :

name: Deploy to Stackhero
description: Deploy branch "${{ github.ref_name }}" to Stackhero

on:
  push:
    branches: [ "production", "staging" ]

jobs:
  Deploy:
    environment: ${{ github.ref_name }}
    runs-on: ubuntu-latest
    steps:
    - uses: stackhero-io/github-actions-deploy-docker-containers-to-stackhero@v1
      with:
        certificates_password: ${{ secrets.STACKHERO_CERTIFICATES_PASSWORD }}
        endpoint: ${{ vars.STACKHERO_ENDPOINT }}
        deployment_command: ${{ vars.STACKHERO_DEPLOY_COMMAND }}
      env:
        WEBSITE_DOMAIN: ${{ vars.WEBSITE_DOMAIN }}

Mettez ensuite à jour votre fichier docker-compose.yml pour utiliser la variable WEBSITE_DOMAIN à la place d'un nom de domaine en dur :

services:
  test:
    image: nginx
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.test.rule=Host(`${WEBSITE_DOMAIN}`)" # Utilise la variable d'environnement WEBSITE_DOMAIN comme nom de domaine.
      - "traefik.http.routers.test.tls.certresolver=letsencrypt"

Il est conseillé de protéger les branches production et staging pour éviter les pushs directs. Avec la protection des branches activée, les modifications passent par des pull requests, qui doivent être relues et fusionnées par une personne disposant des droits nécessaires. Cela permet de valider les fonctionnalités sur la plateforme de staging avant de les promouvoir en production après validation.

En suivant ce workflow, vous garantissez à la fois la sécurité (seuls les membres autorisés de l'équipe peuvent déployer sur le staging et la production) et la fiabilité (en testant les nouvelles fonctionnalités sur une plateforme de staging avant de les déployer en production).