Compare commits
2 commits
f07e5a72e5
...
5879c0bed8
Author | SHA1 | Date | |
---|---|---|---|
5879c0bed8 | |||
56c1e1153b |
12 changed files with 661 additions and 42 deletions
|
@ -10,7 +10,11 @@
|
||||||
programs.fastfetch =
|
programs.fastfetch =
|
||||||
let
|
let
|
||||||
hostname = hostSpec.hostName;
|
hostname = hostSpec.hostName;
|
||||||
logoFile = ./. + "/host/${hostname}.txt";
|
logoFile =
|
||||||
|
let
|
||||||
|
hostLogoPath = ./. + "/host/${hostname}.txt";
|
||||||
|
in
|
||||||
|
if builtins.pathExists hostLogoPath then hostLogoPath else ./host/nix.txt;
|
||||||
weather = import ./scripts/weather.nix { inherit pkgs; };
|
weather = import ./scripts/weather.nix { inherit pkgs; };
|
||||||
title = import ./scripts/title.nix { inherit pkgs; };
|
title = import ./scripts/title.nix { inherit pkgs; };
|
||||||
in
|
in
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
|
|
||||||
[?25l[0m [38;2;201;171;246;48;2;170;145;205m▄[38;2;198;167;250;48;2;196;166;243m▄[0m[38;2;157;132;205m▄[0m [38;2;42;98;133;48;2;68;158;214m▄[38;2;80;187;253;48;2;70;163;221m▄[48;2;55;130;176m▄[0m [38;2;69;145;208m▄[38;2;85;173;253;48;2;72;159;221m▄[38;2;83;164;244;48;2;53;114;162m▄[0m [0m
|
|
||||||
[7m[38;2;113;96;142m▄[0m[38;2;174;146;228;48;2;194;163;249m▄[38;2;183;153;247;48;2;187;156;248m▄[38;2;173;143;242;48;2;93;77;127m▄[0m [7m[38;2;72;162;224m▄[0m[38;2;86;171;253;48;2;83;180;253m▄[38;2;87;167;253;48;2;76;160;230m▄[38;2;88;163;253;48;2;44;86;128m▄[38;2;90;159;253;48;2;87;168;253m▄[38;2;86;147;239;48;2;88;164;253m▄[0m[7m[38;2;49;89;139m▄[0m [0m
|
|
||||||
[38;2;169;144;202m▄[38;2;203;172;250;48;2;172;146;208m▄[38;2;196;166;249;48;2;168;142;209m▄[38;2;189;159;248;48;2;163;137;210m▄[38;2;182;152;247;48;2;176;147;235m▄[38;2;175;145;246;48;2;179;149;247m▄[38;2;168;138;245;48;2;172;142;246m▄[38;2;161;131;244;48;2;160;131;237m▄[38;2;153;124;243;48;2;147;120;228m▄[38;2;146;117;242;48;2;140;113;226m▄[38;2;139;110;241;48;2;132;105;223m▄[38;2;127;110;241;48;2;104;146;249m▄[38;2;94;147;253;48;2;90;158;253m▄[38;2;94;145;254;48;2;91;154;253m▄[38;2;94;139;251;48;2;92;150;253m▄[0m[7m[38;2;47;74;127m▄[0m [38;2;110;93;135m▄[38;2;155;132;185m▄[0m [0m
|
|
||||||
[7m[38;2;121;102;146m▄[38;2;115;97;144m▄[38;2;111;93;143m▄[38;2;107;90;143m▄[0m[38;2;102;106;245;48;2;134;115;214m▄[38;2;107;106;254;48;2;146;126;249m▄[38;2;93;90;220;48;2;141;122;249m▄[0m[7m[38;2;107;89;178m▄[38;2;86;70;140m▄[38;2;82;66;139m▄[38;2;78;62;138m▄[38;2;74;58;138m▄[38;2;77;93;184m▄[0m[38;2;90;113;228;48;2;97;136;254m▄[38;2;102;123;254;48;2;99;132;254m▄[0m[38;2;97;111;239m▄[0m [38;2;138;116;182m▄[38;2;189;159;239;48;2;197;167;249m░[38;2;199;168;246;48;2;207;176;251m▄[0m [0m
|
|
||||||
[38;2;49;75;132m▄[38;2;61;88;161m▄[38;2;99;132;254;48;2;73;89;183m▄[38;2;100;127;254;48;2;103;119;254m▄[38;2;68;82;171;48;2;104;113;254m▄[0m [38;2;81;80;192;48;2;104;113;254m▄[38;2;110;106;254;48;2;106;109;254m▄[38;2;166;139;247;48;2;112;102;207m▄[38;2;180;150;247;48;2;184;154;248m▄[38;2;182;153;242;48;2;191;161;249m▄[0m[7m[38;2;111;94;140m▄[0m [0m
|
|
||||||
[38;2;48;101;145;48;2;67;132;197m▄[38;2;85;174;253;48;2;88;165;253m▄[38;2;86;169;253;48;2;89;160;253m▄[38;2;88;164;253;48;2;91;155;253m▄[38;2;90;159;253;48;2;92;150;253m▄[38;2;91;154;253;48;2;94;146;254m▄[38;2;93;149;253;48;2;96;141;254m▄[38;2;102;111;228;48;2;92;129;241m▄[0m [38;2;153;125;238;48;2;135;118;246m▄[38;2;164;135;245;48;2;169;139;245m▄[38;2;171;141;246;48;2;176;146;246m▄[38;2;178;148;247;48;2;182;152;247m▄[38;2;185;155;248;48;2;189;159;248m▄[38;2;192;161;249;48;2;196;166;249m▄[38;2;199;168;250;48;2;203;172;250m▄[38;2;155;132;188;48;2;137;117;166m░[0m
|
|
||||||
[38;2;56;124;173m▄[38;2;84;176;253;48;2;85;164;248m▄[38;2;85;170;252;48;2;88;163;253m▄[38;2;110;110;212;48;2;98;148;251m▄[38;2;141;112;241;48;2;132;105;240m▄[38;2;139;111;238;48;2;78;61;139m▄[0m [38;2;142;113;241;48;2;106;85;175m▄[38;2;149;120;242;48;2;153;124;243m▄[38;2;103;83;161;48;2;160;130;244m▄[0m [0m
|
|
||||||
[38;2;80;187;253;48;2;80;187;253m░[38;2;74;173;234;48;2;81;184;253m▄[0m[7m[38;2;51;110;155m▄[0m [38;2;98;80;153;48;2;148;119;241m▄[38;2;158;129;244;48;2;149;120;242m▄[48;2;114;92;184m▄[0m[38;2;99;87;187m▄[38;2;76;74;180m▄[38;2;75;77;180m▄[38;2;73;84;180m▄[38;2;70;91;180m▄[38;2;80;107;203m▄[38;2;103;134;249;48;2;116;91;212m▄[38;2;103;143;249;48;2;137;109;240m▄[38;2;89;141;227;48;2;137;109;229m▄[0m[38;2;60;128;183m▄[38;2;58;134;183m▄[38;2;58;135;183m▄[38;2;55;129;175m▄[0m [0m
|
|
||||||
[7m[38;2;56;130;176m▄[0m [38;2;107;89;151m▄[38;2;174;145;246;48;2;166;137;245m▄[38;2;175;145;246m▄[48;2;161;134;246m▄[38;2;139;122;238;48;2;110;106;254m▄[38;2;85;88;204;48;2;106;109;254m▄[38;2;82;96;204;48;2;103;119;254m▄[38;2;80;103;204;48;2;100;129;254m▄[38;2;91;131;241;48;2;97;138;254m▄[38;2;93;148;253;48;2;93;148;253m░[38;2;90;157;253;48;2;90;158;253m░[38;2;74;141;214;48;2;87;167;253m▄[38;2;60;127;182;48;2;84;177;253m▄[38;2;57;132;180;48;2;81;186;253m▄[38;2;53;123;167;48;2;80;187;253m▄[0m [0m
|
|
||||||
[38;2;128;107;166m▄[38;2;191;160;249;48;2;180;150;244m▄[38;2;191;161;249;48;2;183;153;247m▄[38;2;98;82;128;48;2;183;153;248m▄[38;2;189;159;245m▄[38;2;192;161;249;48;2;179;149;242m▄[0m[38;2;139;117;180m▄[0m [38;2;62;99;169;48;2;93;148;253m▄[38;2;90;157;253;48;2;90;158;253m░[38;2;87;167;253;48;2;71;135;206m▄[0m [0m
|
|
||||||
[38;2;170;144;207;48;2;198;167;249m▄[38;2;191;162;231;48;2;199;168;250m▄[0m[7m[38;2;145;122;182m▄[0m [7m[38;2;113;96;142m▄[0m[38;2;181;154;218;48;2;200;169;250m▄[38;2;199;169;239;48;2;201;170;250m▄[0m[38;2;174;148;209m▄[0m [7m[38;2;82;145;231m▄[0m[38;2;74;142;215;48;2;87;167;253m▄[0m[7m[38;2;75;158;227m▄[0m [0m
|
|
||||||
[?25h
|
|
|
@ -1,13 +0,0 @@
|
||||||
|
|
||||||
[?25l[0m [38;2;201;171;246;48;2;170;145;205m▄[38;2;198;167;250;48;2;196;166;243m▄[0m[38;2;157;132;205m▄[0m [38;2;42;98;133;48;2;68;158;214m▄[38;2;80;187;253;48;2;70;163;221m▄[48;2;55;130;176m▄[0m [38;2;69;145;208m▄[38;2;85;173;253;48;2;72;159;221m▄[38;2;83;164;244;48;2;53;114;162m▄[0m [0m
|
|
||||||
[7m[38;2;113;96;142m▄[0m[38;2;174;146;228;48;2;194;163;249m▄[38;2;183;153;247;48;2;187;156;248m▄[38;2;173;143;242;48;2;93;77;127m▄[0m [7m[38;2;72;162;224m▄[0m[38;2;86;171;253;48;2;83;180;253m▄[38;2;87;167;253;48;2;76;160;230m▄[38;2;88;163;253;48;2;44;86;128m▄[38;2;90;159;253;48;2;87;168;253m▄[38;2;86;147;239;48;2;88;164;253m▄[0m[7m[38;2;49;89;139m▄[0m [0m
|
|
||||||
[38;2;169;144;202m▄[38;2;203;172;250;48;2;172;146;208m▄[38;2;196;166;249;48;2;168;142;209m▄[38;2;189;159;248;48;2;163;137;210m▄[38;2;182;152;247;48;2;176;147;235m▄[38;2;175;145;246;48;2;179;149;247m▄[38;2;168;138;245;48;2;172;142;246m▄[38;2;161;131;244;48;2;160;131;237m▄[38;2;153;124;243;48;2;147;120;228m▄[38;2;146;117;242;48;2;140;113;226m▄[38;2;139;110;241;48;2;132;105;223m▄[38;2;127;110;241;48;2;104;146;249m▄[38;2;94;147;253;48;2;90;158;253m▄[38;2;94;145;254;48;2;91;154;253m▄[38;2;94;139;251;48;2;92;150;253m▄[0m[7m[38;2;47;74;127m▄[0m [38;2;110;93;135m▄[38;2;155;132;185m▄[0m [0m
|
|
||||||
[7m[38;2;121;102;146m▄[38;2;115;97;144m▄[38;2;111;93;143m▄[38;2;107;90;143m▄[0m[38;2;102;106;245;48;2;134;115;214m▄[38;2;107;106;254;48;2;146;126;249m▄[38;2;93;90;220;48;2;141;122;249m▄[0m[7m[38;2;107;89;178m▄[38;2;86;70;140m▄[38;2;82;66;139m▄[38;2;78;62;138m▄[38;2;74;58;138m▄[38;2;77;93;184m▄[0m[38;2;90;113;228;48;2;97;136;254m▄[38;2;102;123;254;48;2;99;132;254m▄[0m[38;2;97;111;239m▄[0m [38;2;138;116;182m▄[38;2;189;159;239;48;2;197;167;249m░[38;2;199;168;246;48;2;207;176;251m▄[0m [0m
|
|
||||||
[38;2;49;75;132m▄[38;2;61;88;161m▄[38;2;99;132;254;48;2;73;89;183m▄[38;2;100;127;254;48;2;103;119;254m▄[38;2;68;82;171;48;2;104;113;254m▄[0m [38;2;81;80;192;48;2;104;113;254m▄[38;2;110;106;254;48;2;106;109;254m▄[38;2;166;139;247;48;2;112;102;207m▄[38;2;180;150;247;48;2;184;154;248m▄[38;2;182;153;242;48;2;191;161;249m▄[0m[7m[38;2;111;94;140m▄[0m [0m
|
|
||||||
[38;2;48;101;145;48;2;67;132;197m▄[38;2;85;174;253;48;2;88;165;253m▄[38;2;86;169;253;48;2;89;160;253m▄[38;2;88;164;253;48;2;91;155;253m▄[38;2;90;159;253;48;2;92;150;253m▄[38;2;91;154;253;48;2;94;146;254m▄[38;2;93;149;253;48;2;96;141;254m▄[38;2;102;111;228;48;2;92;129;241m▄[0m [38;2;153;125;238;48;2;135;118;246m▄[38;2;164;135;245;48;2;169;139;245m▄[38;2;171;141;246;48;2;176;146;246m▄[38;2;178;148;247;48;2;182;152;247m▄[38;2;185;155;248;48;2;189;159;248m▄[38;2;192;161;249;48;2;196;166;249m▄[38;2;199;168;250;48;2;203;172;250m▄[38;2;155;132;188;48;2;137;117;166m░[0m
|
|
||||||
[38;2;56;124;173m▄[38;2;84;176;253;48;2;85;164;248m▄[38;2;85;170;252;48;2;88;163;253m▄[38;2;110;110;212;48;2;98;148;251m▄[38;2;141;112;241;48;2;132;105;240m▄[38;2;139;111;238;48;2;78;61;139m▄[0m [38;2;142;113;241;48;2;106;85;175m▄[38;2;149;120;242;48;2;153;124;243m▄[38;2;103;83;161;48;2;160;130;244m▄[0m [0m
|
|
||||||
[38;2;80;187;253;48;2;80;187;253m░[38;2;74;173;234;48;2;81;184;253m▄[0m[7m[38;2;51;110;155m▄[0m [38;2;98;80;153;48;2;148;119;241m▄[38;2;158;129;244;48;2;149;120;242m▄[48;2;114;92;184m▄[0m[38;2;99;87;187m▄[38;2;76;74;180m▄[38;2;75;77;180m▄[38;2;73;84;180m▄[38;2;70;91;180m▄[38;2;80;107;203m▄[38;2;103;134;249;48;2;116;91;212m▄[38;2;103;143;249;48;2;137;109;240m▄[38;2;89;141;227;48;2;137;109;229m▄[0m[38;2;60;128;183m▄[38;2;58;134;183m▄[38;2;58;135;183m▄[38;2;55;129;175m▄[0m [0m
|
|
||||||
[7m[38;2;56;130;176m▄[0m [38;2;107;89;151m▄[38;2;174;145;246;48;2;166;137;245m▄[38;2;175;145;246m▄[48;2;161;134;246m▄[38;2;139;122;238;48;2;110;106;254m▄[38;2;85;88;204;48;2;106;109;254m▄[38;2;82;96;204;48;2;103;119;254m▄[38;2;80;103;204;48;2;100;129;254m▄[38;2;91;131;241;48;2;97;138;254m▄[38;2;93;148;253;48;2;93;148;253m░[38;2;90;157;253;48;2;90;158;253m░[38;2;74;141;214;48;2;87;167;253m▄[38;2;60;127;182;48;2;84;177;253m▄[38;2;57;132;180;48;2;81;186;253m▄[38;2;53;123;167;48;2;80;187;253m▄[0m [0m
|
|
||||||
[38;2;128;107;166m▄[38;2;191;160;249;48;2;180;150;244m▄[38;2;191;161;249;48;2;183;153;247m▄[38;2;98;82;128;48;2;183;153;248m▄[38;2;189;159;245m▄[38;2;192;161;249;48;2;179;149;242m▄[0m[38;2;139;117;180m▄[0m [38;2;62;99;169;48;2;93;148;253m▄[38;2;90;157;253;48;2;90;158;253m░[38;2;87;167;253;48;2;71;135;206m▄[0m [0m
|
|
||||||
[38;2;170;144;207;48;2;198;167;249m▄[38;2;191;162;231;48;2;199;168;250m▄[0m[7m[38;2;145;122;182m▄[0m [7m[38;2;113;96;142m▄[0m[38;2;181;154;218;48;2;200;169;250m▄[38;2;199;169;239;48;2;201;170;250m▄[0m[38;2;174;148;209m▄[0m [7m[38;2;82;145;231m▄[0m[38;2;74;142;215;48;2;87;167;253m▄[0m[7m[38;2;75;158;227m▄[0m [0m
|
|
||||||
[?25h
|
|
|
@ -1,13 +0,0 @@
|
||||||
|
|
||||||
[?25l[0m [38;2;201;171;246;48;2;170;145;205m▄[38;2;198;167;250;48;2;196;166;243m▄[0m[38;2;157;132;205m▄[0m [38;2;42;98;133;48;2;68;158;214m▄[38;2;80;187;253;48;2;70;163;221m▄[48;2;55;130;176m▄[0m [38;2;69;145;208m▄[38;2;85;173;253;48;2;72;159;221m▄[38;2;83;164;244;48;2;53;114;162m▄[0m [0m
|
|
||||||
[7m[38;2;113;96;142m▄[0m[38;2;174;146;228;48;2;194;163;249m▄[38;2;183;153;247;48;2;187;156;248m▄[38;2;173;143;242;48;2;93;77;127m▄[0m [7m[38;2;72;162;224m▄[0m[38;2;86;171;253;48;2;83;180;253m▄[38;2;87;167;253;48;2;76;160;230m▄[38;2;88;163;253;48;2;44;86;128m▄[38;2;90;159;253;48;2;87;168;253m▄[38;2;86;147;239;48;2;88;164;253m▄[0m[7m[38;2;49;89;139m▄[0m [0m
|
|
||||||
[38;2;169;144;202m▄[38;2;203;172;250;48;2;172;146;208m▄[38;2;196;166;249;48;2;168;142;209m▄[38;2;189;159;248;48;2;163;137;210m▄[38;2;182;152;247;48;2;176;147;235m▄[38;2;175;145;246;48;2;179;149;247m▄[38;2;168;138;245;48;2;172;142;246m▄[38;2;161;131;244;48;2;160;131;237m▄[38;2;153;124;243;48;2;147;120;228m▄[38;2;146;117;242;48;2;140;113;226m▄[38;2;139;110;241;48;2;132;105;223m▄[38;2;127;110;241;48;2;104;146;249m▄[38;2;94;147;253;48;2;90;158;253m▄[38;2;94;145;254;48;2;91;154;253m▄[38;2;94;139;251;48;2;92;150;253m▄[0m[7m[38;2;47;74;127m▄[0m [38;2;110;93;135m▄[38;2;155;132;185m▄[0m [0m
|
|
||||||
[7m[38;2;121;102;146m▄[38;2;115;97;144m▄[38;2;111;93;143m▄[38;2;107;90;143m▄[0m[38;2;102;106;245;48;2;134;115;214m▄[38;2;107;106;254;48;2;146;126;249m▄[38;2;93;90;220;48;2;141;122;249m▄[0m[7m[38;2;107;89;178m▄[38;2;86;70;140m▄[38;2;82;66;139m▄[38;2;78;62;138m▄[38;2;74;58;138m▄[38;2;77;93;184m▄[0m[38;2;90;113;228;48;2;97;136;254m▄[38;2;102;123;254;48;2;99;132;254m▄[0m[38;2;97;111;239m▄[0m [38;2;138;116;182m▄[38;2;189;159;239;48;2;197;167;249m░[38;2;199;168;246;48;2;207;176;251m▄[0m [0m
|
|
||||||
[38;2;49;75;132m▄[38;2;61;88;161m▄[38;2;99;132;254;48;2;73;89;183m▄[38;2;100;127;254;48;2;103;119;254m▄[38;2;68;82;171;48;2;104;113;254m▄[0m [38;2;81;80;192;48;2;104;113;254m▄[38;2;110;106;254;48;2;106;109;254m▄[38;2;166;139;247;48;2;112;102;207m▄[38;2;180;150;247;48;2;184;154;248m▄[38;2;182;153;242;48;2;191;161;249m▄[0m[7m[38;2;111;94;140m▄[0m [0m
|
|
||||||
[38;2;48;101;145;48;2;67;132;197m▄[38;2;85;174;253;48;2;88;165;253m▄[38;2;86;169;253;48;2;89;160;253m▄[38;2;88;164;253;48;2;91;155;253m▄[38;2;90;159;253;48;2;92;150;253m▄[38;2;91;154;253;48;2;94;146;254m▄[38;2;93;149;253;48;2;96;141;254m▄[38;2;102;111;228;48;2;92;129;241m▄[0m [38;2;153;125;238;48;2;135;118;246m▄[38;2;164;135;245;48;2;169;139;245m▄[38;2;171;141;246;48;2;176;146;246m▄[38;2;178;148;247;48;2;182;152;247m▄[38;2;185;155;248;48;2;189;159;248m▄[38;2;192;161;249;48;2;196;166;249m▄[38;2;199;168;250;48;2;203;172;250m▄[38;2;155;132;188;48;2;137;117;166m░[0m
|
|
||||||
[38;2;56;124;173m▄[38;2;84;176;253;48;2;85;164;248m▄[38;2;85;170;252;48;2;88;163;253m▄[38;2;110;110;212;48;2;98;148;251m▄[38;2;141;112;241;48;2;132;105;240m▄[38;2;139;111;238;48;2;78;61;139m▄[0m [38;2;142;113;241;48;2;106;85;175m▄[38;2;149;120;242;48;2;153;124;243m▄[38;2;103;83;161;48;2;160;130;244m▄[0m [0m
|
|
||||||
[38;2;80;187;253;48;2;80;187;253m░[38;2;74;173;234;48;2;81;184;253m▄[0m[7m[38;2;51;110;155m▄[0m [38;2;98;80;153;48;2;148;119;241m▄[38;2;158;129;244;48;2;149;120;242m▄[48;2;114;92;184m▄[0m[38;2;99;87;187m▄[38;2;76;74;180m▄[38;2;75;77;180m▄[38;2;73;84;180m▄[38;2;70;91;180m▄[38;2;80;107;203m▄[38;2;103;134;249;48;2;116;91;212m▄[38;2;103;143;249;48;2;137;109;240m▄[38;2;89;141;227;48;2;137;109;229m▄[0m[38;2;60;128;183m▄[38;2;58;134;183m▄[38;2;58;135;183m▄[38;2;55;129;175m▄[0m [0m
|
|
||||||
[7m[38;2;56;130;176m▄[0m [38;2;107;89;151m▄[38;2;174;145;246;48;2;166;137;245m▄[38;2;175;145;246m▄[48;2;161;134;246m▄[38;2;139;122;238;48;2;110;106;254m▄[38;2;85;88;204;48;2;106;109;254m▄[38;2;82;96;204;48;2;103;119;254m▄[38;2;80;103;204;48;2;100;129;254m▄[38;2;91;131;241;48;2;97;138;254m▄[38;2;93;148;253;48;2;93;148;253m░[38;2;90;157;253;48;2;90;158;253m░[38;2;74;141;214;48;2;87;167;253m▄[38;2;60;127;182;48;2;84;177;253m▄[38;2;57;132;180;48;2;81;186;253m▄[38;2;53;123;167;48;2;80;187;253m▄[0m [0m
|
|
||||||
[38;2;128;107;166m▄[38;2;191;160;249;48;2;180;150;244m▄[38;2;191;161;249;48;2;183;153;247m▄[38;2;98;82;128;48;2;183;153;248m▄[38;2;189;159;245m▄[38;2;192;161;249;48;2;179;149;242m▄[0m[38;2;139;117;180m▄[0m [38;2;62;99;169;48;2;93;148;253m▄[38;2;90;157;253;48;2;90;158;253m░[38;2;87;167;253;48;2;71;135;206m▄[0m [0m
|
|
||||||
[38;2;170;144;207;48;2;198;167;249m▄[38;2;191;162;231;48;2;199;168;250m▄[0m[7m[38;2;145;122;182m▄[0m [7m[38;2;113;96;142m▄[0m[38;2;181;154;218;48;2;200;169;250m▄[38;2;199;169;239;48;2;201;170;250m▄[0m[38;2;174;148;209m▄[0m [7m[38;2;82;145;231m▄[0m[38;2;74;142;215;48;2;87;167;253m▄[0m[7m[38;2;75;158;227m▄[0m [0m
|
|
||||||
[?25h
|
|
|
@ -16,7 +16,7 @@ let
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
users.groups = {
|
users.groups = {
|
||||||
ryot = lib.mkIf (!isMinimal) {
|
ryot = {
|
||||||
gid = 1004;
|
gid = 1004;
|
||||||
members = [ username ];
|
members = [ username ];
|
||||||
};
|
};
|
||||||
|
@ -31,7 +31,7 @@ in
|
||||||
homeMode = "750";
|
homeMode = "750";
|
||||||
hashedPassword = user.hashedPassword or hostSpec.hashedPassword;
|
hashedPassword = user.hashedPassword or hostSpec.hashedPassword;
|
||||||
uid = 1000;
|
uid = 1000;
|
||||||
group = if !isMinimal then "ryot" else "users";
|
group = "ryot";
|
||||||
shell = hostSpec.shell or pkgs.fish;
|
shell = hostSpec.shell or pkgs.fish;
|
||||||
extraGroups = lib.flatten [
|
extraGroups = lib.flatten [
|
||||||
"wheel"
|
"wheel"
|
||||||
|
|
193
hosts/nixos/sock/config/backups/borg.nix
Normal file
193
hosts/nixos/sock/config/backups/borg.nix
Normal file
|
@ -0,0 +1,193 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
# Common repositories
|
||||||
|
ochreStorageRepo = "/pool/Backups/OchreStorage";
|
||||||
|
|
||||||
|
# Shared environment setup
|
||||||
|
borgCommonSettings = ''
|
||||||
|
# Don't use cache to avoid issues with concurrent backups
|
||||||
|
export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes
|
||||||
|
export BORG_NON_INTERACTIVE=yes
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Common packages needed for backups
|
||||||
|
commonBorgPath = with pkgs; [
|
||||||
|
borgbackup
|
||||||
|
coreutils
|
||||||
|
apprise
|
||||||
|
gnugrep
|
||||||
|
hostname
|
||||||
|
util-linux
|
||||||
|
gawk
|
||||||
|
];
|
||||||
|
|
||||||
|
# Repository initialization
|
||||||
|
initRepo = repo: ''
|
||||||
|
if [ ! -d "${repo}" ]; then
|
||||||
|
mkdir -p "${repo}"
|
||||||
|
${pkgs.borgbackup}/bin/borg init --encryption=none "${repo}"
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Notification system
|
||||||
|
apprise-url = config.secretsSpec.users.admin.smtp.notifyUrl;
|
||||||
|
sendNotification = title: message: ''
|
||||||
|
${pkgs.apprise}/bin/apprise -t "${title}" -b "${message}" "${apprise-url}" || true
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Statistics generation
|
||||||
|
extractBorgStats = logFile: repoPath: ''
|
||||||
|
{
|
||||||
|
echo -e "\n==== BACKUP SUMMARY ====\n"
|
||||||
|
grep -A10 "Archive name:" ${logFile} || echo "No archive stats found"
|
||||||
|
echo -e "\n=== Compression ===\n"
|
||||||
|
grep "Compressed size:" ${logFile} || echo "No compression stats found"
|
||||||
|
echo -e "\n=== Duration ===\n"
|
||||||
|
grep "Duration:" ${logFile} || echo "No duration stats found"
|
||||||
|
grep "Throughput:" ${logFile} || echo "No throughput stats found"
|
||||||
|
echo -e "\n=== Repository ===\n"
|
||||||
|
${pkgs.borgbackup}/bin/borg info ${repoPath} --last 1 2>/dev/null || echo "Could not get repository info"
|
||||||
|
echo -e "\n=== Storage Space ===\n"
|
||||||
|
df -h ${repoPath} | grep -v "Filesystem" || echo "Could not get storage info"
|
||||||
|
} > ${logFile}.stats
|
||||||
|
STATS=$(cat ${logFile}.stats || echo "No stats available")
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Unified backup service generator with optional features
|
||||||
|
mkBorgBackupService =
|
||||||
|
{
|
||||||
|
name,
|
||||||
|
title,
|
||||||
|
repo,
|
||||||
|
sourcePath,
|
||||||
|
keepDaily,
|
||||||
|
keepWeekly,
|
||||||
|
keepMonthly,
|
||||||
|
schedule ? null,
|
||||||
|
enableNotifications ? true,
|
||||||
|
verbose ? false,
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
maybeCreateTimer = lib.optionalAttrs (schedule != null) {
|
||||||
|
timers."backup-${name}" = {
|
||||||
|
description = "Timer for ${title} Backup";
|
||||||
|
wantedBy = [ "timers.target" ];
|
||||||
|
timerConfig = {
|
||||||
|
OnCalendar = schedule;
|
||||||
|
Persistent = true;
|
||||||
|
RandomizedDelaySec = "5min";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
logPrefix = if verbose then "set -x;" else "";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
services."backup-${name}" = {
|
||||||
|
description = "Backup ${title} with Borg";
|
||||||
|
inherit (commonServiceConfig) path serviceConfig;
|
||||||
|
|
||||||
|
script = ''
|
||||||
|
${borgCommonSettings}
|
||||||
|
${logPrefix} # Add verbose logging if enabled
|
||||||
|
|
||||||
|
LOG_FILE="/tmp/borg-${name}-backup-$(date +%Y%m%d-%H%M%S).log"
|
||||||
|
${initRepo repo}
|
||||||
|
|
||||||
|
echo "Starting ${title} backup at $(date)" > $LOG_FILE
|
||||||
|
ARCHIVE_NAME="${name}-$(date +%Y-%m-%d_%H%M%S)"
|
||||||
|
START_TIME=$(date +%s)
|
||||||
|
|
||||||
|
# Add verbose output redirection if enabled
|
||||||
|
${if verbose then "exec 3>&1 4>&2" else ""}
|
||||||
|
${pkgs.borgbackup}/bin/borg create \
|
||||||
|
--stats \
|
||||||
|
--compression zstd,15 \
|
||||||
|
--exclude '*.tmp' \
|
||||||
|
--exclude '*/tmp/*' \
|
||||||
|
${repo}::$ARCHIVE_NAME \
|
||||||
|
${sourcePath} >> $LOG_FILE 2>&1 ${if verbose then "| tee /dev/fd/3" else ""}
|
||||||
|
|
||||||
|
BACKUP_STATUS=$?
|
||||||
|
END_TIME=$(date +%s)
|
||||||
|
DURATION=$((END_TIME - START_TIME))
|
||||||
|
echo "Total time: $DURATION seconds ($(date -d@$DURATION -u +%H:%M:%S))" >> $LOG_FILE
|
||||||
|
|
||||||
|
${extractBorgStats "$LOG_FILE" "${repo}"}
|
||||||
|
|
||||||
|
echo -e "\nPruning old backups..." >> $LOG_FILE
|
||||||
|
${pkgs.borgbackup}/bin/borg prune \
|
||||||
|
--keep-daily ${toString keepDaily} \
|
||||||
|
--keep-weekly ${toString keepWeekly} \
|
||||||
|
--keep-monthly ${toString keepMonthly} \
|
||||||
|
${repo} >> $LOG_FILE 2>&1 ${if verbose then "| tee /dev/fd/3" else ""}
|
||||||
|
|
||||||
|
PRUNE_STATUS=$?
|
||||||
|
|
||||||
|
echo -e "\nRemaining archives after pruning:" >> $LOG_FILE
|
||||||
|
${pkgs.borgbackup}/bin/borg list ${repo} >> $LOG_FILE 2>&1 || true
|
||||||
|
|
||||||
|
${
|
||||||
|
if enableNotifications then
|
||||||
|
''
|
||||||
|
if [ $BACKUP_STATUS -eq 0 ] && [ $PRUNE_STATUS -eq 0 ]; then
|
||||||
|
${sendNotification "✅ ${title} Backup Complete" "${title} backup completed successfully on $(hostname) at $(date)\nDuration: $(date -d@$DURATION -u +%H:%M:%S)\n\n$STATS"}
|
||||||
|
else
|
||||||
|
${sendNotification "❌ ${title} Backup Failed" "${title} backup failed on $(hostname) at $(date)\n\nBackup Status: $BACKUP_STATUS\nPrune Status: $PRUNE_STATUS\n\nPartial Stats:\n$STATS\n\nSee $LOG_FILE for details"}
|
||||||
|
fi
|
||||||
|
''
|
||||||
|
else
|
||||||
|
"echo 'Notifications disabled' >> $LOG_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
rm -f $LOG_FILE.stats
|
||||||
|
exit $BACKUP_STATUS
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
// maybeCreateTimer;
|
||||||
|
|
||||||
|
# Common service configuration
|
||||||
|
commonServiceConfig = {
|
||||||
|
path = commonBorgPath;
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
IOSchedulingClass = "idle";
|
||||||
|
CPUSchedulingPolicy = "idle";
|
||||||
|
Nice = 19;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
borgbackup
|
||||||
|
];
|
||||||
|
|
||||||
|
systemd = lib.mkMerge [
|
||||||
|
(mkBorgBackupService {
|
||||||
|
name = "ochre-storage";
|
||||||
|
title = "Ochre Storage";
|
||||||
|
repo = ochreStorageRepo;
|
||||||
|
sourcePath = "/OchreStorage";
|
||||||
|
# INFO: This shit confusing but basically
|
||||||
|
# keeps the last 7 days,
|
||||||
|
# then keeps AT LEAST ONE for last 4 weeks
|
||||||
|
# and finally AT LEAST ONE for the last 3 months
|
||||||
|
keepDaily = 7;
|
||||||
|
keepWeekly = 4;
|
||||||
|
keepMonthly = 3;
|
||||||
|
# No schedule = no timer created
|
||||||
|
# schedule = "*-*-* 03:00:00";
|
||||||
|
enableNotifications = false;
|
||||||
|
verbose = true;
|
||||||
|
})
|
||||||
|
];
|
||||||
|
}
|
184
hosts/nixos/sock/config/backups/default.nix
Normal file
184
hosts/nixos/sock/config/backups/default.nix
Normal file
|
@ -0,0 +1,184 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
# Shared configuration
|
||||||
|
logDir = "/var/log/backups";
|
||||||
|
backupServices = [
|
||||||
|
{
|
||||||
|
name = "ochre_storage";
|
||||||
|
title = "Ochre Storage";
|
||||||
|
service = "backup-ochre-storage.service";
|
||||||
|
logPattern = "borg-ochre-storage-backup-*.log";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
# Helper functions
|
||||||
|
users = config.secretsSpec.users;
|
||||||
|
notify =
|
||||||
|
title: message: logFile:
|
||||||
|
let
|
||||||
|
attachArg = if logFile == "" then "" else "--attach \"file://${logFile}\"";
|
||||||
|
appriseUrl = lib.custom.mkAppriseUrl users.admin.smtp "relay@ryot.foo";
|
||||||
|
in
|
||||||
|
''
|
||||||
|
${pkgs.apprise}/bin/apprise -vv -i "markdown" -t "${title}" \
|
||||||
|
-b "${message}" \
|
||||||
|
${attachArg} \
|
||||||
|
"${appriseUrl}" || true
|
||||||
|
'';
|
||||||
|
|
||||||
|
findLatestLog = pattern: path: ''
|
||||||
|
find "${path}" -name "${pattern}" -type f -printf "%T@ %p\\n" 2>/dev/null \
|
||||||
|
| sort -nr | head -1 | cut -d' ' -f2
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Generate safe variable name (replace hyphens with underscores)
|
||||||
|
safeName = name: lib.replaceStrings [ "-" ] [ "_" ] name;
|
||||||
|
|
||||||
|
# Generate status variable references
|
||||||
|
statusVarName = name: "STATUS_${safeName name}";
|
||||||
|
|
||||||
|
# Common script utilities
|
||||||
|
scriptPrelude = ''
|
||||||
|
set -uo pipefail
|
||||||
|
LOG_FILE="${logDir}/backup-chain-$(date +%Y%m%d-%H%M%S).log"
|
||||||
|
mkdir -p "${logDir}"
|
||||||
|
exec > >(tee -a "$LOG_FILE") 2>&1
|
||||||
|
|
||||||
|
log() {
|
||||||
|
echo "[$(date "+%Y-%m-%d %H:%M:%S")] $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Initialize all status variables
|
||||||
|
${lib.concatMapStringsSep "\n" (s: "${statusVarName s.name}=1") backupServices}
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Service runner template
|
||||||
|
runService =
|
||||||
|
{
|
||||||
|
name,
|
||||||
|
title,
|
||||||
|
service,
|
||||||
|
logPattern,
|
||||||
|
logPath ? "/tmp",
|
||||||
|
}:
|
||||||
|
''
|
||||||
|
log "Starting ${title} maintenance..."
|
||||||
|
systemctl start ${service} || true
|
||||||
|
${statusVarName name}=$?
|
||||||
|
log "${title} completed with status $${statusVarName name}"
|
||||||
|
|
||||||
|
SERVICE_LOG=$(${findLatestLog logPattern logPath})
|
||||||
|
if [ -n "$SERVICE_LOG" ]; then
|
||||||
|
log "Appending ${title} log: $SERVICE_LOG"
|
||||||
|
echo -e "\n\n===== ${title} LOG ($(basename "$SERVICE_LOG")) =====\n" >> "$LOG_FILE"
|
||||||
|
cat "$SERVICE_LOG" >> "$LOG_FILE"
|
||||||
|
|
||||||
|
# Add SnapRAID-specific summary
|
||||||
|
if [ "${name}" = "snapraid" ]; then
|
||||||
|
echo -e "\n=== SnapRAID Summary ===" >> "$LOG_FILE"
|
||||||
|
grep -E '(Scrub|Sync|Diff|smart)' "$SERVICE_LOG" | tail -n 10 >> "$LOG_FILE"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Build the service execution script
|
||||||
|
serviceExecution = lib.concatMapStrings runService backupServices;
|
||||||
|
|
||||||
|
# Generate status summary lines
|
||||||
|
statusSummaryLines = lib.concatMapStringsSep "\n" (
|
||||||
|
s:
|
||||||
|
let
|
||||||
|
varName = statusVarName s.name;
|
||||||
|
in
|
||||||
|
"- **${s.title}:** \$([ \$${varName} -eq 0 ] && echo '✅ Success' || echo '❌ Failed') (Exit: \$${varName})"
|
||||||
|
) backupServices;
|
||||||
|
|
||||||
|
# Notification logic with cleaner formatting
|
||||||
|
notificationLogic =
|
||||||
|
let
|
||||||
|
statusVars = map (s: statusVarName s.name) backupServices;
|
||||||
|
statusChecks = lib.concatMapStringsSep "\n" (var: "[ \$${var} -eq 0 ] && ") statusVars;
|
||||||
|
in
|
||||||
|
''
|
||||||
|
# Calculate overall status
|
||||||
|
OVERALL_STATUS=0
|
||||||
|
${lib.concatMapStringsSep "\n" (var: "if [ \$${var} -ne 0 ]; then OVERALL_STATUS=1; fi") statusVars}
|
||||||
|
|
||||||
|
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
|
||||||
|
HOSTNAME=$(hostname)
|
||||||
|
|
||||||
|
SUMMARY=$(cat << EOF
|
||||||
|
# Backup Chain Complete
|
||||||
|
|
||||||
|
**Host:** $HOSTNAME
|
||||||
|
**Timestamp:** $TIMESTAMP
|
||||||
|
**Overall Status:** $([ $OVERALL_STATUS -eq 0 ] && echo '✅ Success' || echo '⚠️ Failure')
|
||||||
|
|
||||||
|
## Service Status:
|
||||||
|
${statusSummaryLines}
|
||||||
|
|
||||||
|
**Log Path:** $LOG_FILE
|
||||||
|
EOF)
|
||||||
|
|
||||||
|
if [ $OVERALL_STATUS -eq 0 ]; then
|
||||||
|
${notify "✅ Backup Success" "$SUMMARY" "$LOG_FILE"}
|
||||||
|
else
|
||||||
|
${notify "⚠️ Backup Issues" "$SUMMARY" "$LOG_FILE"}
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit $OVERALL_STATUS
|
||||||
|
'';
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = lib.custom.scanPaths ./.;
|
||||||
|
|
||||||
|
systemd.services.backup-chain = {
|
||||||
|
description = "Orchestrated Backup Chain";
|
||||||
|
path = with pkgs; [
|
||||||
|
apprise
|
||||||
|
coreutils
|
||||||
|
findutils
|
||||||
|
gawk
|
||||||
|
gnugrep
|
||||||
|
hostname
|
||||||
|
systemd
|
||||||
|
util-linux
|
||||||
|
];
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
Nice = 19;
|
||||||
|
IOSchedulingClass = "idle";
|
||||||
|
CPUSchedulingPolicy = "idle";
|
||||||
|
};
|
||||||
|
|
||||||
|
script = ''
|
||||||
|
${scriptPrelude}
|
||||||
|
log "Initializing backup chain on $(hostname)"
|
||||||
|
|
||||||
|
${serviceExecution}
|
||||||
|
|
||||||
|
log "Finalizing backup chain"
|
||||||
|
${notificationLogic}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.timers.backup-chain = {
|
||||||
|
wantedBy = [ "timers.target" ];
|
||||||
|
timerConfig = {
|
||||||
|
OnCalendar = "*-*-* 03:00:00";
|
||||||
|
Persistent = true;
|
||||||
|
RandomizedDelaySec = "5min";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = [ pkgs.apprise ];
|
||||||
|
systemd.tmpfiles.rules = [ "d ${logDir} 0755 root root -" ];
|
||||||
|
}
|
4
hosts/nixos/sock/config/default.nix
Normal file
4
hosts/nixos/sock/config/default.nix
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{ lib, ... }:
|
||||||
|
{
|
||||||
|
imports = lib.custom.scanPaths ./.;
|
||||||
|
}
|
183
hosts/nixos/sock/config/komodo/default.nix
Normal file
183
hosts/nixos/sock/config/komodo/default.nix
Normal file
|
@ -0,0 +1,183 @@
|
||||||
|
# Auto-generated using compose2nix v0.3.1.
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
# Only available in the Sock LXC
|
||||||
|
DockerStorage = "/OchreStorage/komodo";
|
||||||
|
env = config.secretsSpec.docker.komodo-sock;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
# Containers
|
||||||
|
virtualisation.oci-containers.containers."komodo-core" = {
|
||||||
|
image = "ghcr.io/moghtech/komodo-core:latest";
|
||||||
|
environment = env;
|
||||||
|
volumes = [
|
||||||
|
"${DockerStorage}/cache:/repo-cache:rw"
|
||||||
|
];
|
||||||
|
ports = [
|
||||||
|
"9120:9120/tcp"
|
||||||
|
];
|
||||||
|
labels = {
|
||||||
|
"komodo.skip" = "";
|
||||||
|
};
|
||||||
|
dependsOn = [
|
||||||
|
"komodo-mongo"
|
||||||
|
];
|
||||||
|
log-driver = "local";
|
||||||
|
extraOptions = [
|
||||||
|
"--network-alias=core"
|
||||||
|
"--network=komodo_default"
|
||||||
|
"--pull=always"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services."docker-komodo-core" = {
|
||||||
|
serviceConfig = {
|
||||||
|
Restart = lib.mkOverride 90 "always";
|
||||||
|
RestartMaxDelaySec = lib.mkOverride 90 "1m";
|
||||||
|
RestartSec = lib.mkOverride 90 "100ms";
|
||||||
|
RestartSteps = lib.mkOverride 90 9;
|
||||||
|
};
|
||||||
|
after = [
|
||||||
|
"docker-network-komodo_default.service"
|
||||||
|
# "docker-volume-komodo_repo-cache.service"
|
||||||
|
];
|
||||||
|
requires = [
|
||||||
|
"docker-network-komodo_default.service"
|
||||||
|
# "docker-volume-komodo_repo-cache.service"
|
||||||
|
];
|
||||||
|
partOf = [
|
||||||
|
"docker-compose-komodo-root.target"
|
||||||
|
];
|
||||||
|
wantedBy = [
|
||||||
|
"docker-compose-komodo-root.target"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
virtualisation.oci-containers.containers."komodo-mongo" = {
|
||||||
|
image = "mongo";
|
||||||
|
environment = env;
|
||||||
|
volumes = [
|
||||||
|
"${DockerStorage}/mongo/config:/data/configdb:rw"
|
||||||
|
"${DockerStorage}/mongo/data:/data/db:rw"
|
||||||
|
];
|
||||||
|
cmd = [
|
||||||
|
"--quiet"
|
||||||
|
"--wiredTigerCacheSizeGB"
|
||||||
|
"0.25"
|
||||||
|
];
|
||||||
|
labels = {
|
||||||
|
"komodo.skip" = "";
|
||||||
|
};
|
||||||
|
log-driver = "local";
|
||||||
|
extraOptions = [
|
||||||
|
"--network-alias=mongo"
|
||||||
|
"--network=komodo_default"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services."docker-komodo-mongo" = {
|
||||||
|
serviceConfig = {
|
||||||
|
Restart = lib.mkOverride 90 "always";
|
||||||
|
RestartMaxDelaySec = lib.mkOverride 90 "1m";
|
||||||
|
RestartSec = lib.mkOverride 90 "100ms";
|
||||||
|
RestartSteps = lib.mkOverride 90 9;
|
||||||
|
};
|
||||||
|
after = [
|
||||||
|
"docker-network-komodo_default.service"
|
||||||
|
# "docker-volume-komodo_mongo-config.service"
|
||||||
|
# "docker-volume-komodo_mongo-data.service"
|
||||||
|
];
|
||||||
|
requires = [
|
||||||
|
"docker-network-komodo_default.service"
|
||||||
|
# "docker-volume-komodo_mongo-config.service"
|
||||||
|
# "docker-volume-komodo_mongo-data.service"
|
||||||
|
];
|
||||||
|
partOf = [
|
||||||
|
"docker-compose-komodo-root.target"
|
||||||
|
];
|
||||||
|
wantedBy = [
|
||||||
|
"docker-compose-komodo-root.target"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
virtualisation.oci-containers.containers."komodo-periphery" = {
|
||||||
|
image = "ghcr.io/moghtech/komodo-periphery:latest";
|
||||||
|
environment = env;
|
||||||
|
volumes = [
|
||||||
|
"/proc:/proc:rw"
|
||||||
|
"/var/run/docker.sock:/var/run/docker.sock:rw"
|
||||||
|
"${DockerStorage}/repos:/etc/komodo/repos:rw"
|
||||||
|
"${DockerStorage}/ssl:/etc/komodo/ssl:rw"
|
||||||
|
"${DockerStorage}/stacks:${DockerStorage}/stacks:rw"
|
||||||
|
];
|
||||||
|
ports = [
|
||||||
|
"8120:8120/tcp"
|
||||||
|
];
|
||||||
|
labels = {
|
||||||
|
"komodo.skip" = "";
|
||||||
|
};
|
||||||
|
log-driver = "local";
|
||||||
|
extraOptions = [
|
||||||
|
"--network-alias=periphery"
|
||||||
|
"--network=komodo_default"
|
||||||
|
"--pull=always"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services."docker-komodo-periphery" = {
|
||||||
|
serviceConfig = {
|
||||||
|
Restart = lib.mkOverride 90 "always";
|
||||||
|
RestartMaxDelaySec = lib.mkOverride 90 "1m";
|
||||||
|
RestartSec = lib.mkOverride 90 "100ms";
|
||||||
|
RestartSteps = lib.mkOverride 90 9;
|
||||||
|
};
|
||||||
|
after = [
|
||||||
|
"docker-network-komodo_default.service"
|
||||||
|
# "docker-volume-komodo_repos.service"
|
||||||
|
# "docker-volume-komodo_ssl-certs.service"
|
||||||
|
# "docker-volume-komodo_stacks.service"
|
||||||
|
];
|
||||||
|
requires = [
|
||||||
|
"docker-network-komodo_default.service"
|
||||||
|
# "docker-volume-komodo_repos.service"
|
||||||
|
# "docker-volume-komodo_ssl-certs.service"
|
||||||
|
# "docker-volume-komodo_stacks.service"
|
||||||
|
];
|
||||||
|
partOf = [
|
||||||
|
"docker-compose-komodo-root.target"
|
||||||
|
];
|
||||||
|
wantedBy = [
|
||||||
|
"docker-compose-komodo-root.target"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Networks
|
||||||
|
systemd.services."docker-network-komodo_default" = {
|
||||||
|
path = [ pkgs.docker ];
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
RemainAfterExit = true;
|
||||||
|
ExecStop = "docker network rm -f komodo_default";
|
||||||
|
};
|
||||||
|
script = ''
|
||||||
|
docker network inspect komodo_default || docker network create komodo_default
|
||||||
|
'';
|
||||||
|
partOf = [ "docker-compose-komodo-root.target" ];
|
||||||
|
wantedBy = [ "docker-compose-komodo-root.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Root service
|
||||||
|
# When started, this will automatically create all resources and start
|
||||||
|
# the containers. When stopped, this will teardown all resources.
|
||||||
|
systemd.targets."docker-compose-komodo-root" = {
|
||||||
|
unitConfig = {
|
||||||
|
Description = "Root target generated by compose2nix.";
|
||||||
|
};
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
};
|
||||||
|
}
|
69
hosts/nixos/sock/default.nix
Normal file
69
hosts/nixos/sock/default.nix
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
###############################################################
|
||||||
|
#
|
||||||
|
# Sock - LXC Container
|
||||||
|
# NixOS container, Intel N150 (4 Cores), 8GB/2GB RAM/SWAP
|
||||||
|
#
|
||||||
|
# Docker Environment, Managed by with Komodo
|
||||||
|
#
|
||||||
|
###############################################################
|
||||||
|
|
||||||
|
{
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
username = "toph";
|
||||||
|
user = config.secretsSpec.users.${username};
|
||||||
|
firewall = config.secretsSpec.firewall.sock;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = lib.flatten [
|
||||||
|
## Sock Only ##
|
||||||
|
./config
|
||||||
|
|
||||||
|
## Hardware ##
|
||||||
|
./hardware.nix
|
||||||
|
|
||||||
|
(map lib.custom.relativeToRoot [
|
||||||
|
## Required Configs ##
|
||||||
|
"hosts/global/core"
|
||||||
|
|
||||||
|
## Optional Configs ##
|
||||||
|
"hosts/global/common/acme"
|
||||||
|
"hosts/global/common/docker.nix"
|
||||||
|
])
|
||||||
|
];
|
||||||
|
|
||||||
|
## Host Specifications ##
|
||||||
|
hostSpec = {
|
||||||
|
hostName = "sock";
|
||||||
|
username = username;
|
||||||
|
hashedPassword = user.hashedPassword;
|
||||||
|
email = user.email;
|
||||||
|
handle = user.handle;
|
||||||
|
userFullName = user.fullName;
|
||||||
|
isServer = true;
|
||||||
|
isMinimal = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
enableIPv6 = false;
|
||||||
|
firewall = {
|
||||||
|
allowedTCPPorts = firewall.allowedTCPPorts;
|
||||||
|
allowedTCPPortRanges = firewall.allowedTCPPortRanges;
|
||||||
|
allowedUDPPorts = firewall.allowedUDPPorts;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
## System-wide packages ##
|
||||||
|
programs.nix-ld.enable = true;
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
lazydocker
|
||||||
|
compose2nix
|
||||||
|
];
|
||||||
|
|
||||||
|
# https://wiki.nixos.org/wiki/FAQ/When_do_I_update_stateVersion
|
||||||
|
system.stateVersion = "25.05";
|
||||||
|
}
|
21
hosts/nixos/sock/hardware.nix
Normal file
21
hosts/nixos/sock/hardware.nix
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
username = config.hostSpec.username;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = lib.flatten [
|
||||||
|
(map lib.custom.relativeToRoot [
|
||||||
|
"hosts/global/common/system/lxc.nix"
|
||||||
|
"hosts/global/common/system/pool.nix"
|
||||||
|
])
|
||||||
|
];
|
||||||
|
|
||||||
|
# Ochre has no access to PVE DockerStorage, so sock will have its own storage
|
||||||
|
systemd.user.tmpfiles.rules = [
|
||||||
|
"d /OchreStorage 2775 ${username} ryot -"
|
||||||
|
];
|
||||||
|
}
|
BIN
secrets.nix
BIN
secrets.nix
Binary file not shown.
Loading…
Add table
Reference in a new issue