All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 54m48s
Admin → Backup: Ziel (SFTP oder Nextcloud/WebDAV) konfigurieren, Verbindung testen, Jetzt sichern,
Zeitplan (aus/täglich/wöchentlich) + Aufbewahrung. Best Practice: verschlüsselt + off-site.
- Verschlüsselung: Backup als tar.gz (database.dump + MinIO-Dateien) → AES-256-GCM mit Passphrase.
Zugangsdaten + Passphrase verschlüsselt in DB (src/lib/crypto-secret.ts, Schlüssel aus Server-Secret)
- Engine (src/lib/backup): pg_dump + archiver-Stream aus MinIO + Stream-Verschlüsselung + Upload + Prune
- Ziel-Adapter: SFTP (ssh2-sftp-client) + WebDAV (webdav), je test/upload/list/delete
- API (SERVER_ADMIN): /api/admin/backup/{config,test,run}; öffentlich per CRON_SECRET: /api/cron/backup
- Scheduler in server-custom.js (stündliche Fälligkeitsprüfung)
- Dockerfile: postgresql16-client (pg_dump) + runtime-Libs; next.config serverExternalPackages
- scripts/decrypt-backup.js + docs/BACKUP.md (Restore-Anleitung), .env.example (CRON_SECRET, BACKUP_ENC_KEY)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
111 lines
3.4 KiB
JSON
111 lines
3.4 KiB
JSON
{
|
|
"name": "lageplan",
|
|
"version": "1.9.0",
|
|
"description": "Feuerwehr Lageplan - Krokier-App für Einsatzdokumentation",
|
|
"private": true,
|
|
"scripts": {
|
|
"dev": "next dev",
|
|
"build": "next build",
|
|
"start": "next start",
|
|
"lint": "next lint",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"db:generate": "prisma generate",
|
|
"db:push": "prisma db push",
|
|
"db:migrate": "prisma migrate dev",
|
|
"db:migrate:prod": "prisma migrate deploy",
|
|
"db:seed": "node prisma/seed.js",
|
|
"db:studio": "prisma studio",
|
|
"postinstall": "prisma generate",
|
|
"db:seed:icons": "node prisma/seed-icons-only.js",
|
|
"db:seed:safe": "node prisma/seed.js",
|
|
"repair:features:dry-run": "node prisma/repair-features.js --dry-run",
|
|
"repair:features:apply": "node prisma/repair-features.js --apply",
|
|
"recover:symbols:dry-run": "node prisma/recover-symbols.js --dry-run",
|
|
"recover:symbols:apply": "node prisma/recover-symbols.js --apply"
|
|
},
|
|
"dependencies": {
|
|
"@dnd-kit/core": "^6.1.0",
|
|
"@dnd-kit/sortable": "^8.0.0",
|
|
"@dnd-kit/utilities": "^3.2.2",
|
|
"@prisma/client": "^5.9.0",
|
|
"@radix-ui/react-alert-dialog": "^1.1.0",
|
|
"@radix-ui/react-avatar": "^1.1.0",
|
|
"@radix-ui/react-dialog": "^1.1.0",
|
|
"@radix-ui/react-dropdown-menu": "^2.1.0",
|
|
"@radix-ui/react-label": "^2.1.0",
|
|
"@radix-ui/react-popover": "^1.1.0",
|
|
"@radix-ui/react-scroll-area": "^1.2.0",
|
|
"@radix-ui/react-select": "^2.1.0",
|
|
"@radix-ui/react-separator": "^1.1.0",
|
|
"@radix-ui/react-slot": "^1.1.0",
|
|
"@radix-ui/react-tabs": "^1.1.0",
|
|
"@radix-ui/react-toast": "^1.2.0",
|
|
"@radix-ui/react-tooltip": "^1.1.0",
|
|
"@react-pdf/renderer": "^4.3.2",
|
|
"@simplewebauthn/browser": "^13.3.0",
|
|
"@simplewebauthn/server": "^13.3.2",
|
|
"archiver": "^8.0.0",
|
|
"bcryptjs": "^2.4.3",
|
|
"class-variance-authority": "^0.7.0",
|
|
"clsx": "^2.1.0",
|
|
"html2canvas": "^1.4.1",
|
|
"jose": "^5.2.0",
|
|
"jspdf": "^2.5.1",
|
|
"lucide-react": "^0.312.0",
|
|
"maplibre-gl": "^4.0.0",
|
|
"minio": "^7.1.3",
|
|
"next": "^15.1.0",
|
|
"nodemailer": "^6.9.8",
|
|
"otplib": "^12.0.1",
|
|
"qrcode": "^1.5.4",
|
|
"rdndmb-html5-to-touch": "^9.0.0",
|
|
"react": "^19.0.0",
|
|
"react-dnd": "^16.0.1",
|
|
"react-dnd-html5-backend": "^16.0.1",
|
|
"react-dnd-multi-backend": "^9.0.0",
|
|
"react-dnd-touch-backend": "^16.0.1",
|
|
"react-dom": "^19.0.0",
|
|
"react-moveable": "^0.56.0",
|
|
"socket.io": "^4.7.4",
|
|
"socket.io-client": "^4.7.4",
|
|
"ssh2-sftp-client": "^12.1.1",
|
|
"stripe": "^20.3.1",
|
|
"tailwind-merge": "^2.2.1",
|
|
"tailwindcss-animate": "^1.0.7",
|
|
"uuid": "^9.0.1",
|
|
"webdav": "^5.10.0",
|
|
"zod": "^3.22.4",
|
|
"zustand": "^5.0.11"
|
|
},
|
|
"prisma": {
|
|
"seed": "node prisma/seed.js"
|
|
},
|
|
"devDependencies": {
|
|
"@types/archiver": "^8.0.0",
|
|
"@types/bcryptjs": "^2.4.6",
|
|
"@types/node": "^20.11.0",
|
|
"@types/qrcode": "^1.5.6",
|
|
"@types/react": "^19.0.0",
|
|
"@types/react-dom": "^19.0.0",
|
|
"@types/ssh2-sftp-client": "^9.0.6",
|
|
"@types/uuid": "^9.0.7",
|
|
"autoprefixer": "^10.4.17",
|
|
"eslint": "^8.56.0",
|
|
"eslint-config-next": "^15.1.0",
|
|
"postcss": "^8.4.33",
|
|
"prisma": "^5.9.0",
|
|
"sharp": "^0.34.5",
|
|
"tailwindcss": "^3.4.1",
|
|
"tsx": "^4.7.0",
|
|
"typescript": "^5.3.3",
|
|
"vitest": "^4.1.10"
|
|
},
|
|
"browserslist": [
|
|
"last 2 Chrome versions",
|
|
"last 2 Firefox versions",
|
|
"last 2 Safari versions",
|
|
"last 2 Edge versions"
|
|
]
|
|
}
|