···2929AWS_SECRET_ACCESS_KEY=your_secret_key
30303131# S3 Region
3232-# Examples: us-east-1, us-west-2, eu-west-1
3333-# For UpCloud: us-chi1, us-nyc1, de-fra1, uk-lon1, sg-sin1
3232+# For third-party S3 providers, this is ignored when S3_ENDPOINT is set,
3333+# but must be a valid AWS region (e.g., us-east-1) to pass validation.
3434# Default: us-east-1
3535AWS_REGION=us-east-1
3636···6060# Writes (pushes) always require crew membership via PDS
6161# Default: false
6262HOLD_PUBLIC=false
6363+6464+# ATProto relay endpoint for requesting crawl on startup
6565+# This makes the hold's embedded PDS discoverable by the relay network
6666+# Default: https://bsky.network (set to empty string to disable)
6767+# HOLD_RELAY_ENDPOINT=https://bsky.network
63686469# ==============================================================================
6570# Embedded PDS Configuration
···22# Build targets for the ATProto Container Registry
3344.PHONY: all build build-appview build-hold build-credential-helper build-oauth-helper \
55- generate test test-race test-verbose lint clean help install-credential-helper
55+ generate test test-race test-verbose lint clean help install-credential-helper \
66+ develop develop-detached develop-down
6778.DEFAULT_GOAL := help
89···7980 @echo "→ Installing credential helper to /usr/local/sbin..."
8081 install -m 755 bin/docker-credential-atcr /usr/local/sbin/docker-credential-atcr
8182 @echo "✓ Installed docker-credential-atcr to /usr/local/sbin/"
8383+8484+##@ Docker Targets
8585+8686+develop: ## Build Docker images and start docker-compose for development
8787+ @echo "→ Building Docker images..."
8888+ docker-compose build
8989+ @echo "→ Starting docker-compose..."
9090+ docker-compose up
9191+9292+develop-detached: ## Build and start docker-compose in detached mode
9393+ @echo "→ Building Docker images..."
9494+ docker-compose build
9595+ @echo "→ Starting docker-compose (detached)..."
9696+ docker-compose up -d
9797+ @echo "✓ Services started in background"
9898+ @echo " AppView: http://localhost:5000"
9999+ @echo " Hold: http://localhost:8080"
100100+101101+develop-down: ## Stop docker-compose services
102102+ @echo "→ Stopping docker-compose..."
103103+ docker-compose down
8210483105##@ Utility Targets
84106
+10
cmd/hold/main.go
···179179 }
180180 }
181181182182+ // Request crawl from relay to make PDS discoverable
183183+ if cfg.Server.RelayEndpoint != "" {
184184+ slog.Info("Requesting crawl from relay", "relay", cfg.Server.RelayEndpoint)
185185+ if err := hold.RequestCrawl(cfg.Server.RelayEndpoint, cfg.Server.PublicURL); err != nil {
186186+ slog.Warn("Failed to request crawl from relay", "error", err)
187187+ } else {
188188+ slog.Info("Crawl requested successfully")
189189+ }
190190+ }
191191+182192 // Wait for signal or server error
183193 select {
184194 case err := <-serverErr:
+5-11
deploy/.env.prod.template
···115115AWS_SECRET_ACCESS_KEY=
116116117117# S3 Region (for distribution S3 driver)
118118-# UpCloud regions: us-chi1, us-nyc1, de-fra1, uk-lon1, sg-sin1, etc.
119119-# Note: Use AWS_REGION (not S3_REGION) - this is what the hold service expects
118118+# For third-party S3 providers (UpCloud, Storj, Minio), this value is ignored
119119+# when S3_ENDPOINT is set, but must be a valid AWS region to pass validation.
120120# Default: us-east-1
121121-AWS_REGION=us-chi1
121121+AWS_REGION=us-east-1
122122123123# S3 Bucket Name
124124# Create this bucket in UpCloud Object Storage
···133133# NOTE: Use the bucket-specific endpoint, NOT a custom domain
134134# Custom domains break presigned URL generation
135135S3_ENDPOINT=https://6vmss.upcloudobjects.com
136136-137137-# S3 Region Endpoint (alternative to S3_ENDPOINT)
138138-# Use this if your S3 driver requires region-specific endpoint format
139139-# Example: s3.us-chi1.upcloudobjects.com
140140-# S3_REGION_ENDPOINT=
141136142137# ==============================================================================
143138# AppView Configuration
···231226# ☐ Set HOLD_OWNER (your ATProto DID)
232227# ☐ Set HOLD_DATABASE_DIR (default: /var/lib/atcr-hold) - enables embedded PDS
233228# ☐ Set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
234234-# ☐ Set AWS_REGION (e.g., us-chi1)
235229# ☐ Set S3_BUCKET (created in UpCloud Object Storage)
236236-# ☐ Set S3_ENDPOINT (UpCloud endpoint or custom domain)
230230+# ☐ Set S3_ENDPOINT (UpCloud bucket endpoint, e.g., https://6vmss.upcloudobjects.com)
237231# ☐ Configured DNS records:
238232# - A record: atcr.io → server IP
239233# - A record: hold01.atcr.io → server IP
240240-# - CNAME: blobs.atcr.io → [bucket].us-chi1.upcloudobjects.com
234234+# - CNAME: blobs.atcr.io → [bucket].upcloudobjects.com
241235# ☐ Disabled Cloudflare proxy (gray cloud, not orange)
242236# ☐ Waited for DNS propagation (check with: dig atcr.io)
243237#