1version: '3.8'
2
3services:
4 init-keys:
5 build:
6 context: .
7 dockerfile: Dockerfile
8 image: ghcr.io/haileyok/cocoon:latest
9 container_name: cocoon-init-keys
10 volumes:
11 - ./keys:/keys
12 - ./data:/data/cocoon
13 - ./init-keys.sh:/init-keys.sh:ro
14 environment:
15 COCOON_DID: ${COCOON_DID}
16 COCOON_HOSTNAME: ${COCOON_HOSTNAME}
17 COCOON_ROTATION_KEY_PATH: /keys/rotation.key
18 COCOON_JWK_PATH: /keys/jwk.key
19 COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL}
20 COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network}
21 COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD}
22 entrypoint: ["/bin/sh", "/init-keys.sh"]
23 restart: "no"
24
25 cocoon:
26 build:
27 context: .
28 dockerfile: Dockerfile
29 image: ghcr.io/haileyok/cocoon:latest
30 container_name: cocoon-pds
31 network_mode: host
32 depends_on:
33 init-keys:
34 condition: service_completed_successfully
35 volumes:
36 - ./data:/data/cocoon
37 - ./keys/rotation.key:/keys/rotation.key:ro
38 - ./keys/jwk.key:/keys/jwk.key:ro
39 environment:
40 # Required settings
41 COCOON_DID: ${COCOON_DID}
42 COCOON_HOSTNAME: ${COCOON_HOSTNAME}
43 COCOON_ROTATION_KEY_PATH: /keys/rotation.key
44 COCOON_JWK_PATH: /keys/jwk.key
45 COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL}
46 COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network}
47 COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD}
48 COCOON_SESSION_SECRET: ${COCOON_SESSION_SECRET}
49
50 # Server configuration
51 COCOON_ADDR: ":8080"
52 COCOON_DB_TYPE: ${COCOON_DB_TYPE:-sqlite}
53 COCOON_DB_NAME: ${COCOON_DB_NAME:-/data/cocoon/cocoon.db}
54 COCOON_DATABASE_URL: ${COCOON_DATABASE_URL:-}
55 COCOON_BLOCKSTORE_VARIANT: ${COCOON_BLOCKSTORE_VARIANT:-sqlite}
56
57 # Optional: SMTP settings for email
58 COCOON_SMTP_USER: ${COCOON_SMTP_USER:-}
59 COCOON_SMTP_PASS: ${COCOON_SMTP_PASS:-}
60 COCOON_SMTP_HOST: ${COCOON_SMTP_HOST:-}
61 COCOON_SMTP_PORT: ${COCOON_SMTP_PORT:-}
62 COCOON_SMTP_EMAIL: ${COCOON_SMTP_EMAIL:-}
63 COCOON_SMTP_NAME: ${COCOON_SMTP_NAME:-}
64
65 # Optional: S3 configuration
66 COCOON_S3_BACKUPS_ENABLED: ${COCOON_S3_BACKUPS_ENABLED:-false}
67 COCOON_S3_BLOBSTORE_ENABLED: ${COCOON_S3_BLOBSTORE_ENABLED:-false}
68 COCOON_S3_REGION: ${COCOON_S3_REGION:-}
69 COCOON_S3_BUCKET: ${COCOON_S3_BUCKET:-}
70 COCOON_S3_ENDPOINT: ${COCOON_S3_ENDPOINT:-}
71 COCOON_S3_ACCESS_KEY: ${COCOON_S3_ACCESS_KEY:-}
72 COCOON_S3_SECRET_KEY: ${COCOON_S3_SECRET_KEY:-}
73
74 # Optional: Fallback proxy
75 COCOON_FALLBACK_PROXY: ${COCOON_FALLBACK_PROXY:-}
76 restart: unless-stopped
77 healthcheck:
78 test: ["CMD", "curl", "-f", "http://localhost:8080/xrpc/_health"]
79 interval: 30s
80 timeout: 10s
81 retries: 3
82 start_period: 40s
83
84 create-invite:
85 build:
86 context: .
87 dockerfile: Dockerfile
88 image: ghcr.io/haileyok/cocoon:latest
89 container_name: cocoon-create-invite
90 network_mode: host
91 volumes:
92 - ./keys:/keys
93 - ./create-initial-invite.sh:/create-initial-invite.sh:ro
94 environment:
95 COCOON_DID: ${COCOON_DID}
96 COCOON_HOSTNAME: ${COCOON_HOSTNAME}
97 COCOON_ROTATION_KEY_PATH: /keys/rotation.key
98 COCOON_JWK_PATH: /keys/jwk.key
99 COCOON_CONTACT_EMAIL: ${COCOON_CONTACT_EMAIL}
100 COCOON_RELAYS: ${COCOON_RELAYS:-https://bsky.network}
101 COCOON_ADMIN_PASSWORD: ${COCOON_ADMIN_PASSWORD}
102 COCOON_DB_TYPE: ${COCOON_DB_TYPE:-sqlite}
103 COCOON_DB_NAME: ${COCOON_DB_NAME:-/data/cocoon/cocoon.db}
104 COCOON_DATABASE_URL: ${COCOON_DATABASE_URL:-}
105 depends_on:
106 - init-keys
107 entrypoint: ["/bin/sh", "/create-initial-invite.sh"]
108 restart: "no"
109
110 caddy:
111 image: caddy:2-alpine
112 container_name: cocoon-caddy
113 network_mode: host
114 volumes:
115 - ./Caddyfile:/etc/caddy/Caddyfile:ro
116 - caddy_data:/data
117 - caddy_config:/config
118 restart: unless-stopped
119 environment:
120 COCOON_HOSTNAME: ${COCOON_HOSTNAME}
121 CADDY_ACME_EMAIL: ${COCOON_CONTACT_EMAIL:-}
122
123volumes:
124 data:
125 driver: local
126 caddy_data:
127 driver: local
128 caddy_config:
129 driver: local