340 lines
9.9 KiB
JavaScript
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 };
|