Compare commits

..

No commits in common. "46740740db49fe593adb30c11ec91f930d2821bf" and "9327335fb8e015f2337e1848eaa61a76e782862e" have entirely different histories.

2 changed files with 140 additions and 307 deletions

View file

@ -2,7 +2,7 @@
title: Pocket Grimoire title: Pocket Grimoire
description: description:
published: true published: true
date: 2026-02-21T06:10:17.060Z date: 2026-02-21T04:25:58.904Z
tags: tags:
editor: markdown editor: markdown
dateCreated: 2026-02-20T04:41:35.122Z dateCreated: 2026-02-20T04:41:35.122Z
@ -44,29 +44,14 @@ Pocket Grimoire is a portable companion to the Netgrimoire homelab, providing of
### Storage (3 SSDs, 2 Active at a Time) ### Storage (3 SSDs, 2 Active at a Time)
- **SSD #1 VAULT** (1-2TB, encrypted, always connected) - **SSD #1 VAULT** (1-2TB, encrypted, always connected)
- Git repository mirrors (from Forgejo) - Wiki.js data, PostgreSQL, git repos, photos, documents, backups
- Wiki.js content backups - **SSD #2 MEDIA-PERSONAL** (2TB+, encrypted)
- Kopia repository (backup data) - Your curated H.264/AAC movies and TV shows
- Photos and documents - Connected for personal trips
- System backups and configs - **SSD #3 MEDIA-FAMILY** (2TB+, unencrypted)
- SSH keys
- VeraCrypt containers (optional)
- **Does NOT contain media or Stash data**
- **SSD #2 GREEN** (2TB+, encrypted, for personal trips)
- Personal media library (H.264/AAC movies and TV)
- Stash-Pocket data (database, previews, blobs)
- Personal content organized under `/Green/` structure
- Connected during personal/solo trips
- Syncs from `/export/vault/Green/` on Netgrimoire
- **SSD #3 MEDIA-FAMILY** (2TB+, unencrypted, for family trips)
- Family-friendly movies and TV shows (H.264/AAC) - Family-friendly movies and TV shows (H.264/AAC)
- Simple `/library/movies/` and `/library/tv/` structure - Connected for family visits
- Connected during family visits/trips - Shareable/portable to other devices without Pocket Grimoire
- Unencrypted for easy sharing with relatives
- Can be used on other devices without Pocket Grimoire
- **USB drive ISO/Rebuild** (64GB+, labeled, write-protected) - **USB drive ISO/Rebuild** (64GB+, labeled, write-protected)
- **USB drive Data Transfer** (128GB+, labeled) - **USB drive Data Transfer** (128GB+, labeled)
@ -252,7 +237,7 @@ Headroom: 78W
## Directory Structure ## Directory Structure
``` ```
/srv/pocket-grimoire/ # Main application root (on VAULT SSD) /srv/pocket-grimoire/ # Main application root (on Vault SSD)
├── stacks/ # Docker Compose files ├── stacks/ # Docker Compose files
│ ├── wikijs/ │ ├── wikijs/
│ │ ├── docker-compose.yml │ │ ├── docker-compose.yml
@ -260,9 +245,6 @@ Headroom: 78W
│ ├── jellyfin/ │ ├── jellyfin/
│ │ ├── docker-compose.yml │ │ ├── docker-compose.yml
│ │ └── .env │ │ └── .env
│ ├── stash/
│ │ ├── docker-compose.yml
│ │ └── .env
│ └── filebrowser/ # Optional │ └── filebrowser/ # Optional
│ └── docker-compose.yml │ └── docker-compose.yml
├── data/ # Persistent container data ├── data/ # Persistent container data
@ -276,38 +258,23 @@ Headroom: 78W
├── forgejo_wiki_ro # Read-only wiki deploy key ├── forgejo_wiki_ro # Read-only wiki deploy key
└── zfs_pull_ro # ZFS replication key └── zfs_pull_ro # ZFS replication key
/srv/vaultpg/ # VAULT SSD (always connected) /srv/vaultpg/ # Vault SSD ZFS mount
├── kopia/ # Kopia backup repository ├── veracrypt-containers/ # VeraCrypt container files (optional)
├── backups/ # System backups │ └── vault.vc # Encrypted container
│ ├── wiki/ # Wiki.js backups └── (other mirrors from Netgrimoire)
│ ├── photos/ # Photo backups
│ └── documents/ # Document backups
├── repos/ # Git repository mirrors
└── veracrypt-containers/ # VeraCrypt containers (optional)
└── vault.vc
/srv/greenpg/ # GREEN SSD (personal, rotated)
├── media/library/ # Personal media files
│ ├── movies/
│ └── tv/
└── stash/ # Stash-Pocket data
├── config/ # Stash database
├── generated/ # Previews
└── blobs/ # Scene markers
/srv/mediapg/ # MEDIA-FAMILY SSD (family, rotated)
└── library/ # Family media files
├── movies/
└── tv/
/mnt/veracrypt/ # VeraCrypt mount points (optional) /mnt/veracrypt/ # VeraCrypt mount points (optional)
├── vault1/ # Mounted container 1 ├── vault1/ # Mounted container 1
└── vault2/ # Mounted container 2 (if needed) └── vault2/ # Mounted container 2 (if needed)
/srv/mediapg/ # Media SSD ZFS mount (rotated)
└── library/ # H.264 encoded media
├── movies/
└── tv/
/usr/local/sbin/ # System scripts /usr/local/sbin/ # System scripts
├── pocketgrimoire-sync.sh # Main sync script ├── pocketgrimoire-sync.sh # Main sync script
├── pocketgrimoire-zfs-pull.sh # ZFS replication script ├── pocketgrimoire-zfs-pull.sh # ZFS replication script
├── unlock-pocket-grimoire.sh # Headless unlock script
└── mount-veracrypt-vault.sh # VeraCrypt mount script (optional) └── mount-veracrypt-vault.sh # VeraCrypt mount script (optional)
/etc/ # Config files /etc/ # Config files
@ -545,28 +512,11 @@ This approach allows you to:
- Verify data integrity before moving drives - Verify data integrity before moving drives
- Test encryption/unlock on powerful hardware first - Test encryption/unlock on powerful hardware first
#### Drive Configuration Overview
**Drive #1: VAULT** (1-2TB, encrypted, always connected)
- Purpose: Backups and system data ONLY
- Contains: Git repos, Wiki backups, Kopia repository, photos, documents
- Does NOT contain media or Stash data
**Drive #2: GREEN** (2TB+, encrypted, rotated for personal trips)
- Purpose: Personal media and Stash-Pocket data
- Contains: Personal media library, Stash database/previews/blobs
- Syncs from `/export/vault/Green/` on Netgrimoire
**Drive #3: MEDIA-FAMILY** (2TB+, unencrypted, rotated for family trips)
- Purpose: Family-friendly shareable content
- Contains: Simple library structure with movies and TV
- Unencrypted for easy sharing with relatives
#### On Netgrimoire: Create and Populate Drives #### On Netgrimoire: Create and Populate Drives
**Connect drives to Netgrimoire:** **Connect drives to Netgrimoire:**
- VAULT SSD (1-2TB) via USB 3.0 or SATA - VAULT SSD (1-2TB) via USB 3.0 or SATA
- GREEN SSD (2TB+) via USB 3.0 or SATA - MEDIA-PERSONAL SSD (2TB+) via USB 3.0 or SATA
- MEDIA-FAMILY SSD (2TB+) via USB 3.0 or SATA (optional, can be created later) - MEDIA-FAMILY SSD (2TB+) via USB 3.0 or SATA (optional, can be created later)
**Identify drives:** **Identify drives:**
@ -576,7 +526,7 @@ lsblk
# Note device names: /dev/sdX, /dev/sdY, /dev/sdZ # Note device names: /dev/sdX, /dev/sdY, /dev/sdZ
``` ```
**Create VAULT pool (encrypted - backups only):** **Create VAULT pool (encrypted):**
```bash ```bash
# On Netgrimoire # On Netgrimoire
sudo zpool create -o ashift=12 \ sudo zpool create -o ashift=12 \
@ -592,21 +542,21 @@ sudo zpool create -o ashift=12 \
# Enter STRONG passphrase when prompted # Enter STRONG passphrase when prompted
# Write down this passphrase - you'll need it on Pocket Grimoire # Write down this passphrase - you'll need it on Pocket Grimoire
# Create datasets for backups and system data # Create datasets matching Pocket structure
sudo zfs create -o recordsize=16K pocket-vault/wiki-pg # PostgreSQL backups sudo zfs create -o recordsize=16K pocket-vault/wiki-pg
sudo zfs create pocket-vault/repos # Git repository mirrors sudo zfs create pocket-vault/repos
sudo zfs create pocket-vault/kopia # Kopia backup repository sudo zfs create pocket-vault/pocket-grimoire
sudo zfs create pocket-vault/backups # General backups sudo zfs create pocket-vault/Green
sudo zfs create pocket-vault/backups/wiki # Wiki.js backups sudo zfs create pocket-vault/Green/Pocket
sudo zfs create pocket-vault/backups/photos # Photo backups sudo zfs create pocket-vault/Green/Pocket/stash
sudo zfs create pocket-vault/backups/documents # Document backups sudo zfs create pocket-vault/Green/Pocket/media
sudo zfs create pocket-vault/veracrypt-containers # VeraCrypt (optional) sudo zfs create pocket-vault/veracrypt-containers
# Set ownership # Set ownership
sudo chown -R 1000:1000 /mnt/pocket-vault sudo chown -R 1000:1000 /mnt/pocket-vault
``` ```
**Create GREEN pool (encrypted - personal media + Stash):** **Create MEDIA-PERSONAL pool (encrypted):**
```bash ```bash
# On Netgrimoire # On Netgrimoire
sudo zpool create -o ashift=12 \ sudo zpool create -o ashift=12 \
@ -616,120 +566,78 @@ sudo zpool create -o ashift=12 \
-O compression=lz4 \ -O compression=lz4 \
-O atime=off \ -O atime=off \
-O recordsize=1M \ -O recordsize=1M \
-m /mnt/pocket-green \ -m /mnt/pocket-media-personal \
pocket-green /dev/sdY pocket-media-personal /dev/sdY
# Enter STRONG passphrase (can be different from VAULT) # Enter STRONG passphrase (can be different from VAULT)
# Write down this passphrase # Write down this passphrase
# Create datasets matching Netgrimoire structure # Create datasets
sudo zfs create pocket-green/media # Media library root sudo zfs create pocket-media-personal/library
sudo zfs create pocket-green/media/library # Library directory sudo zfs create pocket-media-personal/library/movies
sudo zfs create pocket-green/media/library/movies # Movies sudo zfs create pocket-media-personal/library/tv
sudo zfs create pocket-green/media/library/tv # TV shows
sudo zfs create pocket-green/stash # Stash-Pocket data
sudo zfs create pocket-green/stash/config # Stash database
sudo zfs create pocket-green/stash/generated # Previews
sudo zfs create pocket-green/stash/blobs # Scene markers
sudo zfs create pocket-green/stash/cache # Cache (don't sync)
# Set ownership # Set ownership
sudo chown -R 1000:1000 /mnt/pocket-green sudo chown -R 1000:1000 /mnt/pocket-media-personal
``` ```
**Create MEDIA-FAMILY pool (unencrypted - family content):** **Create MEDIA-FAMILY pool (unencrypted, optional now or later):**
```bash ```bash
# On Netgrimoire # On Netgrimoire
sudo zpool create -o ashift=12 \ sudo zpool create -o ashift=12 \
-O compression=lz4 \ -O compression=lz4 \
-O atime=off \ -O atime=off \
-O recordsize=1M \ -O recordsize=1M \
-m /mnt/pocket-media \ -m /mnt/pocket-media-family \
pocket-media /dev/sdZ pocket-media-family /dev/sdZ
# No encryption - family can use this drive on any system # No encryption - family can use this drive on any system
# Create simple library structure # Create datasets
sudo zfs create pocket-media/library sudo zfs create pocket-media-family/library
sudo zfs create pocket-media/library/movies sudo zfs create pocket-media-family/library/movies
sudo zfs create pocket-media/library/tv sudo zfs create pocket-media-family/library/tv
# Set ownership # Set ownership
sudo chown -R 1000:1000 /mnt/pocket-media sudo chown -R 1000:1000 /mnt/pocket-media-family
``` ```
**Perform initial sync to VAULT:** **Perform initial sync to VAULT:**
```bash ```bash
# On Netgrimoire # On Netgrimoire
# Sync backups and system data to VAULT drive # Sync data from Netgrimoire to Pocket VAULT drive
# Sync Wiki backups # Sync Pocket directory structure
sudo rsync -avP \
/export/vault/wiki-backups/ \
/mnt/pocket-vault/backups/wiki/
# Sync Git repositories
sudo rsync -avP \
/export/vault/repos/ \
/mnt/pocket-vault/repos/
# Sync Kopia repository (if exists)
sudo rsync -avP \
/export/vault/kopia/ \
/mnt/pocket-vault/kopia/
# Sync photos and documents
sudo rsync -avP \
/export/vault/photos/ \
/mnt/pocket-vault/backups/photos/
sudo rsync -avP \
/export/vault/documents/ \
/mnt/pocket-vault/backups/documents/
# Verify data
ls -lh /mnt/pocket-vault/
du -sh /mnt/pocket-vault/
```
**Perform initial sync to GREEN:**
```bash
# On Netgrimoire
# Sync personal media and Stash data from /export/vault/Green/
# Sync entire Green directory structure
sudo rsync -avP --exclude='cache' \ sudo rsync -avP --exclude='cache' \
/export/vault/Green/ \ /export/vault/Green/Pocket/ \
/mnt/pocket-green/ /mnt/pocket-vault/Green/Pocket/
# Or use ZFS send/receive for atomic snapshot (if Green is a ZFS dataset) # Or use ZFS send/receive for atomic snapshot
sudo zfs snapshot vault/Green@initial sudo zfs snapshot vault/Green/Pocket@initial
sudo zfs send vault/Green@initial | \ sudo zfs send vault/Green/Pocket@initial | \
sudo zfs receive pocket-green/Green sudo zfs receive pocket-vault/Green/Pocket
# Verify data # Verify data
ls -lh /mnt/pocket-green/ ls -lh /mnt/pocket-vault/Green/Pocket/
ls -lh /mnt/pocket-green/media/library/ du -sh /mnt/pocket-vault/Green/Pocket/
ls -lh /mnt/pocket-green/stash/
du -sh /mnt/pocket-green/
``` ```
**Populate MEDIA-FAMILY (optional - curate family content):** **Populate MEDIA-PERSONAL (optional - curate content):**
```bash ```bash
# On Netgrimoire # On Netgrimoire
# Copy family-friendly media to MEDIA-FAMILY drive # Copy curated personal media to Pocket media drive
# Example: Copy family movies # Example: Copy favorite movies
sudo cp /export/vault/media/family-movies/*.mp4 \ sudo cp /export/vault/media/library/movies/favorites/*.mp4 \
/mnt/pocket-media/library/movies/ /mnt/pocket-media-personal/library/movies/
# Or use rsync for large transfers # Or use rsync for large transfers
sudo rsync -avP \ sudo rsync -avP \
/export/vault/media/family-shows/ \ /export/vault/media/library/tv/FavoriteShow/ \
/mnt/pocket-media/library/tv/ /mnt/pocket-media-personal/library/tv/FavoriteShow/
# Verify # Verify
du -sh /mnt/pocket-media/library/ du -sh /mnt/pocket-media-personal/library/
``` ```
**Export pools before disconnecting:** **Export pools before disconnecting:**
@ -738,8 +646,8 @@ du -sh /mnt/pocket-media/library/
# CRITICAL: Export pools before physically disconnecting drives # CRITICAL: Export pools before physically disconnecting drives
sudo zpool export pocket-vault sudo zpool export pocket-vault
sudo zpool export pocket-green sudo zpool export pocket-media-personal
sudo zpool export pocket-media # if created sudo zpool export pocket-media-family # if created
# Verify exported # Verify exported
zpool list zpool list
@ -751,10 +659,8 @@ zpool list
### 5. Configure ZFS Pools on Pocket Grimoire ### 5. Configure ZFS Pools on Pocket Grimoire
**Now connect drives to Pocket Grimoire:** **Now connect drives to Pocket Grimoire:**
- VAULT → Anker USB-A port #2 (always connected) - VAULT → Anker USB-A port #2
- GREEN (for personal trips) → Raspberry Pi USB 3.0 port - MEDIA-PERSONAL or MEDIA-FAMILY → Raspberry Pi USB 3.0 port
OR
- MEDIA-FAMILY (for family trips) → Raspberry Pi USB 3.0 port
**Import and rename pools:** **Import and rename pools:**
```bash ```bash
@ -764,29 +670,25 @@ ssh user@pocket-grimoire.local
# Import VAULT pool with new name # Import VAULT pool with new name
sudo zpool import pocket-vault vaultpg sudo zpool import pocket-vault vaultpg
# Import GREEN pool with new name (for personal trips) # Import MEDIA pool with new name
sudo zpool import pocket-green greenpg sudo zpool import pocket-media-personal mediapg
# Or:
# OR import MEDIA-FAMILY pool (for family trips) # sudo zpool import pocket-media-family mediapg
# sudo zpool import pocket-media mediapg
# Verify pools imported # Verify pools imported
zpool list zpool list
# Should show: vaultpg, greenpg (or mediapg for family) # Should show: vaultpg, mediapg
``` ```
**Set mount points for Pocket Grimoire:** **Set mount points for Pocket Grimoire:**
```bash ```bash
# Set proper mount points # Set proper mount points
sudo zfs set mountpoint=/srv/vaultpg vaultpg sudo zfs set mountpoint=/srv/vaultpg vaultpg
sudo zfs set mountpoint=/srv/greenpg greenpg sudo zfs set mountpoint=/srv/mediapg mediapg
# Or for family drive:
# sudo zfs set mountpoint=/srv/mediapg mediapg
# Create mount points # Create mount points
sudo mkdir -p /srv/vaultpg sudo mkdir -p /srv/vaultpg
sudo mkdir -p /srv/greenpg sudo mkdir -p /srv/mediapg
sudo mkdir -p /srv/mediapg # Create both, use as needed
# Unmount and remount with new paths # Unmount and remount with new paths
sudo zfs unmount -a sudo zfs unmount -a
@ -796,14 +698,11 @@ sudo zfs mount -a
df -h | grep srv df -h | grep srv
# Should show: # Should show:
# vaultpg mounted on /srv/vaultpg # vaultpg mounted on /srv/vaultpg
# greenpg mounted on /srv/greenpg (or mediapg on /srv/mediapg) # mediapg mounted on /srv/mediapg
# Verify data # Verify data
ls /srv/vaultpg/ ls /srv/vaultpg/Green/Pocket/
ls /srv/greenpg/media/library/ ls /srv/mediapg/library/
ls /srv/greenpg/stash/
# Or for family:
# ls /srv/mediapg/library/
``` ```
**Configure for headless unlock:** **Configure for headless unlock:**
@ -812,8 +711,7 @@ ls /srv/greenpg/stash/
# This prevents boot hanging waiting for passphrase # This prevents boot hanging waiting for passphrase
sudo zfs set canmount=noauto vaultpg sudo zfs set canmount=noauto vaultpg
sudo zfs set canmount=noauto greenpg sudo zfs set canmount=noauto mediapg
sudo zfs set canmount=noauto mediapg # For when you swap to family drive
# Pools will need manual unlock via SSH after boot # Pools will need manual unlock via SSH after boot
``` ```
@ -850,9 +748,9 @@ echo " Pocket Grimoire ZFS Unlock (Headless)"
echo "==========================================" echo "=========================================="
echo echo
# Check if VAULT pool is already unlocked # Check if pools are already unlocked
if zfs list vaultpg &>/dev/null && mount | grep -q /srv/vaultpg; then if zfs list vaultpg &>/dev/null && mount | grep -q /srv/vaultpg; then
echo "✓ vaultpg (VAULT) already unlocked and mounted" echo "✓ vaultpg already unlocked and mounted"
else else
# Import pool if needed # Import pool if needed
if ! zpool list vaultpg &>/dev/null; then if ! zpool list vaultpg &>/dev/null; then
@ -860,8 +758,8 @@ else
sudo zpool import vaultpg sudo zpool import vaultpg
fi fi
# Unlock VAULT pool # Unlock Vault pool
echo "Unlocking vaultpg (VAULT - backups and system data)..." echo "Unlocking vaultpg (VAULT SSD)..."
sudo zfs load-key vaultpg sudo zfs load-key vaultpg
# Mount all vaultpg datasets # Mount all vaultpg datasets
@ -878,37 +776,14 @@ fi
echo echo
# Check for GREEN pool (personal media + Stash) # Check if media pool is present and unlock
if zpool list greenpg &>/dev/null; then
if zfs list greenpg &>/dev/null && mount | grep -q /srv/greenpg; then
echo "✓ greenpg (GREEN - personal media + Stash) already unlocked"
else
echo "Unlocking greenpg (GREEN - personal media + Stash)..."
sudo zfs load-key greenpg
sudo zfs mount greenpg
sudo zfs mount -a
if mount | grep -q /srv/greenpg; then
echo "✓ greenpg unlocked and mounted at /srv/greenpg"
else
echo "✗ Failed to mount greenpg"
exit 1
fi
fi
else
echo " greenpg pool not found (GREEN drive not connected)"
fi
echo
# Check for MEDIA-FAMILY pool (family content)
if zpool list mediapg &>/dev/null; then if zpool list mediapg &>/dev/null; then
if zfs list mediapg &>/dev/null && mount | grep -q /srv/mediapg; then if zfs list mediapg &>/dev/null && mount | grep -q /srv/mediapg; then
echo "✓ mediapg (MEDIA-FAMILY) already unlocked" echo "✓ mediapg already unlocked and mounted"
else else
echo "Unlocking mediapg (MEDIA-FAMILY - family content)..." echo "Unlocking mediapg (MEDIA-PERSONAL or MEDIA-FAMILY)..."
# Check if encrypted (shouldn't be, but check anyway) # Check if encrypted (MEDIA-PERSONAL) or not (MEDIA-FAMILY)
if zfs get encryption mediapg | grep -q "encryption.*on"; then if zfs get encryption mediapg | grep -q "encryption.*on"; then
sudo zfs load-key mediapg sudo zfs load-key mediapg
fi fi
@ -924,7 +799,7 @@ if zpool list mediapg &>/dev/null; then
fi fi
fi fi
else else
echo " mediapg pool not found (MEDIA-FAMILY drive not connected)" echo " mediapg pool not found (media drive may not be connected)"
fi fi
echo echo
@ -974,17 +849,6 @@ echo "=========================================="
echo " Pocket Grimoire Ready!" echo " Pocket Grimoire Ready!"
echo "==========================================" echo "=========================================="
echo echo
echo "Drives mounted:"
if mount | grep -q /srv/vaultpg; then
echo " ✓ VAULT (vaultpg) at /srv/vaultpg"
fi
if mount | grep -q /srv/greenpg; then
echo " ✓ GREEN (greenpg) at /srv/greenpg - Personal media + Stash"
fi
if mount | grep -q /srv/mediapg; then
echo " ✓ MEDIA-FAMILY (mediapg) at /srv/mediapg - Family content"
fi
echo
echo "Services available at:" echo "Services available at:"
echo " Wiki.js: http://pocket-grimoire.local:3000" echo " Wiki.js: http://pocket-grimoire.local:3000"
echo " Jellyfin: http://pocket-grimoire.local:8096" echo " Jellyfin: http://pocket-grimoire.local:8096"
@ -1081,21 +945,17 @@ ssh user@pocket-grimoire.local
# Import pools if needed # Import pools if needed
sudo zpool import vaultpg sudo zpool import vaultpg
sudo zpool import greenpg # For GREEN (personal) sudo zpool import mediapg
# Or:
# sudo zpool import mediapg # For MEDIA-FAMILY
# Load encryption keys # Load encryption keys
sudo zfs load-key vaultpg # VAULT (always encrypted) sudo zfs load-key vaultpg
sudo zfs load-key greenpg # GREEN (encrypted) sudo zfs load-key mediapg # Only if MEDIA-PERSONAL (encrypted)
# mediapg is unencrypted (MEDIA-FAMILY) - no key needed
# Mount all datasets # Mount all datasets
sudo zfs mount -a sudo zfs mount -a
# Verify mounted # Verify mounted
df -h | grep srv df -h | grep srv
# Should show vaultpg and either greenpg or mediapg
# Start Docker # Start Docker
sudo systemctl start docker sudo systemctl start docker
@ -1857,8 +1717,8 @@ sudo umount /mnt/pocket-media
### 8. Document Passphrases ### 8. Document Passphrases
- [ ] ZFS encryption passphrases (written down, secured) - [ ] ZFS encryption passphrases (written down, secured)
- VAULT (vaultpg): [write passphrase on paper] - VAULT (vaultpg): [write passphrase on paper]
- GREEN (greenpg): [write passphrase on paper] - MEDIA-PERSONAL (mediapg): [write passphrase on paper]
- MEDIA-FAMILY (mediapg): N/A (unencrypted) - MEDIA-FAMILY: N/A (unencrypted)
- [ ] VeraCrypt container passwords (if using, written down, secured) - [ ] VeraCrypt container passwords (if using, written down, secured)
- [ ] WiFi credentials for travel router (portapotty network) - [ ] WiFi credentials for travel router (portapotty network)
- [ ] Jellyfin admin password - [ ] Jellyfin admin password
@ -1882,9 +1742,8 @@ ssh user@pocket-grimoire.local
/usr/local/sbin/unlock-pocket-grimoire.sh /usr/local/sbin/unlock-pocket-grimoire.sh
# 5. Enter passphrases when prompted # 5. Enter passphrases when prompted
# - VAULT passphrase (always) # - VAULT passphrase
# - GREEN passphrase (if GREEN drive connected for personal trip) # - MEDIA-PERSONAL passphrase (if encrypted)
# - MEDIA-FAMILY has no passphrase (unencrypted)
# - VeraCrypt password (if applicable) # - VeraCrypt password (if applicable)
# 6. Wait for Docker containers to start (~30 seconds) # 6. Wait for Docker containers to start (~30 seconds)
@ -1906,26 +1765,20 @@ docker ps
### 10. Verify Data Synced from Netgrimoire ### 10. Verify Data Synced from Netgrimoire
```bash ```bash
# Check VAULT data present (backups only) # Check Vault data present
ls /srv/vaultpg/kopia/ ls /srv/vaultpg/Green/Pocket/stash/
ls /srv/vaultpg/backups/ ls /srv/vaultpg/Green/Pocket/media/
ls /srv/vaultpg/repos/ du -sh /srv/vaultpg/Green/Pocket/
du -sh /srv/vaultpg/
# Check GREEN data (personal media + Stash) # Check media drive populated (if applicable)
ls /srv/greenpg/media/library/
ls /srv/greenpg/stash/
du -sh /srv/greenpg/
# Or check MEDIA-FAMILY data (if that drive is connected)
ls /srv/mediapg/library/ ls /srv/mediapg/library/
du -sh /srv/mediapg/ du -sh /srv/mediapg/
# Verify Stash database and previews (only on GREEN) # Verify Stash database and previews
ls -lh /srv/greenpg/stash/config/ ls -lh /srv/vaultpg/Green/Pocket/stash/config/
# Should show: stash-go.sqlite # Should show: stash-go.sqlite
ls /srv/greenpg/stash/generated/ | wc -l ls /srv/vaultpg/Green/Pocket/stash/generated/ | wc -l
# Should show: hundreds of preview files # Should show: hundreds of preview files
``` ```
@ -2325,23 +2178,12 @@ veracrypt --text --list
# Unmount and export ZFS pools # Unmount and export ZFS pools
sudo zfs unmount -a sudo zfs unmount -a
# Export VAULT (always present)
sudo zpool export vaultpg sudo zpool export vaultpg
sudo zpool export mediapg
# Export GREEN (if connected for personal trip)
if zpool list greenpg &>/dev/null; then
sudo zpool export greenpg
fi
# Export MEDIA-FAMILY (if connected for family trip)
if zpool list mediapg &>/dev/null; then
sudo zpool export mediapg
fi
# Verify pools exported # Verify pools exported
zpool list zpool list
# Should NOT show vaultpg, greenpg, or mediapg # Should NOT show vaultpg or mediapg
# Shutdown Pi # Shutdown Pi
sudo shutdown -h now sudo shutdown -h now

View file

@ -2,7 +2,7 @@
title: Pocket Clips title: Pocket Clips
description: Integrating Stash description: Integrating Stash
published: true published: true
date: 2026-02-21T06:11:15.579Z date: 2026-02-20T12:54:12.016Z
tags: tags:
editor: markdown editor: markdown
dateCreated: 2026-02-20T04:48:11.191Z dateCreated: 2026-02-20T04:48:11.191Z
@ -18,20 +18,18 @@ dateCreated: 2026-02-20T04:48:11.191Z
This guide extends the Pocket Grimoire deployment to include Stash using a **two-instance architecture**: This guide extends the Pocket Grimoire deployment to include Stash using a **two-instance architecture**:
- **Stash-Main** on Netgrimoire watches your entire media library - **Stash-Main** on Netgrimoire watches your entire media library
- **Stash-Pocket** on Netgrimoire watches only curated personal content (GREEN drive) - **Stash-Pocket** on Netgrimoire watches only curated travel content
- **Stash-Pocket** replicates to Pocket Grimoire's GREEN drive for offline access - **Stash-Pocket** replicates to Pocket Grimoire for offline access
This approach provides: This approach provides:
- Full library management at home (Stash-Main) - Full library management at home (Stash-Main)
- Curated personal subset with independent database (Stash-Pocket) - Curated travel subset with independent database (Stash-Pocket)
- Automatic synchronization via existing ZFS replication to GREEN drive - Automatic synchronization via existing ZFS replication
- Read-only browsing on travel with all previews pre-generated - Read-only browsing on travel with all previews pre-generated
- Zero CPU load on travel Pi (no scanning/generation) - Zero CPU load on travel Pi (no scanning/generation)
**Key Principle:** All intensive operations happen on Netgrimoire. Pocket Grimoire just serves pre-generated content in read-only mode. **Key Principle:** All intensive operations happen on Netgrimoire. Pocket Grimoire just serves pre-generated content in read-only mode.
**Important:** Stash data lives on the GREEN drive (personal media), NOT on VAULT. VAULT is for backups only.
--- ---
## Architecture ## Architecture
@ -50,36 +48,30 @@ This approach provides:
│ └─ Does NOT sync to Pocket │ │ └─ Does NOT sync to Pocket │
│ │ │ │
│ Stash Instance #2: "Stash-Pocket" (Port 9998) │ │ Stash Instance #2: "Stash-Pocket" (Port 9998) │
│ ├─ Watches: ONLY Green/media (personal content) │ │ ├─ Watches: ONLY Pocket media │
│ ├─ Location: /export/vault/Green/ │ │ ├─ Location: /export/vault/Green/Pocket/ │
│ │ ├── media/library/ (personal media) │ │ │ ├── stash/config (database) │
│ │ └── stash/ (Stash-Pocket data) │ │ │ ├── stash/generated (previews) │
│ │ ├── config/ (database) │ │ │ ├── stash/blobs (markers) │
│ │ ├── generated/ (previews) │ │ │ └── media/library (curated content) │
│ │ └── blobs/ (markers) │ │ ├─ Database: 200MB-1GB (travel subset) │
│ ├─ Database: 200MB-1GB (personal subset) │ │ └─ SYNCS to Pocket via ZFS replication │
│ └─ SYNCS to Pocket GREEN drive via ZFS │
│ │ │ │
└─────────────────────────────────────────────────────┘ └─────────────────────────────────────────────────────┘
↓ ZFS Send ↓ ZFS Send
(Entire /export/vault/Green/ syncs to GREEN drive) (Entire /export/vault/Green/Pocket/ syncs)
┌─────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────┐
│ POCKET GRIMOIRE (Travel) │ │ POCKET GRIMOIRE (Travel) │
├─────────────────────────────────────────────────────┤ ├─────────────────────────────────────────────────────┤
│ │ │ │
│ GREEN Drive (greenpg pool): │
│ ├─ /srv/greenpg/media/library/ (media files) │
│ └─ /srv/greenpg/stash/ (Stash data) │
│ │
│ Stash Instance: "Stash-Pocket" (Port 9999) │ │ Stash Instance: "Stash-Pocket" (Port 9999) │
│ ├─ Watches: GREEN media only (read-only) │ │ ├─ Watches: Pocket media only (read-only) │
│ ├─ Location: /srv/greenpg/ │ │ ├─ Location: /srv/vaultpg/Green/Pocket/ │
│ │ ├── media/library/ (synced media) │ │ │ ├── stash/config (synced, read-only) │
│ │ └── stash/ (synced, read-only) │ │ │ ├── stash/generated (synced, read-only) │
│ │ ├── config/ (synced database) │ │ │ ├── stash/blobs (synced, read-only) │
│ │ ├── generated/ (synced previews) │ │ │ └── media/library (synced media files) │
│ │ └── blobs/ (synced markers) │
│ ├─ Same database as Netgrimoire Stash-Pocket │ │ ├─ Same database as Netgrimoire Stash-Pocket │
│ └─ Browse only - no scanning or generation │ │ └─ Browse only - no scanning or generation │
│ │ │ │
@ -99,18 +91,18 @@ This approach provides:
- Stays on Netgrimoire (doesn't sync to Pocket) - Stays on Netgrimoire (doesn't sync to Pocket)
✅ **Stash-Pocket (Port 9998 at home, 9999 on travel):** ✅ **Stash-Pocket (Port 9998 at home, 9999 on travel):**
- Manages only curated personal content (GREEN drive) - Manages only curated travel content
- Smaller database (faster, lighter) - Smaller database (faster, lighter)
- Independent from main library - Independent from main library
- Syncs to Pocket Grimoire's GREEN drive automatically - Syncs to Pocket Grimoire automatically
- Preview personal setup before trips - Preview travel setup before trips
✅ **Separation of Concerns:** ✅ **Separation of Concerns:**
- Main library can be massive (thousands of videos) - Main library can be massive (thousands of videos)
- Personal subset is manageable (hundreds of videos) - Travel subset is manageable (hundreds of videos)
- No confusion about what's available where - No confusion about what's available where
- Changes to main library don't affect travel copy - Changes to main library don't affect travel copy
- Faster sync times (only GREEN data replicates) - Faster sync times (only travel data replicates)
--- ---
@ -128,38 +120,37 @@ Blobs/markers: 5-20GB
Total: ~56-225GB (stays on Netgrimoire) Total: ~56-225GB (stays on Netgrimoire)
``` ```
**Stash-Pocket (DOES sync to GREEN drive):** **Stash-Pocket (DOES sync):**
``` ```
Location: /export/vault/Green/stash/ Location: /export/vault/Green/Pocket/stash/
Database: 200MB-1GB (smaller subset) Database: 200MB-1GB (smaller subset)
Generated previews: 5-20GB Generated previews: 5-20GB
Blobs/markers: 1-5GB Blobs/markers: 1-5GB
───────────────────────────────────────────── ─────────────────────────────────────────────
Total: ~6-26GB (syncs to Pocket GREEN) Total: ~6-26GB (syncs to Pocket)
``` ```
**Personal Media (syncs to GREEN drive):** **Pocket Media:**
``` ```
Location: /export/vault/Green/media/ Location: /export/vault/Green/Pocket/media/
Content: 500GB-1TB (curated for travel) Content: 500GB-1TB (curated for travel)
───────────────────────────────────────────── ─────────────────────────────────────────────
Total Green data: ~506GB-1TB (entire /Green/ directory) Total Pocket data: ~506GB-1TB (entire Green/Pocket/ directory)
``` ```
### On Pocket Grimoire (GREEN Drive) ### On Pocket Grimoire (Vault SSD)
``` ```
Location: /srv/greenpg/ Location: /srv/vaultpg/Green/Pocket/
Stash data: ~6-26GB (synced from Netgrimoire) Stash data: ~6-26GB (synced from Netgrimoire)
Media files: ~500GB-1TB (synced from Netgrimoire) Media files: ~500GB-1TB (synced from Netgrimoire)
Wiki/photos/docs: ~10-50GB (already syncing)
───────────────────────────────────────────── ─────────────────────────────────────────────
Total: ~506GB-1TB on GREEN SSD Total: ~516GB-1.1TB on Vault SSD
This fits comfortably on a 2TB+ GREEN SSD. This fits comfortably on a 1-2TB Vault SSD.
``` ```
**Note:** VAULT drive contains backups only (no Stash, no media).
--- ---
## Resource Impact ## Resource Impact