Skip to content

Q on Installation via Portainer #93

@imfbsbn

Description

@imfbsbn

Hiya - Trying to install on a server running multiple websites. As such already using apache as reverse proxy; don't need (or want) to use caddy. Also, would prefer to use native mysql already running on the server. No need to run multiple instances.

Attempting to crawl before running... created simple docker compose file:

services:
  ghost:
    # Do not alter this without updating the Tinybird Sync container as well
    image: ghost:latest
    restart: unless-stopped
    # This is required to import current config when migrating
    env_file: stack.env
    environment:
#      GHOST_PORT: 8888
      NODE_ENV: production
      url: https://ghost.mydomain.com
      #admin__url: ${ADMIN_DOMAIN:+https://${ADMIN_DOMAIN}}
      database__client: mysql
      database__connection__host: 172.20.0.1
      database__connection__user: ghost
      database__connection__password: zR79ldq...
      database__connection__database: ghost
      #tinybird__tracker__endpoint: https://${DOMAIN:?DOMAIN environment variable is required}/.ghost/analytics/api/v1/page_hit
      #tinybird__adminToken: ${TINYBIRD_ADMIN_TOKEN:-}
      #tinybird__workspaceId: ${TINYBIRD_WORKSPACE_ID:-}
      #tinybird__tracker__datasource: analytics_events
      #tinybird__stats__endpoint: ${TINYBIRD_API_URL:-https://api.tinybird.co}
    volumes:
      - /home/ghost/content:/var/lib/ghost/content
    depends_on:
#      tinybird-sync:
#        condition: service_completed_successfully
#        required: false
#      tinybird-deploy:
#        condition: service_completed_successfully
#        required: false
      activitypub:
        condition: service_started
        required: false
  activitypub:
    image: ghcr.io/tryghost/activitypub:1.1.0
    restart: unless-stopped
    ports:
      - 8888:8888
    volumes:
      - /home/ghost/activitypub/content:/opt/activitypub/content
    environment:
      # See https://github.com/TryGhost/ActivityPub/blob/main/docs/env-vars.md
      NODE_ENV: production
      MYSQL_HOST: 172.20.0.1
      MYSQL_USER: ghost
      MYSQL_PASSWORD: zR79ldq...
      MYSQL_DATABASE: activitypub

stack.env file

COMPOSE_PROFILES=activitypub
ACTIVITYPUB_TARGET=activitypub:8888  # port 8080 already in use
mail__transport=SMTP
mail__options__host=smtp.example.com
mail__options__port=465
mail__options__secure=true
[email protected]
mail__options__auth__pass=1234567890
mail__from="'Acme Support' <[email protected]>"

Set up apache to reverse proxy to port 8888 and nothing.

activitypub log output

Error: Failed to create storage instance Error: A bucket name is needed to use Cloud Storage.
    at new GCPStorageAdapter (file:///opt/activitypub/dist/app.js:11366:13)
    at file:///opt/activitypub/dist/app.js:11677:14
    at Object.resolve (file:///opt/activitypub/node_modules/awilix/lib/awilix.module.mjs:1064:20)
    at resolve (file:///opt/activitypub/node_modules/awilix/lib/awilix.module.mjs:1558:45)
    at file:///opt/activitypub/node_modules/awilix/lib/awilix.module.mjs:1063:54
    at Array.map (<anonymous>)
    at Object.resolve (file:///opt/activitypub/node_modules/awilix/lib/awilix.module.mjs:1063:43)
    at resolve (file:///opt/activitypub/node_modules/awilix/lib/awilix.module.mjs:1558:45)
    at file:///opt/activitypub/node_modules/awilix/lib/awilix.module.mjs:1063:54
    at Array.map (<anonymous>)
Node.js v22.18.0

03:14:18.694 INF activitypub: Message queue is disabled
file:///opt/activitypub/dist/app.js:11366
      throw new Error(`Failed to create storage instance ${err}`);

ghost container log output

[2025-12-01 03:12:12] INFO Ghost is running in production...
[2025-12-01 03:12:12] INFO Your site is now available on https://ghost.mydomain.com/
[2025-12-01 03:12:12] INFO Ctrl+C to shut down
[2025-12-01 03:12:12] INFO Ghost server started in 0.364s
[2025-12-01 03:12:13] INFO Database is in a ready state.
[2025-12-01 03:12:13] INFO Ghost database ready in 0.638s
[2025-12-01 03:12:14] INFO Invalidating assets for regeneration
[2025-12-01 03:12:14] INFO Adding offloaded job to the inline job queue
[2025-12-01 03:12:14] INFO Scheduling job mentions-email-report at 53 2 * * * *. Next run on: Mon Dec 01 2025 04:02:53 GMT+0000 (Coordinated Universal Time)
[2025-12-01 03:12:14] INFO [EmailAnalytics] Initialized with SEQUENTIAL processing mode
[2025-12-01 03:12:14] INFO Pinging Explore with Payload https://explore.ghost.org/api/update {"ghost":"6.9.1","site_uuid":"8970cdfe-c203-4dff-b23e-58549f6ed1ee","url":"https://ghost.mydomain.com","theme":"source","facebook":"ghost","twitter":"@ghost","posts_total":2,"posts_last":"2025-12-01T01:24:34.000Z","posts_first":"2025-12-01T01:24:33.000Z"}
[2025-12-01 03:12:14] INFO Adding offloaded job to the inline job queue
[2025-12-01 03:12:14] INFO Scheduling job clean-expired-comped at 59 14 5 * * *. Next run on: Mon Dec 01 2025 05:14:59 GMT+0000 (Coordinated Universal Time)
[2025-12-01 03:12:14] INFO Adding offloaded job to the inline job queue
[2025-12-01 03:12:14] INFO Scheduling job clean-tokens at 11 8 20 * * *. Next run on: Mon Dec 01 2025 20:08:11 GMT+0000 (Coordinated Universal Time)
[2025-12-01 03:12:14] INFO Ghost booted in 2.169s
[2025-12-01 03:12:14] INFO Adding offloaded job to the inline job queue
[2025-12-01 03:12:14] INFO Scheduling job update-check at 42 33 14 * * *. Next run on: Mon Dec 01 2025 14:33:42 GMT+0000 (Coordinated Universal Time)
[2025-12-01 03:12:14] INFO Running milestone emails job on Thu Dec 04 2025 03:12:14 GMT+0000 (Coordinated Universal Time)
[2025-12-01 03:12:14] ERROR Could not get webhook secret for ActivityPub FetchError: invalid json response body at https://ghost.mydomain.com/.ghost/activitypub/v1/site reason: Unexpected token '<', "<!DOCTYPE "... is not valid JSON
[2025-12-01 03:12:14] ERROR No webhook secret found - cannot initialise
[2025-12-01 03:12:15] INFO URL Service ready in 1323ms
[2025-12-01 03:12:15] INFO Explore Response 200 OK
[2025-12-01 03:12:52] INFO Updating incoming recommendations on boot
[2025-12-01 03:14:37] INFO [Recommendations] Updating recommendations metadata
[2025-12-01 03:15:41] WARN Ghost is shutting down
[2025-12-01 03:15:41] WARN Ghost has shut down
[2025-12-01 03:15:41] WARN Your site is now offline
[2025-12-01 03:15:41] WARN Ghost was running for 3 minutes

Any thoughts would be greatly appreciated.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions