services: caddy: image: caddy:2-alpine restart: always ports: - "80:80" - "443:443" environment: DOMAIN: ${DOMAIN:?DOMAIN environment variable is required} volumes: - ./Caddyfile:/etc/caddy/Caddyfile - caddy_data:/data - caddy_config:/config depends_on: - ghost networks: - ghost_network ghost: image: ghost:5-alpine restart: always expose: - "2368" environment: url: https://${DOMAIN:?DOMAIN environment variable is required} database__client: mysql database__connection__host: db database__connection__user: ${DATABASE_USER:-ghost} database__connection__password: ${DATABASE_PASSWORD:?DATABASE_PASSWORD environment variable is required} database__connection__database: ghost enableDeveloperExperiments: true labs__trafficAnalytics: true labs__ActivityPub: true tinybird__tracker__endpoint: https://${DOMAIN:?DOMAIN environment variable is required}/.ghost/analytics/tb/web_analytics tinybird__tracker__id: ${TINYBIRD_ID:-} tinybird__tracker__datasource: analytics_events tinybird__tracker__token: ${TINYBIRD_TRACKER_TOKEN:-} tinybird__stats__endpoint: ${TINYBIRD_API_URL:-https://api.tinybird.co} tinybird__stats__id: ${TINYBIRD_ID:-} tinybird__stats__token: ${TINYBIRD_STATS_TOKEN:-} volumes: - ghost_content:/var/lib/ghost/content depends_on: db: condition: service_healthy tinybird-sync: condition: service_completed_successfully required: false tinybird-deploy: condition: service_completed_successfully required: false networks: - ghost_network db: image: mysql:8.0 restart: always ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: ${DATABASE_ROOT_PASSWORD:?DATABASE_ROOT_PASSWORD environment variable is required} MYSQL_USER: ${DATABASE_USER:-ghost} MYSQL_PASSWORD: ${DATABASE_PASSWORD:?DATABASE_PASSWORD environment variable is required} MYSQL_DATABASE: ghost MYSQL_MULTIPLE_DATABASES: activitypub volumes: - db_data:/var/lib/mysql - ./mysql-init:/docker-entrypoint-initdb.d healthcheck: test: mysql -u${DATABASE_USER:-ghost} -p${DATABASE_PASSWORD:?DATABASE_PASSWORD environment variable is required} ghost -e 'select 1' interval: 1s retries: 120 networks: - ghost_network traffic-analytics: image: ghost/traffic-analytics:edge restart: always expose: - "3000" environment: NODE_ENV: production PROXY_TARGET: ${TINYBIRD_API_URL:-https://api.tinybird.co}/v0/events LOG_LEVEL: debug profiles: [analytics] networks: - ghost_network activitypub: image: ghcr.io/tryghost/activitypub:edge restart: always expose: - "8080" - "9229" environment: NODE_ENV: production PORT: 8080 MYSQL_HOST: db MYSQL_USER: ${DATABASE_USER:-ghost} MYSQL_PASSWORD: ${DATABASE_PASSWORD:?DATABASE_PASSWORD environment variable is required} MYSQL_DATABASE: activitypub USE_MQ: false GCP_BUCKET_NAME: ${ACTIVITYPUB_GCP_BUCKET:?ACTIVITYPUB_GCP_BUCKET environment variable is required} depends_on: - db profiles: [activitypub] networks: - ghost_network # Suporting Services tinybird-sync: image: ghost:5-alpine command: > sh -c " if [ -d /var/lib/ghost/current/core/server/data/tinybird ]; then rm -rf /shared/tinybird/*; cp -rf /var/lib/ghost/current/core/server/data/tinybird/* /shared/tinybird/; echo 'Tinybird files synced into shared volume.'; else echo 'Tinybird source directory not found.'; fi " volumes: - tinybird_files:/shared/tinybird networks: - ghost_network profiles: [analytics] restart: no tinybird-deploy: build: context: ./tinybird dockerfile: Dockerfile working_dir: /home/tinybird command: > sh -c " tb --cloud deploy " volumes: - .tinyb:/home/tinybird/.tinyb - tinybird_files:/home/tinybird depends_on: tinybird-sync: condition: service_completed_successfully profiles: [analytics] networks: - ghost_network tty: true activitypub-migrate: image: ghcr.io/tryghost/activitypub-migrations:edge environment: MYSQL_DB: mysql://${DATABASE_USER:-ghost}:${DATABASE_PASSWORD:?DATABASE_PASSWORD environment variable is required}@tcp(db:3306)/activitypub networks: - ghost_network depends_on: db: condition: service_healthy profiles: [activitypub] restart: no volumes: ghost_content: db_data: caddy_data: caddy_config: tinybird_files: networks: ghost_network: