import { Template } from '../types';
export const TEMPLATES: Record<string, Template> = {
// Analytics
plausible: {
name: 'Plausible Analytics',
description: 'Simple, open-source, privacy-friendly web analytics',
source: {
type: 'docker_image',
image: 'plausible/analytics:latest',
},
buildType: 'image',
ports: [8000],
requiredEnvVars: [
{
key: 'BASE_URL',
description: 'The base URL where Plausible will be accessible',
required: true,
},
{
key: 'SECRET_KEY_BASE',
description: 'Secret key for session signing (generate with openssl rand -base64 64)',
required: true,
},
{
key: 'POSTGRES_URL',
description: 'PostgreSQL connection URL',
required: true,
},
],
optionalServices: ['postgres'],
iconUrl: 'https://plausible.io/assets/logo/plausible-logo.png',
tags: ['analytics', 'monitoring'],
},
// CMS
strapi: {
name: 'Strapi CMS',
description: 'Open-source headless CMS',
source: {
type: 'git',
repository: 'https://github.com/strapi/strapi-template-blog',
branch: 'main',
},
buildType: 'dockerfile',
ports: [1337],
requiredEnvVars: [
{
key: 'NODE_ENV',
description: 'Node environment',
required: true,
defaultValue: 'production',
},
{
key: 'DATABASE_CLIENT',
description: 'Database client (postgres, mysql, sqlite)',
required: true,
defaultValue: 'postgres',
},
{
key: 'DATABASE_HOST',
description: 'Database host',
required: true,
defaultValue: 'localhost',
},
{
key: 'DATABASE_PORT',
description: 'Database port',
required: true,
defaultValue: '5432',
},
{
key: 'DATABASE_NAME',
description: 'Database name',
required: true,
},
{
key: 'DATABASE_USERNAME',
description: 'Database username',
required: true,
},
{
key: 'DATABASE_PASSWORD',
description: 'Database password',
required: true,
},
],
optionalServices: ['postgres', 'mysql'],
iconUrl: 'https://strapi.io/assets/images/logo-dark.svg',
tags: ['cms', 'headless', 'content'],
},
// E-commerce
saleor: {
name: 'Saleor E-commerce',
description: 'Headless e-commerce platform with GraphQL API',
source: {
type: 'docker_image',
image: 'saleor/saleor:latest',
},
buildType: 'image',
ports: [8000],
requiredEnvVars: [
{
key: 'SECRET_KEY',
description: 'Secret key for Django (generate with openssl rand -base64 64)',
required: true,
},
{
key: 'ALLOWED_HOSTS',
description: 'Comma-separated list of allowed hostnames',
required: true,
defaultValue: 'localhost',
},
{
key: 'DATABASE_URL',
description: 'PostgreSQL connection URL',
required: true,
},
{
key: 'REDIS_URL',
description: 'Redis connection URL for caching',
required: false,
},
],
optionalServices: ['postgres', 'redis'],
iconUrl: 'https://saleor.io/images/logo.svg',
tags: ['e-commerce', 'shop', 'graphql'],
},
// Database Tools
pgadmin: {
name: 'pgAdmin',
description: 'PostgreSQL administration tool',
source: {
type: 'docker_image',
image: 'dpage/pgadmin4:latest',
},
buildType: 'image',
ports: [80],
requiredEnvVars: [
{
key: 'PGADMIN_DEFAULT_EMAIL',
description: 'Default admin email',
required: true,
},
{
key: 'PGADMIN_DEFAULT_PASSWORD',
description: 'Default admin password',
required: true,
},
],
iconUrl: 'https://www.pgadmin.org/static/img/new-pgadmin-logo.png',
tags: ['database', 'postgresql', 'admin'],
},
// Collaboration Tools
n8n: {
name: 'n8n Workflow Automation',
description: 'Open-source workflow automation tool',
source: {
type: 'docker_image',
image: 'n8nio/n8n:latest',
},
buildType: 'image',
ports: [5678],
requiredEnvVars: [
{
key: 'N8N_BASIC_AUTH_ACTIVE',
description: 'Enable basic authentication',
required: true,
defaultValue: 'true',
},
{
key: 'N8N_BASIC_AUTH_USER',
description: 'Basic auth username',
required: true,
},
{
key: 'N8N_BASIC_AUTH_PASSWORD',
description: 'Basic auth password',
required: true,
},
],
optionalServices: ['postgres', 'redis'],
iconUrl: 'https://n8n.io/favicon.ico',
tags: ['automation', 'workflows', 'integration'],
},
// Monitoring
uptime-kuma: {
name: 'Uptime Kuma',
description: 'Self-hosted monitoring tool',
source: {
type: 'docker_image',
image: 'louislam/uptime-kuma:1',
},
buildType: 'image',
ports: [3001],
requiredEnvVars: [],
iconUrl: 'https://uptime.kuma.pet/img/icon.svg',
tags: ['monitoring', 'uptime'],
},
// Documentation
bookstack: {
name: 'BookStack',
description: 'Wiki and documentation platform',
source: {
type: 'docker_image',
image: 'linuxserver/bookstack:latest',
},
buildType: 'image',
ports: [80],
requiredEnvVars: [
{
key: 'PUID',
description: 'User ID for container permissions',
required: true,
defaultValue: '1000',
},
{
key: 'PGID',
description: 'Group ID for container permissions',
required: true,
defaultValue: '1000',
},
{
key: 'DB_HOST',
description: 'Database host',
required: true,
},
{
key: 'DB_USER',
description: 'Database username',
required: true,
},
{
key: 'DB_PASSWORD',
description: 'Database password',
required: true,
},
{
key: 'DB_DATABASE',
description: 'Database name',
required: true,
},
],
optionalServices: ['mysql', 'postgres'],
iconUrl: 'https://www.bookstackapp.com/assets/img/bookstack-icon.svg',
tags: ['documentation', 'wiki', 'knowledge-base'],
},
// File Management
filebrowser: {
name: 'File Browser',
description: 'Web-based file manager',
source: {
type: 'docker_image',
image: 'filebrowser/filebrowser:latest',
},
buildType: 'image',
ports: [80],
requiredEnvVars: [],
iconUrl: 'https://raw.githubusercontent.com/filebrowser/logo/master/logo.png',
tags: ['files', 'storage', 'manager'],
},
// Developer Tools
gitlab: {
name: 'GitLab Community Edition',
description: 'Self-hosted Git repository manager',
source: {
type: 'docker_image',
image: 'gitlab/gitlab-ce:latest',
},
buildType: 'image',
ports: [80, 443, 22],
requiredEnvVars: [
{
key: 'GITLAB_OMNIBUS_CONFIG',
description: 'GitLab configuration (omit for basic setup)',
required: false,
},
],
optionalServices: ['postgres', 'redis'],
iconUrl: 'https://about.gitlab.com/images/press/logo/png/gitlab-icon-rgb.png',
tags: ['git', 'repository', 'ci-cd'],
},
// Communication
rocketchat: {
name: 'Rocket.Chat',
description: 'Open-source communication platform',
source: {
type: 'docker_image',
image: 'rocketchat/rocket.chat:latest',
},
buildType: 'image',
ports: [3000],
requiredEnvVars: [
{
key: 'ROOT_URL',
description: 'The root URL for Rocket.Chat',
required: true,
},
{
key: 'MONGO_URL',
description: 'MongoDB connection URL',
required: true,
},
],
optionalServices: ['mongo'],
iconUrl: 'https://cdn.rocket.chat/assets/img/logo.svg',
tags: ['chat', 'communication', 'messaging'],
},
};
export function getTemplate(name: string): Template | undefined {
return TEMPLATES[name.toLowerCase()];
}
export function listTemplates(): Template[] {
return Object.values(TEMPLATES);
}
export function searchTemplates(query: string): Template[] {
const lowercaseQuery = query.toLowerCase();
return Object.values(TEMPLATES).filter(template =>
template.name.toLowerCase().includes(lowercaseQuery) ||
template.description.toLowerCase().includes(lowercaseQuery) ||
template.tags?.some(tag => tag.toLowerCase().includes(lowercaseQuery))
);
}