Praktischer Leitfaden zur Bereitstellung von Rails-Anwendungen mit Kamal 2
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
-
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
-
Einfache Konfiguration
- Eine einzige YAML-Konfigurationsdatei
- Eingebaute SSL-Unterstützung, automatische Beantragung und Erneuerung von Zertifikaten
- Sofort einsatzbereite Gesundheitsprüfungen und Null-Ausfallzeiten-Bereitstellungen
-
Betriebsfreundlich
- Eingebaute Protokollverwaltung und Kapazitätsgrenzen
- Unterstützung für One-Click-Rollbacks
- Bereitstellung praktischer Remote-Debugging-Tools
Vorteile von Capistrano
-
Reif und stabil
- Lange Nutzungsgeschichte, reichhaltige Community-Ressourcen
- Ausgereifte Problemlösungen
- Eine Vielzahl von sofort einsatzbereiten Bereitstellungsskripten verfügbar
-
Geringer Ressourcenverbrauch
- Keine Container erforderlich, geringerer Systemaufwand
- Geeignet für ressourcenbeschränkte kleine Server
-
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.