an atproto based link aggregator

Add CD deployment to Fly.io

- Add flyctl to CI dependencies
- Deploy webapp on push to main using FLY_API_KEY
- Deploy ingester on push to main using FLY_INGESTER_API_KEY
- Fix fly.toml mounts array syntax

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

+31 -13
+17
.tangled/workflows/ci.yaml
··· 11 11 - nodejs_22 12 12 - pnpm 13 13 - gnused 14 + - flyctl 14 15 15 16 steps: 16 17 - name: Install dependencies ··· 33 34 34 35 - name: Run tests 35 36 command: SKIP_BROWSER_TESTS=1 pnpm test 37 + 38 + - name: Deploy webapp 39 + command: flyctl deploy --remote-only 40 + when: 41 + - event: ['push'] 42 + branch: ['main'] 43 + secrets: 44 + - FLY_API_TOKEN=$FLY_API_KEY 45 + 46 + - name: Deploy ingester 47 + command: flyctl deploy -c fly.ingester.toml --remote-only 48 + when: 49 + - event: ['push'] 50 + branch: ['main'] 51 + secrets: 52 + - FLY_API_TOKEN=$FLY_INGESTER_API_KEY
+14 -13
fly.toml
··· 1 + # fly.toml app configuration file generated for papili-one on 2025-12-08T21:19:07-05:00 2 + # 3 + # See https://fly.io/docs/reference/configuration/ for information about how to use this file. 4 + # 5 + 1 6 app = 'papili-one' 2 7 primary_region = 'sjc' 3 8 4 9 [build] 5 10 6 11 [env] 7 - NODE_ENV = 'production' 8 - # Content DB is read from LiteFS replica (synced from ingester primary) 9 12 CONTENT_DB_PATH = '/litefs/content.db' 10 - # Local DB is webapp-only (auth, votes) 11 13 LOCAL_DB_PATH = '/data/local.db' 14 + NODE_ENV = 'production' 15 + 16 + [[mounts]] 17 + source = 'papili_data' 18 + destination = '/data' 19 + 20 + [[mounts]] 21 + source = 'litefs' 22 + destination = '/litefs' 12 23 13 24 [http_service] 14 25 internal_port = 3000 ··· 22 33 memory = '512mb' 23 34 cpu_kind = 'shared' 24 35 cpus = 1 25 - 26 - # Local data volume for webapp-only DB (auth, votes) 27 - [mounts] 28 - source = 'papili_data' 29 - destination = '/data' 30 - 31 - # LiteFS mount for content DB replica 32 - [[mounts]] 33 - source = 'litefs' 34 - destination = '/litefs'