Files
dashcaddy/dashcaddy-api/recipe-templates.js

340 lines
9.9 KiB
JavaScript

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