Added self-hosted password manager to The Falcon infrastructure: **Vault Stack** (vault.pivoine.art): - Vaultwarden (Bitwarden-compatible server) - SQLite database for password storage - WebSocket support for real-time sync - TOTP and WebAuthn/U2F 2FA support - Browser extensions and mobile apps compatible **Configuration:** - Domain: https://vault.pivoine.art - Signups: Disabled (invite-only for security) - Invitations: Enabled - Password hints: Disabled (security best practice) - First user becomes admin **Backup Integration:** - Added vaultwarden-backup plan to Restic - Schedule: 8 AM daily (same as letsencrypt) - Retention: 7 daily, 4 weekly, 12 monthly, 3 yearly - Backup volume: vault_data mounted read-only **Infrastructure Updates:** - Created vault/compose.yaml following stack pattern - Added VAULT_* environment variables to arty.yml - Updated compose.yaml to include vault stack - Added backup_vaultwarden_data volume to restic - Updated restic/config.json with 12th backup plan **Documentation:** - Added Vault to CORE SYSTEMS in README - Added to ship architecture diagram - Documented in CLAUDE.md with configuration details - Updated volume management sections - Backup count increased from 11 to 12 plans Critical data backed up with long retention (3 years yearly). Compatible with official Bitwarden clients on all platforms. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
216 lines
4.3 KiB
JSON
216 lines
4.3 KiB
JSON
{
|
|
"version": 4,
|
|
"instance": "falcon",
|
|
"repos": [
|
|
{
|
|
"id": "hidrive-backup",
|
|
"uri": "/repos",
|
|
"password": "falcon-backup-2025",
|
|
"autoUnlock": true,
|
|
"autoInitialize": true,
|
|
"prunePolicy": {
|
|
"schedule": {
|
|
"cron": "0 2 * * 0"
|
|
}
|
|
},
|
|
"checkPolicy": {
|
|
"schedule": {
|
|
"cron": "0 3 * * 0"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"plans": [
|
|
{
|
|
"id": "postgres-backup",
|
|
"repo": "hidrive-backup",
|
|
"paths": ["/volumes/core_postgres_data"],
|
|
"schedule": {
|
|
"cron": "0 2 * * *"
|
|
},
|
|
"retention": {
|
|
"policyTimeBucketed": {
|
|
"daily": 7,
|
|
"weekly": 4,
|
|
"monthly": 6,
|
|
"yearly": 2
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "redis-backup",
|
|
"repo": "hidrive-backup",
|
|
"paths": ["/volumes/core_redis_data"],
|
|
"schedule": {
|
|
"cron": "0 3 * * *"
|
|
},
|
|
"retention": {
|
|
"policyTimeBucketed": {
|
|
"daily": 7,
|
|
"weekly": 4,
|
|
"monthly": 3
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "directus-uploads-backup",
|
|
"repo": "hidrive-backup",
|
|
"paths": ["/volumes/directus_uploads"],
|
|
"schedule": {
|
|
"cron": "0 4 * * *"
|
|
},
|
|
"retention": {
|
|
"policyTimeBucketed": {
|
|
"daily": 7,
|
|
"weekly": 4,
|
|
"monthly": 6,
|
|
"yearly": 2
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "directus-bundle-backup",
|
|
"repo": "hidrive-backup",
|
|
"paths": ["/volumes/directus_bundle"],
|
|
"schedule": {
|
|
"cron": "0 4 * * *"
|
|
},
|
|
"retention": {
|
|
"policyTimeBucketed": {
|
|
"daily": 7,
|
|
"weekly": 4,
|
|
"monthly": 3
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "awesome-backup",
|
|
"repo": "hidrive-backup",
|
|
"paths": ["/volumes/awesome_data"],
|
|
"schedule": {
|
|
"cron": "0 5 * * *"
|
|
},
|
|
"retention": {
|
|
"policyTimeBucketed": {
|
|
"daily": 7,
|
|
"weekly": 4,
|
|
"monthly": 6
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "gotify-backup",
|
|
"repo": "hidrive-backup",
|
|
"paths": ["/volumes/gotify_data"],
|
|
"schedule": {
|
|
"cron": "0 5 * * *"
|
|
},
|
|
"retention": {
|
|
"policyTimeBucketed": {
|
|
"daily": 7,
|
|
"weekly": 4,
|
|
"monthly": 3
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "scrapy-backup",
|
|
"repo": "hidrive-backup",
|
|
"paths": [
|
|
"/volumes/scrapyd_data",
|
|
"/volumes/scrapy_code"
|
|
],
|
|
"schedule": {
|
|
"cron": "0 6 * * *"
|
|
},
|
|
"retention": {
|
|
"policyTimeBucketed": {
|
|
"daily": 7,
|
|
"weekly": 4,
|
|
"monthly": 3
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "n8n-backup",
|
|
"repo": "hidrive-backup",
|
|
"paths": ["/volumes/n8n_data"],
|
|
"schedule": {
|
|
"cron": "0 6 * * *"
|
|
},
|
|
"retention": {
|
|
"policyTimeBucketed": {
|
|
"daily": 7,
|
|
"weekly": 4,
|
|
"monthly": 6
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "filestash-backup",
|
|
"repo": "hidrive-backup",
|
|
"paths": ["/volumes/filestash_data"],
|
|
"schedule": {
|
|
"cron": "0 7 * * *"
|
|
},
|
|
"retention": {
|
|
"policyTimeBucketed": {
|
|
"daily": 7,
|
|
"weekly": 4,
|
|
"monthly": 3
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "linkwarden-backup",
|
|
"repo": "hidrive-backup",
|
|
"paths": [
|
|
"/volumes/linkwarden_data",
|
|
"/volumes/linkwarden_meili_data"
|
|
],
|
|
"schedule": {
|
|
"cron": "0 7 * * *"
|
|
},
|
|
"retention": {
|
|
"policyTimeBucketed": {
|
|
"daily": 7,
|
|
"weekly": 4,
|
|
"monthly": 6
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "letsencrypt-backup",
|
|
"repo": "hidrive-backup",
|
|
"paths": ["/volumes/letsencrypt_data"],
|
|
"schedule": {
|
|
"cron": "0 8 * * *"
|
|
},
|
|
"retention": {
|
|
"policyTimeBucketed": {
|
|
"daily": 7,
|
|
"weekly": 4,
|
|
"monthly": 12,
|
|
"yearly": 3
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "vaultwarden-backup",
|
|
"repo": "hidrive-backup",
|
|
"paths": ["/volumes/vaultwarden_data"],
|
|
"schedule": {
|
|
"cron": "0 8 * * *"
|
|
},
|
|
"retention": {
|
|
"policyTimeBucketed": {
|
|
"daily": 7,
|
|
"weekly": 4,
|
|
"monthly": 12,
|
|
"yearly": 3
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|