Logo

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

avatar jayce 02 Dec 2024

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

  1. 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
  2. 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
  3. 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

  1. 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
  2. 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
  3. 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.

Tags
rails
部署
Kamal
Kamal 2
Puma