chore: updates to backup
72612333
5 file(s) · +37 −3
| 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 |
| 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 | |
|
| 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}') |
|
| 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} |
|
| 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 |
|