nix machine / user configurations

migrate to trimounts

ptr.pet 8ee102ba 63697dca

verified
Changed files
+2139 -184
dns
hosts
secrets
users
modules
discord
+22 -27
dns/dnsconfig.js
···
var WOLUMONDE_IP = "23.88.101.188";
var DZWONEK_IP = "94.237.26.47";
+
var TRIMOUNTS_IP = "159.195.58.28";
D(
"gaze.systems",
REG_NONE,
DnsProvider(DSP_CLOUDFLARE),
DefaultTTL(1),
-
A("@", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("doc", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("git", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("limbus", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("pmart", WOLUMONDE_IP, CF_PROXY_OFF),
+
A("@", TRIMOUNTS_IP, CF_PROXY_OFF, TTL(60)),
+
A("doc", TRIMOUNTS_IP, CF_PROXY_OFF),
+
A("pmart", TRIMOUNTS_IP, CF_PROXY_OFF),
// A("webhook", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("dash", WOLUMONDE_IP, CF_PROXY_OFF), // perses
-
A("knot", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("spindle", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("skeetdeck", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("likes", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("id", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("test", WOLUMONDE_IP, CF_PROXY_OFF),
-
// atp handles
-
A("dawn", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("guestbook", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("drew", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("eris", WOLUMONDE_IP, CF_PROXY_OFF),
+
A("dash", TRIMOUNTS_IP, CF_PROXY_OFF), // perses
+
A("knot", TRIMOUNTS_IP, CF_PROXY_OFF, TTL(60)),
+
A("spindle", TRIMOUNTS_IP, CF_PROXY_OFF, TTL(60)),
+
A("id", TRIMOUNTS_IP, CF_PROXY_OFF),
+
// atp
+
A("guestbook", TRIMOUNTS_IP, CF_PROXY_OFF),
// dzwonek
A("vpn", DZWONEK_IP, CF_PROXY_OFF),
// A("meow", WOLUMONDE_IP, CF_PROXY_OFF),
···
TXT("send.poke", "v=spf1 include:amazonses.com ~all"),
// atproto
TXT("_atproto.eris", "did=did:plc:bxjnsrfzozl365rsdo5yvuz5", TTL(60)),
-
// TXT("_atproto", "did=did:plc:dfl62fgb7wtjj3fcbb72naae", TTL(60)),
-
// TXT("_atproto.dusk", "did=did:plc:dfl62fgb7wtjj3fcbb72naae", TTL(60)),
+
TXT("_atproto.drew", "did=did:plc:vo6ie3kd6xvpjlof4pnb2zzp", TTL(60)),
);
D(
···
REG_NONE,
DnsProvider(DSP_CLOUDFLARE),
DefaultTTL(1),
-
A("@", WOLUMONDE_IP, CF_PROXY_ON),
+
A("@", TRIMOUNTS_IP, CF_PROXY_ON),
TXT("@", "a data endpoint for entity with serial id /90008/."),
TXT(
"@",
···
),
// atproto
// TXT("_atproto", "did=did:plc:dfl62fgb7wtjj3fcbb72naae"),
+
IGNORE_NAME("_acme-challenge"),
);
D(
···
REG_NONE,
DnsProvider(DSP_CLOUDFLARE),
DefaultTTL(1),
-
A("@", WOLUMONDE_IP, CF_PROXY_OFF),
+
A("@", TRIMOUNTS_IP, CF_PROXY_OFF),
TXT("@", "v=spf1 -all"),
TXT("_dmarc", "v=DMARC1; p=reject;"),
+
TXT("_atproto", "did=did:plc:dfl62fgb7wtjj3fcbb72naae", TTL(60)),
+
IGNORE_NAME("_acme-challenge"),
);
var EMAIL_TTL = 86400;
···
REG_NONE,
DnsProvider(DSP_CLOUDFLARE),
DefaultTTL(1),
-
A("@", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("test", WOLUMONDE_IP, CF_PROXY_OFF),
+
A("@", TRIMOUNTS_IP, CF_PROXY_OFF),
A("nucleus", DZWONEK_IP, CF_PROXY_OFF),
A("trill", DZWONEK_IP, CF_PROXY_OFF),
// atproto
TXT("_atproto", "did=did:plc:dfl62fgb7wtjj3fcbb72naae"),
-
A("nil", WOLUMONDE_IP, CF_PROXY_OFF),
TXT("_atproto.nil", "did=did:plc:dumbmutt4po52ept2tczimje"),
TXT("_atproto.june", "did=did:plc:y3z2rr7q5rywu4fjn3fmfyop"),
// june
···
),
// mta-sts
-
A("mta-sts", WOLUMONDE_IP, CF_PROXY_OFF),
+
A("mta-sts", TRIMOUNTS_IP, CF_PROXY_OFF),
TXT("_mta-sts", "v=STSv1; id=20250930T1945", TTL(EMAIL_TTL)),
// autoconfig
-
A("autoconfig", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("autodiscover", WOLUMONDE_IP, CF_PROXY_OFF),
+
A("autoconfig", TRIMOUNTS_IP, CF_PROXY_OFF),
+
A("autodiscover", TRIMOUNTS_IP, CF_PROXY_OFF),
// autodiscovery
SRV(
···
SRV("_submissions._tcp", 0, 1, 465, "smtp.migadu.com.", TTL(EMAIL_TTL)),
SRV("_imaps._tcp", 0, 1, 993, "imap.migadu.com.", TTL(EMAIL_TTL)),
SRV("_pop3s._tcp", 0, 1, 995, "pop.migadu.com.", TTL(EMAIL_TTL)),
+
+
IGNORE_NAME("_acme-challenge"),
);
+18 -18
flake.lock
···
"rust-overlay": "rust-overlay"
},
"locked": {
-
"lastModified": 1764153295,
-
"narHash": "sha256-Y+Cp19zLo5JZVLSbzpyCTSK1bVYfE3Leuut6nQVkdR4=",
+
"lastModified": 1764351487,
+
"narHash": "sha256-7XJcTfz0dPhBd7nfyjcFxT1LIIctJZ2LthiI2Ltd7zY=",
"owner": "chaotic-cx",
"repo": "nyx",
-
"rev": "29c49282c9b2e8216004a87086494defe401fee8",
+
"rev": "2031f4a0507d0f7ab3e1aaff4c027a010feee447",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1764075860,
-
"narHash": "sha256-KYEIHCBBw+/lwKsJNRNoUxBB4ZY2LK0G0T8f+0i65q0=",
+
"lastModified": 1764194569,
+
"narHash": "sha256-iUM9ktarEzThkayyZrzQ7oycPshAY2XRQqVKz0xX/L0=",
"owner": "nix-community",
"repo": "home-manager",
-
"rev": "295d90e22d557ccc3049dc92460b82f372cd3892",
+
"rev": "9651819d75f6c7ffaf8a9227490ac704f29659f0",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1763714684,
-
"narHash": "sha256-ZNJPAaeSYQTDgvwwE8XHhCz4HiHqYoUyoXdoBE2nxug=",
+
"lastModified": 1764275117,
+
"narHash": "sha256-DRcv8Y0BnWm4ZhUQnaYk1dNzC6ZhA2W9Vv5Jl4n0RbE=",
"owner": "Jovian-Experiments",
"repo": "Jovian-NixOS",
-
"rev": "6178d787ee61b8586fdb0ccb8644fbfd5317d0f3",
+
"rev": "96023dcc9a0febaaa3b91f447b9ae2fbe86f2923",
"type": "github"
},
"original": {
···
},
"nixpkgs": {
"locked": {
-
"lastModified": 1763966396,
-
"narHash": "sha256-6eeL1YPcY1MV3DDStIDIdy/zZCDKgHdkCmsrLJFiZf0=",
+
"lastModified": 1764242076,
+
"narHash": "sha256-sKoIWfnijJ0+9e4wRvIgm/HgE27bzwQxcEmo2J/gNpI=",
"owner": "NixOS",
"repo": "nixpkgs",
-
"rev": "5ae3b07d8d6527c42f17c876e404993199144b6a",
+
"rev": "2fad6eac6077f03fe109c4d4eb171cf96791faa4",
"type": "github"
},
"original": {
···
},
"nixpkgs_2": {
"locked": {
-
"lastModified": 1763966396,
-
"narHash": "sha256-6eeL1YPcY1MV3DDStIDIdy/zZCDKgHdkCmsrLJFiZf0=",
+
"lastModified": 1764242076,
+
"narHash": "sha256-sKoIWfnijJ0+9e4wRvIgm/HgE27bzwQxcEmo2J/gNpI=",
"owner": "NixOS",
"repo": "nixpkgs",
-
"rev": "5ae3b07d8d6527c42f17c876e404993199144b6a",
+
"rev": "2fad6eac6077f03fe109c4d4eb171cf96791faa4",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1764038373,
-
"narHash": "sha256-M6w2wNBRelcavoDAyFL2iO4NeWknD40ASkH1S3C0YGM=",
+
"lastModified": 1764211126,
+
"narHash": "sha256-p5y13PnMZYd5WdHk+XCzyUaLGBUCwnz2n4KYKEZM0Pw=",
"owner": "oxalica",
"repo": "rust-overlay",
-
"rev": "ab3536fe850211a96673c6ffb2cb88aab8071cc9",
+
"rev": "895935bff08cfcfb663fb9c8263c43596e7cd1ed",
"type": "github"
},
"original": {
+1 -3
hosts/chernobog/default.nix
···
noto-fonts
noto-fonts-cjk-serif
noto-fonts-cjk-sans
-
noto-fonts-emoji
+
noto-fonts-color-emoji
font-awesome
source-han-serif
source-han-sans
-
source-han-sans-japanese
-
source-han-serif-japanese
comic-mono
comic-relief
];
+22 -2
hosts/chernobog/modules/vr.nix
···
};
};
-
# programs.envision.enable = true;
+
environment.systemPackages = with pkgs; [ wlx-overlay-s eepyxr wayvr-dashboard xrizer ];
-
environment.systemPackages = with pkgs; [ wlx-overlay-s eepyxr wayvr-dashboard ];
+
home-manager.sharedModules = [{
+
xdg.configFile."openvr/openvrpaths.vrpath".text = ''
+
{
+
"config" :
+
[
+
"/home/mayer/.local/share/Steam/config"
+
],
+
"external_drivers" : null,
+
"jsonid" : "vrpathreg",
+
"log" :
+
[
+
"/home/mayer/.local/share/Steam/logs"
+
],
+
"runtime" :
+
[
+
${pkgs.xrizer}/lib/xrizer"
+
],
+
"version" : 1
+
}
+
'';
+
}];
}
+1 -1
hosts/default.nix
···
systems = {
# lungmen = "x86_64-linux";
# tkaronto = "x86_64-linux";
-
wolumonde = allPkgsSets.x86_64-linux;
+
# wolumonde = allPkgsSets.x86_64-linux;
# wsl = allPkgsSets.x86_64-linux;
dzwonek = allPkgsSets.x86_64-linux;
volsinii = allPkgsSets.x86_64-linux;
-3
hosts/dzwonek/modules/nginx.nix
···
{
-
lib,
inputs,
-
pkgs,
...
}:
{
services.nginx = {
enable = true;
-
package = pkgs.nginxQuic;
recommendedTlsSettings = true;
recommendedOptimisation = true;
recommendedGzipSettings = true;
+38
hosts/trimounts/modules/atproto.nix
···
+
{ pkgs, lib, ... }:
+
let
+
getFileType = name: if lib.hasSuffix ".json" name then "application/json" else "text/plain";
+
mkWellKnownCfg = files: {
+
quic = true;
+
kTLS = true;
+
locations = (
+
lib.mapAttrs' (name: file: {
+
name = "=/.well-known/${name}";
+
value = {
+
extraConfig = ''
+
alias ${file};
+
add_header access-control-allow-origin *;
+
default_type ${getFileType name};
+
'';
+
};
+
}) files
+
);
+
};
+
mkDidWebCfg = domain: {
+
"${domain}" =
+
(mkWellKnownCfg {
+
"did.json" = ../../../secrets/${domain}.did;
+
"atproto-did" = pkgs.writeText "server" "did:web:${domain}";
+
})
+
// (lib.optionalAttrs (lib.hasSuffix "gaze.systems" domain) {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
});
+
};
+
guestbookDid = "guestbook.gaze.systems";
+
in
+
{
+
security.acme.certs."gaze.systems".extraDomainNames = [guestbookDid];
+
services.nginx.virtualHosts = mkDidWebCfg guestbookDid;
+
}
+58
hosts/trimounts/modules/email.nix
···
+
{ pkgs, ... }:
+
{
+
security.acme.certs."ptr.pet".extraDomainNames = [
+
"mta-sts.ptr.pet"
+
"autoconfig.ptr.pet"
+
"autodiscover.ptr.pet"
+
];
+
services.nginx.virtualHosts."ptr.pet" = {
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."/mail/config-v1.1.xml" = {
+
return = "301 https://autoconfig.migadu.com/mail/config-v1.1.xml";
+
};
+
locations."/Autodiscover/Autodiscover.xml" = {
+
return = "301 https://autodiscover.migadu.com/Autodiscover/Autodiscover.xml";
+
};
+
};
+
services.nginx.virtualHosts."mta-sts.ptr.pet" =
+
let
+
file = pkgs.writeText "mta-sts.txt" ''
+
version: STSv1
+
mode: enforce
+
mx: aspmx1.migadu.com
+
mx: aspmx2.migadu.com
+
max_age: 31557600
+
'';
+
in
+
{
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."=/.well-known/mta-sts.txt".extraConfig = ''
+
alias ${file};
+
default_type text/plain;
+
'';
+
};
+
services.nginx.virtualHosts."autoconfig.ptr.pet" = {
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."/" = {
+
return = "301 https://autoconfig.migadu.com$request_uri";
+
};
+
};
+
services.nginx.virtualHosts."autodiscover.ptr.pet" = {
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."/" = {
+
return = "301 https://autodiscover.migadu.com$request_uri";
+
};
+
};
+
}
+47
hosts/trimounts/modules/limbusart.nix
···
+
{
+
inputs,
+
pkgs,
+
lib,
+
...
+
}:
+
let
+
pkg = pkgs.callPackage "${inputs.limbusart}/package.nix" { };
+
domain = "pmart.gaze.systems";
+
in
+
{
+
systemd.services.limbusart = {
+
description = "limbusart";
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
serviceConfig = lib.mkMerge [
+
{
+
User = "limbusart";
+
ExecStart = "${pkg}/bin/limbusart";
+
Restart = "on-failure";
+
RestartSec = 5;
+
WorkingDirectory = "/var/lib/limbusart";
+
EnvironmentFile = pkgs.writeText "limbusart.conf" ''
+
ARTS_PATH="arts.txt"
+
SITE_TITLE="random pm art"
+
EMBED_TITLE="random pm art here!!"
+
EMBED_DESC="click NOW to see random pm art"
+
EMBED_COLOR="#bd0000"
+
'';
+
}
+
];
+
};
+
users.users.limbusart = {
+
isSystemUser = true;
+
group = "limbusart";
+
};
+
users.groups.limbusart = { };
+
+
security.acme.certs."gaze.systems".extraDomainNames = [domain];
+
services.nginx.virtualHosts.${domain} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/".proxyPass = "http://localhost:3000";
+
};
+
}
+3
hosts/trimounts/modules/mosh.nix
···
+
{
+
programs.mosh.enable = true;
+
}
+134
hosts/trimounts/modules/nginx.nix
···
+
{
+
config,
+
lib,
+
inputs,
+
...
+
}:
+
{
+
services.nginx = {
+
enable = true;
+
recommendedTlsSettings = true;
+
recommendedOptimisation = true;
+
recommendedGzipSettings = true;
+
recommendedProxySettings = true;
+
# /nginx_status
+
statusPage = true;
+
};
+
+
networking.firewall.allowedTCPPorts = [ 80 443 ];
+
+
# output json logs so we can consume them more easily
+
services.nginx.appendHttpConfig = ''
+
log_format json_logs escape=json '{'
+
'"_msg":"request completed",'
+
'"time":"$time_local",'
+
'"req.remoteAddr":"$remote_addr",'
+
'"req.method":"$request_method",'
+
'"req.url":"$uri",'
+
'"req.httpVersion":"$server_protocol",'
+
'"res.statusCode":$status,'
+
'"res.bodySize":$body_bytes_sent,'
+
'"req.headers.id":"$request_id",'
+
'"req.headers.referer":"$http_referer",'
+
'"req.headers.user-agent":"$http_user_agent",'
+
'"requestTime":$request_time'
+
'}';
+
access_log /var/log/nginx/access.log json_logs;
+
'';
+
+
users.users.nginx.extraGroups = [ "acme" ];
+
+
age.secrets.cfDnsEditToken.file = ../../../secrets/cloudflareDnsEdit.age;
+
security.acme = {
+
acceptTerms = true;
+
defaults = {
+
group = "nginx";
+
email = (import "${inputs.self}/personal.nix").emails.primary;
+
dnsProvider = "cloudflare";
+
credentialFiles = {
+
CF_DNS_API_TOKEN_FILE = config.age.secrets.cfDnsEditToken.path;
+
};
+
};
+
certs."poor.dog" = { };
+
certs."ptr.pet" = { };
+
certs."gaze.systems" = { };
+
};
+
services.nginx.virtualHosts."gaze.systems" = {
+
quic = true;
+
kTLS = true;
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
};
+
services.nginx.virtualHosts."poor.dog" = {
+
quic = true;
+
kTLS = true;
+
useACMEHost = "poor.dog";
+
forceSSL = true;
+
};
+
services.nginx.virtualHosts."ptr.pet" = {
+
quic = true;
+
kTLS = true;
+
useACMEHost = "ptr.pet";
+
forceSSL = true;
+
};
+
+
services.fluent-bit.settings = {
+
parsers = [
+
{
+
name = "nginx_json";
+
format = "json";
+
time_key = "time";
+
time_format = "%d/%b/%Y:%H:%M:%S %z";
+
}
+
];
+
pipeline = {
+
inputs = [
+
{
+
name = "nginx_metrics";
+
tag = "metrics.nginx";
+
status_url = "/nginx_status";
+
nginx_plus = false;
+
}
+
{
+
name = "tail";
+
tag = "logs.nginx";
+
path = "/var/log/nginx/*.log";
+
db = "/var/lib/fluent-bit/nginx-access.db";
+
"db.locking" = true;
+
buffer_chunk_size = "4m";
+
buffer_max_size = "32m";
+
parser = "nginx_json";
+
}
+
];
+
filters = [
+
{
+
name = "modify";
+
match = "logs.nginx";
+
Add = [ "name nginx" ];
+
}
+
];
+
};
+
};
+
+
# need so fluent-bit can access nginx
+
systemd.services.fluent-bit.serviceConfig.SupplementaryGroups = lib.mkForce "systemd-journal nginx";
+
+
services.vmalert.instances."".rules.groups = [
+
{
+
name = "nginx-logs";
+
type = "vlogs";
+
interval = "1m";
+
rules = [
+
{
+
record = "nginx_request_count";
+
expr = "name:nginx | stats (res.statusCode) count() as total_requests";
+
}
+
{
+
record = "nginx_request_latency";
+
# filter out subscribeRepos requests because they are long polling http L
+
expr = "name:nginx | filter req.url:!/xrpc/com.atproto.sync.subscribeRepos | stats avg(requestTime) avg, quantile(0.5, requestTime) p50, quantile(0.9, requestTime) p90, quantile(0.99, requestTime) p99";
+
}
+
];
+
}
+
];
+
}
+65
hosts/trimounts/modules/nsid-tracker.nix
···
+
{
+
pkgs,
+
terra,
+
inputs,
+
...
+
}:
+
let
+
client-modules = pkgs.callPackage "${inputs.nsid-tracker}/nix/client-modules.nix" { };
+
client = pkgs.callPackage "${inputs.nsid-tracker}/nix/client.nix" {
+
PUBLIC_API_URL = "gaze.systems/nsid-tracker/api";
+
inherit client-modules;
+
};
+
# server = terra.nsid-tracker-server;
+
port = 3713;
+
in
+
{
+
systemd.services.nsid-tracker-client = {
+
description = "nsid-tracker-client";
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
environment = {
+
# ORIGIN = "https://gaze.systems";
+
PORT = toString port;
+
};
+
serviceConfig = {
+
DynamicUser = true;
+
ExecStart = "${client}/bin/website";
+
Restart = "on-failure";
+
RestartSec = 5;
+
WorkingDirectory = "/var/lib/nsid-tracker";
+
};
+
};
+
+
systemd.services.nsid-tracker-keep-alive = {
+
description = "keeps nsid-tracker peer connection alive";
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
serviceConfig = {
+
Type = "oneshot";
+
ExecStart = "${pkgs.curl}/bin/curl http://dusk-devel-mobi:${toString port}/events";
+
};
+
};
+
systemd.timers.nsid-tracker-keep-alive.timerConfig = {
+
OnBootSec = "5 min";
+
OnUnitActiveSec = "5 min";
+
Unit = "nsid-tracker-keep-alive.service";
+
};
+
+
services.nginx.virtualHosts."gaze.systems" = {
+
locations."/nsid-tracker/api" = {
+
proxyPass = "http://100.64.0.6:${toString port}/";
+
proxyWebsockets = true;
+
extraConfig = ''
+
rewrite ^/nsid-tracker/api/(.*) /$1 break;
+
'';
+
};
+
locations."/nsid-tracker".return = "301 /nsid-tracker/";
+
locations."/nsid-tracker/" = {
+
proxyPass = "http://localhost:${toString port}/";
+
extraConfig = ''
+
rewrite ^/nsid-tracker/(.*)$ /$1 break;
+
'';
+
};
+
};
+
}
+104
hosts/trimounts/modules/perses.nix/default.nix
···
+
{
+
pkgs,
+
config,
+
...
+
}:
+
let
+
domain = "dash.gaze.systems";
+
port = 7412;
+
user = "perses";
+
+
provisionFolder = "provisioning";
+
provisioningFolder = "${config.users.users.${user}.home}/${provisionFolder}";
+
+
persesConfig = {
+
database.file = {
+
folder = config.users.users.${user}.home;
+
extension = "json";
+
};
+
provisioning.folders = [ provisioningFolder ];
+
security = {
+
enable_auth = true;
+
authentication = {
+
providers = {
+
enable_native = false;
+
oidc = [
+
{
+
slug_id = "pocketid";
+
name = "Pocket ID";
+
client_id = "aa583db6-e03c-4490-853a-7f2b3e089fbe";
+
issuer = config.services.pocket-id.settings.APP_URL;
+
scopes = [ "openid profile email" ];
+
}
+
];
+
};
+
disable_sign_up = false;
+
};
+
cookie = {
+
same_site = "strict";
+
secure = true;
+
};
+
};
+
};
+
persesConfigYaml = pkgs.writers.writeYAML "config.yaml" persesConfig;
+
+
secrets = config.age.secrets;
+
in
+
{
+
environment.systemPackages = [ pkgs.perses ];
+
+
users.users.${user} = {
+
isNormalUser = true;
+
group = user;
+
home = "/var/lib/${user}";
+
createHome = true;
+
uid = 1001;
+
};
+
users.groups.${user} = {
+
gid = 976;
+
};
+
+
age.secrets.persesSecret = {
+
file = ../../../../secrets/persesSecret.age;
+
owner = user;
+
group = user;
+
};
+
+
systemd.services.perses = {
+
description = "perses";
+
after = [
+
"network.target"
+
"pocket-id.service"
+
];
+
requires = [ "pocket-id.service" ];
+
serviceConfig = {
+
ExecStart = "${pkgs.perses}/bin/perses --config=${persesConfigYaml} --web.listen-address=:${toString port} --log.level=info";
+
EnvironmentFile = secrets.persesSecret.path;
+
WorkingDirectory = config.users.users.${user}.home;
+
};
+
};
+
systemd.services.perses.preStart = ''
+
rm -rf ${provisioningFolder} && mkdir -p ${provisioningFolder}
+
cp -f ${./provision}/* ${provisioningFolder}
+
'';
+
+
security.acme.certs."gaze.systems".extraDomainNames = [ domain ];
+
services.nginx.virtualHosts.${domain} = {
+
useACMEHost = "gaze.systems"; # TODO: write a module to define vhosts for subdomains
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."/" = {
+
proxyPass = "http://localhost:${toString port}";
+
};
+
};
+
+
# scrape perses metrics
+
services.victoriametrics.prometheusConfig.scrape_configs = [
+
{
+
job_name = "perses";
+
metrics_path = "/metrics";
+
static_configs = [ { targets = [ "localhost:${toString port}" ]; } ];
+
}
+
];
+
}
+3
hosts/trimounts/modules/perses.nix/provision/1-private-infra.yaml
···
+
kind: Project
+
metadata:
+
name: private-infra
+9
hosts/trimounts/modules/perses.nix/provision/2-admin-role.yaml
···
+
- kind: GlobalRole
+
metadata:
+
name: admin
+
spec:
+
permissions:
+
- actions:
+
- '*'
+
scopes:
+
- '*'
+8
hosts/trimounts/modules/perses.nix/provision/3-admin-bind-role.yaml
···
+
- kind: GlobalRoleBinding
+
metadata:
+
name: admin
+
spec:
+
role: admin
+
subjects:
+
- kind: User
+
name: 90008
+12
hosts/trimounts/modules/perses.nix/provision/4-victoria.yaml
···
+
- kind: GlobalDatasource
+
metadata:
+
name: victoria
+
spec:
+
default: true
+
plugin:
+
kind: PrometheusDatasource
+
spec:
+
proxy:
+
kind: HTTPProxy
+
spec:
+
url: http://localhost:8428
+12
hosts/trimounts/modules/perses.nix/provision/6-guest-role.yaml
···
+
- kind: GlobalRole
+
metadata:
+
name: guest
+
spec:
+
permissions:
+
- actions:
+
- 'read'
+
scopes:
+
- 'Dashboard'
+
- 'Project'
+
- 'Datasource'
+
- 'GlobalDatasource'
+8
hosts/trimounts/modules/perses.nix/provision/7-guest-role-bind.yaml
···
+
- kind: GlobalRoleBinding
+
metadata:
+
name: guest
+
spec:
+
role: guest
+
subjects:
+
- kind: User
+
name: sorryu02
+454
hosts/trimounts/modules/perses.nix/provision/90-wolumonde.yaml
···
+
kind: Dashboard
+
metadata:
+
name: wolumonde
+
createdAt: 0001-01-01T00:00:00Z
+
updatedAt: 0001-01-01T00:00:00Z
+
version: 0
+
project: private-infra
+
spec:
+
panels:
+
"0_0":
+
kind: Panel
+
spec:
+
display:
+
name: load over 5 min
+
plugin:
+
kind: GaugeChart
+
spec:
+
calculation: mean
+
format:
+
unit: percent
+
max: 100
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: node_load5 * 100 / count(count(node_cpu_seconds_total) by (cpu))
+
seriesNameFormat: load %
+
"0_1":
+
kind: Panel
+
spec:
+
display:
+
name: cpu usage
+
plugin:
+
kind: GaugeChart
+
spec:
+
calculation: mean
+
format:
+
unit: percent
+
max: 100
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: sum by (cpu) (rate(node_cpu_seconds_total{mode=~"user|system"}[1m])) * 100
+
seriesNameFormat: cpu {{cpu}}
+
"0_2":
+
kind: Panel
+
spec:
+
display:
+
name: memory usage
+
plugin:
+
kind: GaugeChart
+
spec:
+
calculation: mean
+
format:
+
unit: percent
+
max: 100
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) * 100 / node_memory_MemTotal_bytes
+
seriesNameFormat: memory usage %
+
"0_3":
+
kind: Panel
+
spec:
+
display:
+
name: disk usage /
+
plugin:
+
kind: GaugeChart
+
spec:
+
calculation: last
+
format:
+
unit: percent
+
max: 100
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: (node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) * 100 / node_filesystem_size_bytes{mountpoint="/"}
+
seriesNameFormat: disk usage %
+
"0_4":
+
kind: Panel
+
spec:
+
display:
+
name: load over 5 min
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
max: 2
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: node_load5
+
seriesNameFormat: load
+
"0_5":
+
kind: Panel
+
spec:
+
display:
+
name: cpu usage
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
format:
+
unit: percent
+
max: 100
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: sum by (cpu) (rate(node_cpu_seconds_total{mode=~"user|system"}[1m])) * 100
+
seriesNameFormat: cpu {{cpu}}
+
"0_6":
+
kind: Panel
+
spec:
+
display:
+
name: memory usage
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
format:
+
unit: bytes
+
max: 4e+09
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes
+
seriesNameFormat: current memory usage
+
"0_7":
+
kind: Panel
+
spec:
+
display:
+
name: disk usage /
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
format:
+
unit: bytes
+
max: 3.8e+10
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}
+
seriesNameFormat: disk usage
+
"1_0":
+
kind: Panel
+
spec:
+
display:
+
name: nginx requests / min
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
legend:
+
position: bottom
+
size: small
+
yAxis:
+
format:
+
unit: decimal
+
visual:
+
display: bar
+
palette:
+
mode: categorical
+
stack: all
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: nginx_request_count
+
seriesNameFormat: '{{res.statusCode}}'
+
"1_1":
+
kind: Panel
+
spec:
+
display:
+
name: nginx latency / min
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
format:
+
unit: seconds
+
max: 0.5
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: nginx_request_latency
+
seriesNameFormat: '{{stats_result}}'
+
"2_0":
+
kind: Panel
+
spec:
+
display:
+
name: pds requests / min
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
legend:
+
position: bottom
+
size: small
+
yAxis:
+
format:
+
unit: decimal
+
visual:
+
display: bar
+
palette:
+
mode: categorical
+
stack: all
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: pds_request_count
+
seriesNameFormat: '{{res.statusCode}}'
+
"2_1":
+
kind: Panel
+
spec:
+
display:
+
name: pds latency / min
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
format:
+
unit: milliseconds
+
max: 500
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: pds_response_latency
+
seriesNameFormat: '{{stats_result}}'
+
"3_0":
+
kind: Panel
+
spec:
+
display:
+
name: gazesys visits
+
plugin:
+
kind: BarChart
+
spec:
+
calculation: last
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: gazesys_visit_real_total + gazesys_visit_fake_total
+
seriesNameFormat: total visits
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: gazesys_visit_fake_total
+
seriesNameFormat: (ai) bot visits
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: gazesys_visit_real_total
+
seriesNameFormat: real visits
+
"3_1":
+
kind: Panel
+
spec:
+
display:
+
name: gazesys pet
+
plugin:
+
kind: StatChart
+
spec:
+
calculation: last
+
format:
+
unit: decimal
+
shortValues: true
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: gazesys_pet_bounce_total
+
seriesNameFormat: bounce count
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: gazesys_pet_distance_total
+
seriesNameFormat: distance travelled
+
"4_0":
+
kind: Panel
+
spec:
+
display:
+
name: anubis policy actions
+
plugin:
+
kind: BarChart
+
spec:
+
calculation: last
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: anubis_policy_results
+
seriesNameFormat: '{{action}}: {{rule}}'
+
layouts:
+
- kind: Grid
+
spec:
+
display:
+
title: resource usage
+
items:
+
- x: 0
+
"y": 0
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_0'
+
- x: 6
+
"y": 0
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_1'
+
- x: 12
+
"y": 0
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_2'
+
- x: 18
+
"y": 0
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_3'
+
- x: 0
+
"y": 6
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_4'
+
- x: 6
+
"y": 6
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_5'
+
- x: 12
+
"y": 6
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_6'
+
- x: 18
+
"y": 6
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_7'
+
- kind: Grid
+
spec:
+
display:
+
title: nginx metrics
+
items:
+
- x: 0
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/1_0'
+
- x: 8
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/1_1'
+
- kind: Grid
+
spec:
+
display:
+
title: pds metrics
+
items:
+
- x: 0
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/2_0'
+
- x: 8
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/2_1'
+
- kind: Grid
+
spec:
+
display:
+
title: gazesys
+
items:
+
- x: 0
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/3_0'
+
- x: 8
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/3_1'
+
- kind: Grid
+
spec:
+
display:
+
title: forgejo
+
items:
+
- x: 0
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/4_0'
+
duration: 30m
+
refreshInterval: 1m
+6
hosts/trimounts/modules/tangled.nix/default.nix
···
+
{
+
imports = [
+
./knot.nix
+
./spindle.nix
+
];
+
}
+39
hosts/trimounts/modules/tangled.nix/knot.nix
···
+
{
+
config,
+
inputs,
+
terra,
+
...
+
}:
+
let
+
knotCfg = config.services.tangled.knot;
+
in
+
{
+
imports = [
+
"${inputs.tangled}/nix/modules/knot.nix"
+
];
+
+
services.tangled.knot = {
+
enable = true;
+
package = terra.tangled-knot;
+
gitUser = "git";
+
motdFile = ./motd;
+
server = {
+
listenAddr = "0.0.0.0:7777";
+
hostname = "knot.gaze.systems";
+
owner = "did:plc:dfl62fgb7wtjj3fcbb72naae";
+
};
+
};
+
+
security.acme.certs."gaze.systems".extraDomainNames = [ knotCfg.server.hostname ];
+
+
services.nginx.virtualHosts.${knotCfg.server.hostname} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/" = {
+
proxyPass = "http://${knotCfg.server.listenAddr}";
+
proxyWebsockets = true;
+
};
+
};
+
}
+5
hosts/trimounts/modules/tangled.nix/motd
···
+
+
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+
┃ *paws at your commits* arf :3c ┃
+
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+
+64
hosts/trimounts/modules/tangled.nix/spindle.nix
···
+
{
+
lib,
+
config,
+
inputs,
+
terra,
+
...
+
}:
+
let
+
spindleCfg = config.services.tangled.spindle;
+
in
+
{
+
imports = [
+
"${inputs.tangled}/nix/modules/spindle.nix"
+
];
+
+
services.tangled.spindle = {
+
enable = true;
+
package = terra.tangled-spindle;
+
server = {
+
listenAddr = "0.0.0.0:7391";
+
hostname = "spindle.gaze.systems";
+
owner = "did:plc:dfl62fgb7wtjj3fcbb72naae";
+
# secrets = {
+
# provider = "openbao";
+
# openbao.proxyAddr = "http://spindle.bao.lan.gaze.systems";
+
# };
+
secrets.provider = "sqlite";
+
};
+
};
+
users.users.spindle = {
+
group = "spindle";
+
isSystemUser = true;
+
};
+
users.groups.spindle = { };
+
users.groups.podman.members = [ "spindle" ];
+
systemd.services.spindle = {
+
# after = lib.mkForce [ "network.target" "openbao-proxy-spindle.service" ];
+
serviceConfig = {
+
User = "spindle";
+
Group = "spindle";
+
};
+
};
+
+
security.acme.certs."gaze.systems".extraDomainNames = [ spindleCfg.server.hostname ];
+
+
services.nginx.virtualHosts.${spindleCfg.server.hostname} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/" = {
+
proxyPass = "http://${spindleCfg.server.listenAddr}";
+
proxyWebsockets = true;
+
};
+
};
+
+
virtualisation.docker.enable = lib.mkForce false;
+
virtualisation.podman = {
+
enable = true;
+
autoPrune.enable = true;
+
dockerCompat = true;
+
dockerSocket.enable = true;
+
};
+
}
+85
hosts/trimounts/modules/website.nix
···
+
{
+
config,
+
pkgs,
+
inputs,
+
...
+
}:
+
let
+
PUBLIC_BASE_URL = "https://gaze.systems";
+
modules = (pkgs.callPackage "${inputs.blog}/nix/modules.nix" { }).overrideAttrs (_: {
+
outputHash = "sha256-rzfSfiK8FSNFR+1QTwM/ltLZBprG9BoQsPmOt6IdXFc=";
+
});
+
pkg = pkgs.callPackage "${inputs.blog}/nix" {
+
inherit PUBLIC_BASE_URL;
+
gazesys-modules = modules;
+
};
+
port = 3003;
+
in
+
{
+
users.users.website = {
+
isSystemUser = true;
+
group = "website";
+
};
+
users.groups.website = { };
+
+
age.secrets.websiteConfig.file = ../../../secrets/websiteConfig.age;
+
+
systemd.services.website = {
+
description = "website";
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
environment = {
+
HOME = "/var/lib/website";
+
ORIGIN = PUBLIC_BASE_URL;
+
PORT = toString port;
+
WEBSITE_DATA_DIR = "/var/lib/website";
+
VITE_CLOUDINARY_CLOUD_NAME = "dgtwf7mar";
+
};
+
serviceConfig = {
+
User = "website";
+
ExecStart = "${pkg}/bin/website";
+
Restart = "on-failure";
+
RestartSec = 5;
+
WorkingDirectory = "/var/lib/website";
+
EnvironmentFile = config.age.secrets.websiteConfig.path;
+
KillSignal = "SIGKILL";
+
};
+
};
+
+
# systemd.services.annoy-keep-alive = {
+
# description = "keeps annoy peer connection alive";
+
# wantedBy = [ "multi-user.target" ];
+
# after = [ "network.target" ];
+
# serviceConfig = {
+
# Type = "oneshot";
+
# ExecStart = "${pkgs.curl}/bin/curl http://100.64.0.1:3111/";
+
# };
+
# };
+
# systemd.timers.annoy-keep-alive.timerConfig = {
+
# OnBootSec = "5 min";
+
# OnUnitActiveSec = "5 min";
+
# Unit = "annoy-keep-alive.service";
+
# };
+
+
services.nginx.virtualHosts."gaze.systems" = {
+
locations."/".proxyPass = "http://localhost:${toString port}";
+
locations."/annoy/ws/" = {
+
proxyWebsockets = true;
+
proxyPass = "http://100.64.0.9:3111/";
+
extraConfig = ''
+
rewrite ^/annoy/ws/(.*) /$1 break;
+
'';
+
};
+
locations."/annoy/ws" = {
+
proxyWebsockets = true;
+
proxyPass = "http://100.64.0.9:3111/";
+
extraConfig = ''
+
rewrite ^/annoy/ws(.*) /$1 break;
+
'';
+
};
+
};
+
+
services.nginx.virtualHosts."poor.dog" = {
+
locations."/".return = "301 https://gaze.systems$request_uri";
+
};
+
}
+28
hosts/wolumonde/modules/arpa.disabled
···
+
{ pkgs, ... }:
+
let
+
index = pkgs.writeText "index.txt" ''
+
hi there~
+
+
you are currently interfacing with one of the data endpoints
+
of entity with serial id /90008/. you may want to open a
+
connection to https://gaze.systems/about for more data.
+
+
/discord 90.008/
+
/bsky @poor.dog/
+
/email 90008@gaze.systems/
+
+
/dig +short TXT 9.0.0.0.8.e.f.1.5.0.7.4.0.1.0.0.2.ip6.arpa/
+
'';
+
root = pkgs.runCommand "root" { } ''
+
mkdir -p $out
+
ln -s ${index} $out/index.txt
+
'';
+
in
+
{
+
services.nginx.virtualHosts."9.0.0.0.8.e.f.1.5.0.7.4.0.1.0.0.2.ip6.arpa" = {
+
inherit root;
+
locations."/".index = "index.txt";
+
quic = true;
+
kTLS = true;
+
};
+
}
hosts/wolumonde/modules/arpa.nix hosts/trimounts/modules/arpa.nix
hosts/wolumonde/modules/atproto.nix hosts/wolumonde/modules/atproto.disabled
+2
hosts/wolumonde/modules/blog.nix hosts/wolumonde/modules/website.nix
···
};
users.groups.website = { };
+
age.secrets.websiteConfig.file = ../../../secrets/websiteConfig.age;
+
systemd.services.website = {
description = "website";
wantedBy = [ "multi-user.target" ];
+29
hosts/wolumonde/modules/clickee-proxy.disabled
···
+
{ config, terra, ... }:
+
let
+
port = 7145;
+
in
+
{
+
age.secrets.clickeeProxyConfig = {
+
file = ../../../secrets/clickeeProxyConfig.age;
+
};
+
+
systemd.services.clickee-proxy = {
+
description = "clickee-proxy";
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
environment = {
+
PORT = toString port;
+
};
+
serviceConfig = {
+
DynamicUser = true;
+
ExecStart = "${terra.clickee-proxy}/bin/clickee-proxy";
+
Restart = "on-failure";
+
RestartSec = 5;
+
EnvironmentFile = config.age.secrets.clickeeProxyConfig.path;
+
};
+
};
+
+
services.nginx.virtualHosts."poor.dog" = {
+
locations."/click".proxyPass = "http://localhost:${toString port}";
+
};
+
}
hosts/wolumonde/modules/clickee-proxy.nix hosts/trimounts/modules/clickee-proxy.nix
hosts/wolumonde/modules/email.nix hosts/wolumonde/modules/email.disabled
+33
hosts/wolumonde/modules/fluentbit.disabled
···
+
{
+
pkgs,
+
config,
+
lib,
+
...
+
}:
+
{
+
services.fluent-bit = {
+
enable = true;
+
settings = {
+
service.flush = 1;
+
pipeline.inputs = [
+
{
+
name = "node_exporter_metrics";
+
tag = "metrics.node";
+
scrape_interval = 5;
+
}
+
# {
+
# name = "dummy";
+
# tag = "logs.dummy";
+
# dummy = ''{"_msg": "dummy"}'';
+
# }
+
{
+
name = "fluentbit_metrics";
+
tag = "metrics.fluentbit";
+
scrape_interval = 5;
+
}
+
];
+
};
+
};
+
+
systemd.services.fluent-bit.serviceConfig.StateDirectory = "fluent-bit";
+
}
hosts/wolumonde/modules/fluentbit.nix hosts/trimounts/modules/fluentbit.nix
hosts/wolumonde/modules/forgejo.nix/default.nix hosts/wolumonde/modules/forgejo.disabled/default.nix
hosts/wolumonde/modules/forgejo.nix/public/assets/css/theme-edge-dark.css hosts/wolumonde/modules/forgejo.disabled/public/assets/css/theme-edge-dark.css
hosts/wolumonde/modules/forgejo.nix/public/assets/fonts/comic.woff2 hosts/wolumonde/modules/forgejo.disabled/public/assets/fonts/comic.woff2
hosts/wolumonde/modules/forgejo.nix/public/assets/fonts/comicbd.woff2 hosts/wolumonde/modules/forgejo.disabled/public/assets/fonts/comicbd.woff2
hosts/wolumonde/modules/forgejo.nix/public/assets/fonts/comici.woff2 hosts/wolumonde/modules/forgejo.disabled/public/assets/fonts/comici.woff2
hosts/wolumonde/modules/forgejo.nix/public/assets/img/favicon.png hosts/wolumonde/modules/forgejo.disabled/public/assets/img/favicon.png
hosts/wolumonde/modules/forgejo.nix/public/assets/img/grrr.webp hosts/wolumonde/modules/forgejo.disabled/public/assets/img/grrr.webp
hosts/wolumonde/modules/forgejo.nix/public/assets/img/logo.png hosts/wolumonde/modules/forgejo.disabled/public/assets/img/logo.png
hosts/wolumonde/modules/forgejo.nix/public/assets/img/wecode.gif hosts/wolumonde/modules/forgejo.disabled/public/assets/img/wecode.gif
hosts/wolumonde/modules/forgejo.nix/templates/base/head.tmpl hosts/wolumonde/modules/forgejo.disabled/templates/base/head.tmpl
hosts/wolumonde/modules/forgejo.nix/templates/base/head_navbar.tmpl hosts/wolumonde/modules/forgejo.disabled/templates/base/head_navbar.tmpl
hosts/wolumonde/modules/forgejo.nix/templates/home.tmpl hosts/wolumonde/modules/forgejo.disabled/templates/home.tmpl
+28
hosts/wolumonde/modules/hedgedoc.disabled
···
+
{ config, ... }:
+
let
+
cfg = config.services.hedgedoc.settings;
+
in
+
{
+
services.hedgedoc = {
+
enable = true;
+
settings = {
+
port = 3333;
+
domain = "doc.gaze.systems";
+
protocolUseSSL = true;
+
allowEmailRegister = false;
+
allowAnonymous = false;
+
allowAnonymousEdits = true;
+
allowFreeURL = true;
+
requireFreeURLAuthentication = true;
+
};
+
};
+
+
security.acme.certs."gaze.systems".extraDomainNames = [ cfg.domain ];
+
services.nginx.virtualHosts.${cfg.domain} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/".proxyPass = "http://${cfg.host}:${toString cfg.port}";
+
};
+
}
hosts/wolumonde/modules/hedgedoc.nix hosts/trimounts/modules/hedgedoc.nix
hosts/wolumonde/modules/limbusart.nix hosts/wolumonde/modules/limbusart.disabled
+67 -61
hosts/wolumonde/modules/nginx.nix
···
{
+
config,
lib,
inputs,
-
pkgs,
...
}:
{
services.nginx = {
enable = true;
-
package = pkgs.nginxQuic;
recommendedTlsSettings = true;
recommendedOptimisation = true;
recommendedGzipSettings = true;
···
users.users.nginx.extraGroups = [ "acme" ];
+
age.secrets.cfDnsEditToken.file = ../../../secrets/cloudflareDnsEdit.age;
security.acme = {
acceptTerms = true;
-
defaults.email = (import "${inputs.self}/personal.nix").emails.primary;
-
defaults.webroot = "/var/lib/acme/acme-challenge";
+
defaults = {
+
group = "nginx";
+
email = (import "${inputs.self}/personal.nix").emails.primary;
+
dnsProvider = "cloudflare";
+
credentialFiles = {
+
CF_DNS_API_TOKEN_FILE = config.age.secrets.cfDnsEditToken.path;
+
};
+
};
certs."poor.dog" = { };
certs."ptr.pet" = { };
certs."gaze.systems" = { };
···
forceSSL = true;
};
-
services.fluent-bit.settings = {
-
parsers = [
-
{
-
name = "nginx_json";
-
format = "json";
-
time_key = "time";
-
time_format = "%d/%b/%Y:%H:%M:%S %z";
-
}
-
];
-
pipeline = {
-
inputs = [
-
{
-
name = "nginx_metrics";
-
tag = "metrics.nginx";
-
status_url = "/nginx_status";
-
nginx_plus = false;
-
}
-
{
-
name = "tail";
-
tag = "logs.nginx";
-
path = "/var/log/nginx/*.log";
-
db = "/var/lib/fluent-bit/nginx-access.db";
-
"db.locking" = true;
-
buffer_chunk_size = "4m";
-
buffer_max_size = "32m";
-
parser = "nginx_json";
-
}
-
];
-
filters = [
-
{
-
name = "modify";
-
match = "logs.nginx";
-
Add = [ "name nginx" ];
-
}
-
];
-
};
-
};
+
# services.fluent-bit.settings = {
+
# parsers = [
+
# {
+
# name = "nginx_json";
+
# format = "json";
+
# time_key = "time";
+
# time_format = "%d/%b/%Y:%H:%M:%S %z";
+
# }
+
# ];
+
# pipeline = {
+
# inputs = [
+
# {
+
# name = "nginx_metrics";
+
# tag = "metrics.nginx";
+
# status_url = "/nginx_status";
+
# nginx_plus = false;
+
# }
+
# {
+
# name = "tail";
+
# tag = "logs.nginx";
+
# path = "/var/log/nginx/*.log";
+
# db = "/var/lib/fluent-bit/nginx-access.db";
+
# "db.locking" = true;
+
# buffer_chunk_size = "4m";
+
# buffer_max_size = "32m";
+
# parser = "nginx_json";
+
# }
+
# ];
+
# filters = [
+
# {
+
# name = "modify";
+
# match = "logs.nginx";
+
# Add = [ "name nginx" ];
+
# }
+
# ];
+
# };
+
# };
-
# need so fluent-bit can access nginx
-
systemd.services.fluent-bit.serviceConfig.SupplementaryGroups = lib.mkForce "systemd-journal nginx";
+
# # need so fluent-bit can access nginx
+
# systemd.services.fluent-bit.serviceConfig.SupplementaryGroups = lib.mkForce "systemd-journal nginx";
-
services.vmalert.instances."".rules.groups = [
-
{
-
name = "nginx-logs";
-
type = "vlogs";
-
interval = "1m";
-
rules = [
-
{
-
record = "nginx_request_count";
-
expr = "name:nginx | stats (res.statusCode) count() as total_requests";
-
}
-
{
-
record = "nginx_request_latency";
-
# filter out subscribeRepos requests because they are long polling http L
-
expr = "name:nginx | filter req.url:!/xrpc/com.atproto.sync.subscribeRepos | stats avg(requestTime) avg, quantile(0.5, requestTime) p50, quantile(0.9, requestTime) p90, quantile(0.99, requestTime) p99";
-
}
-
];
-
}
-
];
+
# services.vmalert.instances."".rules.groups = [
+
# {
+
# name = "nginx-logs";
+
# type = "vlogs";
+
# interval = "1m";
+
# rules = [
+
# {
+
# record = "nginx_request_count";
+
# expr = "name:nginx | stats (res.statusCode) count() as total_requests";
+
# }
+
# {
+
# record = "nginx_request_latency";
+
# # filter out subscribeRepos requests because they are long polling http L
+
# expr = "name:nginx | filter req.url:!/xrpc/com.atproto.sync.subscribeRepos | stats avg(requestTime) avg, quantile(0.5, requestTime) p50, quantile(0.9, requestTime) p90, quantile(0.99, requestTime) p99";
+
# }
+
# ];
+
# }
+
# ];
}
hosts/wolumonde/modules/nsid-tracker.nix hosts/wolumonde/modules/nsid-tracker.disabled
+152
hosts/wolumonde/modules/pds.disabled
···
+
{ lib, config, ... }:
+
let
+
pdsLocalhost = "http://localhost:${toString config.services.bluesky-pds.settings.PDS_PORT}";
+
in
+
{
+
services.nginx.virtualHosts.${config.services.bluesky-pds.settings.PDS_HOSTNAME} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
locations = {
+
# we need to proxy /xrpc for pds to work
+
# silly but i want root domain >:3
+
"/xrpc" = {
+
proxyPass = pdsLocalhost;
+
proxyWebsockets = true;
+
# pass ws headers so we can actually proxy the ws
+
extraConfig = ''
+
proxy_set_header id $request_id;
+
client_max_body_size 100M;
+
'';
+
# higher prio just to make sure
+
priority = 100;
+
};
+
"/xrpc/app.bsky.unspecced.getAgeAssuranceState".extraConfig = ''
+
default_type application/json;
+
add_header access-control-allow-headers "authorization,dpop,atproto-accept-labelers,atproto-proxy" always;
+
add_header access-control-allow-origin "*" always;
+
return 200 '{"lastInitiatedAt":"2025-07-14T14:22:43.912Z","status":"assured"}';
+
'';
+
}
+
# others
+
// (lib.genAttrs
+
[
+
"/account"
+
"/@atproto"
+
"/oauth"
+
"=/.well-known/oauth-protected-resource"
+
"=/.well-known/oauth-authorization-server"
+
]
+
(_: {
+
proxyPass = pdsLocalhost;
+
# higher prio just to make sure
+
priority = 100;
+
})
+
);
+
};
+
# setup pds stuff
+
services.bluesky-pds = {
+
enable = true;
+
settings = {
+
PDS_HOSTNAME = "gaze.systems";
+
PDS_PORT = 1334;
+
+
PDS_SERVICE_NAME = ''"gazing at the sky"'';
+
PDS_LOGO_URL = "https://gaze.systems/icons/gaze_site.webp";
+
+
PDS_RATE_LIMITS_ENABLED = "true";
+
PDS_INVITE_REQUIRED = "true";
+
+
PDS_DID_PLC_URL = "https://plc.directory";
+
PDS_BSKY_APP_VIEW_URL = "https://api.bsky.app";
+
PDS_BSKY_APP_VIEW_DID = "did:web:api.bsky.app";
+
PDS_REPORT_SERVICE_URL = "https://mod.bsky.app";
+
PDS_REPORT_SERVICE_DID = "did:plc:ar7c4by46qjdydhdevvrndac";
+
PDS_CRAWLERS = "https://bsky.network";
+
};
+
environmentFiles = [ config.age.secrets.pdsConfig.path ];
+
};
+
+
# services.fluent-bit.settings = {
+
# parsers = [
+
# {
+
# name = "pds_json";
+
# format = "json";
+
# time_key = "time";
+
# time_strict = false;
+
# }
+
# ];
+
# pipeline = {
+
# inputs = [
+
# {
+
# name = "systemd";
+
# tag = "logs.pds";
+
# systemd_filter = "_SYSTEMD_UNIT=bluesky-pds.service";
+
# }
+
# ];
+
# filters = [
+
# {
+
# name = "parser";
+
# match = "logs.pds";
+
# key_name = "MESSAGE";
+
# parser = "pds_json";
+
# }
+
# {
+
# name = "modify";
+
# match = "logs.pds";
+
# Rename = [ "msg _msg" ];
+
# }
+
# ];
+
# };
+
# };
+
+
# services.vmalert.instances."".rules.groups = [
+
# {
+
# name = "pds-logs";
+
# type = "vlogs";
+
# interval = "1m";
+
# rules = [
+
# {
+
# record = "pds_request_count";
+
# expr = "name:pds | stats (res.statusCode) count() as total_requests";
+
# }
+
# {
+
# record = "pds_response_latency";
+
# expr = "name:pds | stats avg(responseTime) avg, quantile(0.5, responseTime) p50, quantile(0.9, responseTime) p90, quantile(0.99, responseTime) p99";
+
# }
+
# ];
+
# }
+
# ];
+
+
# virtualisation = {
+
# podman = {
+
# enable = true;
+
# dockerCompat = true;
+
# defaultNetwork.settings.dns_enabled = true;
+
# };
+
# oci-containers.containers = {
+
# pds = {
+
# image = "ghcr.io/bluesky-social/pds:0.4";
+
# autoStart = true;
+
# environmentFiles = [ ./pds.env config.age.secrets.pdsConfig.path ];
+
# ports = [ "1334:1334" ];
+
# volumes = [
+
# "/var/lib/pds:/pds"
+
# ];
+
# extraOptions = [
+
# #"--network=host"
+
# "--label=io.containers.autoupdate=registry"
+
# ];
+
# };
+
# };
+
# };
+
# # This is the podman auto-update systemd timer.
+
# # If I start to rely on podman auto-update more, I should move this out of the PDS definition.
+
# systemd.timers."podman-auto-update" = {
+
# enable = true;
+
# timerConfig = {
+
# OnCalendar = "*-*-* 4:00:00";
+
# Persistent = true;
+
# };
+
# wantedBy = [ "timers.target" ];
+
# };
+
}
+2 -33
hosts/wolumonde/modules/pds.nix hosts/trimounts/modules/pds.nix
···
pdsLocalhost = "http://localhost:${toString config.services.bluesky-pds.settings.PDS_PORT}";
in
{
+
age.secrets.pdsConfig.file = ../../../secrets/pdsConfig.age;
+
services.nginx.virtualHosts.${config.services.bluesky-pds.settings.PDS_HOSTNAME} = {
useACMEHost = "gaze.systems";
forceSSL = true;
···
];
}
];
-
-
# virtualisation = {
-
# podman = {
-
# enable = true;
-
# dockerCompat = true;
-
# defaultNetwork.settings.dns_enabled = true;
-
# };
-
# oci-containers.containers = {
-
# pds = {
-
# image = "ghcr.io/bluesky-social/pds:0.4";
-
# autoStart = true;
-
# environmentFiles = [ ./pds.env config.age.secrets.pdsConfig.path ];
-
# ports = [ "1334:1334" ];
-
# volumes = [
-
# "/var/lib/pds:/pds"
-
# ];
-
# extraOptions = [
-
# #"--network=host"
-
# "--label=io.containers.autoupdate=registry"
-
# ];
-
# };
-
# };
-
# };
-
# # This is the podman auto-update systemd timer.
-
# # If I start to rely on podman auto-update more, I should move this out of the PDS definition.
-
# systemd.timers."podman-auto-update" = {
-
# enable = true;
-
# timerConfig = {
-
# OnCalendar = "*-*-* 4:00:00";
-
# Persistent = true;
-
# };
-
# wantedBy = [ "timers.target" ];
-
# };
}
+2
hosts/wolumonde/modules/perses.disabled/dashboards/.gitignore
···
+
# folder used to store the results of the `percli dac build` command
+
built
+28
hosts/wolumonde/modules/perses.disabled/dashboards/go.mod
···
+
module dash
+
+
go 1.24.2
+
+
require (
+
github.com/beorn7/perks v1.0.1 // indirect
+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
+
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
+
github.com/jpillora/backoff v1.0.0 // indirect
+
github.com/muhlemmer/gu v0.3.1 // indirect
+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
+
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
+
github.com/perses/perses v0.50.3 // indirect
+
github.com/prometheus/client_golang v1.20.5 // indirect
+
github.com/prometheus/client_model v0.6.1 // indirect
+
github.com/prometheus/common v0.63.0 // indirect
+
github.com/prometheus/procfs v0.15.1 // indirect
+
github.com/zitadel/oidc/v3 v3.36.1 // indirect
+
github.com/zitadel/schema v1.3.0 // indirect
+
golang.org/x/crypto v0.36.0 // indirect
+
golang.org/x/net v0.35.0 // indirect
+
golang.org/x/oauth2 v0.28.0 // indirect
+
golang.org/x/sys v0.31.0 // indirect
+
golang.org/x/text v0.23.0 // indirect
+
google.golang.org/protobuf v1.36.5 // indirect
+
gopkg.in/yaml.v2 v2.4.0 // indirect
+
gopkg.in/yaml.v3 v3.0.1 // indirect
+
)
+45
hosts/wolumonde/modules/perses.disabled/dashboards/go.sum
···
+
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
+
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+
github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE=
+
github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA=
+
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
+
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+
github.com/muhlemmer/gu v0.3.1 h1:7EAqmFrW7n3hETvuAdmFmn4hS8W+z3LgKtrnow+YzNM=
+
github.com/muhlemmer/gu v0.3.1/go.mod h1:YHtHR+gxM+bKEIIs7Hmi9sPT3ZDUvTN/i88wQpZkrdM=
+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
+
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+
github.com/perses/perses v0.50.3 h1:BHlU9qkCFCUSP4HP5p9GwophWcxm5Vnu6Fsrx8Fb/+w=
+
github.com/perses/perses v0.50.3/go.mod h1:oqfHLOrXERvEqECShqXPjHXqVukQxcoaaTM6ySRF7hU=
+
github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
+
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
+
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
+
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
+
github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k=
+
github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18=
+
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
+
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
+
github.com/zitadel/oidc/v3 v3.36.1 h1:1AT1NqKKEqAwx4GmKJZ9fYkWH2WIn/VKMfQ46nBtRf0=
+
github.com/zitadel/oidc/v3 v3.36.1/go.mod h1:dApGZLvWZTHRuxmcbQlW5d2XVjVYR3vGOdq536igmTs=
+
github.com/zitadel/schema v1.3.0 h1:kQ9W9tvIwZICCKWcMvCEweXET1OcOyGEuFbHs4o5kg0=
+
github.com/zitadel/schema v1.3.0/go.mod h1:NptN6mkBDFvERUCvZHlvWmmME+gmZ44xzwRXwhzsbtc=
+
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
+
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
+
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
+
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
+
golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc=
+
golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
+
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
+
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
+
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
+
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
+
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+334
hosts/wolumonde/modules/perses.disabled/dashboards/wolumonde.go
···
+
package main
+
+
import (
+
"flag"
+
"time"
+
+
"github.com/perses/perses/go-sdk"
+
"github.com/perses/perses/go-sdk/common"
+
dash "github.com/perses/perses/go-sdk/dashboard"
+
"github.com/perses/perses/go-sdk/panel"
+
panels "github.com/perses/perses/go-sdk/panel-group"
+
"github.com/perses/perses/go-sdk/panel/bar"
+
"github.com/perses/perses/go-sdk/panel/gauge"
+
"github.com/perses/perses/go-sdk/panel/stat"
+
"github.com/perses/perses/go-sdk/prometheus/query"
+
+
timeSeries "github.com/perses/perses/go-sdk/panel/time-series"
+
// promDs "github.com/perses/perses/go-sdk/prometheus/datasource"
+
)
+
+
func main() {
+
flag.Parse()
+
exec := sdk.NewExec()
+
+
var loadPanel = panels.AddPanel("load over 5 min",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Max: 2.0,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"node_load5",
+
query.SeriesNameFormat("load"),
+
),
+
),
+
)
+
var cpuPanel = panels.AddPanel("cpu usage",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "percent",
+
},
+
Max: 100.0,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
`sum by (cpu) (rate(node_cpu_seconds_total{mode=~"user|system"}[1m])) * 100`,
+
query.SeriesNameFormat("cpu {{cpu}}"),
+
),
+
),
+
)
+
var memoryPanel = panels.AddPanel("memory usage",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "bytes",
+
},
+
Max: 4000000000,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes",
+
query.SeriesNameFormat("current memory usage"),
+
),
+
),
+
)
+
+
var diskPanel = panels.AddPanel("disk usage /",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "bytes",
+
},
+
Max: 38000000000,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
`node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}`,
+
query.SeriesNameFormat("disk usage"),
+
),
+
),
+
)
+
+
// Gauge versions (percent unit)
+
var loadGaugePanel = panels.AddPanel("load over 5 min",
+
gauge.Chart(
+
gauge.Format(common.Format{Unit: "percent"}),
+
gauge.Max(100),
+
gauge.Calculation(common.MeanCalculation),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"node_load5 * 100 / count(count(node_cpu_seconds_total) by (cpu))",
+
query.SeriesNameFormat("load %"),
+
),
+
),
+
)
+
var cpuGaugePanel = panels.AddPanel("cpu usage",
+
gauge.Chart(
+
gauge.Format(common.Format{Unit: "percent"}),
+
gauge.Max(100),
+
gauge.Calculation(common.MeanCalculation),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
`sum by (cpu) (rate(node_cpu_seconds_total{mode=~"user|system"}[1m])) * 100`,
+
query.SeriesNameFormat("cpu {{cpu}}"),
+
),
+
),
+
)
+
var memoryGaugePanel = panels.AddPanel("memory usage",
+
gauge.Chart(
+
gauge.Format(common.Format{Unit: "percent"}),
+
gauge.Max(100),
+
gauge.Calculation(common.MeanCalculation),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) * 100 / node_memory_MemTotal_bytes",
+
query.SeriesNameFormat("memory usage %"),
+
),
+
),
+
)
+
var diskGaugePanel = panels.AddPanel("disk usage /",
+
gauge.Chart(
+
gauge.Format(common.Format{Unit: "percent"}),
+
gauge.Max(100),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
`(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) * 100 / node_filesystem_size_bytes{mountpoint="/"}`,
+
query.SeriesNameFormat("disk usage %"),
+
),
+
),
+
)
+
+
var resPanels = dash.AddPanelGroup("resource usage",
+
panels.PanelsPerLine(4),
+
loadGaugePanel, cpuGaugePanel, memoryGaugePanel, diskGaugePanel,
+
loadPanel, cpuPanel, memoryPanel, diskPanel,
+
)
+
+
var nginxPanel = panels.AddPanel("nginx requests / min",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "decimal",
+
},
+
},
+
),
+
timeSeries.WithVisual(timeSeries.Visual{
+
Display: timeSeries.BarDisplay,
+
Palette: timeSeries.Palette{
+
Mode: timeSeries.CategoricalMode,
+
},
+
Stack: timeSeries.AllStack,
+
}),
+
timeSeries.WithLegend(timeSeries.Legend{
+
Position: timeSeries.BottomPosition,
+
Size: timeSeries.SmallSize,
+
}),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"nginx_request_count",
+
query.SeriesNameFormat("{{res.statusCode}}"),
+
),
+
),
+
)
+
+
var nginxLatencyPanel = panels.AddPanel("nginx latency / min",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "seconds",
+
},
+
Max: 0.5,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"nginx_request_latency",
+
query.SeriesNameFormat("{{stats_result}}"),
+
),
+
),
+
)
+
+
var nginxPanels = dash.AddPanelGroup("nginx metrics",
+
panels.PanelsPerLine(3),
+
nginxPanel,
+
nginxLatencyPanel,
+
)
+
+
var pdsPanel = panels.AddPanel("pds requests / min",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "decimal",
+
},
+
},
+
),
+
timeSeries.WithVisual(timeSeries.Visual{
+
Display: timeSeries.BarDisplay,
+
Palette: timeSeries.Palette{
+
Mode: timeSeries.CategoricalMode,
+
},
+
Stack: timeSeries.AllStack,
+
}),
+
timeSeries.WithLegend(timeSeries.Legend{
+
Position: timeSeries.BottomPosition,
+
Size: timeSeries.SmallSize,
+
}),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"pds_request_count",
+
query.SeriesNameFormat("{{res.statusCode}}"),
+
),
+
),
+
)
+
+
var pdsLatencyPanel = panels.AddPanel("pds latency / min",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "milliseconds",
+
},
+
Max: 500,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"pds_response_latency",
+
query.SeriesNameFormat("{{stats_result}}"),
+
),
+
),
+
)
+
+
var pdsPanels = dash.AddPanelGroup("pds metrics",
+
panels.PanelsPerLine(3),
+
pdsPanel,
+
pdsLatencyPanel,
+
)
+
+
var anubisForgejoPanel = panels.AddPanel("anubis policy actions",
+
bar.Chart(),
+
panel.AddQuery(
+
query.PromQL(
+
"anubis_policy_results",
+
query.SeriesNameFormat("{{action}}: {{rule}}"),
+
),
+
),
+
)
+
+
var forgejoPanels = dash.AddPanelGroup("forgejo",
+
panels.PanelsPerLine(3),
+
anubisForgejoPanel,
+
)
+
+
var gazesys_visit_panel = panels.AddPanel("gazesys visits",
+
bar.Chart(),
+
panel.AddQuery(
+
query.PromQL(
+
"gazesys_visit_real_total + gazesys_visit_fake_total",
+
query.SeriesNameFormat("total visits"),
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"gazesys_visit_fake_total",
+
query.SeriesNameFormat("(ai) bot visits"),
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"gazesys_visit_real_total",
+
query.SeriesNameFormat("real visits"),
+
),
+
),
+
)
+
+
var gazesys_pet_panel = panels.AddPanel("gazesys pet",
+
stat.Chart(
+
stat.Format(common.Format{
+
Unit: "decimal",
+
ShortValues: true,
+
DecimalPlaces: 0,
+
}),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"gazesys_pet_bounce_total",
+
query.SeriesNameFormat("bounce count"),
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"gazesys_pet_distance_total",
+
query.SeriesNameFormat("distance travelled"),
+
),
+
),
+
)
+
+
var gazesys_panels = dash.AddPanelGroup("gazesys",
+
panels.PanelsPerLine(3),
+
gazesys_visit_panel, gazesys_pet_panel,
+
)
+
+
builder, buildErr := dash.New("wolumonde",
+
dash.ProjectName("private-infra"),
+
dash.Duration(30*time.Minute),
+
dash.RefreshInterval(time.Minute),
+
resPanels, nginxPanels, pdsPanels, gazesys_panels, forgejoPanels,
+
)
+
exec.BuildDashboard(builder, buildErr)
+
}
hosts/wolumonde/modules/perses.nix/dashboards/.gitignore hosts/trimounts/modules/perses.nix/dashboards/.gitignore
hosts/wolumonde/modules/perses.nix/dashboards/go.mod hosts/trimounts/modules/perses.nix/dashboards/go.mod
hosts/wolumonde/modules/perses.nix/dashboards/go.sum hosts/trimounts/modules/perses.nix/dashboards/go.sum
hosts/wolumonde/modules/perses.nix/dashboards/wolumonde.go hosts/trimounts/modules/perses.nix/dashboards/wolumonde.go
hosts/wolumonde/modules/perses.nix/default.nix hosts/wolumonde/modules/perses.disabled/default.nix
hosts/wolumonde/modules/perses.nix/provision/1-private-infra.yaml hosts/wolumonde/modules/perses.disabled/provision/1-private-infra.yaml
hosts/wolumonde/modules/perses.nix/provision/2-admin-role.yaml hosts/wolumonde/modules/perses.disabled/provision/2-admin-role.yaml
hosts/wolumonde/modules/perses.nix/provision/3-admin-bind-role.yaml hosts/wolumonde/modules/perses.disabled/provision/3-admin-bind-role.yaml
hosts/wolumonde/modules/perses.nix/provision/4-victoria.yaml hosts/wolumonde/modules/perses.disabled/provision/4-victoria.yaml
hosts/wolumonde/modules/perses.nix/provision/6-guest-role.yaml hosts/wolumonde/modules/perses.disabled/provision/6-guest-role.yaml
hosts/wolumonde/modules/perses.nix/provision/7-guest-role-bind.yaml hosts/wolumonde/modules/perses.disabled/provision/7-guest-role-bind.yaml
hosts/wolumonde/modules/perses.nix/provision/90-wolumonde.yaml hosts/wolumonde/modules/perses.disabled/provision/90-wolumonde.yaml
+30
hosts/wolumonde/modules/pocket-id.disabled
···
+
{ config, ... }:
+
let
+
domain = "id.gaze.systems";
+
in
+
{
+
services.pocket-id = {
+
enable = true;
+
settings = {
+
APP_URL = "https://${domain}";
+
TRUST_PROXY = true;
+
PORT = 6823;
+
ANALYTICS_DISABLED = true;
+
};
+
};
+
+
security.acme.certs."gaze.systems".extraDomainNames = [ domain ];
+
+
services.nginx.virtualHosts.${domain} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/".proxyPass = "http://localhost:${toString config.services.pocket-id.settings.PORT}";
+
locations."/".extraConfig = ''
+
proxy_busy_buffers_size 512k;
+
proxy_buffers 4 512k;
+
proxy_buffer_size 256k;
+
'';
+
};
+
}
hosts/wolumonde/modules/pocket-id.nix hosts/trimounts/modules/pocket-id.nix
-1
hosts/wolumonde/modules/secrets.nix
···
{ lib, ... }:
{
# age.secrets.bernbotToken.file = ../../../secrets/bernbotToken.age;
-
age.secrets.websiteConfig.file = ../../../secrets/websiteConfig.age;
age.secrets.pdsConfig.file = ../../../secrets/pdsConfig.age;
# age.secrets.wgWolumondeKey = {
# file = ../../../secrets/wgWolumondeKey.age;
hosts/wolumonde/modules/tangled.nix/default.nix hosts/wolumonde/modules/tangled.disabled/default.nix
hosts/wolumonde/modules/tangled.nix/knot.nix hosts/wolumonde/modules/tangled.disabled/knot.nix
hosts/wolumonde/modules/tangled.nix/motd hosts/wolumonde/modules/tangled.disabled/motd
hosts/wolumonde/modules/tangled.nix/spindle.nix hosts/wolumonde/modules/tangled.disabled/spindle.nix
hosts/wolumonde/modules/unbound.nix hosts/wolumonde/modules/unbound.disabled
+70
hosts/wolumonde/modules/victoria.disabled
···
+
{ lib, config, ... }:
+
let
+
# syslogUdp = 5113;
+
metricsPort = 8428;
+
logsPort = 9428;
+
in
+
{
+
services.victoriametrics = {
+
enable = true;
+
listenAddress = ":${toString metricsPort}";
+
};
+
+
services.victorialogs = {
+
enable = true;
+
listenAddress = ":${toString logsPort}";
+
# extraOptions = ["-syslog.listenAddr.udp=:${toString syslogUdp}" "-journald.maxRequestSize=1024000000"];
+
};
+
+
services.vmalert.instances."" = {
+
enable = true;
+
settings =
+
let
+
l = "http://localhost";
+
in
+
{
+
"datasource.url" = "${l}${config.services.victorialogs.listenAddress}";
+
"remoteWrite.url" = "${l}${config.services.victoriametrics.listenAddress}";
+
"remoteRead.url" = "${l}${config.services.victoriametrics.listenAddress}";
+
"rule.defaultRuleType" = "vlogs";
+
};
+
};
+
+
services.fluent-bit.settings.pipeline.outputs = [
+
# write metrics to victoriametrics via prometheus
+
{
+
name = "prometheus_remote_write";
+
match = "metrics.*";
+
port = lib.removePrefix ":" config.services.victoriametrics.listenAddress;
+
uri = "/api/v1/write";
+
}
+
{
+
name = "http";
+
match = "logs.*";
+
port = lib.removePrefix ":" config.services.victorialogs.listenAddress;
+
uri = "/insert/jsonline?_stream_fields=stream&_msg_field=log&_time_field=date";
+
format = "json_lines";
+
json_date_format = "iso8601";
+
}
+
# write logs via syslog
+
# {
+
# name = "syslog";
+
# match = "*.log";
+
# port = syslogUdp;
+
# syslog_maxsize = 4096;
+
# syslog_severity_key = "severity";
+
# syslog_facility_key = "facility";
+
# syslog_hostname_key = "hostname";
+
# syslog_appname_key = "appname";
+
# syslog_procid_key = "procid";
+
# syslog_msgid_key = "msgid";
+
# syslog_sd_key = "sd";
+
# syslog_message_key = "message";
+
# }
+
];
+
+
# services.journald.upload = {
+
# enable = true;
+
# settings.Upload.URL = "http://localhost${config.services.victorialogs.listenAddress}/insert/journald";
+
# };
+
}
hosts/wolumonde/modules/victoria.nix hosts/trimounts/modules/victoria.nix
secrets/clickeeProxyConfig.age

This is a binary file and will not be displayed.

+22
secrets/cloudflareDnsEdit.age
···
+
age-encryption.org/v1
+
-> ssh-rsa Abmvag
+
RLzSHns6rm+PKThSJC768KmC2a9odftJWSSWqNR36LA5wb1wU5YpP/EHt6P50AY/
+
JsFPydPP+XTso4rSclWuW1gjEEzfQdwBJy0c9QNo6WRwtLsR2jLC/VBULqTPsHUH
+
bSR138+wtdICBLRMY71VvEcdrtONMm8dqc/STV5e270yDU+HtCW2Vwxu837CpUzQ
+
6xHV1NDURR5NugjQspW3mVBrFSx7OpE2iGrSYsCzXNpFK9JsC40yG/YZzqf2ktM4
+
BlWTNGRd2M/QOXwCOOdsgQHfN4DtHBR/nrC+sdauJahKxSR0RVB2jQgrH2LsmnB9
+
Xh8ttoYKwkVHQmOEUbtCnqKpzf7qGqyRX2+smkGaB2RzSxhNmUEmdV0dAEMXtGZd
+
aBFMw233WioqNygHxfgYkUtA2jFjBEVeAp74iKH7fB1/8fKa+SSeLEcv/IuIAOSp
+
WjqI7El5U882SviAyMuQ6hzWBLejCNBueZTgJVR0Iyk0fTjeLNM4rhqTQswyDjBh
+
7jnjAgVMaqZTRHrQFkBimkjX3QXutvRcjyutY3niUNRCZacvJ8bVIuIhNbqFOLJR
+
Io/bRwys/qR1a44GFMxbQG6Hm0NRIIK791cxxilZpnNiJHs02TLTXzuIq0bfTssz
+
3FjUZa6Oaerum2I/BidWJuYm4Cm6tJuftYn7XS1q+4I
+
-> ssh-ed25519 y5W/qA /qpByEN29ydHS/WgwLlOQjby7fYCI7hDOUSMJ+s0ZHA
+
Je4qhR22hERajFv/7EbQodKo4ldYqsrUgFdtt1KbXUA
+
-> ssh-ed25519 KjIL7g v+JVYql3+Tm/eam/1Vl/VSN97rq/8idFMcea1u7JEgE
+
bqgK9JhL1CF9O/35WzOj3J2fHSUQcMesbamMatJRBbk
+
-> ssh-ed25519 LaQclg u0qjpT1TcL0sAapagUr6opDbr3FRFsTtnK9wEoIJvxM
+
Uof2ZOkgEtdY301j0Ql6i9+WjQusspUvn1kMGgaSfp0
+
--- 8kcgq1sQjU2uSmskmkb3SUmsXubI1HtWBhs2RuuVJcE
+
�5��;�h9���#`c֎�
+
����9�k�4�S 鯘��L:�/����׀P}a��oՇ:$��.����
secrets/develMobiTailscaleAuthKey.age

This is a binary file and will not be displayed.

secrets/headscaleOidcSecret.age

This is a binary file and will not be displayed.

secrets/nixGithubAccessToken.age

This is a binary file and will not be displayed.

+19 -17
secrets/pdsConfig.age
···
age-encryption.org/v1
-> ssh-rsa Abmvag
-
Ti+WByG/+vCEtMtvVSUYqnjhLnL6gmVHj+8+ARD12zrfV+l0LZxW7TFGqWvtQ+9N
-
0aCa5AGao4ngjom0JHhFm+DzklR13V6FyB1zAQugBuPDlJFPPZmRH9jTMpbiRWK0
-
+uAFreWIkRtsYrOYaFOWIVOUxAl7immdbx7y55Q6u55y936t8aRRP+r8LCIsd+5E
-
dlWmxTRyYBXG4MNkCfyDeuvCnFxGFlmPXVqJeXyHBL+/Gw4nLzMvRM0PQqlkOLeS
-
DfJUpeWT0fptykuf7nmYr0sYembv4pks9E4lLNJ51PcdR2NqC4Aaq6s9+dM+b9Yg
-
p8Zg7HvCWxlSeNuf/gnu5jisj93ImrwJJSpkSv+AqThGkVtRpN6gzErSXPOQe9tn
-
RuESiumGO+Thh8+1F9iMitCm9pvVDkBrVDPmTBZS5xT8v67VcIcCmkmfh1Svq/di
-
dWhMereLu9oXd9Nudtg3uvlzWp68kCAQFjOVyhi6Li15FuPw+vvkc72c2OPv9AeZ
-
vNmIuaCHLa5VIPqOPJEaLGMuHSd80TFCAhYq4laca9gg6cgufyGlFCR4SVXA9qy8
-
Gi8SI+wdBbi5+RKveju2/58Wbas6oIqmP6IOgTibwYl3uQ8EE4YhG1QocChN553X
-
0pjhtSBTyXgVuy3bqz5eA4QAkCcDocwT/4R4eaNGLW0
-
-> ssh-ed25519 KjIL7g QPvc+LbTi8URL1atJNHHalHRyVGlz7pmrbOeMtjP6gM
-
lH3IhynTXpQ3Z4hFGn4bJZ/vEWte7qZqeAhixghjoe8
-
--- rIrWSZf0Q7b4fWtd9+gXxJpD9AoC0xWE7iWkUGCekDc
-
��)����ϲX� 0)��J�!���x�'E���vp�O�N~�23x��"��(Q�0�f_]7��ב��V�e���]+_/;:ؿ�g<.rJ��>W�R�K"�L#��/��+�Ƴ3M*Õ��:�Q'L��-}�#�Y�p������I
-
��Dm���{��ܫ�L��s��b�;�
-
c*�ݷ�u�m�����+^d�ؓ�0k2yty��>����������F�L&����qk����Ⱦ��c �Y'{�,�G�V��tS�I���7�W�� ��Qp���a�f{f�2O`x�=��y��7�ߓ�}��{=﷋�Í�O����P0�=f�P�B\p���l�.��F�����bm|Oл;-��ǾS�����Ғ�_Ԥ
+
SbNEqnr2eT0YR293LnQtJInXLmx7g+iCJwnZ4GmmEM2euePiEY69s8lRQUb7MQU8
+
xghOLEo/gr74/wtrOUf+4Ge3OM8KiAZt3QLuREJYz1xI6+gnMaievWbinAA+Ly0L
+
KdmFyshVGl+xKA0QPpc6fTO4XnAEH0g5Rg5upZoAfRARmOYeIQvXaWW2ehjI1Izw
+
RINcoszonp5egzZ9QJ6huruT2actz2XIAsZX/0NYQdjC6xmChxfTOxuXQskbzzyK
+
42eholIkf/5fYre4HmB7ePKuZeUeVRhK0RYemBq/ZNNUCf1ExjE/wDKTWpuPOafV
+
J2/7kP7OkwIEeEYXvLPvYM2HRasIbDUBmLOlj7L4E8BgMzKV7FmCr2n27m7iCjhz
+
y0sTpEk1y2N/rDvc/GCuZNtGNZIrbfzGaz5fhgegvO0Jogc2km4LVaEOQlA+AI5w
+
fxew6hCZkISaw+CjNaBOk45XXhMsONfW63uba6kgzj3h2+9jG1UmEPJAuNdgkjze
+
32lBZ58np+cA+aENt4sZu5nKk90Rsq54aNntfaHuFMFIfvK4RZj3HwHCAND+9XJ1
+
SNkNetcehX9jzZYm5Npnlhleft92TACYbtIIoi/zqgYMLDaHeAW6ZDAnW9sgO7mo
+
uSVwa8Gf5SwUY6v8IgVDwQVHiq8WTtRgRJmImP/mvS4
+
-> ssh-ed25519 KjIL7g tRXe9XXGtJyjCQuHU4oD7L5veJ8BKCFHUdXuSAa6/D4
+
vjVwtS7dKxTkjGHeLzV0G2uzIyEYaaSLplxOvfApIa0
+
-> ssh-ed25519 LaQclg 81iLpPZTOiW2ZNnfy8lErpeHiQoTtIpariQ5153Nwl4
+
5wqZUoo5CxEPHwVy9SSspvECTWAQ8qgjbj44WCx/kdw
+
--- z1wPplzF3WsIHxojXxcZnq91akMO+Hj1WFth2ujJAvY
+
�X RM�V˛a^�Z2A욓ר)h���h�� hV�Z��e&�.��l��ɉ/n�aIد-��q��(�id� DT
+
�d�e��T�cHiɂ*^�4��+�?� �����y��-nD=��]��(������ѝG�Z���ɲ���P�w9�g��j>��d��Ϥ�������F�t�~��P�QS� ,z�%Ad�E�t=�R�B�ُܱ~����7��ެ{1=�� ����kOV=W3���e��CN��q�Ϥ���.\���n�wW����c�R;G
+
�6�f"�W����7f_�MZ;���.Х�Ѓ�@���3���Ǫ&,��1�ܕ�����]l�J�L!a֟� �r��}9 ��o@�.]��ƈ�fS����=�@��
+17 -16
secrets/persesSecret.age
···
age-encryption.org/v1
-> ssh-rsa Abmvag
-
gnRXwWRObKH5JCBDDPVRDHsgSj4m3zwOHAFLDAXTmWjs0mVNKSu5AFtKkoJuUuzs
-
RQFGn3b4pv6duPjpEW4t0DBkAOCwgqTqvF3oSKNBSDuhNU4+XzCJgBZDesO3VZ/S
-
zZxM8kq14sM484pZSRI0A86VNSlR7q8lyF1kth+bn5dum7Ihq87Re6jW+OyFwL7L
-
tkTON5L4aMqjI4fMQl/PcRU+04sYkKug6JQO/DDyFXvjvROuO43ZChjqGGj4ol9b
-
mXPOJuabzUtWGoTwg7+IHhbyUbanoO+2gCMejRGbZbBTh+bOftNx0bvNj8lrxgit
-
oE5sXhqPeI9BhOGWiJvR+32YdHl2WRYQ/7nNdWsnA0UuiPRHPu827g91NrVgjxBk
-
SpgoabwZpCUl8GlfihtTvw3NbV6WnIUv0ew9bwlyf129uvH7Rn61o0JMnq5m37Zt
-
rJjLJ262zIdb4eS1QgycI+ugeb290Vh22niTLLKoJxAFdLyzSr84XsfUVyrjhJfz
-
Ll+12c7ApTcgwhuhOkFLmU8SUNwxhH523fV8zcQ/1E9yjpa26qQcTF+ujRV8FIwb
-
kVGLDHUXehU5gm/nsuQVaULYHRC50pvu7wKKZsj0UqdQeKCx1CwBOdFk6Qctxl9N
-
VvAenIra/FVImcrimQ/sNCeg8UasT+gvbY5KjhwPzkY
-
-> ssh-ed25519 KjIL7g +FQdRCFxlkayD4Hq9xb4WCE139upxkpSrvh7412gqlo
-
jxDJlUgJZfftyeyhikKi4zLhtM6fVXxAGMmD7gcQZgM
-
--- OXRvMmNqRzo4NGF4ihpPSHu77W8dH45HwJJIDI3hUCY
-
&}͘8��;YX5
-
�$m3�1r['�%<7�����W�D��h�0�%��C$�Il1;ɛl�1�i�A��E�z��,n݆�|b�?2N�}�m/Ӈ�
+
IC9ZInud32ueWR3owngph/eKReklaRfgY6bDKDmA0OT5IEvisOYK8lhGwAzOZdIq
+
i+K5p7C30qe1+1fmZ3ZNcQMKeIq79LdpiR7Xb6DT+BAT5g++wsXqqsvxZYyR4Ux7
+
dPxr05VJXE6HkoUQ2gcG/rlED1M7EoRq1TBm1UV4wIDiWy/ZdZZRvM8C++CD2h4V
+
d4cLoDzVZxYdi3s+NRXpbg62fIO//suAYvlMjbKQasEBWv88R8rwj5br+o/AbCR8
+
hkjctI+EuMHzq7hwlZ211hb/HDLnFckWmIao9Hvw6PpyFMIUmuQWsgn6yHQ6zJQx
+
zIXNgAYpX5bR8i0VXvwNwlfWOOqNcOU4QD7ZO4qFs+ZYTlHvo1m1RNhDIBbhC9UM
+
v3C8fU0RTaWhUkcacXn3VXBiJIHXzFLiAfxQ1ft5HPOjsOOhHwphMFwblCukTJ45
+
SNVErkK32YeW6J0nyQGHRNHNSgbZC274caZ8R3nlTynkYRoF6/dy7Q1OLNILF4Vd
+
qW54oLZs9A6ralFkDfObl4rxOcz4HPdwH9p/kWzW1C1IrfZk0m5eOppFzZ2fUHra
+
FED8mJ0vH5E0oCL7JBDVx3A+Ss5vj7zpJePL10UQvfWI8qUIXHZT6wbIt/XfRvtq
+
rbr0g9tQtnnpOMJwgu1GzL1xQWGelAS8pvV8GPb5Vvg
+
-> ssh-ed25519 KjIL7g 0DtiBKi0aL82kjE3AgAbwkCw+fuIWXMvzi52eem0JgM
+
ujkcowuy/vokA+jqV7d5RcZGeg2yhzh8IdQQHJ/wZns
+
-> ssh-ed25519 LaQclg m/1lrK8ks3LlAQYG0/85pZiyQvhh16/Y5bX+k9HPpgU
+
zJD9xgF9GuHGHYSkczPGllccYqW7y/+UZrlCveFJIt4
+
--- ZM1sl++OddBxYlx8/57o/BWcSsU3rHQ41q7cJCoZiPs
+
�C{���9�C�yC��'�]����P�X��n��ZD��}�q2�[�@�R8�h���'����a�:�B2X��}<5��D�����6�������p���*��
+11 -1
secrets/secrets.nix
···
yusdacra = builtins.readFile ./yusdacra.key.pub;
wolumonde = builtins.readFile ./wolumonde.key.pub;
dzwonek = builtins.readFile ./dzwonek.key.pub;
+
trimounts = builtins.readFile ./trimounts.key.pub;
develMobi = builtins.readFile ./develMobi.key.pub;
in
{
···
"websiteConfig.age".publicKeys = [
yusdacra
wolumonde
+
trimounts
];
"pdsConfig.age".publicKeys = [
yusdacra
wolumonde
+
trimounts
];
"clickeeProxyConfig.age".publicKeys = [
yusdacra
wolumonde
+
trimounts
];
-
"deployWebhook.age".publicKeys = [ yusdacra ];
"persesSecret.age".publicKeys = [
yusdacra
wolumonde
+
trimounts
];
"headscaleOidcSecret.age".publicKeys = [
yusdacra
···
"develMobiTailscaleAuthKey.age".publicKeys = [
yusdacra
develMobi
+
];
+
"cloudflareDnsEdit.age".publicKeys = [
+
yusdacra
+
dzwonek
+
wolumonde
+
trimounts
];
}
+1
secrets/trimounts.key.pub
···
+
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDLuA1/cZ/xTN4dv5U0fvD9Glo6HlF5YA4U1pvFjxx6V
secrets/websiteConfig.age

This is a binary file and will not be displayed.

+1 -1
users/modules/discord/default.nix
···
Service = {
Type = "simple";
-
ExecStart = "${pkgs.openssh}/bin/ssh -N -D 127.0.0.1:1337 root@wolumonde";
+
ExecStart = "${pkgs.openssh}/bin/ssh -N -D 127.0.0.1:1337 root@trimounts";
Restart = "on-failure";
RestartSec = "3s";
};