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.
Erstellen der Docker-Dienste
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-Dienste
Konfigurieren der Umgebungsvariablen und Geheimnisse
Erhalten Sie den Domainnamen und das Zertifikatspasswort
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.
-
Wählen Sie im Stackhero-Dashboard Ihren "production" Docker-Dienst aus und klicken Sie auf die Schaltfläche "Konfigurieren".
Dienst-Einstellungen abrufen -
Kopieren Sie den "Domainnamen" und das "Docker-Zertifikatspasswort" zur Verwendung in den nächsten Schritten.
Dienst-Einstellungen abrufen
Setzen Sie den Domainnamen und das Zertifikatspasswort in GitHub
-
Gehen Sie zu GitHub und wählen Sie Ihr Projekt aus.
-
Klicken Sie auf Settings > Environments und dann auf New environment.
GitHub-Umgebungen konfigurieren -
Geben Sie im Feld Name "production" ein und bestätigen Sie.
Umgebung festlegen -
Klicken Sie auf die Schaltfläche No restriction und wählen Sie Selected branches and tags.
Umgebungsbeschränkungen festlegen -
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 festlegen
Umgebungsbranch festlegen -
Unter Environment secrets klicken Sie auf Add secret.
Geheimnis hinzufügen -
Geben Sie für das Geheimnis
STACKHERO_CERTIFICATES_PASSWORDals Namen ein und fügen Sie Ihr Zertifikatspasswort als Value ein.
Zertifikatspasswort-Geheimnis festlegen -
Unter Environment variables klicken Sie auf Add variable.
Variablen festlegen -
Geben Sie
STACKHERO_ENDPOINTals Namen ein und fügen Sie Ihren Docker-Dienst-Endpunkt in das Feld Value ein. Sie finden diesen Endpunkt in Ihrem Stackhero-Dashboard.
Endpunktvariable festlegen
Wenn Sie den Domainnamen Ihres Dienstes angepasst haben, verwenden Sie die angepasste Version anstelle von xxxxxx.stackhero-network.com.
Passen Sie die Docker Compose-Konfigurationsdatei an
Wenn die Datei
docker-compose.ymlim 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
Konfigurieren des GitHub Actions-Workflows
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 wurden
Herzlichen Glückwunsch! Sie können jetzt Ihren Code automatisch mit GitHub Actions in die Produktion bereitstellen.
Erstellen der Staging-Umgebung
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.
Verwendung von Umgebungsvariablen in docker-compose.yml
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).
- Gehen Sie auf GitHub zu Settings > Environments und erstellen Sie eine Umgebungsvariable namens
WEBSITE_DOMAIN. - Für die Staging-Umgebung setzen Sie
WEBSITE_DOMAINauf "staging.my-company.com". - Für die Produktionsumgebung setzen Sie
WEBSITE_DOMAINauf "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"
Weiterführende Schritte
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.