Compare commits

...

4 commits

17 changed files with 400 additions and 111 deletions

12
flake.lock generated
View file

@ -513,11 +513,11 @@
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1731815985, "lastModified": 1731819057,
"narHash": "sha256-PgX3UFz1YESfEeGmp2HYYBc/3Vp59bPbBLtNN4VMIgI=", "narHash": "sha256-nfqKsQhFCakM+eIKGf/JWu/g56rOPoGny10EZN8q7R0=",
"owner": "xinyangli", "owner": "xinyangli",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "5ddf4ef59567ff1e43adacde9f677f2cbd958287", "rev": "b2644ed7258502987ad4a70cf8959bf5a26ce26d",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -555,11 +555,11 @@
}, },
"nur": { "nur": {
"locked": { "locked": {
"lastModified": 1731815686, "lastModified": 1731819675,
"narHash": "sha256-6HPZVrwQOZzeaW5QseyXnghK76a3aDnRoQf+L+cpNms=", "narHash": "sha256-GGp/rEfxRdi1BD9TlHoXxp2g9IuKDp0Jk7wYh1LacP8=",
"owner": "nix-community", "owner": "nix-community",
"repo": "NUR", "repo": "NUR",
"rev": "4cde5b2ea07d8c05570d7305738a9870b1a14700", "rev": "59740d792bea5caa547c9bc7ce366802ecfafb7f",
"type": "github" "type": "github"
}, },
"original": { "original": {

114
flake.nix
View file

@ -58,35 +58,56 @@
home-manager, home-manager,
nixpkgs, nixpkgs,
nixos-hardware, nixos-hardware,
sops-nix,
flake-utils, flake-utils,
nur, nur,
catppuccin, catppuccin,
my-nixvim, my-nixvim,
nix-vscode-extensions,
colmena,
nix-index-database,
... ...
}@inputs: }:
let let
nixvimOverlay = (final: prev: { nixvim = self.packages.${prev.stdenv.system}.nixvim; }); editorOverlay = (
final: prev: {
inherit (nix-vscode-extensions.extensions.${prev.stdenv.system}) vscode-marketplace;
inherit (self.packages.${prev.stdenv.system}) nixvim;
}
);
overlayModule = overlayModule =
{ ... }: { ... }:
{ {
nixpkgs.overlays = [ nixpkgs.overlays = [
nixvimOverlay editorOverlay
(import ./overlays/add-pkgs.nix) (import ./overlays/add-pkgs.nix)
]; ];
}; };
deploymentModule = { deploymentModule = {
deployment.targetUser = "xin"; deployment.targetUser = "xin";
}; };
sharedColmenaModules = [
self.nixosModules.default
deploymentModule
];
sharedHmModules = [ sharedHmModules = [
inputs.sops-nix.homeManagerModules.sops self.homeManagerModules.default
inputs.nix-index-database.hmModules.nix-index sops-nix.homeManagerModules.sops
nix-index-database.hmModules.nix-index
catppuccin.homeManagerModules.catppuccin catppuccin.homeManagerModules.catppuccin
self.homeManagerModules
]; ];
sharedNixosModules = [
self.nixosModules.default
sops-nix.nixosModules.sops
];
nodeNixosModules = {
calcite = [
nixos-hardware.nixosModules.asus-zephyrus-ga401
nur.nixosModules.nur
catppuccin.nixosModules.catppuccin
machines/calcite/configuration.nix
(mkHome "xin" "calcite")
];
};
sharedColmenaModules = [
deploymentModule
] ++ sharedNixosModules;
mkHome = mkHome =
user: host: user: host:
{ ... }: { ... }:
@ -98,43 +119,29 @@
sharedModules = sharedHmModules; sharedModules = sharedHmModules;
useGlobalPkgs = true; useGlobalPkgs = true;
useUserPackages = true; useUserPackages = true;
extraSpecialArgs = {
inherit inputs;
};
}; };
home-manager.users.${user} = (import ./home).${user}.${host}; home-manager.users.${user} = (import ./home).${user}.${host};
} }
]; ];
}; };
mkHomeConfiguration = user: host: {
name = user;
value = home-manager.lib.homeManagerConfiguration {
pkgs = import nixpkgs { system = "x86_64-linux"; };
modules = [
(import ./home).${user}.${host}
overlayModule
] ++ sharedHmModules;
extraSpecialArgs = {
inherit inputs;
};
};
};
mkNixos = mkNixos =
{ {
system, hostname,
modules, system ? null,
specialArgs ? { },
}: }:
nixpkgs.lib.nixosSystem { nixpkgs.lib.nixosSystem {
inherit system; modules = sharedNixosModules ++ nodeNixosModules.${hostname};
specialArgs = specialArgs // { };
inherit inputs system; # TODO:
mkColmenaHive =
{
hostname,
}:
colmena.lib.makeHive {
meta = {
# FIXME:
nixpkgs = import nixpkgs { system = "x86_64-linux"; };
}; };
modules = [
self.nixosModules.default
nur.nixosModules.nur
catppuccin.nixosModules.catppuccin
] ++ modules;
}; };
in in
{ {
@ -145,16 +152,12 @@
overlayModule overlayModule
]; ];
}; };
homeManagerModules = import ./modules/home-manager; homeManagerModules.default = import ./modules/home-manager;
homeConfigurations = builtins.listToAttrs [ (mkHomeConfiguration "xin" "calcite") ]; colmenaHive = colmena.lib.makeHive {
colmenaHive = inputs.colmena.lib.makeHive {
meta = { meta = {
# FIXME:
nixpkgs = import nixpkgs { system = "x86_64-linux"; }; nixpkgs = import nixpkgs { system = "x86_64-linux"; };
specialArgs = {
inherit inputs;
};
}; };
massicot = massicot =
@ -241,12 +244,7 @@
nixosConfigurations = { nixosConfigurations = {
calcite = mkNixos { calcite = mkNixos {
system = "x86_64-linux"; hostname = "calcite";
modules = [
nixos-hardware.nixosModules.asus-zephyrus-ga401
machines/calcite/configuration.nix
(mkHome "xin" "calcite")
];
}; };
} // self.colmenaHive.nodes; } // self.colmenaHive.nodes;
@ -255,6 +253,17 @@
system: system:
let let
pkgs = nixpkgs.legacyPackages.${system}; pkgs = nixpkgs.legacyPackages.${system};
mkHomeConfiguration = user: host: {
name = user;
value = home-manager.lib.homeManagerConfiguration {
inherit pkgs;
modules = [
(import ./home).${user}.${host}
overlayModule
] ++ sharedHmModules;
};
};
in in
{ {
devShells = { devShells = {
@ -262,16 +271,19 @@
packages = with pkgs; [ packages = with pkgs; [
nix nix
git git
inputs.colmena.packages.${system}.colmena colmena.packages.${system}.colmena
sops sops
nix-output-monitor nix-output-monitor
nil nil
nvd nvd
nh nh
(python3.withPackages (ps: with ps; [ requests ]))
]; ];
}; };
}; };
homeConfigurations = builtins.listToAttrs [ (mkHomeConfiguration "xin" "calcite") ];
packages = { packages = {
nixvim = my-nixvim.packages.${system}.default; nixvim = my-nixvim.packages.${system}.default;
}; };

View file

@ -38,6 +38,8 @@ in
remmina remmina
qq qq
wechat-uos wechat-uos
wpsoffice
ttf-wps-fonts
]; ];
# Theme # Theme

View file

@ -16,6 +16,7 @@ in
]; ];
commonSettings = { commonSettings = {
auth.enable = true;
nix = { nix = {
enableMirrors = true; enableMirrors = true;
signing.enable = true; signing.enable = true;
@ -35,6 +36,11 @@ in
boot.supportedFilesystems = [ "ntfs" ]; boot.supportedFilesystems = [ "ntfs" ];
boot.binfmt.emulatedSystems = [ "aarch64-linux" ]; boot.binfmt.emulatedSystems = [ "aarch64-linux" ];
documentation = {
nixos.enable = false;
man.enable = false;
};
security.tpm2 = { security.tpm2 = {
enable = true; enable = true;
# expose /run/current-system/sw/lib/libtpm2_pkcs11.so # expose /run/current-system/sw/lib/libtpm2_pkcs11.so
@ -114,13 +120,15 @@ in
xdg.portal = { xdg.portal = {
enable = true; enable = true;
extraPortals = [ extraPortals = [
pkgs.xdg-desktop-portal-gtk
pkgs.xdg-desktop-portal-gnome pkgs.xdg-desktop-portal-gnome
pkgs.xdg-desktop-portal-gtk
]; ];
configPackages = [ pkgs.niri ]; configPackages = [ pkgs.niri ];
}; };
systemd.user.services.xdg-desktop-portal-gtk.after = [ "graphical-session.target" ]; systemd.user.services.xdg-desktop-portal-gtk.after = [ "graphical-session.target" ];
systemd.user.services.xdg-desktop-portal-gnome.after = [ "graphical-session.target" ];
systemd.user.services.xdg-desktop-portal-gnome.wantedBy = [ "graphical-session.target" ];
services.greetd = services.greetd =
let let
@ -156,6 +164,15 @@ in
}; };
}; };
}; };
"logiM720" = {
ids = [ "046d:b015" ];
settings = {
main = {
mouse2 = "leftmeta";
# leftalt = "mouse1";
};
};
};
}; };
}; };
@ -202,6 +219,7 @@ in
services.smartd.enable = true; services.smartd.enable = true;
# Allow unfree packages # Allow unfree packages
nixpkgs.system = "x86_64-linux";
nixpkgs.config.allowUnfree = true; nixpkgs.config.allowUnfree = true;
nixpkgs.config.permittedInsecurePackages = [ nixpkgs.config.permittedInsecurePackages = [
"openssl-1.1.1w" "openssl-1.1.1w"
@ -281,7 +299,6 @@ in
# Writting # Writting
zotero zotero
# onlyoffice-bin # onlyoffice-bin
wpsoffice
config.nur.repos.linyinfeng.wemeet config.nur.repos.linyinfeng.wemeet

View file

@ -58,31 +58,8 @@ in
exporters.blackbox.enable = true; exporters.blackbox.enable = true;
}; };
custom.kanidm-client = { custom.commonSettings = {
enable = true; auth.enable = true;
uri = "https://auth.xinyang.life/";
asSSHAuth = {
enable = true;
allowedGroups = [ "linux_users" ];
};
sudoers = [ "xin@auth.xinyang.life" ];
};
services.openssh = {
settings = {
PasswordAuthentication = false;
KbdInteractiveAuthentication = false;
PermitRootLogin = lib.mkForce "no";
GSSAPIAuthentication = "no";
KerberosAuthentication = "no";
};
};
services.fail2ban.enable = true;
programs.mosh.enable = true;
security.sudo = {
execWheelOnly = true;
wheelNeedsPassword = false;
}; };
services.sing-box = services.sing-box =

View file

@ -1,12 +1,10 @@
{ {
inputs,
pkgs, pkgs,
... ...
}: }:
{ {
imports = [ imports = [
inputs.sops-nix.nixosModules.sops
./hardware-configuration.nix ./hardware-configuration.nix
./networking.nix ./networking.nix
./services.nix ./services.nix

View file

@ -101,7 +101,6 @@ in
services.matrix-conduit = { services.matrix-conduit = {
enable = true; enable = true;
# package = inputs.conduit.packages.${pkgs.system}.default;
package = pkgs.matrix-conduit; package = pkgs.matrix-conduit;
settings.global = { settings.global = {
server_name = "xinyang.life"; server_name = "xinyang.life";

View file

@ -1,11 +1,9 @@
{ {
inputs,
config, config,
lib, lib,
... ...
}: }:
{ {
imports = [ inputs.sops-nix.nixosModules.sops ];
config = { config = {
sops = { sops = {
defaultSopsFile = ./secrets.yaml; defaultSopsFile = ./secrets.yaml;

View file

@ -1,14 +1,13 @@
{ {
inputs,
config, config,
pkgs, pkgs,
lib,
modulesPath, modulesPath,
... ...
}: }:
{ {
imports = [ imports = [
inputs.sops-nix.nixosModules.sops
(modulesPath + "/profiles/qemu-guest.nix") (modulesPath + "/profiles/qemu-guest.nix")
./services ./services
]; ];
@ -150,6 +149,15 @@
permitCertUid = "caddy"; permitCertUid = "caddy";
}; };
services.tailscale.derper = {
enable = true;
domain = "derper00.namely.icu";
openFirewall = true;
verifyClients = true;
};
# tailscale derper module use nginx for reverse proxy
services.nginx.enable = lib.mkForce false;
services.caddy = { services.caddy = {
enable = true; enable = true;
package = pkgs.caddy.withPlugins { package = pkgs.caddy.withPlugins {
@ -165,6 +173,9 @@
]; ];
vendorHash = "sha256-OhOeU2+JiJyIW9WdCYq98OKckXQZ9Fn5zULz0aLsXMI="; vendorHash = "sha256-OhOeU2+JiJyIW9WdCYq98OKckXQZ9Fn5zULz0aLsXMI=";
}; };
virtualHosts."derper00.namely.icu:8443".extraConfig = ''
reverse_proxy 127.0.0.1:${toString config.services.tailscale.derper.port}
'';
virtualHosts."weilite.coho-tet.ts.net:8080".extraConfig = '' virtualHosts."weilite.coho-tet.ts.net:8080".extraConfig = ''
reverse_proxy 127.0.0.1:${toString config.services.immich.port} reverse_proxy 127.0.0.1:${toString config.services.immich.port}
''; '';

View file

@ -2,5 +2,6 @@
imports = [ imports = [
./ocis.nix ./ocis.nix
./restic.nix ./restic.nix
./media-download.nix
]; ];
} }

View file

@ -0,0 +1,6 @@
{
services.jackett = {
enable = true;
openFirewall = false;
};
}

View file

@ -84,8 +84,12 @@ in
enable = true; enable = true;
timeouts = [ timeouts = [
{ {
timeout = 900; timeout = 600;
command = "/run/current-system/systemd/bin/systemctl suspend"; command = ''[ "$(${pkgs.tlp}/bin/tlp-stat -m)" == "battery" ] && /run/current-system/systemd/bin/systemctl suspend'';
}
{
timeout = 1200;
command = ''${getExe pkgs.niri} msg action power-off-monitors'';
} }
]; ];
events = [ events = [

View file

@ -1,5 +1,4 @@
{ {
inputs,
config, config,
lib, lib,
pkgs, pkgs,
@ -16,7 +15,7 @@ let
nixd nixd
nixpkgs-fmt nixpkgs-fmt
]; ];
extension = with inputs.nix-vscode-extensions.extensions.${pkgs.system}.vscode-marketplace; [ extension = with pkgs.vscode-marketplace; [
jnoortheen.nix-ide jnoortheen.nix-ide
]; ];
settings = { settings = {
@ -30,13 +29,16 @@ let
clang-tools clang-tools
cmake-format cmake-format
]; ];
extension = with inputs.nix-vscode-extensions.extensions.${pkgs.system}.vscode-marketplace; [ extension =
llvm-vs-code-extensions.vscode-clangd with pkgs.vscode-marketplace;
(ms-vscode.cmake-tools.overrideAttrs (_: { [
sourceRoot = "extension"; llvm-vs-code-extensions.vscode-clangd
})) (ms-vscode.cmake-tools.overrideAttrs (_: {
twxs.cmake sourceRoot = "extension";
] ++ (with pkgs.vscode-extensions; [ ms-vscode.cpptools ]); }))
twxs.cmake
]
++ (with pkgs.vscode-extensions; [ ms-vscode.cpptools ]);
settings = { settings = {
"cmake.configureOnEdit" = false; "cmake.configureOnEdit" = false;
"cmake.showOptionsMovedNotification" = false; "cmake.showOptionsMovedNotification" = false;
@ -50,7 +52,7 @@ let
}; };
pythonPackages = { pythonPackages = {
systemPackages = with pkgs; [ ]; systemPackages = with pkgs; [ ];
extension = with inputs.nix-vscode-extensions.extensions.${pkgs.system}.vscode-marketplace; [ extension = with pkgs.vscode-marketplace; [
ms-python.python ms-python.python
]; ];
settings = { }; settings = { };
@ -60,7 +62,7 @@ let
coursier coursier
metals metals
]; ];
extension = with inputs.nix-vscode-extensions.extensions.${pkgs.system}.vscode-marketplace; [ extension = with pkgs.vscode-marketplace; [
scala-lang.scala scala-lang.scala
scalameta.metals scalameta.metals
]; ];
@ -68,7 +70,7 @@ let
}; };
latexPackages = { latexPackages = {
systemPackages = with pkgs; [ texliveSmall ]; systemPackages = with pkgs; [ texliveSmall ];
extension = with inputs.nix-vscode-extensions.extensions.${pkgs.system}.vscode-marketplace; [ extension = with pkgs.vscode-marketplace; [
james-yu.latex-workshop james-yu.latex-workshop
]; ];
settings = { settings = {
@ -184,7 +186,7 @@ in
mutableExtensionsDir = false; mutableExtensionsDir = false;
extensions = lib.mkMerge ( extensions = lib.mkMerge (
[ [
(with inputs.nix-vscode-extensions.extensions.${pkgs.system}.vscode-marketplace; [ (with pkgs.vscode-marketplace; [
mkhl.direnv mkhl.direnv
ms-azuretools.vscode-docker ms-azuretools.vscode-docker

View file

@ -0,0 +1,96 @@
{
config,
pkgs,
lib,
...
}:
let
cfg = config.xdg.autoStart;
inherit (lib) hm types;
in
{
options.xdg.autoStart = {
packages = lib.mkOption {
description = ''
List of packages which should be autostarted.
This module tries to select the packages default desktop file,
which is either described by its .desktopItem attribute
or by its first entry of its .desktopItems attribute.
Users who want to specifically select a certain desktop file
or who want to write their own
can make use of the {option}`xdg.autoStart.desktopItems` option.
'';
type = types.listOf types.package;
default = [ ];
example = lib.literalExpression ''
with pkgs; [
pkgs.trilium-desktop
]
'';
};
desktopItems = lib.mkOption {
description = ''
List of desktop files which should be autostarted.
Users should prefer to use {option}`xdg.autoStart.packages`
and only use this option in case
they want to specifically
select a packages desktop item
or want to create their own desktop item.
Be warned, this may shadow entries of {option}`xdg.autoStart.packages`.
'';
type = types.attrsOf (types.unspecified); # TODO replace unspecified
default = { };
# TODO improve example, take one where it would make sense to use this option
example = lib.literalExpression ''
{
discord = pkgs.discord.desktopItem
firefox-custom = makeDesktopItem {
exec = "firefox -P custom";
};
}
'';
};
};
config =
let
# helpers
retrieveDesktopItem = (
pkg:
if pkg ? desktopItem then
pkg.desktopItem
else if pkg ? desktopItems && pkg.desktopItems != [ ] then
builtins.head pkg.desktopItems
else
abort "package '${pkg.pname}' is missing a desktop file"
);
emulateDesktopItem = (pkg: lib.nameValuePair pkg.pname (retrieveDesktopItem pkg));
embedDesktopItem = (
name: deskItem:
lib.nameValuePair "autostart/${name}.desktop" {
source = "${deskItem}/share/applications/${deskItem.name}";
}
);
# parse opts
desktopItemsPackages = builtins.listToAttrs (map emulateDesktopItem cfg.packages);
desktopItems = desktopItemsPackages // cfg.desktopItems;
in
{
assertions = [
(hm.assertions.assertPlatform "xdg.autoStart" pkgs lib.platforms.linux)
];
xdg.configFile = lib.attrsets.mapAttrs' embedDesktopItem desktopItems;
};
}

View file

@ -26,10 +26,9 @@ in
bind "Ctrl l" { MoveFocusOrTab "Right"; } bind "Ctrl l" { MoveFocusOrTab "Right"; }
bind "Ctrl j" { MoveFocus "Down"; } bind "Ctrl j" { MoveFocus "Down"; }
bind "Ctrl k" { MoveFocus "Up"; } bind "Ctrl k" { MoveFocus "Up"; }
unbind "Alt h" "Alt l" "Alt j" "Alt k" unbind "Alt h" "Alt l" "Alt j" "Alt k" "Alt f"
} }
unbind "Ctrl p" "Ctrl n" unbind "Ctrl p" "Ctrl n"
unbind "Alt f"
} }
''; '';
}; };

View file

@ -0,0 +1,165 @@
{
config,
lib,
pkgs,
...
}:
let
inherit (lib)
mkIf
mkEnableOption
mkOption
types
;
cfg = config.commonSettings.proxyServer;
singTls = {
enabled = true;
server_name = config.deployment.targetHost;
key_path = config.security.acme.certs.${config.deployment.targetHost}.directory + "/key.pem";
certificate_path =
config.security.acme.certs.${config.deployment.targetHost}.directory + "/cert.pem";
};
mkSingConfig =
{ uuid, password, ... }:
{
inbounds =
[
{
tag = "sg0";
type = "trojan";
listen = "::";
listen_port = 8080;
users = [
{
name = "proxy";
password = password;
}
];
tls = singTls;
}
]
++ lib.forEach (lib.range 6311 6314) (port: {
tag = "sg" + toString (port - 6310);
type = "tuic";
listen = "::";
listen_port = port;
congestion_control = "bbr";
users = [
{
name = "proxy";
uuid = uuid;
password = password;
}
];
tls = singTls;
});
outbounds = [
{
type = "wireguard";
tag = "wg-out";
private_key = {
_secret = config.sops.secrets.wg_private_key.path;
};
local_address = [
"172.16.0.2/32"
{ _secret = config.sops.secrets.wg_ipv6_local_addr.path; }
];
peers = [
{
public_key = "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=";
allowed_ips = [
"0.0.0.0/0"
"::/0"
];
server = "162.159.192.1";
server_port = 500;
}
];
}
{
type = "direct";
tag = "direct";
}
];
route = {
rules = [
{
inbound = "sg0";
outbound = "direct";
}
{
inbound = "sg4";
outbound = "direct";
}
];
};
};
in
{
options.commonSettings.proxyServer = {
enable = mkEnableOption "sing-box as a server";
uuidFile = mkOption {
type = types.path;
};
passwordFile = mkOption {
type = types.path;
};
};
config = mkIf cfg.enable {
boot.kernel.sysctl = {
"net.core.default_qdisc" = "fq";
"net.ipv4.tcp_congestion_control" = "bbr";
};
networking.firewall.trustedInterfaces = [ "tun0" ];
sops = {
secrets = {
wg_private_key = {
owner = "root";
sopsFile = ./secrets + "/${config.networking.hostName}.yaml";
};
wg_ipv6_local_addr = {
owner = "root";
sopsFile = ./secrets + "/${config.networking.hostName}.yaml";
};
};
};
security.acme = {
acceptTerms = true;
certs.${config.deployment.targetHost} = {
email = "me@namely.icu";
# Avoid port conflict
listenHTTP = if config.services.caddy.enable then ":30310" else ":80";
};
};
services.caddy.virtualHosts."http://${config.deployment.targetHost}:80".extraConfig = ''
reverse_proxy 127.0.0.1:30310
'';
networking.firewall.allowedTCPPorts = [
80
8080
];
networking.firewall.allowedUDPPorts = [ ] ++ (lib.range 6311 6314);
custom.prometheus = {
enable = true;
exporters.blackbox.enable = true;
};
services.sing-box = {
enable = true;
settings = mkSingConfig {
uuid = cfg.uuidFile;
password = cfg.passwordFile;
};
};
};
}

View file

@ -1,3 +1,5 @@
(final: prev: { (
oidc-agent = prev.callPackage ./pkgs/oidc-agent { }; final: prev:
}) {
}
)