CacheInterceptor кэширует каждый успешный GET по путь+параметры в drift (sqlite нативно, wasm+OPFS в браузере) и подменяет им сетевую ошибку; провайдер отдаёт Cached<T>, экран показывает баннер «данные на …». Контракт для остальных экранов — docs/ai/offline-cache.md. flake.nix: libsecret/pkg-config для линуксовой сборки, jq/curl для just app-web-assets (сборка sqlite3.wasm + drift_worker.js).
2.6 KiB
2.6 KiB
Эксплуатация
VPS (Docker Compose)
cp .env.example .env # заполнить POSTGRES_PASSWORD, JWT_SECRET (openssl rand -hex 32), DOMAIN, токены
just up # docker compose up -d --build: db, api (миграции при старте), worker, caddy, pg-backup
docker compose exec api fintracker create-user you@example.com
- Caddy: авто-TLS на
DOMAIN,/api/*→ api:8000, остальное — Flutter web изapp/build/web. - Worker — единственный экземпляр планировщика; ручной синк через
POST /api/v1/sync/{source}ставит задачу вsync_job, worker забирает её раз в 5 с. pg-backupделаетpg_dump -Fcраз в сутки в./backups, хранит 14 дней; off-site копию настраивает хост (rclone/cron), см. открытый вопрос в плане.
Восстановление
docker compose up -d db
docker compose exec -T db pg_restore -U $POSTGRES_USER -d $POSTGRES_DB --clean < backups/fintracker_<ts>.dump
docker compose up -d
Метрики пересчитываются из raw/core: docker compose exec worker fintracker metrics refresh.
Секреты
Только .env на сервере. В чат и в git не попадают. T-Invest токен — read-only.
Проверено с podman (2026-09-17)
podman 5.8+podman-compose 1.6: стекdb api workerподнимается,depends_on.condition: service_healthyработает.- Имена образов в
docker-compose.ymlиDockerfileполностью квалифицированы (docker.io/library/...) — podman безunqualified-search-registriesкороткие имена не резолвит. - Прокси хоста впекается в образ при
podman build/compose --build(HTTP_PROXYпопадает вConfig.Env), после чего запросы кlocalhostвнутри контейнера идут в недостижимый прокси. Поэтомуjust upсобирает сenv -u …proxy…. На VPS без прокси это ни на что не влияет. env_file: .envв compose — буквальный путь;--env-fileменяет только подстановку${…}в самом compose-файле.- Команда
apiиспользуетexec, иначеsh -cне передаёт SIGTERM uvicorn'у и compose добивает контейнер по таймауту.