A container registry that uses the AT Protocol for manifest storage and S3 for blob storage.
1services:
2 atcr-appview:
3 build:
4 context: .
5 dockerfile: Dockerfile.dev
6 image: atcr-appview-dev:latest
7 container_name: atcr-appview
8 ports:
9 - "5000:5000"
10 # Optional: Load from .env.appview file (create from .env.appview.example)
11 # env_file:
12 # - .env.appview
13 # Base config: config-appview.example.yaml (passed via Air entrypoint)
14 # Env vars below override config file values for local dev
15 environment:
16 # ATCR_SERVER_CLIENT_NAME: "Seamark"
17 # ATCR_SERVER_CLIENT_SHORT_NAME: "Seamark"
18 ATCR_SERVER_DEFAULT_HOLD_DID: did:web:172.28.0.3:8080
19 ATCR_SERVER_TEST_MODE: "true"
20 ATCR_LOG_LEVEL: debug
21 LOG_SHIPPER_BACKEND: victoria
22 LOG_SHIPPER_URL: http://172.28.0.10:9428
23 # Limit local Docker logs - real logs go to Victoria Logs
24 # Local logs just for live tailing (docker logs -f)
25 logging:
26 driver: json-file
27 options:
28 max-size: "10m"
29 max-file: "1"
30 volumes:
31 # Mount source code for Air hot reload
32 - .:/app
33 # Cache go modules between rebuilds
34 - go-mod-cache:/go/pkg/mod
35 # UI database (includes OAuth sessions, devices, and Jetstream cache)
36 - atcr-ui:/var/lib/atcr
37 restart: unless-stopped
38 dns:
39 - 8.8.8.8
40 - 1.1.1.1
41 networks:
42 atcr-network:
43 ipv4_address: 172.28.0.2
44 # The AppView is stateless - all storage is external:
45 # - Manifests/Tags -> ATProto PDS (via middleware)
46 # - Blobs/Layers -> Hold service (via ProxyBlobStore)
47 # - OAuth tokens -> SQLite database (atcr-ui volume)
48
49 atcr-hold:
50 env_file:
51 - ../atcr-secrets.env # Load S3/Storj credentials from external file
52 # Base config: config-hold.example.yaml (passed via Air entrypoint)
53 # Env vars below override config file values for local dev
54 environment:
55 HOLD_SERVER_PUBLIC_URL: http://172.28.0.3:8080
56 HOLD_REGISTRATION_OWNER_DID: did:plc:pddp4xt5lgnv2qsegbzzs4xg
57 HOLD_REGISTRATION_ALLOW_ALL_CREW: true
58 HOLD_SERVER_TEST_MODE: true
59 # Stripe billing (only used with -tags billing)
60 STRIPE_SECRET_KEY: sk_test_
61 STRIPE_PUBLISHABLE_KEY: pk_test_
62 STRIPE_WEBHOOK_SECRET: whsec_
63 HOLD_LOG_LEVEL: debug
64 LOG_SHIPPER_BACKEND: victoria
65 LOG_SHIPPER_URL: http://172.28.0.10:9428
66 # S3 storage config comes from env_file (AWS_*, S3_*)
67 # Limit local Docker logs - real logs go to Victoria Logs
68 # Local logs just for live tailing (docker logs -f)
69 logging:
70 driver: json-file
71 options:
72 max-size: "10m"
73 max-file: "1"
74 build:
75 context: .
76 dockerfile: Dockerfile.dev
77 args:
78 AIR_CONFIG: .air.hold.toml
79 BILLING_ENABLED: "true"
80 image: atcr-hold-dev:latest
81 container_name: atcr-hold
82 ports:
83 - "8080:8080"
84 volumes:
85 # Mount source code for Air hot reload
86 - .:/app
87 # Cache go modules between rebuilds
88 - go-mod-cache:/go/pkg/mod
89 # PDS data (carstore SQLite + signing keys)
90 - atcr-hold:/var/lib/atcr-hold
91 restart: unless-stopped
92 dns:
93 - 8.8.8.8
94 - 1.1.1.1
95 networks:
96 atcr-network:
97 ipv4_address: 172.28.0.3
98
99 # Victoria Logs for centralized log storage
100 # Uncomment to enable, then set LOG_SHIPPER_* env vars above
101 victorialogs:
102 image: victoriametrics/victoria-logs:latest
103 container_name: victorialogs
104 ports:
105 - "9428:9428"
106 volumes:
107 - victorialogs-data:/victoria-logs-data
108 command:
109 - "-storageDataPath=/victoria-logs-data"
110 - "-retentionPeriod=7d"
111 restart: unless-stopped
112 networks:
113 atcr-network:
114 ipv4_address: 172.28.0.10
115
116networks:
117 atcr-network:
118 driver: bridge
119 ipam:
120 config:
121 - subnet: 172.28.0.0/24
122
123volumes:
124 atcr-hold:
125 atcr-auth:
126 atcr-ui:
127 go-mod-cache:
128 victorialogs-data: