118 lines
4.3 KiB
Nix
118 lines
4.3 KiB
Nix
{
|
||
description = "Tinyquiz – an open source online quiz platform";
|
||
|
||
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||
|
||
outputs = { self, nixpkgs }:
|
||
let
|
||
pkgs = nixpkgs.legacyPackages.x86_64-linux;
|
||
buildCmd = name:
|
||
(pkgs.buildGoPackage {
|
||
pname = "tinyquiz-${name}";
|
||
version = "dev";
|
||
src = ./.;
|
||
goDeps = ./deps.nix;
|
||
preBuild = "go generate vkane.cz/tinyquiz/...";
|
||
checkPhase = "go test -race vkane.cz/tinyquiz/...";
|
||
doCheck = true;
|
||
goPackagePath = "vkane.cz/tinyquiz";
|
||
subPackages = [ "cmd/${name}" ];
|
||
});
|
||
in
|
||
{
|
||
defaultPackage.x86_64-linux = self.packages.x86_64-linux.tinyquiz-web;
|
||
packages.x86_64-linux.tinyquiz-web = buildCmd "web";
|
||
packages.x86_64-linux.dev = pkgs.writeShellScriptBin "dev" ''
|
||
echo "This dev script must be run from the project root, otherwise unexpected behavior might occur."
|
||
read -p "Are you in the right directory and shall I continue? (y/n): " ack
|
||
|
||
if [ "$ack" != y ]; then exit 1; fi
|
||
|
||
unset GOROOT # Use the one bundled into the binary. I don't currently know who sets this to the wrong one
|
||
|
||
'${pkgs.findutils}/bin/find' cmd pkg ui | '${pkgs.entr}/bin/entr' -dr '${pkgs.go}/bin/go' run ./cmd/web
|
||
'';
|
||
packages.x86_64-linux.devDb = pkgs.writeShellScriptBin "devDb" ''
|
||
'${pkgs.postgresql}/bin/postgres' -D .pg-data -k "$PWD/.pg-sockets" -c log_statement=all #-c listen_addresses="" # Goland does not support connecting over socket
|
||
'';
|
||
nixosModules.web = { config, lib, pkgs, ... }:
|
||
let
|
||
cfg = config.services.tinyquiz;
|
||
in
|
||
{
|
||
options = {
|
||
services.tinyquiz = {
|
||
enable = lib.mkEnableOption "tinyquiz";
|
||
|
||
postgresql.enable = lib.mkOption {
|
||
type = lib.types.bool;
|
||
default = true;
|
||
description = ''
|
||
Whether the set up the postgresql database for tinyquiz automatically.
|
||
'';
|
||
};
|
||
config = lib.mkOption {
|
||
type = lib.types.attrsOf lib.types.str;
|
||
};
|
||
};
|
||
};
|
||
config = lib.mkIf cfg.enable {
|
||
users.groups.tinyquiz = {};
|
||
users.users.tinyquiz = {
|
||
description = "Tinyquiz service user";
|
||
group = "tinyquiz";
|
||
isSystemUser = true;
|
||
};
|
||
systemd.services.tinyquiz = {
|
||
description = "Tinyquiz service";
|
||
wantedBy = [ "multi-user.target" ];
|
||
after = [ "network.target" (lib.mkIf cfg.postgresql.enable "postgresql.service") ];
|
||
|
||
serviceConfig = {
|
||
ExecStart = "${self.packages.x86_64-linux.tinyquiz-web}/bin/web";
|
||
User = "tinyquiz";
|
||
};
|
||
environment = cfg.config;
|
||
};
|
||
services.tinyquiz.config = if cfg.postgresql.enable then {
|
||
TINYQUIZ_PG_HOST = "/run/postgresql";
|
||
} else {};
|
||
services.postgresql = lib.mkIf cfg.postgresql.enable {
|
||
enable = true;
|
||
ensureDatabases = [ "tinyquiz" ];
|
||
ensureUsers = [
|
||
{
|
||
name = "tinyquiz";
|
||
ensurePermissions = {
|
||
"DATABASE \"tinyquiz\"" = "ALL PRIVILEGES";
|
||
};
|
||
}
|
||
];
|
||
};
|
||
};
|
||
};
|
||
checks.x86_64-linux.module = (import "${nixpkgs}/nixos/tests/make-test-python.nix" ({ pkgs, ... }: {
|
||
system = "x86_64-linux";
|
||
machine = { config, pkgs, ... }:
|
||
{
|
||
require = [
|
||
self.nixosModules.web
|
||
];
|
||
services.tinyquiz = {
|
||
enable = true;
|
||
config = {
|
||
TINYQUIZ_LISTEN = ":8080";
|
||
};
|
||
};
|
||
systemd.services.postgresql.serviceConfig.TimeoutSec = pkgs.lib.mkForce "3600"; # wait for postgresql even on very slow machines. Not using "infinity" is just a safeguard
|
||
};
|
||
testScript = ''
|
||
machine.start()
|
||
machine.wait_for_unit("default.target")
|
||
machine.wait_for_open_port(8080)
|
||
machine.succeed("curl --fail http://localhost:8080")
|
||
'';
|
||
})) { system = "x86_64-linux"; inherit pkgs; };
|
||
};
|
||
}
|