diff --git a/CLAUDE.md b/CLAUDE.md index 21f5f28..fd69e61 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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 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. +This is a personal infrastructure Ansible playbook that automates deployment and management of 21 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. @@ -30,10 +30,11 @@ ansible-playbook dns.yml -i hosts.yml # Deploy specific services using tags (now properly isolated) 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 +ansible-playbook site.yml -i hosts.yml --tags gitea --vault-password-file vault_pass +ansible-playbook site.yml -i hosts.yml --tags docker --vault-password-file vault_pass # entire docker role +ansible-playbook site.yml -i hosts.yml --tags services --vault-password-file vault_pass # all services only -# Deploy services by category (new organized structure) +# Deploy services by category 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 @@ -51,7 +52,7 @@ ansible-playbook site.yml -i hosts.yml --tags common,cron --vault-password-file ### Role Structure - **bootstrap**: Initial server hardening, user creation, Tailscale VPN setup - **common**: Basic system configuration, UFW firewall management -- **docker**: Comprehensive service deployment (24 containerized applications, organized by category) +- **docker**: Comprehensive service deployment (21 containerized applications, organized by category) - **cron**: Scheduled task management (currently Warhammer RSS feed generation) ### Docker Role Organization (Reorganized into Logical Categories) @@ -60,15 +61,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, ByteStash + - Gitea, ByteStash - **media/**: Content creation and consumption - - Audiobookshelf, Calibre, Ghost blog, Pinchflat, Pinry, Karakeep (formerly Hoarder), Manyfold + - Audiobookshelf, Calibre, Karakeep (formerly Hoarder), Manyfold - **productivity/**: Personal organization and document management - - Paperless-NGX, MMDL, Baikal (CalDAV/CardDAV), Syncthing, Heyform, Dawarich, Palmr, Obsidian LiveSync -- **communication/**: Social media and external communication - - GoToSocial (Fediverse), Postiz (social media management) + - Paperless-NGX, Baikal (CalDAV/CardDAV), Syncthing, Heyform, Dawarich, Obsidian LiveSync +- **communication/**: Social media + - GoToSocial (Fediverse) - **monitoring/**: System monitoring and alerts - - Changedetection, Glance dashboard, AppriseAPI, Gotify + - Changedetection, Glance dashboard, AppriseAPI, Gotify, Cronmaster ### Variable Management **Critical**: This infrastructure uses a centralized variable hierarchy in `group_vars/all/`: @@ -131,7 +132,6 @@ 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 -- 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 @@ -148,7 +148,7 @@ Common domains requiring hairpinning fixes: - Organized secrets by service with consistent `vault_` prefix ### Service Tag Fix: -**Critical**: Service tags are now properly isolated. `--tags mmdl` deploys only MMDL (5 tasks), not the entire productivity category. +**Critical**: Service tags are properly isolated. Individual service tags deploy only that service. The `services` tag runs all service tasks across all categories. ### Template Pattern: All templates now follow this pattern: diff --git a/README.md b/README.md index ac10b39..1ed8b94 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ The playbook manages two main environments: ## Services Deployed -The Docker role deploys and manages 27 self-hosted services organized into logical categories: +The Docker role deploys and manages 21 self-hosted services organized into logical categories: ### Infrastructure - **Caddy** (Reverse proxy with automatic HTTPS) @@ -19,37 +19,31 @@ The Docker role deploys and manages 27 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) - **Calibre** (E-book management) -- **Ghost** (Blog platform) -- **Pinchflat** (Media downloader) -- **Pinry** (Pinterest-like board) -- **Hoarder** (Bookmark manager) +- **Karakeep** (Bookmark manager, formerly Hoarder) - **Manyfold** (3D model organizer) ### Productivity - **Paperless-NGX** (Document management) -- **MMDL** (Task management) - **Baikal** (CalDAV/CardDAV server) - **Syncthing** (File synchronization) - **HeyForm** (Form builder) - **Dawarich** (Location tracking) -- **Palmr** (File sharing) - **Obsidian LiveSync** (Note synchronization) ### Communication - **GoToSocial** (Fediverse/Mastodon) -- **Postiz** (Social media management) ### Monitoring - **Changedetection** (Website change monitoring) - **Glance** (Dashboard) - **AppriseAPI** (Notification service) - **Gotify** (Push notifications) +- **Cronmaster** (Scheduled container tasks) ## Structure @@ -90,13 +84,13 @@ Manages scheduled tasks and automation: - Supports easy addition of new scheduled tasks ### [Docker Role](roles/docker/README.md) -The most comprehensive role, deploying 25 containerized services organized into logical categories: +The most comprehensive role, deploying 21 containerized services organized into logical categories: - **Infrastructure**: Caddy reverse proxy, Authentik SSO, Dockge management -- **Development**: Gitea, Code Server, Matrix communication -- **Media**: Audiobookshelf, Calibre, Ghost blog, Pinchflat, and more -- **Productivity**: Paperless-NGX, MMDL task management, Baikal calendar -- **Communication**: GoToSocial, Postiz social media management -- **Monitoring**: Glance dashboard, Changedetection, AppriseAPI notifications +- **Development**: Gitea, ByteStash +- **Media**: Audiobookshelf, Calibre, Karakeep, Manyfold +- **Productivity**: Paperless-NGX, Baikal, Syncthing, HeyForm, Dawarich, Obsidian LiveSync +- **Communication**: GoToSocial +- **Monitoring**: Glance dashboard, Changedetection, AppriseAPI, Gotify, Cronmaster - **Template-Driven**: All services use Jinja2 templates for consistent configuration - **Category-Based Deployment**: Deploy services by category using Ansible tags @@ -134,10 +128,12 @@ Deploy specific services using tags: ansible-playbook site.yml -i hosts.yml --tags infrastructure ansible-playbook site.yml -i hosts.yml --tags media,productivity +# Deploy all services (skips system setup) +ansible-playbook site.yml -i hosts.yml --tags services + # Deploy individual services ansible-playbook site.yml -i hosts.yml --tags caddy ansible-playbook site.yml -i hosts.yml --tags authentik -ansible-playbook site.yml -i hosts.yml --tags mmdl ``` ### Manage DNS Records diff --git a/group_vars/all/domains.yml b/group_vars/all/domains.yml index e4cfba5..e4f0845 100644 --- a/group_vars/all/domains.yml +++ b/group_vars/all/domains.yml @@ -8,32 +8,23 @@ subdomains: git: "git.{{ primary_domain }}" cal: "cal.{{ primary_domain }}" docs: "docs.{{ primary_domain }}" - phlog: "phlog.{{ primary_domain }}" # Ghost blog bookmarks: "bookmarks.{{ primary_domain }}" # Hoarder/Karakeep heyform: "forms.{{ secondary_domain }}" # Heyform on nerder.land media: "media.{{ primary_domain }}" audio: "audio.{{ primary_domain }}" # Audiobookshelf books: "books.{{ primary_domain }}" # Calibre models: "models.{{ primary_domain }}" # Manyfold - pinchflat: "pinchflat.{{ primary_domain }}" - pin: "pin.{{ primary_domain }}" # Pinry paper: "paper.{{ primary_domain }}" # Paperless-NGX - tasks: "tasks.{{ primary_domain }}" # MMDL syncthing: "syncthing.{{ primary_domain }}" loclog: "loclog.{{ primary_domain }}" # Dawarich - files: "files.{{ primary_domain }}" # Palmr file sharing social: "social.{{ primary_domain }}" # GoToSocial - post: "post.{{ primary_domain }}" # Postiz home: "home.{{ primary_domain }}" # Glance watcher: "watcher.{{ primary_domain }}" # Changedetection appriseapi: "appriseapi.{{ primary_domain }}" dockge: "dockge.{{ primary_domain }}" - code: "code.{{ primary_domain }}" # Code Server bytestash: "snippets.{{ primary_domain }}" # ByteStash code snippets gotify: "gotify.{{ primary_domain }}" # Gotify notifications gotify_assistant: "gotify-assistant.{{ primary_domain }}" # iGotify iOS assistant - kanboard: "kanboard.{{ primary_domain }}" # Kanboard project management - grocy: "grocy.{{ primary_domain }}" # Grocy kitchen ERP # Email domains for notifications email_domains: diff --git a/group_vars/docker/services.yml b/group_vars/docker/services.yml index 562b936..4e6147a 100644 --- a/group_vars/docker/services.yml +++ b/group_vars/docker/services.yml @@ -3,11 +3,11 @@ # Service categories for organization service_categories: infrastructure: ["caddy", "authentik", "dockge"] - development: ["gitea", "codeserver"] - media: ["audiobookshelf", "calibre", "ghost", "pinchflat", "pinry", "hoarder", "manyfold"] - productivity: ["paperlessngx", "baikal", "syncthing", "mmdl", "heyform", "dawarich", "pingvin"] - communication: ["gotosocial", "postiz"] - monitoring: ["glance", "changedetection", "appriseapi", "gotify"] + development: ["gitea", "bytestash"] + media: ["audiobookshelf", "calibre", "hoarder", "manyfold"] + productivity: ["paperlessngx", "baikal", "syncthing", "heyform", "dawarich", "obsidian-livesync"] + communication: ["gotosocial"] + monitoring: ["glance", "changedetection", "appriseapi", "gotify", "cronmaster"] # Common service configuration services: @@ -18,8 +18,4 @@ services: # Service-specific configurations dawarich: db_name: "dawarich" - db_user: "dawarich" - - mmdl: - db_name: "mmdl" - db_user: "mmdl" \ No newline at end of file + db_user: "dawarich" \ No newline at end of file diff --git a/roles/docker/templates/glance.yml.j2 b/roles/docker/templates/glance.yml.j2 index 9452cb4..b66e7c2 100644 --- a/roles/docker/templates/glance.yml.j2 +++ b/roles/docker/templates/glance.yml.j2 @@ -122,21 +122,16 @@ pages: - hoarder-app/hoarder - goauthentik/authentik - superseriousbusiness/gotosocial - - stonith404/pingvin-share - caddyserver/caddy - - gitroomhq/postiz-app - sabre-io/Baikal - janeczku/calibre-web - heyform/heyform - paperless-ngx/paperless-ngx - linuxserver/docker-calibre-web - - coder/code-server - dgtlmoon/changedetection.io - Freika/dawarich - manyfold3d/manyfold - caronc/apprise-api - - kieraneglin/pinchflat - - pinry/pinry - syncthing/syncthing - size: full