services :
ghost :
image : ghost:${GHOST_VERSION:-6-alpine}
restart : always
# This is required to import current config when migrating
environment :
NODE_ENV : production
url : https://${GHOST_DOMAIN:?GHOST_DOMAIN environment variable is required}
admin__url : ${GHOST_ADMIN_DOMAIN:+https://${GHOST_ADMIN_DOMAIN}}
database__client : mysql
database__connection__host : ghost_db
database__connection__user : ${GHOST_DATABASE_USER:-ghost}
database__connection__password : ${GHOST_DATABASE_PASSWORD:?GHOST_DATABASE_PASSWORD environment variable is required}
database__connection__database : ghost
tinybird__tracker__endpoint : https://${GHOST_DOMAIN:?GHOST_DOMAIN environment variable is required}/.ghost/analytics/api/v1/page_hit
tinybird__adminToken : ${GHOST_TINYBIRD_ADMIN_TOKEN:-}
tinybird__workspaceId : ${GHOST_TINYBIRD_WORKSPACE_ID:-}
tinybird__tracker__datasource : analytics_events
tinybird__stats__endpoint : ${GHOST_TINYBIRD_API_URL:-https://api.tinybird.co}
volumes :
- /nassella/ghost/var-lib-ghost-content:/var/lib/ghost/content
depends_on :
ghost_db :
condition : service_healthy
ghost_tinybird-sync :
condition : service_completed_successfully
required : false
ghost_tinybird-deploy :
condition : service_completed_successfully
required : false
ghost_activitypub :
condition : service_started
required : false
networks :
- ghost_network
- lb
ghost_db :
image : mysql:8.0.44@sha256:f37951fc3753a6a22d6c7bf6978c5e5fefcf6f31814d98c582524f98eae52b21
restart : always
expose :
- "3306"
environment :
MYSQL_ROOT_PASSWORD : ${GHOST_DATABASE_ROOT_PASSWORD:?GHOST_DATABASE_ROOT_PASSWORD environment variable is required}
MYSQL_USER : ${GHOST_DATABASE_USER:-ghost}
MYSQL_PASSWORD : ${GHOST_DATABASE_PASSWORD:?GHOST_DATABASE_PASSWORD environment variable is required}
MYSQL_DATABASE : ghost
MYSQL_MULTIPLE_DATABASES : activitypub
volumes :
- /nassella/ghost/var-lib-mysql:/var/lib/mysql
- ./mysql-init:/docker-entrypoint-initdb.d
healthcheck :
test : mysqladmin ping -p$$GHOST_MYSQL_ROOT_PASSWORD -h 127.0.0.1
interval : 1s
start_period : 30s
start_interval : 10s
retries : 120
networks :
- ghost_network
ghost_traffic-analytics :
image : ghost/traffic-analytics:1.0.20@sha256:a72573d89457e778b00e9061422516d2d266d79a72a0fc02005ba6466e391859
restart : always
expose :
- "3000"
volumes :
- traffic_analytics_data:/data
environment :
NODE_ENV : production
PROXY_TARGET : ${GHOST_TINYBIRD_API_URL:-https://api.tinybird.co}/v0/events
SALT_STORE_TYPE : ${GHOST_SALT_STORE_TYPE:-file}
SALT_STORE_FILE_PATH : /data/salts.json
TINYBIRD_TRACKER_TOKEN : ${GHOST_TINYBIRD_TRACKER_TOKEN:-}
LOG_LEVEL : debug
profiles : [ analytics]
networks :
- ghost_network
ghost_activitypub :
image : ghcr.io/tryghost/activitypub:1.1.0@sha256:39c212fe23603b182d68e67d555c6b9b04b1e57459dfc0bef26d6e4980eb04d1
restart : always
expose :
- "8080"
volumes :
- /nassella/ghost/var-lib-ghost-content:/opt/activitypub/content
environment :
# See https://github.com/TryGhost/ActivityPub/blob/main/docs/env-vars.md
NODE_ENV : production
MYSQL_HOST : ghost_db
MYSQL_USER : ${GHOST_DATABASE_USER:-ghost}
MYSQL_PASSWORD : ${GHOST_DATABASE_PASSWORD:?GHOST_DATABASE_PASSWORD environment variable is required}
MYSQL_DATABASE : activitypub
LOCAL_STORAGE_PATH : /opt/activitypub/content/images/activitypub
LOCAL_STORAGE_HOSTING_URL : https://${GHOST_DOMAIN}/content/images/activitypub
depends_on :
ghost_db :
condition : service_healthy
ghost_activitypub-migrate :
condition : service_completed_successfully
profiles : [ activitypub]
networks :
- ghost_network
# Supporting Services
ghost_tinybird-login :
build :
context : ./tinybird
dockerfile : Dockerfile
working_dir : /home/tinybird
command : /usr/local/bin/tinybird-login
volumes :
- tinybird_home:/home/tinybird
- tinybird_files:/data/tinybird
profiles : [ analytics]
networks :
- ghost_network
tty : false
restart : no
ghost_tinybird-sync :
# Do not alter this without updating the Ghost container as well
image : ghost:${GHOST_VERSION:-6-alpine}
command : >
sh -c "
if [ -d /var/lib/ghost/current/core/server/data/tinybird ]; then
rm -rf /data/tinybird/*;
cp -rf /var/lib/ghost/current/core/server/data/tinybird/* /data/tinybird/;
echo 'Tinybird files synced into shared volume.';
else
echo 'Tinybird source directory not found.';
fi
"
volumes :
- tinybird_files:/data/tinybird
depends_on :
ghost_tinybird-login :
condition : service_completed_successfully
networks :
- ghost_network
profiles : [ analytics]
restart : no
ghost_tinybird-deploy :
build :
context : ./tinybird
dockerfile : Dockerfile
working_dir : /data/tinybird
command : >
sh -c "
tb-wrapper --cloud deploy
"
volumes :
- tinybird_home:/home/tinybird
- tinybird_files:/data/tinybird
depends_on :
ghost_tinybird-sync :
condition : service_completed_successfully
profiles : [ analytics]
networks :
- ghost_network
tty : true
ghost_activitypub-migrate :
image : ghcr.io/tryghost/activitypub-migrations:1.1.0@sha256:b3ab20f55d66eb79090130ff91b57fe93f8a4254b446c2c7fa4507535f503662
environment :
MYSQL_DB : mysql://${GHOST_DATABASE_USER:-ghost}:${GHOST_DATABASE_PASSWORD:?GHOST_DATABASE_PASSWORD environment variable is required}@tcp(ghost_db:3306)/activitypub
networks :
- ghost_network
depends_on :
ghost_db :
condition : service_healthy
profiles : [ activitypub]
restart : no
volumes :
tinybird_files :
tinybird_home :
traffic_analytics_data :
networks :
lb :
ghost_network :
driver : bridge
internal : true