Chunked backup server with TOTP/passkey admin login and manual TOTP setup support
387
Chunked backup server with admin panel, restore workflow, TOTP or passkey login, and optional VictoriaLogs.
/admin/clientmkdir -p backupvault
cd backupvault
mkdir -p data/backups data/tmp data/victoria-logs
.env AutomaticallyCopy and run this block. It creates a ready-to-edit .env with strong random values:
CLIENT_TOKEN=$(openssl rand -hex 24)
ADMIN_PASSWORD=$(openssl rand -base64 18 | tr -d '=+/' | cut -c1-20)
SESSION_COOKIE_KEY=$(openssl rand -hex 32)
cat > .env <<EOF
APP_PORT=8080
SERVICE_NAME=backupvault
BACKUP_ROOT=/data/backups
TEMP_ROOT=/data/tmp
HOST_BACKUP_ROOT=./data/backups
HOST_TEMP_ROOT=./data/tmp
CLIENT_TOKENS=pc-biuro1:${CLIENT_TOKEN}
WEB_CLIENT_DEFAULT_TOKEN=${CLIENT_TOKEN}
ADMIN_USERNAME=admin
ADMIN_PASSWORD=${ADMIN_PASSWORD}
ADMIN_TOTP_SECRET=
SESSION_COOKIE_KEY=${SESSION_COOKIE_KEY}
ADMIN_SESSION_TTL_MINUTES=480
MAX_CHUNK_BYTES=67108864
PUBLIC_BASE_URL=https://backup.example.com
VICTORIA_LOGS_URL=http://victoria-logs:9428/insert/jsonline?_stream_fields=service,level,event
VICTORIA_LOGS_UI_URL=http://localhost:9428/select/vmui/
VICTORIA_LOGS_PORT=9428
HOST_VICTORIA_LOGS_ROOT=./data/victoria-logs
EOF
echo
echo "Created .env"
echo "Admin username: admin"
echo "Admin password: ${ADMIN_PASSWORD}"
echo "Client token: ${CLIENT_TOKEN}"
Notes:
ADMIN_TOTP_SECRET may stay empty.PUBLIC_BASE_URL before production deployment.docker-compose.ymlCopy this file as-is:
services:
backupvault:
image: marekotulakowski/backupvault:latest
container_name: backupvault
user: "10001:10001"
read_only: true
tmpfs:
- /tmp
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
ports:
- "${APP_PORT:-8080}:8080"
environment:
SERVICE_NAME: "${SERVICE_NAME:-backupvault}"
LISTEN_ADDR: ":8080"
BACKUP_ROOT: "${BACKUP_ROOT:-/data/backups}"
TEMP_ROOT: "${TEMP_ROOT:-/data/tmp}"
MAX_CHUNK_BYTES: "${MAX_CHUNK_BYTES:-67108864}"
CLIENT_TOKENS: "${CLIENT_TOKENS}"
ADMIN_USERNAME: "${ADMIN_USERNAME:-admin}"
ADMIN_PASSWORD: "${ADMIN_PASSWORD}"
ADMIN_TOTP_SECRET: "${ADMIN_TOTP_SECRET:-}"
ADMIN_SESSION_TTL_MINUTES: "${ADMIN_SESSION_TTL_MINUTES:-480}"
SESSION_COOKIE_KEY: "${SESSION_COOKIE_KEY}"
PUBLIC_BASE_URL: "${PUBLIC_BASE_URL}"
WEB_CLIENT_DEFAULT_TOKEN: "${WEB_CLIENT_DEFAULT_TOKEN:-}"
VICTORIA_LOGS_URL: "${VICTORIA_LOGS_URL:-}"
VICTORIA_LOGS_UI_URL: "${VICTORIA_LOGS_UI_URL:-}"
volumes:
- "${HOST_BACKUP_ROOT:-./data/backups}:${BACKUP_ROOT:-/data/backups}"
- "${HOST_TEMP_ROOT:-./data/tmp}:${TEMP_ROOT:-/data/tmp}"
restart: unless-stopped
victoria-logs:
image: victoriametrics/victoria-logs:v1.50.0
container_name: victoria-logs
profiles: ["victorialogs"]
read_only: true
tmpfs:
- /tmp
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
command:
- "-storageDataPath=/victoria-logs-data"
ports:
- "${VICTORIA_LOGS_PORT:-9428}:9428"
volumes:
- "${HOST_VICTORIA_LOGS_ROOT:-./data/victoria-logs}:/victoria-logs-data"
restart: unless-stopped
docker compose --profile victorialogs up -d
http://localhost:8080/adminhttp://localhost:8080/clienthttp://localhost:9428/select/vmui/Login to /admin with:
adminADMIN_PASSWORD from .envOn the first login, BackupVault redirects to the 2FA setup screen.
That screen shows:
Add passkey button for biometric or hardware-key registrationIf you do not want to scan the QR code, enter the secret manually into Google Authenticator, 1Password, Aegis, or another TOTP app using:
adminbackupvaultTOTP630sAfter setup, daily login uses:
The TOTP page also supports remembering the current browser for 30 days after successful verification.
Do not expose /admin publicly without TLS and access restriction.
Example Nginx config:
server {
listen 443 ssl http2;
server_name backup.example.com;
ssl_certificate /etc/letsencrypt/live/backup.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/backup.example.com/privkey.pem;
client_max_body_size 0;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
location /admin {
allow 10.0.0.0/8;
allow 192.168.0.0/16;
deny all;
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}
target_path anymore.http://localhost:8080/healthz/adminContent type
Image
Digest
sha256:d473b6b62…
Size
19.5 MB
Last updated
5 months ago
docker pull marekotulakowski/backupvault