Docker: Distribuire con GitHub Actions

Scoprite come distribuire i vostri container Docker utilizzando GitHub Actions

👋 Benvenuti nella documentazione di Stackhero!

Stackhero offre una soluzione Docker cloud CaaS (Containers as a Service) pronta all'uso che fornisce numerosi vantaggi, tra cui:

  • Distribuisci facilmente i tuoi container in produzione con un semplice docker-compose up.
  • Nome di dominio personalizzabile protetto con HTTPS (ad esempio, https://api.tua-azienda.com, https://www.tua-azienda.com, https://backoffice.tua-azienda.com).
  • Prestazioni ottimali e sicurezza robusta grazie a una VM privata e dedicata.
  • Aggiornamenti senza sforzo con un solo clic.

Risparmia tempo e semplifica la tua vita: bastano 5 minuti per provare la soluzione di hosting cloud Docker CaaS di Stackhero e distribuire i tuoi container in produzione!

GitHub Actions semplifica l'automazione di attività come la distribuzione dei container Docker sui server di produzione. In questa guida vedrete come configurare GitHub Actions in modo sicuro e affidabile per distribuire i vostri container Docker sia in ambienti di staging che di produzione.

Per questa configurazione, manterrete due branch: staging e production. Ogni volta che effettuerete un push su uno di questi branch, il codice verrà automaticamente distribuito sull'istanza Stackhero corrispondente.

Disporre di un'istanza di staging non è obbligatorio. Potete seguire questa guida utilizzando solo un'istanza di produzione. Tuttavia, per ridurre i rischi e aumentare la sicurezza nelle distribuzioni in produzione, è fortemente consigliato avere sia un'istanza di staging che una di produzione. Si tratta di uno standard di settore e di una best practice che può aiutarvi a evitare molti potenziali problemi.

Prima di iniziare, assicuratevi di avere un account GitHub e un repository che ospiti il vostro codice.

Accedete al vostro pannello di controllo Stackhero e create due servizi Stackhero, uno per lo staging e uno per la produzione. Per mantenere ordine e ridurre al minimo gli errori, potete rinominare questi servizi in "Staging" e "Production".

Non avete ancora un account Stackhero? Potete crearne uno gratuitamente in soli due minuti e poi configurare i vostri servizi Docker cloud con pochi clic.

Esempio di servizi DockerEsempio di servizi Docker

Per consentire a GitHub Actions di connettersi al vostro servizio Docker Stackhero, avrete bisogno di due informazioni: il nome di dominio del servizio e la password dei certificati.

  1. Nel pannello di controllo Stackhero, selezionate il vostro servizio Docker "production" e fate clic sul pulsante "Configure".

    Ottenere le impostazioni del servizioOttenere le impostazioni del servizio

  2. Copiate sia il "Domain name" che la "Docker certificates password" per utilizzarli nei passaggi successivi.

    Ottenere le impostazioni del servizioOttenere le impostazioni del servizio

  1. In GitHub, aprite il vostro progetto.

  2. Andate su Settings > Environments, quindi fate clic su New environment.

    Configurazione degli ambienti GitHubConfigurazione degli ambienti GitHub

  3. Nel campo Name, inserite "production" e confermate.

    Impostazione dell'ambienteImpostazione dell'ambiente

  4. Fate clic sul pulsante No restriction e scegliete Selected branches and tags.

    Impostazione delle restrizioni dell'ambienteImpostazione delle restrizioni dell'ambiente

  5. Fate clic su Add deployment branch or tag rule, inserite "production" nel campo Name pattern e poi fate clic su Add rule.

    Impostazione del branch dell'ambienteImpostazione del branch dell'ambiente Impostazione del branch dell'ambienteImpostazione del branch dell'ambiente

  6. Sotto Environment secrets, fate clic su Add secret.

    Aggiungi secretAggiungi secret

  7. Per il secret, usate STACKHERO_CERTIFICATES_PASSWORD come nome e incollate la vostra password dei certificati nel campo Value.

    Impostazione del secret della password dei certificatiImpostazione del secret della password dei certificati

  8. Sotto Environment variables, fate clic su Add variable.

    Impostazione delle variabiliImpostazione delle variabili

  9. Usate STACKHERO_ENDPOINT come nome e incollate l'endpoint del vostro servizio Docker nel campo Value. Potete trovare questo endpoint nel vostro pannello di controllo Stackhero.

    Impostazione della variabile endpointImpostazione della variabile endpoint

Se avete personalizzato il nome di dominio del vostro servizio, ricordate di utilizzare il vostro dominio personalizzato invece di <XXXXXX>.stackhero-network.com.

Se il file docker-compose.yml si trova già nella root del vostro progetto e non avete bisogno di personalizzazioni, potete saltare questa sezione.

Per impostazione predefinita, GitHub Actions cercherà il file docker-compose.yml nella directory principale del progetto. Se avete bisogno di utilizzare un file diverso o una configurazione personalizzata, potete modificare il comando di deploy. Ad esempio, se utilizzate il nostro boilerplate Node.js e Docker per iniziare, potete creare una nuova variabile d'ambiente chiamata STACKHERO_DEPLOY_COMMAND e impostarla così:

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

Sul vostro computer locale, posizionatevi nella repository Git e create una cartella chiamata .github/workflows. All'interno di questa cartella, create un file chiamato deploy-to-stackhero.yml con il seguente contenuto:

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

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

on:
  push:
    # These branches trigger the deploy action on push.
    # Be sure to create an environment matching the branch name in GitHub (under Settings > Environments).
    # Then add the secret STACKHERO_CERTIFICATES_PASSWORD and variable STACKHERO_ENDPOINT in that environment.
    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:
        # The secret STACKHERO_CERTIFICATES_PASSWORD and the variable STACKHERO_ENDPOINT should be defined in the corresponding branch environment on GitHub.
        certificates_password: ${{ secrets.STACKHERO_CERTIFICATES_PASSWORD }}
        endpoint: ${{ vars.STACKHERO_ENDPOINT }}
        # deployment_command is optional. You can use it if you need to customize the Docker Compose command.
        deployment_command: ${{ vars.STACKHERO_DEPLOY_COMMAND }}

Potete confermare le modifiche con:

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

Per creare un branch di produzione, eseguite:

git checkout -b production

Poi effettuate il push del branch production su GitHub:

git push --set-upstream origin production

Una volta che il codice è stato inviato, GitHub Actions lo distribuirà automaticamente sulla vostra istanza Stackhero di produzione. Potete monitorare l'avanzamento della distribuzione tramite la scheda Actions del vostro progetto GitHub.

GitHub Actions che ha distribuito in produzioneGitHub Actions che ha distribuito in produzione

Ecco fatto. Ora siete pronti per distribuire automaticamente il vostro codice in produzione utilizzando GitHub Actions.

La configurazione dell'ambiente di staging segue gli stessi passaggi della produzione. Basta ripetere il processo, ma utilizzando staging invece di production.

Quindi, create un branch di staging eseguendo:

git checkout -b staging

E fate il push del branch staging su GitHub:

git push --set-upstream origin staging

Dopo questo, GitHub Actions distribuirà automaticamente il branch di staging sull'istanza Docker dedicata allo staging.

Potete definire variabili d'ambiente nel vostro progetto GitHub che saranno accessibili all'interno del file docker-compose.yml. Questo è molto utile se volete distribuire su domini diversi (ad esempio, staging.my-company.com per lo staging e my-company.com per la produzione).

  1. In GitHub, andate su Settings > Environments e create una variabile d'ambiente chiamata WEBSITE_DOMAIN.
  2. Per l'ambiente di staging, impostate WEBSITE_DOMAIN su "staging.my-company.com".
  3. Per l'ambiente di produzione, impostate WEBSITE_DOMAIN su "my-company.com".

Successivamente, aggiornate il file .github/workflows/deploy-to-stackhero.yml per passare la variabile WEBSITE_DOMAIN all'azione 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 }}

Ora aggiornate il file docker-compose.yml per utilizzare la variabile WEBSITE_DOMAIN invece di un nome di dominio hard-coded:

services:
  test:
    image: nginx
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.test.rule=Host(`${WEBSITE_DOMAIN}`)" # Utilizza la variabile d'ambiente WEBSITE_DOMAIN come nome di dominio.
      - "traefik.http.routers.test.tls.certresolver=letsencrypt"

È buona prassi proteggere i branch production e staging per evitare push diretti. Con la protezione dei branch attivata, le modifiche vengono introdotte tramite pull request, che devono essere revisionate e unite da una persona con i permessi adeguati. In questo modo, le funzionalità vengono prima validate sulla piattaforma di staging e poi promosse in produzione solo dopo l'approvazione.

Seguendo questo workflow, garantite sia la sicurezza (solo i membri autorizzati del team possono distribuire su staging e produzione) sia l'affidabilità (testando le nuove funzionalità su una piattaforma di staging prima della distribuzione in produzione).