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