From 8047d24a176563f5b314ffba3aa12b8a5b5f7842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marijan=20Petri=C4=8Devi=C4=87?= Date: Wed, 18 Sep 2024 21:31:59 +0200 Subject: [PATCH] nix: add migrations passthru and run-migrations scipt --- flake.nix | 23 ++++++++++++++++++++++- nixos/modules/server.nix | 15 +++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index 776e0bb..3ce33c9 100644 --- a/flake.nix +++ b/flake.nix @@ -94,6 +94,7 @@ runtimeInputs = [ pkgs.tinyproxy pkgs.simple-http-server + self'.packages.run-migrations ]; text = let @@ -109,9 +110,12 @@ }; in '' + database_file=$(mktemp database.XXXX) + run-migrations server/migrations "$database_file" + simple-http-server --index --port 8001 frontend & PID_FRONTEND=$! - cargo run -- --listen-address 0.0.0.0:8002 & + cargo run -- --listen-address 0.0.0.0:8002 --database-url "sqlite://$database_file" & PID_BACKEND=$! tinyproxy -d -c ${proxyConfig} & PID_PROXY=$! @@ -125,9 +129,22 @@ trap cleanup SIGINT wait $PID_FRONTEND $PID_BACKEND $PID_PROXY + rm -rf "$database_file" ''; }; + run-migrations = pkgs.writeShellApplication { + name = "run-migrations"; + runtimeInputs = [ pkgs.sqlite ]; + text = '' + >&2 echo "Applying migrations" + for migration_file in "$1"/*.sql; do + >&2 echo "Applying migration: $migration_file" + sqlite3 "$2" < "$migration_file" + done + ''; + }; + server-deps = craneLib.buildDepsOnly commonAttrs; server-docs = craneLib.cargoDoc ( @@ -142,6 +159,10 @@ // { cargoArtifacts = self'.packages.server-deps; meta.mainProgram = "server"; + passthru = { + migrations = ./server/migrations; + inherit (self'.packages) run-migrations; + }; } ); diff --git a/nixos/modules/server.nix b/nixos/modules/server.nix index 00034d5..75b01b7 100644 --- a/nixos/modules/server.nix +++ b/nixos/modules/server.nix @@ -9,6 +9,8 @@ let optionals ; cfg = config.services.server; + stateDirectory = "/var/lib/server"; + databasePath = "/var/lib/server/database.db"; in { options.services.server = { @@ -37,6 +39,15 @@ in ''; }; + database_url = mkOption { + type = types.str; + default = "sqlite://${databasePath}"; + example = "sqlite://${databasePath}"; + description = '' + SQlite database to connect to. + ''; + }; + metrics = { enable = lib.mkEnableOption "Prometheus metrics server"; @@ -75,6 +86,8 @@ in [ "--listen-address" "${cfg.address}:${toString cfg.port}" + "--database-url" + "sqlite://${databasePath}" ] ++ optionals cfg.metrics.enable [ "--metrics-listen-address" @@ -92,9 +105,11 @@ in RUST_LOG = cfg.logLevel; }; serviceConfig = { + ExecStartPre = "${lib.getExe cfg.package.passthru.run-migrations} ${cfg.package.passthru.migrations} ${databasePath}"; ExecStart = "${lib.getExe cfg.package} ${args}"; Restart = "always"; DynamicUser = true; + StateDirectory = baseNameOf stateDirectory; }; }; };