docs: document container deployment and recovery
Docs security / security (pull_request) Successful in 6s
Docs verify / verify (pull_request) Successful in 11s
Conventional commits / commits (pull_request) Successful in 11s
Docs security / security (push) Successful in 7s
Docs verify / verify (push) Successful in 10s
Docs security / security (pull_request) Successful in 6s
Docs verify / verify (pull_request) Successful in 11s
Conventional commits / commits (pull_request) Successful in 11s
Docs security / security (push) Successful in 7s
Docs verify / verify (push) Successful in 10s
This commit was merged in pull request #15.
This commit is contained in:
@@ -27,11 +27,50 @@ flowchart LR
|
||||
F -->|"HTTPS; изображения без авторизации"| C
|
||||
```
|
||||
|
||||
SPA выполняется в браузере пользователя. Backend — отдельное локальное
|
||||
SPA выполняется в браузере пользователя. Backend — отдельное
|
||||
приложение; SQLite используется внутри его процесса через библиотеку и файл
|
||||
базы. Между API и SQLite нет сетевого database server. Граница системы на
|
||||
схеме показывает принадлежность частей, а не их размещение на одном узле.
|
||||
|
||||
## Контейнерная поставка
|
||||
|
||||
Deployment view для одного сервера. Caddy принадлежит серверу; Compose
|
||||
содержит два постоянных application containers и одноразовую migration.
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
Browser["Браузер · React SPA"] -->|HTTPS| Caddy["Серверный Caddy · TLS"]
|
||||
subgraph Host["Один Docker host"]
|
||||
Caddy -->|"HTTP · 127.0.0.1:8080"| Frontend["frontend · nginx · SPA + /api/"]
|
||||
Frontend -->|"HTTP /api/v1 · internal network"| Backend["backend · NestJS · один process"]
|
||||
Migration["migration · Prisma · one-shot"] -->|"До старта backend"| Data[("Host directory · SQLite + WAL")]
|
||||
Backend -->|"Чтение и запись /data"| Data
|
||||
Secrets["Restricted environment · ключи вне images"] --> Backend
|
||||
end
|
||||
```
|
||||
|
||||
Только frontend публикует host port, привязанный к loopback. Backend не
|
||||
публикует порт, но имеет исходящий доступ к внешним API. nginx сохраняет
|
||||
`/api/` prefix, forwarding headers и request ID; Docker DNS разрешается
|
||||
повторно после backend recreation. HTML требует revalidation, hashed assets
|
||||
имеют immutable cache. Caddy не содержит отдельного маршрута к API.
|
||||
|
||||
Development заменяет nginx на Vite с HMR, backend — на Nest watch, а host data
|
||||
path — на отдельный named volume. Browser origin остаётся единым. Linux
|
||||
node_modules не монтируются с хоста. Production SPA собирается с relative API
|
||||
base; production cookies остаются Secure, публичный origin использует HTTPS.
|
||||
|
||||
Компоненты имеют независимые images и версии. Production фиксирует image
|
||||
version tags; migration использует тот же backend image. Успех migration предшествует
|
||||
backend healthcheck на существующем auth route; frontend ждёт healthy backend.
|
||||
Runtime работает non-root, SQLite сохраняется вне image, ключ шифрования и JWT
|
||||
secret поступают из restricted environment и сохраняются между обновлениями.
|
||||
|
||||
Ограничение SQLite расширено в [ADR 015](../adr/015-single-server-sqlite-deployment.md).
|
||||
[Runbook](deployment.md) описывает установку, independent
|
||||
updates, backup, rollback и explicit restore. Он также перечисляет внешние
|
||||
prerequisites: локальный smoke не подтверждает registry/server rollout.
|
||||
|
||||
## Ответственность частей
|
||||
|
||||
| Часть | Ответственность |
|
||||
@@ -106,10 +145,10 @@ credentials не являются сохраняемым представлен
|
||||
|
||||
## Сохранение и восстановление данных
|
||||
|
||||
Резервная копия SQLite должна быть согласованной: для работающей базы
|
||||
используется SQLite backup API с учётом WAL. Несогласованное копирование
|
||||
файлов базы и WAL не сохраняет целостный снимок. Восстановление проверяется
|
||||
на отдельной копии. Ключ шифрования подключения хранится отдельно от базы;
|
||||
Поддерживаемая процедура останавливает backend и копирует весь data directory
|
||||
с возможными WAL/SHM files до migration. Копирование отдельных файлов
|
||||
работающей базы не сохраняет целостный снимок; для live backup потребовался бы
|
||||
SQLite backup API. Восстановление проверяется на отдельной копии. Ключ шифрования подключения хранится отдельно от базы;
|
||||
его потеря делает сохранённый T-Bank token нечитаемым.
|
||||
|
||||
Откат приложения требует совместимости предыдущей версии с сохранённой
|
||||
@@ -150,12 +189,12 @@ access token и вращаемый refresh token. [Политика query-кэш
|
||||
отмечены в [аутентификации](../domains/authentication/overview.md#регистрация-и-вход)
|
||||
и [HTTP API](http-api.md#error-contract).
|
||||
|
||||
Подтверждённая топология — локальная SPA и локальный API с файлом SQLite.
|
||||
Поддерживается локальный Compose и ограниченная single-server topology с SQLite.
|
||||
Origin браузера, адрес API и cookie policy должны быть согласованы.
|
||||
`localhost` и `127.0.0.1` задают разные browser-границы для cookie и CORS.
|
||||
Локальный HTTP поддерживается в development-режиме backend; в остальных
|
||||
режимах refresh-cookie имеет Secure flag и требует защищённого соединения.
|
||||
Наличие локального запуска не задаёт production-топологию или гарантии SLA.
|
||||
Single-server deployment не задаёт гарантий HA или zero-downtime.
|
||||
|
||||
Кэши и лимитер T-Bank действуют на экземпляр backend. Ротация ключа шифрования
|
||||
подключений и согласование изменений подключения между распределёнными
|
||||
|
||||
Reference in New Issue
Block a user