aboutsummaryrefslogtreecommitdiff
path: root/flake.nix
diff options
context:
space:
mode:
Diffstat (limited to 'flake.nix')
-rw-r--r--flake.nix154
1 files changed, 118 insertions, 36 deletions
diff --git a/flake.nix b/flake.nix
index 6fa6db4..b1943d9 100644
--- a/flake.nix
+++ b/flake.nix
@@ -26,7 +26,8 @@
flake-utils,
...
} @ inputs: let
- buildToolchain = pkgs: pkgs.rust-bin.nightly."2022-11-20".minimal;
+ mkBuildToolchain = pkgs: pkgs.rust-bin.nightly."2022-11-20".minimal;
+
deps = pkgs: with pkgs; [
openssl
pkgconfig
@@ -35,7 +36,7 @@
];
mkPkg = pkgs: let
- buildToolchain = buildToolchain pkgs;
+ buildToolchain = mkBuildToolchain pkgs;
naersk = pkgs.callPackage inputs.naersk {
cargo = buildToolchain;
@@ -48,7 +49,24 @@
pname = "thulani";
version = self.rev or "dirty";
- src = lib.cleanSource ./.;
+ src = lib.cleanSourceWith {
+ src = lib.cleanSource ./.;
+
+ filter = path: ty: with builtins; with lib; let
+ baseName = baseNameOf "${path}";
+ extMatch = match "((.*\\.?)*\\.)?(.*)" baseName;
+ extension = elemAt extMatch 2;
+ parent = baseNameOf (dirOf "${path}");
+ isCargoFile = baseName == "Cargo.toml" || baseName == "Cargo.lock";
+ isCargoConfig = parent == ".cargo" && baseName == "config.toml";
+ in
+ ty == "directory" ||
+ isCargoFile ||
+ isCargoConfig ||
+ extension == "rs" ||
+ extension == "sql" ||
+ extension == "pest";
+ };
nativeBuildInputs = deps pkgs;
remapPathPrefix = true;
@@ -64,7 +82,7 @@
];
};
- devToolchain = (buildToolchain pkgs).override {
+ devToolchain = (mkBuildToolchain pkgs).override {
extensions = [
"rust-src"
"rust-analyzer"
@@ -93,9 +111,58 @@
}) // {
overlays.default = final: prev: let
- withRust = (import inputs.rust-overlay) final prev;
- in {
- thulani = mkPkg withRust;
+ withRust = ((import inputs.rust-overlay) final prev);
+ in withRust // {
+ thulani = mkPkg (final // withRust);
+ };
+
+ nixosConfigurations.test = nixpkgs.lib.nixosSystem {
+ system = "x86_64-linux";
+
+ modules = [
+ self.nixosModules.default
+ "${nixpkgs}/nixos/modules/virtualisation/qemu-vm.nix"
+
+ ({ lib, ... }: {
+ nixpkgs.overlays = [
+ self.overlays.default
+ ];
+
+ users = {
+ mutableUsers = false;
+
+ users.root.hashedPassword = lib.mkForce "";
+
+ users.test = {
+ password = lib.mkForce "test";
+ group = "test";
+ isNormalUser = true;
+ extraGroups = [
+ "wheel"
+ "sudo"
+ ];
+ };
+
+ groups.test = {};
+ };
+
+ virtualisation = {
+ cores = 8;
+ graphics = false;
+ diskSize = 32*1024;
+ memorySize = 12*1024;
+ writableStoreUseTmpfs = false;
+ };
+
+ services.thulani = {
+ enable = true;
+
+ postgres = {
+ enable = true;
+ };
+ };
+ })
+ ];
};
nixosModules.default = { pkgs, lib, config, ... }: let
@@ -113,7 +180,18 @@
environment = mkOption {
description = "literal environment to include";
type = attrsOf str;
- default = {};
+
+ default = {
+ RUST_BACKTRACE = "1";
+ MAX_HIST = "30";
+ DEFAULT_HIST = "5";
+ MAX_SHEET_COLUMN = "ZZZ";
+ STEAM_API_KEY = "";
+ SPREADSHEET_ID = "";
+ SHEETS_API_KEY = "";
+ } // (optionalAttrs cfg.postgres.enable {
+ DATABASE_URL = "postgres://${cfg.user}@/${cfg.postgres.db}";
+ });
};
envFiles = mkOption {
@@ -137,13 +215,15 @@
postgres = mkOption {
description = "local postgres server with automatic setup";
- type = sumodule {
- enable = mkEnableOption "postgres";
+ type = submodule {
+ options = {
+ enable = mkEnableOption "postgres";
- db = mkOption {
- description = "db name";
- type = str;
- default = "memes";
+ db = mkOption {
+ description = "db name";
+ type = str;
+ default = "memes";
+ };
};
};
};
@@ -159,30 +239,11 @@
bindsTo = [
"network-online.target"
- ];
+ ] ++ lib.optional cfg.postgres.enable "postgresql.service";
after = [
"network-online.target"
- ];
-
- preStart = lib.mkIf (cfg.postgres.enable) (let
- invokePsql = "${pkgs.sudo}/bin/sudo -u ${config.services.postgresql.superUser} -- ${config.services.postgresql.package}/bin/psql";
-
- in ''
- ${invokePsql} <<EOF
- DO $$
- BEGIN
- CREATE ROLE ${cfg.user};
- EXCEPTION WHEN duplicate_object THEN RAISE NOTICE '%, skipping', SQLERRM USING ERRCODE = SQLSTATE;
- END
- $$;
-
- SELECT 'CREATE DATABASE ${cfg.postgres.db}'
- WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '${cfg.postgres.db}')\gexec
- EOF
-
- echo 'CREATE EXTENSION IF NOT EXISTS pgcrypto' | ${invokePsql} ${cfg.postgres.db}
- '');
+ ] ++ lib.optional cfg.postgres.enable "postgresql.service";
inherit (cfg) environment;
@@ -194,8 +255,29 @@
serviceConfig = {
Type = "exec";
ExecStart = "${cfg.package}/bin/thulani";
+ ExecStartPre = let
+ invokePsql = "${pkgs.sudo}/bin/sudo -u ${config.services.postgresql.superUser} -- ${config.services.postgresql.package}/bin/psql";
+ preStart = pkgs.writeShellScript "" ''
+ set -euo pipefail
+
+ ${invokePsql} <<'EOF'
+ DO $$
+ BEGIN
+ CREATE ROLE ${cfg.user} WITH LOGIN;
+ EXCEPTION WHEN duplicate_object THEN RAISE NOTICE '%, skipping', SQLERRM USING ERRCODE = SQLSTATE;
+ END
+ $$;
+
+ SELECT 'CREATE DATABASE ${cfg.postgres.db}'
+ WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '${cfg.postgres.db}')\gexec
+ EOF
+
+ echo 'CREATE EXTENSION IF NOT EXISTS pgcrypto' | ${invokePsql} ${cfg.postgres.db}
+ '';
+
+ in "+${preStart}";
- EnvironmentFile = cfg.environmentFiles;
+ EnvironmentFile = cfg.envFiles;
DynamicUser = true;
User = cfg.user;