forked from aylac.top/nixcfg
this repo has no description

uptime kuma

Changed files
+60 -268
hosts
modules
home
programs
chromium
nixos
services
snippets
aylac-top
tailnet
+3 -3
flake.lock
···
"secrets": {
"flake": false,
"locked": {
-
"lastModified": 1755423521,
-
"narHash": "sha256-ktRjo/fjYkXFLWpKBo35dgO5Vd8kYUbbXQvo8o95jPY=",
+
"lastModified": 1755538042,
+
"narHash": "sha256-kL2EyRZPQUUqdurdwJjtbqNhAUJ5Rmr9FnrGvgzINag=",
"owner": "ayla6",
"repo": "secrets",
-
"rev": "4a3edbeb58e6cb001eb3564c1f09195198308a9c",
+
"rev": "a81f823b6c21211436c2e1114534a6bb41f11462",
"type": "github"
},
"original": {
+2
hosts/jezebel/default.nix
···
}: {
imports = [
./secrets.nix
+
./services.nix
self.nixosModules.locale-en-gb
"${modulesPath}/profiles/qemu-guest.nix"
self.diskoConfigurations.btrfs-vps
···
base.enable = true;
btrfs.enable = true;
server.enable = true;
+
backups.enable = true;
vps.enable = true;
autoUpgrade = {
enable = true;
+2
hosts/jezebel/secrets.nix
···
{self, ...}: {
age.secrets = {
tailscaleAuthKey.file = "${self.inputs.secrets}/tailscale/auth.age";
+
resticPassword.file = "${self.inputs.secrets}/restic-passwd.age";
+
rclone.file = "${self.inputs.secrets}/rclone.age";
};
}
+25
hosts/jezebel/services.nix
···
+
{config, ...}: {
+
services = {
+
caddy = {
+
virtualHosts = {
+
"${config.mySnippets.tailnet.networkMap.uptime-kuma.vHost}" = {
+
extraConfig = ''
+
bind tailscale/uptime-kuma
+
encode zstd gzip
+
reverse_proxy ${config.mySnippets.tailnet.networkMap.uptime-kuma.hostName}:${toString config.mySnippets.tailnet.networkMap.uptime-kuma.port}
+
'';
+
};
+
};
+
};
+
+
uptime-kuma = {
+
enable = true;
+
appriseSupport = true;
+
+
settings = {
+
PORT = toString config.mySnippets.aylac-top.networkMap.uptime-kuma.port;
+
HOST = "0.0.0.0";
+
};
+
};
+
};
+
}
+1 -1
hosts/nanpi/secrets.nix
···
cloudflareCertificate.file = "${self.inputs.secrets}/cloudflare/certificate.age";
cloudflareCredentials.file = "${self.inputs.secrets}/cloudflare/credentials.age";
pds.file = "${self.inputs.secrets}/pds.age";
+
resticPassword.file = "${self.inputs.secrets}/restic-passwd.age";
rclone.file = "${self.inputs.secrets}/rclone.age";
tailscaleAuthKey.file = "${self.inputs.secrets}/tailscale/auth.age";
syncthingCert.file = "${self.inputs.secrets}/ayla/syncthing/nanpi/cert.age";
syncthingKey.file = "${self.inputs.secrets}/ayla/syncthing/nanpi/key.age";
-
resticPassword.file = "${self.inputs.secrets}/restic-passwd.age";
vaultwarden.file = "${self.inputs.secrets}/vaultwarden.age";
};
}
+2
hosts/nanpi/services.nix
···
pdsadmin.enable = true;
settings = {
PDS_HOSTNAME = config.mySnippets.aylac-top.networkMap.pds.vHost;
+
# PDS_BSKY_APP_VIEW_URL = "https://bsky.zeppelin.social";
+
# PDS_BSKY_APP_VIEW_DID = "did:web:bsky.zeppelin.social";
};
};
+2 -1
modules/home/programs/chromium/default.nix
···
package =
if pkgs.stdenv.isDarwin
then (pkgs.runCommand "chromium-0.0.0" {} "mkdir $out")
-
else pkgs.chromium;
+
# else pkgs.chromium;
+
else pkgs.ungoogled-chromium;
commandLineArgs = lib.mkIf pkgs.stdenv.isLinux [
"--enable-features=TouchpadOverscrollHistoryNavigation"
+1 -2
modules/nixos/services/caddy/default.nix
···
hash = "sha256-0GsjeeJnfLsJywWzWwJcCDk5wjTSBwzqMBY7iHjPQa8=";
};
};
+
tailscale.permitCertUid = "caddy";
};
-
-
myNixOS.replacement.services.tailscale.permitCertUid = "caddy";
};
}
+10 -5
modules/nixos/services/tailscale/default.nix
···
self,
...
}: {
-
imports = [
-
./service.nix
-
];
-
options.myNixOS.services.tailscale = {
enable = lib.mkEnableOption "Tailscale VPN service";
···
};
};
-
myNixOS.replacement.services.tailscale = {
+
services.tailscale = {
enable = true;
inherit (config.myNixOS.services.tailscale) authKeyFile;
···
openFirewall = true;
permitCertUid = lib.mkIf config.services.caddy.enable "caddy";
useRoutingFeatures = "both";
+
};
+
+
# who's the devil who made it impossible for this to work dude
+
# this is so dirty
+
systemd.services.tailscaled.serviceConfig.Environment = lib.mkAfter [
+
"TS_NO_LOGS_NO_SUPPORT=true"
+
];
+
networking.hosts = {
+
"0.0.0.0" = ["log.tailscale.com"];
};
};
}
-256
modules/nixos/services/tailscale/service.nix
···
-
# https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/services/networking/tailscale.nix
-
{
-
config,
-
lib,
-
pkgs,
-
...
-
}:
-
with lib; let
-
cfg = config.myNixOS.replacement.services.tailscale;
-
isNetworkd = config.networking.useNetworkd;
-
in {
-
meta.maintainers = with maintainers; [
-
mbaillie
-
mfrw
-
];
-
-
options.myNixOS.replacement.services.tailscale = {
-
enable = mkEnableOption "Tailscale client daemon";
-
-
port = mkOption {
-
type = types.port;
-
default = 41641;
-
description = "The port to listen on for tunnel traffic (0=autoselect).";
-
};
-
-
interfaceName = mkOption {
-
type = types.str;
-
default = "tailscale0";
-
description = ''The interface name for tunnel traffic. Use "userspace-networking" (beta) to not use TUN.'';
-
};
-
-
permitCertUid = mkOption {
-
type = types.nullOr types.nonEmptyStr;
-
default = null;
-
description = "Username or user ID of the user allowed to to fetch Tailscale TLS certificates for the node.";
-
};
-
-
disableTaildrop = mkOption {
-
default = false;
-
type = types.bool;
-
description = "Whether to disable the Taildrop feature for sending files between nodes.";
-
};
-
-
noLogsNoSupport = mkOption {
-
default = true;
-
type = types.bool;
-
description = "They spam this every minute and I'm on the free tier of NextDNS so I can't let it happen.";
-
};
-
-
package = lib.mkPackageOption pkgs "tailscale" {};
-
-
openFirewall = mkOption {
-
default = false;
-
type = types.bool;
-
description = "Whether to open the firewall for the specified port.";
-
};
-
-
useRoutingFeatures = mkOption {
-
type = types.enum [
-
"none"
-
"client"
-
"server"
-
"both"
-
];
-
default = "none";
-
example = "server";
-
description = ''
-
Enables settings required for Tailscale's routing features like subnet routers and exit nodes.
-
-
To use these these features, you will still need to call `sudo tailscale up` with the relevant flags like `--advertise-exit-node` and `--exit-node`.
-
-
When set to `client` or `both`, reverse path filtering will be set to loose instead of strict.
-
When set to `server` or `both`, IP forwarding will be enabled.
-
'';
-
};
-
-
authKeyFile = mkOption {
-
type = types.nullOr types.path;
-
default = null;
-
example = "/run/secrets/tailscale_key";
-
description = ''
-
A file containing the auth key.
-
Tailscale will be automatically started if provided.
-
'';
-
};
-
-
authKeyParameters = mkOption {
-
type = types.submodule {
-
options = {
-
ephemeral = mkOption {
-
type = types.nullOr types.bool;
-
default = null;
-
description = "Whether to register as an ephemeral node.";
-
};
-
preauthorized = mkOption {
-
type = types.nullOr types.bool;
-
default = null;
-
description = "Whether to skip manual device approval.";
-
};
-
baseURL = mkOption {
-
type = types.nullOr types.str;
-
default = null;
-
description = "Base URL for the Tailscale API.";
-
};
-
};
-
};
-
default = {};
-
description = ''
-
Extra parameters to pass after the auth key.
-
See https://tailscale.com/kb/1215/oauth-clients#registering-new-nodes-using-oauth-credentials
-
'';
-
};
-
-
extraUpFlags = mkOption {
-
description = ''
-
Extra flags to pass to {command}`tailscale up`. Only applied if `authKeyFile` is specified.";
-
'';
-
type = types.listOf types.str;
-
default = [];
-
example = ["--ssh"];
-
};
-
-
extraSetFlags = mkOption {
-
description = "Extra flags to pass to {command}`tailscale set`.";
-
type = types.listOf types.str;
-
default = [];
-
example = ["--advertise-exit-node"];
-
};
-
-
extraDaemonFlags = mkOption {
-
description = "Extra flags to pass to {command}`tailscaled`.";
-
type = types.listOf types.str;
-
default = [];
-
example = ["--no-logs-no-support"];
-
};
-
};
-
-
config = mkIf cfg.enable {
-
environment.systemPackages = [cfg.package]; # for the CLI
-
systemd = {
-
packages = [cfg.package];
-
-
services = {
-
tailscaled = {
-
after = lib.mkIf config.networking.networkmanager.enable ["NetworkManager-wait-online.service"];
-
wantedBy = ["multi-user.target"];
-
path =
-
[
-
(builtins.dirOf config.security.wrapperDir) # for `su` to use taildrive with correct access rights
-
pkgs.procps # for collecting running services (opt-in feature)
-
pkgs.getent # for `getent` to look up user shells
-
pkgs.kmod # required to pass tailscale's v6nat check
-
]
-
++ lib.optional config.networking.resolvconf.enable config.networking.resolvconf.package;
-
serviceConfig.Environment =
-
[
-
"PORT=${toString cfg.port}"
-
''"FLAGS=--tun ${lib.escapeShellArg cfg.interfaceName} ${lib.concatStringsSep " " cfg.extraDaemonFlags}"''
-
]
-
++ lib.optional cfg.noLogsNoSupport [
-
# they spam this to hell and the other configs like the one above didn't work to disable it. i'm on the nextdns freetier dude!!
-
"TS_NO_LOGS_NO_SUPPORT=true"
-
]
-
++ (lib.optionals (cfg.permitCertUid != null) [
-
"TS_PERMIT_CERT_UID=${cfg.permitCertUid}"
-
])
-
++ (lib.optionals cfg.disableTaildrop [
-
"TS_DISABLE_TAILDROP=true"
-
]);
-
# Restart tailscaled with a single `systemctl restart` at the
-
# end of activation, rather than a `stop` followed by a later
-
# `start`. Activation over Tailscale can hang for tens of
-
# seconds in the stop+start setup, if the activation script has
-
# a significant delay between the stop and start phases
-
# (e.g. script blocked on another unit with a slow shutdown).
-
#
-
# Tailscale is aware of the correctness tradeoff involved, and
-
# already makes its upstream systemd unit robust against unit
-
# version mismatches on restart for compatibility with other
-
# linux distros.
-
stopIfChanged = false;
-
};
-
tailscaled-autoconnect = mkIf (cfg.authKeyFile != null) {
-
after = ["tailscaled.service"];
-
wants = ["tailscaled.service"];
-
wantedBy = ["multi-user.target"];
-
serviceConfig = {
-
Type = "oneshot";
-
};
-
# https://github.com/tailscale/tailscale/blob/v1.72.1/ipn/backend.go#L24-L32
-
script = let
-
statusCommand = "${lib.getExe cfg.package} status --json --peers=false | ${lib.getExe pkgs.jq} -r '.BackendState'";
-
paramToString = v:
-
if (builtins.isBool v)
-
then (lib.boolToString v)
-
else (toString v);
-
params = lib.pipe cfg.authKeyParameters [
-
(lib.filterAttrs (_: v: v != null))
-
(lib.mapAttrsToList (k: v: "${k}=${paramToString v}"))
-
(builtins.concatStringsSep "&")
-
(params:
-
if params != ""
-
then "?${params}"
-
else "")
-
];
-
in ''
-
while [[ "$(${statusCommand})" == "NoState" ]]; do
-
sleep 0.5
-
done
-
status=$(${statusCommand})
-
if [[ "$status" == "NeedsLogin" || "$status" == "NeedsMachineAuth" ]]; then
-
${lib.getExe cfg.package} up --auth-key "$(cat ${cfg.authKeyFile})${params}" ${escapeShellArgs cfg.extraUpFlags}
-
fi
-
'';
-
};
-
-
tailscaled-set = mkIf (cfg.extraSetFlags != []) {
-
after = ["tailscaled.service"];
-
wants = ["tailscaled.service"];
-
wantedBy = ["multi-user.target"];
-
serviceConfig = {
-
Type = "oneshot";
-
};
-
script = ''
-
${lib.getExe cfg.package} set ${escapeShellArgs cfg.extraSetFlags}
-
'';
-
};
-
};
-
-
network.networks."50-tailscale" = mkIf isNetworkd {
-
matchConfig = {
-
Name = cfg.interfaceName;
-
};
-
linkConfig = {
-
Unmanaged = true;
-
ActivationPolicy = "manual";
-
};
-
};
-
};
-
-
boot.kernel.sysctl = mkIf (cfg.useRoutingFeatures == "server" || cfg.useRoutingFeatures == "both") {
-
"net.ipv4.conf.all.forwarding" = mkOverride 97 true;
-
"net.ipv6.conf.all.forwarding" = mkOverride 97 true;
-
};
-
-
networking = {
-
firewall = {
-
allowedUDPPorts = mkIf cfg.openFirewall [cfg.port];
-
checkReversePath = mkIf (
-
cfg.useRoutingFeatures == "client" || cfg.useRoutingFeatures == "both"
-
) "loose";
-
};
-
dhcpcd.denyInterfaces = [cfg.interfaceName];
-
};
-
};
-
}
+6
modules/snippets/aylac-top/default.nix
···
port = 8222;
vHost = "vault.aylac.top";
};
+
+
uptime-kuma = {
+
# Only used for status pages
+
hostName = "jezebel";
+
port = 3008;
+
};
};
};
}
+6
modules/snippets/tailnet/default.nix
···
port = 5232;
vHost = "radicale.${config.mySnippets.tailnet.name}";
};
+
+
uptime-kuma = {
+
hostName = "jezebel";
+
port = 3008;
+
vHost = "uptime-kuma.${config.mySnippets.tailnet.name}";
+
};
};
};
};