diff --git a/.gitignore b/.gitignore index 2f8606a3..904891b2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ node_modules package-lock.json -meta.json.backup.* +meta.json.backup.* \ No newline at end of file diff --git a/blueprints/alarik/alarik.png b/blueprints/alarik/alarik.png new file mode 100644 index 00000000..cc05be94 Binary files /dev/null and b/blueprints/alarik/alarik.png differ diff --git a/blueprints/alarik/docker-compose.yml b/blueprints/alarik/docker-compose.yml new file mode 100644 index 00000000..b66fcd9b --- /dev/null +++ b/blueprints/alarik/docker-compose.yml @@ -0,0 +1,30 @@ +services: + alarik: + image: ghcr.io/achtungsoftware/alarik:latest + restart: unless-stopped + volumes: + - alarik-storage:/app/Storage + environment: + - API_BASE_URL=${API_BASE_URL} + - CONSOLE_BASE_URL=${CONSOLE_BASE_URL} + - ADMIN_USERNAME=${ADMIN_USERNAME} + - ADMIN_PASSWORD=${ADMIN_PASSWORD} + - JWT=${JWT} + - ALLOW_ACCOUNT_CREATION=${ALLOW_ACCOUNT_CREATION} + expose: + - 8080 + + console: + image: ghcr.io/achtungsoftware/alarik-console:latest + restart: unless-stopped + environment: + - NUXT_PUBLIC_API_BASE_URL=${API_BASE_URL} + - NUXT_PUBLIC_CONSOLE_BASE_URL=${CONSOLE_BASE_URL} + - NUXT_PUBLIC_ALLOW_ACCOUNT_CREATION=${ALLOW_ACCOUNT_CREATION} + expose: + - 3000 + depends_on: + - alarik + +volumes: + alarik-storage: diff --git a/blueprints/alarik/template.toml b/blueprints/alarik/template.toml new file mode 100644 index 00000000..df28f2ad --- /dev/null +++ b/blueprints/alarik/template.toml @@ -0,0 +1,26 @@ +[variables] +console_domain = "${domain}" +api_domain = "${domain}" + +[config] +mounts = [] + +# S3-compatible API - point AWS CLI / SDKs / rclone / backup tools at this domain +[[config.domains]] +serviceName = "alarik" +port = 8_080 +host = "${api_domain}" + +# Web management console - log in with the generated admin credentials below +[[config.domains]] +serviceName = "console" +port = 3_000 +host = "${console_domain}" + +[config.env] +API_BASE_URL = "http://${api_domain}" +CONSOLE_BASE_URL = "http://${console_domain}" +ADMIN_USERNAME = "alarik" +ADMIN_PASSWORD = "${password:16}" +JWT = "${base64:64}" +ALLOW_ACCOUNT_CREATION = "false" diff --git a/blueprints/archivebox/archivebox.svg b/blueprints/archivebox/archivebox.svg new file mode 100644 index 00000000..be38ea52 --- /dev/null +++ b/blueprints/archivebox/archivebox.svg @@ -0,0 +1,5 @@ + + + + A + diff --git a/blueprints/archivebox/docker-compose.yml b/blueprints/archivebox/docker-compose.yml new file mode 100644 index 00000000..2f149345 --- /dev/null +++ b/blueprints/archivebox/docker-compose.yml @@ -0,0 +1,16 @@ +services: + archivebox: + image: archivebox/archivebox:latest + restart: unless-stopped + command: server --quick-init 0.0.0.0:8000 + environment: + ALLOWED_HOSTS: ${ALLOWED_HOSTS} + PUBLIC_INDEX: ${PUBLIC_INDEX} + PUBLIC_SNAPSHOTS: ${PUBLIC_SNAPSHOTS} + volumes: + - archivebox_data:/data + ports: + - "8000" + +volumes: + archivebox_data: diff --git a/blueprints/archivebox/template.toml b/blueprints/archivebox/template.toml new file mode 100644 index 00000000..edcc7fa8 --- /dev/null +++ b/blueprints/archivebox/template.toml @@ -0,0 +1,15 @@ +[variables] +main_domain = "${domain}" + +[config] +mounts = [] + +[[config.domains]] +serviceName = "archivebox" +port = 8000 +host = "${main_domain}" + +[config.env] +ALLOWED_HOSTS = "*" +PUBLIC_INDEX = "True" +PUBLIC_SNAPSHOTS = "True" diff --git a/blueprints/chatto/docker-compose.yml b/blueprints/chatto/docker-compose.yml new file mode 100644 index 00000000..3edb99d3 --- /dev/null +++ b/blueprints/chatto/docker-compose.yml @@ -0,0 +1,29 @@ +version: "3.8" + +services: + chatto: + image: ghcr.io/chattocorp/chatto:0.3.8 + restart: unless-stopped + expose: + - "4000" + environment: + CHATTO_WEBSERVER_URL: https://${CHATTO_HOST} + CHATTO_WEBSERVER_PORT: "4000" + CHATTO_WEBSERVER_COOKIE_SIGNING_SECRET: ${CHATTO_COOKIE_SECRET} + CHATTO_CORE_SECRET_KEY: ${CHATTO_CORE_SECRET} + CHATTO_CORE_ASSETS_SIGNING_SECRET: ${CHATTO_ASSETS_SECRET} + CHATTO_NATS_EMBEDDED_ENABLED: true + CHATTO_NATS_EMBEDDED_DATA_DIR: /data + CHATTO_OWNERS_EMAILS: ${CHATTO_OWNER_EMAIL} + CHATTO_SMTP_ENABLED: ${CHATTO_SMTP_ENABLED:-false} + CHATTO_SMTP_HOST: ${CHATTO_SMTP_HOST:-} + CHATTO_SMTP_PORT: ${CHATTO_SMTP_PORT:-587} + CHATTO_SMTP_TLS: ${CHATTO_SMTP_TLS:-mandatory} + CHATTO_SMTP_USERNAME: ${CHATTO_SMTP_USERNAME:-} + CHATTO_SMTP_PASSWORD: ${CHATTO_SMTP_PASSWORD:-} + CHATTO_SMTP_FROM: ${CHATTO_SMTP_FROM:-} + volumes: + - chatto-data:/data + +volumes: + chatto-data: diff --git a/blueprints/chatto/logo.png b/blueprints/chatto/logo.png new file mode 100644 index 00000000..81928507 Binary files /dev/null and b/blueprints/chatto/logo.png differ diff --git a/blueprints/chatto/template.toml b/blueprints/chatto/template.toml new file mode 100644 index 00000000..5d8570ef --- /dev/null +++ b/blueprints/chatto/template.toml @@ -0,0 +1,21 @@ +[variables] +main_domain = "${domain}" +cookie_secret = "${hash:64}" +core_secret = "${hash:64}" +assets_secret = "${hash:64}" +owner_email = "${email}" + +[config] +env = [ + "CHATTO_HOST=${main_domain}", + "CHATTO_COOKIE_SECRET=${cookie_secret}", + "CHATTO_CORE_SECRET=${core_secret}", + "CHATTO_ASSETS_SECRET=${assets_secret}", + "CHATTO_OWNER_EMAIL=${owner_email}", +] +mounts = [] + +[[config.domains]] +serviceName = "chatto" +port = 4000 +host = "${main_domain}" diff --git a/blueprints/dockge/docker-compose.yml b/blueprints/dockge/docker-compose.yml new file mode 100644 index 00000000..8736f2fd --- /dev/null +++ b/blueprints/dockge/docker-compose.yml @@ -0,0 +1,16 @@ +services: + dockge: + image: louislam/dockge:1 + restart: unless-stopped + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - dockge_data:/app/data + - dockge_stacks:/opt/stacks + environment: + DOCKGE_STACKS_DIR: /opt/stacks + ports: + - "5001" + +volumes: + dockge_data: + dockge_stacks: diff --git a/blueprints/dockge/dockge.svg b/blueprints/dockge/dockge.svg new file mode 100644 index 00000000..69ade613 --- /dev/null +++ b/blueprints/dockge/dockge.svg @@ -0,0 +1,5 @@ + + + + D + diff --git a/blueprints/dockge/template.toml b/blueprints/dockge/template.toml new file mode 100644 index 00000000..79d8a24f --- /dev/null +++ b/blueprints/dockge/template.toml @@ -0,0 +1,11 @@ +[variables] +main_domain = "${domain}" + +[config] +env = {} +mounts = [] + +[[config.domains]] +serviceName = "dockge" +port = 5001 +host = "${main_domain}" diff --git a/blueprints/filegator/docker-compose.yml b/blueprints/filegator/docker-compose.yml new file mode 100644 index 00000000..f2f73351 --- /dev/null +++ b/blueprints/filegator/docker-compose.yml @@ -0,0 +1,13 @@ +services: + filegator: + image: filegator/filegator:v7.14.3 + restart: unless-stopped + volumes: + - filegator_repository:/var/www/filegator/repository + - filegator_private:/var/www/filegator/private + ports: + - "8080" + +volumes: + filegator_repository: + filegator_private: diff --git a/blueprints/filegator/filegator.svg b/blueprints/filegator/filegator.svg new file mode 100644 index 00000000..7f09ba2d --- /dev/null +++ b/blueprints/filegator/filegator.svg @@ -0,0 +1,5 @@ + + + + F + diff --git a/blueprints/filegator/template.toml b/blueprints/filegator/template.toml new file mode 100644 index 00000000..8646a0c7 --- /dev/null +++ b/blueprints/filegator/template.toml @@ -0,0 +1,11 @@ +[variables] +main_domain = "${domain}" + +[config] +env = {} +mounts = [] + +[[config.domains]] +serviceName = "filegator" +port = 8080 +host = "${main_domain}" diff --git a/blueprints/firefly-iii/README.md b/blueprints/firefly-iii/README.md new file mode 100644 index 00000000..1687baf8 --- /dev/null +++ b/blueprints/firefly-iii/README.md @@ -0,0 +1,13 @@ +# Firefly III + +Firefly III is a self-hosted personal finance manager for budgets, accounts, transactions, categories, and reports. + +This Dokploy template includes: + +- Firefly III core web application +- MariaDB database with generated credentials +- Persistent upload and database volumes +- Daily cron runner using Firefly III's static cron token +- Dokploy domain routing on the application service + +After deployment, open the generated domain and complete the first-user setup flow. diff --git a/blueprints/firefly-iii/docker-compose.yml b/blueprints/firefly-iii/docker-compose.yml new file mode 100644 index 00000000..b9823407 --- /dev/null +++ b/blueprints/firefly-iii/docker-compose.yml @@ -0,0 +1,65 @@ +version: "3.8" + +services: + firefly-iii: + image: fireflyiii/core:version-6.6.3 + restart: unless-stopped + depends_on: + firefly-iii-db: + condition: service_healthy + environment: + APP_KEY: ${APP_KEY} + APP_URL: ${APP_URL} + TRUSTED_PROXIES: "**" + TZ: ${TZ} + SITE_OWNER: ${SITE_OWNER} + DEFAULT_LANGUAGE: ${DEFAULT_LANGUAGE} + DEFAULT_LOCALE: ${DEFAULT_LOCALE} + DB_CONNECTION: mysql + DB_HOST: firefly-iii-db + DB_PORT: 3306 + DB_DATABASE: ${DB_DATABASE} + DB_USERNAME: ${DB_USERNAME} + DB_PASSWORD: ${DB_PASSWORD} + STATIC_CRON_TOKEN: ${STATIC_CRON_TOKEN} + expose: + - "8080" + volumes: + - firefly-iii-upload:/var/www/html/storage/upload + + firefly-iii-db: + image: mariadb:11.8 + restart: unless-stopped + environment: + MYSQL_DATABASE: ${DB_DATABASE} + MYSQL_USER: ${DB_USERNAME} + MYSQL_PASSWORD: ${DB_PASSWORD} + MYSQL_RANDOM_ROOT_PASSWORD: "yes" + volumes: + - firefly-iii-db:/var/lib/mysql + healthcheck: + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + interval: 10s + timeout: 5s + retries: 5 + + firefly-iii-cron: + image: alpine:3.22 + restart: unless-stopped + depends_on: + - firefly-iii + environment: + TZ: ${TZ} + STATIC_CRON_TOKEN: ${STATIC_CRON_TOKEN} + command: + - sh + - -c + - | + apk add --no-cache tzdata wget && \ + (ln -snf /usr/share/zoneinfo/$$TZ /etc/localtime || true) && \ + echo "0 3 * * * wget -qO- http://firefly-iii:8080/api/v1/cron/$$STATIC_CRON_TOKEN; echo" | crontab - && \ + crond -f -L /dev/stdout + +volumes: + firefly-iii-upload: {} + firefly-iii-db: {} diff --git a/blueprints/firefly-iii/logo.svg b/blueprints/firefly-iii/logo.svg new file mode 100644 index 00000000..8b4b7d2c --- /dev/null +++ b/blueprints/firefly-iii/logo.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/blueprints/firefly-iii/template.toml b/blueprints/firefly-iii/template.toml new file mode 100644 index 00000000..3f02a8ae --- /dev/null +++ b/blueprints/firefly-iii/template.toml @@ -0,0 +1,36 @@ +[variables] +main_domain = "${domain}" +app_key = "${base64:32}" +db_name = "firefly" +db_user = "firefly" +db_password = "${password:32}" +cron_token = "${hash:32}" +site_owner = "${email}" +timezone = "UTC" +default_language = "en_US" +default_locale = "equal" + +[config] +env = [ + "APP_KEY=base64:${app_key}", + "APP_URL=https://${main_domain}", + "TRUSTED_PROXIES=**", + "TZ=${timezone}", + "SITE_OWNER=${site_owner}", + "DEFAULT_LANGUAGE=${default_language}", + "DEFAULT_LOCALE=${default_locale}", + "DB_DATABASE=${db_name}", + "DB_USERNAME=${db_user}", + "DB_PASSWORD=${db_password}", + "STATIC_CRON_TOKEN=${cron_token}", + "MYSQL_DATABASE=${db_name}", + "MYSQL_USER=${db_user}", + "MYSQL_PASSWORD=${db_password}", + "MYSQL_RANDOM_ROOT_PASSWORD=yes" +] +mounts = [] + +[[config.domains]] +serviceName = "firefly-iii" +port = 8080 +host = "${main_domain}" diff --git a/blueprints/gotify/docker-compose.yml b/blueprints/gotify/docker-compose.yml new file mode 100644 index 00000000..1d3d8265 --- /dev/null +++ b/blueprints/gotify/docker-compose.yml @@ -0,0 +1,11 @@ +services: + gotify: + image: gotify/server:2.9.1 + restart: unless-stopped + volumes: + - gotify_data:/app/data + ports: + - "80" + +volumes: + gotify_data: diff --git a/blueprints/gotify/gotify.svg b/blueprints/gotify/gotify.svg new file mode 100644 index 00000000..29502b8a --- /dev/null +++ b/blueprints/gotify/gotify.svg @@ -0,0 +1,5 @@ + + + + G + diff --git a/blueprints/gotify/template.toml b/blueprints/gotify/template.toml new file mode 100644 index 00000000..2308838a --- /dev/null +++ b/blueprints/gotify/template.toml @@ -0,0 +1,11 @@ +[variables] +main_domain = "${domain}" + +[config] +env = {} +mounts = [] + +[[config.domains]] +serviceName = "gotify" +port = 80 +host = "${main_domain}" diff --git a/blueprints/hermes/docker-compose.yml b/blueprints/hermes/docker-compose.yml new file mode 100644 index 00000000..6e915e33 --- /dev/null +++ b/blueprints/hermes/docker-compose.yml @@ -0,0 +1,27 @@ +version: "3.8" +services: + hermes: + image: nousresearch/hermes-agent:v2026.6.19 + restart: unless-stopped + command: gateway run + ports: + - 9119 + - 8642 + environment: + - HERMES_DASHBOARD=${HERMES_DASHBOARD} + - HERMES_DASHBOARD_BASIC_AUTH_USERNAME=${HERMES_DASHBOARD_BASIC_AUTH_USERNAME} + - HERMES_DASHBOARD_BASIC_AUTH_PASSWORD=${HERMES_DASHBOARD_BASIC_AUTH_PASSWORD} + - HERMES_DASHBOARD_BASIC_AUTH_SECRET=${HERMES_DASHBOARD_BASIC_AUTH_SECRET} + - API_SERVER_ENABLED=${API_SERVER_ENABLED} + - API_SERVER_HOST=${API_SERVER_HOST} + - API_SERVER_KEY=${API_SERVER_KEY} + volumes: + - hermes_data:/opt/data + deploy: + resources: + limits: + memory: 4G + cpus: "2.0" + +volumes: + hermes_data: diff --git a/blueprints/hermes/logo.png b/blueprints/hermes/logo.png new file mode 100644 index 00000000..2d629d2f Binary files /dev/null and b/blueprints/hermes/logo.png differ diff --git a/blueprints/hermes/template.toml b/blueprints/hermes/template.toml new file mode 100644 index 00000000..b028624f --- /dev/null +++ b/blueprints/hermes/template.toml @@ -0,0 +1,33 @@ +[variables] +dashboard_domain = "${domain}" +gateway_domain = "${domain}" +# base64 (not just alphanumeric); 96 bytes -> 128 chars +dashboard_password = "${base64:96}" +dashboard_secret = "${base64:32}" +api_key = "${password:32}" + +[config] +mounts = [] + +# Web dashboard (HERMES_DASHBOARD=1). Exposed behind Traefik, so Hermes' +# auth-gated mode kicks in — protect it with the bundled basic-auth provider. +[[config.domains]] +serviceName = "hermes" +port = 9119 +host = "${dashboard_domain}" + +# OpenAI-compatible gateway API. Disabled and loopback-bound by default, +# so it must be enabled, bound to 0.0.0.0, and given a bearer token. +[[config.domains]] +serviceName = "hermes" +port = 8642 +host = "${gateway_domain}" + +[config.env] +HERMES_DASHBOARD = "1" +HERMES_DASHBOARD_BASIC_AUTH_USERNAME = "admin" +HERMES_DASHBOARD_BASIC_AUTH_PASSWORD = "${dashboard_password}" +HERMES_DASHBOARD_BASIC_AUTH_SECRET = "${dashboard_secret}" +API_SERVER_ENABLED = "true" +API_SERVER_HOST = "0.0.0.0" +API_SERVER_KEY = "${api_key}" diff --git a/blueprints/inkvoice/docker-compose.yml b/blueprints/inkvoice/docker-compose.yml new file mode 100644 index 00000000..bd275006 --- /dev/null +++ b/blueprints/inkvoice/docker-compose.yml @@ -0,0 +1,22 @@ +version: "3.8" +services: + inkvoice: + image: ghcr.io/pigontech/inkvoice:0.1.0 + restart: unless-stopped + environment: + - ADMIN_USER=${ADMIN_USER} + - ADMIN_PASS=${ADMIN_PASS} + - JWT_SECRET=${JWT_SECRET} + - DATABASE_PATH=/app/data/invoice.db + - PORT=3000 + - HOST=0.0.0.0 + # Dokploy's auto-generated domain is HTTP (sslip.io); keep false so login + # works out of the box. Set true once you attach an HTTPS custom domain. + - COOKIE_SECURE=false + volumes: + - inkvoice-data:/app/data + expose: + - 3000 + +volumes: + inkvoice-data: diff --git a/blueprints/inkvoice/inkvoice.svg b/blueprints/inkvoice/inkvoice.svg new file mode 100644 index 00000000..788f0558 --- /dev/null +++ b/blueprints/inkvoice/inkvoice.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/blueprints/inkvoice/template.toml b/blueprints/inkvoice/template.toml new file mode 100644 index 00000000..0ce2dafc --- /dev/null +++ b/blueprints/inkvoice/template.toml @@ -0,0 +1,17 @@ +[variables] +main_domain = "${domain}" +admin_user = "admin" +admin_pass = "${password:16}" +jwt_secret = "${password:48}" + +[config] +env = [ + "ADMIN_USER=${admin_user}", + "ADMIN_PASS=${admin_pass}", + "JWT_SECRET=${jwt_secret}", +] + +[[config.domains]] +serviceName = "inkvoice" +port = 3000 +host = "${main_domain}" diff --git a/blueprints/jellyseerr/docker-compose.yml b/blueprints/jellyseerr/docker-compose.yml new file mode 100644 index 00000000..e17f3ddb --- /dev/null +++ b/blueprints/jellyseerr/docker-compose.yml @@ -0,0 +1,13 @@ +services: + jellyseerr: + image: fallenbagel/jellyseerr:2.7.3 + restart: unless-stopped + volumes: + - jellyseerr_config:/app/config + environment: + LOG_LEVEL: info + ports: + - "5055" + +volumes: + jellyseerr_config: diff --git a/blueprints/jellyseerr/jellyseerr.svg b/blueprints/jellyseerr/jellyseerr.svg new file mode 100644 index 00000000..93840c4a --- /dev/null +++ b/blueprints/jellyseerr/jellyseerr.svg @@ -0,0 +1,5 @@ + + + + J + diff --git a/blueprints/jellyseerr/template.toml b/blueprints/jellyseerr/template.toml new file mode 100644 index 00000000..b41dae81 --- /dev/null +++ b/blueprints/jellyseerr/template.toml @@ -0,0 +1,11 @@ +[variables] +main_domain = "${domain}" + +[config] +env = {} +mounts = [] + +[[config.domains]] +serviceName = "jellyseerr" +port = 5055 +host = "${main_domain}" diff --git a/blueprints/joplin-server/docker-compose.yml b/blueprints/joplin-server/docker-compose.yml new file mode 100644 index 00000000..fefac15b --- /dev/null +++ b/blueprints/joplin-server/docker-compose.yml @@ -0,0 +1,30 @@ +services: + joplin-db: + image: postgres:16-alpine + restart: unless-stopped + environment: + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_DB: ${POSTGRES_DATABASE} + volumes: + - joplin_db_data:/var/lib/postgresql/data + + joplin-server: + image: joplin/server:3.7.1 + restart: unless-stopped + depends_on: + - joplin-db + environment: + APP_BASE_URL: ${APP_BASE_URL} + APP_PORT: ${APP_PORT} + DB_CLIENT: pg + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DATABASE: ${POSTGRES_DATABASE} + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PORT: 5432 + POSTGRES_HOST: joplin-db + ports: + - "22300" + +volumes: + joplin_db_data: diff --git a/blueprints/joplin-server/joplin-server.svg b/blueprints/joplin-server/joplin-server.svg new file mode 100644 index 00000000..93840c4a --- /dev/null +++ b/blueprints/joplin-server/joplin-server.svg @@ -0,0 +1,5 @@ + + + + J + diff --git a/blueprints/joplin-server/template.toml b/blueprints/joplin-server/template.toml new file mode 100644 index 00000000..f8258bc6 --- /dev/null +++ b/blueprints/joplin-server/template.toml @@ -0,0 +1,18 @@ +[variables] +main_domain = "${domain}" +postgres_password = "${password:32}" + +[config] +mounts = [] + +[[config.domains]] +serviceName = "joplin-server" +port = 22300 +host = "${main_domain}" + +[config.env] +APP_BASE_URL = "http://${main_domain}" +APP_PORT = "22300" +POSTGRES_PASSWORD = "${postgres_password}" +POSTGRES_USER = "joplin" +POSTGRES_DATABASE = "joplin" diff --git a/blueprints/ollama-chat-tone/docker-compose.yml b/blueprints/ollama-chat-tone/docker-compose.yml new file mode 100644 index 00000000..8605f824 --- /dev/null +++ b/blueprints/ollama-chat-tone/docker-compose.yml @@ -0,0 +1,21 @@ +services: + ollama-chat-tone: + image: billnice250/chattone:latest + ports: + - 8080 + environment: + APP_NAME: "Ollama Chat Tone" + ADDR: ":8080" + SESSION_SECRET: "${SESSION_SECRET}" + DB_PATH: "/data/app.db" + OLLAMA_URL: "${OLLAMA_URL}" + OLLAMA_TIMEOUT: "${OLLAMA_TIMEOUT}" + DEFAULT_MODEL: "${DEFAULT_MODEL}" + OPEN_BROWSER: "false" + BASIC_AUTH_USER: "${BASIC_AUTH_USER}" + BASIC_AUTH_PASSWORD: "${BASIC_AUTH_PASSWORD}" + volumes: + - ollama-chat-tone-data:/data + +volumes: + ollama-chat-tone-data: {} diff --git a/blueprints/ollama-chat-tone/ollama-chat-tone.svg b/blueprints/ollama-chat-tone/ollama-chat-tone.svg new file mode 100644 index 00000000..b90a86a1 --- /dev/null +++ b/blueprints/ollama-chat-tone/ollama-chat-tone.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/blueprints/ollama-chat-tone/template.toml b/blueprints/ollama-chat-tone/template.toml new file mode 100644 index 00000000..2ab6ae27 --- /dev/null +++ b/blueprints/ollama-chat-tone/template.toml @@ -0,0 +1,32 @@ +[variables] +main_domain = "${domain}" +session_secret = "change-me......32charsOrMore" +ollama_url = "http://your-ollama-host:11434" +ollama_timeout = "5" +default_model = "llama3.2" +basic_auth_user = "admin" +basic_auth_password = "change-me" + +[config] +[[config.domains]] +serviceName = "ollama-chat-tone" +port = 8080 +host = "${main_domain}" +path = "/" + +[config.env] +APP_NAME = "Ollama Chat Tone" +ADDR = ":8080" +SESSION_SECRET = "${session_secret}" +DB_PATH = "/data/app.db" +OLLAMA_URL = "${ollama_url}" +OLLAMA_TIMEOUT = "${ollama_timeout}" +DEFAULT_MODEL = "${default_model}" +OPEN_BROWSER = "false" +BASIC_AUTH_USER = "${basic_auth_user}" +BASIC_AUTH_PASSWORD = "${basic_auth_password}" + +[[config.mounts]] +serviceName = "ollama-chat-tone" +filePath = "/data/app.db" +content = "" diff --git a/blueprints/registry/docker-compose.yml b/blueprints/registry/docker-compose.yml index 08c5c368..a86455d4 100644 --- a/blueprints/registry/docker-compose.yml +++ b/blueprints/registry/docker-compose.yml @@ -1,19 +1,35 @@ services: registry: - restart: always - image: registry:2 - ports: - - 5000 - volumes: - - ../files/auth/registry.password:/auth/registry.password - - registry-data:/var/lib/registry + image: registry:3 + restart: unless-stopped environment: - REGISTRY_STORAGE_DELETE_ENABLED: true - REGISTRY_HEALTH_STORAGEDRIVER_ENABLED: false - REGISTRY_HTTP_SECRET: ${REGISTRY_HTTP_SECRET} - REGISTRY_AUTH: htpasswd - REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm - REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.password + - USERNAME=${USERNAME} + - PASSWORD=${PASSWORD} + - REGISTRY_AUTH=htpasswd + - REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm + - REGISTRY_AUTH_HTPASSWD_PATH=/auth/registry.password + - REGISTRY_HTTP_RELATIVEURLS=true + entrypoint: ["sh", "/entrypoint.sh"] + volumes: + - registry-data:/var/lib/registry + - type: bind + source: ../files/entrypoint.sh + target: /entrypoint.sh + - type: bind + source: ../files/config.yml + target: /etc/docker/registry/config.yml + expose: + - 5000 + healthcheck: + test: + - CMD + - wget + - "-q" + - "--spider" + - "http://localhost:5000/" + interval: 5s + timeout: 20s + retries: 10 volumes: - registry-data: \ No newline at end of file + registry-data: diff --git a/blueprints/registry/template.toml b/blueprints/registry/template.toml index a61ca406..a2a16530 100644 --- a/blueprints/registry/template.toml +++ b/blueprints/registry/template.toml @@ -1,6 +1,7 @@ [variables] main_domain = "${domain}" -registry_http_secret = "${password:30}" +username = "${username}" +password = "${password:32}" [[config.domains]] serviceName = "registry" @@ -8,11 +9,48 @@ port = 5_000 host = "${main_domain}" [config.env] -REGISTRY_HTTP_SECRET = "${registry_http_secret}" +USERNAME = "${username}" +PASSWORD = "${password}" [[config.mounts]] -filePath = "/auth/registry.password" +filePath = "./config.yml" content = """ -# from: docker run --rm --entrypoint htpasswd httpd:2 -Bbn docker password -docker:$2y$10$qWZoWev/u5PV7WneFoRAMuoGpRcAQOgUuIIdLnU7pJXogrBSY23/2 +version: 0.1 + +log: + fields: + service: registry +storage: + cache: + blobdescriptor: inmemory + filesystem: + rootdirectory: /var/lib/registry +http: + addr: :5000 + headers: + X-Content-Type-Options: [nosniff] +health: + storagedriver: + enabled: true + interval: 10s + threshold: 3 +""" + +[[config.mounts]] +filePath = "./entrypoint.sh" +content = """ +#!/usr/bin/env sh + +set -e + +if [ -z "$USERNAME" ] || [ -z "$PASSWORD" ]; then + echo "Error: USERNAME and PASSWORD environment variables must be set" + exit 1 +fi + +apk add --no-cache apache2-utils +mkdir -p "$(dirname "$REGISTRY_AUTH_HTPASSWD_PATH")" +chmod 755 "$(dirname "$REGISTRY_AUTH_HTPASSWD_PATH")" +htpasswd -Bbc "$REGISTRY_AUTH_HTPASSWD_PATH" "$USERNAME" "$PASSWORD" +registry serve /etc/docker/registry/config.yml """ diff --git a/blueprints/sftpgo/docker-compose.yml b/blueprints/sftpgo/docker-compose.yml new file mode 100644 index 00000000..2cd48773 --- /dev/null +++ b/blueprints/sftpgo/docker-compose.yml @@ -0,0 +1,14 @@ +services: + sftpgo: + image: drakkan/sftpgo:v2.7.3 + restart: unless-stopped + volumes: + - sftpgo_data:/srv/sftpgo + - sftpgo_home:/var/lib/sftpgo + ports: + - "8080" + - "2022" + +volumes: + sftpgo_data: + sftpgo_home: diff --git a/blueprints/sftpgo/sftpgo.svg b/blueprints/sftpgo/sftpgo.svg new file mode 100644 index 00000000..1928bbb7 --- /dev/null +++ b/blueprints/sftpgo/sftpgo.svg @@ -0,0 +1,5 @@ + + + + S + diff --git a/blueprints/sftpgo/template.toml b/blueprints/sftpgo/template.toml new file mode 100644 index 00000000..12437970 --- /dev/null +++ b/blueprints/sftpgo/template.toml @@ -0,0 +1,11 @@ +[variables] +main_domain = "${domain}" + +[config] +env = {} +mounts = [] + +[[config.domains]] +serviceName = "sftpgo" +port = 8080 +host = "${main_domain}" diff --git a/blueprints/spliit/docker-compose.yml b/blueprints/spliit/docker-compose.yml new file mode 100644 index 00000000..69b4acd9 --- /dev/null +++ b/blueprints/spliit/docker-compose.yml @@ -0,0 +1,28 @@ +services: + spliit: + image: ghcr.io/spliit-app/spliit:1.19.0 + restart: unless-stopped + env_file: + - .env + depends_on: + spliit-db: + condition: service_healthy + spliit-db: + image: pgvector/pgvector:pg16 + volumes: + - ${DB_DATA_LOCATION}:/var/lib/DBql/data + environment: + POSTGRES_USER: ${DB_USERNAME} + POSTGRES_PASSWORD: ${DB_PASSWORD} + POSTGRES_DB: ${DB_DATABASE:-spliit} + POSTGRES_INITDB_ARGS: '--data-checksums' + POSTGRES_HOST_AUTH_METHOD: trust + healthcheck: + test: + ['CMD', 'pg_isready', '-U', "${DB_USERNAME}", '-d', "${DB_DATABASE:-spliit}"] + interval: 10s + timeout: 5s + retries: 5 + restart: unless-stopped + env_file: + - .env \ No newline at end of file diff --git a/blueprints/spliit/spliit.png b/blueprints/spliit/spliit.png new file mode 100644 index 00000000..3ac8cdb4 Binary files /dev/null and b/blueprints/spliit/spliit.png differ diff --git a/blueprints/spliit/template.toml b/blueprints/spliit/template.toml new file mode 100644 index 00000000..528072ab --- /dev/null +++ b/blueprints/spliit/template.toml @@ -0,0 +1,24 @@ + +[variables] +main_domain = "${domain}" +secret_key = "${password}" +project_name = "spliit" + +[config] +mounts = [] + +[[config.domains]] +serviceName = "spliit" +port = 3000 +host = "${main_domain}" + +[config.env] + +DB_USERNAME = "${project_name}-admin" +DB_PASSWORD = "${secret_key}" +DB_DATA_LOCATION = "/data/${project_name}/database" +DB_DATABASE = "${project_name}" + +# --- PostgreSQL --- +POSTGRES_PRISMA_URL = "postgresql://${DB_USERNAME}:${DB_PASSWORD}@${project_name}-db:5432/${DB_DATABASE}" +POSTGRES_URL_NON_POOLING = "postgresql://${DB_USERNAME}:${DB_PASSWORD}@${project_name}-db:5432/${DB_DATABASE}" \ No newline at end of file diff --git a/meta.json b/meta.json index 1c95f983..5c781fdb 100644 --- a/meta.json +++ b/meta.json @@ -161,11 +161,28 @@ "self-hosted" ] }, + { + "id": "alarik", + "name": "Alarik", + "description": "Alarik is a high-performance, S3-compatible object storage.", + "logo": "alarik.png", + "version": "latest", + "links": { + "github": "https://github.com/achtungsoftware/alarik", + "website": "https://alarik.io/", + "docs": "https://alarik.io/docs" + }, + "tags": [ + "storage", + "s3", + "object-storage" + ] + }, { "id": "alist", "name": "AList", "version": "v3.55.0", - "description": "🗂️A file list/WebDAV program that supports multiple storages, powered by Gin and Solidjs.", + "description": "🗂️A file list/WebDAV program that supports multiple storages, powered by Gin and Solidjs.", "logo": "alist.svg", "links": { "github": "https://github.com/AlistGo/alist", @@ -299,7 +316,7 @@ "id": "anytype", "name": "Anytype", "version": "latest", - "description": "Anytype is a personal knowledge base—your digital brain—that lets you gather, connect and remix all kinds of information. Create pages, tasks, wikis, journals—even entire apps—and define your own data model while your data stays offline-first, private and encrypted across devices.\n\nAfter installation, you can view the Anytype client configuration by running `cat /data/client-config.yml` inside the service container.", + "description": "Anytype is a personal knowledge base—your digital brain—that lets you gather, connect and remix all kinds of information. Create pages, tasks, wikis, journals—even entire apps—and define your own data model while your data stays offline-first, private and encrypted across devices.\n\nAfter installation, you can view the Anytype client configuration by running `cat /data/client-config.yml` inside the service container.", "logo": "logo.png", "links": { "github": "https://github.com/grishy/any-sync-bundle", @@ -414,6 +431,23 @@ "nosql" ] }, + { + "id": "archivebox", + "name": "ArchiveBox", + "version": "latest", + "description": "ArchiveBox is a self-hosted internet archiving solution for saving websites, media, and documents.", + "logo": "archivebox.svg", + "links": { + "github": "https://github.com/ArchiveBox/ArchiveBox", + "website": "https://archivebox.io/", + "docs": "https://docs.archivebox.io/" + }, + "tags": [ + "archive", + "bookmarks", + "web" + ] + }, { "id": "argilla", "name": "Argilla", @@ -511,7 +545,7 @@ "id": "autobase", "name": "Autobase", "version": "2.5.2", - "description": "Autobase for PostgreSQL® is an open-source alternative to cloud-managed databases (self-hosted DBaaS).", + "description": "Autobase for PostgreSQL® is an open-source alternative to cloud-managed databases (self-hosted DBaaS).", "links": { "github": "https://github.com/vitabaks/autobase", "website": "https://autobase.tech/", @@ -721,7 +755,7 @@ "id": "blender", "name": "Blender", "version": "latest", - "description": "Blender is a free and open-source 3D creation suite. It supports the entire 3D pipeline—modeling, rigging, animation, simulation, rendering, compositing and motion tracking, video editing and 2D animation pipeline.", + "description": "Blender is a free and open-source 3D creation suite. It supports the entire 3D pipeline—modeling, rigging, animation, simulation, rendering, compositing and motion tracking, video editing and 2D animation pipeline.", "logo": "blender.svg", "links": { "github": "https://github.com/linuxserver/docker-blender", @@ -1087,6 +1121,24 @@ "Notifications" ] }, + { + "id": "chatto", + "name": "Chatto (single binary)", + "version": "0.3.8", + "description": "A fully-featured real-time chat application for teams and communities. This template deploys the single Chatto binary with embedded NATS. Note: email/password registration requires SMTP to be configured after deployment; voice/video calls are not included in the single-binary setup.", + "logo": "logo.png", + "links": { + "github": "https://github.com/chattocorp/chatto", + "website": "https://chatto.run", + "docs": "https://docs.chatto.run" + }, + "tags": [ + "chat", + "communication", + "messaging", + "self-hosted" + ] + }, { "id": "chatwoot", "name": "Chatwoot", @@ -1799,6 +1851,23 @@ "discussion" ] }, + { + "id": "dockge", + "name": "Dockge", + "version": "1", + "description": "Dockge is a reactive, self-hosted Docker Compose stack manager from the creator of Uptime Kuma.", + "logo": "dockge.svg", + "links": { + "github": "https://github.com/louislam/dockge", + "website": "https://dockge.kuma.pet/", + "docs": "https://github.com/louislam/dockge" + }, + "tags": [ + "docker", + "compose", + "management" + ] + }, { "id": "docling-serve", "name": "Docling Serve", @@ -2292,6 +2361,23 @@ "storage" ] }, + { + "id": "filegator", + "name": "FileGator", + "version": "7.14.3", + "description": "FileGator is a simple self-hosted web file manager with multi-user support.", + "logo": "filegator.svg", + "links": { + "github": "https://github.com/filegator/filegator", + "website": "https://filegator.io/", + "docs": "https://docs.filegator.io/" + }, + "tags": [ + "files", + "file-manager", + "self-hosted" + ] + }, { "id": "filestash", "name": "Filestash", @@ -2328,6 +2414,23 @@ "llm" ] }, + { + "id": "firefly-iii", + "name": "Firefly III", + "version": "6.6.3", + "description": "Firefly III is a self-hosted personal finance manager for tracking expenses, budgets, accounts, and financial reports.", + "logo": "logo.svg", + "links": { + "github": "https://github.com/firefly-iii/firefly-iii", + "website": "https://www.firefly-iii.org/", + "docs": "https://docs.firefly-iii.org/" + }, + "tags": [ + "finance", + "budgeting", + "self-hosted" + ] + }, { "id": "fivem", "name": "FiveM Server", @@ -2866,6 +2969,23 @@ "tools" ] }, + { + "id": "gotify", + "name": "Gotify", + "version": "2.9.1", + "description": "Gotify is a simple server for sending and receiving self-hosted push notifications.", + "logo": "gotify.svg", + "links": { + "github": "https://github.com/gotify/server", + "website": "https://gotify.net/", + "docs": "https://gotify.net/docs/" + }, + "tags": [ + "notifications", + "self-hosted", + "push" + ] + }, { "id": "grafana", "name": "Grafana", @@ -2935,6 +3055,24 @@ "self-hosted" ] }, + { + "id": "hermes", + "name": "Hermes", + "version": "v2026.6.19", + "description": "Hermes is an open agent runtime from Nous Research, exposing an OpenAI-compatible gateway API and a supervised web dashboard for building and running AI agents.", + "logo": "logo.png", + "links": { + "github": "https://github.com/NousResearch/hermes-agent", + "website": "https://hermes-agent.nousresearch.com/", + "docs": "https://hermes-agent.nousresearch.com/docs/user-guide/docker" + }, + "tags": [ + "ai", + "agent", + "llm", + "self-hosted" + ] + }, { "id": "heyform", "name": "HeyForm", @@ -3085,7 +3223,7 @@ "id": "huly", "name": "Huly", "version": "0.6.377", - "description": "Huly — All-in-One Project Management Platform (alternative to Linear, Jira, Slack, Notion, Motion)", + "description": "Huly — All-in-One Project Management Platform (alternative to Linear, Jira, Slack, Notion, Motion)", "logo": "huly.svg", "links": { "github": "https://github.com/hcengineering/huly-selfhost", @@ -3208,6 +3346,24 @@ "database" ] }, + { + "id": "inkvoice", + "name": "Inkvoice", + "version": "0.1.0", + "description": "Open-source invoicing for freelancers and small teams: invoices, online payments (Stripe & PayPal), expenses, multi-currency and reports.", + "logo": "inkvoice.svg", + "links": { + "github": "https://github.com/pigontech/inkvoice", + "website": "https://inkvoice.app", + "docs": "https://docs.inkvoice.app" + }, + "tags": [ + "invoicing", + "billing", + "finance", + "self-hosted" + ] + }, { "id": "inngest", "name": "Inngest", @@ -3328,6 +3484,23 @@ "media system" ] }, + { + "id": "jellyseerr", + "name": "Jellyseerr", + "version": "2.7.3", + "description": "Jellyseerr is a media request and discovery manager for Jellyfin, Plex, and Emby users.", + "logo": "jellyseerr.svg", + "links": { + "github": "https://github.com/Fallenbagel/jellyseerr", + "website": "https://docs.jellyseerr.dev/", + "docs": "https://docs.jellyseerr.dev/" + }, + "tags": [ + "media", + "requests", + "jellyfin" + ] + }, { "id": "jenkins", "name": "jenkins", @@ -3365,6 +3538,23 @@ "webrtc" ] }, + { + "id": "joplin-server", + "name": "Joplin Server", + "version": "3.7.1", + "description": "Joplin Server is the self-hosted sync backend for Joplin notes, notebooks, and attachments.", + "logo": "joplin-server.svg", + "links": { + "github": "https://github.com/laurent22/joplin", + "website": "https://joplinapp.org/", + "docs": "https://github.com/laurent22/joplin/tree/dev/packages/server" + }, + "tags": [ + "notes", + "sync", + "productivity" + ] + }, { "id": "kaneo", "name": "Kaneo", @@ -3609,7 +3799,7 @@ "id": "librechat", "name": "LibreChat", "version": "latest", - "description": "LibreChat is the ultimate open-source app for all your AI conversations, fully customizable and compatible with any AI provider (Openai, Ollama, Google etc.) — all in one sleek interface.", + "description": "LibreChat is the ultimate open-source app for all your AI conversations, fully customizable and compatible with any AI provider (Openai, Ollama, Google etc.) — all in one sleek interface.", "logo": "librechat.png", "links": { "github": "https://github.com/danny-avila/librechat", @@ -4550,6 +4740,24 @@ "academic" ] }, + { + "id": "ollama-chat-tone", + "name": "Ollama Chat Tone", + "version": "latest", + "description": "Self-contained Ollama chat client with local auth, streaming responses, and per-user conversations.", + "logo": "ollama-chat-tone.svg", + "links": { + "github": "https://github.com/billnice250/ollama-chat-client", + "website": "https://hub.docker.com/r/billnice250/chattone", + "docs": "https://hub.docker.com/r/billnice250/chattone" + }, + "tags": [ + "chatbot", + "ai", + "ollama", + "docker" + ] + }, { "id": "omni-tools", "name": "Omni-Tools", @@ -5018,7 +5226,7 @@ "id": "photoprism", "name": "Photoprism", "version": "latest", - "description": "PhotoPrism® is an AI-Powered Photos App for the Decentralized Web. It makes use of the latest technologies to tag and find pictures automatically without getting in your way.", + "description": "PhotoPrism® is an AI-Powered Photos App for the Decentralized Web. It makes use of the latest technologies to tag and find pictures automatically without getting in your way.", "logo": "photoprism.svg", "links": { "github": "https://github.com/photoprism/photoprism", @@ -5759,6 +5967,23 @@ "file-system" ] }, + { + "id": "sftpgo", + "name": "SFTPGo", + "version": "2.7.3", + "description": "SFTPGo is a full-featured and highly configurable SFTP, HTTP/S, FTP/S, and WebDAV server.", + "logo": "sftpgo.svg", + "links": { + "github": "https://github.com/drakkan/sftpgo", + "website": "https://sftpgo.com/", + "docs": "https://docs.sftpgo.com/" + }, + "tags": [ + "sftp", + "files", + "webdav" + ] + }, { "id": "shlink", "name": "Shlink", @@ -5882,6 +6107,23 @@ "storage" ] }, + { + "id": "spliit", + "name": "Spliit", + "version": "latest", + "description": "Spliit is a lightweight, self-hosted alternative to Auth0 and Clerk. Open-source, cost-effective, and developer-friendly, it provides secure authentication (OAuth, email/password, social logins) with full control over your data. No per-user fees, easy to integrate, and perfect for startups or privacy-focused projects.", + "logo": "spliit.png", + "links": { + "github": "https://github.com/spliit-app/spliit", + "website": "https://spliit.app/", + "docs": "https://github.com/spliit-app" + }, + "tags": [ + "budgeting", + "finance", + "money" + ] + }, { "id": "stack-auth", "name": "Stack Auth", @@ -6049,7 +6291,7 @@ "id": "surrealdb", "name": "SurrealDB", "version": "2.3.10", - "description": "SurrealDB is a native, open-source, multi-model database that lets you store and manage data across relational, document, graph, time-series, vector & search, and geospatial models—all in one place.", + "description": "SurrealDB is a native, open-source, multi-model database that lets you store and manage data across relational, document, graph, time-series, vector & search, and geospatial models—all in one place.", "logo": "surrealdb.svg", "links": { "github": "https://github.com/surrealdb/surrealdb", @@ -6321,7 +6563,7 @@ "id": "typecho", "name": "Typecho", "version": "stable", - "description": "Typecho 是一个轻量级的开源博客程序,基于 PHP 开发,支持多种数据库,简洁而强大。", + "description": "Typecho 是一个轻量级的开源博客程序,基于 PHP 开发,支持多种数据库,简洁而强大。", "logo": "typecho.png", "links": { "github": "https://github.com/typecho/typecho",