Task 60 — Postgres backups: - deploy/backups/: backup.sh (pg_dump -Fc nightly), retain.sh (14/8/6 tiers), restore.sh, entrypoint.sh, crontab - famapp-backup Alpine service + backups volume added to deploy/compose.yaml - Restore procedure in deploy/backups/README.md Task 61 — Rate limiting on share links: - src/lib/rate-limit.ts: Edge-compatible sliding-window counter (50/min, LRU eviction) with consume(), isRateLimited(), recordFailure() exports - middleware.ts: enforces 429 with Retry-After: 60 for /s/[token] (IP + token prefix) - /s/[token]/page.tsx: tracks only failed resolveShareToken calls via recordFailure() Task 62 — Structured logging: - pino + pino-pretty installed; serverExternalPackages added to next.config.ts - src/lib/logger.ts: JSON in production, pretty in dev, level from LOG_LEVEL env - middleware.ts: structured JSON request log (method, path, status, ms, authenticated) - _core/push.ts, notify.ts, reminders.ts: console.error/log → logger.error/info Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
22 lines
736 B
Bash
22 lines
736 B
Bash
#!/bin/sh
|
|
# Container entrypoint: install postgresql-client, create backup directories,
|
|
# install crontab, and start crond.
|
|
set -eu
|
|
|
|
apk add --no-cache postgresql-client >/dev/null
|
|
|
|
mkdir -p \
|
|
/backups/famapp/daily /backups/famapp/weekly /backups/famapp/monthly \
|
|
/backups/authentik/daily /backups/authentik/weekly /backups/authentik/monthly
|
|
|
|
# Make scripts executable (volume mount may strip +x).
|
|
chmod +x /scripts/backup.sh /scripts/retain.sh /scripts/restore.sh
|
|
|
|
# Install root crontab from the mounted file.
|
|
mkdir -p /var/spool/cron/crontabs
|
|
cp /scripts/crontab /var/spool/cron/crontabs/root
|
|
chmod 600 /var/spool/cron/crontabs/root
|
|
|
|
echo "[entrypoint] backup service started — first run at 02:00"
|
|
exec crond -f -l 2
|