Logo

Praktischer Leitfaden zur Bereitstellung von Rails-Anwendungen mit Kamal 2

avatar jayce 02 Dec 2024

Praktischer Leitfaden zur Bereitstellung von Rails-Anwendungen mit Kamal 2

Einleitung

Kamal 2 ist ein Tool zur Bereitstellung von Rails-Anwendungen, aber die dazugehörige Dokumentation ist derzeit recht verstreut und unvollständig. In diesem Artikel teile ich meine praktischen Erfahrungen mit der Bereitstellung von Kamal 2 und hoffe, dass es Ihnen als Referenz dienen kann.

Vollständiges Konfigurationsbeispiel

# config/deploy.staging.yml

# Puma-Dienstname
service: ai-hub-server-staging
# Namespace / Bildname
image: jayce9210/ai-hub-server-staging

servers:
  web:
    hosts:
      - your-host
  sidekiq:
    cmd: bundle exec sidekiq
    hosts:
      - your-host

proxy:
  ssl: true
  host: ai-hub-kamal.beansmile-dev.com
  # kamal-proxy verbindet sich über Port 80 mit Ihrem Container, verwenden Sie `app_port`, um einen anderen Port anzugeben.
  app_port: 3000

registry:
  # Ihr Docker Hub-Benutzername und Passwort
  # Verwenden Sie den Alibaba Cloud-Service
  server: crpi-9ja5ymdca5joh9vj.cn-shenzhen.personal.cr.aliyuncs.com
  username: 396803555@qq.com
  password:
    - AI_HUB_KAMAL_REGISTRY_PASSWORD

builder:
  arch: amd64
  # Geben Sie den Pfad zur Dockerfile an
  dockerfile: Dockerfile.staging

# Protokollkonfiguration
logging:
  options:
    max-size: 100m

env:
  clear:
    HOST: http://ai-hub-kamal.beansmile-dev.com
    DB_HOST: ai-hub-server-staging-db
    REDIS_HOST: redis://ai-hub-server-staging-redis:6379/0
  secret:
    - RAILS_MASTER_KEY
    # Muss hier deklariert werden, sonst kann database.yml nicht darauf zugreifen
    # Verbindung zum Server unter "172.17.1.2", Port 5432 fehlgeschlagen: fe_sendauth: kein Passwort angegeben
    - AI_HUB_KAMAL_POSTGRES_PASSWORD

accessories:
  db:
    image: postgres:15
    host: your-host # Ihre Server-IP
    env:
      clear:
        POSTGRES_USER: deploy
        POSTGRES_DB: ai-hub-server-staging
        POSTGRES_PASSWORD: AI_HUB_KAMAL_POSTGRES_PASSWORD
    volumes:
      - /var/lib/postgresql/data:/var/lib/postgresql/data
  redis:
    image: redis:7
    host: your-host # Ihre Server-IP

aliases:
  console: app exec --reuse -i "bin/rails console"

Beispiel für die Datenbankkonfiguration:

# database.yml.example
staging:
  <<: *default
  database: ai_hub_server_staging
  username: deploy
  password: <%= ENV['AI_HUB_KAMAL_POSTGRES_PASSWORD'] %>

Erläuterung des Docker-Netzwerks

Kamal 2 erstellt ein Docker-Netzwerk mit dem Namen kamal und fügt alle Container hinzu. Daher:

  • IP oder localhost können nicht verwendet werden
  • Die Redis-Adresse sollte redis://ai-hub-server-staging-redis:6379/0 sein
  • Die Datenbankadresse sollte ai-hub-server-staging-db sein

Wenn beispielsweise im Projekt redis verwendet wird, gehen Sie auf den Server und führen Sie docker ps aus, um den Namen ai-hub-server-staging-redis zu finden. Dann sollte REDIS_HOST redis://ai-hub-server-staging-redis:6379/0 sein.

env:
  clear:
    HOST: http://ai-hub-kamal.beansmile-dev.com
    DB_HOST: ai-hub-server-staging-db
    REDIS_HOST: redis://ai-hub-server-staging-redis:6379/0

Bereitstellungsschritte

1. Kamal initialisieren

kamal init

2. Konfigurieren Sie deploy.yml und Dockerfile

3. Führen Sie den Setup-Befehl aus

kamal setup -c "config/deploy.staging.yml"

Wenn es Zubehör wie pg, redis usw. gibt, werden die Container jetzt gestartet, und Sie können die Containernamen sehen.

4. Redis-Konfiguration anpassen

env:
  clear:
    HOST: http://ai-hub-kamal.beansmile-dev.com
    DB_HOST: ai-hub-server-staging-db
    REDIS_HOST: redis://ai-hub-server-staging-redis:6379/0

5. Anwendung bereitstellen

kamal deploy -c "config/deploy.staging.yml"

Bitte beachten Sie, dass bei jeder Bereitstellung der Code des letzten lokalen Commits verwendet wird. Vergessen Sie also nicht, nach Änderungen zu committen.

Häufige Fragen und Lösungen

1. Langsame Zugriffe auf Docker Hub

Lösung:

  • Verwenden Sie den Alibaba Cloud-Image-Service
  • Oder konfigurieren Sie einen Proxy in der Docker-Daemon-Konfiguration:

Selbst wenn der Alibaba Cloud-Image-Service verwendet wird, kann es am Ende immer noch nicht gelingen, das kamal-proxy-Image zu pullen. Ein Proxy hilft dabei.

# /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:10801"
Environment="HTTPS_PROXY=http://127.0.0.1:10801"

2. Probleme mit Umgebungsvariablen in .kamal/secrets

Muss in den Systemumgebungsvariablen konfiguriert werden:

# bash.rc / zshrc

export AI_HUB_KAMAL_REGISTRY_PASSWORD=
export AI_HUB_KAMAL_POSTGRES_PASSWORD=
# .kamal/secrets
AI_HUB_KAMAL_REGISTRY_PASSWORD=$AI_HUB_KAMAL_REGISTRY_PASSWORD
AI_HUB_KAMAL_POSTGRES_PASSWORD=$AI_HUB_KAMAL_POSTGRES_PASSWORD

3. Rails-Protokolle werden nicht in Docker ausgegeben

Fügen Sie in config/environments/staging.rb hinzu:

config.logger = ActiveSupport::Logger.new(STDOUT)
  .tap  { |logger| logger.formatter = ::Logger::Formatter.new }
  .then { |logger| ActiveSupport::TaggedLogging.new(logger) }

Überprüfen Sie das Docker-Protokollformat:

> docker inspect --format='{{.HostConfig.LogConfig.Type}}' 9b0b24c16554
json-file

Kamal-bezogene Konfigurationseinstellungen

logging:
	# Standardmäßig ist dies der Fall
  driver: json-file
  options:
    max-size: 100m

4. SSL-Konfiguration

Kamal-proxy unterstützt die automatische Konfiguration von HTTPS über Let’s Encrypt:

proxy:
  ssl: true
  host: ai-hub-kamal.beansmile-dev.com
  # kamal-proxy verbindet sich über Port 80 mit Ihrem Container, verwenden Sie `app_port`, um einen anderen Port anzugeben.
  app_port: 3000

Häufig verwendete Befehle

In den Container eintreten, um Details zu überprüfen

docker exec -it CONTAINER_ID bash

Bereitstellungssperre aufheben

kamal lock release
# oder
kamal lock release -c "config/deploy.staging.yml"

Rails-Konsole

# deploy.staging.yml
# Alias konfigurieren
aliases:
  console: app exec --reuse -i "bin/rails console"

# Verwendung in der Befehlszeile
kamal console -c "config/deploy.staging.yml"

Remote-Protokolle anzeigen

kamal app logs  -c "config/deploy.staging.yml"

Nützliche Konfigurationsparameter

Portzuordnung für Rails-Server

servers:
  web:
    hosts:
      - your-host
    options:
      publish:
        - "4022:3000"

Kamal Proxy deaktivieren

servers:
  web:
    hosts:
      - your-host
    proxy: false

Zusammenfassung

Kamal 2 ist ein auf Docker basierendes Bereitstellungstool für Rails-Anwendungen. Im Vergleich zu traditionellen Capistrano-Bereitstellungslösungen bietet es folgende Vorteile und Nachteile:

Vorteile von Kamal 2

  1. Containerisierte Bereitstellung

    • Anwendungsumgebungen sind vollständig isoliert, um Konflikte mit Systemabhängigkeiten zu vermeiden
    • Gewährleistung der Konsistenz zwischen Entwicklungs- und Produktionsumgebungen
    • Erleichtert horizontale Skalierung und Migration
  2. Einfache Konfiguration

    • Eine einzige YAML-Konfigurationsdatei
    • Eingebaute SSL-Unterstützung, automatische Beantragung und Erneuerung von Zertifikaten
    • Sofort einsatzbereite Gesundheitsprüfungen und Null-Ausfallzeiten-Bereitstellungen
  3. Betriebsfreundlich

    • Eingebaute Protokollverwaltung und Kapazitätsgrenzen
    • Unterstützung für One-Click-Rollbacks
    • Bereitstellung praktischer Remote-Debugging-Tools

Vorteile von Capistrano

  1. Reif und stabil

    • Lange Nutzungsgeschichte, reichhaltige Community-Ressourcen
    • Ausgereifte Problemlösungen
    • Eine Vielzahl von sofort einsatzbereiten Bereitstellungsskripten verfügbar
  2. Geringer Ressourcenverbrauch

    • Keine Container erforderlich, geringerer Systemaufwand
    • Geeignet für ressourcenbeschränkte kleine Server
  3. Hohe Flexibilität

    • Detaillierte Kontrolle über jeden Schritt des Bereitstellungsprozesses
    • Unterstützung komplexer benutzerdefinierter Bereitstellungslogik
    • Einfachere Integration mit bestehenden Systemen

Kamal 2 repräsentiert den Bereitstellungstrend der containerisierten Ära, aber das bedeutet nicht, dass es für alle Szenarien geeignet ist. Bei der Auswahl eines Bereitstellungstools sollten Faktoren wie Projektgröße, Teamstruktur und Serverressourcen berücksichtigt werden. Unabhängig davon, welches Tool gewählt wird, ist es am wichtigsten, sicherzustellen, dass es Ihren Bereitstellungsanforderungen entspricht.

Tags
rails
部署
Kamal
Kamal 2
Puma