docker-healthchecks/flake.nix

237 lines
7.4 KiB
Nix
Raw Normal View History

2023-04-15 19:01:10 -05:00
{
description = "Healthchecks";
inputs = {
nixpkgs = {
2023-04-15 22:30:12 -05:00
url = "nixpkgs/nixos-unstable";
2023-04-15 19:01:10 -05:00
};
};
outputs = { self, nixpkgs }@inputs:
let
system = "x86_64-linux";
pkgs = import nixpkgs {
inherit system;
overlays = [
(
self: super: {
# sonarr = super.sonarr.overrideAttrs (
# old:
# let
# version = "3.0.10.1567";
# sha256 = "sha256-6zdp/Bg+9pcrElW5neB+BC16Vn1VhTjhMRRIxGrKhxc=";
# in
# {
# inherit version;
# src = pkgs.fetchurl {
# url = "https://download.sonarr.tv/v3/main/${version}/Sonarr.main.${version}.linux.tar.gz";
# sha256 = sha256;
# };
# }
# );
}
)
];
};
2023-04-15 22:30:12 -05:00
py = pkgs.python3.override {
packageOverrides = final: prev: {
django = prev.django_4;
};
};
baseImage = {
tag = "latest";
maxLayers = 2;
contents = [
pkgs.bash
pkgs.coreutils-full
];
config = {
User = "5000:5000";
Volumes = {
"/static" = { };
"/tmp" = { };
};
WorkingDir = "${self.packages.${system}.healthchecks}/opt/healthchecks";
Env = [
"LANG=en_US.UTF-8"
"PYTHONPATH=${self.packages.${system}.healthchecks.pythonPath}"
"PYTHONUNBUFFERED=1"
"SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"
"STATIC_ROOT=/static"
];
};
};
2023-04-15 19:01:10 -05:00
in
{
2023-04-15 22:30:12 -05:00
packages.${system} = {
healthchecks =
let
pname = "healthchecks";
version = "2.8.1";
hash = "sha256-lJ0AZJpznet2YKPIyMOx5ZdETZB8de5vp7sydfndxZg=";
localSettings = pkgs.writeText "local_settings.py" ''
import os
STATIC_ROOT = os.getenv("STATIC_ROOT")
SECRET_KEY_FILE = os.getenv("SECRET_KEY_FILE")
if SECRET_KEY_FILE:
with open(SECRET_KEY_FILE, "r") as file:
SECRET_KEY = file.readline()
'';
propagatedBuildInputs = with py.pkgs; [
apprise
cron-descriptor
cronsim
django
django-compressor
fido2
minio
psycopg2
pycurl
pyotp
segno
statsd
whitenoise
2023-04-15 19:01:10 -05:00
];
2023-04-15 22:30:12 -05:00
in
py.pkgs.buildPythonApplication {
inherit pname version propagatedBuildInputs;
format = "other";
src = pkgs.fetchFromGitHub {
owner = "healthchecks";
repo = pname;
rev = "v${version}";
inherit hash;
2023-04-15 19:01:10 -05:00
};
2023-04-15 22:30:12 -05:00
installPhase = ''
mkdir -p $out/opt/healthchecks
cp -r . $out/opt/healthchecks
chmod +x $out/opt/healthchecks/manage.py
cp ${localSettings} $out/opt/healthchecks/hc/local_settings.py
'';
passthru = {
# PYTHONPATH of all dependencies used by the package
pythonPath = py.pkgs.makePythonPath propagatedBuildInputs;
tests = {
inherit (pkgs.nixosTests) healthchecks;
};
};
meta = with pkgs.lib; {
homepage = "https://github.com/healthchecks/healthchecks";
description = "A cron monitoring tool written in Python & Django ";
license = licenses.bsd3;
2023-04-15 19:01:10 -05:00
};
};
2023-04-15 22:30:12 -05:00
smtpd = pkgs.dockerTools.buildLayeredImage
(
pkgs.lib.attrsets.recursiveUpdate baseImage {
name = "healthchecks-smtpd";
config = {
Cmd = [
"${self.packages.${system}.healthchecks}/opt/healthchecks/manage.py"
"smtpd"
"--port"
"2525"
];
ExposedPorts = {
"2525/tcp" = { };
};
};
}
);
sendalerts = pkgs.dockerTools.buildLayeredImage
(
pkgs.lib.attrsets.recursiveUpdate baseImage {
name = "healthchecks-sendalerts";
config = {
Cmd = [
"${self.packages.${system}.healthchecks}/opt/healthchecks/manage.py"
"sendalerts"
];
ExposedPorts = { };
};
}
);
maintenance =
let
script = pkgs.writeScript "maintenance" ''
CURL_OPTIONS="--fail --silent --show-error --max-time 10 --retry 5 --output /dev/null"
${pkgs.curl}/bin/curl $CURL_OPTIONS http://webserver.healthchecks.svc/ping/$MAINTENANCE_CHECK_UUID/start
${self.packages.${system}.healthchecks}/opt/healthchecks/manage.py prunenotifications
${self.packages.${system}.healthchecks}/opt/healthchecks/manage.py pruneusers
${self.packages.${system}.healthchecks}/opt/healthchecks/manage.py prunetokenbucket
${self.packages.${system}.healthchecks}/opt/healthchecks/manage.py pruneflips
${pkgs.curl}/bin/curl $CURL_OPTIONS http://webserver.healthchecks.svc/ping/$MAINTENANCE_CHECK_UUID
'';
in
pkgs.dockerTools.buildLayeredImage
(
pkgs.lib.attrsets.recursiveUpdate baseImage {
name = "healthchecks-maintenance";
config = {
Cmd = [
"${script}"
];
ExposedPorts = { };
};
}
);
webserver =
let
uwsgi-ini = pkgs.writeTextFile {
name = "uwsgi.ini";
text = ''
[uwsgi]
master
die-on-term
http-socket = :8000
harakiri = 10
post-buffering = 4096
processes = 4
enable-threads
threads = 1
chdir = ${self.packages.${system}.healthchecks}/opt/healthchecks
module = hc.wsgi:application
thunder-lock
disable-write-exception
static-map = /static=${self.packages.${system}.healthchecks}/opt/healthchecks/static-collected
buffer-size = 32768
'';
};
in
pkgs.dockerTools.buildLayeredImage (
pkgs.lib.attrsets.recursiveUpdate baseImage {
name = "healthchecks-webserver";
fakeRootCommands = '';
mkdir /static
chmod 0777 /static
mkdir /tmp
chmod 0777 /tmp
'';
config = {
Cmd = [
"${pkgs.python3Packages.gunicorn}/bin/gunicorn"
"hc.wsgi"
"--bind"
":8000"
"--pythonpath"
self.packages.${system}.healthchecks.pythonPath
];
ExposedPorts = {
"8000/tcp" = { };
};
};
}
);
};
2023-04-15 19:01:10 -05:00
};
}