feat(db): перевести хранилище с SQLite на PostgreSQL
Docker images / prepare-release (push) Successful in 12s
Docker images / backend-test (push) Successful in 4m9s
Docker images / frontend-image (push) Successful in 4m28s
Docker images / updater-image (push) Successful in 58s
Docker images / backend-image (push) Successful in 2m49s
Docker images / notify-webhook (push) Skipped
Docker images / publish-release (push) Successful in 11s

При старте backend накатывает схему PostgreSQL 18 и, если база пустая, один раз импортирует mikrotik.db с тома. Повторный старт не копирует данные. Бэкап в UI идёт через pg_dump.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Denozordec
2026-09-08 01:36:48 +07:00
co-authored by Cursor
parent 0e5fb065e2
commit ec43591a99
128 changed files with 4304 additions and 3639 deletions
+2 -9
View File
@@ -14,20 +14,13 @@ import {
import type { FlowPurgeDto } from "@mmapp/contracts/traffic-flow"
import { AlertCircleIcon, LoaderCircleIcon } from "lucide-react"
function formatDbFileBytes(n: number): string {
if (n < 1024) return `${n} Б`
if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} КБ`
return `${(n / (1024 * 1024)).toFixed(1)} МБ`
}
export function formatFlowPurgeResult(result: FlowPurgeDto): string {
const rows =
result.deleted.buckets +
result.deleted.minuteStats +
result.deleted.minuteDims +
result.deleted.dailyDims
const vacuumHint = result.vacuumed ? "" : " VACUUM не выполнен."
return `Удалено строк: ${rows}. Файл ${formatDbFileBytes(result.fileBytesBefore)}${formatDbFileBytes(result.fileBytesAfter)}.${vacuumHint}`
return `Удалено строк: ${rows}.`
}
export function NetflowPurgeConfirm({
@@ -50,7 +43,7 @@ export function NetflowPurgeConfirm({
</AlertDialogMedia>
<AlertDialogTitle>Сбросить данные NetFlow?</AlertDialogTitle>
<AlertDialogDescription>
Будут удалены сессии и агрегаты (minute/daily) из SQLite, затем VACUUM.
Будут удалены сессии и агрегаты (minute/daily) в PostgreSQL.
Ключи WireGuard, пиры JH, настройки коллектора и кэш RIPE сохранятся.
На время операции приём IPFIX остановится.
</AlertDialogDescription>
@@ -167,7 +167,7 @@ function NetflowSettingsPanel({
<InfoIcon />
<AlertTitle>Ключи и UDP 4739</AlertTitle>
<AlertDescription>
Приватный ключ хранится в SQLite панели, не коммитьте его. Порт IPFIX публикуйте только на адресе wg-flow, не на 0.0.0.0.
Приватный ключ хранится в PostgreSQL панели, не коммитьте его. Порт IPFIX публикуйте только на адресе wg-flow, не на 0.0.0.0.
</AlertDescription>
</Alert>
@@ -262,7 +262,7 @@ function NetflowSettingsPanel({
<div className="min-w-0">
<p className="text-sm font-medium">Сбросить данные NetFlow</p>
<p className="text-xs text-muted-foreground mt-0.5">
Удалит сессии и агрегаты из SQLite, затем VACUUM. Ключи WG и пиры не трогает.
Удалит сессии и агрегаты в PostgreSQL. Ключи WG и пиры не трогает.
</p>
</div>
<Button