// 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 };