Guide pratique pour déployer des applications Rails avec Kamal 2

Guide pratique pour déployer des applications Rails avec Kamal 2
Introduction
Kamal 2 est un outil utilisé pour déployer des applications Rails, mais la documentation actuelle est assez dispersée et incomplète. Cet article partagera l’expérience pratique de l’auteur lors du déploiement avec Kamal 2, dans l’espoir d’offrir des références utiles.
Exemple de configuration complète
# config/deploy.staging.yml
# nom du service puma
service: ai-hub-server-staging
# nom de l'espace de noms / image
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 se connecte à votre conteneur via le port 80, utilisez `app_port` pour spécifier un port différent.
app_port: 3000
registry:
# Votre nom d'utilisateur et mot de passe Docker Hub
# Utiliser le service Alibaba Cloud
server: crpi-9ja5ymdca5joh9vj.cn-shenzhen.personal.cr.aliyuncs.com
username: 396803555@qq.com
password:
- AI_HUB_KAMAL_REGISTRY_PASSWORD
builder:
arch: amd64
# Spécifiez le chemin du Dockerfile
dockerfile: Dockerfile.staging
# Configuration des logs
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
# Doit être déclaré ici, sinon database.yml ne pourra pas y accéder
# connection to server at "172.17.1.2", port 5432 failed: fe_sendauth: no password supplied
- AI_HUB_KAMAL_POSTGRES_PASSWORD
accessories:
db:
image: postgres:15
host: your-host # Votre IP de serveur
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 # Votre IP de serveur
aliases:
console: app exec --reuse -i "bin/rails console"
Exemple de configuration de base de données:
# database.yml.example
staging:
<<: *default
database: ai_hub_server_staging
username: deploy
password: <%= ENV['AI_HUB_KAMAL_POSTGRES_PASSWORD'] %>
Explication du réseau Docker
Kamal 2 créera un réseau Docker nommé kamal
et ajoutera tous les conteneurs à celui-ci. Par conséquent :
- Vous ne pouvez pas utiliser d’IP ou localhost
- L’adresse Redis doit être
redis://ai-hub-server-staging-redis:6379/0
- L’adresse de la base de données doit être
ai-hub-server-staging-db
Par exemple, si le projet utilise redis
, entrez sur le serveur docker ps
pour trouver le nom ai-hub-server-staging-redis
Alors REDIS_HOST devrait être redis://ai-hub-server-staging-redis:6379/0
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
Étapes de déploiement
1. Initialiser Kamal
kamal init
2. Configurer deploy.yml et Dockerfile
3. Exécuter la commande setup
kamal setup -c "config/deploy.staging.yml"
Si des accessoires comme pg, redis, etc. sont présents, les conteneurs démarreront et vous pourrez voir les noms des conteneurs.
4. Ajuster la configuration Redis
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. Déployer l’application
kamal deploy -c "config/deploy.staging.yml"
Il est important de noter que chaque déploiement utilise le dernier code commit local. Donc, après modification, n’oubliez pas de soumettre.
Questions fréquentes et solutions
1. Accès lent à Docker Hub
Solutions :
- Utiliser le service d’image Alibaba Cloud
- Ou configurer un proxy dans Docker Daemon :
Même en utilisant l’image Alibaba Cloud, le déploiement peut toujours échouer à tirer l’image kamal-proxy. Utilisez un proxy pour résoudre ce problème.
# /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. Problème de variables d’environnement .kamal/secrets
Doit être configuré dans les variables d’environnement système :
# 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. Les logs Rails ne s’affichent pas dans Docker
Ajoutez dans config/environments/staging.rb :
config.logger = ActiveSupport::Logger.new(STDOUT)
.tap { |logger| logger.formatter = ::Logger::Formatter.new }
.then { |logger| ActiveSupport::TaggedLogging.new(logger) }
Vérifiez le format des logs Docker :
> docker inspect --format='{{.HostConfig.LogConfig.Type}}' 9b0b24c16554
json-file
Options de configuration liées à kamal :
logging:
# C'est par défaut
driver: json-file
options:
max-size: 100m
4. Configuration SSL
Kamal-proxy prend en charge la configuration automatique de HTTPS via Let’s Encrypt :
proxy:
ssl: true
host: ai-hub-kamal.beansmile-dev.com
# kamal-proxy se connecte à votre conteneur via le port 80, utilisez `app_port` pour spécifier un port différent.
app_port: 3000
Commandes courantes
Entrer dans le conteneur pour voir les détails
docker exec -it CONTAINER_ID bash
Libérer le verrou de déploiement
kamal lock release
# ou
kamal lock release -c "config/deploy.staging.yml"
Console Rails
# deploy.staging.yml
# Configurer l'alias
aliases:
console: app exec --reuse -i "bin/rails console"
# Utilisation en ligne de commande
kamal console -c "config/deploy.staging.yml"
Voir les logs distants
kamal app logs -c "config/deploy.staging.yml"
Paramètres de configuration utiles
Mapping des ports du serveur Rails
servers:
web:
hosts:
- your-host
options:
publish:
- "4022:3000"
Désactiver Kamal Proxy
servers:
web:
hosts:
- your-host
proxy: false
Conclusion
Kamal 2 est un outil de déploiement d’applications Rails basé sur Docker. Par rapport aux solutions de déploiement traditionnelles comme Capistrano, il présente les avantages et inconvénients suivants :
Avantages de Kamal 2
-
Déploiement conteneurisé
- Environnement d’application complètement isolé, évitant les conflits de dépendances système
- Garantit la cohérence entre l’environnement de développement et de production
- Facilite l’extension horizontale et la migration
-
Configuration simple
- Fichier de configuration YAML unique
- Prise en charge SSL intégrée, demande et renouvellement automatique des certificats
- Vérification de santé prête à l’emploi et déploiement sans temps d’arrêt
-
Amical pour l’exploitation
- Gestion des logs intégrée et limitation de capacité
- Prise en charge du rollback en un clic
- Outils de débogage à distance pratiques
Avantages de Capistrano
-
Mature et stable
- Long historique d’utilisation, communauté riche en ressources
- Solutions aux problèmes bien établies
- De nombreux scripts de déploiement prêts à l’emploi disponibles
-
Faible consommation de ressources
- Pas besoin d’exécuter des conteneurs, moins de frais généraux système
- Convient aux petits serveurs à ressources limitées
-
Haute flexibilité
- Peut contrôler chaque étape du processus de déploiement avec précision
- Prend en charge des logiques de déploiement personnalisées complexes
- Intégration plus facile avec les systèmes existants
Kamal 2 représente la tendance de déploiement à l’ère de la conteneurisation, mais cela ne signifie pas qu’il convient à tous les scénarios. Lors du choix d’un outil de déploiement, il est essentiel de considérer des facteurs tels que la taille du projet, la situation de l’équipe et les ressources du serveur. Peu importe l’outil choisi, il est crucial qu’il réponde à vos besoins de déploiement.