cloud/modules/solidtime/default.nix

162 lines
5 KiB
Nix

{
config,
pkgs,
lib,
...
}:
let
backupDir = "/var/backups/solidtime";
domain = "timetracking.${config.momo-cloud.networking.domain}";
in
{
options.momo-cloud.solidtime = with lib; {
enable = mkEnableOption "Enable solidtime instance";
superAdmins = mkOption {
type = types.listOf types.str;
default = [ ];
};
envFile = mkOption { type = types.str; };
dbEnvFile = mkOption { type = types.str; };
};
config =
let
superAdmins = lib.strings.concatStringsSep "," config.momo-cloud.solidtime.superAdmins;
defaultEnvironment = {
SUPER_ADMINS = superAdmins;
APP_URL = "https://timetracking.${config.momo-cloud.networking.domain}";
};
in
lib.mkIf config.momo-cloud.solidtime.enable {
momo-cloud.nginx.enable = true;
momo-cloud.acme.enable = true;
momo-cloud.docker.enable = true;
security.acme.certs = {
"${domain}" = { };
};
services.nginx.virtualHosts = {
"${domain}" = {
forceSSL = true;
useACMEHost = domain;
listenAddresses = [
config.momo-cloud.wireguard.ipv4.address
"[${config.momo-cloud.wireguard.ipv6.address}]"
];
locations."/".proxyPass = "http://127.0.0.1:8000";
};
};
systemd.services."docker-network-solidtime" =
let
docker = config.virtualisation.oci-containers.backend;
dockerBin = "${pkgs.${docker}}/bin/${docker}";
in
{
serviceConfig.Type = "oneshot";
before = [ "docker-solidtime.service" ];
requiredBy = [ "docker-solidtime.service" ];
script = ''
${dockerBin} network inspect solidtime >/dev/null 2>&1 || ${dockerBin} network create solidtime --subnet 172.20.0.0/24
'';
};
virtualisation = {
oci-containers = {
backend = "docker";
containers."solidtime" = {
image = "solidtime/solidtime:latest";
autoStart = true;
volumes = [
"/var/lib/solidtime/storage:/var/www/html/storage"
"${config.momo-cloud.solidtime.envFile}:/var/www/html/.env"
];
extraOptions = [
"--network=solidtime"
"--add-host=mail.momo.koeln:host-gateway"
"--health-cmd"
"curl --fail http://localhost:8000/health-check/up || exit 1"
];
environment = defaultEnvironment // {
CONTAINER_MODE = "http";
AUTO_DB_MIGRATE = "true";
};
ports = [ "127.0.0.1:8000:8000" ];
dependsOn = [ "solidtime-db" ];
};
containers."solidtime-scheduler" = {
image = "solidtime/solidtime:latest";
autoStart = true;
volumes = [
"/var/lib/solidtime/storage:/var/www/html/storage"
"${config.momo-cloud.solidtime.envFile}:/var/www/html/.env"
];
extraOptions = [
"--network=solidtime"
"--add-host=mail.momo.koeln:host-gateway"
"--health-cmd"
"supervisorctl status scheduler:scheduler_00"
];
environment = defaultEnvironment // {
CONTAINER_MODE = "scheduler";
};
dependsOn = [ "solidtime-db" ];
};
containers."solidtime-queue" = {
image = "solidtime/solidtime:latest";
autoStart = true;
volumes = [
"/var/lib/solidtime/storage:/var/www/html/storage"
"${config.momo-cloud.solidtime.envFile}:/var/www/html/.env"
];
extraOptions = [
"--network=solidtime"
"--add-host=mail.momo.koeln:host-gateway"
"--health-cmd"
"supervisorctl status worker:worker_00"
];
environment = defaultEnvironment // {
CONTAINER_MODE = "worker";
WORKER_COMMAND = "php /var/www/html/artisan queue:work";
};
dependsOn = [ "solidtime-db" ];
};
containers."solidtime-db" = {
image = "postgres:16";
autoStart = true;
volumes = [
"/var/lib/solidtime/db:/var/lib/postgresql/data"
];
extraOptions = [ "--network=solidtime" ];
environmentFiles = [
config.momo-cloud.solidtime.dbEnvFile
];
};
};
};
systemd.tmpfiles.rules = [
"d '${backupDir}' 0700 root root - -"
];
momo-cloud.backups.restic.solidtime = {
paths = [
backupDir
"/var/lib/solidtime/storage"
];
initialize = true;
backupPrepareCommand = ''
${pkgs.docker-client}/bin/docker exec -t solidtime-db pg_dumpall -c -U solidtime > "${backupDir}/postgres.sql"
'';
backupCleanupCommand = ''
rm -rf ${backupDir}/*
'';
};
};
}