Remove dups
This commit is contained in:
@@ -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 %>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
<%- if tls_enabled and tls_email %>
|
||||
{
|
||||
email << tls_email >>
|
||||
}
|
||||
|
||||
<%- endif %>
|
||||
import /etc/caddy/config/*.caddy
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
# Checkmk credentials
|
||||
CMK_PASSWORD=<< cmk_password >>
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
# Forgejo database credentials
|
||||
<%- if database_type != 'sqlite' %>
|
||||
DATABASE_USER=<< database_user >>
|
||||
DATABASE_PASSWORD=<< database_password >>
|
||||
<%- endif %>
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
# Gitea database credentials
|
||||
<%- if database_type != 'sqlite' %>
|
||||
DATABASE_USER=<< database_user >>
|
||||
DATABASE_PASSWORD=<< database_password >>
|
||||
<%- endif %>
|
||||
@@ -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 %>
|
||||
@@ -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
|
||||
@@ -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 +0,0 @@
|
||||
GITLAB_ROOT_PASSWORD=<< root_password >>
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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 %>
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
@@ -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 %>
|
||||
@@ -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": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
# MariaDB credentials
|
||||
MARIADB_USER=<< database_user >>
|
||||
MARIADB_PASSWORD=<< database_password >>
|
||||
MARIADB_ROOT_PASSWORD=<< database_root_password >>
|
||||
@@ -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
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
POSTGRES_USER=n8n
|
||||
POSTGRES_PASSWORD=qqWoLCgg8ElAX6
|
||||
POSTGRES_DB=n8n
|
||||
N8N_BASIC_AUTH_USER=mmcfetridge
|
||||
N8N_BASIC_AUTH_PASSWORD=qqWoLCgg8ElAX6
|
||||
@@ -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
|
||||
@@ -1,6 +0,0 @@
|
||||
# n8n credentials
|
||||
<%- if database_type == 'postgres' %>
|
||||
DATABASE_USER=<< database_user >>
|
||||
DATABASE_PASSWORD=<< database_password >>
|
||||
<%- endif %>
|
||||
N8N_ENCRYPTION_KEY=<< encryption_key >>
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 %>
|
||||
@@ -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
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 >>
|
||||
@@ -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 %>
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
Reference in New Issue
Block a user