# Warp on PocketBase with media in an S3 bucket elsewhere: the homeserver, # the admin panel and the web client, each in its own container, built from # this checkout. # # 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.yml up -d --build # # 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.yml exec warp warp create-account --username admin --admin name: warp-pocketbase-s3 services: warp: build: context: .. dockerfile: Dockerfile image: warp:latest 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: build: context: .. dockerfile: apps/admin/Dockerfile image: warp-admin:latest restart: unless-stopped depends_on: - warp env_file: .env environment: WARP_ADMIN_HOMESERVER: http://warp:8008 ports: - "${WARP_ADMIN_PORT:-8009}:8009" web: build: context: .. dockerfile: apps/web/Dockerfile image: warp-web:latest 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: