Files
FTStore/web/docker-compose.yml
T
Felitendo 2cdca9994c feat: merge the web dashboard into the monorepo as ftstore admin
FTStore now holds both halves of the product:

  ios/   the swift app — the fork of claration/Feather, unchanged apart
         from its new home
  web/   FTStore Admin, formerly its own repository. serves the
         dashboard at /admin, the ftstore.json feed and IPA downloads

app-repo.json and Images/ stay at the repo root on purpose: the former is
a published AltStore source whose raw.githubusercontent URL is what
installed copies resolve updates through, so moving it would break every
subscriber.

The admin server is renamed throughout: package ftstore-admin, images
ghcr.io/<owner>/ftstore-admin-{app,worker}, postgres role/db ftstore,
session cookie ftstore_session, temp dir /tmp/ftstore, backup type
ftstore-settings, outbound user-agent FTStoreAdmin. backups written under the old
name still import, and compose is pinned to name: ftstore so the
volume prefix does not follow the directory name.

apply-rebrand.sh gains a relocation step: upstream's tree is rooted at
the repo root while ours lives in ios/, so a merge drops Feather's files
next to ios/ and the script folds them in before renaming. it never
touches web/. still idempotent.

release tags are namespaced — v* for the app, web-v* for the server —
so a server release no longer triggers a macOS build or rewrites
app-repo.json. workflows are prefixed ios-/web- and path-filtered.
2026-08-03 10:25:03 +02:00

66 lines
2.0 KiB
YAML

# Pinned so the volume prefix stays `ftstore_` no matter what the checkout
# directory is called. Without it Compose would name the project after the
# folder — `web` in this monorepo — and a `docker compose up` from a fresh
# clone would silently start against empty volumes.
name: ftstore
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: ftstore
POSTGRES_PASSWORD: ftstore
POSTGRES_DB: ftstore
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ftstore"]
interval: 5s
timeout: 5s
retries: 5
app:
image: ghcr.io/felitendo/ftstore-admin-app:latest
restart: unless-stopped
stop_grace_period: 30s
ports:
- "3000:3000"
environment:
DATABASE_URL: postgresql://ftstore:ftstore@db:5432/ftstore?schema=public
volumes:
- tdlib-data:/app/tdlib-data
# IPA files and tweak icons. Must be the SAME volume as the worker's:
# the worker writes what the scraper downloads, the app serves it and
# writes what the dashboard uploads.
- ipa-storage:/app/storage
# Dashboard IPA uploads are staged here before ingest — keep multi-hundred-MB
# files off the container's writable layer.
- upload-staging:/tmp/ftstore
depends_on:
db:
condition: service_healthy
worker:
image: ghcr.io/felitendo/ftstore-admin-worker:latest
restart: unless-stopped
stop_grace_period: 30s
environment:
DATABASE_URL: postgresql://ftstore:ftstore@db:5432/ftstore?schema=public
volumes:
- tdlib-data:/app/tdlib-data
- ipa-storage:/app/storage
- temp-downloads:/tmp/ftstore
depends_on:
db:
condition: service_healthy
volumes:
pgdata:
tdlib-data:
ipa-storage:
# Per-container scratch, deliberately not shared: the app's upload sweeper
# would otherwise race the worker's in-flight downloads.
temp-downloads:
upload-staging: