Docker: Bereitstellung mit GitHub Actions

Erfahren Sie, wie Sie Ihre Docker-Container mit GitHub Actions bereitstellen

👋 Willkommen in der Stackhero-Dokumentation!

Stackhero bietet eine einsatzbereite Docker Cloud CaaS (Containers as a Service) Lösung, die zahlreiche Vorteile bietet, darunter:

  • Einfache Bereitstellung Ihrer Container in der Produktion mit nur einem docker-compose up.
  • Anpassbarer Domainname gesichert mit HTTPS (zum Beispiel, https://api.ihre-firma.com, https://www.ihre-firma.com, https://backoffice.ihre-firma.com).
  • Optimale Leistung und robuste Sicherheit durch eine private und dedizierte VM.
  • Mühelose Updates mit nur einem Klick.

Sparen Sie Zeit und vereinfachen Sie Ihr Leben: Es dauert nur 5 Minuten, um die Docker CaaS Cloud Hosting Lösung von Stackhero auszuprobieren und Ihre Container in der Produktion bereitzustellen!

GitHub Actions ermöglicht es Ihnen, Aufgaben wie das Bereitstellen Ihrer Docker-Container auf Produktionsservern zu automatisieren. In diesem Leitfaden lernen Sie, wie Sie GitHub Actions sicher und zuverlässig einrichten, um Ihre Docker-Container sowohl in Staging- als auch in Produktionsumgebungen bereitzustellen.

Für diese Einrichtung werden Sie zwei Branches pflegen: staging und production. Code, der in jeden Branch gepusht wird, wird automatisch auf die entsprechende Stackhero-Instanz bereitgestellt.

Eine Staging-Instanz ist nicht zwingend erforderlich. Sie können diesem Leitfaden auch nur mit einer Produktionsinstanz folgen. Um jedoch Risiken zu minimieren und Vertrauen beim Bereitstellen in die Produktion aufzubauen, wird dringend empfohlen, sowohl eine Staging- als auch eine Produktionsinstanz zu haben. Dies ist ein Industriestandard und eine bewährte Praxis, die Ihnen helfen kann, viele potenzielle Probleme zu vermeiden.

Bevor Sie beginnen, stellen Sie sicher, dass Sie ein GitHub-Konto mit einem Repository haben, das Ihren Code hostet.

Beginnen Sie, indem Sie sich in Ihr Stackhero-Dashboard einloggen und zwei Stackhero-Dienste erstellen: einen für das Staging und einen für die Produktion. Um Fehler zu minimieren, können Sie diese Dienste in "Staging" und "Production" umbenennen.

Haben Sie noch kein Stackhero-Konto? Sie können in nur zwei Minuten kostenlos eines erstellen und dann Ihre Docker-Cloud-Dienste mit nur wenigen Klicks erstellen.

Beispiel für Docker-DiensteBeispiel für Docker-Dienste

Um GitHub Actions die Verbindung zu Ihrem Stackhero-Docker-Dienst zu ermöglichen, benötigen Sie zwei Informationen: den Domainnamen Ihres Dienstes und das Zertifikatspasswort.

  1. Wählen Sie im Stackhero-Dashboard Ihren "production" Docker-Dienst aus und klicken Sie auf die Schaltfläche "Konfigurieren".

    Dienst-Einstellungen abrufenDienst-Einstellungen abrufen

  2. Kopieren Sie den "Domainnamen" und das "Docker-Zertifikatspasswort" zur Verwendung in den nächsten Schritten.

    Dienst-Einstellungen abrufenDienst-Einstellungen abrufen

  1. Gehen Sie zu GitHub und wählen Sie Ihr Projekt aus.

  2. Klicken Sie auf Settings > Environments und dann auf New environment.

    GitHub-Umgebungen konfigurierenGitHub-Umgebungen konfigurieren

  3. Geben Sie im Feld Name "production" ein und bestätigen Sie.

    Umgebung festlegenUmgebung festlegen

  4. Klicken Sie auf die Schaltfläche No restriction und wählen Sie Selected branches and tags.

    Umgebungsbeschränkungen festlegenUmgebungsbeschränkungen festlegen

  5. Klicken Sie auf Add deployment branch or tag rule, geben Sie "production" im Feld Name pattern ein und klicken Sie dann auf Add rule.

    Umgebungsbranch festlegenUmgebungsbranch festlegen Umgebungsbranch festlegenUmgebungsbranch festlegen

  6. Unter Environment secrets klicken Sie auf Add secret.

    Geheimnis hinzufügenGeheimnis hinzufügen

  7. Geben Sie für das Geheimnis STACKHERO_CERTIFICATES_PASSWORD als Namen ein und fügen Sie Ihr Zertifikatspasswort als Value ein.

    Zertifikatspasswort-Geheimnis festlegenZertifikatspasswort-Geheimnis festlegen

  8. Unter Environment variables klicken Sie auf Add variable.

    Variablen festlegenVariablen festlegen

  9. Geben Sie STACKHERO_ENDPOINT als Namen ein und fügen Sie Ihren Docker-Dienst-Endpunkt in das Feld Value ein. Sie finden diesen Endpunkt in Ihrem Stackhero-Dashboard.

    Endpunktvariable festlegenEndpunktvariable festlegen

Wenn Sie den Domainnamen Ihres Dienstes angepasst haben, verwenden Sie die angepasste Version anstelle von xxxxxx.stackhero-network.com.

Wenn die Datei docker-compose.yml im Stammverzeichnis Ihres Projekts vorhanden ist und keine Anpassungen erforderlich sind, können Sie diesen Abschnitt ignorieren.

Standardmäßig erwartet GitHub Actions, dass die Docker Compose-Datei docker-compose.yml im Stammverzeichnis Ihres Projekts liegt. Wenn Sie eine andere Datei verwenden müssen, können Sie den Bereitstellungsbefehl anpassen. Wenn Sie beispielsweise unser Getting started with Node.js and Docker boilerplate verwenden, können Sie eine neue Umgebungsvariable namens STACKHERO_DEPLOY_COMMAND erstellen und sie wie folgt festlegen:

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

Navigieren Sie auf Ihrem lokalen Rechner zu Ihrem Git-Repository und erstellen Sie ein Verzeichnis namens .github/workflows. Erstellen Sie in diesem Verzeichnis eine Datei namens deploy-to-stackhero.yml mit folgendem Inhalt:

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

name: Deploy to Stackhero
description: Branch "${{ github.ref_name }}" auf Stackhero bereitstellen

on:
  push:
    # Diese Branches lösen die Bereitstellungsaktion bei einem Push aus.
    # Stellen Sie sicher, dass Sie eine Umgebung erstellen, die dem Branch-Namen in GitHub entspricht (unter Settings > Environments).
    # Fügen Sie dann das Geheimnis STACKHERO_CERTIFICATES_PASSWORD und die Variable STACKHERO_ENDPOINT in dieser Umgebung hinzu.
    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:
        # Das Geheimnis STACKHERO_CERTIFICATES_PASSWORD und die Variable STACKHERO_ENDPOINT sollten in der entsprechenden Branch-Umgebung auf GitHub definiert sein.
        certificates_password: ${{ secrets.STACKHERO_CERTIFICATES_PASSWORD }}
        endpoint: ${{ vars.STACKHERO_ENDPOINT }}
        # deployment_command ist optional. Verwenden Sie es, wenn Sie den Docker Compose-Befehl anpassen müssen.
        deployment_command: ${{ vars.STACKHERO_DEPLOY_COMMAND }}

Committen Sie Ihre Änderungen, indem Sie ausführen:

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

Erstellen Sie als Nächstes einen Produktionsbranch, indem Sie ausführen:

git checkout -b production

Schließlich pushen Sie Ihren Produktionsbranch zu GitHub:

git push --set-upstream origin production

Sobald gepusht, wird GitHub Actions Ihren Code automatisch auf Ihrer Produktions-Stackhero-Instanz bereitstellen. Sie können die Bereitstellung überwachen, indem Sie den Actions-Tab in Ihrem GitHub-Projekt besuchen.

GitHub Actions, die in die Produktion bereitgestellt wurdenGitHub Actions, die in die Produktion bereitgestellt wurden

Herzlichen Glückwunsch! Sie können jetzt Ihren Code automatisch mit GitHub Actions in die Produktion bereitstellen.

Das Einrichten der Staging-Umgebung ist ähnlich wie das der Produktion. Wiederholen Sie einfach die obigen Schritte und ersetzen Sie production durch staging.

Erstellen Sie dann einen Staging-Branch, indem Sie ausführen:

git checkout -b staging

Pushen Sie Ihren Staging-Branch zu GitHub mit:

git push --set-upstream origin staging

GitHub Actions wird Ihren Staging-Branch automatisch auf die für das Staging vorgesehene Docker-Instanz bereitstellen.

Sie können Umgebungsvariablen in Ihrem GitHub-Projekt definieren, die innerhalb Ihrer docker-compose.yml-Datei zugänglich sind. Dies ist nützlich, wenn Sie auf verschiedene Domains bereitstellen möchten (zum Beispiel staging.my-company.com für das Staging und my-company.com für die Produktion).

  1. Gehen Sie auf GitHub zu Settings > Environments und erstellen Sie eine Umgebungsvariable namens WEBSITE_DOMAIN.
  2. Für die Staging-Umgebung setzen Sie WEBSITE_DOMAIN auf "staging.my-company.com".
  3. Für die Produktionsumgebung setzen Sie WEBSITE_DOMAIN auf "my-company.com".

Aktualisieren Sie dann die Datei .github/workflows/deploy-to-stackhero.yml, um die Variable WEBSITE_DOMAIN an die Stackhero GitHub Action zu übergeben:

name: Deploy to Stackhero
description: Branch "${{ github.ref_name }}" auf Stackhero bereitstellen

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 }}

Aktualisieren Sie schließlich Ihre docker-compose.yml-Datei, um die Variable WEBSITE_DOMAIN anstelle eines fest codierten Domainnamens zu verwenden:

services:
  test:
    image: nginx
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.test.rule=Host(`${WEBSITE_DOMAIN}`)" # Verwendet die Umgebungsvariable WEBSITE_DOMAIN als Domainnamen.
      - "traefik.http.routers.test.tls.certresolver=letsencrypt"

Es ist eine gute Praxis, die Branches production und staging zu schützen, um direkte Pushes zu verhindern. Mit aktivierter Branch-Schutzfunktion muss ein Pull-Request für den staging-Branch erstellt und dann von jemandem mit den erforderlichen Berechtigungen zusammengeführt werden. Sobald auf der Staging-Plattform validiert, kann derselbe Prozess für den production-Branch befolgt werden.

Dieser Ansatz hilft, sowohl die Sicherheit (nur autorisierte Teammitglieder können auf Staging und Produktion bereitstellen) als auch die Zuverlässigkeit (Funktionen werden auf einer Staging-Plattform getestet, bevor sie in die Produktion bereitgestellt werden) zu gewährleisten.