Docker: Distribuire con GitHub Actions

Scopri come distribuire i tuoi 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 ti consente di automatizzare attività come la distribuzione dei tuoi container Docker su server di produzione. In questa guida, imparerai a configurare GitHub Actions in modo sicuro e affidabile per distribuire i tuoi container Docker sia in ambienti di staging che di produzione.

Per questa configurazione, manterrai due branch: staging e production. Il codice inviato a ciascun branch verrà automaticamente distribuito all'istanza corrispondente di Stackhero.

Avere un'istanza di staging non è obbligatorio. Puoi seguire questa guida utilizzando solo un'istanza di produzione. Tuttavia, per ridurre i rischi e aumentare la fiducia durante la distribuzione in produzione, è fortemente consigliato avere sia un'istanza di staging che di produzione. Questo è uno standard del settore e una buona pratica che può aiutarti a evitare molti problemi potenziali.

Prima di iniziare, assicurati di avere un account GitHub con un repository che ospita il tuo codice.

Inizia accedendo alla tua dashboard di Stackhero e creando due servizi Stackhero: uno per lo staging e uno per la produzione. Per minimizzare gli errori, puoi rinominare questi servizi in "Staging" e "Production".

Non hai ancora un account Stackhero? Puoi crearne uno gratuitamente in soli due minuti e poi creare i tuoi servizi cloud Docker con pochi clic.

Esempio di servizi DockerEsempio di servizi Docker

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

  1. Nella dashboard di Stackhero, seleziona il tuo servizio Docker "production" e fai clic sul pulsante "Configure".

    Ottieni le impostazioni del servizioOttieni le impostazioni del servizio

  2. Copia il "Domain name" e la "Docker certificates password" per utilizzarli nei passaggi successivi.

    Ottieni le impostazioni del servizioOttieni le impostazioni del servizio

  1. Vai su GitHub e seleziona il tuo progetto.

  2. Fai clic su Settings > Environments e poi su New environment.

    Configurazione degli ambienti GitHubConfigurazione degli ambienti GitHub

  3. Nel campo Name, inserisci "production" e conferma.

    Impostazione dell'ambienteImpostazione dell'ambiente

  4. Fai clic sul pulsante No restriction e seleziona Selected branches and tags.

    Impostazione delle restrizioni dell'ambienteImpostazione delle restrizioni dell'ambiente

  5. Fai clic su Add deployment branch or tag rule, inserisci "production" nel campo Name pattern, e poi fai 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, fai clic su Add secret.

    Aggiungi un segretoAggiungi un segreto

  7. Per il segreto, inserisci STACKHERO_CERTIFICATES_PASSWORD come nome e incolla la tua password dei certificati come Value.

    Impostazione del segreto della password dei certificatiImpostazione del segreto della password dei certificati

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

    Impostazione delle variabiliImpostazione delle variabili

  9. Inserisci STACKHERO_ENDPOINT come nome e incolla il tuo endpoint del servizio Docker nel campo Value. Puoi trovare questo endpoint nella tua dashboard di Stackhero.

    Impostazione della variabile endpointImpostazione della variabile endpoint

Se hai personalizzato il nome di dominio del tuo servizio, usa la versione personalizzata invece di xxxxxx.stackhero-network.com.

Se il file docker-compose.yml è presente nella radice del tuo progetto e non sono necessarie personalizzazioni, puoi ignorare questa sezione.

Per impostazione predefinita, GitHub Actions si aspetta che il file Docker Compose docker-compose.yml sia nella radice del tuo progetto. Se hai bisogno di utilizzare un file diverso, puoi personalizzare il comando di distribuzione. Ad esempio, se utilizzi il nostro boilerplate di avvio con Node.js e Docker, puoi creare una nuova variabile d'ambiente chiamata STACKHERO_DEPLOY_COMMAND e impostarla come segue:

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

Sul tuo computer locale, naviga nel tuo repository Git e crea una directory chiamata .github/workflows. In questa directory, crea un file chiamato deploy-to-stackhero.yml con il seguente contenuto:

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

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

on:
  push:
    # Questi branch attivano l'azione di distribuzione al push.
    # Assicurati di creare un ambiente corrispondente al nome del branch su GitHub (sotto Settings > Environments).
    # Poi aggiungi il segreto STACKHERO_CERTIFICATES_PASSWORD e la variabile STACKHERO_ENDPOINT in quell'ambiente.
    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:
        # Il segreto STACKHERO_CERTIFICATES_PASSWORD e la variabile STACKHERO_ENDPOINT devono essere definiti nell'ambiente del branch corrispondente su GitHub.
        certificates_password: ${{ secrets.STACKHERO_CERTIFICATES_PASSWORD }}
        endpoint: ${{ vars.STACKHERO_ENDPOINT }}
        # deployment_command è opzionale. Usalo se hai bisogno di personalizzare il comando Docker Compose.
        deployment_command: ${{ vars.STACKHERO_DEPLOY_COMMAND }}

Conferma le tue modifiche eseguendo:

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

Successivamente, crea un branch di produzione eseguendo:

git checkout -b production

Infine, invia il tuo branch di produzione su GitHub:

git push --set-upstream origin production

Una volta inviato, GitHub Actions distribuirà automaticamente il tuo codice alla tua istanza di produzione Stackhero. Puoi monitorare la distribuzione visitando la scheda Actions nel tuo progetto GitHub.

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

Congratulazioni! Ora puoi distribuire automaticamente il tuo codice in produzione utilizzando GitHub Actions.

La configurazione dell'ambiente di staging è simile a quella della produzione. Basta ripetere i passaggi sopra, sostituendo production con staging.

Quindi, crea un branch di staging eseguendo:

git checkout -b staging

Invia il tuo branch di staging su GitHub con:

git push --set-upstream origin staging

GitHub Actions distribuirà automaticamente il tuo branch di staging all'istanza Docker designata per lo staging.

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

  1. Su GitHub, vai su Settings > Environments e crea una variabile d'ambiente chiamata WEBSITE_DOMAIN.
  2. Per l'ambiente di staging, imposta WEBSITE_DOMAIN su "staging.my-company.com".
  3. Per l'ambiente di produzione, imposta WEBSITE_DOMAIN su "my-company.com".

Quindi, aggiorna il file .github/workflows/deploy-to-stackhero.yml per passare la variabile WEBSITE_DOMAIN all'azione GitHub Stackhero:

name: Deploy to Stackhero
description: Distribuire il branch "${{ github.ref_name }}" su 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 }}

Infine, aggiorna il tuo 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 pratica proteggere i branch production e staging per evitare push diretti. Con la protezione dei branch attivata, deve essere creata una pull request per il branch staging e poi fusa da qualcuno con le autorizzazioni necessarie. Una volta convalidato sulla piattaforma di staging, lo stesso processo può essere seguito per il branch production.

Questo approccio aiuta a garantire sia la sicurezza (solo i membri autorizzati del team possono distribuire su staging e produzione) sia l'affidabilità (le funzionalità vengono testate su una piattaforma di staging prima della distribuzione in produzione).