Compare commits

..

11 Commits

11 changed files with 342 additions and 12 deletions
+147
View File
@@ -0,0 +1,147 @@
{
"$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
"logo": {
"type": "builtin", // Logo type: auto, builtin, small, file, etc.
// "source": "arch",
"width": 10,
"height": 10,
"padding": {
"top": 3,
"left": 2,
"right": 2
},
"color": {
"1": "blue",
"2": "white",
"3": "cyan"
}
},
"display": { /* Display settings */},
"modules": [
"break",
{
"type": "custom",
"format": "\u001b[90m┌──────────────────────Hardware──────────────────────┐"
},
{
"type": "host",
"key": "󰌢 PC",
"keyColor": "green",
"format": "{2}"
},
{
"type": "cpu",
"key": "│ ├󱛠 ",
"keyColor": "green",
"format": "{1} | {4} @{6}"
},
{
"type": "gpu",
"key": "│ ├󰍹 ",
"keyColor": "green",
"format": "{2} | {7}"
},
{
"type": "memory",
"key": "│ ├󰑭 ",
"keyColor": "green",
"format": "{2}"
},
// {
// "type": "disk",
// "key": "└ └󰋊 ",
// "keyColor": "green"
// },
{
"type": "custom",
"format": "\u001b[90m└────────────────────────────────────────────────────┘"
},
"break",
{
"type": "custom",
"format": "\u001b[90m┌──────────────────────Software──────────────────────┐"
},
{
"type": "os",
"key": " OS",
"keyColor": "yellow",
"format": " {2} {8}"
},
{
"type": "kernel",
"key": "│ ├󰌽 ",
"keyColor": "yellow",
"format": "{1} {2}"
},
{
"type": "bios",
"key": "│ ├󰖡 ",
"keyColor": "yellow"
},
{
"type": "packages",
"key": "│ ├󰏗 ",
"keyColor": "yellow"
},
{
"type": "de",
"key": "󰧨 DE",
"keyColor": "blue",
"format": "{2} | {3}"
},
{
"type": "lm",
"key": "│ ├󰍁 ",
"keyColor": "blue",
"format": "{1} {2} {3}"
},
{
"type": "wm",
"key": "│ ├󱂬 ",
"keyColor": "blue",
"format": "{2} {5}"
},
{
"type": "custom",
"format": "\u001b[90m└────────────────────────────────────────────────────┘"
},
"break",
{
"type": "custom",
"format": "\u001b[90m┌──────────────────────Age───────────────────────────┐"
},
{
"type": "command",
"key": " OS Age ",
"keyColor": "magenta",
"text": "birth_install=$(stat -c %W /); current=$(date +%s); time_progression=$((current - birth_install)); days_difference=$((time_progression / 86400)); echo $days_difference days"
},
{
"type": "command",
"key": " Update ",
"keyColor": "magenta",
"text": "nixos-rebuild list-generations | awk '$NF == \"True\" {print $2, $3}' | xargs -I {} date -d \"{}\" +\"%s\" | awk '{diff=systime()-$1; printf \"%d days, %d hours, %d mins\\n\", diff/86400, (diff%86400)/3600, (diff%3600)/60}'"
},
{
"type": "uptime",
"key": " Uptime ",
"keyColor": "magenta"
},
{
"type": "custom",
"format": "\u001b[90m└────────────────────────────────────────────────────┘"
},
{
"type": "colors",
"paddingLeft": 2,
"block": {
"width": 3,
"range": [
0,
15
]
} //,
//"symbol": "circle"
},
]
}
+1
View File
@@ -1,4 +1,5 @@
{ pkgs, config, ... }: { { pkgs, config, ... }: {
home.packages = with pkgs; [ fastfetch ]; home.packages = with pkgs; [ fastfetch ];
xdg.configFile."neofetch/config.conf".source = ./config.conf; xdg.configFile."neofetch/config.conf".source = ./config.conf;
xdg.configFile."fastfetch/config.jsonc".source = ./config.jsonc;
} }
@@ -0,0 +1,39 @@
{ config, containerCfg, pkgs, lib, builder, name,... }:
let
version = "latest";
serverCfg = config.syscfg.server;
in {
sops = false;
db = false;
paths = [
{
path = "${serverCfg.configPath}/calibre-web/";
mode = "0755";
dirs = ["library" "ingest"];
}
];
containers = {
server = builder.mkContainer {
subdomain = containerCfg.subdomain;
image = "crocodilestick/calibre-web-automated:${version}";
port = 8083;
# secret = name;
extraEnv = {
CWA_PORT_OVERRIDE = "8083";
PUID = "1000";
PGID = "1000";
#HARDCOVER_TOKEN= ....
TRUSTED_PROXY_COUNT= "1";
};
overrides = {
cmd = [ ];
volumes = [
"${serverCfg.configPath}/calibre-web/library/:/calibre-library"
"${serverCfg.configPath}/calibre-web/ingest/:/cwa-book-ingest"
];
};
};
};
}
@@ -0,0 +1,54 @@
{ config, containerCfg, pkgs, lib, builder, name, ... }:
let
version = "latest";
serverCfg = config.syscfg.server;
in {
sops = true;
db = true;
paths = [
{
path = "${serverCfg.configPath}/freshrss";
owner = "1000:1000";
mode = "0755";
}
];
containers = {
server = builder.mkContainer {
subdomain = containerCfg.subdomain;
image = "ghcr.io/freshrss/freshrss:${version}";
port = 80;
secret = name;
extraEnv = {
CRON_MIN = "5,35";
PUID = "1000";
PGID = "1000";
TRUSTED_PROXY = "10.0.0.0/8 192.168.0.1/16";
PUBLISHED_PORT = "80";
ADMIN_PASSWORD = "admin"; # Change this to a secure password in production!
ADMIN_API_PASSWORD = "admin"; # Change this to a secure password in production!
BASE_URL = "https://${containerCfg.subdomain}.${serverCfg.domain}";
SERVER_DNS = "${containerCfg.subdomain}.${serverCfg.domain}";
DB_HOST = "${builder.host}";
DB_BASE = "freshrss_db";
DB_USER = "freshrss_user";
};
overrides = {
volumes = [
"${serverCfg.configPath}/freshrss:/config"
];
};
};
};
setup = {
trigger = "server"; # Triggers atomic environment verification on main controller
envFile = config.sops.secrets."FRESHRSS".path;
script = pkgs.writeShellScript "setup-freshrss" ''
RSS_URL="https://${containerCfg.subdomain}.${serverCfg.domain}"
${pkgs.curl}/bin/curl -s -X POST "$RSS_URL/i/index.php?step=0" -H "Content-Type: application/x-www-form-urlencoded" --data-raw "language=en"
'';
};
}
+8 -6
View File
@@ -36,7 +36,8 @@ let
showStats = false; showStats = false;
statusStyle = "dot"; statusStyle = "dot";
hideErrors = true; hideErrors = true;
auth = { auth = lib.flatten [{}
(lib.optional (serverCfg.containers?authentik) {
oidc = { oidc = {
enabled = true; enabled = true;
provider = "authentik"; provider = "authentik";
@@ -46,7 +47,7 @@ let
groupsProperty = "groups"; groupsProperty = "groups";
}; };
}; })];
}; };
widgets = pkgs.writers.writeYAML "widgets.yaml" [ widgets = pkgs.writers.writeYAML "widgets.yaml" [
{openmeteo = { {openmeteo = {
@@ -56,16 +57,17 @@ let
units = "metric"; units = "metric";
cache = "15"; cache = "15";
};} };}
{search = { {search = lib.flatten [{
provider = "custom"; provider = "custom";
focus = true; focus = true;
showSearchSuggestions = true; showSearchSuggestions = true;
target = "_blank"; target = "_blank";
}
(lib.optional (serverCfg.containers?searxng) {
url = "https://${serverCfg.containers.searxng.subdomain}.${serverCfg.domain}/search?q="; url = "https://${serverCfg.containers.searxng.subdomain}.${serverCfg.domain}/search?q=";
suggestionUrl = "https://${serverCfg.containers.searxng.subdomain}.${serverCfg.domain}/autocompleter?q="; suggestionUrl = "https://${serverCfg.containers.searxng.subdomain}.${serverCfg.domain}/autocompleter?q=";
})
};} ];}
{stocks = { {stocks = {
provider = "finnhub"; provider = "finnhub";
color = true; color = true;
@@ -0,0 +1,36 @@
{ config, containerCfg, pkgs, lib, builder, name,... }:
let
version = "latest";
serverCfg = config.syscfg.server;
in {
sops = false;
db = false;
paths = [{
path = "${serverCfg.configPath}/selfmark/";
mode = "0444";
}];
containers = {
selfmark = builder.mkContainer {
subdomain = containerCfg.subdomain;
subpath = containerCfg.subpath;
image = "ghcr.io/calibrain/shelfmark:${version}";
port = 8080;
extraEnv = {
FLASK_PORT = "8080";
INGEST_DIR = "/books";
PUID = "1000";
PGID = "1000";
SEARCH_MODE = "universal";
};
overrides = {
ports = [ "8080:8080" ];
cmd = [ ];
volumes = [ ];
};
};
};
}
@@ -0,0 +1,33 @@
{ config, containerCfg, pkgs, lib, builder, name,... }:
let
version = "stable";
serverCfg = config.syscfg.server;
in {
sops = true;
db =true;
containers = {
server = builder.mkContainer {
subdomain = containerCfg.subdomain;
image = "ghcr.io/suwayomi/suwayomi-server:${version}";
port = 4567;
secret = name;
extraEnv = {
BIND_PORT = "4567";
AUTH_MODE = "none";
WEB_UI_ENABLED = "true";
DATABASE_URL = "postgresql://${builder.host}/suwayomi_db";
DATABASE_USER = "suwayomi_user";
FLARESOLVERR_ENABLED = lib.boolToString (builtins.elem "flaresolverr" (((config.syscfg.server.containers.servarr or {}).extra or {}).modules or []));
FLARESOLVERR_URL = "http://servarr-flaresolverr:8191";
};
overrides = {
volumes = [
];
};
};
};
}
+3
View File
@@ -30,11 +30,14 @@ in{
effectiveCfg = { effectiveCfg = {
owner = "root:root"; owner = "root:root";
mode = "0400"; mode = "0400";
dirs = [];
} // cfg; } // cfg;
in '' in ''
${pkgs.coreutils}/bin/mkdir -p "${effectiveCfg.path}" ${pkgs.coreutils}/bin/mkdir -p "${effectiveCfg.path}"
${lib.concatMapStringsSep "\n" (dir: "${pkgs.coreutils}/bin/mkdir -p ${effectiveCfg.path}/${lib.escapeShellArg dir}") effectiveCfg.dirs}
${pkgs.coreutils}/bin/chown ${effectiveCfg.owner} "${effectiveCfg.path}" ${pkgs.coreutils}/bin/chown ${effectiveCfg.owner} "${effectiveCfg.path}"
${pkgs.coreutils}/bin/chmod ${effectiveCfg.mode} "${effectiveCfg.path}" ${pkgs.coreutils}/bin/chmod ${effectiveCfg.mode} "${effectiveCfg.path}"
'') allPathConfigs); '') allPathConfigs);
}; };
+7
View File
@@ -39,3 +39,10 @@ IMMICH: |
SERVARR: | SERVARR: |
SONARR__AUTH__APIKEY=... SONARR__AUTH__APIKEY=...
RADARR__AUTH__APIKEY=... RADARR__AUTH__APIKEY=...
FRESHRSS: |
DB_PASSWORD=...
SUWAYOMI: |
DATABASE_PASSWORD=...
DB_PASSWORD=...
CALIBRE: |
DB_PASSWORD=...
+5 -2
View File
@@ -12,6 +12,9 @@ IMMICH: ENC[AES256_GCM,data:1y78yeawkRjUXLWPyFdMB5HCDQhb1PoxEMfHmKSZfv0CWloOrQWT
INVIDIOUS: ENC[AES256_GCM,data:ZfgU5UFMmG9Cx9UaR0xnKr9VPebG3kut0difTFZmoqOSs+stG6YJfV82OOhj1RQLVJlPr/scydYy1+3LytwvP1BT7tLe0jII7XupbkL0w3n79KBaiIzAPdicqLxeqjKH45I0NjHra4djdnO2Ff4T8CTiFDlPn1rMuiw=,iv:UaDmOKJ4bFPGCaIePLXkWot9E6sTu2nhaVs83sI38G0=,tag:spTjxWEmLfPc8BZl2GglBA==,type:str] INVIDIOUS: ENC[AES256_GCM,data:ZfgU5UFMmG9Cx9UaR0xnKr9VPebG3kut0difTFZmoqOSs+stG6YJfV82OOhj1RQLVJlPr/scydYy1+3LytwvP1BT7tLe0jII7XupbkL0w3n79KBaiIzAPdicqLxeqjKH45I0NjHra4djdnO2Ff4T8CTiFDlPn1rMuiw=,iv:UaDmOKJ4bFPGCaIePLXkWot9E6sTu2nhaVs83sI38G0=,tag:spTjxWEmLfPc8BZl2GglBA==,type:str]
SERVARR: ENC[AES256_GCM,data:757WdthmToCGr2boph7iW1ycs3tQyGgD3lhYOcX/X3hjs9dLLPCWGI2zt5axp72IGJ/sVYEop2rqsRLxdPn3VIyQLvQ+3MYdo8Z/yOuMy7DAlnITQQQUI2ylZKHVmFAt39/xBpwsVjh3m/hBQvn/LbCDtR2s4qa+8fQDfeZXksTtnf7YZbVygTF7jWZ+0oVvkvNO1ZUejvP+uHL+jHwgMEwQnR22hOYWEKZ1s7PI+EZHujqyOhnwXB4jRG+XD7R4N6AhC5Z+nmkFpy3ffszCJ0/H,iv:NrNbkL6GWN4r+uzxNYrhoECD1APbRsRBcMBbVHD3DwM=,tag:YK1O50wV+lHAQa6TX9huUw==,type:str] SERVARR: ENC[AES256_GCM,data:757WdthmToCGr2boph7iW1ycs3tQyGgD3lhYOcX/X3hjs9dLLPCWGI2zt5axp72IGJ/sVYEop2rqsRLxdPn3VIyQLvQ+3MYdo8Z/yOuMy7DAlnITQQQUI2ylZKHVmFAt39/xBpwsVjh3m/hBQvn/LbCDtR2s4qa+8fQDfeZXksTtnf7YZbVygTF7jWZ+0oVvkvNO1ZUejvP+uHL+jHwgMEwQnR22hOYWEKZ1s7PI+EZHujqyOhnwXB4jRG+XD7R4N6AhC5Z+nmkFpy3ffszCJ0/H,iv:NrNbkL6GWN4r+uzxNYrhoECD1APbRsRBcMBbVHD3DwM=,tag:YK1O50wV+lHAQa6TX9huUw==,type:str]
INFLUX: ENC[AES256_GCM,data:woaZ/8zWRFtuO6U3HQ==,iv:iLo33tykE6oQW2jUNVGtR/JwrZbs9Fe1fFQ5/LnvaRY=,tag:6UDOU0JJgR7eyQ0hL8j5Qw==,type:str] INFLUX: ENC[AES256_GCM,data:woaZ/8zWRFtuO6U3HQ==,iv:iLo33tykE6oQW2jUNVGtR/JwrZbs9Fe1fFQ5/LnvaRY=,tag:6UDOU0JJgR7eyQ0hL8j5Qw==,type:str]
FRESHRSS: ENC[AES256_GCM,data:xY20OMKI6D8aK8myu7ZquS4bTwZL/mrvTM3pDmDPwH4WIbrE227eqrwnRt5VlrPvs33bv31PCgM0fhP9ULVonEePQwM9+wUNhljcluo8JEAKF70ip0ofV5bIkFuO,iv:HUIl/p/w9llZzuN528SBH47fy0h1HGVKe65shjBLS50=,tag:z/ppfhL3M+elQVxVPtxWFg==,type:str]
SUWAYOMI: ENC[AES256_GCM,data:uPfj1Cgr0IB8BTK0yy6/M0RexP/3IU1bKafvdi6vdwW1KBDdU64phSOGmOyqoHvtnXkUJKIv4Lm41gvQmJRbxvdM099GDXIQeRxuBgl8oUnfb0i/feEQHLnxLVeXZbOV+6jazk7oa6eHNir3tbawkTbYgVi2B/RktlGzEiajUpPryhbi+D2dgHE+GIb18P9m2+s9IZ4NfMOBm7BkgH1lnfCRhaOT7ZOr02GeEQz4gGZ9+F3ocRA85f7rWmOr/V1c,iv:qPmgtCRUR5JiJ1R9CXeNqDGYQtfNB6w8GCrwP9gI8/M=,tag:O+EMoX+QkgvPfCepBjtdBg==,type:str]
CALIBRE: ENC[AES256_GCM,data:Uxz/5H4q/ugmW49a6oIQsG450w+SS1H58gOMXDVX/JQ8OCGxWQ8DRNmSGBZLgGsJ9UA1rxYRS4+pDuDL+iQsNVOmZzFRAuWJwUhEiF72B/Ah0IyXpnPIups8S2Nq,iv:rK274zWuvguY/DPHXxG174j+Ne11SB7ZCQLxO6Tvvg4=,tag:7wJyt94jRvRCZxgHWotzVA==,type:str]
sops: sops:
age: age:
- recipient: age1sxzuhh2fcd4pmaz4mdqq95t683d32ft22w9t2r7pk258u0s8wymsqdj7lg - recipient: age1sxzuhh2fcd4pmaz4mdqq95t683d32ft22w9t2r7pk258u0s8wymsqdj7lg
@@ -32,8 +35,8 @@ sops:
S1NaTVFTL0FCdm1EQmRsUnlhclZNZlEKEgIe60qkvY8+UocjQU+WM2dTL/1y3Kqk S1NaTVFTL0FCdm1EQmRsUnlhclZNZlEKEgIe60qkvY8+UocjQU+WM2dTL/1y3Kqk
d4RrlLP9NSozwVsPYI4ntygvMSApbT4v0YvoO7gV90lkGWEvW1YDfA== d4RrlLP9NSozwVsPYI4ntygvMSApbT4v0YvoO7gV90lkGWEvW1YDfA==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
lastmodified: "2026-05-31T19:09:28Z" lastmodified: "2026-06-01T16:51:24Z"
mac: ENC[AES256_GCM,data:lnyCgfyqc+Fsq7jCQu2HgAmXxPScNzIXCDtKoJfzCPJLha2XG8VMfNl7mLGgcVQcdc0gBk6qh9gpZh2weRjWGgSvhuvms+rlwH+TNTq2owrti9QZCpBEDWW9pgKAol9VPtmFY+RbTkVufpFco5m3eeOVAhdv9WiDvVP5n6xHB+M=,iv:SusyVEVtV8ehEvx7kb1Gget/yYOkqSAbg653ajccjpI=,tag:ldqd0IR8CMUkejTl5GP+IA==,type:str] mac: ENC[AES256_GCM,data:rwOoGGhzrCVJGNbHRAG+yjbneeseLlwtBO2ZmTKXWbruZ9Zu4T41DntxkFl+Lw3vTrLriAPiRkdvxTEVRS9ehHTAikUiyPO18vJmOLhlNq7n/HE2YqADJMq2cIJLGhCzA1AFuB5p07ovATPoUyo2OHvnEDgcRVdXJ+ml5zPTvSU=,iv:vYYShdVUDW1SsDlDEpO2EAaahIDexxBLJ5cs5fIx3qA=,tag:F5Q6zAXtRumGYYLDLGL5mw==,type:str]
pgp: pgp:
- created_at: "2026-05-05T23:46:27Z" - created_at: "2026-05-05T23:46:27Z"
enc: |- enc: |-
+9 -4
View File
@@ -44,19 +44,24 @@
# collabora.subdomain = "office"; # collabora.subdomain = "office";
# etherpad.subdomain = "pad"; # etherpad.subdomain = "pad";
# ethercalc.subdomain = "calc"; # ethercalc.subdomain = "calc";
immich.subdomain = "pic"; # immich.subdomain = "pic";
# ===== FLIX ===== # ===== FLIX =====
# invidious.subdomain = "yt"; # invidious.subdomain = "yt";
# jellyfin.subdomain = "flix"; # jellyfin.subdomain = "flix";
servarr.subdomain = "arr"; # servarr.subdomain = "arr";
transmission = { subdomain = "arr"; subpath = "transmission"; }; # transmission = { subdomain = "arr"; subpath = "transmission"; };
# handbrake = { subdomain = "arr"; subpath = "hb"; }; # handbrake = { subdomain = "arr"; subpath = "hb"; };
# ===== DEV ===== # ===== DEV =====
gitea.subdomain = "git"; gitea.subdomain = "git";
# ===== HOME ===== # ===== HOME =====
# openhab.subdomain = "hab"; # openhab.subdomain = "hab";
# trmnl = { subdomain = "hass"; subpath = "trmnl"; }; # trmnl = { subdomain = "hass"; subpath = "trmnl"; };
influx.subdomain = "metrum"; # influx.subdomain = "metrum";
freshrss.subdomain = "rss";
suwayomi.subdomain = "manga";
calibre.subdomain = "books";
selfmark = { subdomain = "arr"; subpath = "selfmark"; };
}; };
}; };
}; };