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:
1 parent
4b34c37ce3
commit
d7743977a1
5 files changed
+19
-5
No files matched your search
@@ -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/
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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:
|
||||||
|
|||||||
@@ -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`
|
||||||
|
|||||||
Reference in new issue
Block a user