docker-compose/.paasify/plugins/traefik-svc.jsonnet
2022-07-29 02:23:23 -04:00

155 lines
4.1 KiB
Jsonnet

# Tag to add a restart policy on all containers
#
# Examples:
# tags:
# - docker-services-restart:
# policy: always
# services:
# - srv1
# - mysqldb
# Default imports
# -------------------------------------
# Import from external data
local docker_data = std.parseJson(std.extVar('docker_data'));
local user_data = std.parseJson(std.extVar('user_data'));
# Init defaults
local default_ns = std.get(user_data, 'PAASIFY_STACK_NS');
local default_name = std.get(user_data, 'PAASIFY_STACK_NAME');
local default_service = std.get(user_data, 'PAASIFY_STACK_SVC');
local default_domain = std.get(user_data, 'PAASIFY_STACK_DOMAIN');
# We replace app name by 'app', just for nice looking
local default_service_name = if default_service != default_name then default_service else 'app';
# Build default config
local config_default = {
TRAEFIK_NET_IDENT: 'default',
TRAEFIK_NET_NAME: std.get(user_data, 'APP_PROXY_NETWORK', default_ns + '_' + default_name),
TRAEFIK_NET_EXTERNAL: true,
TRAEFIK_SVC_IDENT: default_service,
#TRAEFIK_SVC_NAME: default_ns + '_' + default_name + '_' + default_service,
TRAEFIK_SVC_NAME: default_ns + '_' + default_name + '_' + default_service_name,
TRAEFIK_SVC_DOMAIN: default_service + '.' + default_domain,
TRAEFIK_SVC_PORT: 80,
TRAEFIK_SVC_ENTRYPOINTS: std.get(user_data, 'TRAEFIK_SVC_ENTRYPOINTS', default=null),
TRAEFIK_SVC_AUTH: std.get(user_data, 'TRAEFIK_SVC_AUTH', default=null),
TRAEFIK_SVC_TLS: std.get(user_data, 'TRAEFIK_SVC_TLS', default=false),
TRAEFIK_SVC_CERTRESOLVER: std.get(user_data, 'TRAEFIK_SVC_CERTRESOLVER', default=null),
};
local conf = config_default + user_data;
# Internal functions
# -------------------------------------
# Base routing
local LabelsTraefik(svc, domain, entrypoints, port) =
{
["traefik.enable"]: "true",
["traefik.http.routers." + svc + ".rule"]: 'Host(`' + domain + '`)',
["traefik.http.routers." + svc + ".entrypoints"]: entrypoints,
["traefik.http.routers." + svc + ".service"]: svc,
["traefik.http.services." + svc + ".loadbalancer.server.port"]: std.format("%s", port),
};
# Middleware
local LabelsTraefikAuthelia(svc, authservice) =
if std.isString(authservice) then
{
["traefik.http.routers." + svc + ".middlewares"]: authservice + '@docker',
} else {};
# TLS management
local LabelsTraefikTls(svc, status) =
if status == true then
{
["traefik.http.routers." + svc + ".tls"]: "true",
} else {};
local LabelsTraefikCertResolver(svc, name) =
if std.isString(name) then
LabelsTraefikTls(svc, true) + {
["traefik.http.routers." + svc + ".tls.certresolver"]: name,
} else {};
# Networking
local TraefikSvcNetwork(id, name) =
if std.isString(id) then
{
[id]: null,
} else {};
local TraefikPrjNetwork(id, name, external) =
if std.isString(id) then
{
[id]+: {
name: name
},
} +
if external == true then
{
[id]+: {
external: true,
},
} else {}
else {};
# Return result
# -------------------------------------
docker_data +
{
# Append stack network
#networks+: TraefikPrjNetwork(svc_network_id, svc_network),
networks+: TraefikPrjNetwork(
conf.TRAEFIK_NET_IDENT,
conf.TRAEFIK_NET_NAME,
conf.TRAEFIK_NET_EXTERNAL),
# Apply per services labels
services+: {
[conf.TRAEFIK_SVC_IDENT]+: {
labels+:
LabelsTraefik(
conf.TRAEFIK_SVC_NAME,
conf.TRAEFIK_SVC_DOMAIN,
conf.TRAEFIK_SVC_ENTRYPOINTS,
conf.TRAEFIK_SVC_PORT)
+ LabelsTraefikAuthelia(
conf.TRAEFIK_SVC_NAME,
conf.TRAEFIK_SVC_AUTH)
+ LabelsTraefikTls(
conf.TRAEFIK_SVC_NAME,
conf.TRAEFIK_SVC_TLS)
+ LabelsTraefikCertResolver(
conf.TRAEFIK_SVC_NAME,
conf.TRAEFIK_SVC_CERTRESOLVER)
,
networks+: TraefikSvcNetwork(
conf.TRAEFIK_NET_IDENT,
conf.TRAEFIK_NET_NAME),
},
},
#["x-paasify"]: {
# #stack_data: stack_data,
# #user_data: user_data,
# #config: config,
# config2: conf,
# #env_data: env_data,
#},
}