# Name of your application. Used to uniquely configure containers. service: example # Name of the container image. image: kobaltz/example # Deploy to these servers. servers: web: - 192.168.1.113 - 192.168.1.114 job: hosts: - 192.168.1.115 - 192.168.1.116 cmd: bin/jobs # Enable SSL auto certification via Let's Encrypt and allow for multiple apps on a single web server. # Remove this section when using multiple web servers and ensure you terminate SSL at your load balancer. # # Note: If using Cloudflare, set encryption mode in SSL/TLS setting to "Full" to enable CF-to-app encryption. proxy: ssl: false host: www.railsenv.com # Credentials for your image host. registry: # Specify the registry server, if you're not using Docker Hub # server: registry.digitalocean.com / ghcr.io / ... username: kobaltz # Always use an access token rather than real password when possible. password: - KAMAL_REGISTRY_PASSWORD # Inject ENV variables into containers (secrets come from .kamal/secrets). env: secret: - RAILS_MASTER_KEY # clear: # Run the Solid Queue Supervisor inside the web server's Puma process to do jobs. # When you start using multiple servers, you should split out job processing to a dedicated machine. # SOLID_QUEUE_IN_PUMA: true # Set number of processes dedicated to Solid Queue (default: 1) # JOB_CONCURRENCY: 3 # Set number of cores available to the application on each server (default: 1). # WEB_CONCURRENCY: 2 # Match this to any external database server to configure Active Record correctly # Use example-db for a db accessory server on same machine via local kamal docker network. # DB_HOST: 192.168.1.2 # Log everything from Rails # RAILS_LOG_LEVEL: debug # Aliases are triggered with "bin/kamal <alias>". You can overwrite arguments on invocation: # "bin/kamal logs -r job" will tail logs from the first server in the job section. aliases: console: app exec --interactive --reuse "bin/rails console" shell: app exec --interactive --reuse "bash" logs: app logs -f dbc: app exec --interactive --reuse "bin/rails dbconsole" # Use a persistent storage volume for sqlite database files and local Active Storage files. # Recommended to change this to a mounted volume path that is backed up off server. volumes: - "example_storage:/rails/storage" # Bridge fingerprinted assets, like JS and CSS, between versions to avoid # hitting 404 on in-flight requests. Combines all files from new and old # version inside the asset_path. asset_path: /rails/public/assets # Configure the image builder. builder: arch: amd64 # # Build image via remote server (useful for faster amd64 builds on arm64 computers) # remote: ssh://docker@docker-builder-server # # # Pass arguments and secrets to the Docker build process # args: # RUBY_VERSION: ruby-3.3.5 # secrets: # - GITHUB_TOKEN # - RAILS_MASTER_KEY # Use a different ssh user than root # ssh: # user: app # Use accessory services (secrets come from .kamal/secrets). accessories: loadbalancer: image: nginx:latest host: 192.168.1.112 port: "80:80" files: - config/nginx.conf:/etc/nginx/conf.d/default.conf postgres: image: postgres:17 port: 5432:5432 host: 192.168.1.117 env: clear: POSTGRES_USER: example POSTGRES_DB: example_production secret: - POSTGRES_PASSWORD directories: - data:/var/lib/postgresql/data minio: image: minio/minio host: 192.168.1.118 options: publish: - "9000:9000" - "9001:9001" env: secret: - MINIO_ROOT_USER - MINIO_ROOT_PASSWORD directories: - data:/data cmd: server /data --console-address ":9001" # db: # image: mysql:8.0 # host: 192.168.0.2 # # Change to 3306 to expose port to the world instead of just local network. # port: "127.0.0.1:3306:3306" # env: # clear: # MYSQL_ROOT_HOST: '%' # secret: # - MYSQL_ROOT_PASSWORD # files: # - config/mysql/production.cnf:/etc/mysql/my.cnf # - db/production.sql:/docker-entrypoint-initdb.d/setup.sql # directories: # - data:/var/lib/mysql # redis: # image: redis:7.0 # host: 192.168.0.2 # port: 6379 # directories: # - data:/data