Die Oberflaeche legt einen Vorgang an und schickt nur dessen ID in die Warteschlange; der Worker fuehrt ihn aus und haelt Status, Ergebnis oder Fehler fest. So bleiben lange SSH-Vorgaenge aus dem Webprozess heraus, und der Fortschritt ist ohne Job-Interna sichtbar. Kein automatisches Wiederholen: ein halb ausgefuehrter Schreibvorgang auf einem Host gehoert vor einen Menschen. Fehlertexte aus fremden Bibliotheken erreichen die Oberflaeche nie. Dockerfile und Compose fuer den Betrieb: Master-Key als Secret nur im Worker, Datenbank in einem internen Netz. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
94 lines
3.0 KiB
JSON
94 lines
3.0 KiB
JSON
{
|
||
"name": "sshkv",
|
||
"version": "0.0.0",
|
||
"private": true,
|
||
"type": "module",
|
||
"description": "SSHKeyVault – zentrale Verwaltung von SSH-Schluesseln mit Weboberflaeche",
|
||
"packageManager": "pnpm@12.6.0",
|
||
"engines": {
|
||
"node": ">=24"
|
||
},
|
||
"scripts": {
|
||
"dev": "next dev -p 3400",
|
||
"build": "next build",
|
||
"build:worker": "esbuild src/worker/index.ts --bundle --platform=node --target=node24 --format=esm --outfile=dist/worker.mjs --banner:js=\"$(cat deploy/worker-banner.js)\" --external:@prisma/client --external:@node-rs/argon2 --external:pg-native --external:cpu-features --external:*.node",
|
||
"start": "next start -p 3400",
|
||
"worker": "tsx src/worker/index.ts",
|
||
"lint": "eslint",
|
||
"typecheck": "tsc --noEmit",
|
||
"format": "prettier --write .",
|
||
"format:pruefen": "prettier --check .",
|
||
"test": "vitest run",
|
||
"test:watch": "vitest",
|
||
"test:integration": "vitest run --config vitest.integration.config.mts",
|
||
"test:ziele:up": "docker compose -f docker-compose.test.yml up -d --build --wait",
|
||
"test:ziele:down": "docker compose -f docker-compose.test.yml down",
|
||
"db:up": "docker compose -f docker-compose.dev.yml up -d --wait",
|
||
"db:down": "docker compose -f docker-compose.dev.yml down",
|
||
"db:migrate": "prisma migrate dev",
|
||
"db:seed": "prisma db seed",
|
||
"db:generate": "prisma generate",
|
||
"issues:sync": "tsx scripts/gitea-issues.ts",
|
||
"icons": "node scripts/icons.mjs",
|
||
"postinstall": "prisma generate",
|
||
"prepare": "husky",
|
||
"build:all": "pnpm build && pnpm build:worker"
|
||
},
|
||
"lint-staged": {
|
||
"*.{ts,tsx,mts,mjs}": [
|
||
"eslint --fix",
|
||
"prettier --write"
|
||
],
|
||
"*.{json,css,yml,yaml}": [
|
||
"prettier --write"
|
||
]
|
||
},
|
||
"dependencies": {
|
||
"@fontsource/ibm-plex-sans": "^5.3.0",
|
||
"@fontsource/jetbrains-mono": "^5.3.0",
|
||
"@fontsource/space-grotesk": "^5.3.0",
|
||
"@node-rs/argon2": "^2.2.2",
|
||
"@prisma/adapter-pg": "7.10.0",
|
||
"@prisma/client": "7.10.0",
|
||
"clsx": "^2.1.1",
|
||
"jose": "^6.2.12",
|
||
"lucide-react": "1.47.0",
|
||
"next": "16.3.6",
|
||
"openid-client": "^6.8.8",
|
||
"pg": "^8.23.1",
|
||
"pg-boss": "^12.37.1",
|
||
"qrcode": "^1.5.4",
|
||
"react": "19.3.0",
|
||
"react-dom": "19.3.0",
|
||
"ssh2": "^1.17.0",
|
||
"zod": "^4.6.5"
|
||
},
|
||
"devDependencies": {
|
||
"@commitlint/cli": "^21.2.3",
|
||
"@commitlint/config-conventional": "^21.2.3",
|
||
"@playwright/test": "1.63.0",
|
||
"@tailwindcss/postcss": "^4.3.3",
|
||
"@types/node": "^24.19.2",
|
||
"@types/pg": "^8.23.1",
|
||
"@types/qrcode": "^1.5.6",
|
||
"@types/react": "^19.3.0",
|
||
"@types/react-dom": "^19.3.0",
|
||
"@types/ssh2": "^1.15.6",
|
||
"dotenv": "^18.0.7",
|
||
"esbuild": "^0.28.2",
|
||
"eslint": "^9.39.5",
|
||
"eslint-config-next": "16.3.6",
|
||
"eslint-config-prettier": "^10.1.8",
|
||
"husky": "^9.1.7",
|
||
"lint-staged": "^17.6.0",
|
||
"prettier": "^3.9.10",
|
||
"prisma": "7.10.0",
|
||
"sharp": "^0.35.5",
|
||
"tailwindcss": "^4.3.3",
|
||
"tsx": "^4.23.15",
|
||
"typescript": "~6.0.3",
|
||
"vite": "8.3.0",
|
||
"vitest": "5.0.1"
|
||
}
|
||
}
|