# Host 10.0.30.100 (hostname: ubuntu) — Full Service Inventory & Decommissioning Plan Last updated: 2026-06-30 (session: Docker service cleanup — 10 services removed) ## Access - **SSH**: Key auth with `~/.ssh/hermes_pve_agent` (deployed 2026-06-30). Previously password-only (`sshpass -p '' ssh dominik@10.0.30.100`). - **sudo**: `SUDO_ASKPASS=/tmp/askpass.sh sudo -A ` — see SKILL.md "Remote sudo Without Interactive Password" section - **1Password**: "NUT UPS Monitor (10.0.30.100)" — contains NUT service creds, NOT SSH creds ## Hardware - 4 CPU, Ubuntu 24.04.4 LTS - **1× 256 GB SSD** (sda) — system disk (ext4 + swap) - **9× 2.7 TB HDD** (sdb–sdi): - sdb, sdc, sdg, sdh, sdi → ZFS pool members - sde, sdf → Ceph BlueStore OSDs (LVM) - sdd → ZFS pool member ## ZFS Pool: pool01_n2_redundant | Property | Value | |----------|-------| | Size | 10.9 TB | | Allocated | 6.80 TB (62%) | | Free | 4.10 TB | | Fragmentation | 57% | | Dedup | 1.12x | | Health | ONLINE | ### ZFS Datasets (non-Docker) | Dataset | Used | Mountpoint | Content | |---------|------|------------|---------| | TimeMachine | 951 GB | /pool01_n2_redundant/TimeMachine | macOS Time Machine backups | | proxmox_nfs | 963 GB | /pool01_n2_redundant/proxmox_nfs | NFS share for Proxmox | | homes | 455 GB | /pool01_n2_redundant/homes | User home directories | | Download | 369 GB | /pool01_n2_redundant/Download | Downloads | | HomeAssistant | 33.2 GB | /pool01_n2_redundant/HomeAssistant | HA config backup | | proxmox_storage | 1 GB | /pool01_n2_redundant/proxmox_storage | Nearly empty | | proxmox_iscsi | ~0 | /pool01_n2_redundant/proxmox_iscsi | Empty | | proxmox_isci | ~0 | /pool01_n2_redundant/proxmox_isci | Empty (typo dataset) | | Frigate | ~0 | /pool01_n2_redundant/Frigate | Empty — content deleted, dataset busy (can't zfs destroy yet) | | docker | 781 GB | /var/lib/docker | Docker volumes + overlay | ## Completed: Docker Service Cleanup (2026-06-30) ### Removed: 10 Services (Images + Volumes + Bind Mounts) All 10 services had NO running containers — only stale images, volumes, and bind-mount directories remained. | Service | Images Removed | Volumes Removed | Bind Mounts Cleaned | |---------|---------------|-----------------|---------------------| | Frigate | 0.16.0-beta2, beta4, stable (~8.5 GB) | frigate_config, frigate_storage, frigate_postgres-data, frigate_double-take | /pool01_n2_redundant/Frigate/* (empty), /pool01_n2_redundant/HomeAssistant/frigate/ (clips+recordings) | | Immich | server + ML + ML-openvino (~3 GB) | immich_pgdata, immich_model-cache | — | | Paperless | 6 versions 2.9.0–2.17.1 (~8.3 GB) | paperless_data, paperless_media, paperless_redisdata | — | | Scrypted | latest (2.2 GB) | scrypted | — | | Homebridge | ubuntu-no-avahi (0.9 GB) | homebridge | /pool01_n2_redundant/homes/dominik/.homebridge/ (config + accessories) | | Homegear | stable (1.5 GB) | homegear-data-etc, homegear-data-lib, homegear-data-log | — | | openHAB | 3.4.5 (0.7 GB) | openhab4_openhab4_addons, openhab4_openhab4_conf, openhab4_openhab4_userdata | — | | Node-RED | latest (0.6 GB) | nodered | — | | ioBroker | latest (1.3 GB) | iobrokerdata | — | | Jenkins | jekyll-docker (0.5 GB) | jenkins_home | — | **Total reclaimed**: ~28 GB images + ~8.5 GB volumes + bind-mount data ### Issues Encountered During Cleanup 1. **Docker daemon lockup** — `development-dind-1` (docker:20-dind) in restart loop made all docker commands hang. Fixed by `sudo kill -9 $(pgrep dockerd)` — systemd auto-restarted with fresh daemon. See SKILL.md "Docker Daemon Lockup" section. 2. **FALSE NEGATIVE verification — daemon returned empty `docker images`** — After the first cleanup pass, `docker images | grep -iE "pattern"` returned empty (RC=1), suggesting all target images were deleted. I reported "ALL CLEAN". The user challenged this ("Hast du jetzt ALLE images gelöscht?"). After a daemon restart, `docker images` revealed 80+ images still present — only 3 of 10 target services (frigate beta2/beta4, immich-server, nodered) had actually been deleted. The degraded daemon had returned empty results despite images existing on disk. A second pass was needed to remove the remaining 12 images. **Lesson:** On potentially unstable Docker hosts, always sanity-check `docker images | wc -l` — if 0 but containers are running, the daemon is lying. See `references/docker-zfs-cleanup.md` "False Empty Results" section. 3. **ZFS slowness** — `docker rmi` and `docker volume rm` extremely slow on ZFS backend. Required batching (5-8 items per command) with 120s timeouts. Multiple passes needed — first batch removed ~half, second batch cleared the rest. 4. **ZFS dataset busy** — `zfs destroy pool01_n2_redundant/Frigate` failed with "dataset is busy" even after content deletion. Left empty (140K metadata) for later cleanup. 5. **SSH key deployment** — Initial SSH access was password-only. Deployed `hermes_pve_agent` pubkey via `sshpass` + `authorized_keys` append. 6. **Two-pass image deletion required** — First pass (background job) only deleted 3 of 19 target images before the daemon degraded. After daemon restart, a second `docker rmi -f` pass with all 15 remaining images succeeded in one command (120s timeout). ## Remaining: Docker Containers (still running) | Container | Image | Ports | Status | |-----------|-------|-------|--------| | development-gitlab-1 | gitlab-ce:15.8.1-ce.0 | 22,80,443,2224→22 | DEPRECATED (Gitea replaces) | | gitlab-runner | gitlab-runner:alpine | — | DEPRECATED | | development-dind-1 | docker:20-dind | 2375-2376 | Restart loop — causes daemon lockups | | Traefik | traefik:latest | 80→80 | Reverse proxy | | portainer | portainer-ee:lts | 8000,9443 | Container management | | spoolman-spoolman-1 | spoolman:latest | 7912→8000 | 3D filament mgmt | | website-imkerei-website-1 | ghost:5.3 | 2368 | Imkerei blog | | website-imkerei-proxy-1 | nginx:alpine | 80 | Proxy for imkerei.familie-schoen.com | | website-imkerei-bienen-proxy-1 | nginx:alpine | 80 | Proxy for bienen.familie-schoen.com | ## Traefik Routing (Docker labels) | Hostname | Target | Entrypoint | |----------|--------|------------| | git.familie-schoen.com | GitLab (port 80) | websecure (TLS) — NOW POINTS TO GITEA externally | | registry.familie-schoen.com | GitLab registry (port 5000) | websecure | | mgmt.familie-schoen.com | Traefik dashboard | web (basic auth) | | imkerei.familie-schoen.com | nginx proxy → Ghost | web | | bienen.familie-schoen.com | nginx proxy → Ghost | web | ## Completed: GitLab → Gitea Migration (2026-06-29) All 12 GitLab repos migrated to Gitea (git.familie-schoen.com) via `git clone --mirror` + `git push --mirror` from 10.0.30.100. See `references/gitlab-to-gitea-migration.md` for technique. ## Decommissioning Plan (Remaining Phases) ### Phase 1: Data Migration (PARTIALLY COMPLETE) ✅ 10 Docker services removed (images + volumes + bind mounts) ⬜ Docker workloads → Proxmox LXC/VMs: Traefik, Ghost (Imkerei), Spoolman, Portainer (optional) ⬜ GitLab + Runner + DinD → remove (Gitea replaces ✅) ⬜ ZFS datasets → Ceph or NFS on Proxmox: TimeMachine (951 GB), homes (455 GB), Download (369 GB), proxmox_nfs (963 GB), HomeAssistant (33 GB) ⬜ Docker volumes for active services → migrate with containers ### Phase 2: Ceph Integration 1. Remove 9 HDDs from 10.0.30.100 (7 ZFS + 2 Ceph OSD) 2. Install in n5pro (10.0.20.91) — currently 0 OSDs, 120 GB NVMe only 3. Add as Ceph OSDs to Proxmox cluster 4. Adjust CRUSH rules if needed (HDD tier) ### Phase 3: Ceph OSD Decommission (on 10.0.30.100) 1. Mark osd.8, osd.9 as `out` → data redistributes 2. Wait for rebalance (cluster has 7.1 TB free — sufficient for 5.4 TB from 2 OSDs) 3. `ceph osd destroy` + `ceph osd purge` 4. Remove ceph-mon@ubuntu from cluster ### Phase 4: Shutdown 1. Export ZFS pool 2. Shut down server 3. Physically remove disks ### Capacity Check - Ceph cluster: 12 TB raw, 5.1 TB used, 7.1 TB free - ZFS data to migrate: ~6.8 TB (TimeMachine + homes + Download + proxmox_nfs + docker + misc) - ⚠️ Tight capacity — may need to add disks to n5pro FIRST before draining ZFS data ### Ceph Health Warning (as of 2026-06-29) - HEALTH_WARN: 3 OSDs slow operations, 1 stalled read in BlueFS, proxmox2 low on space - osd.6 on proxmox6 is `destroyed` (not contributing) - Should investigate before adding load