Six compose files for the separate-container setup, a build and a prod file for each, modelled on DriverVault's Docker folder: - pocketbase.s3: media in an existing bucket elsewhere; the endpoint and key pair are required, host.docker.internal is mapped, and the homeserver waits up to 30 seconds for the endpoint before starting. - pocketbase.seaweedfs: SeaweedFS as one `weed server -s3` container whose only identity is the homeserver's key pair, plus a one-shot init that creates the bucket. - pocketbase.seaweedfs.split: master, volume, filer, S3 gateway and admin UI as separate containers; the init seeds the bucket and the homeserver's identity into the filer's IAM store, and the gateway waits for it. Only the S3 gateway and admin UI are published, on loopback. Both SeaweedFS files share one project and data layout, so switching needs no migration. .env.example gains the SEAWEED_* settings and leaves WARP_PB_S3_FORCE_PATH_STYLE empty so the S3 file's default applies. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
98 lines
4.0 KiB
YAML
98 lines
4.0 KiB
YAML
# Warp on PocketBase with media in an S3 bucket elsewhere: the homeserver,
|
|
# the admin panel and the web client, each in its own container, pulled
|
|
# from a registry.
|
|
#
|
|
# cd Docker
|
|
# cp .env.example .env # then edit it; set WARP_PB_S3_ENDPOINT,
|
|
# # WARP_PB_S3_ACCESS_KEY and WARP_PB_S3_SECRET
|
|
# docker compose -f docker-compose.pocketbase.s3.prod.yml up -d
|
|
#
|
|
# The database stays in /data/pb_data (warp-data); media goes to the bucket
|
|
# WARP_PB_S3_BUCKET (default warp) on WARP_PB_S3_ENDPOINT, which must already
|
|
# exist: nothing here runs a gateway or creates the bucket. For a gateway on
|
|
# this Docker host, use http://host.docker.internal:8333; the host entry below
|
|
# makes that name resolve. For a SeaweedFS that comes up with the stack, see
|
|
# docker-compose.pocketbase.seaweedfs.yml. Media stored before S3 was on is
|
|
# not moved into the bucket.
|
|
#
|
|
# Homeserver http://localhost:8008, admin panel http://localhost:8009, web
|
|
# client http://localhost:8080.
|
|
#
|
|
# Create the first administrator once the server is up:
|
|
#
|
|
# docker compose -f docker-compose.pocketbase.s3.prod.yml exec warp warp create-account --username admin --admin
|
|
#
|
|
# Nothing is built here: the homeserver, admin panel and web client images
|
|
# come from WARP_REGISTRY (default ghcr.io/dariuszjaniak) at tag
|
|
# WARP_VERSION (default latest). Pin WARP_VERSION to a release in
|
|
# production, and update with
|
|
#
|
|
# docker compose -f docker-compose.pocketbase.s3.prod.yml pull && docker compose -f docker-compose.pocketbase.s3.prod.yml up -d
|
|
|
|
name: warp-pocketbase-s3
|
|
|
|
services:
|
|
warp:
|
|
image: ${WARP_REGISTRY:-ghcr.io/dariuszjaniak}/warp:${WARP_VERSION:-latest}
|
|
pull_policy: always
|
|
restart: unless-stopped
|
|
extra_hosts:
|
|
# Lets WARP_PB_S3_ENDPOINT name the Docker host as host.docker.internal.
|
|
- "host.docker.internal:host-gateway"
|
|
# The homeserver does not check the endpoint at startup and would only
|
|
# fail on the first upload, so wait up to 30 seconds for it to answer at
|
|
# all (any HTTP status). The signing key is created on first start and
|
|
# kept in the volume: losing it means other servers no longer recognise
|
|
# this one.
|
|
entrypoint: ["/bin/sh", "-c"]
|
|
command:
|
|
- >-
|
|
i=0; until curl -s -o /dev/null --max-time 5 "$$WARP_PB_S3_ENDPOINT"; do
|
|
i=$$((i + 1)); if [ "$$i" -ge 30 ]; then echo "S3 endpoint $$WARP_PB_S3_ENDPOINT does not answer" >&2; exit 1; fi;
|
|
echo "waiting for S3 endpoint $$WARP_PB_S3_ENDPOINT" >&2; sleep 1; done;
|
|
test -f /data/signing.key || warp generate-keys --output /data/signing.key; exec warp serve
|
|
env_file: .env
|
|
environment:
|
|
WARP_DB_DRIVER: pocketbase
|
|
WARP_DB_CONNECTION_STRING: /data/pb_data
|
|
WARP_PB_S3_ENABLED: "true"
|
|
WARP_PB_S3_ENDPOINT: ${WARP_PB_S3_ENDPOINT:?set WARP_PB_S3_ENDPOINT in .env}
|
|
WARP_PB_S3_BUCKET: ${WARP_PB_S3_BUCKET:-warp}
|
|
# SeaweedFS and MinIO ignore the region; the client insists on one.
|
|
WARP_PB_S3_REGION: ${WARP_PB_S3_REGION:-us-east-1}
|
|
WARP_PB_S3_ACCESS_KEY: ${WARP_PB_S3_ACCESS_KEY:?set WARP_PB_S3_ACCESS_KEY in .env}
|
|
WARP_PB_S3_SECRET: ${WARP_PB_S3_SECRET:?set WARP_PB_S3_SECRET in .env}
|
|
# true for SeaweedFS and MinIO, false for AWS S3 proper.
|
|
WARP_PB_S3_FORCE_PATH_STYLE: ${WARP_PB_S3_FORCE_PATH_STYLE:-true}
|
|
volumes:
|
|
- warp-data:/data
|
|
ports:
|
|
- "${WARP_PORT:-8008}:8008"
|
|
|
|
admin:
|
|
image: ${WARP_REGISTRY:-ghcr.io/dariuszjaniak}/warp-admin:${WARP_VERSION:-latest}
|
|
pull_policy: always
|
|
restart: unless-stopped
|
|
depends_on:
|
|
- warp
|
|
env_file: .env
|
|
environment:
|
|
WARP_ADMIN_HOMESERVER: http://warp:8008
|
|
ports:
|
|
- "${WARP_ADMIN_PORT:-8009}:8009"
|
|
|
|
web:
|
|
image: ${WARP_REGISTRY:-ghcr.io/dariuszjaniak}/warp-web:${WARP_VERSION:-latest}
|
|
pull_policy: always
|
|
restart: unless-stopped
|
|
depends_on:
|
|
- warp
|
|
env_file: .env
|
|
environment:
|
|
WARP_WEB_HOMESERVER: http://warp:8008
|
|
ports:
|
|
- "${WARP_WEB_PORT:-8080}:8080"
|
|
|
|
volumes:
|
|
warp-data:
|