a8545fc501
The previous Type=oneshot + RemainAfterExit=true pattern made systemd freeze pod units in 'active (exited)' as soon as 'podman play kube' returned, so crash-looping containers were invisible to 'systemctl --user --failed' and Restart=on-failure never fired. For every podman-pod role (immich, fdroid, ntfy, gitea, qfieldcloud, unifi, matrix, uptime_kuma): - switch units to Type=notify + NotifyAccess=all - run 'podman kube play --service-container=true' so the unit's main PID stays alive as long as the pod - use 'podman kube down' for ExecStop - add TimeoutStartSec=180 to cover slow first-boot image pulls Pod manifests: flip every container's restartPolicy from Always to Never. systemd is now the single owner of the restart loop: container exits -> pod dies -> service container dies -> unit fails -> Restart=on-failure restarts everything cleanly. With Always, podman retried internally and hid the failure from systemd. CLAUDE.md updated to document the new canonical template and the 'restartPolicy: Never' requirement.
uptime-kuma - Self-Hosted Monitoring Tool
Deploys Uptime Kuma - a self-hosted monitoring and status page application.
Features
- Website monitoring (HTTP/HTTPS)
- TCP port monitoring
- Ping monitoring
- DNS monitoring
- Status pages
- Notifications (Email, Discord, Slack, ntfy, etc.)
- Multi-language support
- Dark mode
Configuration
Optional Variables
See defaults/main.yml for all configuration options.
Key settings:
uptime_kuma_version: "2"
uptime_kuma_port: 3001
uptime_kuma_data_dir: "{{ podman_projects_dir }}/uptime-kuma/data"
# Nginx reverse proxy
uptime_kuma_nginx_enabled: false
uptime_kuma_nginx_hostname: uptime.nas.local
Storage Requirements
CRITICAL: Uptime Kuma uses SQLite and requires local storage with POSIX file lock support.
- ✅ Supported: Local filesystem, Docker volumes
- ❌ NOT Supported: NFS, network filesystems (will cause database corruption)
First-Time Setup
- Access the web UI:
https://uptime.nas.local(if nginx enabled) orhttp://localhost:3001 - Create admin account on first visit
- No default credentials - account is created during initial setup
Usage
Adding Monitors
Web UI → Add New Monitor:
- Monitor Type: HTTP(s), TCP Port, Ping, DNS, etc.
- Friendly Name: Display name
- URL/Host: Target to monitor
- Heartbeat Interval: Check frequency (seconds)
- Retries: Before marking as down
- Notifications: Select notification endpoints
Notification Endpoints
Web UI → Settings → Notifications:
- Email (SMTP)
- Discord, Slack, Telegram
- ntfy (recommended for local notifications)
- Webhooks
- 50+ integrations available
Status Pages
Create public or password-protected status pages showing monitor health.
Web UI → Status Pages → New Status Page
Integration with ntfy
If you deployed the ntfy role:
- Settings → Notifications → Add
- Type: ntfy
- ntfy Server URL:
https://ntfy.jokester.fr - Topic:
uptime-alerts - Username:
admin - Password: Your ntfy admin password
- Test notification
File Locations
- Data directory:
{{ uptime_kuma_data_dir }} - SQLite database:
{{ uptime_kuma_data_dir }}/kuma.db
Dependencies
- podman
- nginx (if
uptime_kuma_nginx_enabled: true)