Add: Paasify filters

This commit is contained in:
mrjk 2022-07-29 02:23:23 -04:00
parent 4fcf44562b
commit 56f5a82c24
8 changed files with 500 additions and 0 deletions

View File

@ -0,0 +1,64 @@
# Tag to add a shared network
#
# Examples:
# Default imports
local user_data = std.parseJson(std.extVar('user_data'));
local docker_data = std.parseJson(std.extVar('docker_data'));
# Internal vars
local docker_services = std.get(docker_data, 'services', default={});
local docker_services_names = std.objectFields(docker_services);
# User options with defaults
local default_svcs = std.get(user_data, 'PAASIFY_STACK_SVCS');
local default_network = std.get(user_data, 'APP_NETWORK_NAME', 'default');
# Build default config
local config_default = {
APP_SERVICES: default_svcs,
APP_NETWORK_NAME: default_network,
APP_NETWORK_IDENT: default_network,
};
local conf = config_default + user_data;
local services_names = std.split(conf.APP_SERVICES, ',') ;
# Process
docker_data +
{
networks+: {
[conf.APP_NETWORK_IDENT]: {
name: conf.APP_NETWORK_NAME,
}
},
services+: {
[svc_name]+: { networks+: { [conf.APP_NETWORK_IDENT]: null } } for svc_name in services_names
},
}
###############3
##
##
##
### Internal vars
##local docker_services = std.get(docker_data, 'services', default={});
##local docker_services_names = std.objectFields(docker_services);
#
## System options
#local service_ns = std.get(user_data, 'namespace', default=std.get(stack_data, 'namespace', default=''));
#local service_stack = std.get(user_data, 'name', default=std.get(stack_data, 'current_stack', default=''));
#
#local default_name = if std.isString(service_ns) then service_ns + "_" + service_stack else service_stack;
#
## User options with defaults
#local network_name = std.get(user_data, 'network_name', default='default');
#local service_name = std.get(user_data, 'service', default='app');
#local services_names = std.get(user_data, 'services', default=[service_name]);

View File

@ -0,0 +1,31 @@
# Tag to add a restart policy on all containers
#
# Examples:
# tags:
# - docker-services-restart:
# policy: always
# services:
# - srv1
# - mysqldb
# Default imports
local user_data = std.parseJson(std.extVar('user_data'));
local docker_data = std.parseJson(std.extVar('docker_data'));
# Internal vars
local docker_services = std.get(docker_data, 'services', default={});
local docker_services_names = std.objectFields(docker_services);
# User options with defaults
local services_names = std.get(user_data, 'services', default=docker_services_names);
local policy = std.get(user_data, 'policy', default='unless-stopped');
# Process
docker_data +
{
services+: {
[svc_name]+: { restart: policy } for svc_name in services_names
},
}

View File

@ -0,0 +1,46 @@
# Tag to add a restart policy on all containers
#
# Examples:
# tags:
# - docker-svc-tz:
# policy: always
# services:
# - srv1
# - mysqldb
# Default imports
local user_data = std.parseJson(std.extVar('user_data'));
local docker_data = std.parseJson(std.extVar('docker_data'));
# Init defaults
local default_svcs = std.get(user_data, 'PAASIFY_STACK_SVCS');
#local default_tz = 'UTC';
#local default_tz = 'Europe/Paris';
local default_tz = 'America/Toronto';
local default_mount = false;
local default_mounts = '/etc/timezone:/etc/timezone:ro,/etc/localtime:/etc/localtime:ro';
# Build default config
local config_default = {
APP_SERVICES: default_svcs,
APP_TZ: default_tz,
APP_TZ_MOUNT: default_mount,
APP_TZ_MOUNTS: default_mounts,
};
local conf = config_default + user_data;
local services_names = std.split(conf.APP_SERVICES, ',') ;
# Process
docker_data +
{
services+: {
[svc_name]+: {
environment+: {
TZ: conf.APP_TZ
}
} for svc_name in services_names
},
}

View File

@ -0,0 +1,49 @@
# Tag to set UID and GID to container
#
# Examples:
# tags:
# - docker-svc-tz:
# policy: always
# services:
# - srv1
# - mysqldb
# Default imports
local user_data = std.parseJson(std.extVar('user_data'));
local docker_data = std.parseJson(std.extVar('docker_data'));
# Init defaults
local default_svcs = std.get(user_data, 'PAASIFY_STACK_SVCS');
# Build default config
local config_default = {
APP_SERVICES: default_svcs,
APP_PUID: 1000,
APP_PGID: 1000,
APP_PUID_VAR: 'APP_PUID',
APP_PGID_VAR: 'APP_PGID',
};
local conf = config_default + user_data;
local services_names = std.split(conf.APP_SERVICES, ',') ;
# Internal functions
local ServiceUGI(var, val) =
if std.isString(val) || std.isNumber(val) then
{
[var]: std.toString(val),
} else {};
# Process
docker_data +
{
services+: {
[svc_name]+: {
environment+:
ServiceUGI(conf.APP_PUID_VAR, conf.APP_PUID) +
ServiceUGI(conf.APP_PGID_VAR, conf.APP_PGID),
} for svc_name in services_names
},
}

View File

@ -0,0 +1,20 @@
# Dump meta-data in docker files
#
# Examples:
# tags:
# - paasify-dump
# Default imports
local docker_data = std.parseJson(std.extVar('docker_data'));
local user_data = std.parseJson(std.extVar('user_data'));
# Process
docker_data +
{
["x-paasify"]+: {
"user_data": user_data,
# "docker_data": docker_data,
}
}

View File

@ -0,0 +1,102 @@
# Tag to add mysql sidecar
#
# Examples:
# tags:
# - docker-services-restart:
# policy: always
# services:
# - srv1
# - mysqldb
# Default imports
local stack_data = std.parseJson(std.extVar('stack_data'));
local docker_data = std.parseJson(std.extVar('docker_data'));
local user_data = std.parseJson(std.extVar('user_data'));
## Internal vars
local docker_service = std.get(docker_data, 'service', default={});
local docker_services = std.get(docker_data, 'services', default={docker_service: null });
local docker_services_names = std.objectFields(docker_services);
local services_names = std.get(user_data, 'services', default=docker_services_names);
#
#
## System options
#local service_ns = std.get(stack_data, 'namespace', default='');
#local service_stack = std.get(stack_data, 'current_stack', default='');
# User options with defaults
#local service_default_net = service_ns + "_traefik";
#local service_network = std.get(user_data, 'network', default=service_default_net );
#local service_top_domain = std.get(user_data, 'top_domain', default='dev.box');
local service_name = std.get(user_data, 'name', default='mysql');
local service_image = std.get(user_data, 'image', default='mariadb:10');
# MySQL settings
local service_root_password = std.get(user_data, 'root_password', default='');
local service_root_password_random = std.get(user_data, 'root_password_random', default=false);
local service_user_password = std.get(user_data, 'user_password', default='');
local service_user_name = std.get(user_data, 'user_name', default=std.get(stack_data, 'current_stack', default='db'));
local service_user_db = std.get(user_data, 'user_db', default=service_user_name);
#local service_port = std.get(user_data, 'port', default='80');
#local service_entrypoints = std.get(user_data, 'entrypoints', default='front-http');
#
#local service_app = std.get(user_data, 'name', default=service_name);
#local service_domain = std.get(user_data, 'domain', default=service_app + '.' + service_top_domain);
#
#local service_tls = std.get(user_data, 'tls', default=false);
#local service_certresolver = std.get(user_data, 'certresolver', default=null);
#local service_auth = std.get(user_data, 'auth', default=null);
# This would eventually also contain stack name to avoid collisions
#local service_id = service_ns + "_" + service_name;
#local service_id = service_ns + "_" + service_stack + "_" + service_name;
# Process
docker_data
+ {
# Append mysql network to the list of networks
networks+: {
mysql: null
},
# Append mysql netwok to all requested services
services+: {
[svc_name]+: { networks+: { mysql: null } } for svc_name in services_names
},
}
+ {
# Append mysql sidecar
services+: {
[service_name]+: {
environment: {
MYSQL_RANDOM_ROOT_PASSWORD: service_root_password_random,
MYSQL_ROOT_PASSWORD: service_root_password,
MYSQL_PASSWORD: service_user_password,
MYSQL_USER: service_user_name,
MYSQL_DATABASE: service_user_db,
},
image: service_image,
networks: {
mysql: null,
},
volumes: [],
},
},
// zzz: {
// a1: stack_data,
// a2: user_data,
// },
}

View File

@ -0,0 +1,154 @@
# 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,
#},
}

View File

@ -0,0 +1,34 @@
# TRAEFIK_NET_IDENT: 'default',
# TRAEFIK_NET_NAME: default_ns + '_' + default_name,
# TRAEFIK_NET_EXTERNAL: true,
#
# TRAEFIK_SVC_IDENT: default_service,
# TRAEFIK_SVC_NAME: default_ns + '_' + default_name + '_' + default_service,
# 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),
#
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"description": "Main paasify project settings",
"properties": {
"TRAEFIK_NET_IDENT": {
"title": "Network name",
"description": "Network name in docker compose"
}
},
"required": [
""
],
"title": "Traefik auto-proxy",
"type": "object"
}