An atproto PDS written in Go
at turso-db 159 lines 5.0 kB view raw
1# Docker Compose with PostgreSQL 2# 3# Usage: 4# docker-compose -f docker-compose.postgres.yaml up -d 5# 6# This file extends the base docker-compose.yaml with a PostgreSQL database. 7# Set the following in your .env file: 8# COCOON_DB_TYPE=postgres 9# POSTGRES_PASSWORD=your-secure-password 10 11version: '3.8' 12 13services: 14 postgres: 15 image: postgres:16-alpine 16 container_name: cocoon-postgres 17 environment: 18 POSTGRES_USER: cocoon 19 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} 20 POSTGRES_DB: cocoon 21 PGDATA: /var/lib/postgresql/data 22 volumes: 23 - postgres_data:/var/lib/postgresql/data 24 healthcheck: 25 test: ["CMD-SHELL", "pg_isready -U cocoon -d cocoon"] 26 interval: 10s 27 timeout: 5s 28 retries: 5 29 restart: unless-stopped 30 31 init-keys: 32 build: 33 context: . 34 dockerfile: Dockerfile 35 image: ghcr.io/haileyok/cocoon:latest 36 container_name: cocoon-init-keys 37 volumes: 38 - ./keys:/keys 39 - ./data:/data/cocoon 40 - ./init-keys.sh:/init-keys.sh:ro 41 environment: 42 COCOON_DID: ${COCOON_DID} 43 COCOON_HOSTNAME: ${COCOON_HOSTNAME} 44 COCOON_ROTATION_KEY_PATH: /keys/rotation.key 45 COCOON_JWK_PATH: /keys/jwk.key 46 COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL} 47 COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network} 48 COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD} 49 entrypoint: ["/bin/sh", "/init-keys.sh"] 50 restart: "no" 51 52 cocoon: 53 build: 54 context: . 55 dockerfile: Dockerfile 56 image: ghcr.io/haileyok/cocoon:latest 57 container_name: cocoon-pds 58 depends_on: 59 init-keys: 60 condition: service_completed_successfully 61 postgres: 62 condition: service_healthy 63 ports: 64 - "8080:8080" 65 volumes: 66 - ./data:/data/cocoon 67 - ./keys/rotation.key:/keys/rotation.key:ro 68 - ./keys/jwk.key:/keys/jwk.key:ro 69 environment: 70 # Required settings 71 COCOON_DID: ${COCOON_DID} 72 COCOON_HOSTNAME: ${COCOON_HOSTNAME} 73 COCOON_ROTATION_KEY_PATH: /keys/rotation.key 74 COCOON_JWK_PATH: /keys/jwk.key 75 COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL} 76 COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network} 77 COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD} 78 COCOON_SESSION_SECRET: ${COCOON_SESSION_SECRET} 79 80 # Database configuration - PostgreSQL 81 COCOON_ADDR: ":8080" 82 COCOON_DB_TYPE: postgres 83 COCOON_DATABASE_URL: postgres://cocoon:${POSTGRES_PASSWORD}@postgres:5432/cocoon?sslmode=disable 84 COCOON_BLOCKSTORE_VARIANT: ${COCOON_BLOCKSTORE_VARIANT:-sqlite} 85 86 # Optional: SMTP settings for email 87 COCOON_SMTP_USER: ${COCOON_SMTP_USER:-} 88 COCOON_SMTP_PASS: ${COCOON_SMTP_PASS:-} 89 COCOON_SMTP_HOST: ${COCOON_SMTP_HOST:-} 90 COCOON_SMTP_PORT: ${COCOON_SMTP_PORT:-} 91 COCOON_SMTP_EMAIL: ${COCOON_SMTP_EMAIL:-} 92 COCOON_SMTP_NAME: ${COCOON_SMTP_NAME:-} 93 94 # Optional: S3 configuration 95 COCOON_S3_BACKUPS_ENABLED: ${COCOON_S3_BACKUPS_ENABLED:-false} 96 COCOON_S3_BLOBSTORE_ENABLED: ${COCOON_S3_BLOBSTORE_ENABLED:-false} 97 COCOON_S3_REGION: ${COCOON_S3_REGION:-} 98 COCOON_S3_BUCKET: ${COCOON_S3_BUCKET:-} 99 COCOON_S3_ENDPOINT: ${COCOON_S3_ENDPOINT:-} 100 COCOON_S3_ACCESS_KEY: ${COCOON_S3_ACCESS_KEY:-} 101 COCOON_S3_SECRET_KEY: ${COCOON_S3_SECRET_KEY:-} 102 103 # Optional: Fallback proxy 104 COCOON_FALLBACK_PROXY: ${COCOON_FALLBACK_PROXY:-} 105 restart: unless-stopped 106 healthcheck: 107 test: ["CMD", "curl", "-f", "http://localhost:8080/xrpc/_health"] 108 interval: 30s 109 timeout: 10s 110 retries: 3 111 start_period: 40s 112 113 create-invite: 114 build: 115 context: . 116 dockerfile: Dockerfile 117 image: ghcr.io/haileyok/cocoon:latest 118 container_name: cocoon-create-invite 119 volumes: 120 - ./keys:/keys 121 - ./create-initial-invite.sh:/create-initial-invite.sh:ro 122 environment: 123 COCOON_DID: ${COCOON_DID} 124 COCOON_HOSTNAME: ${COCOON_HOSTNAME} 125 COCOON_ROTATION_KEY_PATH: /keys/rotation.key 126 COCOON_JWK_PATH: /keys/jwk.key 127 COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL} 128 COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network} 129 COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD} 130 COCOON_DB_TYPE: postgres 131 COCOON_DATABASE_URL: postgres://cocoon:${POSTGRES_PASSWORD}@postgres:5432/cocoon?sslmode=disable 132 depends_on: 133 cocoon: 134 condition: service_healthy 135 entrypoint: ["/bin/sh", "/create-initial-invite.sh"] 136 restart: "no" 137 138 caddy: 139 image: caddy:2-alpine 140 container_name: cocoon-caddy 141 ports: 142 - "80:80" 143 - "443:443" 144 volumes: 145 - ./Caddyfile.postgres:/etc/caddy/Caddyfile:ro 146 - caddy_data:/data 147 - caddy_config:/config 148 restart: unless-stopped 149 environment: 150 COCOON_HOSTNAME: ${COCOON_HOSTNAME} 151 CADDY_ACME_EMAIL: ${COCOON_CONTACT_EMAIL:-} 152 153volumes: 154 postgres_data: 155 driver: local 156 caddy_data: 157 driver: local 158 caddy_config: 159 driver: local