Add Nix flake with NixOS module
ci/woodpecker/push/woodpecker Pipeline is pending Details

This commit is contained in:
Olivier 'reivilibre' 2022-05-23 22:44:01 +01:00
parent 3f2170263b
commit 7c142e8080
3 changed files with 246 additions and 0 deletions

87
flake.lock Normal file
View File

@ -0,0 +1,87 @@
{
"nodes": {
"naersk": {
"inputs": {
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1652722411,
"narHash": "sha256-FxzNgYiH9c91hUVAntcjrqY//KOTUPP2a4e8Wyuysxg=",
"owner": "nix-community",
"repo": "naersk",
"rev": "94beb7a3edfeb3bcda65fa3f2ebc48ec6b40bf72",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "naersk",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1653117584,
"narHash": "sha256-5uUrHeHBIaySBTrRExcCoW8fBBYVSDjDYDU5A6iOl+k=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "f4dfed73ee886b115a99e5b85fdfbeb683290d83",
"type": "github"
},
"original": {
"id": "nixpkgs",
"type": "indirect"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1653117584,
"narHash": "sha256-5uUrHeHBIaySBTrRExcCoW8fBBYVSDjDYDU5A6iOl+k=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "f4dfed73ee886b115a99e5b85fdfbeb683290d83",
"type": "github"
},
"original": {
"id": "nixpkgs",
"type": "indirect"
}
},
"root": {
"inputs": {
"naersk": "naersk",
"nixpkgs": "nixpkgs_2",
"src": "src",
"utils": "utils"
}
},
"src": {
"flake": false,
"locked": {
"narHash": "sha256-rokT3gG2BKALiOQ5kSaf0FKXzH9dGnR8t3nsAH7YsLc=",
"path": ".",
"type": "path"
},
"original": {
"path": ".",
"type": "path"
}
},
"utils": {
"locked": {
"lastModified": 1652776076,
"narHash": "sha256-gzTw/v1vj4dOVbpBSJX4J0DwUR6LIyXo7/SuuTJp1kM=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "04c1b180862888302ddfb2e3ad9eaa63afc60cf8",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

45
flake.nix Normal file
View File

@ -0,0 +1,45 @@
{
description = "Matrix Monzo bot";
inputs = {
utils.url = "github:numtide/flake-utils";
naersk.url = "github:nix-community/naersk";
src.url = "path:./.";
src.flake = false;
};
outputs = { self, nixpkgs, utils, naersk, src }:
utils.lib.eachDefaultSystem (system: let
pkgs = nixpkgs.legacyPackages."${system}";
naersk-lib = naersk.lib."${system}";
in rec {
# `nix build`
packages.mxmonzo = naersk-lib.buildPackage {
pname = "mxmonzo";
root = src;
buildInputs = with pkgs; [
openssl
pkgconfig
];
};
defaultPackage = packages.mxmonzo;
# NixOS Modules
nixosModules = {
mxmonzo = import ./nixos_modules/mxmonzo.nix self;
};
# `nix run`
apps.mxmonzo = utils.lib.mkApp {
drv = packages.mxmonzo;
};
defaultApp = apps.mxmonzo;
# `nix develop`
devShell = pkgs.mkShell {
nativeBuildInputs = with pkgs; [ rustc cargo ];
};
});
}

114
nixos_modules/mxmonzo.nix Normal file
View File

@ -0,0 +1,114 @@
flake: {config, pkgs, lib, ...}:
let
cfg = config.services.mxmonzo;
inherit (flake.packages.${pkgs.stdenv.hostPlatform.system}) mxmonzo;
in
with lib;
{
options = {
services.mxmonzo = {
enable = mkOption {
default = false;
type = with types; bool;
description = ''
Start the Matrix Monzo bot.
'';
};
user = mkOption {
default = "mxmonzo";
type = with types; uniq str;
description = ''
Name of the user.
'';
};
matrixId = mkOption {
type = with types; str;
example = "@monzobot:librepush.net";
description = ''
Matrix ID of the Monzo bot user.
'';
};
bindAddress = mkOption {
default = "127.0.0.1:38320";
type = with types; str;
description = ''
Host:Port upon which to bind the web interface (used for OAuth + webhooks).
'';
};
externalBaseUri = mkOption {
example = "https://mxmonzo.my.librepush.net";
type = with types; str;
description = ''
External URL prefix to which this MxMonzo instance can be accessed (by webhooks).
It should be proxied to the HTTP interface listening on `bindAddress`.
'';
};
environmentFile = mkOption {
type = with types; path;
description = ''
File containing environment variables, especially:
- MATRIX_PASSWORD
- MONZO_CLIENT_ID
- MONZO_CLIENT_SECRET
'';
};
matrixRoom = mkOption {
type = with types; str;
description = ''
Room ID, like !roomid:librepush.net, of the bot's room to answer commands and emit notifications to.
'';
};
dataPath = mkOption {
type = with types; path;
description = ''
Path to where data can be kept.
'';
};
};
};
config = mkIf cfg.enable {
users.users."${cfg.user}" = {
description = "Matrix Monzo User";
isSystemUser = true;
group = "${cfg.user}";
};
users.groups."${cfg.user}" = {};
systemd.services.mxmonzo = {
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
description = "Start the Matrix Monzo bot.";
environment = {
BIND_ADDRESS = cfg.bindAddress;
MATRIX_ID = cfg.matrixId;
MATRIX_ROOM = cfg.matrixRoom;
MATRIX_STORE = "${cfg.dataPath}/matrix-sdk";
MATRIX_PERSIST = "${cfg.dataPath}/matrix.json";
MONZO_PERSIST = "${cfg.dataPath}/monzo.json";
BASE_URI = cfg.externalBaseUri;
};
serviceConfig = {
Type = "simple";
User = "${cfg.user}";
ExecStart = ''${mxmonzo}/bin/mxmonzo'';
EnvironmentFile = [
cfg.environmentFile
];
};
};
};
}