Add FindMyDevice, Frigate-Notify, and improve Caddy setup

New Docker applications:
- FindMyDevice (FMD) server for self-hosted Android device tracking
- Frigate-Notify for push notifications on Frigate AI detections

Caddy improvements:
- Interactive domain configuration during setup
- Comprehensive Caddyfile template with all services (commented)
- Clear instructions for caddy_net Docker network usage
- .env file with MY_DOMAIN variable

Frigate-Notify features:
- Auto-detects if Frigate and ntfy are installed
- Interactive setup for Frigate URL and ntfy topic
- WebAPI mode by default (polls Frigate every 30s)
- Config template with labels, zones, quiet hours
- Warns about public ntfy.sh privacy implications
This commit is contained in:
Claude
2026-01-01 21:24:59 +00:00
parent 4d04de25b3
commit 4273809f26
2 changed files with 387 additions and 14 deletions
+43
View File
@@ -100,6 +100,8 @@ Install containerized applications to `~/docker/{appname}/`:
- **wg-easy** - WireGuard VPN with web UI - **wg-easy** - WireGuard VPN with web UI
- **Traccar** - GPS tracking server - **Traccar** - GPS tracking server
- **Portainer** - Docker management UI - **Portainer** - Docker management UI
- **FindMyDevice** - Self-hosted Android device tracking
- **Frigate-Notify** - Push notifications for Frigate AI events
### Container Backup & Restore (Kopia) ### Container Backup & Restore (Kopia)
Backup all Docker container data (configs, databases, app data) to your backup drives for disaster recovery. Includes restore functionality to recover containers after OS drive failure. Backup all Docker container data (configs, databases, app data) to your backup drives for disaster recovery. Includes restore functionality to recover containers after OS drive failure.
@@ -575,6 +577,7 @@ docker compose up -d
| wg-easy | 51821 | http://localhost:51821 | | wg-easy | 51821 | http://localhost:51821 |
| Traccar | 8082 | http://localhost:8082 | | Traccar | 8082 | http://localhost:8082 |
| Portainer | 9443 | https://localhost:9443 | | Portainer | 9443 | https://localhost:9443 |
| FindMyDevice | 8084 | http://localhost:8084 |
### Container Backup & Restore (Kopia) ### Container Backup & Restore (Kopia)
@@ -600,6 +603,39 @@ Backup all Docker container data to your backup drives for disaster recovery.
**Kopia Repository Location:** Your backup drive(s) in `~/drives/backupX/container-backups/` **Kopia Repository Location:** Your backup drive(s) in `~/drives/backupX/container-backups/`
### Frigate + ntfy Notifications
If you installed Frigate, ntfy, and Frigate-Notify, they work together:
1. **Frigate** detects objects (person, car, etc.) on your cameras
2. **Frigate-Notify** monitors Frigate for events
3. **ntfy** sends push notifications to your phone
**Subscribe to alerts:**
```bash
# On your phone: Install ntfy app, add topic "frigate-alerts"
# Or visit: http://localhost:8090/frigate-alerts
```
**Customize alerts:** Edit `~/docker/frigate-notify/config.yml`
- Change which objects trigger alerts (person, car, dog, package)
- Set quiet hours for no notifications
- Add multiple notification services (Discord, Pushover, etc.)
### Caddy Reverse Proxy Network
To route traffic through Caddy, containers must be on the `caddy_net` network:
```yaml
# Add to any container's docker-compose.yml:
networks:
default:
name: caddy_net
external: true
```
Then uncomment the service in `~/docker/caddy/Caddyfile`.
### Private Repository (linux-to-sync) ### Private Repository (linux-to-sync)
To clone a private GitHub repository, you need authentication: To clone a private GitHub repository, you need authentication:
@@ -944,6 +980,13 @@ This script is provided as-is for Ubuntu 24.04 Desktop installations.
## Changelog ## Changelog
- **v2.6**: FindMyDevice, Frigate-Notify, and Caddy improvements
- Added FindMyDevice server (self-hosted Android tracking)
- Added Frigate-Notify (push alerts for Frigate AI detections)
- Interactive setup: frigate → frigate-notify → ntfy integration
- Caddy now asks for domain and creates comprehensive Caddyfile
- Caddyfile template includes all services (uncomment to enable)
- Added caddy_net Docker network instructions
- **v2.5**: Additional Docker apps and container backup - **v2.5**: Additional Docker apps and container backup
- Added Jellyfin (free media server with hardware acceleration) - Added Jellyfin (free media server with hardware acceleration)
- Added Frigate NVR (AI-powered object detection) - Added Frigate NVR (AI-powered object detection)
+344 -14
View File
@@ -1982,6 +1982,10 @@ FRIGATE_CONFIG
mkdir -p "$CADDY_DIR" mkdir -p "$CADDY_DIR"
cd "$CADDY_DIR" cd "$CADDY_DIR"
# Ask for domain
echo ""
prompt_text "Your domain (e.g., example.com) [leave blank for local only]:" "" CADDY_DOMAIN
cat > docker-compose.yml << 'CADDY_COMPOSE' cat > docker-compose.yml << 'CADDY_COMPOSE'
name: caddy name: caddy
@@ -1991,6 +1995,7 @@ services:
container_name: caddy container_name: caddy
hostname: caddy hostname: caddy
restart: unless-stopped restart: unless-stopped
env_file: .env
ports: ports:
- "80:80" - "80:80"
- "443:443" - "443:443"
@@ -2007,33 +2012,129 @@ networks:
external: true external: true
CADDY_COMPOSE CADDY_COMPOSE
# Create .env file
cat > .env << CADDY_ENV
MY_DOMAIN=${CADDY_DOMAIN:-localhost}
TZ=$(cat /etc/timezone 2>/dev/null || echo "UTC")
CADDY_ENV
# Create Docker network for Caddy # Create Docker network for Caddy
docker network create caddy_net 2>/dev/null || true docker network create caddy_net 2>/dev/null || true
# Create example Caddyfile # Create comprehensive Caddyfile with all services
cat > Caddyfile << 'CADDY_FILE' cat > Caddyfile << 'CADDY_FILE'
# Caddy reverse proxy configuration # Caddy reverse proxy configuration
# Replace example.com with your domain # Edit MY_DOMAIN in .env file, then uncomment services below
#
# To use: containers must be on 'caddy_net' network
# Add to each container's docker-compose.yml:
# networks:
# default:
# name: caddy_net
# external: true
# Example: Reverse proxy to Immich # ============================================================================
# immich.example.com { # GLOBAL OPTIONS
# ============================================================================
{
# Uncomment for local-only (no domain/SSL):
# auto_https off
}
# ============================================================================
# MEDIA SERVERS
# ============================================================================
# Immich (photo backup)
# immich.{$MY_DOMAIN} {
# reverse_proxy immich_server:2283 # reverse_proxy immich_server:2283
# } # }
# Example: Reverse proxy to Jellyfin # Jellyfin (media server)
# jellyfin.example.com { # jellyfin.{$MY_DOMAIN} {
# reverse_proxy jellyfin:8096 # reverse_proxy jellyfin:8096
# } # }
# Example: Simple file server # Emby (media server)
# files.example.com { # emby.{$MY_DOMAIN} {
# root * /srv # reverse_proxy emby:8096
# file_server browse
# } # }
# Localhost catch-all (for testing) # Audiobookshelf
# audiobooks.{$MY_DOMAIN} {
# reverse_proxy audiobookshelf:80
# }
# Lyrion Music Server
# music.{$MY_DOMAIN} {
# reverse_proxy lms:9000
# }
# ============================================================================
# HOME AUTOMATION & MONITORING
# ============================================================================
# Frigate NVR
# frigate.{$MY_DOMAIN} {
# reverse_proxy frigate:5000
# }
# Uptime Kuma
# status.{$MY_DOMAIN} {
# reverse_proxy uptime-kuma:3001
# }
# Magic Mirror
# mirror.{$MY_DOMAIN} {
# reverse_proxy magicmirror:8080
# }
# Traccar GPS
# gps.{$MY_DOMAIN} {
# reverse_proxy traccar:8082
# }
# FindMyDevice
# fmd.{$MY_DOMAIN} {
# reverse_proxy fmd:8080
# }
# ============================================================================
# UTILITIES
# ============================================================================
# Filebrowser
# files.{$MY_DOMAIN} {
# reverse_proxy filebrowser:80
# }
# Mealie (recipes)
# recipes.{$MY_DOMAIN} {
# reverse_proxy mealie:9000
# }
# ntfy (notifications)
# ntfy.{$MY_DOMAIN} {
# reverse_proxy ntfy:80
# }
# Portainer
# docker.{$MY_DOMAIN} {
# reverse_proxy portainer:9000
# }
# Kopia backup UI
# backup.{$MY_DOMAIN} {
# reverse_proxy kopia:51515
# }
# ============================================================================
# TESTING / CATCH-ALL
# ============================================================================
# Local testing (always responds)
:80 { :80 {
respond "Caddy is running! Edit Caddyfile to add your sites." respond "Caddy is running! Edit Caddyfile to enable your services."
} }
CADDY_FILE CADDY_FILE
@@ -2043,8 +2144,17 @@ CADDY_FILE
echo "" echo ""
echo "✓ Caddy configured at $CADDY_DIR" echo "✓ Caddy configured at $CADDY_DIR"
echo " Start with: cd $CADDY_DIR && docker compose up -d" echo " Start with: cd $CADDY_DIR && docker compose up -d"
echo " Edit Caddyfile to add your reverse proxy rules" echo ""
echo " Created 'caddy_net' Docker network for container routing" echo " Configuration:"
echo " Domain: ${CADDY_DOMAIN:-localhost} (edit .env to change)"
echo " Caddyfile: $CADDY_DIR/Caddyfile (uncomment services)"
echo " Network: caddy_net (add to other containers)"
echo ""
echo " To add a container to Caddy network, add to its docker-compose.yml:"
echo " networks:"
echo " default:"
echo " name: caddy_net"
echo " external: true"
echo "" echo ""
fi fi
fi fi
@@ -2411,6 +2521,226 @@ PORTAINER_COMPOSE
fi fi
fi fi
# ---- FINDMYDEVICE (FMD) ----
echo ""
echo "┌─────────────────────────────────────────────────────────────────┐"
echo "│ FINDMYDEVICE - Self-hosted device tracking │"
echo "│ Track and locate Android devices. Alternative to Google Find. │"
echo "│ Port: 8084 │"
echo "└─────────────────────────────────────────────────────────────────┘"
prompt_yn "Install FindMyDevice server? (y/n):" "n" INSTALL_FMD
if [ "$INSTALL_FMD" = "y" ] || [ "$INSTALL_FMD" = "Y" ]; then
echo "Installing FindMyDevice..."
FMD_DIR="$DOCKER_DIR/fmd"
if [ "$DRY_RUN" = true ]; then
echo "[DRY-RUN] Would create $FMD_DIR"
else
mkdir -p "$FMD_DIR"
cd "$FMD_DIR"
# Generate random admin password
FMD_ADMIN_PASS=$(openssl rand -base64 16 | tr -dc 'a-zA-Z0-9' | head -c 16)
cat > docker-compose.yml << FMD_COMPOSE
name: fmd
services:
fmd:
image: nulide/findmydevice
container_name: fmd
hostname: fmd
restart: unless-stopped
environment:
- FMD_ADMIN_PASSWORD=\${FMD_ADMIN_PASSWORD}
volumes:
- ./data:/fmd/data
ports:
- "8084:8080"
FMD_COMPOSE
cat > .env << FMD_ENV
FMD_ADMIN_PASSWORD=$FMD_ADMIN_PASS
FMD_ENV
mkdir -p data
chown -R "$ACTUAL_USER:$ACTUAL_USER" "$FMD_DIR"
echo ""
echo "✓ FindMyDevice configured at $FMD_DIR"
echo " Start with: cd $FMD_DIR && docker compose up -d"
echo " Access at: http://localhost:8084"
echo " Admin password: $FMD_ADMIN_PASS (saved in .env)"
echo ""
echo " Mobile app: Install 'FindMyDevice' from F-Droid"
echo " Configure app to point to: http://YOUR-SERVER-IP:8084"
echo ""
fi
fi
# ---- FRIGATE-NOTIFY ----
echo ""
echo "┌─────────────────────────────────────────────────────────────────┐"
echo "│ FRIGATE-NOTIFY - Push notifications for Frigate events │"
echo "│ Get alerts when Frigate detects people, cars, etc. │"
echo "│ Sends to: ntfy, Pushover, Discord, Gotify, and more. │"
echo "└─────────────────────────────────────────────────────────────────┘"
prompt_yn "Install Frigate-Notify? (y/n):" "n" INSTALL_FRIGATE_NOTIFY
if [ "$INSTALL_FRIGATE_NOTIFY" = "y" ] || [ "$INSTALL_FRIGATE_NOTIFY" = "Y" ]; then
echo "Installing Frigate-Notify..."
FN_DIR="$DOCKER_DIR/frigate-notify"
if [ "$DRY_RUN" = true ]; then
echo "[DRY-RUN] Would create $FN_DIR"
else
mkdir -p "$FN_DIR"
cd "$FN_DIR"
# Check if Frigate and ntfy are being installed
FRIGATE_URL="http://frigate:5000"
NTFY_URL=""
NTFY_TOPIC=""
echo ""
echo "Frigate-Notify needs to connect to Frigate and a notification service."
echo ""
# Ask for Frigate URL
if [ -d "$DOCKER_DIR/frigate" ]; then
echo " Frigate detected at $DOCKER_DIR/frigate"
prompt_text "Frigate URL [default: http://frigate:5000]:" "http://frigate:5000" FRIGATE_URL
else
prompt_text "Frigate URL (e.g., http://192.168.1.100:5000):" "" FRIGATE_URL
fi
# Ask for ntfy configuration
echo ""
echo "Notification service (ntfy recommended - free, self-hosted):"
if [ -d "$DOCKER_DIR/ntfy" ]; then
echo " ntfy detected at $DOCKER_DIR/ntfy"
prompt_text "ntfy server URL [default: http://ntfy:80]:" "http://ntfy:80" NTFY_URL
else
prompt_text "ntfy server URL (e.g., https://ntfy.sh or http://localhost:8090):" "https://ntfy.sh" NTFY_URL
fi
prompt_text "ntfy topic name [default: frigate-alerts]:" "frigate-alerts" NTFY_TOPIC
cat > docker-compose.yml << 'FN_COMPOSE'
name: frigate-notify
services:
frigate-notify:
image: ghcr.io/0x2142/frigate-notify:latest
container_name: frigate-notify
hostname: frigate-notify
restart: unless-stopped
volumes:
- ./config.yml:/app/config.yml:ro
FN_COMPOSE
# Create config file
cat > config.yml << FN_CONFIG
# Frigate-Notify Configuration
# Documentation: https://frigate-notify.0x2142.com
frigate:
server: $FRIGATE_URL
# WebAPI mode (recommended) - polls Frigate API
webapi:
enabled: true
interval: 30
# Uncomment for MQTT mode instead:
# mqtt:
# enabled: true
# server: mqtt://mosquitto:1883
alerts:
# General settings
general:
# Send test notification on startup
send_startup_message: true
# Zones to monitor (empty = all zones)
zones:
# - front_yard
# - driveway
# Labels to alert on
labels:
- person
- car
# - dog
# - cat
# - package
# Quiet hours (no notifications)
# quiet:
# start: "22:00"
# end: "07:00"
notifiers:
# ntfy (recommended - free, simple)
- name: ntfy
enabled: true
provider: ntfy
config:
server: $NTFY_URL
topic: $NTFY_TOPIC
# Uncomment for auth:
# token: your-ntfy-token
# Uncomment for additional notifiers:
# - name: discord
# enabled: false
# provider: discord
# config:
# webhook: https://discord.com/api/webhooks/YOUR_WEBHOOK
# - name: pushover
# enabled: false
# provider: pushover
# config:
# token: your-app-token
# userkey: your-user-key
# - name: gotify
# enabled: false
# provider: gotify
# config:
# server: http://gotify:80
# token: your-gotify-token
FN_CONFIG
chown -R "$ACTUAL_USER:$ACTUAL_USER" "$FN_DIR"
echo ""
echo "✓ Frigate-Notify configured at $FN_DIR"
echo " Start with: cd $FN_DIR && docker compose up -d"
echo ""
echo " Configuration:"
echo " Frigate: $FRIGATE_URL"
echo " ntfy: $NTFY_URL"
echo " Topic: $NTFY_TOPIC"
echo ""
echo " Edit config.yml to customize:"
echo " - Which labels trigger alerts (person, car, dog...)"
echo " - Quiet hours for no notifications"
echo " - Additional notification services"
echo ""
if [[ "$NTFY_URL" == *"ntfy.sh"* ]]; then
echo " ⚠️ Using public ntfy.sh - anyone can subscribe to your topic!"
echo " Consider self-hosting ntfy for privacy."
echo ""
fi
echo " Subscribe to alerts:"
echo " Mobile: Install ntfy app → Add topic '$NTFY_TOPIC'"
echo " Web: ${NTFY_URL}/${NTFY_TOPIC}"
echo ""
fi
fi
# ============================================================================ # ============================================================================
# KOPIA BACKUP FOR DOCKER CONTAINERS # KOPIA BACKUP FOR DOCKER CONTAINERS
# ============================================================================ # ============================================================================