I run my Ghost blog using Docker Compose (https://notes.ansonbiggs.com), and I wanted to upgrade to the newly announced 6.0 version. Simply changing the version of the container migrated things over really well!

-    image: ghost:5-alpine
+    image: ghost:6-alpine

My server came right back up after the upgrade, unfortunately there are a lot of UI elements dedicated to the ActivityPub and Web Analytics functions even when they aren’t turned on.

I don't know how to use Docker Compose

I did run into a pretty nasty thing that is totally my fault, I never named my volumes in my Docker Compose, so all my data has been stored on anonymous volumes. This was pretty tricky to work around, but I posted my conversation with Claude who helped me work through it; Docker Compose MySQL8 Volume Names

I’ve always specifically designed my projects to not need persistent storage, so this was a blindspot I was happy to dig into.

ActivityPub

To get ActivityPub working, I had to use Caddy. This caused some issues with my Cloudflare setup but was overall pretty easy. Caddy is required to use the ActivityPub server generously offered by Ghost themselves.

Ideally, I want to fully Self Host this setup. Hopefully this won’t cause issues in the future, but there’s a compatibility problem: my Hetzner Box runs on arm architecture, while the ActivityPub images are only available for x86.

I can’t tell if I’m happy with the state of this, or if this is following the trend I noticed in Ghost is a little empty without Email. I’m certainly not happy with how the new analytics works, but I haven’t dug into that enough to know how bad it is.

Current Deployment 2025-08-04

docker-compose.yml

# yaml-language-server: $schema=https://raw.githubusercontent.com/compose-spec/compose-spec/main/schema/compose-spec.json
services:
  caddy:
    image: caddy:2.10.0-alpine
    restart: always
    ports:
      - "80:80"
      - "443:443"
    environment:
      DOMAIN: ${DOMAIN:?DOMAIN environment variable is required}
      ACTIVITYPUB_TARGET: ${ACTIVITYPUB_TARGET:-https://ap.ghost.org}
    volumes:
      - ./caddy:/etc/caddy
      - caddy_data:/data
      - caddy_config:/config
    depends_on:
      - ghost
    networks:
      - ghost_network
 
  ghost:
    image: ghost:${GHOST_VERSION:-6-alpine}
    restart: always
    expose:
      - "2368"
    env_file:
      - .env
    environment:
      NODE_ENV: production
      url: https://${DOMAIN:?DOMAIN environment variable is required}
      database__client: mysql
      database__connection__host: db
      database__connection__user: root
      database__connection__password: ${DATABASE_PASSWORD:?DATABASE_PASSWORD environment variable is required}
      database__connection__database: ghost
    volumes:
      - ghost_content:/var/lib/ghost/content
    depends_on:
      db:
        condition: service_healthy
    networks:
      - ghost_network
 
  db:
    image: mysql:8.0
    restart: always
    expose:
      - "3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${DATABASE_ROOT_PASSWORD:?DATABASE_ROOT_PASSWORD environment variable is required}
    volumes:
      - mysql_data:/var/lib/mysql
    healthcheck:
      test: mysqladmin ping -p$$MYSQL_ROOT_PASSWORD -h 127.0.0.1
      interval: 1s
      start_period: 30s
      start_interval: 10s
      retries: 120
    networks:
      - ghost_network
 
volumes:
  ghost_content:
  mysql_data:
  caddy_data:
  caddy_config:
 
networks:
  ghost_network:
 

.env

# Ghost domain
DOMAIN=notes.ansonbiggs.com
 
# Database settings
DATABASE_ROOT_PASSWORD=
DATABASE_PASSWORD=
 
# SMTP Email
mail__transport=SMTP
mail__options__host=smtp.mailgun.org
mail__options__port=587
mail__options__secure=false
mail__options__auth__user=postmaster@mail.notes.ansonbiggs.com
mail__options__auth__pass=
 

caddy/Caddyfile

{$DOMAIN} {
    reverse_proxy ghost:2368
    encode gzip
 
    handle /.ghost/activitypub* {
        reverse_proxy {$ACTIVITYPUB_TARGET}
    }
}
 

Cloudflare

I had to turn my proxy off for the domain otherwise I was getting too many redirects errors. ToDo enable proxy for notes.ansonbiggs.com

I’m going to guess that my blog is going to run into cert errors in the near feature because of this.