// DashCaddy Recipe Templates // Multi-container application stacks deployed as a single unit const RECIPE_TEMPLATES = { // === MEDIA & ENTERTAINMENT === 'htpc-suite': { name: 'HTPC Suite', description: 'Complete media automation: find, download, organize, and stream', icon: '\uD83C\uDFAC', category: 'Media', type: 'recipe', difficulty: 'Intermediate', popularity: 98, components: [ { id: 'prowlarr', role: 'Indexer Manager', templateRef: 'prowlarr', required: true, order: 1, }, { id: 'qbittorrent', role: 'Download Client', templateRef: 'qbittorrent', required: true, order: 2, }, { id: 'sonarr', role: 'TV Show Manager', templateRef: 'sonarr', required: true, order: 3, }, { id: 'radarr', role: 'Movie Manager', templateRef: 'radarr', required: true, order: 4, }, { id: 'lidarr', role: 'Music Manager', templateRef: 'lidarr', required: false, order: 5, }, { id: 'overseerr', role: 'Request Manager', templateRef: 'seerr', required: false, order: 6, }, ], sharedVolumes: { media: { label: 'Media Library', description: 'Root folder for all media (movies, TV, music)', defaultPath: '/media', usedBy: ['sonarr', 'radarr', 'lidarr', 'qbittorrent'], }, downloads: { label: 'Downloads', description: 'Shared downloads folder for all download clients', defaultPath: '/downloads', usedBy: ['sonarr', 'radarr', 'lidarr', 'qbittorrent'], }, }, autoConnect: { enabled: true, description: 'Automatically connects Sonarr/Radarr to Prowlarr and qBittorrent', steps: [ { action: 'configureProwlarrApps', targets: ['sonarr', 'radarr', 'lidarr'] }, { action: 'configureDownloadClient', client: 'qbittorrent', targets: ['sonarr', 'radarr', 'lidarr'] }, ], }, setupInstructions: [ 'All services share the same media and downloads folders', 'Prowlarr is pre-connected to Sonarr, Radarr, and Lidarr', 'Add indexers in Prowlarr \u2014 they sync automatically to all *arr apps', 'Add your media library root folders in Sonarr and Radarr', 'qBittorrent is pre-configured as the download client', ], }, // === PRODUCTIVITY === 'nextcloud-complete': { name: 'Nextcloud Complete', description: 'Full productivity suite: cloud storage, office editing, and collaboration', icon: '\u2601\uFE0F', category: 'Productivity', type: 'recipe', difficulty: 'Intermediate', popularity: 90, components: [ { id: 'nextcloud-db', role: 'Database', required: true, order: 0, docker: { image: 'mariadb:11', ports: [], volumes: ['/opt/nextcloud-db/data:/var/lib/mysql'], environment: { 'MYSQL_ROOT_PASSWORD': '{{GENERATED_PASSWORD}}', 'MYSQL_DATABASE': 'nextcloud', 'MYSQL_USER': 'nextcloud', 'MYSQL_PASSWORD': '{{GENERATED_PASSWORD}}', }, }, internal: true, }, { id: 'nextcloud-redis', role: 'Cache', required: true, order: 0, docker: { image: 'redis:7-alpine', ports: [], volumes: ['/opt/nextcloud-redis/data:/data'], environment: {}, }, internal: true, }, { id: 'nextcloud', role: 'Cloud Platform', templateRef: 'nextcloud', required: true, order: 1, envOverrides: { 'MYSQL_HOST': 'dashcaddy-nextcloud-db', 'MYSQL_DATABASE': 'nextcloud', 'MYSQL_USER': 'nextcloud', 'MYSQL_PASSWORD': '{{GENERATED_PASSWORD}}', 'REDIS_HOST': 'dashcaddy-nextcloud-redis', }, }, { id: 'collabora', role: 'Office Suite', required: false, order: 2, docker: { image: 'collabora/code:latest', ports: ['{{PORT}}:9980'], volumes: [], environment: { 'aliasgroup1': 'https://{{NEXTCLOUD_DOMAIN}}', 'extra_params': '--o:ssl.enable=false --o:ssl.termination=true', }, }, subdomain: 'office', defaultPort: 9980, healthCheck: '/', }, ], network: { name: 'dashcaddy-nextcloud', driver: 'bridge', }, sharedVolumes: { data: { label: 'Cloud Storage', description: 'Nextcloud data directory for user files', defaultPath: '/opt/nextcloud/data', usedBy: ['nextcloud'], }, }, setupInstructions: [ 'Complete the Nextcloud initial setup wizard in the browser', 'MariaDB and Redis are pre-configured and connected', 'If Collabora is enabled, configure it in Nextcloud: Settings \u2192 Nextcloud Office', 'Point Nextcloud Office to your Collabora URL (e.g., https://office.sami)', 'Configure email, 2FA, and other settings in Nextcloud admin panel', ], }, // === DEVELOPMENT === 'dev-environment': { name: 'Dev Environment', description: 'Self-hosted development workflow: Git, CI/CD, IDE, and database', icon: '\uD83D\uDCBB', category: 'Development', type: 'recipe', difficulty: 'Advanced', popularity: 82, components: [ { id: 'dev-postgres', role: 'Database', required: true, order: 0, docker: { image: 'postgres:16-alpine', ports: [], volumes: ['/opt/dev-postgres/data:/var/lib/postgresql/data'], environment: { 'POSTGRES_DB': 'gitea', 'POSTGRES_USER': 'gitea', 'POSTGRES_PASSWORD': '{{GENERATED_PASSWORD}}', }, }, internal: true, }, { id: 'gitea', role: 'Git Server', templateRef: 'gitea', required: true, order: 1, envOverrides: { 'GITEA__database__DB_TYPE': 'postgres', 'GITEA__database__HOST': 'dashcaddy-dev-postgres:5432', 'GITEA__database__NAME': 'gitea', 'GITEA__database__USER': 'gitea', 'GITEA__database__PASSWD': '{{GENERATED_PASSWORD}}', }, }, { id: 'drone', role: 'CI/CD Pipeline', templateRef: 'drone', required: false, order: 2, }, { id: 'vscode-server', role: 'Web IDE', templateRef: 'vscode-server', required: false, order: 3, }, ], network: { name: 'dashcaddy-dev', driver: 'bridge', }, setupInstructions: [ 'Gitea is pre-configured with PostgreSQL database', 'Complete the Gitea initial setup wizard in the browser', 'If Drone CI is enabled, connect it to Gitea via OAuth application', 'VS Code Server provides a full IDE in your browser', 'All development services share a Docker network for inter-service communication', ], }, // === HOME AUTOMATION === 'smart-home': { name: 'Smart Home Hub', description: 'Home automation: control, automate, and monitor IoT devices', icon: '\uD83C\uDFE0', category: 'Home Automation', type: 'recipe', difficulty: 'Intermediate', popularity: 88, components: [ { id: 'mosquitto', role: 'MQTT Broker', required: true, order: 0, docker: { image: 'eclipse-mosquitto:2', ports: ['1883:1883', '9001:9001'], volumes: [ '/opt/mosquitto/config:/mosquitto/config', '/opt/mosquitto/data:/mosquitto/data', '/opt/mosquitto/log:/mosquitto/log', ], environment: {}, }, subdomain: 'mqtt', defaultPort: 1883, internal: false, setupNote: 'MQTT broker for IoT device communication', }, { id: 'homeassistant', role: 'Automation Hub', templateRef: 'homeassistant', required: true, order: 1, }, { id: 'nodered', role: 'Flow Automation', templateRef: 'nodered', required: true, order: 2, }, { id: 'zigbee2mqtt', role: 'Zigbee Bridge', required: false, order: 3, docker: { image: 'koenkk/zigbee2mqtt:latest', ports: ['{{PORT}}:8080'], volumes: ['/opt/zigbee2mqtt/data:/app/data'], environment: { 'TZ': '{{TIMEZONE}}', }, }, subdomain: 'zigbee', defaultPort: 8080, healthCheck: '/', note: 'Requires a Zigbee USB adapter (e.g., Sonoff Zigbee 3.0 USB Dongle Plus)', }, ], network: { name: 'dashcaddy-smarthome', driver: 'bridge', }, setupInstructions: [ 'Mosquitto MQTT broker is ready for IoT device connections on port 1883', 'Complete the Home Assistant onboarding wizard in the browser', 'Connect Home Assistant to MQTT: Settings \u2192 Integrations \u2192 MQTT', 'Node-RED provides visual flow automation \u2014 connect it to MQTT for device control', 'If Zigbee2MQTT is enabled, it requires a physical Zigbee USB adapter', ], }, }; // Recipe category metadata (separate from app categories) const RECIPE_CATEGORIES = { 'Media': { icon: '\uD83C\uDFAC', color: '#e74c3c', description: 'Media streaming and automation stacks' }, 'Productivity': { icon: '\u2601\uFE0F', color: '#3498db', description: 'Cloud storage and office suites' }, 'Development': { icon: '\uD83D\uDCBB', color: '#9b59b6', description: 'Self-hosted development environments' }, 'Home Automation': { icon: '\uD83C\uDFE0', color: '#27ae60', description: 'IoT and smart home control' }, }; module.exports = { RECIPE_TEMPLATES, RECIPE_CATEGORIES };