System Gen172 @ 2026-08-01-12:52:15 by jonas@monolith
This commit is contained in:
@@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
fetchFromGitHub,
|
||||||
|
rustPlatform,
|
||||||
|
openssl,
|
||||||
|
pkg-config,
|
||||||
|
cacert,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
rustPlatform.buildRustPackage (finalAttrs: {
|
||||||
|
pname = "korrosync";
|
||||||
|
version = "0.4.0";
|
||||||
|
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "szaffarano";
|
||||||
|
repo = "korrosync";
|
||||||
|
tag = "v${finalAttrs.version}";
|
||||||
|
hash = "sha256-ubGOQ6JM9wo5428Yf1F1K+nllG9EDQBrBx4yr6PMPG0=";
|
||||||
|
};
|
||||||
|
|
||||||
|
buildInputs = [
|
||||||
|
openssl
|
||||||
|
pkg-config
|
||||||
|
];
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
pkg-config
|
||||||
|
];
|
||||||
|
|
||||||
|
#cargoHash = "sha256-3oMPREUWwKNEeaf8FdWHdjPMLU5xMSMzxKrmrhU+iko=";
|
||||||
|
cargoLock.lockFile = "${finalAttrs.src}/Cargo.lock";
|
||||||
|
|
||||||
|
SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
|
||||||
|
NIX_SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "KOReader Sync Server";
|
||||||
|
license = lib.licenses.mit;
|
||||||
|
homepage = "https://github.com/szaffarano/korrosync";
|
||||||
|
};
|
||||||
|
})
|
||||||
@@ -0,0 +1,162 @@
|
|||||||
|
{self, ...}: {
|
||||||
|
flake.overlays.korrosync = final: prev: {
|
||||||
|
korrosync = final.callPackage ./_derivation.nix {};
|
||||||
|
};
|
||||||
|
flake.nixosModules.korrosync-overlay = {
|
||||||
|
nixpkgs.overlays = [self.overlays.korrosync];
|
||||||
|
};
|
||||||
|
perSystem = {pkgs, ...}: {
|
||||||
|
packages.korrosync = pkgs.callPackage ./_derivation.nix {};
|
||||||
|
};
|
||||||
|
|
||||||
|
flake.nixosModules.korrosync = {
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
cfg = config.services.korrosync;
|
||||||
|
in {
|
||||||
|
options.services.korrosync = {
|
||||||
|
enable = lib.mkEnableOption "Enable KOrrosync service";
|
||||||
|
enable-service = lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
description = "Enable korrosync service";
|
||||||
|
example = true;
|
||||||
|
default = true;
|
||||||
|
};
|
||||||
|
enable-configured-binary = lib.mkEnableOption "Put a korrosync binary into system-packges using the set configuration options.";
|
||||||
|
data-path = lib.mkOption {
|
||||||
|
type = lib.types.path;
|
||||||
|
description = "The path where korrosync saves it's data.";
|
||||||
|
example = "/var/lib/korrosync";
|
||||||
|
default = "/var/lib/korrosync";
|
||||||
|
};
|
||||||
|
user = lib.mkOption {
|
||||||
|
type = lib.types.singleLineStr;
|
||||||
|
description = "The user under with korrosync runs.";
|
||||||
|
example = "korrosync";
|
||||||
|
default = "korrosync";
|
||||||
|
};
|
||||||
|
group = lib.mkOption {
|
||||||
|
type = lib.types.singleLineStr;
|
||||||
|
description = "The group under with korrosync runs.";
|
||||||
|
example = "korrosync";
|
||||||
|
default = "korrosync";
|
||||||
|
};
|
||||||
|
listen-address = lib.mkOption {
|
||||||
|
description = "The listen address of the korrosync server";
|
||||||
|
type = lib.types.singleLineStr;
|
||||||
|
example = "0.0.0.0";
|
||||||
|
default = "127.0.0.1";
|
||||||
|
};
|
||||||
|
listen-port = lib.mkOption {
|
||||||
|
description = "The listen port of the korrosync server";
|
||||||
|
type = lib.types.int;
|
||||||
|
example = 3000;
|
||||||
|
default = 3000;
|
||||||
|
};
|
||||||
|
rate-limit-per-second = lib.mkOption {
|
||||||
|
type = lib.types.int;
|
||||||
|
description = "Rate limit replenishment rate per second";
|
||||||
|
example = 2;
|
||||||
|
default = 2;
|
||||||
|
};
|
||||||
|
rate-limit-burst-size = lib.mkOption {
|
||||||
|
type = lib.types.int;
|
||||||
|
description = "Maximum burst size before rate limiting";
|
||||||
|
example = 5;
|
||||||
|
default = 5;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
imports = [
|
||||||
|
self.nixosModules.korrosync-overlay
|
||||||
|
];
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
# User setup
|
||||||
|
users.users = lib.mkIf (cfg.user == "korrosync") {
|
||||||
|
korrosync = {
|
||||||
|
description = "Korrosync service";
|
||||||
|
useDefaultShell = true;
|
||||||
|
group = cfg.group;
|
||||||
|
isSystemUser = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
users.groups = lib.mkIf (cfg.group == "korrosync") {
|
||||||
|
korrosync = {};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Pre-configured binary
|
||||||
|
environment.systemPackages = lib.mkIf cfg.enable-configured-binary [
|
||||||
|
(let
|
||||||
|
envVars = config.systemd.services.korrosync.environment;
|
||||||
|
in
|
||||||
|
pkgs.writeShellScriptBin "korrosync"
|
||||||
|
''
|
||||||
|
export KORROSYNC_DB_PATH="${envVars.KORROSYNC_DB_PATH}"
|
||||||
|
export KORROSYNC_SERVER_ADDRESS="${envVars.KORROSYNC_SERVER_ADDRESS}"
|
||||||
|
export KORROSYNC_USE_TLS="${envVars.KORROSYNC_USE_TLS}"
|
||||||
|
export KORROSYNC_RATE_LIMIT_PER_SECOND="${envVars.KORROSYNC_RATE_LIMIT_PER_SECOND}"
|
||||||
|
export KORROSYNC_RATE_LIMIT_BURST_SIZE="${envVars.KORROSYNC_RATE_LIMIT_BURST_SIZE}"
|
||||||
|
exec ${pkgs.korrosync}/bin/korrosync "$@"
|
||||||
|
'')
|
||||||
|
];
|
||||||
|
|
||||||
|
# base service
|
||||||
|
systemd.services.korrosync = {
|
||||||
|
enable = cfg.enable-service;
|
||||||
|
description = "Korrosync - KOReader Sync Server";
|
||||||
|
|
||||||
|
after = ["network.target"];
|
||||||
|
wantedBy = ["multi-user.target"];
|
||||||
|
|
||||||
|
environment = {
|
||||||
|
KORROSYNC_DB_PATH = "${cfg.data-path}/db.redb";
|
||||||
|
KORROSYNC_SERVER_ADDRESS = "${cfg.listen-address}:${toString cfg.listen-port}";
|
||||||
|
KORROSYNC_USE_TLS = "false";
|
||||||
|
KORROSYNC_RATE_LIMIT_PER_SECOND = "${toString cfg.rate-limit-per-second}";
|
||||||
|
KORROSYNC_RATE_LIMIT_BURST_SIZE = "${toString cfg.rate-limit-burst-size}";
|
||||||
|
};
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "simple";
|
||||||
|
User = cfg.user;
|
||||||
|
Group = cfg.group;
|
||||||
|
ExecStart = "${pkgs.korrosync}/bin/korrosync serve";
|
||||||
|
Restart = "on-failure";
|
||||||
|
RestartSec = "5s";
|
||||||
|
NoNewPrivileges = true;
|
||||||
|
PrivateTmp = true;
|
||||||
|
ProtectSystem = "strict";
|
||||||
|
ProtectHome = true;
|
||||||
|
ReadWritePaths = cfg.data-path;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Initialize data directory
|
||||||
|
systemd.services.korrosync-init = {
|
||||||
|
description = "Initialize Korrosync databases";
|
||||||
|
|
||||||
|
wantedBy = ["korrosync.service"];
|
||||||
|
before = ["korrosync.service"];
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
|
||||||
|
ExecStart = pkgs.writeShellScript "korrosync-init" ''
|
||||||
|
if [ ! -d ${cfg.data-path} ]; then
|
||||||
|
echo "Creating Korrosync base directory \"${cfg.data-path}\""
|
||||||
|
mkdir ${cfg.data-path}
|
||||||
|
chmod 770 ${cfg.data-path}
|
||||||
|
chown ${cfg.user}:${cfg.group} ${cfg.data-path}
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
|
||||||
|
RemainAfterExit = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
{self, ...}: {
|
||||||
|
flake.nixosModules.korrosync-hive = {
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
cfg = config.hive.korrosync;
|
||||||
|
in {
|
||||||
|
options.hive.korrosync = {
|
||||||
|
enable = lib.mkEnableOption "Enable korrosync server";
|
||||||
|
localPort = lib.mkOption {
|
||||||
|
type = lib.types.int;
|
||||||
|
example = 8080;
|
||||||
|
default = 45988;
|
||||||
|
description = "Specify the local port korrosync server uses.";
|
||||||
|
};
|
||||||
|
instanceFQDN = lib.mkOption {
|
||||||
|
type = lib.types.singleLineStr;
|
||||||
|
example = "calibre.example.com";
|
||||||
|
description = "Fully qualified domain name of the korrosync instance";
|
||||||
|
};
|
||||||
|
blockUserCreation = lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
description = "Disallow /user/create endpoint via nginx";
|
||||||
|
example = true;
|
||||||
|
default = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
imports = [
|
||||||
|
self.nixosModules.korrosync
|
||||||
|
];
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.korrosync = {
|
||||||
|
enable = true;
|
||||||
|
listen-port = cfg.localPort;
|
||||||
|
listen-address = "127.0.0.1";
|
||||||
|
data-path = "/srv/korrosync";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Fallback server with only 403
|
||||||
|
services.nginx.virtualHosts.${config.networking.domain} = lib.mkDefault {
|
||||||
|
default = true;
|
||||||
|
locations."/".return = 403;
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Virtual host for korrosync
|
||||||
|
services.nginx.virtualHosts."${cfg.instanceFQDN}" =
|
||||||
|
{
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
locations."/" = {
|
||||||
|
proxyPass = "http://127.0.0.1:${toString cfg.localPort}";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// (lib.optionalAttrs cfg.blockUserCreation {
|
||||||
|
locations."/users/create".return = 403;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user