Compliance: NIS2 Art.21(2)(c), BIO A.17.1 Owner: GloryLabs Review cycle: Annual or after any significant infrastructure change
| Metric | Target | |--------|--------| | RTO (Recovery Time Objective) | ≤ 8 hours | | RPO (Recovery Point Objective) | ≤ 1 hour |
| Component | Technology | Location |
|-----------|-----------|---------|
| Backend API | Spring Boot on k3s | TransIP VPS 136.144.174.219 |
| Database | PostgreSQL 15 (Bitnami Helm chart) | Same VPS, auditpicdb |
| Object storage | MinIO | Same VPS, ports 9004/9005 |
| Container registry | GHCR ghcr.io/mahmoudholding/auditpic/* | GitHub |
| Secrets | 1Password → Sealed Secrets | 1Password vault + k3s |
pg_dump compressed dump via CronJob in k3s.BACKUP_S3_ENDPOINT env var).scripts/validate-backup.sh.mc mirror to a secondary MinIO instance or S3-compatible bucket.helm/ and k8s/). The cluster state is fully reproducible from the repository.RTO: < 5 minutes (Kubernetes self-healing)
kubectl rollout restart deployment/audit-pic-backend -n auditpichelm rollback auditpic -n auditpic).RTO: ≤ 2 h | RPO: ≤ 1 h
pg_restore -h <db-host> -U auditpic -d auditpicdb --clean /backups/auditpicdb_<timestamp>.dump
RTO: ≤ 8 h | RPO: ≤ 1 h
curl -sfL https://get.k3s.io | sh -OP_SERVICE_ACCOUNT_TOKEN=<token> ./scripts/seal-secrets.shhelm upgrade --install auditpic ./helm/auditpic -n auditpic --create-namespaceRTO: ≤ 2 h (key rotation, no data loss)
JWT_SECRET and HMAC_SECRET in 1Password vault.OP_SERVICE_ACCOUNT_TOKEN=<token> ./scripts/seal-secrets.shkubectl apply -f k8s/sealed-secrets/kubectl rollout restart deployment/audit-pic-backend -n auditpicverify-signature endpoint will return false for all pre-rotation photos. Post-rotation re-signing is out of scope; advise affected users to re-upload if verification is required.| Audience | Channel | Trigger | |----------|---------|---------| | Development team | Internal chat incident channel | Any P1/P2 | | End users | In-app banner + email | Service unavailable > 2 h or data loss | | Supervisory authority | Email per GDPR Art.33 | Personal data breach |
| Test | Frequency | Owner | |------|-----------|-------| | Backup restore drill (Scenario B) | Monthly | On-call engineer | | Full DR simulation (Scenario C) | Quarterly | GloryLabs infrastructure lead | | Key rotation drill (Scenario D) | Semi-annual | GloryLabs security lead |
Test results are logged in reports/bcp-tests/ and linked to the GitHub Issue tracker.
| Dependency | Risk | Mitigation |
|-----------|------|-----------|
| Single VPS | Full outage if VPS is lost | Backups off-site; recovery < 8 h via Scenario C |
| GitHub GHCR | Cannot deploy new images | Cache last 3 image tags locally on VPS |
| 1Password | Cannot unseal secrets | Emergency plaintext backup in encrypted USB (locked in office safe) |
| Hive AI API | AI detection unavailable | Detection fails gracefully; aiDetectionStatus = FAILED; core verification still works |
Reacties