Self-host your own digital island

Compare changes

Choose any two refs to compare.

+37 -55
flake.lock
···
"nixpkgs": [
"nixpkgs"
],
-
"opam-nix": "opam-nix",
-
"opam-repository": "opam-repository"
+
"opam-nix": "opam-nix"
},
"locked": {
-
"lastModified": 1718122335,
-
"narHash": "sha256-ooeplCUj5dY2KT840ecFtR+iDq1V2iB5rDsFqjbdFSs=",
+
"lastModified": 1738666931,
+
"narHash": "sha256-dTF+etN5ZDPVwK8XV/huQByY6JohiVgpCfzVJWAZY1I=",
"owner": "RyanGibb",
"repo": "eon",
-
"rev": "87b7ec1cd6cb7dc0f950d8d37a91845465780faf",
+
"rev": "42523d1d8f720215ab5108a1b42e9c5b7d17d4bf",
"type": "github"
},
"original": {
···
"flake-compat": {
"flake": false,
"locked": {
-
"lastModified": 1627913399,
-
"narHash": "sha256-hY8g6H2KFL8ownSiFeMOjwPC8P0ueXpCVEbxgda3pko=",
+
"lastModified": 1696426674,
+
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"owner": "edolstra",
"repo": "flake-compat",
-
"rev": "12c64ca55c1014cdc1b16ed5a804aa8576601ff2",
+
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"type": "github"
},
"original": {
···
"systems": "systems"
},
"locked": {
-
"lastModified": 1710146030,
-
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
+
"lastModified": 1731533236,
+
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
-
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
+
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
···
"mirage-opam-overlays": {
"flake": false,
"locked": {
-
"lastModified": 1661959605,
-
"narHash": "sha256-CPTuhYML3F4J58flfp3ZbMNhkRkVFKmBEYBZY5tnQwA=",
+
"lastModified": 1710922379,
+
"narHash": "sha256-j4QREQDUf8oHOX7qg6wAOupgsNQoYlufxoPrgagD+pY=",
"owner": "dune-universe",
"repo": "mirage-opam-overlays",
-
"rev": "05f1c1823d891ce4d8adab91f5db3ac51d86dc0b",
+
"rev": "797cb363df3ff763c43c8fbec5cd44de2878757e",
"type": "github"
},
"original": {
···
"inputs": {
"blobs": "blobs",
"flake-compat": "flake-compat_2",
-
"nixpkgs": "nixpkgs",
+
"nixpkgs": [
+
"nixpkgs"
+
],
"nixpkgs-24_05": "nixpkgs-24_05",
"utils": "utils"
},
···
},
"nixpkgs": {
"locked": {
-
"lastModified": 1709703039,
-
"narHash": "sha256-6hqgQ8OK6gsMu1VtcGKBxKQInRLHtzulDo9Z5jxHEFY=",
-
"owner": "NixOS",
+
"lastModified": 1732981179,
+
"narHash": "sha256-F7thesZPvAMSwjRu0K8uFshTk3ZZSNAsXTIFvXBT+34=",
+
"owner": "nixos",
"repo": "nixpkgs",
-
"rev": "9df3e30ce24fd28c7b3e2de0d986769db5d6225d",
+
"rev": "62c435d93bf046a5396f3016472e8f7c8e2aed65",
"type": "github"
},
"original": {
-
"id": "nixpkgs",
-
"ref": "nixos-unstable",
-
"type": "indirect"
+
"owner": "nixos",
+
"ref": "nixos-24.11",
+
"repo": "nixpkgs",
+
"type": "github"
}
},
"nixpkgs-24_05": {
···
"type": "indirect"
}
},
-
"nixpkgs_2": {
-
"locked": {
-
"lastModified": 1732981179,
-
"narHash": "sha256-F7thesZPvAMSwjRu0K8uFshTk3ZZSNAsXTIFvXBT+34=",
-
"owner": "nixos",
-
"repo": "nixpkgs",
-
"rev": "62c435d93bf046a5396f3016472e8f7c8e2aed65",
-
"type": "github"
-
},
-
"original": {
-
"owner": "nixos",
-
"ref": "nixos-24.11",
-
"repo": "nixpkgs",
-
"type": "github"
-
}
-
},
"opam-nix": {
"inputs": {
"flake-compat": "flake-compat",
···
"nixpkgs"
],
"opam-overlays": "opam-overlays",
-
"opam-repository": [
-
"eon",
-
"opam-repository"
-
],
+
"opam-repository": "opam-repository",
"opam2json": "opam2json"
},
"locked": {
-
"lastModified": 1703105504,
-
"narHash": "sha256-z7X1i2T1H37Lj9hEIJA5T0+sdE5E+PSWiiSyvYGyGSY=",
-
"owner": "RyanGibb",
+
"lastModified": 1732617437,
+
"narHash": "sha256-jj25fziYrES8Ix6HkfSiLzrN6MZjiwlHUxFSIuLRjgE=",
+
"owner": "tweag",
"repo": "opam-nix",
-
"rev": "ccf2e75e8854aefe933c4e504f436a3b315802ee",
+
"rev": "ea8b9cb81fe94e1fc45c6376fcff15f17319c445",
"type": "github"
},
"original": {
-
"owner": "RyanGibb",
-
"ref": "pin-depends-path",
+
"owner": "tweag",
"repo": "opam-nix",
"type": "github"
}
···
"opam-overlays": {
"flake": false,
"locked": {
-
"lastModified": 1654162756,
-
"narHash": "sha256-RV68fUK+O3zTx61iiHIoS0LvIk0E4voMp+0SwRg6G6c=",
+
"lastModified": 1726822209,
+
"narHash": "sha256-bwM18ydNT9fYq91xfn4gmS21q322NYrKwfq0ldG9GYw=",
"owner": "dune-universe",
"repo": "opam-overlays",
-
"rev": "c8f6ef0fc5272f254df4a971a47de7848cc1c8a4",
+
"rev": "f2bec38beca4aea9e481f2fd3ee319c519124649",
"type": "github"
},
"original": {
···
"opam-repository": {
"flake": false,
"locked": {
-
"lastModified": 1712915335,
-
"narHash": "sha256-CLxKnc9GgeNom5LzGhDyq4ZP8Mx8NtwYsg2YQfcSk3U=",
+
"lastModified": 1732612513,
+
"narHash": "sha256-kju4NWEQo4xTxnKeBIsmqnyxIcCg6sNZYJ1FmG/gCDw=",
"owner": "ocaml",
"repo": "opam-repository",
-
"rev": "03178cf5192dd1a55105844365e56a2294cd9225",
+
"rev": "3d52b66b04788999a23f22f0d59c2dfc831c4f32",
"type": "github"
},
"original": {
···
"inputs": {
"eon": "eon",
"nixos-mailserver": "nixos-mailserver",
-
"nixpkgs": "nixpkgs_2"
+
"nixpkgs": "nixpkgs"
}
},
"systems": {
+6 -1
flake.nix
···
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11";
nixos-mailserver.url = "gitlab:RyanGibb/nixos-mailserver/fork-24.05";
eon.url = "github:RyanGibb/eon";
+
eon.inputs.nixpkgs.follows = "nixpkgs";
+
nixos-mailserver.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = { nixpkgs, nixos-mailserver, eon, ... }: {
packages = nixpkgs.lib.genAttrs nixpkgs.lib.systems.flakeExposed (system:
let pkgs = nixpkgs.legacyPackages.${system};
-
in { manpage = import ./man { inherit pkgs system nixos-mailserver; }; });
+
in {
+
manpage = import ./man { inherit pkgs system nixos-mailserver; };
+
packages.mautrix-meta = (pkgs.callPackage ./pkgs/mautrix-meta.nix { });
+
});
nixosModules.default = {
imports = [
+1
modules/default.nix
···
./mailserver.nix
./gitea.nix
./dns.nix
+
./fail2ban.nix
./matrix/synapse.nix
./matrix/mautrix-instagram.nix
./matrix/mautrix-messenger.nix
+42
modules/fail2ban.nix
···
+
{ config, pkgs, lib, ... }:
+
+
with lib;
+
let cfg = config.eilean;
+
in {
+
options.eilean.fail2ban = {
+
enable = mkEnableOption "TURN server";
+
radicale = mkOption {
+
type = types.bool;
+
default = cfg.radicale.enable;
+
};
+
};
+
+
config = mkIf cfg.fail2ban.enable {
+
services.fail2ban = {
+
enable = true;
+
bantime = "24h";
+
bantime-increment = {
+
enable = true;
+
multipliers = "1 2 4 8 16 32 64";
+
maxtime = "168h";
+
overalljails = true;
+
};
+
jails."radicale".settings = mkIf cfg.fail2ban.radicale {
+
port = "5232";
+
filter = "radicale";
+
banaction = "%(banaction_allports)s[name=radicale]";
+
backend = "systemd";
+
journalmatch = "_SYSTEMD_UNIT=radicale.service";
+
maxRetry = 2;
+
bantime = -1;
+
findtime = 14400;
+
};
+
};
+
environment.etc = {
+
"fail2ban/filter.d/radicale.local".text = mkIf cfg.fail2ban.radicale ''
+
[Definition]
+
failregex = ^.*Failed\slogin\sattempt\sfrom\s.*\(forwarded for \'<HOST>\'.*\):\s.*
+
'';
+
};
+
};
+
}
+2 -4
modules/matrix/synapse.nix
···
}];
}];
max_upload_size = "100M";
-
app_service_config_files = (optional cfg.matrix.bridges.whatsapp
-
"/var/lib/mautrix-whatsapp/whatsapp-registration.yaml")
-
++ (optional cfg.matrix.bridges.instagram
-
"/var/lib/mautrix-instagram/instagram-registration.yaml")
+
app_service_config_files = (optional cfg.matrix.bridges.instagram
+
"/var/lib/mautrix-instagram/instagram-registration.yaml")
++ (optional cfg.matrix.bridges.messenger
"/var/lib/mautrix-messenger/messenger-registration.yaml");
}
+1 -1
modules/radicale.nix
···
systemd.services.radicale = {
serviceConfig.ReadWritePaths = [ "/var/lib/radicale" ];
-
preStart = lib.mkIf (cfg.radicale.users != null)''
+
preStart = lib.mkIf (cfg.radicale.users != null) ''
if (! test -d "${passwdDir}"); then
mkdir "${passwdDir}"
chmod 755 "${passwdDir}"
+1 -1
modules/services/dns/eon.nix
···
local record_type=$(echo "$input" | ${pkgs.gawk}/bin/awk '{print $3}')
local ttl=3600
local record_value=$(echo "$input" | ${pkgs.gnused}/bin/sed -E 's/[^"]*"([^"]*)"[^"]*/\1/g')
-
${config.services.eon.package}/bin/capc update /var/lib/eon/caps/domain/''${domain}.cap -u add:''${record_name}.''${domain}:''${record_type}:"''${record_value}":''${ttl} || exit 0
+
${config.services.eon.package}/bin/capc update /var/lib/eon/caps/domain/''${domain}.cap -u "add|''${record_name}.''${domain}|''${record_type}|''${record_value}|''${ttl}" || exit 0
}
shopt -s nullglob
'';
+3 -1
modules/turn.nix
···
script = ''
if [ ! -f '${staticAuthSecretFile}' ]; then
umask 077
+
DIR="$(dirname '${staticAuthSecretFile}')"
+
mkdir -p "$DIR"
tr -dc A-Za-z0-9 </dev/urandom | head -c 32 > '${staticAuthSecretFile}'
-
chown ${config.systemd.services.coturn.serviceConfig.User}:${config.systemd.services.coturn.serviceConfig.Group} '${staticAuthSecretFile}'
+
chown -R ${config.systemd.services.coturn.serviceConfig.User}:${config.systemd.services.coturn.serviceConfig.Group} "$DIR"
fi
'';
serviceConfig.Type = "oneshot";
+6 -4
pkgs/mautrix-meta.nix
···
{ lib, buildGoModule, fetchFromGitHub, olm }:
-
buildGoModule rec {
+
let version = "0.4.4";
+
in buildGoModule rec {
name = "mautrix-meta";
+
inherit version;
src = fetchFromGitHub {
owner = "mautrix";
repo = "meta";
-
rev = "7941e937055b792d2cbfde5d9c8c4df75e68ff0a";
-
hash = "sha256-QDqN6AAaEngWo4UxKAyIXB7BwCEJqsMTeuMb2fKu/9o=";
+
rev = "v${version}";
+
hash = "sha256-S8x3TGQEs+oh/3Q1Gz00M8dOcjjuHSgzVhqlbikZ8QE=";
};
buildInputs = [ olm ];
-
vendorHash = "sha256-ClHg3OEKgXYsmBm/aFKWZXbaLOmKdNyvw42QGhtTRik=";
+
vendorHash = "sha256-sUnvwPJQOoVzxbo2lS3CRcTrWsPjgYPsKClVw1wZJdM=";
doCheck = false;