Compare commits

...

12 Commits

Author SHA1 Message Date
f088247ac0 feat: add dockcheck auto-update labels to remaining services
Add mag37.dockcheck.update labels to enable automated container update monitoring for:
- Gotify iOS assistant service
- Karakeep (Hoarder) bookmark manager and all components (Chrome, Meilisearch)
- MMDL task management service
- Postiz social media scheduler and all components (PostgreSQL, Redis)

This completes the rollout of dockcheck labels across all Docker services for consistent update monitoring.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-08 17:40:30 -06:00
e1b6d3132a feat: update service versions and add backup configurations
- Update Authentik to 2025.6.4
- Update Dawarich and Karakeep to latest versions
- Add Paperless-NGX backup with S3 storage
- Improve GoToSocial backup configuration with better naming and retention
- Add dockcheck update labels for automated container monitoring

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-08 17:26:16 -06:00
f71ded1a01 feat: add Grocy kitchen ERP service
- Add grocy subdomain to domains.yml
- Create Docker Compose template using LinuxServer image
- Add Ansible task for service deployment
- Configure Caddy reverse proxy with Authentik auth and API bypass
- Add DNS record for grocy subdomain
- Integrate with productivity services category

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-28 08:47:28 -06:00
a2ae9e5ff6 feat: add Kanboard project management service
- Add kanboard subdomain to domains.yml
- Create Docker Compose template with SQLite backend and plugin store enabled
- Add Ansible task for service deployment
- Configure Caddy reverse proxy routing
- Integrate with productivity services category

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-28 07:21:45 -06:00
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
336e197176 feat: add dockcheck update labels and fix Gotify service names
- Add mag37.dockcheck.update labels to audiobookshelf, caddy, gitea services
- Fix Gotify container names in Caddyfile routing
- Add explicit container names for gotify and igotify-assistant services
- Update Authentik to version 2025.6.3
- Fix environment variable format in gotify-compose template

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-23 11:26:17 -06:00
f0c4cb51b8 fix: resolve Glance template parsing conflict with Go template syntax
- Wrap Go template syntax in Jinja2 raw blocks to prevent parsing conflicts
- Fix custom-api air quality widget template rendering
- Update Glance dashboard layout with search widget and head-widgets

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-03 09:31:58 -06:00
c95ca45a67 feat: add Obsidian LiveSync CouchDB service for note synchronization
- Add Obsidian LiveSync Docker service with CouchDB backend
- Configure service for Tailscale-only access on port 5984
- Add vault credentials for database authentication
- Create productivity category task and handler
- Enable Glance dashboard integration

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-02 23:46:05 -06:00
a287e50048 feat: add ByteStash service for code snippet management
- Add ByteStash Docker service configuration and deployment
- Configure subdomain routing through Caddy
- Add DNS record for ByteStash subdomain
- Update development service category to include ByteStash

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-02 13:53:23 -06:00
36 changed files with 468 additions and 124 deletions

View File

@@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## Overview ## 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. **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 ### Service Management
```bash ```bash
# Deploy specific services using tags (now properly isolated) # 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 caddy --vault-password-file vault_pass
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 authentik --vault-password-file vault_pass
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 mmdl --vault-password-file vault_pass
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 docker --vault-password-file vault_pass # all docker services
# Deploy services by category (new organized structure) # 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 infrastructure --vault-password-file vault_pass
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 media,productivity --vault-password-file vault_pass
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 development,monitoring --vault-password-file vault_pass
# Deploy only infrastructure components # 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 ## Architecture
@@ -60,15 +60,15 @@ The docker role is now organized into logical service groups under `roles/docker
- **infrastructure/**: Core platform components - **infrastructure/**: Core platform components
- Caddy (reverse proxy), Authentik (SSO), Dockge (container management) - Caddy (reverse proxy), Authentik (SSO), Dockge (container management)
- **development/**: Development and collaboration tools - **development/**: Development and collaboration tools
- Gitea, Code Server - Gitea, Code Server, ByteStash
- **media/**: Content creation and consumption - **media/**: Content creation and consumption
- Audiobookshelf, Calibre, Ghost blog, Pinchflat, Pinry, Karakeep (formerly Hoarder), Manyfold - Audiobookshelf, Calibre, Ghost blog, Pinchflat, Pinry, Karakeep (formerly Hoarder), Manyfold
- **productivity/**: Personal organization and document management - **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 - **communication/**: Social media and external communication
- GoToSocial (Fediverse), Postiz (social media management) - GoToSocial (Fediverse), Postiz (social media management)
- **monitoring/**: System monitoring and alerts - **monitoring/**: System monitoring and alerts
- Changedetection, Glance dashboard, AppriseAPI - Changedetection, Glance dashboard, AppriseAPI, Gotify
### Variable Management ### Variable Management
**Critical**: This infrastructure uses a centralized variable hierarchy in `group_vars/all/`: **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 - **Dawarich**: Based on production compose file at https://github.com/Freika/dawarich/blob/master/docker/docker-compose.production.yml
## Service Memories ## 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 - 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 - 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 - 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 ## 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 ### Infrastructure
- **Caddy** (Reverse proxy with automatic HTTPS) - **Caddy** (Reverse proxy with automatic HTTPS)
@@ -20,6 +20,7 @@ The Docker role deploys and manages 24 self-hosted services organized into logic
### Development ### Development
- **Gitea** (Git repository hosting) - **Gitea** (Git repository hosting)
- **Code Server** (VS Code in browser) - **Code Server** (VS Code in browser)
- **ByteStash** (Code snippet management)
### Media ### Media
- **Audiobookshelf** (Audiobook server) - **Audiobookshelf** (Audiobook server)
@@ -37,7 +38,8 @@ The Docker role deploys and manages 24 self-hosted services organized into logic
- **Syncthing** (File synchronization) - **Syncthing** (File synchronization)
- **HeyForm** (Form builder) - **HeyForm** (Form builder)
- **Dawarich** (Location tracking) - **Dawarich** (Location tracking)
- **Pingvin Share** (File sharing) - **Palmr** (File sharing)
- **Obsidian LiveSync** (Note synchronization)
### Communication ### Communication
- **GoToSocial** (Fediverse/Mastodon) - **GoToSocial** (Fediverse/Mastodon)
@@ -47,6 +49,7 @@ The Docker role deploys and manages 24 self-hosted services organized into logic
- **Changedetection** (Website change monitoring) - **Changedetection** (Website change monitoring)
- **Glance** (Dashboard) - **Glance** (Dashboard)
- **AppriseAPI** (Notification service) - **AppriseAPI** (Notification service)
- **Gotify** (Push notifications)
## Structure ## Structure

View File

@@ -27,6 +27,8 @@
ip: "152.53.36.98" ip: "152.53.36.98"
- name: "code" - name: "code"
ip: "152.53.36.98" ip: "152.53.36.98"
- name: "snippets"
ip: "152.53.36.98"
- name: cal - name: cal
ip: "152.53.36.98" ip: "152.53.36.98"
- name: phlog - name: phlog
@@ -49,6 +51,12 @@
ip: "152.53.36.98" ip: "152.53.36.98"
- name: gotify-assistant - name: gotify-assistant
ip: "152.53.36.98" ip: "152.53.36.98"
- name: pdg
ip: "152.53.36.98"
- name: kanboard
ip: "152.53.36.98"
- name: grocy
ip: "152.53.36.98"
- name: nerder.land - name: nerder.land
dns_records: dns_records:
- name: "forms" - name: "forms"

View File

@@ -21,7 +21,7 @@ subdomains:
tasks: "tasks.{{ primary_domain }}" # MMDL tasks: "tasks.{{ primary_domain }}" # MMDL
syncthing: "syncthing.{{ primary_domain }}" syncthing: "syncthing.{{ primary_domain }}"
loclog: "loclog.{{ primary_domain }}" # Dawarich loclog: "loclog.{{ primary_domain }}" # Dawarich
files: "files.{{ primary_domain }}" # Pingvin file sharing files: "files.{{ primary_domain }}" # Palmr file sharing
social: "social.{{ primary_domain }}" # GoToSocial social: "social.{{ primary_domain }}" # GoToSocial
post: "post.{{ primary_domain }}" # Postiz post: "post.{{ primary_domain }}" # Postiz
home: "home.{{ primary_domain }}" # Glance home: "home.{{ primary_domain }}" # Glance
@@ -29,8 +29,11 @@ subdomains:
appriseapi: "appriseapi.{{ primary_domain }}" appriseapi: "appriseapi.{{ primary_domain }}"
dockge: "dockge.{{ primary_domain }}" dockge: "dockge.{{ primary_domain }}"
code: "code.{{ primary_domain }}" # Code Server code: "code.{{ primary_domain }}" # Code Server
bytestash: "snippets.{{ primary_domain }}" # ByteStash code snippets
gotify: "gotify.{{ primary_domain }}" # Gotify notifications gotify: "gotify.{{ primary_domain }}" # Gotify notifications
gotify_assistant: "gotify-assistant.{{ primary_domain }}" # iGotify iOS assistant 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 for notifications
email_domains: email_domains:

View File

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

View File

@@ -40,6 +40,30 @@ tasks.thesatelliteoflove.com {
reverse_proxy mmdl:3000 reverse_proxy mmdl:3000
} }
kanboard.thesatelliteoflove.com {
reverse_proxy kanboard:80
}
grocy.thesatelliteoflove.com {
# API endpoints bypass forward auth for mobile apps
handle /api/* {
reverse_proxy grocy:80
}
# Web interface requires Authentik authentication
forward_auth authentik-server-1:9000 {
uri /outpost.goauthentik.io/auth/caddy
copy_headers {
X-authentik-username
X-authentik-groups
X-authentik-email
X-authentik-name
X-authentik-uid
}
}
reverse_proxy grocy:80
}
phlog.thesatelliteoflove.com { phlog.thesatelliteoflove.com {
reverse_proxy ghost-1-ghost-1:2368 reverse_proxy ghost-1-ghost-1:2368
} }
@@ -49,8 +73,12 @@ code.thesatelliteoflove.com {
reverse_proxy authentik-server-1:9000 reverse_proxy authentik-server-1:9000
} }
snippets.thesatelliteoflove.com {
reverse_proxy bytestash:5000
}
files.thesatelliteoflove.com { files.thesatelliteoflove.com {
reverse_proxy pingvin-pingvin-share-1:3000 reverse_proxy palmr-palmr-1:5487
} }
git.thesatelliteoflove.com { git.thesatelliteoflove.com {
@@ -64,8 +92,6 @@ thesatelliteoflove.com {
file_server file_server
} }
bookmarks.thesatelliteoflove.com { bookmarks.thesatelliteoflove.com {
reverse_proxy hoarder-web-1:3000 reverse_proxy hoarder-web-1:3000
} }
@@ -84,13 +110,24 @@ home.thesatelliteoflove.com {
} }
gotify.thesatelliteoflove.com { gotify.thesatelliteoflove.com {
reverse_proxy gotify-gotify-1:80 reverse_proxy gotify:80
} }
gotify-assistant.thesatelliteoflove.com { gotify-assistant.thesatelliteoflove.com {
reverse_proxy gotify-igotify-assistant-1:8080 reverse_proxy igotify-assistant:8080
} }
pdg.thesatelliteoflove.com {
root * /srv/pdg
try_files {path} {path}.html {path}/ =404
file_server
encode gzip
handle_errors {
rewrite * /{err.status_code}.html
file_server
}
}
repair.nerder.land { repair.nerder.land {
root * /srv/repair root * /srv/repair

View File

@@ -11,4 +11,11 @@
project_src: /opt/stacks/caddy project_src: /opt/stacks/caddy
files: files:
- compose.yml - compose.yml
state: restarted
- name: restart obsidian-livesync
community.docker.docker_compose_v2:
project_src: /opt/stacks/obsidian-livesync
files:
- docker-compose.yml
state: restarted state: restarted

View File

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

View File

@@ -9,3 +9,7 @@
import_tasks: codeserver.yml import_tasks: codeserver.yml
tags: codeserver tags: codeserver
- name: Install bytestash
import_tasks: bytestash.yml
tags: bytestash

View File

@@ -0,0 +1,18 @@
---
- name: Create grocy directories
ansible.builtin.file:
path: "{{ item }}"
state: directory
loop:
- /opt/stacks/grocy
- name: Template grocy compose file
ansible.builtin.template:
src: grocy-compose.yml.j2
dest: /opt/stacks/grocy/compose.yml
- name: Deploy grocy stack
community.docker.docker_compose_v2:
project_src: /opt/stacks/grocy
files:
- compose.yml

View File

@@ -0,0 +1,18 @@
---
- name: Create kanboard directories
ansible.builtin.file:
path: "{{ item }}"
state: directory
loop:
- /opt/stacks/kanboard
- name: Template kanboard compose file
ansible.builtin.template:
src: kanboard-compose.yml.j2
dest: /opt/stacks/kanboard/compose.yml
- name: Deploy kanboard stack
community.docker.docker_compose_v2:
project_src: /opt/stacks/kanboard
files:
- compose.yml

View File

@@ -25,6 +25,18 @@
import_tasks: dawarich.yml import_tasks: dawarich.yml
tags: dawarich tags: dawarich
- name: Install pingvin - name: Install palmr
import_tasks: pingvin.yml import_tasks: palmr.yml
tags: pingvin tags: palmr
- name: Install obsidian-livesync
import_tasks: obsidian-livesync.yml
tags: obsidian-livesync
- name: Install kanboard
import_tasks: kanboard.yml
tags: kanboard
- name: Install grocy
import_tasks: grocy.yml
tags: grocy

View File

@@ -0,0 +1,20 @@
---
- name: make obsidian-livesync directories
ansible.builtin.file:
path: "{{ paths.stacks }}/obsidian-livesync"
state: directory
mode: '0755'
- name: Template out the compose file
ansible.builtin.template:
src: obsidian-livesync-compose.yml.j2
dest: "{{ paths.stacks }}/obsidian-livesync/docker-compose.yml"
mode: '0644'
notify: restart obsidian-livesync
- name: deploy obsidian-livesync stack
community.docker.docker_compose_v2:
project_src: "{{ paths.stacks }}/obsidian-livesync"
state: present
tags:
- obsidian-livesync

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

@@ -19,7 +19,7 @@ services:
glance.url: https://{{ subdomains.appriseapi }}/ glance.url: https://{{ subdomains.appriseapi }}/
glance.description: Apprise api server glance.description: Apprise api server
glance.id: apprise glance.id: apprise
mag37.dockcheck.update: true
volumes: volumes:
config: config:
attach: attach:

View File

@@ -16,6 +16,7 @@ services:
glance.icon: si:audiobookshelf glance.icon: si:audiobookshelf
glance.url: https://{{ subdomains.audio }}/ glance.url: https://{{ subdomains.audio }}/
glance.description: Audio book server glance.description: Audio book server
mag37.dockcheck.update: true
volumes: volumes:
audiobooks: audiobooks:
driver: local driver: local

View File

@@ -37,7 +37,7 @@ services:
glance.parent: authentik glance.parent: authentik
glance.name: Redis glance.name: Redis
server: server:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.6.2} image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.6.4}
restart: unless-stopped restart: unless-stopped
command: server command: server
environment: environment:
@@ -64,7 +64,7 @@ services:
glance.description: Authentication server glance.description: Authentication server
glance.id: authentik glance.id: authentik
worker: worker:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.6.2} image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.6.4}
restart: unless-stopped restart: unless-stopped
command: worker command: worker
environment: environment:

View File

@@ -10,7 +10,7 @@ services:
glance.icon: si:protoncalendar glance.icon: si:protoncalendar
glance.url: https://{{ subdomains.cal }}/ glance.url: https://{{ subdomains.cal }}/
glance.description: CalDav server glance.description: CalDav server
mag37.dockcheck.update: true
volumes: volumes:
config: config:
data: data:

View File

@@ -0,0 +1,37 @@
services:
bytestash:
image: ghcr.io/jordan-dalby/bytestash:latest
container_name: bytestash
restart: unless-stopped
volumes:
- bytestash_data:/data/snippets
environment:
JWT_SECRET: "{{ vault_bytestash.jwt_secret }}"
TOKEN_EXPIRY: "24h"
ALLOW_NEW_ACCOUNTS: "true"
DEBUG: "false"
DISABLE_ACCOUNTS: "false"
DISABLE_INTERNAL_ACCOUNTS: "false"
OIDC_ENABLED: "true"
OIDC_DISPLAY_NAME: "Login with Authentik"
OIDC_ISSUER_URL: "https://{{ subdomains.auth }}/application/o/bytestash/"
OIDC_CLIENT_ID: "{{ vault_bytestash.oidc_client_id }}"
OIDC_CLIENT_SECRET: "{{ vault_bytestash.oidc_client_secret }}"
OIDC_SCOPES: "openid profile email"
extra_hosts:
- "{{ subdomains.auth }}:{{ docker.hairpin_ip }}"
labels:
glance.name: ByteStash
glance.icon: si:code
glance.url: https://{{ subdomains.bytestash }}/
glance.description: Code snippet manager
glance.id: bytestash
volumes:
bytestash_data:
driver: local
networks:
default:
external: true
name: {{ docker.network_name }}

View File

@@ -18,6 +18,7 @@ services:
glance.icon: si:caddy glance.icon: si:caddy
glance.url: https://{{ primary_domain }}/ glance.url: https://{{ primary_domain }}/
glance.description: Reverse proxy glance.description: Reverse proxy
mag37.dockcheck.update: true
networks: networks:
default: default:
ipv4_address: {{ docker.hairpin_ip }} ipv4_address: {{ docker.hairpin_ip }}

View File

@@ -7,6 +7,7 @@ services:
glance.icon: si:vscodium glance.icon: si:vscodium
glance.url: https://{{ subdomains.code }}/ glance.url: https://{{ subdomains.code }}/
glance.description: Code Server glance.description: Code Server
mag37.dockcheck.update: true
container_name: codeserver container_name: codeserver
volumes: volumes:
- home:/home - home:/home

View File

@@ -36,7 +36,7 @@ services:
timeout: 10s timeout: 10s
dawarich_app: dawarich_app:
image: freikin/dawarich:0.28.1 image: freikin/dawarich:latest
container_name: dawarich_app container_name: dawarich_app
labels: labels:
glance.name: Dawarich glance.name: Dawarich
@@ -95,7 +95,7 @@ services:
cpus: '0.50' cpus: '0.50'
memory: '2G' memory: '2G'
dawarich_sidekiq: dawarich_sidekiq:
image: freikin/dawarich:0.28.1 image: freikin/dawarich:latest
container_name: dawarich_sidekiq container_name: dawarich_sidekiq
labels: labels:
glance.parent: dawarich glance.parent: dawarich

View File

@@ -20,6 +20,7 @@ services:
glance.url: https://{{ subdomains.git }}/ glance.url: https://{{ subdomains.git }}/
glance.description: Code repo glance.description: Code repo
glance.id: gitea glance.id: gitea
mag37.dockcheck.update: true
volumes: volumes:
- gitea:/data - gitea:/data
- /etc/timezone:/etc/timezone:ro - /etc/timezone:/etc/timezone:ro
@@ -46,6 +47,7 @@ services:
labels: labels:
glance.parent: gitea glance.parent: gitea
glance.name: Worker glance.name: Worker
mag37.dockcheck.update: true
volumes: volumes:
- ./runner-config.yaml:/config.yaml - ./runner-config.yaml:/config.yaml
- ./data:/data - ./data:/data

View File

@@ -1,40 +1,27 @@
pages: pages:
- name: Home - name: Home
head-widgets:
- type: markets
hide-header: true
markets:
- symbol: SPY
name: S&P 500
- symbol: VTSAX
name: Vanguard Total Stock Market
- symbol: BAI
name: Blackrock AI
- symbol: NLR
name: VanEck Uranium+Nuclear Energy
- symbol: BITO
name: Bitcoin ETF
columns: columns:
- size: small
widgets:
- type: calendar
- type: server-stats
servers:
- type: local
name: Services
- size: full - size: full
widgets: widgets:
- type: group - type: search
widgets: search-engine: kagi
- type: hacker-news new-tab: true
- type: rss
limit: 10
collapse-after: 3
cache: 3h
feeds:
- url: https://kill-the-newsletter.com/feeds/ij4twrnzhrwvyic13qcm.xml
- url: https://mrmoneymustache.ck.page/68f9e9826c
- type: rss
title: Gear
limit: 10
collapse-after: 3
cache: 3h
feeds:
- url: https://9to5toys.com/steals/feed
- url: https://hiro.report/rss/
- type: change-detection
instance-url: https://watcher.thesatelliteoflove.com
token: ac69ae11570548549d6706eac6dbb6a9
- type: docker-containers
hide-by-default: false
- size: small - size: small
widgets: widgets:
@@ -42,24 +29,62 @@ pages:
location: Nederland, Colorado, United States location: Nederland, Colorado, United States
units: imperial units: imperial
- type: markets - type: custom-api
markets: title: Air Quality
- symbol: SPY cache: 10m
name: S&P 500 url: https://api.waqi.info/feed/geo:39.9676367;-105.4037992/?token={{ vault_glance.air_quality_key }}
- symbol: VTSAX template: |
name: Vanguard Total Stock Market {% raw %}{{ $aqi := printf "%03s" (.JSON.String "data.aqi") }}
- symbol: BAI {{ $aqiraw := .JSON.String "data.aqi" }}
name: Blackrock AI {{ $updated := .JSON.String "data.time.iso" }}
- symbol: NLR {{ $humidity := .JSON.String "data.iaqi.h.v" }}
name: VanEck Uranium+Nuclear Energy {{ $ozone := .JSON.String "data.iaqi.o3.v" }}
- symbol: BITO {{ $pm25 := .JSON.String "data.iaqi.pm25.v" }}
name: Bitcoin ETF {{ $pressure := .JSON.String "data.iaqi.p.v" }}
- symbol: GOOGL
name: Google <div class="flex justify-between">
- symbol: AMD <div class="size-h5">
name: AMD {{ if le $aqi "050" }}
- symbol: DJT <div class="color-positive">Good air quality</div>
name: Trump Media {{ else if le $aqi "100" }}
<div class="color-primary">Moderate air quality</div>
{{ else }}
<div class="color-negative">Bad air quality</div>
{{ end }}
</div>
</div>
<div class="color-highlight size-h2">AQI: {{ $aqiraw }}</div>
<div style="border-bottom: 1px solid; margin-block: 10px;"></div>
<div class="margin-block-2">
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;">
<div>
<div class="size-h3 color-highlight">{{ $humidity }}%</div>
<div class="size-h6">HUMIDITY</div>
</div>
<div>
<div class="size-h3 color-highlight">{{ $ozone }} μg/m³</div>
<div class="size-h6">OZONE</div>
</div>
<div>
<div class="size-h3 color-highlight">{{ $pm25 }} μg/m³</div>
<div class="size-h6">PM2.5</div>
</div>
<div>
<div class="size-h3 color-highlight">{{ $pressure }} hPa</div>
<div class="size-h6">PRESSURE</div>
</div>
</div>
<div class="size-h6" style="margin-top: 10px;">Last Updated at {{ slice $updated 11 16 }}</div>
</div>{% endraw %}
- name: Mini Painting - name: Mini Painting
columns: columns:
- size: small - size: small

View File

@@ -1,6 +1,7 @@
services: services:
gotify: gotify:
image: gotify/server:latest image: gotify/server:latest
container_name: gotify
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- gotify_data:/app/data - gotify_data:/app/data
@@ -19,10 +20,11 @@ services:
igotify-assistant: igotify-assistant:
image: ghcr.io/androidseb25/igotify-notification-assist:latest image: ghcr.io/androidseb25/igotify-notification-assist:latest
restart: unless-stopped restart: unless-stopped
container_name: igotify-assistant
volumes: volumes:
- igotify_data:/app/data - igotify_data:/app/data
environment: environment:
- TZ=America/Denver TZ: America/Denver
depends_on: depends_on:
- gotify - gotify
labels: labels:
@@ -30,6 +32,7 @@ services:
glance.icon: si:apple glance.icon: si:apple
glance.url: "https://{{ subdomains.gotify_assistant }}/" glance.url: "https://{{ subdomains.gotify_assistant }}/"
glance.description: iOS notification assistant glance.description: iOS notification assistant
mag37.dockcheck.update: true
extra_hosts: extra_hosts:
- "{{ subdomains.auth }}:{{ docker.hairpin_ip }}" - "{{ subdomains.auth }}:{{ docker.hairpin_ip }}"
- "{{ subdomains.gotify }}:{{ docker.hairpin_ip }}" - "{{ subdomains.gotify }}:{{ docker.hairpin_ip }}"

View File

@@ -44,23 +44,19 @@ services:
labels: labels:
glance.parent: gotosocial glance.parent: gotosocial
glance.name: Backup glance.name: Backup
mag37.dockcheck.update: true
environment: environment:
BACKUP_FILENAME: backup-gts-%Y-%m-%dT%H-%M-%S.tar.gz BACKUP_FILENAME: gts-backup-%Y-%m-%dT%H-%M-%S.tar.gz
BACKUP_LATEST_SYMLINK: backup-latest.tar.gz
BACKUP_CRON_EXPRESSION: "0 9 * * *" BACKUP_CRON_EXPRESSION: "0 9 * * *"
BACKUP_PRUNING_PREFIX: backup- BACKUP_PRUNING_PREFIX: gts-
BACKUP_RETENTION_DAYS: 1 BACKUP_RETENTION_DAYS: 7
AWS_S3_BUCKET_NAME: tsolbackups AWS_S3_BUCKET_NAME: tsolbackups
AWS_ENDPOINT: s3.us-west-004.backblazeb2.com AWS_ENDPOINT: s3.us-west-004.backblazeb2.com
AWS_ACCESS_KEY_ID: {{ vault_backup.access_key_id }} AWS_ACCESS_KEY_ID: {{ vault_backup.access_key_id }}
AWS_SECRET_ACCESS_KEY: {{ vault_backup.secret_access_key }} AWS_SECRET_ACCESS_KEY: {{ vault_backup.secret_access_key }}
BACKUP_SKIP_BACKENDS_FROM_PRUNE: s3
volumes: volumes:
- gotosocial:/backup/my-app-backup:ro - gotosocial:/backup/gts-app-backup:ro
- /var/run/docker.sock:/var/run/docker.sock:ro - /var/run/docker.sock:/var/run/docker.sock:ro
- ./backup:/archive
volumes: volumes:
gotosocial: gotosocial:

View File

@@ -0,0 +1,30 @@
services:
grocy:
image: lscr.io/linuxserver/grocy:latest
container_name: grocy
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=America/Denver
volumes:
- ./config:/config
extra_hosts:
- "host.docker.internal:host-gateway"
- "{{ subdomains.auth }}:{{ docker.hairpin_ip }}"
labels:
glance.name: Grocy
glance.icon: si:grocyapp
glance.url: https://{{ subdomains.grocy }}/
glance.description: Kitchen ERP and inventory management
glance.id: grocy
mag37.dockcheck.update: true
volumes:
grocy_config:
driver: local
networks:
default:
external: true
name: {{ docker.network_name }}

View File

@@ -1,7 +1,7 @@
version: "3.8" version: "3.8"
services: services:
web: web:
image: ghcr.io/karakeep-app/karakeep:0.25.0 image: ghcr.io/karakeep-app/karakeep:latest
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- data:/data - data:/data
@@ -22,12 +22,14 @@ services:
glance.url: https://{{ subdomains.bookmarks }}/ glance.url: https://{{ subdomains.bookmarks }}/
glance.description: Bookmark manager glance.description: Bookmark manager
glance.id: karakeep glance.id: karakeep
mag37.dockcheck.update: true
chrome: chrome:
image: gcr.io/zenika-hub/alpine-chrome:123 image: gcr.io/zenika-hub/alpine-chrome:123
restart: unless-stopped restart: unless-stopped
labels: labels:
glance.name: Chrome glance.name: Chrome
glance.parent: karakeep glance.parent: karakeep
mag37.dockcheck.update: true
command: command:
- --no-sandbox - --no-sandbox
- --disable-gpu - --disable-gpu
@@ -41,6 +43,7 @@ services:
labels: labels:
glance.name: Meilisearch glance.name: Meilisearch
glance.parent: karakeep glance.parent: karakeep
mag37.dockcheck.update: true
env_file: env_file:
- .env - .env
environment: environment:

View File

@@ -0,0 +1,32 @@
services:
kanboard:
image: kanboard/kanboard:latest
container_name: kanboard
restart: unless-stopped
environment:
- PLUGIN_INSTALLER=true
- DB_DRIVER=sqlite
volumes:
- kanboard_data:/var/www/app/data
- kanboard_plugins:/var/www/app/plugins
extra_hosts:
- "host.docker.internal:host-gateway"
- "{{ subdomains.auth }}:{{ docker.hairpin_ip }}"
labels:
glance.name: Kanboard
glance.icon: si:kanboard
glance.url: https://{{ subdomains.kanboard }}/
glance.description: Project management and Kanban boards
glance.id: kanboard
mag37.dockcheck.update: true
volumes:
kanboard_data:
driver: local
kanboard_plugins:
driver: local
networks:
default:
external: true
name: {{ docker.network_name }}

View File

@@ -17,6 +17,7 @@ services:
glance.url: https://{{ subdomains.tasks }}/ glance.url: https://{{ subdomains.tasks }}/
glance.description: Task and calendar management glance.description: Task and calendar management
glance.id: mmdl glance.id: mmdl
mag37.dockcheck.update: true
mmdl_db: mmdl_db:
image: mysql:8.0 image: mysql:8.0
@@ -35,6 +36,7 @@ services:
labels: labels:
glance.parent: mmdl glance.parent: mmdl
glance.name: DB glance.name: DB
mag37.dockcheck.update: true
volumes: volumes:
mmdl_db: mmdl_db:

View File

@@ -0,0 +1,30 @@
services:
obsidian-livesync:
image: oleduc/docker-obsidian-livesync-couchdb:latest
container_name: obsidian-livesync
restart: unless-stopped
labels:
glance.name: Obsidian LiveSync
glance.icon: si:obsidian
glance.url: http://{{ network.docker_host_ip }}:5984
glance.description: Obsidian note synchronization
glance.id: obsidian-livesync
environment:
- SERVER_DOMAIN={{ network.docker_host_ip }}
- COUCHDB_USER={{ vault_obsidian.username }}
- COUCHDB_PASSWORD={{ vault_obsidian.password }}
- COUCHDB_DATABASE=obsidian
ports:
- "{{ network.docker_host_ip }}:5984:5984"
volumes:
- couchdb_data:/opt/couchdb/data
networks:
- default
volumes:
couchdb_data:
networks:
default:
external: true
name: "{{ docker.network_name }}"

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

@@ -57,6 +57,26 @@ services:
glance.name: Tika glance.name: Tika
restart: unless-stopped restart: unless-stopped
backup:
image: offen/docker-volume-backup:v2
restart: always
labels:
glance.parent: paperlessngx
glance.name: Backup
mag37.dockcheck.update: true
environment:
BACKUP_FILENAME: pngx-backup-%Y-%m-%dT%H-%M-%S.tar.gz
BACKUP_CRON_EXPRESSION: "10 9 * * *"
BACKUP_PRUNING_PREFIX: pngx-
BACKUP_RETENTION_DAYS: 7
AWS_S3_BUCKET_NAME: tsolbackups
AWS_ENDPOINT: s3.us-west-004.backblazeb2.com
AWS_ACCESS_KEY_ID: {{ vault_backup.access_key_id }}
AWS_SECRET_ACCESS_KEY: {{ vault_backup.secret_access_key }}
volumes:
- media:/backup/pngx-app-backup:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
volumes: volumes:
data: data:
media: media:

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

@@ -38,6 +38,7 @@ services:
glance.url: https://{{ subdomains.post }}/ glance.url: https://{{ subdomains.post }}/
glance.description: Social media scheduler glance.description: Social media scheduler
glance.id: postiz glance.id: postiz
mag37.dockcheck.update: true
postiz-postgres: postiz-postgres:
image: postgres:14.5 image: postgres:14.5
@@ -57,6 +58,7 @@ services:
labels: labels:
glance.parent: postiz glance.parent: postiz
glance.name: DB glance.name: DB
mag37.dockcheck.update: true
postiz-redis: postiz-redis:
image: redis:7.2 image: redis:7.2
container_name: postiz-redis container_name: postiz-redis
@@ -71,6 +73,7 @@ services:
labels: labels:
glance.parent: postiz glance.parent: postiz
glance.name: Redis glance.name: Redis
mag37.dockcheck.update: true

View File

@@ -9,11 +9,11 @@
roles/docker/tasks/ roles/docker/tasks/
├── main.yml (orchestrator) ├── main.yml (orchestrator)
├── infrastructure/ (caddy, authentik, dockge) ├── infrastructure/ (caddy, authentik, dockge)
├── development/ (gitea, codeserver) ├── development/ (gitea, codeserver, bytestash)
├── media/ (audiobookshelf, calibre, ghost, pinchflat, pinry, hoarder, manyfold) ├── 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) ├── communication/ (gotosocial, postiz)
└── monitoring/ (glance, changedetection, appriseapi) └── monitoring/ (glance, changedetection, appriseapi, gotify)
``` ```
- **COMPLETED**: All services organized into logical categories with category-level tags - **COMPLETED**: All services organized into logical categories with category-level tags