chore: updates to backup 72612333
Steve Simkins · 2026-05-10 23:14 5 file(s) · +37 −3
apps/backup/.env.example +4 −0
11 11
# CELLAR_VOLUME=cellar_cellar-data
12 12
# POSTS_VOLUME=posts_posts-data
13 13
# FEEDS_VOLUME=feeds_feeds-data
14 +
# LIBRARY_VOLUME=library_library-data
15 +
# BOOKMARKS_VOLUME=bookmarks_bookmarks-data
16 +
# PARCELS_VOLUME=parcels_parcels_data
17 +
# EASEL_VOLUME=easel_easel-data
14 18
15 19
# Optional: days to keep backups (default: 30)
16 20
# RETENTION_DAYS=30
apps/backup/README.md +13 −1
1 1
# Backup
2 2
3 -
Automated SQLite backups for Jotts, Sipp, Cellar, Posts, and Feeds to Cloudflare R2. Runs every 6 hours via cron inside a Docker container and prunes backups older than 30 days.
3 +
Automated SQLite backups for Jotts, Sipp, Cellar, Posts, Feeds, Library, Bookmarks, Parcels, and Easel to Cloudflare R2. Runs every 6 hours via cron inside a Docker container and prunes backups older than 30 days.
4 4
5 5
## Setup
6 6
46 46
CELLAR_VOLUME=cellar_cellar-data
47 47
POSTS_VOLUME=posts_posts-data
48 48
FEEDS_VOLUME=feeds_feeds-data
49 +
LIBRARY_VOLUME=library_library-data
50 +
BOOKMARKS_VOLUME=bookmarks_bookmarks-data
51 +
PARCELS_VOLUME=parcels_parcels_data
52 +
EASEL_VOLUME=easel_easel-data
49 53
```
50 54
51 55
Run `docker volume ls` to check the actual names on your host.
85 89
  -v cellar_cellar-data:/data/cellar:ro \
86 90
  -v posts_posts-data:/data/posts:ro \
87 91
  -v feeds_feeds-data:/data/feeds:ro \
92 +
  -v library_library-data:/data/library:ro \
93 +
  -v bookmarks_bookmarks-data:/data/bookmarks:ro \
94 +
  -v parcels_parcels_data:/data/parcels:ro \
95 +
  -v easel_easel-data:/data/easel:ro \
88 96
  ghcr.io/stevedylandev/andromeda-backup:latest
89 97
```
90 98
154 162
| `CELLAR_VOLUME` | `cellar_cellar-data` | Docker volume name for Cellar data |
155 163
| `POSTS_VOLUME` | `posts_posts-data` | Docker volume name for Posts data |
156 164
| `FEEDS_VOLUME` | `feeds_feeds-data` | Docker volume name for Feeds data |
165 +
| `LIBRARY_VOLUME` | `library_library-data` | Docker volume name for Library data |
166 +
| `BOOKMARKS_VOLUME` | `bookmarks_bookmarks-data` | Docker volume name for Bookmarks data |
167 +
| `PARCELS_VOLUME` | `parcels_parcels_data` | Docker volume name for Parcels data |
168 +
| `EASEL_VOLUME` | `easel_easel-data` | Docker volume name for Easel data |
apps/backup/backup.sh +2 −2
5 5
BUCKET="${R2_BUCKET:-andromeda-backups}"
6 6
RETENTION_DAYS="${RETENTION_DAYS:-30}"
7 7
8 -
DBS="jotts:/data/jotts/jotts.sqlite sipp:/data/sipp/sipp.sqlite cellar:/data/cellar/cellar.sqlite posts:/data/posts/posts.sqlite feeds:/data/feeds/feeds.sqlite library:/data/library/library.sqlite"
8 +
DBS="jotts:/data/jotts/jotts.sqlite sipp:/data/sipp/sipp.sqlite cellar:/data/cellar/cellar.sqlite posts:/data/posts/posts.sqlite feeds:/data/feeds/feeds.sqlite library:/data/library/library.sqlite bookmarks:/data/bookmarks/bookmarks.sqlite parcels:/data/parcels/parcels.db easel:/data/easel/easel.sqlite"
9 9
10 10
for entry in $DBS; do
11 11
  name="${entry%%:*}"
28 28
29 29
# Prune old backups
30 30
cutoff=$(date -u -d "-${RETENTION_DAYS} days" +%Y-%m-%d 2>/dev/null || date -u -v-${RETENTION_DAYS}d +%Y-%m-%d)
31 -
for name in jotts sipp cellar posts feeds library; do
31 +
for name in jotts sipp cellar posts feeds library bookmarks parcels easel; do
32 32
  aws s3 ls "s3://${BUCKET}/${name}/" --endpoint-url "${R2_ENDPOINT}" 2>/dev/null | while read -r line; do
33 33
    filedate=$(echo "$line" | awk '{print $1}')
34 34
    filename=$(echo "$line" | awk '{print $4}')
apps/backup/docker-compose.yml +12 −0
8 8
      - posts-data:/data/posts:ro
9 9
      - feeds-data:/data/feeds:ro
10 10
      - library-data:/data/library:ro
11 +
      - bookmarks-data:/data/bookmarks:ro
12 +
      - parcels-data:/data/parcels:ro
13 +
      - easel-data:/data/easel:ro
11 14
    env_file: .env
12 15
    restart: unless-stopped
13 16
30 33
  library-data:
31 34
    external: true
32 35
    name: ${LIBRARY_VOLUME:-library_library-data}
36 +
  bookmarks-data:
37 +
    external: true
38 +
    name: ${BOOKMARKS_VOLUME:-bookmarks_bookmarks-data}
39 +
  parcels-data:
40 +
    external: true
41 +
    name: ${PARCELS_VOLUME:-parcels_parcels_data}
42 +
  easel-data:
43 +
    external: true
44 +
    name: ${EASEL_VOLUME:-easel_easel-data}
docker-compose.yml +6 −0
101 101
      - jotts_data:/data/jotts:ro
102 102
      - sipp_data:/data/sipp:ro
103 103
      - cellar_data:/data/cellar:ro
104 +
      - posts_data:/data/posts:ro
105 +
      - feeds_data:/data/feeds:ro
104 106
      - library_data:/data/library:ro
105 107
      - bookmarks_data:/data/bookmarks:ro
108 +
      - parcels_data:/data/parcels:ro
106 109
      - easel_data:/data/easel:ro
107 110
    env_file: apps/backup/.env
108 111
    restart: unless-stopped
132 135
  bookmarks_data:
133 136
    external: true
134 137
    name: bookmarks_bookmarks-data
138 +
  parcels_data:
139 +
    external: true
140 +
    name: parcels_parcels_data
135 141
  easel_data:
136 142
    external: true
137 143
    name: easel_easel-data