Remove dups

This commit is contained in:
Mike McFetridge
2026-07-24 15:42:46 -04:00
parent 84e1ead50c
commit b78378565a
345 changed files with 0 additions and 40650 deletions
@@ -1,112 +0,0 @@
---
services:
<< service_name >>:
image: docker.io/adguard/adguardhome:v0.107.74
restart: << restart_policy >>
<%- if network_mode == 'host' %>
network_mode: host
<%- elif network_mode == 'bridge' or network_mode == 'macvlan' or traefik_enabled %>
networks:
<%- if traefik_enabled %>
<< traefik_network >>:
<%- endif %>
<%- if network_mode == 'macvlan' %>
<< network_name >>:
ipv4_address: << network_macvlan_ipv4_address >>
<%- elif network_mode == 'bridge' %>
<< network_name >>:
<%- endif %>
<%- endif %>
<%- if not network_mode or network_mode == 'bridge' or traefik_enabled %>
ports:
<%- if not traefik_enabled %>
- "<< ports_http >>:80/tcp"
- "<< ports_https >>:443/tcp"
<%- endif %>
<%- if initial_setup %>
- "<< ports_initial >>:3000/tcp"
<%- endif %>
- "<< ports_https >>:443/udp"
- "<< ports_dns >>:53/tcp"
- "<< ports_dns >>:53/udp"
- "<< ports_tls >>:853/tcp"
- "<< ports_dnscrypt >>:5443/tcp"
- "<< ports_dnscrypt >>:5443/udp"
<%- endif %>
volumes:
<%- if volume_mode == 'mount' %>
- << volume_mount_path >>/work:/opt/adguardhome/work:rw
- << volume_mount_path >>/conf:/opt/adguardhome/conf:rw
<%- else %>
- << service_name >>_work:/opt/adguardhome/work
- << service_name >>_conf:/opt/adguardhome/conf
<%- endif %>
cap_add:
- NET_ADMIN
- NET_BIND_SERVICE
- NET_RAW
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>_web.loadBalancer.server.port=80
- traefik.http.routers.<< service_name >>_web_http.service=<< service_name >>_web
- traefik.http.routers.<< service_name >>_web_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>_web_http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>_web_https.service=<< service_name >>_web
- traefik.http.routers.<< service_name >>_web_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>_web_https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>_web_https.tls=true
- traefik.http.routers.<< service_name >>_web_https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
<%- if network_mode == 'bridge' or network_mode == 'macvlan' or traefik_enabled %>
networks:
<%- if network_mode == 'bridge' or network_mode == 'macvlan'%>
<< network_name >>:
<%- if network_external %>
external: true
<%- else %>
<%- if network_mode == 'macvlan' %>
driver: macvlan
driver_opts:
parent: << network_macvlan_parent_interface >>
ipam:
config:
- subnet: << network_macvlan_subnet >>
gateway: << network_macvlan_gateway >>
name: << network_name >>
<%- else %>
driver: bridge
<%- endif %>
<%- endif %>
<%- endif %>
<%- if traefik_enabled %>
<< traefik_network >>:
external: true
<%- endif %>
<%- endif %>
<%- if volume_mode == 'local' %>
volumes:
<< service_name >>_work:
driver: local
<< service_name >>_conf:
driver: local
<%- elif volume_mode == 'nfs' %>
volumes:
<< service_name >>_work:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>/work"
<< service_name >>_conf:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>/conf"
<%- endif %>
-373
View File
@@ -1,373 +0,0 @@
{
"slug": "adguardhome",
"kind": "compose",
"metadata": {
"name": "AdGuard Home",
"description": "Network-wide DNS-based ad and tracker blocker. AdGuard Home operates as a DNS server that blocks tracking domains, with support for DNS-over-HTTPS, DNS-over-TLS, DNS-over-QUIC, parental controls, and safe browsing filters.",
"tags": [
"traefik",
"network",
"volume"
],
"icon": {
"provider": "selfhst",
"id": "adguard-home"
},
"draft": false,
"version": {
"name": "v0.107.74",
"source_dep_name": "docker.io/adguard/adguardhome",
"source_dep_version": "v0.107.74"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "adguardhome",
"config": {
"placeholder": "adguardhome"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
},
{
"name": "initial_setup",
"type": "bool",
"title": "Initial Setup",
"required": false,
"default": true,
"description": "Enable initial setup wizard on port 3000 (only used without Traefik)"
}
]
},
{
"title": "Network",
"name": "network",
"items": [
{
"name": "network_mode",
"type": "str",
"title": "Network Mode",
"required": false
},
{
"name": "network_name",
"type": "str",
"title": "Network Name",
"required": false,
"default": "adguardhome_network",
"config": {
"placeholder": "adguardhome_network"
}
},
{
"name": "network_macvlan_ipv4_address",
"type": "str",
"title": "IPv4 Address",
"required": true,
"default": "IP_ADDRESS",
"needs": [
"network_mode=macvlan"
],
"config": {
"placeholder": "IP_ADDRESS"
}
},
{
"name": "network_macvlan_parent_interface",
"type": "str",
"title": "Parent Interface",
"required": true,
"default": "eth0",
"needs": [
"network_mode=macvlan"
],
"config": {
"placeholder": "eth0"
}
},
{
"name": "network_macvlan_subnet",
"type": "str",
"title": "Subnet",
"required": true,
"default": "IP_RANGE",
"needs": [
"network_mode=macvlan"
],
"config": {
"placeholder": "IP_RANGE"
}
},
{
"name": "network_macvlan_gateway",
"type": "str",
"title": "Gateway",
"required": true,
"default": "GATEWAY",
"needs": [
"network_mode=macvlan"
],
"config": {
"placeholder": "GATEWAY"
}
},
{
"name": "network_external",
"type": "bool",
"title": "External Network",
"required": false,
"default": false
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_http",
"type": "str",
"title": "HTTP Port",
"required": false,
"default": 80,
"config": {
"placeholder": "80"
}
},
{
"name": "ports_https",
"type": "str",
"title": "HTTPS Port",
"required": false,
"default": 443,
"config": {
"placeholder": "443"
}
},
{
"name": "ports_dns",
"type": "int",
"title": "DNS Port",
"required": true,
"default": 53,
"config": {
"placeholder": "53"
}
},
{
"name": "ports_initial",
"type": "int",
"title": "Initial Setup Port",
"required": false,
"default": 3000,
"description": "Initial setup wizard port (only when Traefik is disabled)",
"needs": [
"traefik_enabled=false",
"initial_setup=true"
],
"config": {
"placeholder": "3000"
}
},
{
"name": "ports_tls",
"type": "int",
"title": "DoT Port",
"required": true,
"default": 853,
"config": {
"placeholder": "853"
}
},
{
"name": "ports_dnscrypt",
"type": "int",
"title": "DNSCrypt Port",
"required": true,
"default": 5443,
"config": {
"placeholder": "5443"
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "adguardhome"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
},
{
"title": "Volume",
"name": "volume",
"items": [
{
"name": "volume_mode",
"type": "enum",
"title": "Volume Mode",
"required": true,
"default": "local",
"config": {
"options": [
"local",
"mount",
"nfs"
]
}
},
{
"name": "volume_mount_path",
"type": "str",
"title": "Volume Mount Path",
"required": true,
"default": "/data",
"needs": [
"volume_mode=mount"
],
"config": {
"placeholder": "/data"
}
},
{
"name": "volume_nfs_server",
"type": "str",
"title": "Volume Nfs Server",
"required": true,
"default": "NFS_SERVER",
"needs": [
"volume_mode=nfs"
],
"config": {
"placeholder": "NFS_SERVER"
}
},
{
"name": "volume_nfs_path",
"type": "str",
"title": "Volume Nfs Path",
"required": true,
"default": "/export",
"needs": [
"volume_mode=nfs"
],
"config": {
"placeholder": "/export"
}
},
{
"name": "volume_nfs_options",
"type": "str",
"title": "Volume Nfs Options",
"required": true,
"default": "rw,nolock,soft",
"needs": [
"volume_mode=nfs"
],
"config": {
"placeholder": "rw,nolock,soft"
}
}
]
}
]
}
-62
View File
@@ -1,62 +0,0 @@
services:
<< service_name >>:
image: docker.io/grafana/alloy:v1.16.0
restart: << restart_policy >>
<%- if container_hostname %>
hostname: << container_hostname >>
<%- endif %>
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
<%- endif %>
command:
- run
- /etc/alloy/alloy.d/
- --server.http.listen-addr=127.0.0.1:12345
<%- if not traefik_enabled %>
ports:
- "<< ports_webui >>:12345"
<%- endif %>
volumes:
- << service_name >>_data:/alloy/data
- ./config:/etc/alloy/alloy.d/:ro
<%- if logs_enabled or metrics_enabled %>
- /:/rootfs:ro
- /sys:/sys:ro
<%- endif %>
<%- if logs_enabled and logs_system %>
- /run:/run:ro
- /var/log:/var/log:ro
<%- endif %>
<%- if (logs_enabled and logs_docker) or (metrics_enabled and metrics_docker) %>
- /var/lib/docker/:/var/lib/docker/:ro
<%- endif %>
<%- if metrics_enabled and metrics_system %>
- /run/udev/data:/run/udev/data:ro
<%- endif %>
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>-web.loadBalancer.server.port=12345
- traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>-https.tls=true
- traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
external: true
<%- endif %>
volumes:
<< service_name >>_data:
driver: local
@@ -1,4 +0,0 @@
logging {
level = "info"
format = "logfmt"
}
@@ -1,23 +0,0 @@
<%- if logs_enabled and logs_docker %>
discovery.docker "dockerlogs" {
host = "unix:///var/run/docker.sock"
}
discovery.relabel "dockerlogs" {
targets = []
rule {
source_labels = ["__meta_docker_container_name"]
regex = "/(.*)"
target_label = "service_name"
}
}
loki.source.docker "default" {
host = "unix:///var/run/docker.sock"
targets = discovery.docker.dockerlogs.targets
labels = {"platform" = "docker"}
relabel_rules = discovery.relabel.dockerlogs.rules
forward_to = [loki.write.default.receiver]
}
<%- endif %>
@@ -1,44 +0,0 @@
<%- if logs_enabled and logs_system %>
loki.source.journal "journal" {
max_age = "24h0m0s"
relabel_rules = discovery.relabel.journal.rules
forward_to = [loki.write.default.receiver]
labels = {component = string.format("%s-journal", constants.hostname)}
// NOTE: This is important to fix https://github.com/grafana/alloy/issues/924
path = "/var/log/journal"
}
local.file_match "system" {
path_targets = [{
__address__ = "localhost",
__path__ = "/var/log/{syslog,messages,*.log}",
instance = constants.hostname,
job = string.format("%s-logs", constants.hostname),
}]
}
discovery.relabel "journal" {
targets = []
rule {
source_labels = ["__journal__systemd_unit"]
target_label = "unit"
}
rule {
source_labels = ["__journal__boot_id"]
target_label = "boot_id"
}
rule {
source_labels = ["__journal__transport"]
target_label = "transport"
}
rule {
source_labels = ["__journal_priority_keyword"]
target_label = "level"
}
}
loki.source.file "system" {
targets = local.file_match.system.targets
forward_to = [loki.write.default.receiver]
}
<%- endif %>
@@ -1,23 +0,0 @@
<%- if metrics_enabled and metrics_docker %>
prometheus.exporter.cadvisor "dockermetrics" {
docker_host = "unix:///var/run/docker.sock"
storage_duration = "5m"
}
/* Relabel component to drop container_spec metrics that often have NaN values */
prometheus.relabel "docker_filter" {
forward_to = [prometheus.remote_write.default.receiver]
rule {
source_labels = ["__name__"]
regex = "container_spec_(cpu_period|cpu_quota|cpu_shares|memory_limit_bytes|memory_swap_limit_bytes|memory_reservation_limit_bytes)"
action = "drop"
}
}
prometheus.scrape "dockermetrics" {
targets = prometheus.exporter.cadvisor.dockermetrics.targets
forward_to = [prometheus.relabel.docker_filter.receiver]
scrape_interval = "10s"
}
<%- endif %>
@@ -1,36 +0,0 @@
<%- if metrics_enabled and metrics_system %>
discovery.relabel "metrics" {
targets = prometheus.exporter.unix.metrics.targets
rule {
target_label = "instance"
replacement = constants.hostname
}
rule {
target_label = "job"
replacement = string.format("%s-metrics", constants.hostname)
}
}
prometheus.exporter.unix "metrics" {
disable_collectors = ["ipvs", "btrfs", "infiniband", "xfs", "zfs"]
enable_collectors = ["meminfo"]
rootfs_path = "/rootfs"
filesystem {
fs_types_exclude = "^(autofs|binfmt_misc|bpf|cgroup2?|configfs|debugfs|devpts|devtmpfs|tmpfs|fusectl|hugetlbfs|iso9660|mqueue|nsfs|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|selinuxfs|squashfs|sysfs|tracefs)$"
mount_points_exclude = "^/(dev|proc|run/credentials/.+|sys|var/lib/docker/.+)($|/)"
mount_timeout = "5s"
}
netclass {
ignored_devices = "^(veth.*|cali.*|[a-f0-9]{15})$"
}
netdev {
device_exclude = "^(veth.*|cali.*|[a-f0-9]{15})$"
}
}
prometheus.scrape "metrics" {
scrape_interval = "15s"
targets = discovery.relabel.metrics.output
forward_to = [prometheus.remote_write.default.receiver]
}
<%- endif %>
@@ -1,20 +0,0 @@
<%- if logs_enabled %>
loki.write "default" {
endpoint {
url = "<< logs_loki_url >>"
// Batching configuration to reduce request volume and prevent rate limiting
batch_wait = "5s" // Wait up to 5 seconds before sending
batch_size = "1MiB" // Send when batch reaches 1MB (1048576 bytes)
}
external_labels = {}
}
<%- endif %>
<%- if metrics_enabled %>
prometheus.remote_write "default" {
endpoint {
url = "<< metrics_prometheus_url >>"
}
}
<%- endif %>
-239
View File
@@ -1,239 +0,0 @@
{
"slug": "alloy",
"kind": "compose",
"metadata": {
"name": "Grafana Alloy",
"description": "OpenTelemetry collector by Grafana that collects, processes, and exports metrics and logs to various backends like Prometheus and Loki.",
"tags": [
"traefik"
],
"icon": {
"provider": "selfhst",
"id": "grafana-alloy"
},
"draft": false,
"version": {
"name": "v1.16.0",
"source_dep_name": "docker.io/grafana/alloy",
"source_dep_version": "v1.16.0"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "alloy",
"config": {
"placeholder": "alloy"
}
},
{
"name": "container_hostname",
"type": "str",
"title": "Hostname",
"required": false
},
{
"name": "restart_policy",
"type": "enum",
"title": "Container restart policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
}
]
},
{
"title": "Log Collection",
"toggle": "logs_enabled",
"name": "logs",
"items": [
{
"name": "logs_docker",
"type": "bool",
"title": "Docker Logs",
"required": false,
"default": true
},
{
"name": "logs_enabled",
"type": "bool",
"title": "Logs",
"required": false,
"default": false
},
{
"name": "logs_loki_url",
"type": "str",
"title": "Loki URL",
"required": true,
"default": "http://loki:3100/loki/api/v1/push",
"description": "Loki endpoint URL for sending logs",
"config": {
"placeholder": "http://loki:3100/loki/api/v1/push"
}
},
{
"name": "logs_system",
"type": "bool",
"title": "System Logs",
"required": false,
"default": true
}
]
},
{
"title": "Metrics Collection",
"toggle": "metrics_enabled",
"name": "metrics",
"items": [
{
"name": "metrics_docker",
"type": "bool",
"title": "Docker Metrics",
"required": false,
"default": true
},
{
"name": "metrics_enabled",
"type": "bool",
"title": "Metrics",
"required": false,
"default": false
},
{
"name": "metrics_prometheus_url",
"type": "str",
"title": "Prometheus URL",
"required": true,
"default": "http://prometheus:9090/api/v1/write",
"config": {
"placeholder": "http://prometheus:9090/api/v1/write"
}
},
{
"name": "metrics_system",
"type": "bool",
"title": "System Metrics",
"required": false,
"default": true
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_webui",
"type": "int",
"title": "Web UI Port",
"required": false,
"default": 12345,
"description": "Port for Alloy web UI",
"config": {
"placeholder": "12345"
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "alloy"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Traefik network name",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
}
]
}
-2
View File
@@ -1,2 +0,0 @@
# Arcane agent token generated by Arcane when creating a remote environment.
ARCANE_AGENT_TOKEN='<< agent_token >>'
@@ -1,46 +0,0 @@
---
services:
<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane-agent' >>:
image: ghcr.io/getarcaneapp/agent:v2.1.0
restart: << restart_policy >>
<%- if container_name is string and container_name and (container_name | lower) not in ['true', 'false'] %>
container_name: << container_name >>
<%- endif %>
environment:
<%- if connection_mode == 'direct' %>
AGENT_MODE: "true"
<%- elif connection_mode == 'edge' %>
EDGE_AGENT: "true"
<%- endif %>
EDGE_TRANSPORT: "<< edge_transport >>"
AGENT_TOKEN: "${ARCANE_AGENT_TOKEN}"
MANAGER_API_URL: "<< manager_api_url >>"
TZ: "<< container_timezone >>"
volumes:
- << docker_socket_path >>:/var/run/docker.sock
<%- if volume_mode == 'mount' and volume_mount_path %>
- << volume_mount_path >>:/app/data
<%- else %>
- << service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane-agent' >>-data:/app/data
<%- endif %>
<%- if project_mount_path %>
- << project_mount_path >>:/app/data/projects
<%- endif %>
<%- if connection_mode == 'direct' %>
ports:
- "<< ports_agent >>:3553"
<%- endif %>
<%- if volume_mode == 'local' or (volume_mode == 'mount' and not volume_mount_path) %>
volumes:
<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane-agent' >>-data:
driver: local
<%- elif volume_mode == 'nfs' %>
volumes:
<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane-agent' >>-data:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>"
<%- endif %>
-247
View File
@@ -1,247 +0,0 @@
{
"slug": "arcane-agent",
"kind": "compose",
"metadata": {
"name": "Arcane Agent",
"description": "Remote Docker host agent for Arcane manager environments, supporting direct inbound and edge outbound connection modes.",
"tags": [
"docker",
"management",
"agent"
],
"icon": {
"provider": "selfhst",
"id": "arcane",
"color": "violet"
},
"draft": false,
"version": {
"name": "v2.1.0",
"source_dep_name": "ghcr.io/getarcaneapp/agent",
"source_dep_version": "v2.1.0"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"description": "Name of the Docker Compose service. Leave empty to omit/fall back to Arcane defaults.",
"config": {
"placeholder": "arcane-agent"
}
},
{
"name": "container_name",
"type": "str",
"title": "Container Name",
"required": false,
"description": "Name to use for the container. Leave empty to omit/fall back to Arcane defaults.",
"config": {
"placeholder": "arcane-agent"
}
},
{
"name": "container_timezone",
"type": "str",
"title": "Container Timezone",
"required": false,
"config": {
"placeholder": "Europe/Berlin"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
},
{
"name": "docker_socket_path",
"type": "str",
"title": "Docker Socket Path",
"required": true,
"default": "/var/run/docker.sock",
"config": {
"placeholder": "/var/run/docker.sock"
}
}
]
},
{
"title": "Advanced",
"name": "advanced",
"items": [
{
"name": "project_mount_path",
"type": "str",
"title": "Project Mount Path",
"required": false,
"description": "Optional host path mounted to /app/data/projects for agent-visible project/Compose stack storage. Leave empty to skip this mount.",
"config": {
"placeholder": "/path/to/projects"
}
}
]
},
{
"title": "Agent Connection",
"name": "connection",
"items": [
{
"name": "connection_mode",
"type": "enum",
"title": "Connection Mode",
"required": false,
"default": "direct",
"description": "Direct exposes TCP 3553 for the manager to connect inbound. Edge connects outbound from the agent to the manager.",
"config": {
"options": [
"direct",
"edge"
]
}
},
{
"name": "edge_transport",
"type": "enum",
"title": "Transport Mode",
"required": false,
"default": "poll",
"description": "Arcane agent transport. Official generated snippets default to poll; auto keeps a live tunnel when possible.",
"config": {
"options": [
"poll",
"auto"
]
}
},
{
"name": "manager_api_url",
"type": "str",
"title": "Manager API URL",
"required": true,
"default": "http://arcane:3552",
"description": "Arcane manager API URL reachable from the agent.",
"config": {
"placeholder": "https://arcane.example.com"
}
},
{
"name": "agent_token",
"type": "secret",
"title": "Agent Token",
"required": true,
"description": "Agent token generated by Arcane when creating the remote environment."
}
]
},
{
"title": "Storage",
"name": "storage",
"items": [
{
"name": "volume_mode",
"type": "enum",
"title": "Volume Mode",
"required": false,
"default": "local",
"config": {
"options": [
"local",
"mount",
"nfs"
]
}
},
{
"name": "volume_mount_path",
"type": "str",
"title": "Data Mount Path",
"required": false,
"default": "",
"description": "Host path for agent data when using mount mode.",
"needs": [
"volume_mode=mount"
],
"config": {
"placeholder": "/opt/arcane-agent/data"
}
},
{
"name": "volume_nfs_server",
"type": "str",
"title": "NFS Server",
"required": false,
"default": "",
"needs": [
"volume_mode=nfs"
],
"config": {
"placeholder": "nas.home.arpa"
}
},
{
"name": "volume_nfs_path",
"type": "str",
"title": "NFS Path",
"required": false,
"default": "",
"description": "NFS export path for Arcane agent data.",
"needs": [
"volume_mode=nfs"
],
"config": {
"placeholder": "/export/app"
}
},
{
"name": "volume_nfs_options",
"type": "str",
"title": "NFS Options",
"required": false,
"default": "rw",
"needs": [
"volume_mode=nfs"
],
"config": {
"placeholder": "rw"
}
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_agent",
"type": "int",
"title": "Agent Port",
"required": false,
"default": 3553,
"needs": [
"connection_mode=direct"
],
"config": {
"placeholder": "3553"
}
}
]
}
]
}
-7
View File
@@ -1,7 +0,0 @@
# Arcane manager secrets
# ENCRYPTION_KEY must be 32 bytes. For a hex value, use: openssl rand -hex 32
ARCANE_ENCRYPTION_KEY='<< encryption_key >>'
ARCANE_JWT_SECRET='<< jwt_secret >>'
<%- if oidc_enabled %>
ARCANE_OIDC_CLIENT_SECRET='<< oidc_client_secret >>'
<%- endif %>
-100
View File
@@ -1,100 +0,0 @@
---
services:
<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>:
image: ghcr.io/getarcaneapp/manager:v2.1.0
restart: << restart_policy >>
<%- if container_name is string and container_name and (container_name | lower) not in ['true', 'false'] %>
container_name: << container_name >>
<%- endif %>
environment:
APP_URL: "<< app_url >>"
<%- if puid %>
PUID: "<< puid >>"
<%- endif %>
<%- if pgid %>
PGID: "<< pgid >>"
<%- endif %>
ENCRYPTION_KEY: "${ARCANE_ENCRYPTION_KEY}"
JWT_SECRET: "${ARCANE_JWT_SECRET}"
TZ: "<< container_timezone >>"
<%- if analytics_enabled %>
ANALYTICS_DISABLED: "false"
<%- endif %>
<%- if oidc_enabled %>
OIDC_ENABLED: "true"
OIDC_CLIENT_ID: "<< oidc_client_id >>"
OIDC_CLIENT_SECRET: "${ARCANE_OIDC_CLIENT_SECRET}"
OIDC_ISSUER_URL: "<< oidc_issuer_url >>"
<%- if oidc_provider_name %>
OIDC_PROVIDER_NAME: "<< oidc_provider_name >>"
<%- endif %>
<%- if oidc_scopes %>
OIDC_SCOPES: "<< oidc_scopes >>"
<%- endif %>
<%- if oidc_groups_claim %>
OIDC_GROUPS_CLAIM: "<< oidc_groups_claim >>"
<%- endif %>
<%- if oidc_role_mappings %>
OIDC_ROLE_MAPPINGS: '<< oidc_role_mappings >>'
<%- endif %>
<%- endif %>
volumes:
- << docker_socket_path >>:/var/run/docker.sock
<%- if volume_mode == 'mount' and volume_mount_path %>
- << volume_mount_path >>:/app/data
<%- else %>
- << service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-data:/app/data
<%- endif %>
<%- if project_mount_path %>
- << project_mount_path >>:/app/data/projects
<%- endif %>
<%- if builds_mount_path %>
- << builds_mount_path >>:/builds
<%- endif %>
<%- if backups_mount_path %>
- << backups_mount_path >>:/backups
<%- endif %>
<%- if traefik_enabled %>
networks:
- << traefik_network >>
<%- endif %>
<%- if not traefik_enabled %>
ports:
- "<< ports_http >>:3552"
<%- endif %>
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-web.loadBalancer.server.port=3552
- traefik.http.routers.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-http.service=<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-web
- traefik.http.routers.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-https.service=<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-web
- traefik.http.routers.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-https.tls=true
- traefik.http.routers.<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
<%- if volume_mode == 'local' or (volume_mode == 'mount' and not volume_mount_path) %>
volumes:
<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-data:
driver: local
<%- elif volume_mode == 'nfs' %>
volumes:
<< service_name if service_name is string and service_name and (service_name | lower) not in ['true', 'false'] else 'arcane' >>-data:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>"
<%- endif %>
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
external: true
<%- endif %>
-451
View File
@@ -1,451 +0,0 @@
{
"slug": "arcane",
"kind": "compose",
"metadata": {
"name": "Arcane",
"description": "Modern self-hosted Docker management UI for containers, images, volumes, networks, Docker Compose projects, and remote environments.",
"tags": [
"docker",
"management",
"traefik"
],
"icon": {
"provider": "selfhst",
"id": "arcane",
"color": "violet"
},
"draft": false,
"version": {
"name": "v2.1.0",
"source_dep_name": "ghcr.io/getarcaneapp/manager",
"source_dep_version": "v2.1.0"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"config": {
"placeholder": "arcane"
}
},
{
"name": "container_name",
"type": "str",
"title": "Container Name",
"required": false,
"config": {
"placeholder": "arcane"
}
},
{
"name": "app_url",
"type": "str",
"title": "Application URL",
"required": true,
"default": "http://localhost:3552",
"config": {
"placeholder": "https://arcane.example.com"
}
},
{
"name": "container_timezone",
"type": "str",
"title": "Container Timezone",
"required": false,
"config": {
"placeholder": "Europe/Berlin"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
},
{
"name": "puid",
"type": "int",
"title": "PUID",
"required": false,
"config": {
"placeholder": "1000"
}
},
{
"name": "pgid",
"type": "int",
"title": "PGID",
"required": false,
"config": {
"placeholder": "1000"
}
},
{
"name": "docker_socket_path",
"type": "str",
"title": "Docker Socket Path",
"required": true,
"default": "/var/run/docker.sock",
"config": {
"placeholder": "/var/run/docker.sock"
}
},
{
"name": "analytics_enabled",
"type": "bool",
"title": "Enable Analytics",
"required": false
}
]
},
{
"title": "Advanced",
"name": "advanced",
"items": [
{
"name": "project_mount_path",
"type": "str",
"title": "Project Mount Path",
"required": false,
"description": "Optional host path mounted to /app/data/projects for Arcane project/Compose stack storage. Leave empty to skip this mount.",
"config": {
"placeholder": "/path/to/projects"
}
},
{
"name": "builds_mount_path",
"type": "str",
"title": "Builds Mount Path",
"required": false,
"description": "Optional host path mounted to /builds for Arcane build workspace files. Leave empty to skip this mount.",
"config": {
"placeholder": "/path/to/builds"
}
},
{
"name": "backups_mount_path",
"type": "str",
"title": "Backups Mount Path",
"required": false,
"description": "Optional host path mounted to /backups for Arcane volume backups. Leave empty to skip this mount.",
"config": {
"placeholder": "/path/to/backups"
}
}
]
},
{
"title": "Secrets",
"name": "secrets",
"items": [
{
"name": "encryption_key",
"type": "secret",
"title": "Encryption Key",
"required": true,
"description": "Arcane ENCRYPTION_KEY. It must be 32 bytes; a 64-character hex value from `openssl rand -hex 32` is recommended.",
"config": {
"autogenerated": {
"length": 64
}
}
},
{
"name": "jwt_secret",
"type": "secret",
"title": "JWT Secret",
"required": true,
"config": {
"autogenerated": {
"length": 64
}
}
}
]
},
{
"title": "Storage",
"name": "storage",
"items": [
{
"name": "volume_mode",
"type": "enum",
"title": "Volume Mode",
"required": false,
"default": "local",
"config": {
"options": [
"local",
"mount",
"nfs"
]
}
},
{
"name": "volume_mount_path",
"type": "str",
"title": "Data Mount Path",
"required": false,
"default": "",
"needs": [
"volume_mode=mount"
],
"config": {
"placeholder": "/opt/arcane/data"
}
},
{
"name": "volume_nfs_server",
"type": "str",
"title": "NFS Server",
"required": false,
"default": "",
"needs": [
"volume_mode=nfs"
],
"config": {
"placeholder": "nas.home.arpa"
}
},
{
"name": "volume_nfs_path",
"type": "str",
"title": "NFS Path",
"required": false,
"default": "",
"needs": [
"volume_mode=nfs"
],
"config": {
"placeholder": "/export/app"
}
},
{
"name": "volume_nfs_options",
"type": "str",
"title": "NFS Options",
"required": false,
"default": "rw",
"needs": [
"volume_mode=nfs"
],
"config": {
"placeholder": "rw"
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "arcane"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"needs": [
"traefik_tls_enabled=true"
],
"config": {
"placeholder": "websecure"
}
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"needs": [
"traefik_tls_enabled=true"
],
"config": {
"placeholder": "cloudflare"
}
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_http",
"type": "int",
"title": "HTTP Port",
"required": false,
"default": 3552,
"needs": [
"traefik_enabled=false"
],
"config": {
"placeholder": "3552"
}
}
]
},
{
"title": "OIDC Single Sign-On",
"name": "oidc",
"toggle": "oidc_enabled",
"items": [
{
"name": "oidc_enabled",
"type": "bool",
"title": "OIDC",
"required": false,
"default": false
},
{
"name": "oidc_client_id",
"type": "str",
"title": "Client ID",
"required": true,
"needs": [
"oidc_enabled=true"
]
},
{
"name": "oidc_client_secret",
"type": "secret",
"title": "Client Secret",
"required": true,
"needs": [
"oidc_enabled=true"
]
},
{
"name": "oidc_issuer_url",
"type": "str",
"title": "Issuer URL",
"required": true,
"description": "Issuer URL of your OIDC provider. Arcane's docs recommend no trailing slash.",
"needs": [
"oidc_enabled=true"
],
"config": {
"placeholder": "https://auth.example.com/application/o/arcane"
}
},
{
"name": "oidc_provider_name",
"type": "str",
"title": "Provider Name",
"required": false,
"needs": [
"oidc_enabled=true"
],
"config": {
"placeholder": "My Identity Provider"
}
},
{
"name": "oidc_scopes",
"type": "str",
"title": "Scopes",
"required": false,
"description": "Optional OIDC scopes to request. Arcane defaults to openid email profile if unset; include your groups scope when using group mappings.",
"needs": [
"oidc_enabled=true"
],
"config": {
"placeholder": "openid email profile groups"
}
},
{
"name": "oidc_groups_claim",
"type": "str",
"title": "Groups Claim",
"required": false,
"needs": [
"oidc_enabled=true"
],
"config": {
"placeholder": "groups"
}
},
{
"name": "oidc_role_mappings",
"type": "str",
"title": "Role Mappings",
"required": false,
"description": "Optional JSON array for OIDC group-to-role mappings, for example [{\"claimValue\":\"docker-admins\",\"roleId\":\"role_admin\"}].",
"needs": [
"oidc_enabled=true"
]
}
]
}
]
}
-10
View File
@@ -1,10 +0,0 @@
AUTHENTIK_SECRET_KEY='<< authentik_secret_key >>'
DATABASE_USER='<< database_user >>'
DATABASE_PASSWORD='<< database_password >>'
<%- if email_enabled %>
EMAIL_USERNAME='<< email_username >>'
EMAIL_PASSWORD='<< email_password >>'
<%- endif %>
<%- if authentik_admin_password %>
AUTHENTIK_BOOTSTRAP_PASSWORD='<< authentik_admin_password >>'
<%- endif %>
-210
View File
@@ -1,210 +0,0 @@
---
services:
<< service_name >>:
image: ghcr.io/goauthentik/server:2026.2.2
restart: << restart_policy >>
command: server
environment:
- AUTHENTIK_SECRET_KEY=${AUTHENTIK_SECRET_KEY}
- AUTHENTIK_ERROR_REPORTING__ENABLED=<< authentik_error_reporting | lower >>
<%- if database_external %>
- AUTHENTIK_POSTGRESQL__HOST=<< database_host >>
- AUTHENTIK_POSTGRESQL__PORT=<< database_port >>
<%- else %>
- AUTHENTIK_POSTGRESQL__HOST=<< service_name >>_postgres
- AUTHENTIK_POSTGRESQL__PORT=5432
<%- endif %>
- AUTHENTIK_POSTGRESQL__USER=${DATABASE_USER}
- AUTHENTIK_POSTGRESQL__NAME=<< database_name >>
- AUTHENTIK_POSTGRESQL__PASSWORD=${DATABASE_PASSWORD}
<%- if email_enabled %>
- AUTHENTIK_EMAIL__HOST=<< email_host >>
- AUTHENTIK_EMAIL__PORT=<< email_port >>
- AUTHENTIK_EMAIL__FROM=<< email_from >>
- AUTHENTIK_EMAIL__USERNAME=${EMAIL_USERNAME}
- AUTHENTIK_EMAIL__PASSWORD=${EMAIL_PASSWORD}
<%- if email_encryption == "ssl" %>
- AUTHENTIK_EMAIL__USE_SSL=True
<%- elif email_encryption == "starttls" %>
- AUTHENTIK_EMAIL__USE_TLS=True
<%- endif %>
<%- endif %>
networks:
<%- if traefik_enabled %>
- << traefik_network >>
<%- endif %>
- << service_name >>_backend
<%- if not traefik_enabled %>
ports:
- "<< ports_http >>:9000"
- "<< ports_https >>:9443"
<%- endif %>
volumes:
<%- if volume_mode == 'mount' %>
- << volume_mount_path >>/data:/data
- << volume_mount_path >>/templates:/templates
<%- elif volume_mode == 'local' or volume_mode == 'nfs' %>
- << service_name >>_data:/data
- << service_name >>_templates:/templates
<%- endif %>
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>_web.loadBalancer.server.port=9000
- traefik.http.routers.<< service_name >>_http.service=<< service_name >>_web
- traefik.http.routers.<< service_name >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>_http.entrypoints=<< traefik_entrypoint >>
- "traefik.http.middlewares.authentik.forwardauth.address=\
http://<< service_name >>:9000/outpost.goauthentik.io/auth/traefik"
- "traefik.http.middlewares.authentik.forwardauth.trustForwardHeader=true"
- "traefik.http.middlewares.authentik.forwardauth.authResponseHeaders=\
X-authentik-username,\
X-authentik-groups,\
X-authentik-entitlements,\
X-authentik-email,\
X-authentik-name,\
X-authentik-uid,\
X-authentik-jwt,\
X-authentik-meta-jwks,\
X-authentik-meta-outpost,\
X-authentik-meta-provider,\
X-authentik-meta-app,\
X-authentik-meta-version"
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>_https.service=<< service_name >>_web
- traefik.http.routers.<< service_name >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>_https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>_https.tls=true
- traefik.http.routers.<< service_name >>_https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
<%- if not database_external %>
depends_on:
- << service_name >>_postgres
<%- endif %>
<< service_name >>_worker:
image: ghcr.io/goauthentik/server:2026.2.2
restart: << restart_policy >>
command: worker
environment:
- AUTHENTIK_SECRET_KEY=${AUTHENTIK_SECRET_KEY}
- AUTHENTIK_ERROR_REPORTING__ENABLED=<< authentik_error_reporting | lower >>
<%- if database_external %>
- AUTHENTIK_POSTGRESQL__HOST=<< database_host >>
- AUTHENTIK_POSTGRESQL__PORT=<< database_port >>
<%- else %>
- AUTHENTIK_POSTGRESQL__HOST=<< service_name >>_postgres
- AUTHENTIK_POSTGRESQL__PORT=5432
<%- endif %>
- AUTHENTIK_POSTGRESQL__USER=${DATABASE_USER}
- AUTHENTIK_POSTGRESQL__NAME=<< database_name >>
- AUTHENTIK_POSTGRESQL__PASSWORD=${DATABASE_PASSWORD}
<%- if email_enabled %>
- AUTHENTIK_EMAIL__HOST=<< email_host >>
- AUTHENTIK_EMAIL__PORT=<< email_port >>
- AUTHENTIK_EMAIL__FROM=<< email_from >>
- AUTHENTIK_EMAIL__USERNAME=${EMAIL_USERNAME}
- AUTHENTIK_EMAIL__PASSWORD=${EMAIL_PASSWORD}
<%- if email_encryption == "ssl" %>
- AUTHENTIK_EMAIL__USE_SSL=True
<%- elif email_encryption == "starttls" %>
- AUTHENTIK_EMAIL__USE_TLS=True
<%- endif %>
<%- endif %>
<%- if authentik_admin_password %>
- AUTHENTIK_BOOTSTRAP_PASSWORD=${AUTHENTIK_BOOTSTRAP_PASSWORD}
<%- endif %>
user: root
networks:
- << service_name >>_backend
volumes:
- /run/docker.sock:/run/docker.sock
<%- if volume_mode == 'mount' %>
- << volume_mount_path >>/data:/data
- << volume_mount_path >>/certs:/certs
- << volume_mount_path >>/templates:/templates
<%- elif volume_mode == 'local' or volume_mode == 'nfs' %>
- << service_name >>_data:/data
- << service_name >>_certs:/certs
- << service_name >>_templates:/templates
<%- endif %>
<%- if not database_external %>
depends_on:
- << service_name >>_postgres
<%- endif %>
<%- if not database_external %>
<< service_name >>_postgres:
image: docker.io/library/postgres:17.9
restart: << restart_policy >>
environment:
- POSTGRES_USER=${DATABASE_USER}
- POSTGRES_PASSWORD=${DATABASE_PASSWORD}
- POSTGRES_DB=<< database_name >>
healthcheck:
test: ["CMD-SHELL", "pg_isready -U << database_user >>"]
start_period: 30s
interval: 10s
timeout: 10s
retries: 5
networks:
- << service_name >>_backend
volumes:
<%- if volume_mode == 'mount' %>
- << volume_mount_path >>/postgres:/var/lib/postgresql/data
<%- elif volume_mode == 'local' or volume_mode == 'nfs' %>
- << service_name >>_postgres:/var/lib/postgresql/data
<%- endif %>
<%- endif %>
networks:
<< service_name >>_backend:
driver: bridge
<%- if traefik_enabled %>
<< traefik_network >>:
external: true
<%- endif %>
<%- if volume_mode == 'local' %>
volumes:
<%- if not database_external %>
<< service_name >>_postgres:
driver: local
<%- endif %>
<< service_name >>_data:
driver: local
<< service_name >>_certs:
driver: local
<< service_name >>_templates:
driver: local
<%- elif volume_mode == 'nfs' %>
volumes:
<%- if not database_external %>
<< service_name >>_postgres:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>/postgres"
<%- endif %>
<< service_name >>_data:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>/data"
<< service_name >>_certs:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>/certs"
<< service_name >>_templates:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>/templates"
<%- endif %>
-402
View File
@@ -1,402 +0,0 @@
{
"slug": "authentik-compose",
"kind": "compose",
"metadata": {
"name": "Authentik",
"description": "Open-source Identity Provider (IdP) that supports OAuth2, SAML, LDAP, and SCIM for single sign-on and user authentication across your applications.",
"tags": [
"traefik",
"volume"
],
"icon": {
"provider": "selfhst",
"id": "authentik",
"color": "default"
},
"draft": false,
"version": {
"name": "2026.2.2"
}
},
"variables": [
{
"name": "general",
"title": "General",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "authentik",
"config": {
"placeholder": "authentik"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
}
]
},
{
"name": "database",
"title": "Database",
"items": [
{
"name": "database_password",
"type": "secret",
"title": "Database password",
"required": true,
"config": {
"autogenerated": {}
}
},
{
"name": "database_user",
"type": "str",
"title": "The database user",
"required": false,
"default": "authentik",
"config": {
"placeholder": "authentik"
}
},
{
"name": "database_name",
"type": "str",
"title": "The database name",
"required": false,
"default": "authentik",
"config": {
"placeholder": "authentik"
}
},
{
"name": "database_external",
"type": "bool",
"title": "External Database",
"required": false,
"default": false
},
{
"name": "database_host",
"type": "str",
"title": "External database host",
"required": false,
"default": "",
"needs": [
"database_external=true"
],
"config": {
"placeholder": "postgres.home.arpa"
}
},
{
"name": "database_port",
"type": "int",
"title": "External database port",
"required": false,
"default": 5432,
"config": {
"placeholder": "5432"
},
"needs": [
"database_external=true"
]
}
]
},
{
"name": "ports",
"title": "Ports",
"items": [
{
"name": "ports_http",
"type": "str",
"title": "HTTP Port",
"required": false,
"default": 8000,
"config": {
"placeholder": "8000"
}
},
{
"name": "ports_https",
"type": "str",
"title": "HTTPS Port",
"required": false,
"default": 8443,
"config": {
"placeholder": "8443"
}
}
]
},
{
"name": "traefik",
"title": "Traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "authentik"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
},
{
"name": "authentik",
"title": "Authentik",
"items": [
{
"name": "authentik_secret_key",
"type": "secret",
"title": "Secret Key",
"required": true,
"config": {
"autogenerated": {}
}
},
{
"name": "authentik_admin_password",
"type": "secret",
"title": "Admin Password",
"required": false,
"config": {
"autogenerated": {}
}
},
{
"name": "authentik_error_reporting",
"type": "bool",
"title": "Error Reporting",
"required": false
}
]
},
{
"name": "volume",
"title": "Volume",
"items": [
{
"name": "volume_mode",
"type": "enum",
"title": "Volume Mode",
"required": true,
"default": "local",
"config": {
"options": [
"local",
"mount",
"nfs"
]
}
},
{
"name": "volume_mount_path",
"type": "str",
"title": "Volume Mount Path",
"required": true,
"default": "/data",
"config": {
"placeholder": "/data"
},
"needs": [
"volume_mode=mount"
]
},
{
"name": "volume_nfs_server",
"type": "str",
"title": "Volume Nfs Server",
"required": true,
"default": "NFS_SERVER",
"config": {
"placeholder": "NFS_SERVER"
},
"needs": [
"volume_mode=nfs"
]
},
{
"name": "volume_nfs_path",
"type": "str",
"title": "Volume Nfs Path",
"required": true,
"default": "/export",
"config": {
"placeholder": "/export"
},
"needs": [
"volume_mode=nfs"
]
},
{
"name": "volume_nfs_options",
"type": "str",
"title": "Volume Nfs Options",
"required": true,
"default": "rw,nolock,soft",
"config": {
"placeholder": "rw,nolock,soft"
},
"needs": [
"volume_mode=nfs"
]
}
]
},
{
"name": "email",
"title": "Email",
"toggle": "email_enabled",
"items": [
{
"name": "email_host",
"type": "str",
"title": "SMTP server hostname",
"required": true,
"config": {
"placeholder": "smtp.home.arpa"
}
},
{
"name": "email_port",
"type": "int",
"title": "SMTP server port",
"required": true,
"default": 25,
"config": {
"placeholder": "25"
}
},
{
"name": "email_username",
"type": "str",
"title": "SMTP username",
"required": true,
"config": {
"placeholder": "user@example.com"
}
},
{
"name": "email_password",
"type": "secret",
"title": "SMTP password",
"required": true
},
{
"name": "email_from",
"type": "str",
"title": "From email address",
"required": true,
"config": {
"placeholder": "noreply@example.com"
}
},
{
"name": "email_enabled",
"type": "bool",
"title": "Email",
"required": false,
"default": false
},
{
"name": "email_encryption",
"type": "str",
"title": "Encryption",
"required": false,
"default": "tls",
"config": {
"placeholder": "tls"
}
}
]
}
]
}
-87
View File
@@ -1,87 +0,0 @@
services:
<< service_name >>:
image: docker.io/ubuntu/bind9:9.20-24.10_edge
restart: << restart_policy >>
<%- if container_hostname %>
hostname: << container_hostname >>
<%- endif %>
environment:
- TZ=<< container_timezone >>
- BIND9_USER=bind
<%- if network_mode == 'host' %>
network_mode: host
<%- elif network_mode == 'bridge' or network_mode == 'macvlan' %>
networks:
<%- if network_mode == 'macvlan' %>
<< network_name >>:
ipv4_address: << network_macvlan_ipv4_address >>
<%- elif network_mode == 'bridge' %>
<< network_name >>:
<%- endif %>
<%- endif %>
<%- if network_mode == '' or network_mode == 'bridge' %>
ports:
- "53:53/tcp"
- "53:53/udp"
<%- endif %>
volumes:
<%- if volume_mode == 'mount' %>
- << volume_mount_path >>/config:/etc/bind:rw
- << volume_mount_path >>/zones:/var/lib/bind:rw
- << volume_mount_path >>/cache:/var/cache/bind:rw
<%- else %>
- << service_name >>_config:/etc/bind
- << service_name >>_zones:/var/lib/bind
- << service_name >>_cache:/var/cache/bind
<%- endif %>
<%- if network_mode == 'bridge' or network_mode == 'macvlan' %>
networks:
<< network_name >>:
<%- if network_external %>
external: true
<%- else %>
<%- if network_mode == 'macvlan' %>
driver: macvlan
driver_opts:
parent: << network_macvlan_parent_interface >>
ipam:
config:
- subnet: << network_macvlan_subnet >>
gateway: << network_macvlan_gateway >>
name: << network_name >>
<%- elif network_mode == 'bridge' %>
driver: bridge
<%- endif %>
<%- endif %>
<%- endif %>
<%- if volume_mode == 'local' %>
volumes:
<< service_name >>_config:
driver: local
<< service_name >>_zones:
driver: local
<< service_name >>_cache:
driver: local
<%- elif volume_mode == 'nfs' %>
volumes:
<< service_name >>_config:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>/config"
<< service_name >>_zones:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>/zones"
<< service_name >>_cache:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>/cache"
<%- endif %>
@@ -1,67 +0,0 @@
// BIND9 Main Configuration File
// Documentation: https://bind9.readthedocs.io/
<%- if tsig_enabled %>
include "/etc/bind/tsig.key";
<%- endif %>
acl "trusted" {
127.0.0.1;
::1;
10.0.0.0/8;
172.16.0.0/12;
192.168.0.0/16;
};
options {
directory "/var/cache/bind";
// DNS forwarders for recursive queries
forwarders {
1.1.1.1;
8.8.8.8;
};
// Allow recursion from trusted networks only
allow-recursion { trusted; };
// Allow queries from any (adjust as needed)
allow-query { any; };
// Disable zone transfers by default (enable per-zone with TSIG)
allow-transfer { none; };
// DNSSEC validation
dnssec-validation auto;
// Listen on all interfaces
listen-on { any; };
listen-on-v6 { any; };
// Disable query logging (enable for debugging)
// querylog yes;
};
// Local zones
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
// Include your custom zones
include "/etc/bind/named.conf.zones";
@@ -1,14 +0,0 @@
zone "<< domain_name >>" {
type master;
file "/var/lib/bind/db.primary.zone";
<%- if tsig_enabled %>
allow-transfer { key "tsig-transfer-key"; };
allow-update { key "tsig-transfer-key"; };
<%- endif %>
<%- if dnssec_enabled %>
dnssec-policy default;
inline-signing yes;
<%- endif %>
};
@@ -1,6 +0,0 @@
<%- if tsig_enabled %>
key "tsig-transfer-key" {
algorithm hmac-sha256;
secret "<< tsig_key_secret >>";
};
<%- endif %>
@@ -1,11 +0,0 @@
$TTL 86400
@ IN SOA ns1.<< domain_name >>. admin.<< domain_name >>. (
2026010101 ; serial
3600 ; refresh
900 ; retry
604800 ; expire
86400 ; minimum
)
@ IN NS ns1.<< domain_name >>.
ns1 IN A 127.0.0.1
-262
View File
@@ -1,262 +0,0 @@
{
"slug": "bind9",
"kind": "compose",
"metadata": {
"name": "BIND9",
"description": "The most widely used authoritative and recursive DNS server. This template includes example zones, TSIG authentication for secure zone transfers, and DNSSEC support.",
"tags": [
"network",
"volume"
],
"icon": {
"provider": "selfhst",
"id": "bind-9"
},
"draft": false,
"version": {
"name": "9.20-24.10_edge",
"source_dep_name": "docker.io/ubuntu/bind9",
"source_dep_version": "9.20-24.10_edge"
}
},
"variables": [
{
"title": "dns_security",
"name": "dns-security",
"items": [
{
"name": "dnssec_enabled",
"type": "bool",
"title": "DNSSEC",
"required": false
}
]
},
{
"title": "dns_zone",
"name": "dns-zone",
"items": [
{
"name": "domain_name",
"type": "str",
"title": "Primary domain name",
"required": false,
"default": "home.arpa",
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "tsig_enabled",
"type": "bool",
"title": "TSIG",
"required": false
},
{
"name": "tsig_key_secret",
"type": "secret",
"title": "TSIG key secret",
"required": false,
"needs": [
"tsig_enabled=true"
],
"config": {
"autogenerated": {
"kind": "base64",
"bytes": 32
}
}
}
]
},
{
"title": "Volume",
"name": "volume",
"items": [
{
"name": "volume_mode",
"type": "enum",
"title": "Volume Mode",
"required": true,
"default": "local",
"config": {
"options": [
"local",
"mount",
"nfs"
]
}
},
{
"name": "volume_mount_path",
"type": "str",
"title": "Volume Mount Path",
"required": true,
"default": "/data",
"needs": [
"volume_mode=mount"
],
"config": {
"placeholder": "/data"
}
},
{
"name": "volume_nfs_server",
"type": "str",
"title": "Volume Nfs Server",
"required": true,
"default": "NFS_SERVER",
"needs": [
"volume_mode=nfs"
],
"config": {
"placeholder": "NFS_SERVER"
}
},
{
"name": "volume_nfs_path",
"type": "str",
"title": "Volume Nfs Path",
"required": true,
"default": "/export",
"needs": [
"volume_mode=nfs"
],
"config": {
"placeholder": "/export"
}
},
{
"name": "volume_nfs_options",
"type": "str",
"title": "Volume Nfs Options",
"required": true,
"default": "rw,nolock,soft",
"needs": [
"volume_mode=nfs"
],
"config": {
"placeholder": "rw,nolock,soft"
}
}
]
},
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "bind9",
"config": {
"placeholder": "bind9"
}
},
{
"name": "container_hostname",
"type": "str",
"title": "Container Hostname",
"required": false
},
{
"name": "container_timezone",
"type": "str",
"title": "Container Timezone",
"required": false,
"config": {
"placeholder": "Europe/Berlin"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
},
{
"name": "network_mode",
"type": "enum",
"title": "Network mode",
"required": false,
"default": "bridge",
"config": {
"options": [
"bridge",
"macvlan",
"host"
]
}
},
{
"name": "network_external",
"type": "bool",
"title": "External Network",
"required": false,
"default": false
},
{
"name": "network_macvlan_parent_interface",
"type": "str",
"title": "Parent Interface",
"required": false,
"default": "",
"config": {
"placeholder": "eth0"
}
},
{
"name": "network_macvlan_gateway",
"type": "str",
"title": "Gateway",
"required": false,
"default": "",
"config": {
"placeholder": "10.20.0.1"
}
},
{
"name": "network_name",
"type": "str",
"title": "Network Name",
"required": false,
"default": "bind9_network",
"config": {
"placeholder": "bind9_network"
}
},
{
"name": "network_macvlan_subnet",
"type": "str",
"title": "Subnet",
"required": false,
"default": "",
"config": {
"placeholder": "10.20.0.0/16"
}
},
{
"name": "network_macvlan_ipv4_address",
"type": "str",
"title": "IPv4 Address",
"required": false,
"default": "",
"config": {
"placeholder": "10.20.1.50"
}
}
]
}
]
}
-7
View File
@@ -1,7 +0,0 @@
<%- if tls_enabled and tls_email %>
{
email << tls_email >>
}
<%- endif %>
import /etc/caddy/config/*.caddy
-47
View File
@@ -1,47 +0,0 @@
services:
<< service_name >>:
image: docker.io/library/caddy:2.11.2-alpine
restart: << restart_policy >>
<%- if container_timezone %>
environment:
- TZ=<< container_timezone >>
<%- endif %>
ports:
- "<< ports_http >>:80"
- "<< ports_https >>:443"
- "<< ports_https >>:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./config:/etc/caddy/config:ro
<%- if webserver_enabled %>
<%- if webserver_content_type == 'mount' %>
- << webserver_content_mount_path >>:/srv:ro
<%- elif webserver_content_type == 'nfs' %>
- caddy_site:/srv:ro
<%- endif %>
<%- endif %>
- caddy_data:/data
- caddy_config:/config
networks:
- << docker_network >>
networks:
<< docker_network >>:
<%- if docker_network_external %>
external: true
<%- else %>
driver: bridge
name: << docker_network >>
<%- endif %>
volumes:
<%- if webserver_enabled and webserver_content_type == 'nfs' %>
caddy_site:
driver: local
driver_opts:
type: nfs
o: addr=<< webserver_content_nfs_server >>,nfsvers=4,<< webserver_content_nfs_options >>
device: ":<< webserver_content_nfs_path >>"
<%- endif %>
caddy_data:
caddy_config:
@@ -1,25 +0,0 @@
<%- if webserver_enabled %>
<< webserver_domain >> {
root * /srv
file_server
<%- if webserver_custom_config_content %>
<%- for line in webserver_custom_config_content.split('\n') %>
<< line >>
<%- endfor %>
<%- endif %>
}
<%- endif %>
<%- if reverse_proxy_enabled %>
<< reverse_proxy_domain >> {
<%- if reverse_proxy_custom_config_content %>
reverse_proxy << reverse_proxy_upstream >> {
<%- for line in reverse_proxy_custom_config_content.split('\n') %>
<< line >>
<%- endfor %>
}
<%- else %>
reverse_proxy << reverse_proxy_upstream >>
<%- endif %>
}
<%- endif %>
-319
View File
@@ -1,319 +0,0 @@
{
"slug": "caddy",
"kind": "compose",
"metadata": {
"name": "Caddy",
"description": "Modern web server and reverse proxy with automatic HTTPS, modular Caddyfile config, and simple presets for static sites or upstream proxying.",
"tags": [
"reverse-proxy",
"web-server",
"tls"
],
"icon": {
"provider": "selfhst",
"id": "caddy",
"color": "emerald"
},
"draft": false,
"version": {
"name": "2.11.2-alpine",
"source_dep_name": "docker.io/library/caddy",
"source_dep_version": "2.11.2-alpine"
}
},
"variables": [
{
"name": "general",
"title": "General",
"description": "Basic container naming and lifecycle settings.",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "caddy",
"description": "Compose service name for the Caddy container.",
"config": {
"placeholder": "caddy"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"description": "Restart policy applied to the container.",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
},
{
"name": "container_timezone",
"type": "str",
"title": "Container Timezone",
"required": false,
"description": "Optional timezone passed through as the `TZ` environment variable.",
"config": {
"placeholder": "UTC"
}
}
]
},
{
"name": "network",
"title": "Network",
"description": "Port publishing and Docker network attachment.",
"items": [
{
"name": "ports_http",
"type": "int",
"title": "HTTP Port",
"required": true,
"default": 80,
"description": "Host port published for HTTP traffic on container port 80.",
"config": {
"placeholder": "80"
}
},
{
"name": "ports_https",
"type": "int",
"title": "HTTPS Port",
"required": true,
"default": 443,
"description": "Host port published for HTTPS traffic on container port 443.",
"config": {
"placeholder": "443"
}
},
{
"name": "docker_network",
"type": "str",
"title": "Docker Network",
"required": true,
"default": "caddy",
"description": "Docker network that Caddy should join.",
"config": {
"placeholder": "caddy"
}
},
{
"name": "docker_network_external",
"type": "bool",
"title": "External Network",
"required": false,
"default": false
}
]
},
{
"name": "tls",
"title": "TLS",
"description": "Optional global ACME metadata for Caddy.",
"toggle": "tls_enabled",
"items": [
{
"name": "tls_enabled",
"type": "bool",
"title": "TLS Settings",
"required": false,
"default": false
},
{
"name": "tls_email",
"type": "str",
"title": "ACME Email",
"required": false,
"description": "Email address used for ACME account registration.",
"config": {
"placeholder": "admin@example.com"
},
"needs": [
"tls_enabled=true"
]
}
]
},
{
"name": "webserver",
"title": "Webserver",
"description": "Optional generated static site config that serves files from `/srv`.",
"toggle": "webserver_enabled",
"items": [
{
"name": "webserver_enabled",
"type": "bool",
"title": "Static Webserver",
"required": false,
"default": false,
"description": "Render a basic static site config into `config/webserver.caddy`."
},
{
"name": "webserver_domain",
"type": "str",
"title": "Site Address",
"required": true,
"description": "Hostname or site address used by the generated static site config.",
"config": {
"placeholder": "example.com"
},
"needs": [
"webserver_enabled=true"
]
},
{
"name": "webserver_content_type",
"type": "enum",
"title": "Site Content",
"required": true,
"default": "mount",
"description": "Storage mode used for static site content mounted into `/srv`.",
"config": {
"options": [
"mount",
"nfs"
]
},
"needs": [
"webserver_enabled=true"
]
},
{
"name": "webserver_content_mount_path",
"type": "str",
"title": "Bind Mount Path",
"required": true,
"default": "./data",
"description": "Host path used when site content is mounted directly from the filesystem.",
"config": {
"placeholder": "./data"
},
"needs": [
"webserver_enabled=true",
"webserver_content_type=mount"
]
},
{
"name": "webserver_content_nfs_server",
"type": "str",
"title": "NFS Server",
"required": true,
"default": "192.0.2.1",
"description": "Hostname or IP address of the NFS server that stores site content.",
"config": {
"placeholder": "192.0.2.1"
},
"needs": [
"webserver_enabled=true",
"webserver_content_type=nfs"
]
},
{
"name": "webserver_content_nfs_path",
"type": "str",
"title": "NFS Export Path",
"required": true,
"default": "/path/to/export",
"config": {
"placeholder": "/path/to/export"
},
"needs": [
"webserver_enabled=true",
"webserver_content_type=nfs"
]
},
{
"name": "webserver_content_nfs_options",
"type": "str",
"title": "NFS Mount Options",
"required": true,
"default": "rw,nolock,soft",
"config": {
"placeholder": "rw,nolock,soft"
},
"needs": [
"webserver_enabled=true",
"webserver_content_type=nfs"
]
},
{
"name": "webserver_custom_config_content",
"type": "str",
"title": "Custom Config Content",
"required": false,
"description": "Optional additional Caddyfile directives inserted into the generated webserver site block when not empty.",
"config": {
"placeholder": "encode zstd gzip",
"textarea": true
},
"needs": [
"webserver_enabled=true"
]
}
]
},
{
"name": "reverse-proxy",
"title": "Reverse Proxy",
"description": "Optional generated reverse proxy config for forwarding requests to an upstream service.",
"toggle": "reverse_proxy_enabled",
"items": [
{
"name": "reverse_proxy_enabled",
"type": "bool",
"title": "Reverse Proxy",
"required": false,
"default": false,
"description": "Append a reverse proxy site block to `config/webserver.caddy`."
},
{
"name": "reverse_proxy_domain",
"type": "str",
"title": "Site Address",
"required": true,
"description": "Hostname or site address used by the generated reverse proxy config.",
"config": {
"placeholder": "app.example.com"
},
"needs": [
"reverse_proxy_enabled=true"
]
},
{
"name": "reverse_proxy_upstream",
"type": "str",
"title": "Upstream",
"required": true,
"description": "Upstream target used by the generated reverse proxy config, for example `app:3000`.",
"config": {
"placeholder": "app:3000"
},
"needs": [
"reverse_proxy_enabled=true"
]
},
{
"name": "reverse_proxy_custom_config_content",
"type": "str",
"title": "Custom Config Content",
"required": false,
"description": "Optional additional `reverse_proxy` subdirectives inserted into the generated reverse proxy block when not empty.",
"config": {
"placeholder": "header_up X-Forwarded-Proto https",
"textarea": true
},
"needs": [
"reverse_proxy_enabled=true"
]
}
]
}
]
}
-2
View File
@@ -1,2 +0,0 @@
# Checkmk credentials
CMK_PASSWORD=<< cmk_password >>
-55
View File
@@ -1,55 +0,0 @@
---
services:
<< service_name >>:
image: checkmk/check-mk-community:2.5.0-latest
restart: << restart_policy >>
environment:
<%- if container_timezone %>
- TZ=<< container_timezone >>
<%- endif %>
- CMK_PASSWORD=${CMK_PASSWORD}
- CMK_SITE_ID=<< cmk_site_id >>
tmpfs:
- /opt/omd/sites/<< cmk_site_id >>/tmp:uid=<< user_uid >>,gid=<< user_gid >>
volumes:
<%- if not container_timezone %>
- /etc/localtime:/etc/localtime:ro
<%- endif %>
- << service_name >>_data:/omd/sites:rw
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
<%- endif %>
ports:
<%- if not traefik_enabled %>
- "<< ports_http >>:5000"
<%- endif %>
- "<< ports_agent >>:8000"
- "<< ports_snmp >>:162/udp"
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>-web.loadBalancer.server.port=5000
- traefik.http.services.<< service_name >>-web.loadBalancer.server.scheme=http
- traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>-https.tls=true
- traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
volumes:
<< service_name >>_data:
driver: local
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
external: true
<%- endif %>
-225
View File
@@ -1,225 +0,0 @@
{
"slug": "checkmk",
"kind": "compose",
"metadata": {
"name": "Checkmk",
"description": "Comprehensive IT monitoring solution for infrastructure, applications, and services. Provides real-time health and performance insights with server, network, cloud, and application monitoring.",
"tags": [
"traefik"
],
"icon": {
"provider": "selfhst",
"id": "checkmk"
},
"draft": false,
"version": {
"name": "2.5.0-latest",
"source_dep_name": "checkmk/check-mk-community",
"source_dep_version": "2.5.0-latest"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "checkmk",
"config": {
"placeholder": "checkmk"
}
},
{
"name": "container_timezone",
"type": "str",
"title": "Container Timezone",
"required": false,
"config": {
"placeholder": "Europe/Berlin"
}
},
{
"name": "user_uid",
"type": "int",
"title": "User Uid",
"required": false,
"default": 1000,
"config": {
"placeholder": "1000"
}
},
{
"name": "user_gid",
"type": "int",
"title": "User Gid",
"required": false,
"default": 1000,
"config": {
"placeholder": "1000"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
},
{
"name": "cmk_password",
"type": "secret",
"title": "CheckMK admin password",
"required": true,
"config": {
"autogenerated": {
"length": 32
}
}
},
{
"name": "cmk_site_id",
"type": "str",
"title": "CheckMK site ID",
"required": true,
"default": "cmk",
"config": {
"placeholder": "cmk"
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "checkmk"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_http",
"type": "int",
"title": "HTTP Port",
"required": false,
"default": 5000,
"config": {
"placeholder": "5000"
}
},
{
"name": "ports_agent",
"type": "int",
"title": "Agent port",
"required": true,
"default": 8000,
"config": {
"placeholder": "8000"
}
},
{
"name": "ports_snmp",
"type": "int",
"title": "SNMP trap port",
"required": true,
"default": 162,
"config": {
"placeholder": "162"
}
}
]
}
]
}
-2
View File
@@ -1,2 +0,0 @@
# Cloudflared credentials
TUNNEL_TOKEN=<< tunnel_token >>
@@ -1,18 +0,0 @@
services:
<< service_name >>:
image: cloudflare/cloudflared:2026.3.0
container_name: << container_name >>
environment:
- TUNNEL_TOKEN=${TUNNEL_TOKEN}
command: << tunnel_run_command >>
networks:
- << network_name >>
restart: << restart_policy >>
networks:
<< network_name >>:
<%- if network_external %>
external: true
<%- else %>
driver: bridge
<%- endif %>
-103
View File
@@ -1,103 +0,0 @@
{
"slug": "cloudflared",
"kind": "compose",
"metadata": {
"name": "Cloudflared",
"description": "Runs a Cloudflare Tunnel connector in Docker Compose so private services can be published through Cloudflare Zero Trust.",
"tags": [],
"icon": {
"provider": "selfhst",
"id": "cloudflare-zero-trust"
},
"draft": false,
"version": {
"name": "2026.3.0",
"source_dep_name": "cloudflare/cloudflared",
"source_dep_version": "2026.3.0"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Compose service name",
"required": false,
"default": "cloudflared",
"config": {
"placeholder": "cloudflared"
}
},
{
"name": "container_name",
"type": "str",
"title": "Container name",
"required": false,
"default": "cloudflared",
"config": {
"placeholder": "cloudflared"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Container restart policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
},
{
"name": "tunnel_run_command",
"type": "str",
"title": "Command",
"required": false,
"default": "tunnel --no-autoupdate run",
"config": {
"placeholder": "tunnel --no-autoupdate run"
}
},
{
"name": "tunnel_token",
"type": "secret",
"title": "Tunnel Token",
"required": true,
"description": "Cloudflare tunnel token used by the connector."
}
]
},
{
"title": "Network",
"name": "network",
"items": [
{
"name": "network_name",
"type": "str",
"title": "Network Name",
"required": true,
"default": "proxy",
"description": "Docker network name for the tunnel container",
"config": {
"placeholder": "proxy"
}
},
{
"name": "network_external",
"type": "bool",
"title": "External Network",
"required": false,
"default": true
}
]
}
]
}
-7
View File
@@ -1,7 +0,0 @@
# CrowdSec enrollment and bouncer placeholders
<%- if console_enrollment_enabled %>
ENROLL_KEY=<< console_enrollment_key >>
<%- endif %>
<%- if bouncer_traefik_key %>
BOUNCER_KEY_TRAEFIK=<< bouncer_traefik_key >>
<%- endif %>
@@ -1,63 +0,0 @@
services:
<< service_name >>:
image: crowdsecurity/crowdsec:<< image_tag >>
container_name: << container_name >>
environment:
- TZ=<< container_timezone >>
- COLLECTIONS=<< collections_core >><%- if collections_extra %> << collections_extra >><%- endif %><%- if appsec_enabled %> crowdsecurity/appsec-virtual-patching crowdsecurity/appsec-generic-rules<%- endif %>
<%- if docker_logs_enabled %>
- GID=<< docker_group_id >>
<%- endif %>
<%- if console_enrollment_enabled %>
- ENROLL_KEY=${ENROLL_KEY}
- ENROLL_INSTANCE_NAME=<< console_enrollment_name >>
<%- if console_enrollment_tags %>
- ENROLL_TAGS=<< console_enrollment_tags >>
<%- endif %>
<%- endif %>
<%- if bouncer_traefik_key %>
- BOUNCER_KEY_TRAEFIK=${BOUNCER_KEY_TRAEFIK}
<%- endif %>
volumes:
- ./config/acquis.yaml:/etc/crowdsec/acquis.yaml:ro
- ./config/acquis.d:/etc/crowdsec/acquis.d:ro
- crowdsec_data:/var/lib/crowdsec/data
- /var/log:/var/log-host:ro
<%- if docker_logs_enabled %>
- /var/run/docker.sock:/var/run/docker.sock:ro
<%- endif %>
<%- if traefik_accesslog_enabled %>
- << traefik_accesslog_mount_path >>:/var/log/traefik:ro
<%- endif %>
<%- if lapi_expose_enabled or (appsec_enabled and appsec_expose_enabled) %>
ports:
<%- if lapi_expose_enabled %>
- "<< lapi_bind_address >>:<< lapi_port >>:8080"
<%- endif %>
<%- if appsec_enabled and appsec_expose_enabled %>
- "<< appsec_bind_address >>:<< appsec_port >>:7422"
<%- endif %>
<%- endif %>
restart: << restart_policy >>
networks:
- crowdsec
<%- if traefik_network_enabled %>
- << traefik_network >>
<%- endif %>
networks:
crowdsec:
driver: bridge
<%- if traefik_network_enabled %>
<< traefik_network >>:
<%- if traefik_network_external %>
external: true
<%- else %>
driver: bridge
name: << traefik_network >>
<%- endif %>
<%- endif %>
volumes:
crowdsec_data:
driver: local
@@ -1,9 +0,0 @@
<%- if appsec_enabled %>
source: appsec
listen_addr: 0.0.0.0:7422
path: << appsec_path >>
appsec_config: crowdsecurity/appsec-default
labels:
type: appsec
name: << appsec_name >>
<%- endif %>
@@ -1,26 +0,0 @@
<%- if host_logs_enabled %>
filenames:
- /var/log-host/auth.log
- /var/log-host/syslog
labels:
type: syslog
<%- endif %>
<%- if host_logs_enabled and (docker_logs_enabled or traefik_accesslog_enabled) %>
---
<%- endif %>
<%- if docker_logs_enabled %>
source: docker
container_name_regexp:
- << docker_container_name_regexp >>
labels:
type: << docker_log_type >>
<%- endif %>
<%- if docker_logs_enabled and traefik_accesslog_enabled %>
---
<%- endif %>
<%- if traefik_accesslog_enabled %>
filenames:
- /var/log/traefik/<< traefik_accesslog_filename >>
labels:
type: traefik
<%- endif %>
-451
View File
@@ -1,451 +0,0 @@
{
"slug": "crowdsec",
"kind": "compose",
"metadata": {
"name": "CrowdSec",
"description": "Standalone CrowdSec Security Engine deployment for a single Docker host, with host and reverse-proxy log acquisition, optional AppSec exposure, and console or bouncer enrollment placeholders.",
"tags": [
"security",
"logging",
"traefik"
],
"icon": {
"provider": "selfhst",
"id": "crowdsec"
},
"draft": true,
"version": {
"name": "v1.7.6",
"source_dep_name": "manual/crowdsec"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "crowdsec",
"description": "Compose service name for CrowdSec.",
"config": {
"placeholder": "crowdsec"
}
},
{
"name": "container_name",
"type": "str",
"title": "Container Name",
"required": false,
"default": "crowdsec",
"description": "Container name for CrowdSec.",
"config": {
"placeholder": "crowdsec"
}
},
{
"name": "image_tag",
"type": "str",
"title": "Image Tag",
"required": true,
"default": "v1.7.6",
"description": "CrowdSec image tag to deploy.",
"config": {
"placeholder": "v1.7.6"
}
},
{
"name": "container_timezone",
"type": "str",
"title": "Container Timezone",
"required": true,
"default": "UTC",
"config": {
"placeholder": "UTC"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
}
]
},
{
"title": "Collections",
"name": "collections",
"items": [
{
"name": "collections_core",
"type": "str",
"title": "Core Collections",
"required": true,
"default": "crowdsecurity/linux crowdsecurity/sshd",
"description": "Space-separated base collections to install on startup.",
"config": {
"placeholder": "crowdsecurity/linux crowdsecurity/sshd"
}
},
{
"name": "collections_extra",
"type": "str",
"title": "Extra Collections",
"required": false,
"default": "crowdsecurity/traefik",
"description": "Additional space-separated collections to install, for example a reverse-proxy parser.",
"config": {
"placeholder": "crowdsecurity/traefik"
}
}
]
},
{
"title": "Acquisition",
"name": "acquisition",
"items": [
{
"name": "host_logs_enabled",
"type": "bool",
"title": "Host Logs",
"required": false,
"default": true,
"description": "Ingest host auth and syslog files from `/var/log`."
},
{
"name": "docker_logs_enabled",
"type": "bool",
"title": "Docker Logs",
"required": false,
"default": false,
"description": "Read logs from a matching Docker container through the Docker socket."
},
{
"name": "docker_group_id",
"type": "int",
"title": "Docker Group ID",
"required": true,
"default": 998,
"description": "Host Docker group ID so the container can access the socket.",
"needs": [
"docker_logs_enabled=true"
],
"config": {
"placeholder": "998"
}
},
{
"name": "docker_container_name_regexp",
"type": "str",
"title": "Docker Container Regex",
"required": true,
"default": ".*traefik.*",
"description": "Regular expression used to match the Docker container whose logs should be parsed.",
"needs": [
"docker_logs_enabled=true"
],
"config": {
"placeholder": ".*traefik.*"
}
},
{
"name": "docker_log_type",
"type": "str",
"title": "Docker Log Type",
"required": true,
"default": "traefik",
"description": "Parser type label for the Docker datasource.",
"needs": [
"docker_logs_enabled=true"
],
"config": {
"placeholder": "traefik"
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"items": [
{
"name": "traefik_network_enabled",
"type": "bool",
"title": "Shared Traefik Network",
"required": false,
"default": false,
"description": "Attach CrowdSec to an existing Docker network shared with Traefik or other bouncers."
},
{
"name": "traefik_network",
"type": "str",
"title": "Traefik Network",
"required": true,
"default": "traefik",
"description": "Docker network shared with Traefik or other remediation components.",
"needs": [
"traefik_network_enabled=true"
],
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_network_external",
"type": "bool",
"title": "External Network",
"required": false,
"default": true,
"needs": [
"traefik_network_enabled=true"
]
},
{
"name": "traefik_accesslog_enabled",
"type": "bool",
"title": "Traefik Access Log",
"required": false,
"default": false,
"description": "Read Traefik access logs from a mounted host path."
},
{
"name": "traefik_accesslog_mount_path",
"type": "str",
"title": "Traefik Log Path",
"required": true,
"default": "/var/log/traefik",
"description": "Host directory containing Traefik access logs.",
"needs": [
"traefik_accesslog_enabled=true"
],
"config": {
"placeholder": "/var/log/traefik"
}
},
{
"name": "traefik_accesslog_filename",
"type": "str",
"title": "Traefik Log File",
"required": true,
"default": "access.log",
"description": "Filename of the Traefik access log inside the mounted directory.",
"needs": [
"traefik_accesslog_enabled=true"
],
"config": {
"placeholder": "access.log"
}
}
]
},
{
"title": "Local API",
"toggle": "lapi_expose_enabled",
"name": "lapi",
"items": [
{
"name": "lapi_expose_enabled",
"type": "bool",
"title": "Expose Local API",
"required": false,
"default": false,
"description": "Publish CrowdSec Local API on the host."
},
{
"name": "lapi_bind_address",
"type": "str",
"title": "Local API Bind Address",
"required": true,
"default": "127.0.0.1",
"description": "Host address used for the Local API port binding.",
"needs": [
"lapi_expose_enabled=true"
],
"config": {
"placeholder": "127.0.0.1"
}
},
{
"name": "lapi_port",
"type": "int",
"title": "Local API Port",
"required": true,
"default": 8080,
"description": "Host port used for the Local API binding.",
"needs": [
"lapi_expose_enabled=true"
],
"config": {
"placeholder": "8080"
}
}
]
},
{
"title": "AppSec",
"toggle": "appsec_enabled",
"name": "appsec",
"items": [
{
"name": "appsec_enabled",
"type": "bool",
"title": "Enable AppSec",
"required": false,
"default": false
},
{
"name": "appsec_name",
"type": "str",
"title": "AppSec Name",
"required": true,
"default": "traefik-appsec",
"description": "Friendly name for the AppSec component.",
"needs": [
"appsec_enabled=true"
],
"config": {
"placeholder": "traefik-appsec"
}
},
{
"name": "appsec_path",
"type": "str",
"title": "AppSec Path",
"required": true,
"default": "/",
"description": "Request path handled by the AppSec listener.",
"needs": [
"appsec_enabled=true"
],
"config": {
"placeholder": "/"
}
},
{
"name": "appsec_expose_enabled",
"type": "bool",
"title": "Expose AppSec",
"required": false,
"default": false,
"description": "Publish the AppSec listener on the host.",
"needs": [
"appsec_enabled=true"
]
},
{
"name": "appsec_bind_address",
"type": "str",
"title": "AppSec Bind Address",
"required": true,
"default": "127.0.0.1",
"description": "Host address used for the AppSec port binding.",
"needs": [
"appsec_enabled=true",
"appsec_expose_enabled=true"
],
"config": {
"placeholder": "127.0.0.1"
}
},
{
"name": "appsec_port",
"type": "int",
"title": "AppSec Port",
"required": true,
"default": 7422,
"description": "Host port used for the AppSec port binding.",
"needs": [
"appsec_enabled=true",
"appsec_expose_enabled=true"
],
"config": {
"placeholder": "7422"
}
}
]
},
{
"title": "Console Enrollment",
"toggle": "console_enrollment_enabled",
"name": "console",
"items": [
{
"name": "console_enrollment_enabled",
"type": "bool",
"title": "Console Enrollment",
"required": false,
"default": false,
"description": "Enroll this CrowdSec instance into CrowdSec Console."
},
{
"name": "console_enrollment_name",
"type": "str",
"title": "Instance Name",
"required": true,
"default": "crowdsec-homelab",
"description": "Human-readable name shown in CrowdSec Console.",
"needs": [
"console_enrollment_enabled=true"
],
"config": {
"placeholder": "crowdsec-homelab"
}
},
{
"name": "console_enrollment_tags",
"type": "str",
"title": "Enrollment Tags",
"required": false,
"default": "homelab,edge",
"description": "Comma-separated tags assigned during console enrollment.",
"needs": [
"console_enrollment_enabled=true"
],
"config": {
"placeholder": "homelab,edge"
}
},
{
"name": "console_enrollment_key",
"type": "secret",
"title": "Enrollment Key",
"required": true,
"description": "Enrollment key generated by CrowdSec Console.",
"needs": [
"console_enrollment_enabled=true"
]
}
]
},
{
"title": "Bouncers",
"name": "bouncers",
"items": [
{
"name": "bouncer_traefik_key",
"type": "secret",
"title": "Traefik Bouncer Key",
"required": false,
"description": "Optional seed key for a Traefik bouncer or plugin.",
"config": {
"autogenerated": {
"length": 32
}
}
}
]
}
]
}
-47
View File
@@ -1,47 +0,0 @@
---
services:
<< service_name >>:
image: docker.io/louislam/dockge:1.5.0
restart: << restart_policy >>
environment:
- TZ=<< container_timezone >>
- DOCKGE_STACKS_DIR=<< stacks_path >>
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- << service_name >>_data:/app/data
- << stacks_path >>:<< stacks_path >>
<%- if traefik_enabled %>
networks:
- << traefik_network >>
<%- endif %>
<%- if not traefik_enabled %>
ports:
- "<< ports_http >>:5001"
<%- endif %>
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>-web.loadBalancer.server.port=5001
- traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>-https.tls=true
- traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
volumes:
<< service_name >>_data:
driver: local
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
external: true
<%- endif %>
-175
View File
@@ -1,175 +0,0 @@
{
"slug": "dockge",
"kind": "compose",
"metadata": {
"name": "Dockge",
"description": "Web-based Docker Compose stack manager with a clean UI for creating, editing, starting, and stopping compose stacks directly from the browser.",
"tags": [
"traefik"
],
"icon": {
"provider": "selfhst",
"id": "dockge"
},
"draft": false,
"version": {
"name": "1.5.0",
"source_dep_name": "docker.io/louislam/dockge",
"source_dep_version": "1.5.0"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "dockge",
"config": {
"placeholder": "dockge"
}
},
{
"name": "container_timezone",
"type": "str",
"title": "Container Timezone",
"required": false,
"config": {
"placeholder": "Europe/Berlin"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
},
{
"name": "stacks_path",
"type": "str",
"title": "Docker Compose Path",
"required": true,
"default": "/stacks",
"description": "Path used for Docker Compose.",
"config": {
"placeholder": "/stacks"
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "dockge"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_http",
"type": "str",
"title": "HTTP Port",
"required": false,
"default": 5001,
"config": {
"placeholder": "5001"
}
}
]
}
]
}
-7
View File
@@ -1,7 +0,0 @@
# Dockhand credentials
<%- if database_type == 'postgres' %>
DATABASE_PASSWORD=<< database_password >>
<%- endif %>
<%- if encryption_key %>
ENCRYPTION_KEY=<< encryption_key >>
<%- endif %>
@@ -1,59 +0,0 @@
services:
<< service_name >>:
image: docker.io/fnsys/dockhand:v1.0.27
restart: << restart_policy >>
<%- if database_type == 'postgres' or disable_local_login or encryption_key or puid or pgid %>
environment:
<%- if database_type == 'postgres' %>
- DATABASE_URL=postgres://<< database_user >>:${DATABASE_PASSWORD}@<< database_host >>:<< database_port >>/<< database_name >>
<%- endif %>
<%- if encryption_key %>
- ENCRYPTION_KEY=${ENCRYPTION_KEY}
<%- endif %>
<%- if puid %>
- PUID=<< puid >>
<%- endif %>
<%- if pgid %>
- PGID=<< pgid >>
<%- endif %>
<%- if disable_local_login %>
- DISABLE_LOCAL_LOGIN=<< disable_local_login | lower >>
<%- endif %>
<%- endif %>
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- dockhand_data:/app/data
<%- if traefik_enabled %>
networks:
- << traefik_network >>
<%- endif %>
<%- if not traefik_enabled %>
ports:
- "<< ports_http >>:3000"
<%- endif %>
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>-web.loadBalancer.server.port=3000
- traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>-https.tls=true
- traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
volumes:
dockhand_data:
driver: local
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
external: true
<%- endif %>
-290
View File
@@ -1,290 +0,0 @@
{
"slug": "dockhand",
"kind": "compose",
"metadata": {
"name": "Dockhand",
"description": "Modern Docker management UI with Compose stack support, Git-based stack deployments, and optional OIDC authentication.",
"tags": [
"traefik",
"postgresql",
"sqlite"
],
"icon": {
"provider": "selfhst",
"id": "dockhand"
},
"draft": false,
"version": {
"name": "v1.0.27",
"source_dep_name": "docker.io/fnsys/dockhand",
"source_dep_version": "v1.0.27"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "dockhand",
"config": {
"placeholder": "dockhand"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
},
{
"name": "encryption_key",
"type": "secret",
"title": "Encryption Key",
"required": false,
"description": "Base64-encoded 32-byte AES-256 key used for credential encryption.",
"config": {
"autogenerated": {
"kind": "base64",
"bytes": 32
}
}
},
{
"name": "puid",
"type": "int",
"title": "PUID",
"required": false,
"config": {
"placeholder": "1000"
},
"description": "Optional user ID for Dockhand. On Linux check with `id -u`."
},
{
"name": "pgid",
"type": "int",
"title": "PGID",
"required": false,
"config": {
"placeholder": "1000"
},
"description": "Optional group ID for Dockhand. On Linux check with `id -g`."
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_http",
"type": "int",
"title": "HTTP Port",
"required": true,
"default": 3000,
"needs": [
"traefik_enabled=false"
],
"config": {
"placeholder": "3000"
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "dockhand"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"needs": [
"traefik_tls_enabled=true"
],
"config": {
"placeholder": "cloudflare"
}
}
]
},
{
"title": "Database",
"name": "database",
"items": [
{
"name": "database_type",
"type": "enum",
"title": "Database Type",
"required": false,
"default": "sqlite",
"config": {
"options": [
"sqlite",
"postgres"
]
}
},
{
"name": "database_host",
"type": "str",
"title": "Database Host",
"required": true,
"needs": [
"database_type=postgres"
],
"default": "postgres",
"config": {
"placeholder": "postgres"
}
},
{
"name": "database_port",
"type": "int",
"title": "Database Port",
"required": true,
"needs": [
"database_type=postgres"
],
"default": 5432,
"config": {
"placeholder": "5432"
}
},
{
"name": "database_name",
"type": "str",
"title": "Database Name",
"required": true,
"needs": [
"database_type=postgres"
],
"default": "dockhand",
"config": {
"placeholder": "dockhand"
},
"description": "Database name used for PostgreSQL."
},
{
"name": "database_user",
"type": "str",
"title": "Database User",
"required": true,
"needs": [
"database_type=postgres"
],
"default": "dockhand",
"config": {
"placeholder": "dockhand"
},
"description": "Username used for PostgreSQL."
},
{
"name": "database_password",
"type": "secret",
"title": "Database Password",
"required": true,
"needs": [
"database_type=postgres"
],
"description": "Password used for PostgreSQL."
}
]
},
{
"title": "Authentication",
"name": "authentication",
"items": [
{
"name": "disable_local_login",
"type": "bool",
"title": "Disable Local Login",
"required": false,
"default": false,
"description": "when SSO correctly setup, not recommended as first deployment"
}
]
}
]
}
-5
View File
@@ -1,5 +0,0 @@
# Forgejo database credentials
<%- if database_type != 'sqlite' %>
DATABASE_USER=<< database_user >>
DATABASE_PASSWORD=<< database_password >>
<%- endif %>
-118
View File
@@ -1,118 +0,0 @@
services:
<< service_name >>:
image: codeberg.org/forgejo/forgejo:15.0.2
restart: << restart_policy >>
environment:
- USER_UID=<< user_uid >>
- USER_GID=<< user_gid >>
<%- if database_type != 'sqlite' %>
- FORGEJO__database__DB_TYPE=<< database_type >>
<%- if database_external %>
- FORGEJO__database__HOST=<< database_host >>
<%- else %>
- FORGEJO__database__HOST=<< service_name >>_db
<%- endif %>
- FORGEJO__database__NAME=<< database_name >>
- FORGEJO__database__USER=${DATABASE_USER}
- FORGEJO__database__PASSWD=${DATABASE_PASSWORD}
<%- endif %>
- FORGEJO__server__SSH_PORT=<< ports_ssh >>
<%- if not traefik_enabled %>
- FORGEJO__server__ROOT_URL=<< forgejo_url >>
<%- else %>
- FORGEJO__server__ROOT_URL=https://<< traefik_host >>.<< traefik_domain >>
<%- endif %>
<%- if not database_external and (database_type == "postgres" or database_type == "mysql") or traefik_enabled %>
networks:
<%- if not database_external and database_type != 'sqlite' %>
- << service_name >>_backend
<%- endif %>
<%- if traefik_enabled %>
- << traefik_network >>
<%- endif %>
<%- endif %>
ports:
<%- if not traefik_enabled %>
- "<< ports_http >>:3000"
<%- endif %>
- "<< ports_ssh >>:22"
volumes:
- << service_name >>_data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>_web.loadBalancer.server.port=3000
- traefik.http.routers.<< service_name >>_http.service=<< service_name >>_web
- traefik.http.routers.<< service_name >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>_http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>_https.service=<< service_name >>_web
- traefik.http.routers.<< service_name >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>_https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>_https.tls=true
- traefik.http.routers.<< service_name >>_https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
<%- if not database_external and database_type != 'sqlite' %>
depends_on:
- << service_name >>_db
<%- endif %>
<%- if not database_external and database_type == "postgres" %>
<< service_name >>_db:
image: docker.io/library/postgres:18
restart: << restart_policy >>
environment:
- TZ=<< container_timezone >>
- POSTGRES_USER=${DATABASE_USER}
- POSTGRES_PASSWORD=${DATABASE_PASSWORD}
- POSTGRES_DB=<< database_name >>
networks:
- << service_name >>_backend
healthcheck:
test: ["CMD-SHELL", "pg_isready -U << database_user >>"]
start_period: 30s
interval: 10s
timeout: 10s
retries: 5
volumes:
- << service_name >>_db:/var/lib/postgresql/data
<%- elif not database_external and database_type == "mysql" %>
<< service_name >>_db:
image: docker.io/library/mysql:8.1
restart: << restart_policy >>
environment:
- MYSQL_USER=${DATABASE_USER}
- MYSQL_PASSWORD=${DATABASE_PASSWORD}
- MYSQL_DATABASE=<< database_name >>
- MYSQL_ROOT_PASSWORD=${DATABASE_PASSWORD}
networks:
- << service_name >>_backend
volumes:
- << service_name >>_db:/var/lib/mysql
<%- endif %>
volumes:
<< service_name >>_data:
driver: local
<%- if not database_external %>
<%- if database_type == "postgres" or database_type == "mysql" %>
<< service_name >>_db:
driver: local
<%- endif %>
<%- endif %>
<%- if not database_external and (database_type == "postgres" or database_type == "mysql") or traefik_enabled %>
networks:
<%- if not database_external %>
<< service_name >>_backend:
driver: bridge
<%- endif %>
<%- if traefik_enabled %>
<< traefik_network >>:
external: true
<%- endif %>
<%- endif %>
-290
View File
@@ -1,290 +0,0 @@
{
"slug": "forgejo",
"kind": "compose",
"metadata": {
"name": "Forgejo",
"description": "Self-hosted lightweight software forge for Git repository hosting, code review, issue tracking, package publishing, and team collaboration.",
"tags": [
"traefik"
],
"icon": {
"provider": "selfhst",
"id": "forgejo"
},
"draft": false,
"version": {
"name": "15.0.2",
"source_dep_name": "codeberg.org/forgejo/forgejo",
"source_dep_version": "15.0.2"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "forgejo",
"config": {
"placeholder": "forgejo"
}
},
{
"name": "container_timezone",
"type": "str",
"title": "Container Timezone",
"required": false,
"config": {
"placeholder": "Europe/Berlin"
}
},
{
"name": "user_uid",
"type": "int",
"title": "User Uid",
"required": false,
"default": 1000,
"config": {
"placeholder": "1000"
}
},
{
"name": "user_gid",
"type": "int",
"title": "User Gid",
"required": false,
"default": 1000,
"config": {
"placeholder": "1000"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
},
{
"name": "forgejo_url",
"type": "str",
"title": "Public URL",
"required": false,
"default": "https://forgejo.home.arpa",
"needs": [
"traefik_enabled=false"
],
"config": {
"placeholder": "https://forgejo.home.arpa"
}
}
]
},
{
"title": "Database",
"name": "database",
"items": [
{
"name": "database_type",
"type": "enum",
"title": "Database backend type",
"required": false,
"default": "sqlite",
"config": {
"options": [
"sqlite",
"postgres",
"mysql"
]
}
},
{
"name": "database_name",
"type": "str",
"title": "Database name",
"required": false,
"default": "forgejo",
"needs": [
"database_type=postgres,mysql"
],
"config": {
"placeholder": "forgejo"
}
},
{
"name": "database_user",
"type": "str",
"title": "Database user",
"required": false,
"default": "forgejo",
"needs": [
"database_type=postgres,mysql"
],
"config": {
"placeholder": "forgejo"
}
},
{
"name": "database_host",
"type": "str",
"title": "Database host",
"required": false,
"default": "postgres",
"needs": [
"database_type=postgres,mysql;database_external=true"
],
"config": {
"placeholder": "postgres"
}
},
{
"name": "database_password",
"type": "secret",
"title": "Database password",
"required": false,
"needs": [
"database_type=postgres,mysql"
],
"config": {
"autogenerated": {
"length": 32
}
}
},
{
"name": "database_external",
"type": "bool",
"title": "External Database",
"required": false,
"default": false,
"needs": [
"database_type=postgres,mysql"
]
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_http",
"type": "str",
"title": "HTTP Port",
"required": false,
"default": 3000,
"config": {
"placeholder": "3000"
}
},
{
"name": "ports_ssh",
"type": "str",
"title": "Ports Ssh",
"required": false,
"default": 2222,
"config": {
"placeholder": "2222"
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "forgejo"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
}
]
}
-5
View File
@@ -1,5 +0,0 @@
# Gitea database credentials
<%- if database_type != 'sqlite' %>
DATABASE_USER=<< database_user >>
DATABASE_PASSWORD=<< database_password >>
<%- endif %>
-118
View File
@@ -1,118 +0,0 @@
services:
<< service_name >>:
image: docker.io/gitea/gitea:1.26.1
restart: << restart_policy >>
environment:
- USER_UID=<< user_uid >>
- USER_GID=<< user_gid >>
<%- if database_type != 'sqlite' %>
- GITEA__database__DB_TYPE=<< database_type >>
<%- if database_external %>
- GITEA__database__HOST=<< database_host >>
<%- else %>
- GITEA__database__HOST=<< service_name >>_db
<%- endif %>
- GITEA__database__NAME=<< database_name >>
- GITEA__database__USER=${DATABASE_USER}
- GITEA__database__PASSWD=${DATABASE_PASSWORD}
<%- endif %>
- GITEA__server__SSH_PORT=<< ports_ssh >>
<%- if not traefik_enabled %>
- GITEA__server__ROOT_URL=<< gitea_url >>
<%- else %>
- GITEA__server__ROOT_URL=https://<< traefik_host >>.<< traefik_domain >>
<%- endif %>
<%- if not database_external and (database_type == "postgres" or database_type == "mysql") or traefik_enabled %>
networks:
<%- if not database_external and database_type != 'sqlite' %>
- << service_name >>_backend
<%- endif %>
<%- if traefik_enabled %>
- << traefik_network >>
<%- endif %>
<%- endif %>
ports:
<%- if not traefik_enabled %>
- "<< ports_http >>:3000"
<%- endif %>
- "<< ports_ssh >>:22"
volumes:
- << service_name >>_data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>_web.loadBalancer.server.port=3000
- traefik.http.routers.<< service_name >>_http.service=<< service_name >>_web
- traefik.http.routers.<< service_name >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>_http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>_https.service=<< service_name >>_web
- traefik.http.routers.<< service_name >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>_https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>_https.tls=true
- traefik.http.routers.<< service_name >>_https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
<%- if not database_external and database_type != 'sqlite' %>
depends_on:
- << service_name >>_db
<%- endif %>
<%- if not database_external and database_type == "postgres" %>
<< service_name >>_db:
image: docker.io/library/postgres:17.9
restart: << restart_policy >>
environment:
- TZ=<< container_timezone >>
- POSTGRES_USER=${DATABASE_USER}
- POSTGRES_PASSWORD=${DATABASE_PASSWORD}
- POSTGRES_DB=<< database_name >>
networks:
- << service_name >>_backend
healthcheck:
test: ["CMD-SHELL", "pg_isready -U << database_user >>"]
start_period: 30s
interval: 10s
timeout: 10s
retries: 5
volumes:
- << service_name >>_db:/var/lib/postgresql/data
<%- elif not database_external and database_type == "mysql" %>
<< service_name >>_db:
image: docker.io/library/mysql:8.1
restart: << restart_policy >>
environment:
- MYSQL_USER=${DATABASE_USER}
- MYSQL_PASSWORD=${DATABASE_PASSWORD}
- MYSQL_DATABASE=<< database_name >>
- MYSQL_ROOT_PASSWORD=${DATABASE_PASSWORD}
networks:
- << service_name >>_backend
volumes:
- << service_name >>_db:/var/lib/mysql
<%- endif %>
volumes:
<< service_name >>_data:
driver: local
<%- if not database_external %>
<%- if database_type == "postgres" or database_type == "mysql" %>
<< service_name >>_db:
driver: local
<%- endif %>
<%- endif %>
<%- if not database_external and (database_type == "postgres" or database_type == "mysql") or traefik_enabled %>
networks:
<%- if not database_external %>
<< service_name >>_backend:
driver: bridge
<%- endif %>
<%- if traefik_enabled %>
<< traefik_network >>:
external: true
<%- endif %>
<%- endif %>
-291
View File
@@ -1,291 +0,0 @@
{
"slug": "gitea",
"kind": "compose",
"metadata": {
"name": "Gitea",
"description": "Lightweight, self-hosted Git service with a web interface for repository hosting, code review, issue tracking, and team collaboration. Written in Go.",
"tags": [
"traefik"
],
"icon": {
"provider": "selfhst",
"id": "gitea",
"color": "emerald"
},
"draft": false,
"version": {
"name": "1.26.1-1",
"source_dep_name": "docker.io/gitea/gitea",
"source_dep_version": "1.26.1"
}
},
"variables": [
{
"name": "general",
"title": "General",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "gitea",
"config": {
"placeholder": "gitea"
}
},
{
"name": "container_timezone",
"type": "str",
"title": "Container Timezone",
"required": false,
"config": {
"placeholder": "Europe/Berlin"
}
},
{
"name": "user_uid",
"type": "int",
"title": "User Uid",
"required": false,
"default": 1000,
"config": {
"placeholder": "1000"
}
},
{
"name": "user_gid",
"type": "int",
"title": "User Gid",
"required": false,
"default": 1000,
"config": {
"placeholder": "1000"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
},
{
"name": "gitea_url",
"type": "str",
"title": "Public URL",
"required": false,
"default": "https://git.home.arpa",
"config": {
"placeholder": "https://git.home.arpa"
},
"needs": [
"traefik_enabled=false"
]
}
]
},
{
"name": "database",
"title": "Database",
"items": [
{
"name": "database_type",
"type": "enum",
"title": "Database backend type",
"required": false,
"default": "sqlite",
"config": {
"options": [
"sqlite",
"postgres",
"mysql"
]
}
},
{
"name": "database_name",
"type": "str",
"title": "Database name",
"required": false,
"default": "gitea",
"config": {
"placeholder": "gitea"
},
"needs": [
"database_type=postgres,mysql"
]
},
{
"name": "database_user",
"type": "str",
"title": "Database user",
"required": false,
"default": "gitea",
"config": {
"placeholder": "gitea"
},
"needs": [
"database_type=postgres,mysql"
]
},
{
"name": "database_host",
"type": "str",
"title": "Database host",
"required": false,
"default": "postgres",
"config": {
"placeholder": "postgres"
},
"needs": [
"database_type=postgres,mysql;database_external=true"
]
},
{
"name": "database_password",
"type": "secret",
"title": "Database password",
"required": false,
"config": {
"autogenerated": {
"length": 32
}
},
"needs": [
"database_type=postgres,mysql"
]
},
{
"name": "database_external",
"type": "bool",
"title": "External Database",
"required": false,
"default": false,
"needs": [
"database_type=postgres,mysql"
]
}
]
},
{
"name": "ports",
"title": "Ports",
"items": [
{
"name": "ports_http",
"type": "str",
"title": "HTTP Port",
"required": false,
"default": 3000,
"config": {
"placeholder": "3000"
}
},
{
"name": "ports_ssh",
"type": "str",
"title": "Ports Ssh",
"required": false,
"default": 2221,
"config": {
"placeholder": "2221"
}
}
]
},
{
"name": "traefik",
"title": "Traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "gitea"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
}
]
}
@@ -1,8 +0,0 @@
services:
<< service_name >>:
image: docker.io/gitlab/gitlab-runner:alpine-v17.9.1
container_name: << container_name >>
volumes:
- ./config/config.toml:/etc/gitlab-runner/config.toml:ro
- /var/run/docker.sock:/var/run/docker.sock
restart: << restart_policy >>
@@ -1,25 +0,0 @@
concurrent = << gitlab_runner_concurrent >>
log_level = "warning"
log_format = "json"
check_interval = 5
[[runners]]
name = "<< gitlab_runner_name >>"
url = "<< gitlab_url >>"
executor = "docker"
token = "<< gitlab_runner_token >>"
limit = 0
# FIXME To increase rate limits, when pulling down images from the Docker Hub you might want to authenticate:
# 1. Create a Docker Hub account and generate a personal access token
# 2. Encode the username and token in base64
# Example: echo -n 'username:token' | base64
# 3. Replace the <BASE64_ENCODED_AUTH> with the base64 encoded string
environment = ["DOCKER_AUTH_CONFIG={\"auths\":{\"https://index.docker.io/v1/\":{\"auth\":\"<BASE64_ENCODED_AUTH>\"}}}"]
[runners.docker]
tls_verify = false
image = "<< gitlab_executor_image >>"
privileged = true
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
[runners.cache]
Insecure = false
-112
View File
@@ -1,112 +0,0 @@
{
"slug": "gitlab-runner",
"kind": "compose",
"metadata": {
"name": "Gitlab-Runner",
"description": "CI/CD build runner for GitLab pipelines. Executes jobs defined in .gitlab-ci.yml using the Docker executor.",
"tags": [],
"icon": {
"provider": "simple-icons",
"id": "gitlab"
},
"draft": false,
"version": {
"name": "alpine-v17.9.1",
"source_dep_name": "docker.io/gitlab/gitlab-runner",
"source_dep_version": "alpine-v17.9.1"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "gitlab-runner",
"config": {
"placeholder": "gitlab-runner"
}
},
{
"name": "container_name",
"type": "str",
"title": "Container Name",
"required": false,
"default": "gitlab-runner",
"config": {
"placeholder": "gitlab-runner"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
},
{
"name": "gitlab_url",
"type": "str",
"title": "GitLab URL",
"required": true,
"config": {
"placeholder": "https://gitlab.example.com/"
},
"description": "Base URL of the GitLab instance."
},
{
"name": "gitlab_runner_name",
"type": "str",
"title": "Runner Name",
"required": false,
"default": "gitlab-runner",
"config": {
"placeholder": "gitlab-runner"
},
"description": "Runner name shown in GitLab."
},
{
"name": "gitlab_runner_token",
"type": "secret",
"title": "Runner Authentication Token",
"required": true,
"description": "Runner authentication token created in GitLab."
},
{
"name": "gitlab_runner_concurrent",
"type": "int",
"title": "Concurrent Jobs",
"required": false,
"default": 4,
"description": "Maximum number of jobs the runner can process at the same time.",
"config": {
"placeholder": "4"
}
},
{
"name": "gitlab_executor_image",
"type": "str",
"title": "Default Executor Image",
"required": false,
"default": "alpine:latest",
"config": {
"placeholder": "alpine:latest"
},
"description": "Default Docker image used for jobs that do not specify one."
}
]
}
]
}
-1
View File
@@ -1 +0,0 @@
GITLAB_ROOT_PASSWORD=<< root_password >>
-65
View File
@@ -1,65 +0,0 @@
services:
<< service_name >>:
image: docker.io/gitlab/gitlab-ce:18.11.2-ce.0
restart: << restart_policy >>
shm_size: '256m'
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
<%- endif %>
ports:
<%- if not traefik_enabled %>
- "<< ports_http >>:80"
<%- endif %>
- "<< ports_ssh >>:22"
<%- if registry_enabled and not traefik_enabled %>
- "<< ports_registry >>:5000"
<%- endif %>
volumes:
- ./config/gitlab.rb:/etc/gitlab/gitlab.rb:ro
- << service_name >>_config:/etc/gitlab
- << service_name >>_logs:/var/log/gitlab
- << service_name >>_data:/var/opt/gitlab
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>_web.loadBalancer.server.port=80
- traefik.http.routers.<< service_name >>_http.service=<< service_name >>_web
- traefik.http.routers.<< service_name >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>_http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>_https.service=<< service_name >>_web
- traefik.http.routers.<< service_name >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>_https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>_https.tls=true
- traefik.http.routers.<< service_name >>_https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- if registry_enabled %>
- traefik.http.services.<< service_name >>_registry.loadBalancer.server.port=5000
- traefik.http.routers.<< service_name >>_registry-http.service=<< service_name >>_registry
- traefik.http.routers.<< service_name >>_registry-http.rule=Host(`<< traefik_registry_host >>`)
- traefik.http.routers.<< service_name >>_registry-http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>_registry-https.service=<< service_name >>_registry
- traefik.http.routers.<< service_name >>_registry-https.rule=Host(`<< traefik_registry_host >>`)
- traefik.http.routers.<< service_name >>_registry-https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>_registry-https.tls=true
- traefik.http.routers.<< service_name >>_registry-https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
<%- endif %>
volumes:
<< service_name >>_config:
driver: local
<< service_name >>_logs:
driver: local
<< service_name >>_data:
driver: local
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
external: true
<%- endif %>
@@ -1,94 +0,0 @@
# GitLab Configuration
external_url '<< external_url >>'
# Initial root user configuration (only used on first initialization)
gitlab_rails['initial_root_password'] = '<< root_password >>'
gitlab_rails['initial_root_email'] = '<< root_email >>'
# GitLab Shell SSH settings
gitlab_rails['gitlab_shell_ssh_port'] = << ports_ssh >>
# Let's Encrypt and built-in TLS settings are currently not supported by the template
# as we are using Traefik as a reverse proxy
letsencrypt['enable'] = false
nginx['listen_port'] = 80
nginx['listen_https'] = false
<%- if traefik_tls_enabled %>
# Traefik settings, to redirect http to https
nginx['redirect_http_to_https'] = true
<%- endif %>
<%- if registry_enabled %>
# Container Registry settings
registry_external_url '<< registry_external_url >>'
gitlab_rails['registry_enabled'] = true
registry_nginx['listen_https'] = false
registry_nginx['listen_port'] = 5000
<%- endif %>
<%- if authentik_enabled %>
# Authentik SSO settings
gitlab_rails['omniauth_auto_link_user'] = ['openid_connect']
gitlab_rails['omniauth_providers'] = [
{
name: "openid_connect",
label: "Authentik",
icon: "https://avatars.githubusercontent.com/u/82976448?s=200&v=4",
args: {
name: "openid_connect",
scope: ["openid","profile","email"],
response_type: "code",
issuer: "<< authentik_url >>/application/o/<< authentik_slug >>/",
discovery: true,
client_auth_method: "query",
uid_field: "email",
send_scope_to_token_endpoint: "false",
pkce: true,
client_options: {
identifier: "<< authentik_client_id >>",
secret: "<< authentik_client_secret >>",
redirect_uri: "<< external_url >>/users/auth/openid_connect/callback"
}
}
}
]
<%- endif %>
<%- if email_enabled %>
# SMTP settings
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "<< email_host >>"
gitlab_rails['smtp_port'] = << email_port >>
gitlab_rails['smtp_user_name'] = "<< email_username >>"
gitlab_rails['smtp_password'] = "<< email_password >>"
gitlab_rails['smtp_authentication'] = "login"
<%- if email_use_ssl %>
gitlab_rails['smtp_ssl'] = true
gitlab_rails['smtp_force_ssl'] = true
<%- elif email_use_tls %>
gitlab_rails['smtp_tls'] = true
<%- endif %>
gitlab_rails['gitlab_email_from'] = '<< email_from >>'
gitlab_rails['gitlab_email_reply_to'] = '<< email_from >>'
<%- endif %>
<%- if performance_preset == 'homelab' %>
# Performance optimizations for homelab/low-resource environments
# NOTE: These settings reduce resource usage but may impact performance under high load
postgresql['shared_buffers'] = "256MB"
sidekiq['max_concurrency'] = 4
sidekiq['concurrency'] = 1
puma['worker_timeout'] = 120
puma['worker_processes'] = 1
<%- endif %>
# Prometheus monitoring
prometheus_monitoring['enable'] = << prometheus_enabled | lower >>
# Default UI settings
gitlab_rails['gitlab_default_theme'] = << default_theme >>
gitlab_rails['gitlab_default_color_mode'] = << default_color_mode >>
# Product usage data
gitlab_rails['initial_gitlab_product_usage_data'] = <%- if disable_usage_data %>false<%- else %>true<%- endif %>
-428
View File
@@ -1,428 +0,0 @@
{
"slug": "gitlab",
"kind": "compose",
"metadata": {
"name": "GitLab",
"description": "Complete DevOps platform providing Git repository management, CI/CD pipelines, issue tracking, and an optional container registry in a single application.",
"tags": [
"traefik"
],
"icon": {
"provider": "selfhst",
"id": "gitlab"
},
"draft": false,
"version": {
"name": "18.11.2-ce.0",
"source_dep_name": "docker.io/gitlab/gitlab-ce",
"source_dep_version": "18.11.2-ce.0"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "gitlab",
"config": {
"placeholder": "gitlab"
}
},
{
"name": "external_url",
"type": "str",
"title": "External URL",
"required": false,
"default": "http://localhost",
"config": {
"placeholder": "http://localhost"
}
},
{
"name": "root_email",
"type": "str",
"title": "Root Email",
"required": true,
"description": "Initial root user email address",
"config": {
"placeholder": "admin@home.arpa"
}
},
{
"name": "root_password",
"type": "secret",
"title": "Root Password",
"required": false,
"description": "Initial root user password (only used on first initialization)",
"config": {
"autogenerated": {
"length": 32
}
}
},
{
"name": "default_theme",
"type": "int",
"title": "UI Theme",
"required": false,
"default": 2,
"description": "Default GitLab UI theme (2 = dark mode)",
"config": {
"placeholder": "2"
}
},
{
"name": "default_color_mode",
"type": "int",
"title": "Color Mode",
"required": false,
"default": 2,
"description": "Default color mode (2 = dark mode)",
"config": {
"placeholder": "2"
}
},
{
"name": "disable_usage_data",
"type": "bool",
"title": "Usage Data",
"required": false,
"default": true,
"description": "Disable product usage metrics upload to GitLab"
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
}
]
},
{
"title": "Advanced Settings",
"name": "advanced",
"items": [
{
"name": "performance_preset",
"type": "enum",
"title": "Performance optimization profile",
"required": false,
"default": "homelab",
"config": {
"options": [
"homelab",
"default"
]
}
},
{
"name": "prometheus_enabled",
"type": "bool",
"title": "Prometheus",
"required": false,
"default": false
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_http",
"type": "str",
"title": "HTTP Port",
"required": false,
"default": 80,
"config": {
"placeholder": "80"
}
},
{
"name": "ports_ssh",
"type": "str",
"title": "Ports Ssh",
"required": false,
"default": 2424,
"config": {
"placeholder": "2424"
}
},
{
"name": "ports_registry",
"type": "int",
"title": "Container Registry port",
"required": false,
"default": 5000,
"config": {
"placeholder": "5000"
}
}
]
},
{
"title": "Registry",
"toggle": "registry_enabled",
"name": "registry",
"items": [
{
"name": "registry_enabled",
"type": "bool",
"title": "Registry",
"required": false,
"default": false
},
{
"name": "registry_external_url",
"type": "str",
"title": "Registry URL",
"required": false,
"default": "http://localhost:5000",
"description": "External URL for Container Registry",
"config": {
"placeholder": "http://localhost:5000"
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "gitlab"
}
},
{
"name": "traefik_registry_host",
"type": "str",
"title": "Registry Host",
"required": false,
"default": "registry.home.arpa",
"description": "Hostname for Container Registry in Traefik (if enabled)",
"needs": [
"registry_enabled=true"
],
"config": {
"placeholder": "registry.home.arpa"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
},
{
"title": "Email",
"toggle": "email_enabled",
"name": "email",
"items": [
{
"name": "email_enabled",
"type": "bool",
"title": "Email",
"required": false,
"default": false
},
{
"name": "email_host",
"type": "str",
"title": "SMTP server hostname",
"required": false,
"default": "",
"config": {
"placeholder": "smtp.home.arpa"
}
},
{
"name": "email_port",
"type": "int",
"title": "SMTP server port",
"required": false,
"default": 587,
"config": {
"placeholder": "587"
}
},
{
"name": "email_username",
"type": "str",
"title": "SMTP username",
"required": false,
"default": "",
"config": {
"placeholder": "user@example.com"
}
},
{
"name": "email_password",
"type": "secret",
"title": "SMTP password",
"required": false,
"default": ""
},
{
"name": "email_from",
"type": "str",
"title": "From email address",
"required": false,
"default": "",
"config": {
"placeholder": "noreply@example.com"
}
},
{
"name": "email_use_tls",
"type": "bool",
"title": "SMTP TLS",
"required": false,
"default": true
},
{
"name": "email_use_ssl",
"type": "bool",
"title": "SMTP SSL",
"required": false,
"default": false
}
]
},
{
"title": "Authentik",
"toggle": "authentik_enabled",
"name": "authentik",
"items": [
{
"name": "authentik_enabled",
"type": "bool",
"title": "Authentik SSO",
"required": false,
"default": false
},
{
"name": "authentik_url",
"type": "str",
"title": "Auth URL",
"required": false,
"default": "https://auth.home.arpa",
"description": "Authentik base URL (e.g., https://auth.home.arpa)",
"config": {
"placeholder": "https://auth.home.arpa"
}
},
{
"name": "authentik_slug",
"type": "str",
"title": "Authentik application slug",
"required": false,
"default": "gitlab",
"config": {
"placeholder": "gitlab"
}
},
{
"name": "authentik_client_id",
"type": "str",
"title": "Client ID",
"required": false,
"default": "",
"description": "OAuth client ID from Authentik provider"
},
{
"name": "authentik_client_secret",
"type": "secret",
"title": "Client Secret",
"required": false,
"default": "",
"description": "OAuth client secret from Authentik provider"
}
]
}
]
}
-9
View File
@@ -1,9 +0,0 @@
# Grafana credentials
<%- if database_type == 'postgres' %>
DATABASE_USER=<< database_user >>
GRAFANA_DB_PASSWORD=<< database_password >>
<%- endif %>
<%- if authentik_enabled %>
GRAFANA_OAUTH_CLIENT_ID=<< authentik_client_id >>
GRAFANA_OAUTH_CLIENT_SECRET=<< authentik_client_secret >>
<%- endif %>
-108
View File
@@ -1,108 +0,0 @@
services:
<< service_name >>:
image: docker.io/grafana/grafana:13.0.1
restart: << restart_policy >>
<%- if database_type == 'postgres' or authentik_enabled %>
environment:
<%- if database_type == 'postgres' %>
- GF_DATABASE_TYPE=postgres
<%- if database_external %>
- GF_DATABASE_HOST=<< database_host >>
<%- else %>
- GF_DATABASE_HOST=<< service_name >>_db
<%- endif %>
- GF_DATABASE_NAME=<< database_name >>
- GF_DATABASE_USER=${DATABASE_USER}
- GF_DATABASE_PASSWORD=${GRAFANA_DB_PASSWORD}
- GF_DATABASE_SSL_MODE=disable
<%- endif %>
<%- if authentik_enabled %>
- GF_AUTH_GENERIC_OAUTH_ENABLED=true
- GF_AUTH_GENERIC_OAUTH_NAME=<< authentik_slug >>
- GF_AUTH_GENERIC_OAUTH_CLIENT_ID=${GRAFANA_OAUTH_CLIENT_ID}
- GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET=${GRAFANA_OAUTH_CLIENT_SECRET}
- GF_AUTH_GENERIC_OAUTH_SCOPES=openid profile email
- GF_AUTH_GENERIC_OAUTH_AUTH_URL=<< authentik_url >>/application/o/authorize/
- GF_AUTH_GENERIC_OAUTH_TOKEN_URL=<< authentik_url >>/application/o/token/
- GF_AUTH_GENERIC_OAUTH_API_URL=<< authentik_url >>/application/o/userinfo/
- GF_AUTH_SIGNOUT_REDIRECT_URL=<< authentik_url >>/application/o/<< authentik_slug >>/end-session/
- GF_AUTH_OAUTH_AUTO_LOGIN=true
<%- if traefik_enabled %>
- GF_SERVER_ROOT_URL=https://<< traefik_host >>.<< traefik_domain >>
<%- endif %>
- GF_AUTH_OAUTH_ALLOW_INSECURE_EMAIL_LOOKUP=true
- GF_AUTH_GENERIC_OAUTH_SKIP_ORG_ROLE_SYNC=true
<%- endif %>
<%- endif %>
<%- if not database_external and (database_type == "postgres") or traefik_enabled %>
networks:
<%- if not database_external and database_type != 'sqlite' %>
- << service_name >>_backend
<%- endif %>
<%- if traefik_enabled %>
- << traefik_network >>
<%- endif %>
<%- endif %>
<%- if not traefik_enabled %>
ports:
- "<< ports_http >>:3000"
<%- endif %>
volumes:
- << service_name >>_data:/var/lib/grafana
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>_web.loadBalancer.server.port=3000
- traefik.http.routers.<< service_name >>_http.service=<< service_name >>_web
- traefik.http.routers.<< service_name >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>_http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>_https.service=<< service_name >>_web
- traefik.http.routers.<< service_name >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>_https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>_https.tls=true
- traefik.http.routers.<< service_name >>_https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
<%- if not database_external and database_type == "postgres" %>
<< service_name >>_db:
image: docker.io/library/postgres:17.9
restart: << restart_policy >>
environment:
- POSTGRES_USER=${DATABASE_USER}
- POSTGRES_PASSWORD=${GRAFANA_DB_PASSWORD}
- POSTGRES_DB=<< database_name >>
networks:
- << service_name >>_backend
healthcheck:
test: ["CMD-SHELL", "pg_isready -U << database_user >>"]
start_period: 30s
interval: 10s
timeout: 10s
retries: 5
volumes:
- << service_name >>_db:/var/lib/postgresql/data
<%- endif %>
<%- if not database_external and (database_type == "postgres") or traefik_enabled %>
networks:
<%- if not database_external %>
<< service_name >>_backend:
driver: bridge
<%- endif %>
<%- if traefik_enabled %>
<< traefik_network >>:
external: true
<%- endif %>
<%- endif %>
volumes:
<< service_name >>_data:
driver: local
<%- if not database_external and database_type == 'postgres' %>
<< service_name >>_db:
driver: local
<%- endif %>
-290
View File
@@ -1,290 +0,0 @@
{
"slug": "grafana",
"kind": "compose",
"metadata": {
"name": "Grafana",
"description": "Open-source observability platform for visualizing and analyzing metrics, logs, and traces from various data sources through flexible, customizable dashboards.",
"tags": [
"traefik",
"authentik"
],
"icon": {
"provider": "selfhst",
"id": "grafana"
},
"draft": false,
"version": {
"name": "13.0.1",
"source_dep_name": "docker.io/grafana/grafana",
"source_dep_version": "13.0.1"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "grafana",
"config": {
"placeholder": "grafana"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_http",
"type": "str",
"title": "HTTP Port",
"required": false,
"default": 3000,
"config": {
"placeholder": "3000"
}
}
]
},
{
"title": "Authentik",
"toggle": "authentik_enabled",
"name": "authentik",
"items": [
{
"name": "authentik_enabled",
"type": "bool",
"title": "Authentik SSO",
"required": false,
"default": false
},
{
"name": "authentik_url",
"type": "str",
"title": "Authentik Url",
"required": true,
"default": "https://auth.home.arpa",
"needs": [
"authentik_enabled=true"
],
"config": {
"placeholder": "https://auth.home.arpa"
}
},
{
"name": "authentik_slug",
"type": "str",
"title": "Authentik Slug",
"required": true,
"default": "grafana",
"needs": [
"authentik_enabled=true"
],
"config": {
"placeholder": "grafana"
}
},
{
"name": "authentik_client_id",
"type": "secret",
"title": "Authentik Client Id",
"required": true,
"needs": [
"authentik_enabled=true"
]
},
{
"name": "authentik_client_secret",
"type": "secret",
"title": "Authentik Client Secret",
"required": true,
"needs": [
"authentik_enabled=true"
]
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "grafana"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
},
{
"title": "Database",
"name": "database",
"items": [
{
"name": "database_type",
"type": "enum",
"title": "Database Type",
"required": false,
"config": {
"options": [
"sqlite",
"postgres"
]
}
},
{
"name": "database_external",
"type": "bool",
"title": "External Database",
"required": false,
"default": false,
"needs": [
"database_type=postgres"
]
},
{
"name": "database_name",
"type": "str",
"title": "Database Name",
"required": false,
"default": "grafana",
"needs": [
"database_type=postgres"
],
"config": {
"placeholder": "grafana"
}
},
{
"name": "database_user",
"type": "str",
"title": "Database User",
"required": false,
"default": "grafana",
"needs": [
"database_type=postgres"
],
"config": {
"placeholder": "grafana"
}
},
{
"name": "database_password",
"type": "secret",
"title": "Database Password",
"required": true,
"needs": [
"database_type=postgres"
]
},
{
"name": "database_host",
"type": "str",
"title": "Database Host",
"required": true,
"needs": [
"database_type=postgres",
"database_external=true"
],
"config": {
"placeholder": "postgres.home.arpa"
}
}
]
}
]
}
@@ -1,15 +0,0 @@
services:
<< service_name >>:
container_name: << container_name >>
image: ghcr.io/home-assistant/home-assistant:2026.4.4
network_mode: host
environment:
- TZ=<< container_timezone >>
volumes:
- ./config:/config
- /etc/localtime:/etc/localtime:ro
- /run/dbus:/run/dbus:ro
# devices:
# - /dev/ttyACMO # (optional) Add serial devices to the container
privileged: true
restart: << restart_policy >>
@@ -1,72 +0,0 @@
{
"slug": "homeassistant",
"kind": "compose",
"metadata": {
"name": "Homeassistant",
"description": "Open-source smart home automation platform that puts local control and privacy first. Supports thousands of devices and integrations.",
"tags": [],
"icon": {
"provider": "selfhst",
"id": "home-assistant"
},
"draft": false,
"version": {
"name": "2026.4.4",
"source_dep_name": "ghcr.io/home-assistant/home-assistant",
"source_dep_version": "2026.4.4"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "container_name",
"type": "str",
"title": "Container Name",
"required": false,
"default": "homeassistant",
"config": {
"placeholder": "homeassistant"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": false,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
},
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "homeassistant",
"config": {
"placeholder": "homeassistant"
}
},
{
"name": "container_timezone",
"type": "str",
"title": "Container Timezone",
"required": false,
"default": "UTC",
"config": {
"placeholder": "UTC"
}
}
]
}
]
}
@@ -1,90 +0,0 @@
services:
<< service_name >>:
image: ghcr.io/gethomepage/homepage:v1.12.3
restart: << restart_policy >>
<%- if container_name %>
container_name: << container_name >>
<%- endif %>
environment:
<%- if traefik_enabled %>
- HOMEPAGE_ALLOWED_HOSTS=<< traefik_host >>.<< traefik_domain >>
<%- else %>
- HOMEPAGE_ALLOWED_HOSTS=localhost:<< ports_http >>,127.0.0.1:<< ports_http >>
<%- endif %>
<%- if container_timezone %>
- TZ=<< container_timezone >>
<%- endif %>
<%- if container_loglevel %>
- LOG_LEVEL=<< container_loglevel >>
<%- endif %>
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
<%- endif %>
<%- if not traefik_enabled %>
ports:
- << ports_http >>:3000
<%- endif %>
volumes:
<%- if volume_mode == 'local' %>
- << service_name >>_config:/app/config
- << service_name >>_images:/app/images
- << service_name >>_icons:/app/icons
<%- elif volume_mode == 'mount' %>
- << volume_mount_path >>/<< service_name >>/config:/app/config
- << volume_mount_path >>/<< service_name >>/images:/app/images
- << volume_mount_path >>/<< service_name >>/icons:/app/icons
<%- elif volume_mode == 'nfs' %>
- << service_name >>_config:/app/config
- << service_name >>_images:/app/images
- << service_name >>_icons:/app/icons
<%- endif %>
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>-web.loadbalancer.server.port=3000
- traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>-https.tls=true
- traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
external: true
<%- endif %>
<%- if volume_mode == 'local' %>
volumes:
<< service_name >>_config:
<< service_name >>_images:
<< service_name >>_icons:
<%- elif volume_mode == 'nfs' %>
volumes:
<< service_name >>_config:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>/config"
<< service_name >>_images:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>/images"
<< service_name >>_icons:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>/icons"
<%- endif %>
-255
View File
@@ -1,255 +0,0 @@
{
"slug": "homepage",
"kind": "compose",
"metadata": {
"name": "Homepage",
"description": "Modern, fully static, fast application dashboard with integrations for over 100 services and translations into multiple languages.",
"tags": [
"traefik",
"volume_modes"
],
"icon": {
"provider": "selfhst",
"id": "homepage"
},
"draft": false,
"version": {
"name": "v1.12.3",
"source_dep_name": "ghcr.io/gethomepage/homepage",
"source_dep_version": "v1.12.3"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "The service name",
"required": true,
"default": "homepage",
"config": {
"placeholder": "homepage"
}
},
{
"name": "container_name",
"type": "str",
"title": "The container name",
"required": false,
"default": "homepage",
"config": {
"placeholder": "homepage"
}
},
{
"name": "container_timezone",
"type": "str",
"title": "The container timezone",
"required": false,
"config": {
"placeholder": "Europe/Berlin"
}
},
{
"name": "container_loglevel",
"type": "enum",
"title": "Log Level",
"required": false,
"config": {
"options": [
"debug",
"info",
"warn",
"error"
]
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_http",
"type": "int",
"title": "The HTTP port",
"required": true,
"default": 3000,
"needs": [
"traefik_enabled=false"
],
"config": {
"placeholder": "3000"
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "homepage"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
},
{
"title": "Volume",
"name": "volume",
"items": [
{
"name": "volume_mode",
"type": "enum",
"title": "Volume Mode",
"required": true,
"default": "local",
"config": {
"options": [
"local",
"mount",
"nfs"
]
}
},
{
"name": "volume_mount_path",
"type": "str",
"title": "Volume Mount Path",
"required": true,
"default": "/mnt/storage",
"needs": [
"volume_mode=mount"
],
"config": {
"placeholder": "/mnt/storage"
}
},
{
"name": "volume_nfs_options",
"type": "str",
"title": "NFS Options",
"required": false,
"default": "nfsvers=4,soft,timeo=180,intr",
"config": {
"placeholder": "nfsvers=4,soft,timeo=180,intr"
}
},
{
"name": "volume_nfs_path",
"type": "str",
"title": "NFS Path",
"required": false,
"default": "",
"config": {
"placeholder": "/export/app"
}
},
{
"name": "volume_nfs_server",
"type": "str",
"title": "NFS Server",
"required": false,
"default": "",
"config": {
"placeholder": "nas.home.arpa"
}
}
]
}
]
}
@@ -1,71 +0,0 @@
---
# Homepage configuration
# See https://fontawesome.com/icons for icons options
title: "<< homer_title >>"
subtitle: "<< homer_subtitle >>"
logo: "<< homer_logo >>"
# icon: "fas fa-home" # Optional icon instead of logo
header: true
footer: false # Set to "<Message>" to enable footer with a custom message
# Optional theme customization
theme: default # Options: default, sui
# colors:
# light:
# highlight-primary: "#3367d6"
# highlight-secondary: "#4285f4"
# highlight-hover: "#5a95f5"
# background: "#f5f5f5"
# card-background: "#ffffff"
# text: "#363636"
# text-header: "#ffffff"
# dark:
# highlight-primary: "#3367d6"
# highlight-secondary: "#4285f4"
# highlight-hover: "#5a95f5"
# background: "#131313"
# card-background: "#2b2b2b"
# text: "#eaeaea"
# text-header: "#ffffff"
# Optional message displayed at the top
# message:
# style: "is-dark" # Options: is-dark, is-warning, is-info, is-success, is-danger
# title: "Welcome!"
# icon: "fa fa-grin"
# content: "This is your Homer dashboard. <br /> Add your services below."
# Optional navbar links
# links:
# - name: "GitHub"
# icon: "fab fa-github"
# url: "https://github.com"
# target: "_blank" # optional: open in new tab
# - name: "Documentation"
# icon: "fas fa-book"
# url: "https://github.com/bastienwirtz/homer/blob/main/docs/configuration.md"
# Services
# First level array represents a group.
# Leave only an "items" key if not using groups (group name, icon & tagstyle are optional)
services:
- name: "Applications"
icon: "fas fa-cloud"
# items:
# - name: "Example App"
# logo: "assets/tools/sample.png" # or use "icon: fas fa-server"
# subtitle: "Description of the app"
# tag: "app" # Optional tag
# tagstyle: "is-success" # Optional: is-success, is-warning, is-info, is-danger
# url: "https://example.com"
# target: "_blank" # optional: open in new tab
# - name: "Monitoring"
# icon: "fas fa-chart-line"
# items:
# - name: "Grafana"
# icon: "fas fa-chart-area"
# subtitle: "Metrics & dashboards"
# url: "https://grafana.example.com"
-43
View File
@@ -1,43 +0,0 @@
services:
<< service_name >>:
image: docker.io/b4bz/homer:v26.4.2
restart: << restart_policy >>
<%- if container_name %>
container_name: << container_name >>
<%- endif %>
<%- if container_timezone %>
environment:
- TZ=<< container_timezone >>
<%- endif %>
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
<%- endif %>
<%- if not traefik_enabled %>
ports:
- "<< ports_http >>:8080"
<%- endif %>
volumes:
- ./assets:/www/assets
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>-web.loadBalancer.server.port=8080
- traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>-https.tls=true
- traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
external: true
<%- endif %>
-261
View File
@@ -1,261 +0,0 @@
{
"slug": "homer",
"kind": "compose",
"metadata": {
"name": "Homer",
"description": "Simple static homepage for your server to keep your services on hand, configured through a single YAML file.",
"tags": [
"traefik",
"authentik"
],
"icon": {
"provider": "selfhst",
"id": "homer"
},
"draft": false,
"version": {
"name": "v26.4.2",
"source_dep_name": "docker.io/b4bz/homer",
"source_dep_version": "v26.4.2"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "homer",
"config": {
"placeholder": "homer"
}
},
{
"name": "container_name",
"type": "str",
"title": "Container Name",
"required": false,
"default": "homer",
"config": {
"placeholder": "homer"
}
},
{
"name": "container_timezone",
"type": "str",
"title": "Container Timezone",
"required": false,
"config": {
"placeholder": "Europe/Berlin"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
},
{
"name": "homer_title",
"type": "str",
"title": "Dashboard title",
"required": false,
"default": "Dashboard",
"config": {
"placeholder": "Dashboard"
}
},
{
"name": "homer_subtitle",
"type": "str",
"title": "Dashboard subtitle",
"required": false,
"default": "Dashboard",
"config": {
"placeholder": "Dashboard"
}
},
{
"name": "homer_logo",
"type": "str",
"title": "Logo Path",
"required": false,
"default": "logo-file.png",
"description": "Logo file path (relative to assets/)",
"config": {
"placeholder": "logo-file.png"
}
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_http",
"type": "int",
"title": "HTTP Port",
"required": false,
"default": 8080,
"config": {
"placeholder": "8080"
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "dashboard"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
},
{
"title": "Authentik SSO",
"toggle": "authentik_enabled",
"name": "authentik",
"items": [
{
"name": "authentik_traefik_middleware",
"type": "str",
"title": "Authentik Traefik Middleware",
"required": true,
"default": "middleware@file",
"needs": [
"traefik_enabled=true"
],
"config": {
"placeholder": "middleware@file"
}
},
{
"name": "authentik_client_id",
"type": "str",
"title": "Client ID",
"required": false,
"default": ""
},
{
"name": "authentik_client_secret",
"type": "str",
"title": "Client Secret",
"required": false,
"default": ""
},
{
"name": "authentik_enabled",
"type": "bool",
"title": "Authentik SSO",
"required": false,
"default": false
},
{
"name": "authentik_slug",
"type": "str",
"title": "Slug",
"required": false,
"default": ""
},
{
"name": "authentik_url",
"type": "str",
"title": "The Authentik URL",
"required": false,
"default": ""
}
]
}
]
}
-33
View File
@@ -1,33 +0,0 @@
# Infisical core configuration
SITE_URL='<< infisical_site_url >>'
ENCRYPTION_KEY='<< infisical_encryption_key >>'
AUTH_SECRET='<< infisical_auth_secret >>'
# Data stores
<%- if database_external %>
DB_CONNECTION_URI='<< database_connection_uri >>'
<%- else %>
POSTGRES_USER='<< database_user >>'
POSTGRES_PASSWORD='<< database_password >>'
POSTGRES_DB='<< database_name >>'
DB_CONNECTION_URI='postgresql://<< database_user >>:<< database_password >>@<< service_name or 'infisical' >>_postgres:5432/<< database_name >>?sslmode=disable'
<%- endif %>
<%- if redis_external %>
REDIS_URL='<< redis_url >>'
<%- else %>
REDIS_PASSWORD='<< redis_password >>'
REDIS_URL='redis://:<< redis_password >>@<< service_name or 'infisical' >>_redis:6379'
<%- endif %>
<%- if email_enabled %>
# SMTP configuration
SMTP_HOST='<< email_host >>'
SMTP_PORT='<< email_port >>'
SMTP_FROM_ADDRESS='<< email_from_address >>'
SMTP_FROM_NAME='<< email_from_name >>'
SMTP_USERNAME='<< email_username >>'
SMTP_PASSWORD='<< email_password >>'
SMTP_SECURE='<< email_secure | lower >>'
SMTP_REQUIRE_TLS='<< email_require_tls | lower >>'
SMTP_IGNORE_TLS='<< email_ignore_tls | lower >>'
<%- endif %>
-138
View File
@@ -1,138 +0,0 @@
---
services:
<< service_name or 'infisical' >>:
image: infisical/infisical:v0.158.0
restart: << restart_policy >>
<%- if container_name %>
container_name: << container_name >>
<%- endif %>
environment:
- NODE_ENV=production
- SITE_URL=${SITE_URL}
- ENCRYPTION_KEY=${ENCRYPTION_KEY}
- AUTH_SECRET=${AUTH_SECRET}
- DB_CONNECTION_URI=${DB_CONNECTION_URI}
- REDIS_URL=${REDIS_URL}
<%- if email_enabled %>
- SMTP_HOST=${SMTP_HOST}
- SMTP_PORT=${SMTP_PORT}
- SMTP_FROM_ADDRESS=${SMTP_FROM_ADDRESS}
- SMTP_FROM_NAME=${SMTP_FROM_NAME}
- SMTP_USERNAME=${SMTP_USERNAME}
- SMTP_PASSWORD=${SMTP_PASSWORD}
- SMTP_SECURE=${SMTP_SECURE}
- SMTP_REQUIRE_TLS=${SMTP_REQUIRE_TLS}
- SMTP_IGNORE_TLS=${SMTP_IGNORE_TLS}
<%- endif %>
<%- if (not database_external) or (not redis_external) %>
depends_on:
<%- if not database_external %>
<< service_name or 'infisical' >>_postgres:
condition: service_healthy
<%- endif %>
<%- if not redis_external %>
<< service_name or 'infisical' >>_redis:
condition: service_started
<%- endif %>
<%- endif %>
networks:
- << service_name or 'infisical' >>_backend
<%- if traefik_enabled %>
- << traefik_network >>
<%- endif %>
<%- if not traefik_enabled %>
ports:
- "<< ports_http >>:8080"
<%- endif %>
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name or 'infisical' >>.loadBalancer.server.port=8080
- traefik.http.routers.<< service_name or 'infisical' >>_http.service=<< service_name or 'infisical' >>
- traefik.http.routers.<< service_name or 'infisical' >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name or 'infisical' >>_http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name or 'infisical' >>_https.service=<< service_name or 'infisical' >>
- traefik.http.routers.<< service_name or 'infisical' >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name or 'infisical' >>_https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name or 'infisical' >>_https.tls=true
- traefik.http.routers.<< service_name or 'infisical' >>_https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
<%- if not database_external %>
<< service_name or 'infisical' >>_postgres:
image: docker.io/library/postgres:14-alpine
restart: << restart_policy >>
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
healthcheck:
test: ["CMD-SHELL", "pg_isready --username=$${POSTGRES_USER} --dbname=$${POSTGRES_DB}"]
interval: 5s
timeout: 10s
retries: 10
networks:
- << service_name or 'infisical' >>_backend
volumes:
<%- if volume_mode == 'mount' %>
- << volume_mount_path >>/postgres:/var/lib/postgresql/data
<%- elif volume_mode == 'local' or volume_mode == 'nfs' %>
- << service_name or 'infisical' >>_postgres:/var/lib/postgresql/data
<%- endif %>
<%- endif %>
<%- if not redis_external %>
<< service_name or 'infisical' >>_redis:
image: docker.io/library/redis:7-alpine
restart: << restart_policy >>
command: ["redis-server", "--appendonly", "yes", "--requirepass", "${REDIS_PASSWORD}"]
networks:
- << service_name or 'infisical' >>_backend
volumes:
<%- if volume_mode == 'mount' %>
- << volume_mount_path >>/redis:/data
<%- elif volume_mode == 'local' or volume_mode == 'nfs' %>
- << service_name or 'infisical' >>_redis:/data
<%- endif %>
<%- endif %>
networks:
<< service_name or 'infisical' >>_backend:
driver: bridge
<%- if traefik_enabled %>
<< traefik_network >>:
external: true
<%- endif %>
<%- if volume_mode == 'local' and ((not database_external) or (not redis_external)) %>
volumes:
<%- if not database_external %>
<< service_name or 'infisical' >>_postgres:
driver: local
<%- endif %>
<%- if not redis_external %>
<< service_name or 'infisical' >>_redis:
driver: local
<%- endif %>
<%- elif volume_mode == 'nfs' and ((not database_external) or (not redis_external)) %>
volumes:
<%- if not database_external %>
<< service_name or 'infisical' >>_postgres:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>/postgres"
<%- endif %>
<%- if not redis_external %>
<< service_name or 'infisical' >>_redis:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,nfsvers=4,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>/redis"
<%- endif %>
<%- endif %>
-681
View File
@@ -1,681 +0,0 @@
{
"slug": "infisical-compose",
"kind": "compose",
"metadata": {
"name": "Infisical",
"description": "Open-source secrets management platform for teams and homelabs, including PostgreSQL, Redis, SMTP, and Traefik-friendly Docker Compose configuration.",
"tags": [
"secrets",
"postgresql",
"redis",
"traefik"
],
"icon": {
"provider": "selfhst",
"id": "infisical",
"color": "amber"
},
"draft": false,
"version": {
"name": "v0.158.0",
"source_dep_name": "infisical/infisical",
"source_dep_version": "v0.158.0"
}
},
"variables": [
{
"name": "general",
"title": "General",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"config": {
"placeholder": "infisical"
}
},
{
"name": "container_name",
"type": "str",
"title": "Container Name",
"required": false,
"description": "Name to use for the container. Leave empty to omit container_name and let Compose generate it.",
"config": {
"placeholder": "infisical"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"description": "Container restart policy.",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
}
]
},
{
"name": "infisical",
"title": "Infisical",
"items": [
{
"name": "infisical_site_url",
"type": "str",
"title": "Site URL",
"required": true,
"default": "https://infisical.home.arpa",
"config": {
"placeholder": "https://infisical.home.arpa"
}
},
{
"name": "infisical_encryption_key",
"type": "secret",
"title": "Encryption Key",
"required": true,
"description": "Infisical ENCRYPTION_KEY. Back this up securely; losing it makes stored secrets unrecoverable.",
"config": {
"autogenerated": {
"length": 32,
"characters": [
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"a",
"b",
"c",
"d",
"e",
"f"
]
}
}
},
{
"name": "infisical_auth_secret",
"type": "secret",
"title": "Auth Secret",
"required": true,
"config": {
"autogenerated": {
"kind": "base64",
"bytes": 32
}
}
}
]
},
{
"name": "database",
"title": "PostgreSQL",
"items": [
{
"name": "database_external",
"type": "bool",
"title": "External PostgreSQL",
"required": false,
"default": false
},
{
"name": "database_connection_uri",
"type": "secret",
"title": "External DB Connection URI",
"required": true,
"description": "Full PostgreSQL connection URI for external databases. URL-encode special characters in usernames/passwords.",
"needs": [
"database_external=true"
],
"config": {
"placeholder": "postgresql://infisical:password@postgres.example.internal:5432/infisical?sslmode=disable"
}
},
{
"name": "database_user",
"type": "str",
"title": "Database User",
"required": true,
"default": "infisical",
"needs": [
"database_external=false"
],
"config": {
"placeholder": "infisical"
}
},
{
"name": "database_password",
"type": "secret",
"title": "Database Password",
"required": true,
"description": "PostgreSQL password for the bundled database.",
"needs": [
"database_external=false"
],
"config": {
"autogenerated": {
"length": 32,
"characters": [
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
"p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
"x",
"y",
"z",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z",
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9"
]
}
}
},
{
"name": "database_name",
"type": "str",
"title": "Database Name",
"required": true,
"default": "infisical",
"needs": [
"database_external=false"
],
"config": {
"placeholder": "infisical"
}
}
]
},
{
"name": "redis",
"title": "Redis",
"items": [
{
"name": "redis_external",
"type": "bool",
"title": "External Redis",
"required": false,
"default": false
},
{
"name": "redis_url",
"type": "secret",
"title": "External Redis URL",
"required": true,
"description": "Full Redis URL for external Redis, for example redis://:password@redis.example.internal:6379.",
"needs": [
"redis_external=true"
],
"config": {
"placeholder": "redis://:password@redis.example.internal:6379"
}
},
{
"name": "redis_password",
"type": "secret",
"title": "Redis Password",
"required": true,
"needs": [
"redis_external=false"
],
"config": {
"autogenerated": {
"length": 32,
"characters": [
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
"p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
"x",
"y",
"z",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z",
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9"
]
}
}
}
]
},
{
"name": "ports",
"title": "Ports",
"items": [
{
"name": "ports_http",
"type": "str",
"title": "HTTP Port",
"required": false,
"default": "8080",
"description": "Host port exposed when Traefik integration is disabled.",
"config": {
"placeholder": "8080"
}
}
]
},
{
"name": "traefik",
"title": "Traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": true,
"description": "Attach to an external Traefik network and create routing labels."
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"default": "infisical",
"needs": [
"traefik_enabled=true"
],
"config": {
"placeholder": "infisical"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"default": "home.arpa",
"needs": [
"traefik_enabled=true"
],
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"description": "Traefik HTTP entrypoint.",
"needs": [
"traefik_enabled=true"
],
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"description": "External Docker network used by Traefik.",
"needs": [
"traefik_enabled=true"
],
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true,
"description": "Create a TLS router for Traefik.",
"needs": [
"traefik_enabled=true"
]
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"description": "Traefik HTTPS entrypoint.",
"needs": [
"traefik_enabled=true",
"traefik_tls_enabled=true"
],
"config": {
"placeholder": "websecure"
}
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"needs": [
"traefik_enabled=true",
"traefik_tls_enabled=true"
],
"config": {
"placeholder": "cloudflare"
}
}
]
},
{
"name": "volume",
"title": "Volumes",
"items": [
{
"name": "volume_mode",
"type": "enum",
"title": "Volume Mode",
"required": true,
"default": "local",
"description": "Storage mode for bundled PostgreSQL and Redis data.",
"config": {
"options": [
"local",
"mount",
"nfs"
]
}
},
{
"name": "volume_mount_path",
"type": "str",
"title": "Mount Path",
"required": true,
"default": "/data/infisical",
"description": "Base host path used when volume mode is mount.",
"needs": [
"volume_mode=mount"
],
"config": {
"placeholder": "/data/infisical"
}
},
{
"name": "volume_nfs_server",
"type": "str",
"title": "NFS Server",
"required": true,
"default": "NFS_SERVER",
"needs": [
"volume_mode=nfs"
],
"config": {
"placeholder": "NFS_SERVER"
}
},
{
"name": "volume_nfs_path",
"type": "str",
"title": "NFS Path",
"required": true,
"default": "/export/infisical",
"description": "NFS export path.",
"needs": [
"volume_mode=nfs"
],
"config": {
"placeholder": "/export/infisical"
}
},
{
"name": "volume_nfs_options",
"type": "str",
"title": "NFS Options",
"required": true,
"default": "rw,nolock,soft",
"description": "NFS mount options.",
"needs": [
"volume_mode=nfs"
],
"config": {
"placeholder": "rw,nolock,soft"
}
}
]
},
{
"name": "email",
"title": "Email",
"toggle": "email_enabled",
"items": [
{
"name": "email_enabled",
"type": "bool",
"title": "SMTP Email",
"required": false,
"default": false
},
{
"name": "email_host",
"type": "str",
"title": "SMTP Host",
"required": true,
"default": "smtp.home.arpa",
"needs": [
"email_enabled=true"
],
"config": {
"placeholder": "smtp.home.arpa"
}
},
{
"name": "email_port",
"type": "int",
"title": "SMTP Port",
"required": true,
"default": 587,
"needs": [
"email_enabled=true"
],
"config": {
"placeholder": "587"
}
},
{
"name": "email_from_address",
"type": "str",
"title": "From Address",
"required": true,
"default": "infisical@home.arpa",
"needs": [
"email_enabled=true"
],
"config": {
"placeholder": "infisical@home.arpa"
}
},
{
"name": "email_from_name",
"type": "str",
"title": "From Name",
"required": false,
"default": "Infisical",
"needs": [
"email_enabled=true"
],
"config": {
"placeholder": "Infisical"
}
},
{
"name": "email_username",
"type": "str",
"title": "SMTP Username",
"required": true,
"default": "",
"needs": [
"email_enabled=true"
],
"config": {
"placeholder": "user@example.com"
}
},
{
"name": "email_password",
"type": "secret",
"title": "SMTP Password",
"required": true,
"needs": [
"email_enabled=true"
]
},
{
"name": "email_secure",
"type": "bool",
"title": "SMTP Secure",
"required": false,
"default": false,
"needs": [
"email_enabled=true"
]
},
{
"name": "email_require_tls",
"type": "bool",
"title": "Require TLS",
"required": false,
"default": true,
"needs": [
"email_enabled=true"
]
},
{
"name": "email_ignore_tls",
"type": "bool",
"title": "Ignore TLS",
"required": false,
"default": false,
"needs": [
"email_enabled=true"
]
}
]
}
]
}
-6
View File
@@ -1,6 +0,0 @@
# InfluxDB credentials
INFLUXDB_INIT_USERNAME=<< influxdb_init_username >>
INFLUXDB_INIT_PASSWORD=<< influxdb_init_password >>
INFLUXDB_INIT_ORG=<< influxdb_init_org >>
INFLUXDB_INIT_BUCKET=<< influxdb_init_bucket >>
INFLUXDB_INIT_ADMIN_TOKEN=<< influxdb_init_admin_token >>
@@ -1,53 +0,0 @@
---
services:
<< service_name >>:
image: docker.io/library/influxdb:2.8.0-alpine
restart: << restart_policy >>
environment:
- TZ=<< container_timezone >>
- DOCKER_INFLUXDB_INIT_MODE=setup
- DOCKER_INFLUXDB_INIT_USERNAME=${INFLUXDB_INIT_USERNAME}
- DOCKER_INFLUXDB_INIT_PASSWORD=${INFLUXDB_INIT_PASSWORD}
- DOCKER_INFLUXDB_INIT_ORG=${INFLUXDB_INIT_ORG}
- DOCKER_INFLUXDB_INIT_BUCKET=${INFLUXDB_INIT_BUCKET}
- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=${INFLUXDB_INIT_ADMIN_TOKEN}
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
<%- endif %>
<%- if not traefik_enabled %>
ports:
- "<< ports_http >>:8086"
<%- endif %>
volumes:
- << service_name >>_data:/var/lib/influxdb2
- << service_name >>_config:/etc/influxdb2
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>-web.loadbalancer.server.port=8086
- traefik.http.services.<< service_name >>-web.loadbalancer.server.scheme=http
- traefik.http.routers.<< service_name >>-web-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-web-http.entrypoints=<< traefik_entrypoint >>
- traefik.http.routers.<< service_name >>-web-http.service=<< service_name >>-web
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>-web-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-web-https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>-web-https.tls=true
- traefik.http.routers.<< service_name >>-web-https.tls.certresolver=<< traefik_tls_certresolver >>
- traefik.http.routers.<< service_name >>-web-https.service=<< service_name >>-web
<%- endif %>
<%- endif %>
volumes:
<< service_name >>_data:
driver: local
<< service_name >>_config:
driver: local
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
external: true
<%- endif %>
-225
View File
@@ -1,225 +0,0 @@
{
"slug": "influxdb",
"kind": "compose",
"metadata": {
"name": "Influxdb",
"description": "Open-source time series database designed for high-performance storage and retrieval of time-stamped data. Commonly used for monitoring, analytics, and IoT applications.",
"tags": [
"traefik"
],
"icon": {
"provider": "selfhst",
"id": "influxdb"
},
"draft": false,
"version": {
"name": "2.8.0-alpine",
"source_dep_name": "docker.io/library/influxdb",
"source_dep_version": "2.8.0-alpine"
}
},
"variables": [
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_http",
"type": "int",
"title": "HTTP API Port",
"required": false,
"default": 8086,
"config": {
"placeholder": "8086"
}
}
]
},
{
"title": "Influxdb",
"name": "influxdb",
"items": [
{
"name": "influxdb_init_username",
"type": "str",
"title": "Initial admin username",
"required": true,
"default": "admin",
"config": {
"placeholder": "admin"
}
},
{
"name": "influxdb_init_password",
"type": "secret",
"title": "Initial admin password",
"required": true,
"config": {
"autogenerated": {
"length": 32
}
}
},
{
"name": "influxdb_init_org",
"type": "str",
"title": "Initial organization",
"required": true,
"default": "homelab",
"description": "Organization created during the initial setup.",
"config": {
"placeholder": "homelab"
}
},
{
"name": "influxdb_init_bucket",
"type": "str",
"title": "Initial bucket",
"required": true,
"default": "default",
"description": "Bucket created during the initial setup.",
"config": {
"placeholder": "default"
}
},
{
"name": "influxdb_init_admin_token",
"type": "secret",
"title": "Initial admin token",
"required": true,
"description": "Admin API token created during the initial setup.",
"config": {
"autogenerated": {
"length": 64
}
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "influxdb"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
},
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "influxdb",
"config": {
"placeholder": "influxdb"
}
},
{
"name": "container_timezone",
"type": "str",
"title": "Container Timezone",
"required": false,
"config": {
"placeholder": "Europe/Berlin"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
}
]
}
]
}
-56
View File
@@ -1,56 +0,0 @@
services:
<< service_name >>:
image: kestra/kestra:v1.3.15
container_name: << container_name >>
entrypoint: /bin/bash
user: "<< container_user >>"
command:
- -c
- /app/kestra server standalone --worker-thread=<< worker_threads >> -c config.yaml
volumes:
<%- if docker_socket_enabled %>
- /var/run/docker.sock:/var/run/docker.sock
<%- endif %>
- << tmp_workdir_host >>:/tmp/kestra-wd
- << storage_volume_name >>:/app/storage
- ./config/config.yaml:/app/config.yaml:ro
<%- if env_file_enabled %>
env_file:
- << env_file_path >>
<%- endif %>
networks:
- << network_name >>
<%- if traefik_enabled %>
labels:
- traefik.enable=true
<%- if secondary_hostname %>
- traefik.http.routers.<< service_name >>.rule=Host(`<< public_hostname >>`) || Host(`<< secondary_hostname >>`)
<%- else %>
- traefik.http.routers.<< service_name >>.rule=Host(`<< public_hostname >>`)
<%- endif %>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>.tls=true
- traefik.http.routers.<< service_name >>.tls.certresolver=<< traefik_tls_certresolver >>
<%- else %>
- traefik.http.routers.<< service_name >>.entrypoints=<< traefik_entrypoint >>
<%- endif %>
<%- if traefik_middleware %>
- traefik.http.routers.<< service_name >>.middlewares=<< traefik_middleware >>
<%- endif %>
- traefik.http.routers.<< service_name >>.service=<< service_name >>
- traefik.http.services.<< service_name >>.loadBalancer.server.port=8080
<%- endif %>
restart: << restart_policy >>
volumes:
<< storage_volume_name >>:
driver: local
networks:
<< network_name >>:
<%- if network_external %>
external: true
<%- else %>
driver: bridge
<%- endif %>
-297
View File
@@ -1,297 +0,0 @@
{
"slug": "kestra",
"kind": "compose",
"metadata": {
"name": "Kestra",
"description": "Runs Kestra in Docker Compose with a companion configuration file, PostgreSQL datasource settings, and persistent storage.",
"tags": [],
"icon": {
"provider": "selfhst",
"id": "kestra"
},
"draft": true,
"version": {
"name": "v1.3.15",
"source_dep_name": "kestra/kestra",
"source_dep_version": "v1.3.15"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Compose service name",
"required": false,
"default": "kestra",
"config": {
"placeholder": "kestra"
}
},
{
"name": "container_name",
"type": "str",
"title": "Container name",
"required": false,
"default": "kestra",
"config": {
"placeholder": "kestra"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Container restart policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
},
{
"name": "container_user",
"type": "str",
"title": "Container runtime user",
"required": false,
"default": "root",
"config": {
"placeholder": "root"
}
},
{
"name": "worker_threads",
"type": "int",
"title": "Worker Threads",
"required": false,
"default": 128,
"config": {
"slider": true,
"min": 4,
"max": 256,
"step": 4,
"placeholder": "128"
}
}
]
},
{
"title": "Runtime",
"name": "runtime",
"items": [
{
"name": "docker_socket_enabled",
"type": "bool",
"title": "Docker Socket",
"required": false,
"default": true,
"description": "Mount the Docker socket into Kestra"
},
{
"name": "tmp_workdir_host",
"type": "str",
"title": "Temp Workdir",
"required": false,
"default": "/tmp/kestra-wd",
"description": "Host path for Kestra temporary working directory",
"config": {
"placeholder": "/tmp/kestra-wd"
}
},
{
"name": "storage_volume_name",
"type": "str",
"title": "Storage Volume",
"required": false,
"default": "kestra-data",
"description": "Named volume for Kestra storage",
"config": {
"placeholder": "kestra-data"
}
},
{
"name": "env_file_enabled",
"type": "bool",
"title": "Env File",
"required": false,
"default": true,
"description": "Load environment variables from an env file"
},
{
"name": "env_file_path",
"type": "str",
"title": "Env File Path",
"required": false,
"default": ".env",
"description": "Path used for Env File.",
"config": {
"placeholder": ".env"
}
},
{
"name": "kestra_public_url",
"type": "str",
"title": "Public Kestra URL",
"required": true,
"config": {
"placeholder": "https://kestra.home.arpa/"
}
},
{
"name": "tutorial_flows_enabled",
"type": "bool",
"title": "Tutorial Flows",
"required": false,
"default": false
}
]
},
{
"title": "PostgreSQL Datasource",
"name": "postgres",
"items": [
{
"name": "postgres_jdbc_url",
"type": "str",
"title": "PostgreSQL JDBC URL",
"required": true,
"config": {
"placeholder": "jdbc:postgresql://database:5432/kestra"
}
},
{
"name": "postgres_username",
"type": "str",
"title": "PostgreSQL username",
"required": true,
"config": {
"placeholder": "kestra"
}
},
{
"name": "postgres_password",
"type": "secret",
"title": "PostgreSQL password",
"required": true
}
]
},
{
"title": "Network",
"name": "network",
"items": [
{
"name": "network_name",
"type": "str",
"title": "Network Name",
"required": true,
"default": "proxy",
"config": {
"placeholder": "proxy"
}
},
{
"name": "network_external",
"type": "bool",
"title": "External Network",
"required": false,
"default": true
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": true
},
{
"name": "public_hostname",
"type": "str",
"title": "Primary public hostname",
"required": false,
"default": "kestra.home.arpa",
"config": {
"placeholder": "kestra.home.arpa"
}
},
{
"name": "secondary_hostname",
"type": "str",
"title": "Secondary Hostname",
"required": false,
"default": "",
"config": {
"placeholder": "kp1web.home.arpa"
}
},
{
"name": "traefik_middleware",
"type": "str",
"title": "Traefik Middleware",
"required": false,
"default": "",
"config": {
"placeholder": "authentik@file"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": false,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
}
]
}
-8
View File
@@ -1,8 +0,0 @@
# Komodo database credentials
KOMODO_DATABASE_USERNAME=<< database_username >>
KOMODO_DATABASE_PASSWORD=<< database_password >>
# Komodo credentials
<%- if environment_enabled and environment_jwt_secret %>
KOMODO_JWT_SECRET=<< environment_jwt_secret >>
<%- endif %>
-209
View File
@@ -1,209 +0,0 @@
---
services:
<< service_name >>:
image: ghcr.io/moghtech/komodo-core:2.1.2
restart: << restart_policy >>
container_name: << container_name >>
hostname: << container_hostname >>
<%- if not database_external %>
depends_on:
<%- if database_type == 'mongo' %>
- << service_name >>-mongo
<%- elif database_type == 'ferretdb' %>
- << service_name >>-ferretdb
<%- endif %>
<%- endif %>
<%- if network_mode == 'host' %>
network_mode: host
<%- else %>
networks:
<%- if traefik_enabled %>
<< traefik_network >>:
<%- endif %>
<%- if network_mode == 'macvlan' %>
<< network_name >>:
ipv4_address: << network_macvlan_ipv4_address >>
<%- elif network_mode == 'bridge' %>
<< network_name >>:
<%- endif %>
<%- endif %>
<%- if network_mode == 'bridge' and not traefik_enabled %>
ports:
- "<< ports_http >>:9120/tcp"
<%- endif %>
environment:
<%- if database_external %>
KOMODO_DATABASE_ADDRESS: "<< database_address >>"
<%- elif database_type == 'mongo' %>
<%- if network_mode == 'host' %>
KOMODO_DATABASE_ADDRESS: "localhost:27017"
<%- else %>
KOMODO_DATABASE_ADDRESS: "<< service_name >>-mongo:27017"
<%- endif %>
<%- elif database_type == 'ferretdb' %>
<%- if network_mode == 'host' %>
KOMODO_DATABASE_ADDRESS: "localhost:27017"
<%- else %>
KOMODO_DATABASE_ADDRESS: "<< service_name >>-ferretdb:27017"
<%- endif %>
<%- endif %>
KOMODO_DATABASE_DB_NAME: "<< database_name >>"
KOMODO_DATABASE_USERNAME: "${KOMODO_DATABASE_USERNAME}"
KOMODO_DATABASE_PASSWORD: "${KOMODO_DATABASE_PASSWORD}"
<%- if environment_enabled and environment_jwt_secret %>
KOMODO_JWT_SECRET: "${KOMODO_JWT_SECRET}"
<%- endif %>
<%- if environment_enabled %>
LOG_LEVEL: "<< environment_log_level >>"
<%- endif %>
volumes:
<%- if volume_mode == 'mount' %>
- << volume_mount_path >>/data:/app/data:rw
- << volume_mount_path >>/repos:/app/repos:rw
<%- elif volume_mode == 'local' or volume_mode == 'nfs' %>
- << service_name >>-data:/app/data
- << service_name >>-repos:/app/repos
<%- endif %>
<%- if resources_enabled %>
deploy:
resources:
limits:
cpus: '<< resources_cpu_limit >>'
memory: << resources_memory_limit >>
<%- endif %>
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>-web.loadBalancer.server.port=9120
- traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>-https.tls=true
- traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
<%- if not database_external and database_type == 'mongo' %>
<< service_name >>-mongo:
image: docker.io/library/mongo:8
restart: << restart_policy >>
command: --quiet --wiredTigerCacheSizeGB 0.25
labels:
komodo.skip:
environment:
MONGO_INITDB_ROOT_USERNAME: "${KOMODO_DATABASE_USERNAME}"
MONGO_INITDB_ROOT_PASSWORD: "${KOMODO_DATABASE_PASSWORD}"
<%- if network_mode == 'host' %>
network_mode: host
<%- else %>
networks:
<< network_name >>:
<%- endif %>
volumes:
- << service_name >>-mongo-data:/data/db
- << service_name >>-mongo-config:/data/configdb
<%- elif not database_external and database_type == 'ferretdb' %>
<< service_name >>-postgres:
image: ghcr.io/ferretdb/postgres-documentdb:17
restart: << restart_policy >>
labels:
komodo.skip:
environment:
POSTGRES_USER: "${KOMODO_DATABASE_USERNAME}"
POSTGRES_PASSWORD: "${KOMODO_DATABASE_PASSWORD}"
POSTGRES_DB: postgres
<%- if network_mode == 'host' %>
network_mode: host
<%- else %>
networks:
<< network_name >>:
<%- endif %>
volumes:
- << service_name >>-postgres-data:/var/lib/postgresql/data
<< service_name >>-ferretdb:
image: ghcr.io/ferretdb/ferretdb:2
restart: << restart_policy >>
labels:
komodo.skip:
depends_on:
- << service_name >>-postgres
environment:
<%- if network_mode == 'host' %>
FERRETDB_POSTGRESQL_URL: "postgres://${KOMODO_DATABASE_USERNAME}:${KOMODO_DATABASE_PASSWORD}@localhost:5432/postgres"
<%- else %>
FERRETDB_POSTGRESQL_URL: "postgres://${KOMODO_DATABASE_USERNAME}:${KOMODO_DATABASE_PASSWORD}@<< service_name >>-postgres:5432/postgres"
<%- endif %>
<%- if network_mode == 'host' %>
network_mode: host
<%- else %>
networks:
<< network_name >>:
<%- endif %>
volumes:
- << service_name >>-ferretdb-state:/state
<%- endif %>
<%- if volume_mode == 'local' or volume_mode == 'nfs' or not database_external %>
volumes:
<%- if volume_mode == 'local' %>
<< service_name >>-data:
driver: local
<< service_name >>-repos:
driver: local
<%- elif volume_mode == 'nfs' %>
<< service_name >>-data:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>/data"
<< service_name >>-repos:
driver: local
driver_opts:
type: nfs
o: addr=<< volume_nfs_server >>,<< volume_nfs_options >>
device: ":<< volume_nfs_path >>/repos"
<%- endif %>
<%- if not database_external and database_type == 'mongo' %>
<< service_name >>-mongo-data:
driver: local
<< service_name >>-mongo-config:
driver: local
<%- elif not database_external and database_type == 'ferretdb' %>
<< service_name >>-postgres-data:
driver: local
<< service_name >>-ferretdb-state:
driver: local
<%- endif %>
<%- endif %>
<%- if network_mode != 'host' %>
networks:
<< network_name >>:
<%- if network_external %>
external: true
<%- else %>
<%- if network_mode == 'macvlan' %>
driver: macvlan
driver_opts:
parent: << network_macvlan_parent_interface >>
ipam:
config:
- subnet: << network_macvlan_subnet >>
gateway: << network_macvlan_gateway >>
name: << network_name >>
<%- else %>
driver: bridge
<%- endif %>
<%- endif %>
<%- if traefik_enabled %>
<< traefik_network >>:
external: true
<%- endif %>
<%- endif %>
-461
View File
@@ -1,461 +0,0 @@
{
"slug": "komodo",
"kind": "compose",
"metadata": {
"name": "Komodo",
"description": "Build and deployment automation tool for managing Docker deployments, stacks, and builds across multiple servers. Features real-time container monitoring, batch operations, and a web-based management interface.",
"tags": [
"traefik",
"deployment",
"automation"
],
"icon": {
"provider": "selfhst",
"id": "komodo"
},
"draft": false,
"version": {
"name": "2.1.2",
"source_dep_name": "ghcr.io/moghtech/komodo-core",
"source_dep_version": "2.1.2"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "komodo",
"config": {
"placeholder": "komodo"
}
},
{
"name": "container_name",
"type": "str",
"title": "Container Name",
"required": false,
"default": "komodo",
"config": {
"placeholder": "komodo"
}
},
{
"name": "container_hostname",
"type": "str",
"title": "Container Hostname",
"required": false,
"default": "komodo",
"config": {
"placeholder": "komodo"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
},
{
"name": "network_mode",
"type": "enum",
"title": "Network Mode",
"required": false,
"default": "bridge",
"config": {
"options": [
"bridge",
"macvlan",
"host"
]
}
},
{
"name": "network_macvlan_ipv4_address",
"type": "str",
"title": "IPv4 Address",
"required": false,
"default": "",
"config": {
"placeholder": "10.20.1.50"
}
},
{
"name": "network_external",
"type": "bool",
"title": "External Network",
"required": false,
"default": false
},
{
"name": "volume_mode",
"type": "enum",
"title": "Volume Mode",
"required": false,
"default": "local",
"config": {
"options": [
"local",
"mount",
"nfs"
]
}
},
{
"name": "volume_nfs_options",
"type": "str",
"title": "Volume Nfs Options",
"required": false,
"default": ""
},
{
"name": "volume_mount_path",
"type": "str",
"title": "Volume Mount Path",
"required": false,
"default": "",
"config": {
"placeholder": "/data/app"
}
},
{
"name": "volume_nfs_server",
"type": "str",
"title": "Volume Nfs Server",
"required": false,
"default": "",
"config": {
"placeholder": "nas.home.arpa"
}
},
{
"name": "volume_nfs_path",
"type": "str",
"title": "Volume Nfs Path",
"required": false,
"default": "",
"config": {
"placeholder": "/export/app"
}
},
{
"name": "network_macvlan_subnet",
"type": "str",
"title": "Subnet",
"required": false,
"default": "",
"config": {
"placeholder": "10.20.0.0/16"
}
},
{
"name": "network_name",
"type": "str",
"title": "Network Name",
"required": false,
"default": "komodo_network",
"config": {
"placeholder": "komodo_network"
}
},
{
"name": "network_macvlan_parent_interface",
"type": "str",
"title": "Parent Interface",
"required": false,
"default": "",
"config": {
"placeholder": "eth0"
}
},
{
"name": "network_macvlan_gateway",
"type": "str",
"title": "Gateway",
"required": false,
"default": "",
"config": {
"placeholder": "10.20.0.1"
}
}
]
},
{
"title": "Database",
"name": "database",
"items": [
{
"name": "database_external",
"type": "bool",
"title": "External Database",
"required": false,
"default": false
},
{
"name": "database_type",
"type": "enum",
"title": "Database Backend",
"required": false,
"default": "mongo",
"description": "Database backend to deploy with Komodo.",
"needs": [
"database_external=false"
],
"config": {
"options": [
"mongo",
"ferretdb"
]
}
},
{
"name": "database_address",
"type": "str",
"title": "Database Address",
"required": false,
"default": "mongo:27017",
"description": "External MongoDB-compatible database address in host:port format.",
"needs": [
"database_external=true"
],
"config": {
"placeholder": "mongo:27017"
}
},
{
"name": "database_name",
"type": "str",
"title": "Database Name",
"required": false,
"default": "komodo",
"description": "Database name used by Komodo.",
"config": {
"placeholder": "komodo"
}
},
{
"name": "database_username",
"type": "str",
"title": "Database User",
"required": false,
"default": "komodo",
"config": {
"placeholder": "komodo"
}
},
{
"name": "database_password",
"type": "secret",
"title": "Database Password",
"required": false,
"config": {
"autogenerated": {
"length": 32
}
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "komodo"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_http",
"type": "int",
"title": "HTTP Port",
"required": false,
"default": 9120,
"needs": [
"traefik_enabled=false",
"network_mode=bridge"
],
"config": {
"placeholder": "9120"
}
}
]
},
{
"title": "Resource Limits",
"toggle": "resources_enabled",
"name": "resources",
"items": [
{
"name": "resources_enabled",
"type": "bool",
"title": "Resources Enabled",
"required": false,
"default": false
},
{
"name": "resources_cpu_limit",
"type": "str",
"title": "Resources Cpu Limit",
"required": true,
"default": 1,
"config": {
"placeholder": "1"
}
},
{
"name": "resources_memory_limit",
"type": "str",
"title": "Resources Memory Limit",
"required": true,
"default": "1G",
"config": {
"placeholder": "1G"
}
}
]
},
{
"title": "Environment Variables",
"toggle": "environment_enabled",
"name": "environment",
"items": [
{
"name": "environment_enabled",
"type": "bool",
"title": "Environment",
"required": false,
"default": true,
"description": "Configure Komodo Core environment variables."
},
{
"name": "environment_jwt_secret",
"type": "secret",
"title": "JWT Secret",
"required": false,
"description": "JWT secret for authentication (auto-generated if empty)",
"needs": [
"environment_enabled=true"
],
"config": {
"autogenerated": {
"length": 64
}
}
},
{
"name": "environment_log_level",
"type": "enum",
"title": "Log level",
"required": false,
"default": "info",
"needs": [
"environment_enabled=true"
],
"config": {
"options": [
"debug",
"info",
"warn",
"error"
]
}
}
]
}
]
}
-43
View File
@@ -1,43 +0,0 @@
---
services:
<< service_name >>:
image: docker.io/grafana/loki:3.7.1
restart: << restart_policy >>
command: "-config.file=/etc/loki/config.yaml"
<%- if not traefik_enabled %>
ports:
- "<< ports_http >>:3100"
<%- endif %>
volumes:
- << service_name >>_data:/loki:rw
- ./config/config.yaml:/etc/loki/config.yaml:ro
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
<%- endif %>
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>_web.loadBalancer.server.port=3100
- traefik.http.routers.<< service_name >>_http.service=<< service_name >>_web
- traefik.http.routers.<< service_name >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>_http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>_https.service=<< service_name >>_web
- traefik.http.routers.<< service_name >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>_https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>_https.tls=true
- traefik.http.routers.<< service_name >>_https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
volumes:
<< service_name >>_data:
driver: local
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
external: true
<%- endif %>
-172
View File
@@ -1,172 +0,0 @@
{
"slug": "loki",
"kind": "compose",
"metadata": {
"name": "Loki",
"description": "Horizontally scalable, multi-tenant log aggregation system by Grafana, inspired by Prometheus. Indexes metadata rather than log content for efficient storage.",
"tags": [
"traefik",
"authentik"
],
"icon": {
"provider": "selfhst",
"id": "loki"
},
"draft": false,
"version": {
"name": "3.7.1",
"source_dep_name": "docker.io/grafana/loki",
"source_dep_version": "3.7.1"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "loki",
"config": {
"placeholder": "loki"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
},
{
"name": "data_retention_days",
"type": "int",
"title": "Retention Days",
"required": false,
"default": 7,
"description": "Number of days to retain logs",
"config": {
"slider": true,
"min": 1,
"max": 365,
"step": 1,
"placeholder": "7",
"unit": "days"
}
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_http",
"type": "str",
"title": "HTTP Port",
"required": false,
"default": 3100,
"config": {
"placeholder": "3100"
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "loki"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
}
]
}
-4
View File
@@ -1,4 +0,0 @@
# MariaDB credentials
MARIADB_USER=<< database_user >>
MARIADB_PASSWORD=<< database_password >>
MARIADB_ROOT_PASSWORD=<< database_root_password >>
-19
View File
@@ -1,19 +0,0 @@
---
services:
<< service_name >>:
image: docker.io/library/mariadb:12.2.2
restart: << restart_policy >>
environment:
- MARIADB_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
- MARIADB_DATABASE=<< database_name >>
- MARIADB_USER=${MARIADB_USER}
- MARIADB_PASSWORD=${MARIADB_PASSWORD}
ports:
- "<< ports_mariadb >>:3306"
volumes:
- << service_name >>_data:/var/lib/mysql
volumes:
<< service_name >>_data:
driver: local
-116
View File
@@ -1,116 +0,0 @@
{
"slug": "mariadb",
"kind": "compose",
"metadata": {
"name": "MariaDB",
"description": "Community-developed, open-source relational database management system and drop-in replacement for MySQL.",
"tags": [],
"icon": {
"provider": "selfhst",
"id": "mariadb"
},
"draft": false,
"version": {
"name": "12.2.2",
"source_dep_name": "docker.io/library/mariadb",
"source_dep_version": "12.2.2"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "mariadb",
"config": {
"placeholder": "mariadb"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_mariadb",
"type": "int",
"title": "MariaDB Port",
"required": true,
"default": 3306,
"config": {
"placeholder": "3306"
}
}
]
},
{
"title": "Database",
"name": "database",
"items": [
{
"name": "database_name",
"type": "str",
"title": "Database Name",
"required": true,
"default": "app",
"config": {
"placeholder": "app"
}
},
{
"name": "database_user",
"type": "str",
"title": "Database User",
"required": true,
"default": "app",
"config": {
"placeholder": "app"
}
},
{
"name": "database_password",
"type": "secret",
"title": "Database Password",
"required": true,
"config": {
"autogenerated": {
"length": 32
}
}
},
{
"name": "database_root_password",
"type": "secret",
"title": "Root Password",
"required": true,
"config": {
"autogenerated": {
"length": 32
}
}
}
]
}
]
}
-5
View File
@@ -1,5 +0,0 @@
POSTGRES_USER=n8n
POSTGRES_PASSWORD=qqWoLCgg8ElAX6
POSTGRES_DB=n8n
N8N_BASIC_AUTH_USER=mmcfetridge
N8N_BASIC_AUTH_PASSWORD=qqWoLCgg8ElAX6
-38
View File
@@ -1,38 +0,0 @@
services:
n8n:
image: n8nio/n8n
ports:
- "5678:5678"
container_name: n8n
env_file:
- .env
security_opt:
- no-new-privileges:true
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=db
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_USER}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=$(POSTGRES_PASSWORD)
- NODE_FUNCTION_ALLOW_EXTERNAL=axios,qs
volumes:
- ./appdata/n8n:/home/node/.n8n
depends_on:
- db
restart: unless-stopped
db:
image: postgres:12
env_file:
- .env
volumes:
- /home/miker/docker/n8n/data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=$(POSTGRES_PASSWORD)
- POSTGRES_DB=n8n
restart: unless-stopped
-6
View File
@@ -1,6 +0,0 @@
# n8n credentials
<%- if database_type == 'postgres' %>
DATABASE_USER=<< database_user >>
DATABASE_PASSWORD=<< database_password >>
<%- endif %>
N8N_ENCRYPTION_KEY=<< encryption_key >>
-76
View File
@@ -1,76 +0,0 @@
services:
<< service_name >>:
image: docker.n8n.io/n8nio/n8n:2.20.0
container_name: << container_name >>
hostname: << container_hostname >>
restart: << restart_policy >>
environment:
<%- if container_loglevel %>
- N8N_LOG_LEVEL=<< container_loglevel >>
<%- endif %>
<%- if container_timezone %>
- GENERIC_TIMEZONE=<< container_timezone >>
- TZ=<< container_timezone >>
<%- endif %>
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
- NODE_ENV=production
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
<%- if database_type == 'postgres' %>
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=<< database_host >>
- DB_POSTGRESDB_PORT=<< database_port >>
- DB_POSTGRESDB_DATABASE=<< database_name >>
- DB_POSTGRESDB_USER=${DATABASE_USER}
- DB_POSTGRESDB_PASSWORD=${DATABASE_PASSWORD}
<%- endif %>
<%- if traefik_enabled %>
- N8N_HOST=<< traefik_host >>.<< traefik_domain >>
- N8N_PORT=5678
<%- if traefik_tls_enabled %>
- N8N_PROTOCOL=https
- N8N_EDITOR_BASE_URL=https://<< traefik_host >>.<< traefik_domain >>
- WEBHOOK_URL=https://<< traefik_host >>.<< traefik_domain >>/
<%- else %>
- N8N_PROTOCOL=http
- N8N_EDITOR_BASE_URL=http://<< traefik_host >>.<< traefik_domain >>
- WEBHOOK_URL=http://<< traefik_host >>.<< traefik_domain >>/
<%- endif %>
- N8N_PROXY_HOPS=1
<%- endif %>
volumes:
- /etc/localtime:/etc/localtime:ro
- << service_name >>_data:/home/node/.n8n
<%- if traefik_enabled %>
networks:
- << traefik_network >>
<%- endif %>
<%- if not traefik_enabled %>
ports:
- "<< ports_http >>:5678"
<%- endif %>
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>-web.loadbalancer.server.port=5678
- traefik.http.routers.<< service_name >>-http.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>-https.service=<< service_name >>-web
- traefik.http.routers.<< service_name >>-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>-https.tls=true
- traefik.http.routers.<< service_name >>-https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
volumes:
<< service_name >>_data:
driver: local
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
external: true
<%- endif %>
-303
View File
@@ -1,303 +0,0 @@
{
"slug": "n8n",
"kind": "compose",
"metadata": {
"name": "N8N",
"description": "Source-available workflow automation tool that connects apps and services to automate tasks through a visual drag-and-drop node editor.",
"tags": [
"traefik",
"database"
],
"icon": {
"provider": "selfhst",
"id": "n8n"
},
"draft": false,
"version": {
"name": "2.20.0",
"source_dep_name": "docker.n8n.io/n8nio/n8n",
"source_dep_version": "2.20.0"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "n8n",
"config": {
"placeholder": "n8n"
}
},
{
"name": "container_name",
"type": "str",
"title": "Container Name",
"required": false,
"default": "n8n",
"config": {
"placeholder": "n8n"
}
},
{
"name": "container_hostname",
"type": "str",
"title": "Container Hostname",
"required": false,
"default": "n8n",
"config": {
"placeholder": "n8n"
}
},
{
"name": "container_timezone",
"type": "str",
"title": "Container Timezone",
"required": false,
"config": {
"placeholder": "Europe/Berlin"
}
},
{
"name": "container_loglevel",
"type": "enum",
"title": "Log Level",
"required": false,
"default": "info",
"config": {
"options": [
"debug",
"info",
"warn",
"error"
]
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "n8n"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Traefik Entrypoint",
"required": false,
"default": "",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"needs": [
"traefik_enabled=true"
],
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "Traefik Tls Entrypoint",
"required": false,
"default": "",
"needs": [
"traefik_tls_enabled=true"
],
"config": {
"placeholder": "websecure"
}
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
},
{
"title": "Database",
"name": "database",
"items": [
{
"name": "database_type",
"type": "enum",
"title": "Database Type",
"required": false,
"default": "sqlite",
"config": {
"options": [
"sqlite",
"postgres"
]
}
},
{
"name": "database_host",
"type": "str",
"title": "Database host",
"required": true,
"default": "postgres",
"needs": [
"database_type=postgres"
],
"config": {
"placeholder": "postgres"
}
},
{
"name": "database_port",
"type": "int",
"title": "Database port",
"required": true,
"default": 5432,
"needs": [
"database_type=postgres"
],
"config": {
"placeholder": "5432"
}
},
{
"name": "database_name",
"type": "str",
"title": "Database name",
"required": true,
"default": "n8n",
"needs": [
"database_type=postgres"
],
"config": {
"placeholder": "n8n"
}
},
{
"name": "database_user",
"type": "str",
"title": "Database username",
"required": true,
"default": "n8n",
"needs": [
"database_type=postgres"
],
"config": {
"placeholder": "n8n"
}
},
{
"name": "database_password",
"type": "secret",
"title": "Database password",
"required": true,
"needs": [
"database_type=postgres"
]
}
]
},
{
"title": "Security",
"name": "security",
"items": [
{
"name": "encryption_key",
"type": "secret",
"title": "Encryption Key",
"required": false,
"config": {
"autogenerated": {
"length": 64
}
}
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_http",
"type": "int",
"title": "External HTTP port",
"required": false,
"default": 5678,
"needs": [
"traefik_enabled=false"
],
"config": {
"placeholder": "5678"
}
}
]
}
]
}
-177
View File
@@ -1,177 +0,0 @@
services:
<%- if traefik_enabled and traefik_mode == 'integrated' %>
traefik:
image: docker.io/library/traefik:v3.6
restart: << restart_policy >>
logging:
driver: "json-file"
options:
max-size: "500m"
max-file: "2"
command:
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--providers.docker.network=netbird"
- "--entrypoints.<< traefik_entrypoint >>.address=:80"
<%- if traefik_tls_enabled %>
- "--entrypoints.<< traefik_tls_entrypoint >>.address=:443"
- "--entrypoints.<< traefik_tls_entrypoint >>.transport.respondingTimeouts.readTimeout=0"
- "--entrypoints.<< traefik_entrypoint >>.http.redirections.entrypoint.to=<< traefik_tls_entrypoint >>"
- "--entrypoints.<< traefik_entrypoint >>.http.redirections.entrypoint.scheme=https"
- "--certificatesresolvers.<< traefik_tls_certresolver >>.acme.tlschallenge=true"
- "--certificatesresolvers.<< traefik_tls_certresolver >>.acme.email=<< letsencrypt_email >>"
- "--certificatesresolvers.<< traefik_tls_certresolver >>.acme.storage=/letsencrypt/acme.json"
<%- endif %>
ports:
- "80:80"
<%- if traefik_tls_enabled %>
- "443:443"
<%- endif %>
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
<%- if traefik_tls_enabled %>
- netbird_traefik_letsencrypt:/letsencrypt
<%- endif %>
networks:
- netbird
<%- endif %>
dashboard:
image: docker.io/netbirdio/dashboard:latest
restart: << restart_policy >>
logging:
driver: "json-file"
options:
max-size: "500m"
max-file: "2"
depends_on:
- netbird-server
environment:
<%- if traefik_tls_enabled %>
- NETBIRD_MGMT_API_ENDPOINT=https://<< public_hostname >>
- NETBIRD_MGMT_GRPC_API_ENDPOINT=https://<< public_hostname >>
<%- else %>
- NETBIRD_MGMT_API_ENDPOINT=http://<< public_hostname >>
- NETBIRD_MGMT_GRPC_API_ENDPOINT=http://<< public_hostname >>
<%- endif %>
- AUTH_AUDIENCE=netbird-dashboard
- AUTH_CLIENT_ID=netbird-dashboard
- AUTH_CLIENT_SECRET=
<%- if traefik_tls_enabled %>
- AUTH_AUTHORITY=https://<< public_hostname >>/oauth2
<%- else %>
- AUTH_AUTHORITY=http://<< public_hostname >>/oauth2
<%- endif %>
- USE_AUTH0=false
- AUTH_SUPPORTED_SCOPES=openid profile email groups
- AUTH_REDIRECT_URI=/nb-auth
- AUTH_SILENT_REDIRECT_URI=/nb-silent-auth
<%- if traefik_tls_enabled %>
- NGINX_SSL_PORT=443
<%- else %>
- NGINX_SSL_PORT=80
<%- endif %>
- LETSENCRYPT_DOMAIN=none
<%- if not traefik_enabled %>
ports:
- "127.0.0.1:8080:80"
<%- endif %>
<%- if traefik_enabled %>
labels:
- "traefik.enable=true"
<%- if traefik_mode == 'integrated' %>
- "traefik.docker.network=netbird"
<%- elif traefik_mode == 'existing' %>
- "traefik.docker.network=<< traefik_network >>"
<%- endif %>
- "traefik.http.routers.netbird-dashboard.rule=Host(`<< public_hostname >>`)"
<%- if traefik_tls_enabled %>
- "traefik.http.routers.netbird-dashboard.entrypoints=<< traefik_tls_entrypoint >>"
- "traefik.http.routers.netbird-dashboard.tls=true"
- "traefik.http.routers.netbird-dashboard.tls.certresolver=<< traefik_tls_certresolver >>"
<%- else %>
- "traefik.http.routers.netbird-dashboard.entrypoints=<< traefik_entrypoint >>"
<%- endif %>
- "traefik.http.routers.netbird-dashboard.priority=1"
- "traefik.http.services.netbird-dashboard.loadbalancer.server.port=80"
<%- endif %>
networks:
- netbird
<%- if traefik_enabled and traefik_mode == 'existing' %>
- << traefik_network >>
<%- endif %>
netbird-server:
image: docker.io/netbirdio/netbird-server:latest
restart: << restart_policy >>
logging:
driver: "json-file"
options:
max-size: "500m"
max-file: "2"
command:
- --config
- /etc/netbird/config.yaml
ports:
<%- if not traefik_enabled %>
- "127.0.0.1:8081:80"
<%- endif %>
- "<< stun_port >>:<< stun_port >>/udp"
volumes:
- netbird_data:/var/lib/netbird
- ./config:/etc/netbird:ro
<%- if traefik_enabled %>
labels:
- "traefik.enable=true"
<%- if traefik_mode == 'integrated' %>
- "traefik.docker.network=netbird"
<%- elif traefik_mode == 'existing' %>
- "traefik.docker.network=<< traefik_network >>"
<%- endif %>
# gRPC traffic needs an h2c backend service.
- "traefik.http.routers.netbird-grpc.rule=Host(`<< public_hostname >>`) && (PathPrefix(`/signalexchange.SignalExchange/`) || PathPrefix(`/management.ManagementService/`) || PathPrefix(`/management.ProxyService/`))"
<%- if traefik_tls_enabled %>
- "traefik.http.routers.netbird-grpc.entrypoints=<< traefik_tls_entrypoint >>"
- "traefik.http.routers.netbird-grpc.tls=true"
- "traefik.http.routers.netbird-grpc.tls.certresolver=<< traefik_tls_certresolver >>"
<%- else %>
- "traefik.http.routers.netbird-grpc.entrypoints=<< traefik_entrypoint >>"
<%- endif %>
- "traefik.http.routers.netbird-grpc.service=netbird-server-h2c"
- "traefik.http.routers.netbird-backend.rule=Host(`<< public_hostname >>`) && (PathPrefix(`/relay`) || PathPrefix(`/ws-proxy/`) || PathPrefix(`/api`) || PathPrefix(`/oauth2`))"
<%- if traefik_tls_enabled %>
- "traefik.http.routers.netbird-backend.entrypoints=<< traefik_tls_entrypoint >>"
- "traefik.http.routers.netbird-backend.tls=true"
- "traefik.http.routers.netbird-backend.tls.certresolver=<< traefik_tls_certresolver >>"
<%- else %>
- "traefik.http.routers.netbird-backend.entrypoints=<< traefik_entrypoint >>"
<%- endif %>
- "traefik.http.routers.netbird-backend.service=netbird-server"
- "traefik.http.services.netbird-server.loadbalancer.server.port=80"
- "traefik.http.services.netbird-server-h2c.loadbalancer.server.port=80"
- "traefik.http.services.netbird-server-h2c.loadbalancer.server.scheme=h2c"
<%- endif %>
networks:
- netbird
<%- if traefik_enabled and traefik_mode == 'existing' %>
- << traefik_network >>
<%- endif %>
networks:
netbird:
name: netbird
driver: bridge
<%- if traefik_enabled and traefik_mode == 'existing' %>
<< traefik_network >>:
external: true
<%- endif %>
volumes:
netbird_data:
name: << data_volume_name >>
driver: local
<%- if traefik_enabled and traefik_mode == 'integrated' and traefik_tls_enabled %>
netbird_traefik_letsencrypt:
name: << letsencrypt_volume_name >>
driver: local
<%- endif %>
-265
View File
@@ -1,265 +0,0 @@
{
"slug": "netbird",
"kind": "compose",
"metadata": {
"name": "NetBird",
"description": "Self-hosted NetBird control plane with embedded local user management and optional Traefik integration.",
"tags": [
"vpn",
"wireguard",
"traefik"
],
"icon": {
"provider": "selfhst",
"id": "netbird"
},
"draft": false,
"version": {
"name": "2026.04.14",
"source_dep_name": "manual/netbird"
}
},
"variables": [
{
"title": "General",
"name": "general",
"items": [
{
"name": "public_hostname",
"type": "str",
"title": "Public Hostname",
"required": true,
"description": "Public DNS hostname for the NetBird dashboard and API.",
"config": {
"placeholder": "netbird.example.com"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
}
]
},
{
"title": "NetBird",
"name": "netbird",
"items": [
{
"name": "stun_port",
"type": "int",
"title": "STUN UDP Port",
"required": true,
"default": 3478,
"description": "Public UDP port exposed for the embedded STUN service.",
"config": {
"placeholder": "3478"
}
},
{
"name": "netbird_log_level",
"type": "enum",
"title": "Log Level",
"required": true,
"default": "info",
"description": "Log level used by the combined NetBird server.",
"config": {
"options": [
"debug",
"info",
"warn",
"error"
]
}
},
{
"name": "disable_anonymous_metrics",
"type": "bool",
"title": "Disable Anonymous Metrics",
"required": false,
"default": false,
"description": "Disable NetBird anonymous usage metrics."
},
{
"name": "disable_geolite_update",
"type": "bool",
"title": "Disable GeoLite Updates",
"required": false,
"default": false,
"description": "Disable automatic GeoLite database updates."
},
{
"name": "netbird_relay_auth_secret",
"type": "secret",
"title": "Relay Auth Secret",
"required": true,
"description": "Shared secret used internally by the embedded relay service.",
"config": {
"autogenerated": {
"length": 32
}
}
},
{
"name": "netbird_store_encryption_key",
"type": "secret",
"title": "Store Encryption Key",
"required": true,
"description": "Base64-encoded 32-byte key used to protect local user data stored by the embedded IdP.",
"config": {
"autogenerated": {
"kind": "base64",
"bytes": 32
}
}
}
]
},
{
"title": "Storage",
"name": "storage",
"items": [
{
"name": "data_volume_name",
"type": "str",
"title": "NetBird Data Volume",
"required": true,
"default": "netbird_data",
"description": "Docker volume name for NetBird state, SQLite data, and embedded IdP files.",
"config": {
"placeholder": "netbird_data"
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": true
},
{
"name": "traefik_mode",
"type": "enum",
"title": "Traefik Mode",
"required": true,
"default": "integrated",
"config": {
"options": [
"integrated",
"existing"
]
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Traefik Network",
"required": true,
"default": "traefik",
"description": "External Docker network shared with the existing Traefik installation.",
"needs": [
"traefik_mode=existing"
],
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"description": "Traefik entrypoint name used by the NetBird routers when TLS is disabled.",
"config": {
"placeholder": "web"
},
"needs": [
"traefik_tls_enabled=false"
]
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": true
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"description": "Secure Traefik entrypoint name used by the NetBird routers.",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "letsencrypt",
"description": "Traefik certificate resolver name used by the NetBird routers.",
"config": {
"placeholder": "letsencrypt"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "letsencrypt_email",
"type": "str",
"title": "ACME Email",
"required": true,
"description": "Email used for Let's Encrypt registration and expiry notices when the bundled Traefik instance is enabled.",
"needs": [
"traefik_tls_enabled=true",
"traefik_mode=integrated"
],
"config": {
"placeholder": "admin@example.com"
}
},
{
"name": "letsencrypt_volume_name",
"type": "str",
"title": "Traefik ACME Volume",
"required": true,
"default": "netbird_traefik_letsencrypt",
"description": "Docker volume name for Traefik ACME certificate storage.",
"needs": [
"traefik_tls_enabled=true",
"traefik_mode=integrated"
],
"config": {
"placeholder": "netbird_traefik_letsencrypt"
}
}
]
}
]
}
-9
View File
@@ -1,9 +0,0 @@
# NetBox credentials
DATABASE_USER=<< database_user >>
DATABASE_PASSWORD=<< database_password >>
REDIS_PASSWORD=<< redis_password >>
NETBOX_SECRET_KEY=<< netbox_secret_key >>
<%- if email_enabled %>
EMAIL_USERNAME=<< email_username >>
EMAIL_PASSWORD=<< email_password >>
<%- endif %>
-199
View File
@@ -1,199 +0,0 @@
---
services:
<< service_name >>:
image: docker.io/netboxcommunity/netbox:v4.5.10
restart: << restart_policy >>
environment:
<%- if container_timezone %>
- TIME_ZONE=<< container_timezone >>
<%- endif %>
<%- if traefik_enabled %>
- ALLOWED_HOSTS=<< traefik_host >>.<< traefik_domain >>
<%- else %>
- ALLOWED_HOSTS=*
<%- endif %>
<%- if database_external %>
- DB_HOST=<< database_host >>
<%- else %>
- DB_HOST=<< service_name >>_postgres
<%- endif %>
- DB_NAME=<< database_name >>
- DB_USER=${DATABASE_USER}
- DB_PASSWORD=${DATABASE_PASSWORD}
- REDIS_HOST=<< service_name >>_redis
- REDIS_PASSWORD=${REDIS_PASSWORD}
- REDIS_CACHE_HOST=<< service_name >>_redis-cache
- REDIS_CACHE_PASSWORD=${REDIS_PASSWORD}
- SECRET_KEY=${NETBOX_SECRET_KEY}
<%- if netbox_metrics_enabled %>
- METRICS_ENABLED=true
<%- endif %>
<%- if email_enabled %>
- EMAIL_SERVER=<< email_host >>
- EMAIL_PORT=<< email_port >>
- EMAIL_FROM=<< email_from >>
- EMAIL_USERNAME=${EMAIL_USERNAME}
- EMAIL_PASSWORD=${EMAIL_PASSWORD}
<%- if email_encryption == "ssl" %>
- EMAIL_USE_SSL=True
<%- elif email_encryption == "starttls" %>
- EMAIL_USE_TLS=True
<%- endif %>
<%- endif %>
networks:
<%- if traefik_enabled %>
<< traefik_network >>:
<%- endif %>
<< service_name >>_backend:
<%- if not traefik_enabled %>
ports:
- "<< ports_http >>:8080"
<%- endif %>
volumes:
- << service_name >>_media:/opt/netbox/netbox/media
- << service_name >>_reports:/opt/netbox/netbox/reports
- << service_name >>_scripts:/opt/netbox/netbox/scripts
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>_web.loadBalancer.server.port=8080
- traefik.http.routers.<< service_name >>_http.service=<< service_name >>_web
- traefik.http.routers.<< service_name >>_http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>_http.entrypoints=<< traefik_entrypoint >>
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>_https.service=<< service_name >>_web
- traefik.http.routers.<< service_name >>_https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>_https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>_https.tls=true
- traefik.http.routers.<< service_name >>_https.tls.certresolver=<< traefik_tls_certresolver >>
<%- endif %>
<%- endif %>
depends_on:
<%- if not database_external %>
- << service_name >>_postgres
<%- endif %>
- << service_name >>_redis
- << service_name >>_redis-cache
<< service_name >>_worker:
image: docker.io/netboxcommunity/netbox:v4.5.10
restart: << restart_policy >>
command:
- /opt/netbox/venv/bin/python
- /opt/netbox/netbox/manage.py
- rqworker
environment:
<%- if container_timezone %>
- TIME_ZONE=<< container_timezone >>
<%- endif %>
<%- if database_external %>
- DB_HOST=<< database_host >>
<%- else %>
- DB_HOST=<< service_name >>_postgres
<%- endif %>
- DB_NAME=<< database_name >>
- DB_USER=${DATABASE_USER}
- DB_PASSWORD=${DATABASE_PASSWORD}
- REDIS_HOST=<< service_name >>_redis
- REDIS_PASSWORD=${REDIS_PASSWORD}
- REDIS_CACHE_HOST=<< service_name >>_redis-cache
- REDIS_CACHE_PASSWORD=${REDIS_PASSWORD}
- SECRET_KEY=${NETBOX_SECRET_KEY}
<%- if netbox_metrics_enabled %>
- METRICS_ENABLED=true
<%- endif %>
<%- if email_enabled %>
- EMAIL_SERVER=<< email_host >>
- EMAIL_PORT=<< email_port >>
- EMAIL_FROM=<< email_from >>
- EMAIL_USERNAME=${EMAIL_USERNAME}
- EMAIL_PASSWORD=${EMAIL_PASSWORD}
<%- if email_encryption == "ssl" %>
- EMAIL_USE_SSL=True
<%- elif email_encryption == "starttls" %>
- EMAIL_USE_TLS=True
<%- endif %>
<%- endif %>
networks:
<< service_name >>_backend:
volumes:
- << service_name >>_media:/opt/netbox/netbox/media
- << service_name >>_reports:/opt/netbox/netbox/reports
- << service_name >>_scripts:/opt/netbox/netbox/scripts
depends_on:
<%- if not database_external %>
- << service_name >>_postgres
<%- endif %>
- << service_name >>
- << service_name >>_redis
- << service_name >>_redis-cache
<< service_name >>_redis:
image: docker.io/library/redis:8.6.2-alpine
restart: << restart_policy >>
command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}"]
environment:
- REDIS_PASSWORD=${REDIS_PASSWORD}
networks:
<< service_name >>_backend:
volumes:
- << service_name >>_redis:/data
<< service_name >>_redis-cache:
image: docker.io/library/redis:8.6.2-alpine
restart: << restart_policy >>
command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}"]
environment:
- REDIS_PASSWORD=${REDIS_PASSWORD}
networks:
<< service_name >>_backend:
volumes:
- << service_name >>_redis-cache:/data
<%- if not database_external %>
<< service_name >>_postgres:
image: docker.io/library/postgres:17.9
restart: << restart_policy >>
environment:
<%- if container_timezone %>
- TZ=<< container_timezone >>
<%- endif %>
- POSTGRES_USER=${DATABASE_USER}
- POSTGRES_PASSWORD=${DATABASE_PASSWORD}
- POSTGRES_DB=<< database_name >>
healthcheck:
test: ["CMD-SHELL", "pg_isready -U << database_user >>"]
start_period: 30s
interval: 10s
timeout: 10s
retries: 5
networks:
- << service_name >>_backend
volumes:
- << service_name >>_postgres:/var/lib/postgresql/data
<%- endif %>
networks:
<< service_name >>_backend:
driver: bridge
<%- if traefik_enabled %>
<< traefik_network >>:
external: true
<%- endif %>
volumes:
<%- if not database_external %>
<< service_name >>_postgres:
driver: local
<%- endif %>
<< service_name >>_redis:
driver: local
<< service_name >>_redis-cache:
driver: local
<< service_name >>_media:
driver: local
<< service_name >>_reports:
driver: local
<< service_name >>_scripts:
driver: local
-324
View File
@@ -1,324 +0,0 @@
{
"slug": "netbox-compose",
"kind": "compose",
"metadata": {
"name": "NetBox",
"description": "Network infrastructure management (IPAM/DCIM) and automation source of truth. Manages IP addresses, circuits, devices, racks, cables, and other network infrastructure components.",
"tags": [
"traefik",
"database",
"email"
],
"icon": {
"provider": "selfhst",
"id": "netbox"
},
"draft": false,
"version": {
"name": "v4.5.10",
"source_dep_name": "docker.io/netboxcommunity/netbox",
"source_dep_version": "v4.5.10"
}
},
"variables": [
{
"title": "Database",
"name": "database",
"items": [
{
"name": "database_name",
"type": "str",
"title": "Database Name",
"required": false,
"default": "netbox",
"config": {
"placeholder": "netbox"
}
},
{
"name": "database_user",
"type": "str",
"title": "Database User",
"required": false,
"default": "netbox",
"config": {
"placeholder": "netbox"
}
},
{
"name": "database_host",
"type": "str",
"title": "Database Host",
"required": true,
"needs": [
"database_external=true"
],
"config": {
"placeholder": "postgres"
}
},
{
"name": "database_password",
"type": "secret",
"title": "Database Password",
"required": true,
"config": {
"autogenerated": {
"length": 32
}
}
},
{
"name": "redis_password",
"type": "secret",
"title": "Redis Password",
"required": true,
"config": {
"autogenerated": {
"length": 32
}
}
},
{
"name": "database_external",
"type": "bool",
"title": "External Database",
"required": false,
"default": false
}
]
},
{
"title": "Email",
"toggle": "email_enabled",
"name": "email",
"items": [
{
"name": "email_host",
"type": "str",
"title": "SMTP server hostname",
"required": true,
"config": {
"placeholder": "smtp.home.arpa"
}
},
{
"name": "email_port",
"type": "int",
"title": "SMTP server port",
"required": true,
"default": 25,
"config": {
"placeholder": "25"
}
},
{
"name": "email_username",
"type": "str",
"title": "SMTP username",
"required": true,
"config": {
"placeholder": "user@example.com"
}
},
{
"name": "email_password",
"type": "secret",
"title": "SMTP password",
"required": true
},
{
"name": "email_from",
"type": "str",
"title": "From email address",
"required": true,
"config": {
"placeholder": "noreply@example.com"
}
},
{
"name": "email_enabled",
"type": "bool",
"title": "Email",
"required": false,
"default": false
},
{
"name": "email_encryption",
"type": "str",
"title": "Encryption",
"required": false,
"default": "tls",
"config": {
"placeholder": "tls"
}
}
]
},
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "netbox",
"config": {
"placeholder": "netbox"
}
},
{
"name": "container_timezone",
"type": "str",
"title": "Container Timezone",
"required": false,
"config": {
"placeholder": "Europe/Berlin"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
}
]
},
{
"title": "NetBox Configuration",
"name": "netbox",
"items": [
{
"name": "netbox_metrics_enabled",
"type": "bool",
"title": "Metrics",
"required": false,
"default": false
},
{
"name": "netbox_secret_key",
"type": "secret",
"title": "Secret Key",
"required": true,
"config": {
"autogenerated": {
"length": 50
}
}
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_http",
"type": "str",
"title": "HTTP Port",
"required": false,
"default": 8000,
"config": {
"placeholder": "8000"
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "netbox"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Entrypoint",
"required": true,
"default": "web",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "TLS Entrypoint",
"required": true,
"default": "websecure",
"config": {
"placeholder": "websecure"
},
"needs": [
"traefik_tls_enabled=true"
]
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
}
]
}
-5
View File
@@ -1,5 +0,0 @@
# Nextcloud database credentials
DATABASE_USER=<< database_user >>
DATABASE_PASSWORD=<< database_password >>
NEXTCLOUD_ADMIN_USER=<< admin_user >>
NEXTCLOUD_ADMIN_PASSWORD=<< admin_password >>
-145
View File
@@ -1,145 +0,0 @@
services:
<< service_name >>-app:
image: docker.io/library/nextcloud:33.0.3-apache
restart: << restart_policy >>
container_name: << container_name >>-app
environment:
- TZ=<< container_timezone >>
- NEXTCLOUD_ADMIN_USER=${NEXTCLOUD_ADMIN_USER}
- NEXTCLOUD_ADMIN_PASSWORD=${NEXTCLOUD_ADMIN_PASSWORD}
- REDIS_HOST=<< service_name >>-redis
<%- if database_type == 'mysql' %>
- MYSQL_USER=${DATABASE_USER}
- MYSQL_PASSWORD=${DATABASE_PASSWORD}
- MYSQL_DATABASE=<< database_name >>
- MYSQL_HOST=<< service_name >>-db
<%- elif database_type == 'postgres' %>
- POSTGRES_USER=${DATABASE_USER}
- POSTGRES_PASSWORD=${DATABASE_PASSWORD}
- POSTGRES_DB=<< database_name >>
- POSTGRES_HOST=<< service_name >>-db
<%- endif %>
<%- if traefik_enabled %>
- NEXTCLOUD_TRUSTED_DOMAINS=<< traefik_host >>.<< traefik_domain >>
- OVERWRITEHOST=<< traefik_host >>.<< traefik_domain >>
<%- if traefik_tls_enabled %>
- OVERWRITEPROTOCOL=https
<%- else %>
- OVERWRITEPROTOCOL=http
<%- endif %>
<%- endif %>
<%- if not traefik_enabled %>
ports:
- "<< ports_http >>:80"
<%- endif %>
volumes:
- nextcloud-data:/var/www/html
networks:
- << service_name >>-backend
<%- if traefik_enabled %>
- << traefik_network >>
<%- endif %>
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>-web.loadbalancer.server.port=80
- traefik.http.routers.<< service_name >>-web-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-web-http.entrypoints=<< traefik_entrypoint >>
- traefik.http.routers.<< service_name >>-web-http.service=<< service_name >>-web
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>-web-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-web-https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>-web-https.tls=true
- traefik.http.routers.<< service_name >>-web-https.tls.certresolver=<< traefik_tls_certresolver >>
- traefik.http.routers.<< service_name >>-web-https.service=<< service_name >>-web
<%- endif %>
<%- endif %>
depends_on:
- << service_name >>-db
- << service_name >>-redis
<< service_name >>-cron:
image: docker.io/library/nextcloud:33.0.3-apache
restart: << restart_policy >>
container_name: << container_name >>-cron
entrypoint: /cron.sh
environment:
- TZ=<< container_timezone >>
- REDIS_HOST=<< service_name >>-redis
<%- if database_type == 'mysql' %>
- MYSQL_USER=${DATABASE_USER}
- MYSQL_PASSWORD=${DATABASE_PASSWORD}
- MYSQL_DATABASE=<< database_name >>
- MYSQL_HOST=<< service_name >>-db
<%- elif database_type == 'postgres' %>
- POSTGRES_USER=${DATABASE_USER}
- POSTGRES_PASSWORD=${DATABASE_PASSWORD}
- POSTGRES_DB=<< database_name >>
- POSTGRES_HOST=<< service_name >>-db
<%- endif %>
volumes:
- nextcloud-data:/var/www/html
networks:
- << service_name >>-backend
depends_on:
- << service_name >>-app
<< service_name >>-redis:
image: docker.io/library/redis:8-alpine
restart: << restart_policy >>
container_name: << service_name >>-redis
command: redis-server --appendonly yes
volumes:
- nextcloud-redis:/data
networks:
- << service_name >>-backend
<< service_name >>-db:
<%- if database_type == 'mysql' %>
# See compatibility matrix for Nextcloud 31
# https://docs.nextcloud.com/server/31/admin_manual/installation/system_requirements.html
image: docker.io/library/mariadb:10.11.16
restart: << restart_policy >>
container_name: << service_name >>-db
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
environment:
- TZ=<< container_timezone >>
- MYSQL_RANDOM_ROOT_PASSWORD=true
- MYSQL_USER=${DATABASE_USER}
- MYSQL_PASSWORD=${DATABASE_PASSWORD}
- MYSQL_DATABASE=<< database_name >>
volumes:
- nextcloud-db:/var/lib/mysql
networks:
- << service_name >>-backend
<%- elif database_type == 'postgres' %>
image: docker.io/library/postgres:17.9
restart: << restart_policy >>
container_name: << service_name >>-db
environment:
- TZ=<< container_timezone >>
- POSTGRES_USER=${DATABASE_USER}
- POSTGRES_PASSWORD=${DATABASE_PASSWORD}
- POSTGRES_DB=<< database_name >>
volumes:
- nextcloud-db:/var/lib/postgresql/data
networks:
- << service_name >>-backend
<%- endif %>
volumes:
nextcloud-data:
driver: local
nextcloud-db:
driver: local
nextcloud-redis:
driver: local
networks:
<< service_name >>-backend:
driver: bridge
<%- if traefik_enabled %>
<< traefik_network >>:
external: true
<%- endif %>
-284
View File
@@ -1,284 +0,0 @@
{
"slug": "nextcloud",
"kind": "compose",
"metadata": {
"name": "Nextcloud",
"description": "Self-hosted file sync and share platform, similar to Dropbox, with built-in collaboration tools, calendar, contacts, and extensible app ecosystem.",
"tags": [
"traefik"
],
"icon": {
"provider": "selfhst",
"id": "nextcloud"
},
"draft": false,
"version": {
"name": "33.0.3-apache",
"source_dep_name": "docker.io/library/nextcloud",
"source_dep_version": "33.0.3-apache"
}
},
"variables": [
{
"title": "Database",
"name": "database",
"items": [
{
"name": "database_type",
"type": "enum",
"title": "Database Type",
"required": false,
"default": "postgres",
"config": {
"options": [
"postgres",
"mysql"
]
}
},
{
"name": "database_name",
"type": "str",
"title": "Database Name",
"required": true,
"default": "nextcloud",
"config": {
"placeholder": "nextcloud"
}
},
{
"name": "database_user",
"type": "str",
"title": "Database User",
"required": true,
"default": "nextcloud",
"config": {
"placeholder": "nextcloud"
}
},
{
"name": "database_password",
"type": "secret",
"title": "Database Password",
"required": true,
"config": {
"autogenerated": {
"length": 32
}
}
}
]
},
{
"title": "General",
"name": "general",
"items": [
{
"name": "service_name",
"type": "str",
"title": "Service Name",
"required": false,
"default": "nextcloud",
"config": {
"placeholder": "nextcloud"
}
},
{
"name": "container_name",
"type": "str",
"title": "Container Name",
"required": false,
"default": "nextcloud",
"config": {
"placeholder": "nextcloud"
}
},
{
"name": "container_timezone",
"type": "str",
"title": "Container Timezone",
"required": false,
"config": {
"placeholder": "Europe/Berlin"
}
},
{
"name": "restart_policy",
"type": "enum",
"title": "Restart Policy",
"required": true,
"default": "unless-stopped",
"config": {
"options": [
"unless-stopped",
"always",
"on-failure",
"no"
]
}
}
]
},
{
"title": "Traefik",
"name": "traefik",
"toggle": "traefik_enabled",
"items": [
{
"name": "traefik_enabled",
"type": "bool",
"title": "Traefik",
"required": false,
"default": false
},
{
"name": "traefik_host",
"type": "str",
"title": "Host",
"required": true,
"config": {
"placeholder": "nextcloud"
}
},
{
"name": "traefik_domain",
"type": "str",
"title": "Domain",
"required": true,
"config": {
"placeholder": "home.arpa"
}
},
{
"name": "traefik_entrypoint",
"type": "str",
"title": "Traefik Entrypoint",
"required": false,
"default": "",
"config": {
"placeholder": "web"
}
},
{
"name": "traefik_network",
"type": "str",
"title": "Network",
"required": true,
"default": "traefik",
"config": {
"placeholder": "traefik"
}
},
{
"name": "traefik_tls_enabled",
"type": "bool",
"title": "TLS",
"required": false,
"default": false
},
{
"name": "traefik_tls_entrypoint",
"type": "str",
"title": "Traefik Tls Entrypoint",
"required": false,
"default": "",
"needs": [
"traefik_tls_enabled=true"
],
"config": {
"placeholder": "websecure"
}
},
{
"name": "traefik_tls_certresolver",
"type": "str",
"title": "Cert Resolver",
"required": true,
"default": "cloudflare",
"config": {
"placeholder": "cloudflare"
},
"needs": [
"traefik_tls_enabled=true"
]
}
]
},
{
"title": "Network",
"name": "network",
"items": [
{
"name": "network_mode",
"type": "enum",
"title": "Network Mode",
"required": false,
"default": "bridge",
"config": {
"options": [
"bridge",
"macvlan"
]
}
},
{
"name": "network_macvlan_ipv4_address_db",
"type": "str",
"title": "Database IP",
"required": false,
"default": "IP_ADDRESS",
"description": "Static IP address for database container (macvlan only)",
"needs": [
"network_mode=macvlan"
],
"config": {
"placeholder": "IP_ADDRESS"
}
}
]
},
{
"title": "Ports",
"name": "ports",
"items": [
{
"name": "ports_http",
"type": "int",
"title": "HTTP Port",
"required": false,
"default": 80,
"config": {
"placeholder": "80"
}
}
]
},
{
"title": "Nextcloud",
"name": "nextcloud",
"items": [
{
"name": "admin_user",
"type": "str",
"title": "Nextcloud admin username",
"required": false,
"default": "admin",
"config": {
"placeholder": "admin"
}
},
{
"name": "admin_password",
"type": "secret",
"title": "Nextcloud admin password",
"required": false,
"config": {
"autogenerated": {
"length": 32
}
}
}
]
}
]
}
-39
View File
@@ -1,39 +0,0 @@
services:
<< service_name >>:
image: docker.io/library/nginx:1.30.0-alpine
restart: << restart_policy >>
container_name: << container_name >>
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
<%- endif %>
<%- if not traefik_enabled %>
ports:
- "<< ports_http >>:80"
- "<< ports_https >>:443"
<%- endif %>
# volumes:
# - ./config/default.conf:/etc/nginx/conf.d/default.conf:ro
# - ./data:/usr/share/nginx/html:ro
<%- if traefik_enabled %>
labels:
- traefik.enable=true
- traefik.docker.network=<< traefik_network >>
- traefik.http.services.<< service_name >>-web.loadbalancer.server.port=80
- traefik.http.routers.<< service_name >>-web-http.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-web-http.entrypoints=<< traefik_entrypoint >>
- traefik.http.routers.<< service_name >>-web-http.service=<< service_name >>-web
<%- if traefik_tls_enabled %>
- traefik.http.routers.<< service_name >>-web-https.rule=Host(`<< traefik_host >>.<< traefik_domain >>`)
- traefik.http.routers.<< service_name >>-web-https.entrypoints=<< traefik_tls_entrypoint >>
- traefik.http.routers.<< service_name >>-web-https.tls=true
- traefik.http.routers.<< service_name >>-web-https.tls.certresolver=<< traefik_tls_certresolver >>
- traefik.http.routers.<< service_name >>-web-https.service=<< service_name >>-web
<%- endif %>
<%- endif %>
<%- if traefik_enabled %>
networks:
<< traefik_network >>:
external: true
<%- endif %>
@@ -1,9 +0,0 @@
server {
listen 80;
server_name _;
location / {
root /usr/share/nginx/html;
index index.html;
access_log on;
}
}

Some files were not shown because too many files have changed in this diff Show More