Update infrastructure to use external PostgreSQL server instead of Docker container. Modify .env.example and documentation to reflect new connection settings and deployment instructions.

This commit is contained in:
Leonid Pershin
2026-07-24 06:33:11 +03:00
parent 8a3eebc48f
commit b67cc960a0
4 changed files with 27 additions and 46 deletions
+3 -7
View File
@@ -2,13 +2,9 @@
# Скопируй в .env и заполни значения. Ключи вида Section__Key биндятся в IOptions<T> ASP.NET Core. # Скопируй в .env и заполни значения. Ключи вида Section__Key биндятся в IOptions<T> ASP.NET Core.
# ВСЕ значения-секреты ниже обязательно заменить перед запуском (особенно *_PASSWORD, *SigningKey). # ВСЕ значения-секреты ниже обязательно заменить перед запуском (особенно *_PASSWORD, *SigningKey).
# ── PostgreSQL (контейнер db) ───────────────────────────────────────────── # ── PostgreSQL (внешний сервер, не в compose) ─────────────────────────────
POSTGRES_DB=telewave # База и пользователь создаются заранее на самом сервере БД (см. README — раздел "Развёртывание").
POSTGRES_USER=telewave ConnectionStrings__Default=Host=10.10.1.134;Port=5432;Database=telewave;Username=telewave;Password=change-me-strong-db-password
POSTGRES_PASSWORD=change-me-strong-db-password
# Строка подключения приложения (host = имя сервиса БД в docker-compose)
ConnectionStrings__Default=Host=db;Port=5432;Database=telewave;Username=telewave;Password=change-me-strong-db-password
# ── JWT ─────────────────────────────────────────────────────────────────── # ── JWT ───────────────────────────────────────────────────────────────────
Jwt__Issuer=TeleWave Jwt__Issuer=TeleWave
+8 -4
View File
@@ -23,7 +23,8 @@
Маппинг DTO вручную. OpenAPI — нативный `Microsoft.AspNetCore.OpenApi` + Scalar UI. Маппинг DTO вручную. OpenAPI — нативный `Microsoft.AspNetCore.OpenApi` + Scalar UI.
- **Frontend**: React 19 + Vite + TS, TanStack Query/Router, shadcn-стиль поверх Radix + Tailwind - **Frontend**: React 19 + Vite + TS, TanStack Query/Router, shadcn-стиль поверх Radix + Tailwind
v4, Zustand (только auth+тема), react-hook-form + zod. pnpm, oxlint. v4, Zustand (только auth+тема), react-hook-form + zod. pnpm, oxlint.
- **Инфра**: единый Docker-образ (API + статика SPA) + PostgreSQL в docker-compose. - **Инфра**: единый Docker-образ (API + статика SPA); PostgreSQL **внешний сервер**, не в
compose (в отличие от PnvPanel).
## Архитектура — жёсткие правила ## Архитектура — жёсткие правила
@@ -83,8 +84,11 @@
runtime. Никакого gosu/root-drop и Data Protection key-ring — секретов на диске пока нет runtime. Никакого gosu/root-drop и Data Protection key-ring — секретов на диске пока нет
(JWT-ключ — обычная конфигурация, не шифруемый секрет at-rest); если появятся зашифрованные (JWT-ключ — обычная конфигурация, не шифруемый секрет at-rest); если появятся зашифрованные
данные (например API-ключи внешних сервисов) — добавлять Data Protection по образцу PnvPanel. данные (например API-ключи внешних сервисов) — добавлять Data Protection по образцу PnvPanel.
- docker-compose: `app` + `db` (PostgreSQL). Миграции применяются авто на старте - docker-compose: только `app` — PostgreSQL живёт вне compose (внешний сервер/хост, адрес и
(`ApplyMigrationsAsync` в `Program.cs`). креды — в `ConnectionStrings__Default` из `.env`; база и пользователь на нём создаются
заранее вручную, приложение их не сидит). Миграции применяются авто на старте
(`ApplyMigrationsAsync` в `Program.cs`) — прав `CREATEDB` не требуется, только DDL/DML в
уже существующей базе.
- Не вводи отдельный nginx-контейнер для статики — ломает требование единого контейнера. - Не вводи отдельный nginx-контейнер для статики — ломает требование единого контейнера.
- **TLS — внешний**; `app` отдаёт HTTP + доверяет `X-Forwarded-*` (`ForwardedHeaders`). - **TLS — внешний**; `app` отдаёт HTTP + доверяет `X-Forwarded-*` (`ForwardedHeaders`).
@@ -121,7 +125,7 @@ pnpm lint && pnpm typecheck
Инфраструктура: Инфраструктура:
```bash ```bash
docker compose up -d --build # api + postgres docker compose up -d --build # только api; postgres — внешний, см. ConnectionStrings__Default
``` ```
> Окружение: Windows, основная оболочка — **PowerShell**. Для POSIX-скриптов есть Bash-инструмент. > Окружение: Windows, основная оболочка — **PowerShell**. Для POSIX-скриптов есть Bash-инструмент.
+15 -6
View File
@@ -6,7 +6,7 @@
> Текущее состояние — **база**: вход/регистрация, роли, пользователи, минимальная админка, > Текущее состояние — **база**: вход/регистрация, роли, пользователи, минимальная админка,
> приветственная главная страница. Каталог каналов и раздача видео — следующий этап, пока не > приветственная главная страница. Каталог каналов и раздача видео — следующий этап, пока не
> реализованы. Приложение (фронт + бек) поставляется **единым Docker-образом**; PostgreSQL — > реализованы. Приложение (фронт + бек) поставляется **единым Docker-образом**; PostgreSQL —
> отдельным контейнером в compose. > **внешний**, не поднимается через compose.
## Стек ## Стек
@@ -16,19 +16,28 @@
| БД | PostgreSQL (Npgsql) | | БД | PostgreSQL (Npgsql) |
| Auth | ASP.NET Core Identity + JWT (access + refresh, ротация) | | Auth | ASP.NET Core Identity + JWT (access + refresh, ротация) |
| Frontend | React 19 + Vite + TypeScript, TanStack Query/Router, shadcn/ui + Tailwind v4 (ретро-CRT тема) | | Frontend | React 19 + Vite + TypeScript, TanStack Query/Router, shadcn/ui + Tailwind v4 (ретро-CRT тема) |
| Упаковка | Единый Docker-образ (API + статика SPA) + PostgreSQL в docker-compose | | Упаковка | Единый Docker-образ (API + статика SPA); PostgreSQL — внешний сервер |
## Быстрый старт ## Развёртывание
Единый Docker-образ + PostgreSQL: Postgres не входит в compose — база и пользователь создаются заранее на внешнем сервере БД:
```sql
-- на сервере БД (psql -h <хост БД> -U postgres)
CREATE USER telewave WITH PASSWORD 'change-me-strong-db-password';
CREATE DATABASE telewave OWNER telewave;
```
Затем на хосте с приложением:
```bash ```bash
cp .env.example .env # заполнить AdminSeed__Password, Jwt__SigningKey и т.д. cp .env.example .env
# заполнить ConnectionStrings__Default (хост/база/юзер/пароль БД), Jwt__SigningKey, AdminSeed__*
docker compose up -d --build docker compose up -d --build
# → http://localhost:8085 (админ — логин/пароль из .env, AdminSeed__Username/Password) # → http://localhost:8085 (админ — логин/пароль из .env, AdminSeed__Username/Password)
``` ```
Локальная разработка (без Docker для приложения — только `db`): ## Локальная разработка
```bash ```bash
# backend, из backend/ # backend, из backend/
+1 -29
View File
@@ -1,39 +1,14 @@
services: services:
db:
image: postgres:17-alpine
environment:
POSTGRES_DB: ${POSTGRES_DB:-telewave}
POSTGRES_USER: ${POSTGRES_USER:-telewave}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-telewave}
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER:-telewave} -d ${POSTGRES_DB:-telewave}']
interval: 5s
timeout: 5s
retries: 10
restart: unless-stopped
logging:
driver: json-file
options:
max-size: '10m'
max-file: '3'
app: app:
build: build:
context: . context: .
dockerfile: Dockerfile dockerfile: Dockerfile
depends_on: # Postgres — внешний (не в compose), см. ConnectionStrings__Default в .env.
db:
condition: service_healthy
# Секреты (Jwt__SigningKey, AdminSeed__Password, ...) — из .env, см. .env.example.
# ConnectionStrings__Default ниже переопределяет .env: адрес БД внутри сети compose всегда 'db'.
env_file: env_file:
- .env - .env
environment: environment:
ASPNETCORE_ENVIRONMENT: Production ASPNETCORE_ENVIRONMENT: Production
ASPNETCORE_HTTP_PORTS: '8085' ASPNETCORE_HTTP_PORTS: '8085'
ConnectionStrings__Default: 'Host=db;Port=5432;Database=${POSTGRES_DB:-telewave};Username=${POSTGRES_USER:-telewave};Password=${POSTGRES_PASSWORD:-telewave}'
healthcheck: healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost:8085/health'] test: ['CMD', 'curl', '-f', 'http://localhost:8085/health']
interval: 15s interval: 15s
@@ -48,6 +23,3 @@ services:
options: options:
max-size: '10m' max-size: '10m'
max-file: '3' max-file: '3'
volumes:
pgdata: