feat: use env-file templating instead of composefile

use the same composefile as in the repo, passing configuration options
by using a templated env file instead of templating a custom composefile.
This commit is contained in:
Valerio Lomanto 2024-12-17 13:49:34 +01:00 committed by Valerio Lomanto
parent ba566ebe89
commit 31f5475e1c
Signed by: verglasz
GPG key ID: 33263D8CFCFEC285
6 changed files with 118 additions and 64 deletions

View file

@ -36,6 +36,7 @@
proxy: 'https://test-sso-proxy1.cert.sunet.se/idp'
entityID: 'https://test-sso-proxy.cert.sunet.se/idp'
soc::vuln_dashboard:
docker_network: 'sso'
test-sso-proxy1.cert.sunet.se:
sunet::dockerhost2:

View file

@ -1,5 +1,6 @@
class soc::vuln_dashboard(
String $allowed_hosts = $facts['networking']['fqdn'],
String $docker_network = 'default',
String $docker_tag = 'latest',
String $db_datadir = '/opt/vuln-dashboard/dbdata',
String $pocs_storage_dir = '/opt/vuln-dashboard/pocsdata',
@ -24,13 +25,26 @@ file {
$pocs_storage_dir:
ensure => directory,
;
'/opt/vuln-dashboard/docker-compose.yml':
ensure => file,
mode => '0600',
;
'/opt/vuln-dashboard/docker.env':
ensure => file,
mode => '0600',
content => template('soc/vuln-dashboard/docker.env.erb'),
;
}
sunet::docker_compose { 'vuln-dashboard':
service_name => 'vuln-dashboard',
utils::docker_compose_service_env { 'vuln-dashboard':
compose_file => '/opt/vuln-dashboard/docker-compose.yml',
description => 'SOC vuln dashboard',
compose_dir => '/opt/vuln-dashboard',
content => template('soc/vuln-dashboard/docker-compose.yml.erb'),
}
envfile => '/opt/vuln-dashboard/docker.env',
docker_svc_names => 'dev postgres',
service_name => 'vuln-dashboard',
}
}

View file

@ -1,59 +0,0 @@
---
services:
# copy that's run locally in docker,
# app files are mounted for quick-reload and fast iterations
dev:
container_name: <%= @sso_service_name %>
depends_on:
- postgres
image: dashboard-dev:<%= @docker_tag %>
pull_policy: never
environment:
DB_NAME: <%= @db_name %>
DB_USER: <%= @db_user %>
DB_PW: <%= @db_pass %>
DB_HOST: <%= @db_host %>
DB_PORT: <%= @db_port %>
CENSYS_API_ID: <%= @censys_api_id %>
CENSYS_API_SECRET: <%= @censys_api_secret %>
DJANGO_ALLOWED_HOSTS: <%= @allowed_hosts %>
ports:
- "127.0.0.1:8000:8000"
init: true
volumes:
- pocs-data:/app/stored_pocs
networks:
- default
- sso
postgres:
container_name: postgres
image: postgres:latest
environment:
POSTGRES_DB: <%= @db_name %>
POSTGRES_USER: <%= @db_user %>
POSTGRES_PASSWORD: <%= @db_pass %>
volumes:
- postgres-data:/var/lib/postgresql/data # Maps local folder to the container's data folder
restart: always # Ensures that the container restarts if it crashes or is stopped
networks:
- default
volumes:
postgres-data:
driver: local
driver_opts:
device: <%= @db_datadir %>
o: bind
type: none
pocs-data:
driver: local
driver_opts:
device: <%= @pocs_storage_dir %>
o: bind
type: none
networks:
sso:
external: true

View file

@ -0,0 +1,11 @@
DB_NAME='<%= @db_name %>'
DB_USER='<%= @db_user %>'
DB_PW='<%= @db_pass %>'
DB_PORT='<%= @db_port %>'
DB_HOST='<%= @db_host %>'
DB_DATA_DIR='<%= @db_datadir %>'
POCS_STORAGE_DIR='<%= @pocs_storage_dir %>'
DJANGO_ALLOWED_HOSTS='<%= @allowed_hosts %>'
CENSYS_API_ID='<%= @censys_api_id %>'
CENSYS_API_SECRET='<%= @censys_api_secret %>'
DOCKER_PROXY_NETWORK='<%= @docker_network %>'

View file

@ -0,0 +1,37 @@
# Manage a service using docker-compose with an env file
define utils::docker_compose_service_env(
String $compose_file,
String $description,
String $envfile = '/dev/null',
String $docker_svc_names = '', # empty should bring up everything in compose file
Optional[String] $service_name = undef,
Boolean $pull_on_start = false,
Array[String] $service_extras = [],
Optional[String] $service_alias = undef,
Optional[String] $start_command = undef,
) {
include sunet::systemd_reload
$_service_name = $service_name ? {
undef => $name,
default => $service_name,
}
$_template = 'utils/dockerhost_env/compose2.service.erb'
file {
"/etc/systemd/system/${_service_name}.service":
content => template($_template),
notify => [Class['sunet::systemd_reload'],
],
;
}
service { $_service_name :
ensure => 'running',
enable => true,
require => File["/etc/systemd/system/${_service_name}.service"],
provider => 'systemd', # puppet is really bad at figuring this out
}
}

View file

@ -0,0 +1,50 @@
# This service file is generated by Puppet. Do not edit.
#
# This information is used by check_docker_containers to monitor the started containers:
# COMPOSE_FILE=<%= @compose_file %>
#
[Unit]
Description=<%= @description %>
After=docker.service
BindsTo=docker.service
Conflicts=shutdown.target reboot.target halt.target
[Service]
TimeoutStartSec=0
TimeoutStopSec=30
Restart=always
RestartSec=10
SyslogIdentifier=<%= @_service_name %>
WorkingDirectory=/
# To make docker pull work with basic-auth credentials
Environment="HOME=/root"
#ExecStartPre=-/usr/bin/docker compose -f <%= @compose_file %> rm -f --stop
<% if @pull_on_start != true -%>#<% end -%>ExecStartPre=-/usr/bin/docker compose -f <%= @compose_file %> pull
<% if @start_command -%>
ExecStart=<%= @start_command %>
<% else %>
ExecStart=/usr/bin/docker compose -f <%= @compose_file %> --env-file <%= @envfile %> up --force-recreate --no-deps <%= @docker_svc_names %>
<% end -%>
ExecStop=/usr/bin/docker compose -f <%= @compose_file %> --env-file <%= @envfile %> down <%= @docker_svc_names %>
NotifyAccess=all
<% if @service_extras.is_a? Array -%>
# service_extras :
<% @service_extras.each do |this| -%>
<%= this %>
<% end -%>
<% end -%>
[Install]
WantedBy=multi-user.target
<% if @service_alias -%>
Alias=<%= @service_alias %>.service
<% end -%>