Compare commits

...

4 Commits

Author SHA1 Message Date
fb6651f1dc docs: complete documentation audit and updates
- Update service count from 24 to 27 across all documentation
- Add missing services: ByteStash, Obsidian LiveSync, Gotify
- Update service categories in README.md, CLAUDE.md, docker/README.md
- Remove deprecated secrets.enc references from command examples
- Update todo.md with complete service listings
- Ensure all documentation accurately reflects current infrastructure

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-23 15:27:42 -06:00
58a6be8da0 docs: update documentation to reflect Pingvin → Palmr migration
- Replace all Pingvin references with Palmr in documentation
- Update README.md, CLAUDE.md, roles/docker/README.md, and todo.md
- Maintain accurate service count (24 services)
- Update service memories and productivity category listings

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-23 15:10:24 -06:00
17c3077cf0 feat: add Palmr file sharing service to replace Pingvin
- Add Palmr Docker Compose template with encryption enabled
- Create Palmr deployment tasks for productivity category
- Add files.thesatelliteoflove.com routing in Caddyfile
- Restore files subdomain for Palmr service
- Add Palmr to Glance dashboard with file icon
- Generate and store encryption key in vault
- Configure HTTPS, Authentik integration, and dockcheck updates

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-23 12:59:11 -06:00
75fabb3523 feat: deprecate Pingvin file sharing service
- Remove Pingvin Docker Compose template and deployment tasks
- Remove files.thesatelliteoflove.com routing from Caddyfile
- Remove files subdomain from domain variables
- Stop and remove Pingvin containers from remote server
- Clean up /opt/stacks/pingvin directory

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-23 12:36:58 -06:00
11 changed files with 79 additions and 67 deletions

View File

@@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## Overview
This is a personal infrastructure Ansible playbook that automates deployment and management of 24 self-hosted Docker services across two domains (`thesatelliteoflove.com` and `nerder.land`). The setup uses Tailscale VPN for secure networking and Caddy for reverse proxy with automated HTTPS.
This is a personal infrastructure Ansible playbook that automates deployment and management of 27 self-hosted Docker services across two domains (`thesatelliteoflove.com` and `nerder.land`). The setup uses Tailscale VPN for secure networking and Caddy for reverse proxy with automated HTTPS.
**Important**: Always review `DEPLOYMENT_LEARNINGS.md` when working on this repository for lessons learned and troubleshooting guidance.
@@ -28,18 +28,18 @@ ansible-playbook dns.yml -i hosts.yml
### Service Management
```bash
# Deploy specific services using tags (now properly isolated)
ansible-playbook site.yml -i hosts.yml --tags caddy --vault-password-file vault_pass --extra-vars "@secrets.enc"
ansible-playbook site.yml -i hosts.yml --tags authentik --vault-password-file vault_pass --extra-vars "@secrets.enc"
ansible-playbook site.yml -i hosts.yml --tags mmdl --vault-password-file vault_pass --extra-vars "@secrets.enc"
ansible-playbook site.yml -i hosts.yml --tags docker --vault-password-file vault_pass --extra-vars "@secrets.enc" # all docker services
ansible-playbook site.yml -i hosts.yml --tags caddy --vault-password-file vault_pass
ansible-playbook site.yml -i hosts.yml --tags authentik --vault-password-file vault_pass
ansible-playbook site.yml -i hosts.yml --tags mmdl --vault-password-file vault_pass
ansible-playbook site.yml -i hosts.yml --tags docker --vault-password-file vault_pass # all docker services
# Deploy services by category (new organized structure)
ansible-playbook site.yml -i hosts.yml --tags infrastructure --vault-password-file vault_pass --extra-vars "@secrets.enc"
ansible-playbook site.yml -i hosts.yml --tags media,productivity --vault-password-file vault_pass --extra-vars "@secrets.enc"
ansible-playbook site.yml -i hosts.yml --tags development,monitoring --vault-password-file vault_pass --extra-vars "@secrets.enc"
ansible-playbook site.yml -i hosts.yml --tags infrastructure --vault-password-file vault_pass
ansible-playbook site.yml -i hosts.yml --tags media,productivity --vault-password-file vault_pass
ansible-playbook site.yml -i hosts.yml --tags development,monitoring --vault-password-file vault_pass
# Deploy only infrastructure components
ansible-playbook site.yml -i hosts.yml --tags common,cron --vault-password-file vault_pass --extra-vars "@secrets.enc"
ansible-playbook site.yml -i hosts.yml --tags common,cron --vault-password-file vault_pass
```
## Architecture
@@ -60,15 +60,15 @@ The docker role is now organized into logical service groups under `roles/docker
- **infrastructure/**: Core platform components
- Caddy (reverse proxy), Authentik (SSO), Dockge (container management)
- **development/**: Development and collaboration tools
- Gitea, Code Server
- Gitea, Code Server, ByteStash
- **media/**: Content creation and consumption
- Audiobookshelf, Calibre, Ghost blog, Pinchflat, Pinry, Karakeep (formerly Hoarder), Manyfold
- **productivity/**: Personal organization and document management
- Paperless-NGX, MMDL, Baikal (CalDAV/CardDAV), Syncthing, Heyform, Dawarich, Pingvin
- Paperless-NGX, MMDL, Baikal (CalDAV/CardDAV), Syncthing, Heyform, Dawarich, Palmr, Obsidian LiveSync
- **communication/**: Social media and external communication
- GoToSocial (Fediverse), Postiz (social media management)
- **monitoring/**: System monitoring and alerts
- Changedetection, Glance dashboard, AppriseAPI
- Changedetection, Glance dashboard, AppriseAPI, Gotify
### Variable Management
**Critical**: This infrastructure uses a centralized variable hierarchy in `group_vars/all/`:
@@ -131,7 +131,7 @@ Common domains requiring hairpinning fixes:
- **Dawarich**: Based on production compose file at https://github.com/Freika/dawarich/blob/master/docker/docker-compose.production.yml
## Service Memories
- pingvin is the service that responds on files.thesatelliteoflove.com
- palmr is the service that responds on files.thesatelliteoflove.com
- karakeep (formerly called hoarder) is deployed with both 'hoarder' and 'karakeep' tags for backward compatibility
- whenever i ask you what containers need updates, run dockcheck and return a list of containers needing updates
- when i ask for the status container updates i want you to run dockcheck on the docker host https://github.com/mag37/dockcheck?ref=selfh.st

View File

@@ -10,7 +10,7 @@ The playbook manages two main environments:
## Services Deployed
The Docker role deploys and manages 24 self-hosted services organized into logical categories:
The Docker role deploys and manages 27 self-hosted services organized into logical categories:
### Infrastructure
- **Caddy** (Reverse proxy with automatic HTTPS)
@@ -20,6 +20,7 @@ The Docker role deploys and manages 24 self-hosted services organized into logic
### Development
- **Gitea** (Git repository hosting)
- **Code Server** (VS Code in browser)
- **ByteStash** (Code snippet management)
### Media
- **Audiobookshelf** (Audiobook server)
@@ -37,7 +38,8 @@ The Docker role deploys and manages 24 self-hosted services organized into logic
- **Syncthing** (File synchronization)
- **HeyForm** (Form builder)
- **Dawarich** (Location tracking)
- **Pingvin Share** (File sharing)
- **Palmr** (File sharing)
- **Obsidian LiveSync** (Note synchronization)
### Communication
- **GoToSocial** (Fediverse/Mastodon)
@@ -47,6 +49,7 @@ The Docker role deploys and manages 24 self-hosted services organized into logic
- **Changedetection** (Website change monitoring)
- **Glance** (Dashboard)
- **AppriseAPI** (Notification service)
- **Gotify** (Push notifications)
## Structure

View File

@@ -21,7 +21,7 @@ subdomains:
tasks: "tasks.{{ primary_domain }}" # MMDL
syncthing: "syncthing.{{ primary_domain }}"
loclog: "loclog.{{ primary_domain }}" # Dawarich
files: "files.{{ primary_domain }}" # Pingvin file sharing
files: "files.{{ primary_domain }}" # Palmr file sharing
social: "social.{{ primary_domain }}" # GoToSocial
post: "post.{{ primary_domain }}" # Postiz
home: "home.{{ primary_domain }}" # Glance

View File

@@ -28,6 +28,7 @@ Deploys and manages a comprehensive self-hosted infrastructure with 24 container
### Development (`development/`)
- **Gitea** - Self-hosted Git with CI/CD runners
- **Code Server** - VS Code in the browser
- **ByteStash** - Code snippet management and organization
### Media (`media/`)
- **Audiobookshelf** - Audiobook and podcast server
@@ -45,7 +46,8 @@ Deploys and manages a comprehensive self-hosted infrastructure with 24 container
- **Syncthing** - Decentralized file sync
- **Heyform** - Form builder and surveys
- **Dawarich** - Location tracking
- **Pingvin Share** - File sharing service
- **Palmr** - File sharing service
- **Obsidian LiveSync** - CouchDB backend for note synchronization
### Communication (`communication/`)
- **GoToSocial** - Lightweight ActivityPub server
@@ -55,6 +57,7 @@ Deploys and manages a comprehensive self-hosted infrastructure with 24 container
- **Glance** - Customizable dashboard with monitoring
- **Change Detection** - Website monitoring
- **Apprise API** - Unified notifications
- **Gotify** - Self-hosted push notification service
## Deployment Patterns

View File

@@ -54,7 +54,7 @@ snippets.thesatelliteoflove.com {
}
files.thesatelliteoflove.com {
reverse_proxy pingvin-pingvin-share-1:3000
reverse_proxy palmr-palmr-1:5487
}
git.thesatelliteoflove.com {

View File

@@ -25,9 +25,9 @@
import_tasks: dawarich.yml
tags: dawarich
- name: Install pingvin
import_tasks: pingvin.yml
tags: pingvin
- name: Install palmr
import_tasks: palmr.yml
tags: palmr
- name: Install obsidian-livesync
import_tasks: obsidian-livesync.yml

View File

@@ -0,0 +1,19 @@
- name: make palmr directories
ansible.builtin.file:
path: "{{ item }}"
state: directory
loop:
- /opt/stacks/palmr
- name: Template out the compose file
ansible.builtin.template:
src: palmr-compose.yml.j2
dest: /opt/stacks/palmr/compose.yml
owner: root
mode: 644
- name: deploy palmr stack
community.docker.docker_compose_v2:
project_src: /opt/stacks/palmr
files:
- compose.yml

View File

@@ -1,19 +0,0 @@
- name: make pingvin directories
ansible.builtin.file:
path: "{{ item}}"
state: directory
loop:
- /opt/stacks/pingvin
- name: Template out the compose file
ansible.builtin.template:
src: pingvin-compose.yml.j2
dest: /opt/stacks/pingvin/compose.yml
owner: root
mode: 644
- name: deploy pingvin stack
community.docker.docker_compose_v2:
project_src: /opt/stacks/pingvin
files:
- compose.yml

View File

@@ -0,0 +1,30 @@
services:
palmr:
image: kyantech/palmr:latest
restart: unless-stopped
environment:
DISABLE_FILESYSTEM_ENCRYPTION: "false"
ENCRYPTION_KEY: "{{ vault_palmr.encryption_key }}"
PALMR_UID: "1000"
PALMR_GID: "1000"
SECURE_SITE: "true"
DEFAULT_LANGUAGE: "en-US"
TRUST_PROXY: "true"
extra_hosts:
- "{{ subdomains.auth }}:{{ docker.hairpin_ip }}"
labels:
glance.name: Palmr
glance.icon: si:files
glance.url: "https://{{ subdomains.files }}/"
glance.description: File sharing and storage
glance.id: palmr
mag37.dockcheck.update: true
volumes:
- palmr_data:/app/server
volumes:
palmr_data:
driver: local
networks:
default:
external: true
name: "{{ docker.network_name }}"

View File

@@ -1,24 +0,0 @@
services:
pingvin-share:
image: stonith404/pingvin-share:latest
restart: unless-stopped
environment:
- TRUST_PROXY=true
extra_hosts:
- '{{ subdomains.auth }}:{{ docker.hairpin_ip }}'
labels:
glance.name: Pingvin
glance.icon: si:files
glance.url: https://{{ subdomains.files }}
glance.description: File sharing service
glance.id: pingvin
volumes:
- data:/opt/app/backend/data
- images:/opt/app/frontend/public/img
volumes:
images:
data:
networks:
default:
external: true
name: {{ docker.network_name }}

View File

@@ -9,11 +9,11 @@
roles/docker/tasks/
├── main.yml (orchestrator)
├── infrastructure/ (caddy, authentik, dockge)
├── development/ (gitea, codeserver)
├── development/ (gitea, codeserver, bytestash)
├── media/ (audiobookshelf, calibre, ghost, pinchflat, pinry, hoarder, manyfold)
├── productivity/ (paperless, baikal, syncthing, mmdl, heyform, dawarich, pingvin)
├── productivity/ (paperless, baikal, syncthing, mmdl, heyform, dawarich, palmr, obsidian-livesync)
├── communication/ (gotosocial, postiz)
└── monitoring/ (glance, changedetection, appriseapi)
└── monitoring/ (glance, changedetection, appriseapi, gotify)
```
- **COMPLETED**: All services organized into logical categories with category-level tags