volumes: lago_postgres_data: lago_redis_data: lago_storage_data: x-postgres-image: &postgres-image image: postgres:14-alpine x-redis-image: &redis-image image: redis:6-alpine x-backend-image: &backend-image image: getlago/api:v1.21.0 x-frontend-image: &frontend-image image: getlago/front:v1.21.0 x-lago-api-url: &lago-api-url "LAGO_API_URL": ${LAGO_API_URL:-http://localhost:3000} x-lago-front-url: &lago-front-url "LAGO_FRONT_URL": ${LAGO_FRONT_URL:-http://localhost} x-backend-environment: &backend-env "DATABASE_URL": postgresql://${POSTGRES_USER:-lago}:${POSTGRES_PASSWORD:-changeme}@${POSTGRES_HOST:-db}:${POSTGRES_PORT:-5432}/${POSTGRES_DB:-lago}?search_path=${POSTGRES_SCHEMA:-public} "REDIS_URL": redis://${REDIS_HOST:-redis}:${REDIS_PORT:-6379} "REDIS_PASSWORD": ${REDIS_PASSWORD:-} "SECRET_KEY_BASE": ${SECRET_KEY_BASE:-your-secret-key-base-hex-64} "RAILS_ENV": production "RAILS_LOG_TO_STDOUT": ${LAGO_RAILS_STDOUT:-true} "LAGO_RSA_PRIVATE_KEY": ${LAGO_RSA_PRIVATE_KEY} "LAGO_SIDEKIQ_WEB": ${LAGO_SIDEKIQ_WEB:-true} "LAGO_ENCRYPTION_PRIMARY_KEY": ${LAGO_ENCRYPTION_PRIMARY_KEY:-your-encryption-primary-key} "LAGO_ENCRYPTION_DETERMINISTIC_KEY": ${LAGO_ENCRYPTION_DETERMINISTIC_KEY:-your-encryption-deterministic-key} "LAGO_ENCRYPTION_KEY_DERIVATION_SALT": ${LAGO_ENCRYPTION_KEY_DERIVATION_SALT:-your-encryption-derivation-salt} "LAGO_USE_AWS_S3": ${LAGO_USE_AWS_S3:-false} "LAGO_AWS_S3_ACCESS_KEY_ID": ${LAGO_AWS_S3_ACCESS_KEY_ID:-azerty123456} "LAGO_AWS_S3_SECRET_ACCESS_KEY": ${LAGO_AWS_S3_SECRET_ACCESS_KEY:-azerty123456} "LAGO_AWS_S3_REGION": ${LAGO_AWS_S3_REGION:-us-east-1} "LAGO_AWS_S3_BUCKET": ${LAGO_AWS_S3_BUCKET:-bucket} "LAGO_AWS_S3_ENDPOINT": ${LAGO_AWS_S3_ENDPOINT} "LAGO_USE_GCS": ${LAGO_USE_GCS:-false} "LAGO_GCS_PROJECT": ${LAGO_GCS_PROJECT:-} "LAGO_GCS_BUCKET": ${LAGO_GCS_BUCKET:-} "LAGO_FROM_EMAIL": ${LAGO_FROM_EMAIL:-} "LAGO_SMTP_ADDRESS": ${LAGO_SMTP_ADDRESS:-} "LAGO_SMTP_PORT": ${LAGO_SMTP_PORT:-587} "LAGO_SMTP_USERNAME": ${LAGO_SMTP_USERNAME:-} "LAGO_SMTP_PASSWORD": ${LAGO_SMTP_PASSWORD:-} "LAGO_PDF_URL": ${LAGO_PDF_URL:-http://pdf:3000} "LAGO_REDIS_CACHE_URL": redis://${LAGO_REDIS_CACHE_HOST:-redis}:${LAGO_REDIS_CACHE_PORT:-6379} "LAGO_REDIS_CACHE_PASSWORD": ${LAGO_REDIS_CACHE_PASSWORD} "LAGO_DISABLE_SEGMENT": ${LAGO_DISABLE_SEGMENT} "LAGO_DISABLE_WALLET_REFRESH": ${LAGO_DISABLE_WALLET_REFRESH} "LAGO_DISABLE_SIGNUP": ${LAGO_DISABLE_SIGNUP:-false} "LAGO_OAUTH_PROXY_URL": https://proxy.getlago.com "LAGO_LICENSE": ${LAGO_LICENSE:-} "LAGO_CREATE_ORG": ${LAGO_CREATE_ORG:-false} "LAGO_ORG_USER_PASSWORD": ${LAGO_ORG_USER_PASSWORD:-} "LAGO_ORG_USER_EMAIL": ${LAGO_ORG_USER_EMAIL:-} "LAGO_ORG_NAME": ${LAGO_ORG_NAME:-} "LAGO_ORG_API_KEY": ${LAGO_ORG_API_KEY:-} "GOOGLE_AUTH_CLIENT_ID": ${GOOGLE_AUTH_CLIENT_ID:-} "GOOGLE_AUTH_CLIENT_SECRET": ${GOOGLE_AUTH_CLIENT_SECRET:-} # - SIDEKIQ_EVENTS=true # - SIDEKIQ_PDFS=true # - SIDEKIQ_BILLING=true # - SIDEKIQ_CLOCK=true # - SIDEKIQ_WEBHOOK=true x-frontend-environment: &frontend-env "API_URL": ${LAGO_API_URL:-http://localhost:3000} "APP_ENV": production "LAGO_OAUTH_PROXY_URL": https://proxy.getlago.com services: db: <<: *postgres-image container_name: lago-db restart: unless-stopped healthcheck: test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-lago} -d ${POSTGRES_DB:-lago} -h localhost -p ${POSTGRES_PORT:-5432}", ] interval: 10s timeout: 5s retries: 5 environment: POSTGRES_DB: ${POSTGRES_DB:-lago} POSTGRES_USER: ${POSTGRES_USER:-lago} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme} PGDATA: /data/postgres PGPORT: ${POSTGRES_PORT:-5432} POSTGRES_SCHEMA: public volumes: - lago_postgres_data:/data/postgres ports: - ${POSTGRES_PORT:-5432}:${POSTGRES_PORT:-5432} redis: <<: *redis-image container_name: lago-redis restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 command: --port ${REDIS_PORT:-6379} volumes: - lago_redis_data:/data ports: - ${REDIS_PORT:-6379}:${REDIS_PORT:-6379} migrate: <<: *backend-image container_name: lago-migrate depends_on: db: condition: service_healthy restart: true command: ["./scripts/migrate.sh"] environment: <<: *backend-env api: <<: *backend-image container_name: lago-api restart: unless-stopped depends_on: migrate: condition: service_completed_successfully db: condition: service_healthy restart: true redis: condition: service_healthy restart: true command: ["./scripts/start.api.sh"] healthcheck: test: curl -f http://localhost:3000/health || exit 1 interval: 10s start_period: 30s timeout: 60s start_interval: 2s environment: <<: [*backend-env, *lago-api-url, *lago-front-url] volumes: - lago_storage_data:/app/storage ports: - ${API_PORT:-3000}:3000 front: <<: *frontend-image container_name: lago-front restart: unless-stopped # Use this command if you want to use SSL with Let's Encrypt # command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'" depends_on: api: condition: service_healthy restart: true environment: <<: [*frontend-env, *lago-api-url, *lago-front-url] ports: - ${FRONT_PORT:-80}:80 # - 443:443 # Using SSL with Let's Encrypt # volumes: # - ./extra/nginx-letsencrypt.conf:/etc/nginx/conf.d/default.conf # - ./extra/certbot/conf:/etc/letsencrypt # - ./extra/certbot/www:/var/www/certbot # Using SSL with self signed certificates # volumes: # - ./extra/nginx-selfsigned.conf:/etc/nginx/conf.d/default.conf # - ./extra/ssl/nginx-selfsigned.crt:/etc/ssl/certs/nginx-selfsigned.crt # - ./extra/ssl/nginx-selfsigned.key:/etc/ssl/private/nginx-selfsigned.key # - ./extra/ssl/dhparam.pem:/etc/ssl/certs/dhparam.pem # Only used for SSL support with Let's Encrypt # certbot: # image: certbot/certbot # entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'" # volumes: # - ./extra/certbot/conf:/etc/letsencrypt # - ./extra/certbot/www:/var/www/certbot api-worker: <<: *backend-image container_name: lago-worker restart: unless-stopped depends_on: migrate: condition: service_completed_successfully db: condition: service_healthy restart: true redis: condition: service_healthy restart: true command: ["./scripts/start.worker.sh"] healthcheck: test: curl -f http://localhost:8080 || exit 1 interval: 10s start_period: 30s timeout: 60s start_interval: 2s environment: <<: [*backend-env, *lago-api-url] volumes: - lago_storage_data:/app/storage # You can uncomment this if you want to use a dedicated Sidekiq worker for the event ingestion. # It is recommendend if you have a high usage of events to not impact the other Sidekiq Jobs. #api-events-worker: # <<: *backend-image # container_name: lago-events-worker # restart: unless-stopped # depends_on: # api: # condition: service_healthy # command: ["./scripts/start.events.worker.sh"] # environment: # <<: [*backend-env, *lago-api-url] # You can uncomment this if you want to use a dedicated Sidekiq worker for the invoices pdf creation. # It is recommended if you have a high usage of invoices being created to not impact the other Sidekiq Jobs. #api-pdfs-worker: # <<: *backend-image # container_name: lago-pdfs-worker # restart: unless-stopped # depends_on: # api: # condition: service_healthy # command: ["./scripts/start.pdfs.worker.sh"] # environment: # <<: [*backend-env, *lago-api-url] # You can uncomment this if you want to use a dedicated Sidekiq worker for the invoices creation. # It is recommended if you have a high usage of invoices being created to not impact the other Sidekiq Jobs. #api-billing-worker: # <<: *backend-image # container_name: lago-billing-worker # restart: unless-stopped # depends_on: # api: # condition: service_healthy # command: ["./scripts/start.billing.worker.sh"] # environment: # <<: [*backend-env, *lago-api-url] # You can uncomment this if you want to use a dedicated Sidekiq worker for the clock jobs. #api-clock-worker: # <<: *backend-image # container_name: lago-clock-worker # restart: unless-stopped # depends_on: # api: # condition: service_healthy # command: ["./scripts/start.clock.worker.sh"] # environment: # <<: [*backend-env, *lago-api-url] # You can uncomment this if you want to use a dedicated Sidekiq worker for the webhook jobs. #api-webhook-worker: # <<: *backend-image # container_name: lago-webhook-worker # restart: unless-stopped # depends_on: # api: # condition: service_healthy # command: ["./scripts/start.webhook.worker.sh"] # environment: # <<: [*backend-env, *lago-api-url] api-clock: <<: *backend-image container_name: lago-clock restart: unless-stopped depends_on: migrate: condition: service_completed_successfully db: condition: service_healthy restart: true redis: condition: service_healthy restart: true command: ["./scripts/start.clock.sh"] environment: <<: [*backend-env, *lago-api-url] pdf: image: getlago/lago-gotenberg:7.8.2