stage-17: operational hardening — .env keys, model status, backup

Three load-bearing operational pieces before any new features:

* .env.example committed, .env gitignored — per-developer API keys
  (THREATFOX_AUTH_KEY, OTX_API_KEY, NVD_API_KEY) ready for the registrations
  ahead; python-dotenv loads it in the venv CLI; compose picks it up via
  env_file: .env on the cockpit service.

* Cockpit /api/inference-status endpoint + a topbar status chip that polls it
  on page load — "model · live" green when up, "model · offline" amber when
  the inference server is unreachable. No more manual checking. Compose also
  gains a healthcheck on the inference service (applies on next recreate).

* New `psyc backup` command — tars the audit trail (db + sealed packages +
  recipient keys + ledger + datasets) to data/backups/psyc-data-<ts>.tar.gz.
  Excludes the HF model cache, mock-cert receipts, and the re-trainable
  adapters — the goal is the irrecoverable evidence, not bulk artifacts.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
m17hr1l
2026-05-20 19:44:58 +02:00
parent 25c1c56645
commit 9e4c217a3d
7 changed files with 104 additions and 1 deletions

View File

@@ -16,6 +16,7 @@ services:
build: .
image: psyc:latest
command: ["psyc", "serve", "--host", "0.0.0.0", "--port", "8767"]
env_file: .env # per-dev API keys (gitignored). cp .env.example .env first.
environment:
VIRTUAL_HOST: psyc.neuronetz.ai
VIRTUAL_PORT: "8767"
@@ -57,6 +58,12 @@ services:
networks: [backend]
restart: unless-stopped
profiles: ["gpu"]
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8771/healthz')"]
interval: 30s
timeout: 5s
retries: 3
start_period: 90s
deploy:
resources:
reservations: