Use bind mounts for pgdata and dp_keys in docker-compose

Matches the production compose so the stack data lives next to the
compose file and can be backed up with the server. ticket_uploads stays
a named volume to avoid losing existing attachments on pull.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mrleo1nidandClaude Opus 5.5 committed 2026-10-06 19:45:17 +03:00
1 parent 4b34c37ce3
commit d7743977a1
5 files changed
+19 -5

No files matched your search

+5
View File
@@ -6,6 +6,11 @@
**/node_modules/ **/node_modules/
frontend/dist/ frontend/dist/
# Данные docker-compose (bind-маунты): в build context не нужны, а pgdata ещё и нечитаем
# (владелец — uid postgres), сборка на нём падала бы
pgdata/
dp_keys/
# VCS / IDE / env # VCS / IDE / env
.git/ .git/
.vs/ .vs/
+4
View File
@@ -415,6 +415,10 @@ FodyWeavers.xsd
*.sln.iml *.sln.iml
# Данные docker-compose (bind-маунты) — БД и key-ring Data Protection
/pgdata/
/dp_keys/
# Local environment files (secrets) — keep .env.example, ignore real .env # Local environment files (secrets) — keep .env.example, ignore real .env
.env .env
.env.local .env.local
+6 -1
View File
@@ -28,9 +28,14 @@
```bash ```bash
cp .env.example .env # заполнить AdminSeed__Password, Jwt__SigningKey и т.д. cp .env.example .env # заполнить AdminSeed__Password, Jwt__SigningKey и т.д.
docker compose up -d --build docker compose up -d --build
# → http://localhost:8080 (админ — логин/пароль из .env, AdminSeed__Username/Password) # → http://localhost:8085 (админ — логин/пароль из .env, AdminSeed__Username/Password)
``` ```
БД и key-ring лежат рядом с `docker-compose.yml` (bind-маунты): `./pgdata` — PostgreSQL, `./dp_keys` —
key-ring Data Protection (без него не расшифровать пароли нод). Вложения тикетов и картинки — в
именованном volume `ticket_uploads`. Бэкап — остановить стек (`docker compose stop`) и скопировать
каталог целиком вместе с `.env` (+ содержимое volume `ticket_uploads`).
Локальная разработка (без Docker для приложения — только `db`): Локальная разработка (без Docker для приложения — только `db`):
```bash ```bash
+2 -2
View File
@@ -6,7 +6,7 @@ services:
POSTGRES_USER: ${POSTGRES_USER:-pnvpanel} POSTGRES_USER: ${POSTGRES_USER:-pnvpanel}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-pnvpanel} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-pnvpanel}
volumes: volumes:
- pgdata:/var/lib/postgresql/data - ./pgdata:/var/lib/postgresql/data
healthcheck: healthcheck:
test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER:-pnvpanel} -d ${POSTGRES_DB:-pnvpanel}'] test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER:-pnvpanel} -d ${POSTGRES_DB:-pnvpanel}']
interval: 5s interval: 5s
@@ -39,7 +39,7 @@ services:
volumes: volumes:
# Data Protection key-ring (шифрование секретов нод at-rest) должен пережить пересоздание # Data Protection key-ring (шифрование секретов нод at-rest) должен пережить пересоздание
# контейнера — иначе расшифровка паролей нод после рестарта станет невозможна. # контейнера — иначе расшифровка паролей нод после рестарта станет невозможна.
- dp_keys:/app/keys - ./dp_keys:/app/keys
# Вложения тикетов поддержки (скриншоты) — обычные файлы на диске, см. DiskFileStorage. # Вложения тикетов поддержки (скриншоты) — обычные файлы на диске, см. DiskFileStorage.
- ticket_uploads:/app/uploads - ticket_uploads:/app/uploads
healthcheck: healthcheck:
+2 -2
View File
@@ -97,11 +97,11 @@ PnvPanel — backend на **ASP.NET Core (.NET 10)** по принципам **C
- **Background jobs**: `TrafficSyncService`, `NodeHealthCheckService`, `TrafficRetentionService`, - **Background jobs**: `TrafficSyncService`, `NodeHealthCheckService`, `TrafficRetentionService`,
`BillingService` (`BackgroundService` + `PeriodicTimer`). `BillingService` (`BackgroundService` + `PeriodicTimer`).
- **Secrets**: `DataProtectionSecretProtector : ISecretProtector` (шифрование паролей нод at-rest, - **Secrets**: `DataProtectionSecretProtector : ISecretProtector` (шифрование паролей нод at-rest,
ASP.NET Core Data Protection, key-ring на томе `dp_keys`). ASP.NET Core Data Protection, key-ring в bind-маунте `./dp_keys`).
- **Telegram**: `TelegramNotifier : ITelegramNotifier` — отправка DM-уведомлений через `ITelegramBotClient`. - **Telegram**: `TelegramNotifier : ITelegramNotifier` — отправка DM-уведомлений через `ITelegramBotClient`.
- **Storage**: `DiskFileStorage : IFileStorage` — вложения тикетов поддержки и картинки для markdown - **Storage**: `DiskFileStorage : IFileStorage` — вложения тикетов поддержки и картинки для markdown
(`MediaImage`), файлы на диске под GUID-именем (`FileStorage:RootPath`, том `ticket_uploads` в (`MediaImage`), файлы на диске под GUID-именем (`FileStorage:RootPath`, том `ticket_uploads` в
docker-compose, как `dp_keys`). docker-compose).
> **SignalR-пуш физически лежит в `PnvPanel.Api/Hubs/`, не в `Infrastructure`.** > **SignalR-пуш физически лежит в `PnvPanel.Api/Hubs/`, не в `Infrastructure`.**
> `SignalRRealtimeNotifier : IRealtimeNotifier` нужен `IHubContext<PanelHub>`, а сам `PanelHub` > `SignalRRealtimeNotifier : IRealtimeNotifier` нужен `IHubContext<PanelHub>`, а сам `PanelHub`