Skip to content

Ghost CMS

Three Ghost instances running on a shared MySQL database.

Blog URLs

Blog Public URL Admin URL Container Port
Cam4 https://blog.cam4.camlab.dev https://blog.cam4.camlab.dev/ghost ghost-cam4 2368
Cam4Models https://blog.cam4models.camlab.dev https://blog.cam4models.camlab.dev/ghost ghost-cam4models 2369
Cam4Pays https://blog.cam4pays.camlab.dev https://blog.cam4pays.camlab.dev/ghost ghost-cam4pays 2370

API Keys

Each blog has two API keys stored in /opt/camlab/.env:

Blog Admin API Key Var Content API Key Var
Cam4 GHOST_CAM4_ADMIN_API_KEY GHOST_CAM4_CONTENT_API_KEY
Cam4Models GHOST_CAM4MODELS_ADMIN_API_KEY GHOST_CAM4MODELS_CONTENT_API_KEY
Cam4Pays GHOST_CAM4PAYS_ADMIN_API_KEY GHOST_CAM4PAYS_CONTENT_API_KEY

Keys are created via: Ghost Admin → Settings → Integrations → "CamLab Automation"

Database

Shared MySQL 8.0 instance with 3 separate databases:

Database User Password Var
ghost_cam4 ghost_cam4 GHOST_CAM4_DB_PASSWORD
ghost_cam4models ghost_cam4models GHOST_CAM4MODELS_DB_PASSWORD
ghost_cam4pays ghost_cam4pays GHOST_CAM4PAYS_DB_PASSWORD

Databases are auto-created on first boot via mysql/init/00-create-databases.sh.

Content Directories

Ghost content (images, themes, data) is stored on the host:

/opt/camlab/ghost/
├── cam4/           → /var/lib/ghost/content (in ghost-cam4)
├── cam4models/     → /var/lib/ghost/content (in ghost-cam4models)
└── cam4pays/       → /var/lib/ghost/content (in ghost-cam4pays)

Image Paths

Images uploaded to Ghost or generated by the automation pipeline:

/opt/camlab/ghost/<slug>/images/

n8n has direct write access to these directories (bind-mounted as /ghost-images/<slug>).

Themes

Each blog uses a customized Casper theme:

/opt/camlab/ghost/<slug>/themes/camlab-casper-<slug>/

To activate: Ghost Admin → Settings → Design → Themes → Activate

Setup Wizard

On first boot, each Ghost instance needs the setup wizard completed:

  1. Visit https://blog.<slug>.camlab.dev/ghost
  2. Create the admin account
  3. Go to Settings → Integrations → Add Custom Integration → "CamLab Automation"
  4. Copy the Admin API Key and Content API Key into /opt/camlab/.env
  5. Restart ghost-mcp to pick up the new keys

Common Operations

cd /opt/camlab

# Restart a specific blog
docker compose restart ghost-cam4

# View Ghost logs
docker compose logs --tail 50 ghost-cam4

# Access Ghost shell
docker exec -it ghost-cam4 sh

# Check MySQL connectivity from Ghost
docker exec ghost-cam4 sh -c 'nc -zv mysql 3306'