Overview
This checklist ensures new services are deployed consistently with proper configuration, security, backups, and monitoring. Service Deployment Models:- Docker container on
docker-prod-01(most common) - Dedicated VM (resource-intensive services like Immich, Authentik)
- LXC container (lightweight infrastructure services)
- Native on Unraid (services requiring NAS direct access)
Pre-Deployment Planning
Define Service Requirements
Document before deploying:
- Purpose: What problem does this service solve?
- Users: Who will use it? (admin only, family, external)
- Resource needs: RAM, CPU, storage estimates
- Network access: Internal only, or externally exposed?
- Data persistence: Stateless or requires database/persistent volumes?
Choose Deployment Model
Docker on docker-prod-01 (default):
- Service is stateless or uses small database
- RAM < 2GB per container
- Standard web application
- Service requires > 4GB RAM
- Heavy background processing (ML, transcoding)
- Benefits from resource isolation
- Examples: Immich, Authentik, future k3s nodes
- Lightweight infrastructure service
- No Docker dependency
- Examples: AdGuard Home, lightweight monitoring agents
- Requires direct hardware access (iGPU for transcoding)
- Needs low-latency NFS access
- Example: Plex
Select Storage Location
Application data (config, databases):
- Docker:
/opt/appdata/<service-name>on VM local disk - VM: Local disk (backed up by PBS)
- LXC: Local disk (backed up by PBS)
- NFS mount from NAS:
/data/<share>/<path> - Must use same filesystem as related services (hardlink rule)
Deployment Steps
Option A: Docker Service on docker-prod-01
Add DNS Rewrite (Internal Access)
AdGuard Home → Filters → DNS Rewrites → Add
- Domain:
<service-name>.giohosted.com - Answer:
192.168.30.11(Traefik on docker-prod-01)
adguardhome-sync to propagate to dns-prod-02 (usually < 1 minute).Option B: Dedicated VM
Create VM in Proxmox
Proxmox UI → [Select Node] → Create VMGeneral:
- VM ID: Next available (e.g., 103)
- Name:
<service-name>-prod-01
- ISO: Ubuntu 24.04 or Debian 12 (from
nas-prod-01:/isos)
- SCSI Controller: VirtIO SCSI
- Qemu Agent: ✓ Enable
- Storage: local-lvm
- Size: (estimate + 50% headroom)
- Discard: ✓ (for thin provisioning)
- Cores: (based on workload, typically 2-4)
- Type:
host
- RAM: (based on requirements)
- Ballooning: Enabled
- Bridge:
vmbr0 - VLAN Tag:
30(Services VLAN)
Install OS and Configure
- Boot VM and complete OS installation
- Set static IP in Services VLAN range (192.168.30.x)
- Update packages:
apt update && apt dist-upgrade -y - Install qemu-guest-agent:
apt install qemu-guest-agent
Deploy Application
Install Docker or deploy service natively depending on requirements.Follow application-specific installation guides.
Option C: LXC Container
Create LXC in Proxmox
Proxmox UI → [Select Node] → Create CTGeneral:
- CT ID: Next available
- Hostname:
<service-name>-prod-01 - Unprivileged: ✓ (default)
- Storage: local
- Template: Debian 12 or Ubuntu 24.04
- Storage: local-lvm
- Size: 8-16 GB (LXCs are lightweight)
- Cores: 1-2
- RAM: 512 MB - 2 GB
- Swap: 512 MB
- Bridge:
vmbr0 - VLAN Tag:
30 - IPv4: Static (192.168.30.x/24)
- Gateway: 192.168.30.1
Post-Deployment Configuration
Configure SSO (If Applicable)
If service supports OIDC/OAuth2:Authentik → Applications → Create
- Name:
<Service Name> - Slug:
<service-name> - Provider: Create new OIDC provider
- Redirect URI:
https://<service-name>.giohosted.com/oauth/callback(check service docs) - Scopes:
openid profile email
- Redirect URI:
Add to Cloudflare Tunnel (If External)
Edit cloudflared config on Restart cloudflared:
docker-prod-01:/opt/appdata/cloudflared/config.yaml:Configure Cloudflare Access (If External)
Cloudflare dashboard → Access → Applications → Add
- Application name:
<Service Name> - Subdomain:
<service-name> - Domain:
giohosted.com - Policy: Require Authentik OIDC group membership
Add to Homarr Dashboard
Homarr UI → Edit Mode → Add Tile
- Name:
<Service Name> - URL:
https://<service-name>.giohosted.com - Icon: (select appropriate icon)
- Category: (Infrastructure, Media, Books, etc.)
Add Uptime Monitor
Uptime Kuma (
http://192.168.10.20:3001):Add New Monitor:- Type: HTTP(s)
- Name:
<Service Name> - URL:
https://<service-name>.giohosted.com - Interval: 120 seconds
- Retries: 3
Configure Backups
For Docker services:Appdata is automatically backed up by existing rsync script:Add to cron:
/opt/appdata/<service-name>→ NAS/backups/docker/appdata/
Documentation
Testing & Validation
Verify Service Functionality
- Login/authentication works
- Core features functional
- Data persistence (restart container, check data intact)
Test Internal Access
From device on Trusted VLAN:
https://<service-name>.giohosted.comShould resolve to Traefik and load service with valid TLS.Test External Access (If Configured)
From phone on cellular (not WiFi):
https://<service-name>.giohosted.comShould:- Route through Cloudflare Tunnel
- Prompt for Cloudflare Access authentication
- Load service after auth
Common Pitfalls
Rollback Procedure
If deployment fails or service causes issues:Remove from Traefik/DNS
- Remove DNS rewrite from AdGuard
- Remove Traefik labels from compose file (or delete compose entirely)