infrastructure

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 01d6c943688e5b14c9b9ec7195a07b8acdb8442a
parent 257a8ff4db0149a892b8a2fc9aa7406c47d64ef8
Author: Silas Brack <silasbrack@gmail.com>
Date:   Tue,  7 Apr 2026 13:04:28 +0200

feat: add gaia desktop

Diffstat:
MMakefile | 5++++-
Mflake.lock | 39+++++++++++++++++++++++++++++++++++++++
Mflake.nix | 25++++++++++++++++++++++---
Rnixos/configuration-debian-2gb-hel1-1.nix -> nixos/debian-2gb-hel1-1.nix | 0
Anixos/gaia/configuration.nix | 549+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Anixos/gaia/hardware-configuration.nix | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Anixos/gaia/home.nix | 286+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Anixos/gaia/hyprland.nix | 594+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Anixos/gaia/vpn.nix | 41+++++++++++++++++++++++++++++++++++++++++
Rnixos/configuration-nixos-s-1vcpu-512mb-10gb-ams3-01.nix -> nixos/nixos-s-1vcpu-512mb-10gb-ams3-01.nix | 0
Msecrets.yaml | 9++++++---
11 files changed, 1592 insertions(+), 7 deletions(-)

diff --git a/Makefile b/Makefile @@ -1,4 +1,4 @@ -.PHONY: deploy-digitalocean deploy-hetzner +.PHONY: deploy-digitalocean deploy-hetzner deploy-gaia ## Deploy configuration to production server deploy-digitalocean: @@ -7,3 +7,6 @@ deploy-digitalocean: deploy-hetzner: nixos-rebuild test --show-trace --no-reexec --flake .#debian-2gb-hel1-1 --target-host root@46.62.150.48 +deploy-gaia: + sudo nixos-rebuild switch --flake .#gaia + diff --git a/flake.lock b/flake.lock @@ -18,6 +18,27 @@ "type": "github" } }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775425411, + "narHash": "sha256-KY6HsebJHEe5nHOWP7ur09mb0drGxYSzE3rQxy62rJo=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "0d02ec1d0a05f88ef9e74b516842900c41f0f2fe", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "release-25.11", + "repo": "home-manager", + "type": "github" + } + }, "mkv": { "inputs": { "flake-utils": "flake-utils", @@ -53,6 +74,22 @@ "type": "github" } }, + "nixpkgs-unstable": { + "locked": { + "lastModified": 1775423009, + "narHash": "sha256-vPKLpjhIVWdDrfiUM8atW6YkIggCEKdSAlJPzzhkQlw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "68d8aa3d661f0e6bd5862291b5bb263b2a6595c9", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs_2": { "locked": { "lastModified": 1775002709, @@ -153,8 +190,10 @@ }, "root": { "inputs": { + "home-manager": "home-manager", "mkv": "mkv", "nixpkgs": "nixpkgs_2", + "nixpkgs-unstable": "nixpkgs-unstable", "simple-web-app": "simple-web-app", "sops-nix": "sops-nix", "website": "website" diff --git a/flake.nix b/flake.nix @@ -1,6 +1,7 @@ { inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; + nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable"; sops-nix.url = "github:Mic92/sops-nix"; simple-web-app.url = "github:silasbrack/simple-web-app"; mkv.url = "git+ssh://git@github.com/silasbrack/mkv"; @@ -8,27 +9,36 @@ url = "git+ssh://forgejo@git.fnarglebeast.com/silas/website.git"; flake = false; }; + home-manager = { + url = "github:nix-community/home-manager/release-25.11"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; outputs = { nixpkgs, + nixpkgs-unstable, sops-nix, simple-web-app, mkv, website, + home-manager, ... }: let system = "x86_64-linux"; pkgs = import nixpkgs { inherit system; }; + pkgs-unstable = import nixpkgs-unstable { + inherit system; + config.allowUnfree = true; + }; in { - # production configuration nixosConfigurations.nixos-s-1vcpu-512mb-10gb-ams3-01 = nixpkgs.lib.nixosSystem { inherit system; modules = [ sops-nix.nixosModules.sops - (import ./nixos/configuration-nixos-s-1vcpu-512mb-10gb-ams3-01.nix) + (import ./nixos/nixos-s-1vcpu-512mb-10gb-ams3-01.nix) ]; }; nixosConfigurations.debian-2gb-hel1-1 = nixpkgs.lib.nixosSystem { @@ -40,10 +50,19 @@ pkgs, ... }: - import ./nixos/configuration-debian-2gb-hel1-1.nix (inputs // { inherit simple-web-app mkv website; }) + import ./nixos/debian-2gb-hel1-1.nix (inputs // { inherit simple-web-app mkv website; }) ) ]; }; + nixosConfigurations.gaia = nixpkgs.lib.nixosSystem { + inherit system; + specialArgs = { inherit pkgs-unstable; }; + modules = [ + sops-nix.nixosModules.sops + ./nixos/gaia/configuration.nix + home-manager.nixosModules.home-manager + ]; + }; devShells."${system}".default = let pkgs = import nixpkgs { diff --git a/nixos/configuration-debian-2gb-hel1-1.nix b/nixos/debian-2gb-hel1-1.nix diff --git a/nixos/gaia/configuration.nix b/nixos/gaia/configuration.nix @@ -0,0 +1,549 @@ +{ + config, + pkgs, + pkgs-unstable, + lib, + ... +}: + +{ + imports = [ + ./hardware-configuration.nix + ./home.nix + ./vpn.nix + ]; + + sops.defaultSopsFile = ../../secrets.yaml; + sops.age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ]; + + sops.secrets.gaia_wireguard_private_key = { + restartUnits = [ "wg-quick-wg0.service" ]; + }; + sops.secrets.gaia_forgejo_runner_token = { }; + sops.secrets.gaia_gitea_sunner_ssh_key = { }; + + nix.settings.experimental-features = [ + "nix-command" + "flakes" + ]; + nix.gc = { + automatic = true; + dates = "weekly"; + options = "--delete-older-than 30d"; + }; + nix.settings = { + max-jobs = 2; + cores = 4; + }; + + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + + boot.kernelPackages = pkgs.linuxPackages_latest; + boot.initrd.kernelModules = [ "amdgpu" ]; + + nixpkgs.config.rocmSupport = true; + hardware.graphics = { + enable = true; + enable32Bit = true; + }; + hardware.graphics.extraPackages = [ pkgs.rocmPackages.clr ]; + + networking.hostName = "gaia"; + networking.networkmanager.enable = true; + networking.networkmanager.wifi.powersave = false; + networking.networkmanager.dispatcherScripts = [ + { + source = + (pkgs.writeShellApplication { + name = "link_change.sh"; + runtimeInputs = [ pkgs.networkmanager ]; + text = '' + logger "$0" "$@" + ''; + }).out + + "/bin/" + + "link_change.sh"; + } + ]; + + hardware.enableRedistributableFirmware = true; + + time.timeZone = "Europe/Copenhagen"; + i18n.defaultLocale = "en_DK.UTF-8"; + i18n.extraLocaleSettings = { + LC_ADDRESS = "en_US.UTF-8"; + LC_IDENTIFICATION = "en_US.UTF-8"; + LC_MEASUREMENT = "en_US.UTF-8"; + LC_MONETARY = "en_US.UTF-8"; + LC_NAME = "en_US.UTF-8"; + LC_NUMERIC = "en_US.UTF-8"; + LC_PAPER = "en_US.UTF-8"; + LC_TELEPHONE = "en_US.UTF-8"; + LC_TIME = "en_US.UTF-8"; + }; + + programs.hyprland.enable = true; + services.greetd = { + enable = true; + settings = { + initial_session = { + command = "${pkgs.hyprland}/bin/Hyprland"; + user = "silas"; + }; + default_session = { + command = "${pkgs.tuigreet}/bin/tuigreet --greeting 'Welcome to NixOS!' --asterisks --remember --remember-user-session --time --cmd ${pkgs.hyprland}/bin/Hyprland"; + user = "greeter"; + }; + }; + }; + + services.pulseaudio.enable = false; + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + jack.enable = true; + }; + + # Enable touchpad support (enabled default in most desktopManager). + # services.xserver.libinput.enable = true; + + # nixpkgs.config.allowUnfree = true; + nixpkgs.config.allowUnsupportedSystem = true; + nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ + "claude-code" + "steam" + "steam-unwrapped" + "spotify" + ]; + + fonts.packages = with pkgs; [ + nerd-fonts.jetbrains-mono + nerd-fonts.iosevka + font-bitstream-type1 + merriweather + (pkgs.runCommand "cooper-hewitt-fixed" { + nativeBuildInputs = [ pkgs.python3Packages.fonttools ]; + } '' + mkdir -p $out/share/fonts/opentype + + python3 - \ + ${pkgs.cooper-hewitt}/share/fonts/opentype \ + $out/share/fonts/opentype \ + << 'EOF' +import sys, os +from fontTools.ttLib import TTFont + +# Must be ordered: longer/more-specific names first +# to avoid e.g. "Bold" matching inside "SemiBold" +weight_map = [ + ("Thin", 100), + ("Light", 300), + ("Book", 400), + ("Medium", 500), + ("Semibold", 600), + ("SemiBold", 600), + ("Bold", 700), + ("Heavy", 800), +] + +src_dir, out_dir = sys.argv[1], sys.argv[2] + +for fname in sorted(os.listdir(src_dir)): + if not fname.endswith((".otf", ".ttf")): + continue + path = os.path.join(src_dir, fname) + font = TTFont(path) + old_w = font["OS/2"].usWeightClass + matched = False + for key, w in weight_map: + if key in fname: + font["OS/2"].usWeightClass = w + print(f"{fname}: {old_w} -> {w}") + matched = True + break + if not matched: + print(f"WARNING: no weight match for {fname}", flush=True) + font.save(os.path.join(out_dir, fname)) +EOF + '') + ]; + + users.users.silas = { + isNormalUser = true; + description = "Silas Brack"; + extraGroups = [ + "networkmanager" + "wheel" + "render" + "video" + "audio" + "jackaudio" + ]; + openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDdP3Rvuv/pjQ/7akONRmId3zx7RE5Wqz+0V6eHy+KlE silasbrack@gmail.com" + ]; + packages = with pkgs; [ + # anki + bitwarden-cli + bitwarden-desktop + # blender + claude-code + # discord + # duckdb + rocmPackages.clr + rocmPackages.rocm-smi + rocmPackages.rocminfo + (pkgs.haskellPackages.ghcWithPackages (ps: [ ps.tidal ])) + pkgs.supercollider-with-sc3-plugins + pkgs.ghc + pkgs.jack2 + pkgs.opencode + (emacs.pkgs.withPackages (ep: [ + ep.magit + ep.eat + ep.inheritenv + ep.emms + ep.expand-region + ep.hyperbole + ep.projectile + ep.tidal + ep.htmlize + ep.ox-pandoc + ep.notmuch + (ep.treesit-grammars.with-grammars (g: [ + g.tree-sitter-python + g.tree-sitter-rust + g.tree-sitter-nix + ])) + ])) + # entr + fd + feh + # ffmpeg + # gcc + # gimp + # gnumake + # hadolint + # inkscape + isync + jq + # kiwix + # lazygit + ledger + # localsend + # mosh + mpv + msmtp + # ncdu + # nil + # nixfmt-rfc-style + notmuch + # obs-studio + # obsidian + pandoc + # pass + # pdftk + # prettierd + # rclone + ripgrep + # rsync + # shellcheck + # signal-desktop + spotify + # sqlite + # streamlink + # streamlink-twitch-gui-bin + # sublime4 + transmission_4-qt + # yt-dlp + # zotero + ]; + }; + + environment.systemPackages = with pkgs; [ + curl + gnupg + pavucontrol + wget + universal-ctags + unzip + # + hyprlock + hypridle + wl-clipboard + ]; + + programs.vim = { + enable = true; + defaultEditor = true; + package = (pkgs.vim.override { }).customize { + name = "vim"; + # vimrcConfig.packages.myplugins = with pkgs.vimPlugins; { + # start = [ vim-nix vim-surround undotree ]; + # opt = []; + # }; + vimrcConfig.customRC = '' + set backspace=indent,eol,start + + set showmatch + set incsearch + set hlsearch + set ignorecase + set smartcase + + set wildmenu + set wildoptions=pum + + set hidden + + set autoindent + + set number + set relativenumber + + set tabstop=4 + set shiftwidth=4 + + set expandtab + set showmatch + + filetype plugin indent on + syntax on + + set shell=/run/current-system/sw/bin/bash + set tags=./tags,tags + + nnoremap gb :ls<CR>:b<Space> + nnoremap gs :vimgrep /\%1l/ `fd -t=f `<left> + nnoremap gS :vimgrep // `fd -t=f`<C-left><C-left><C-left><right> + + nnoremap <nowait><silent> <C-l> :noh<CR> + + nnoremap [q :cprev<CR> + nnoremap ]q :cnext<CR> + nnoremap [Q :cfirst<CR> + nnoremap ]Q :clast<CR> + ''; + }; + }; + + environment.sessionVariables = { + EDITOR = "vim"; + BROWSER = "firefox"; + TERM = "kitty"; + SHELL = "bash"; + HISTIGNORE = "&:ls:exit:pwd:clear:tmux:bash:nvim"; + }; + + programs.bash = { + shellAliases = { + bitwarden-search = '' read -p 'Search in Bitwarden: ' QUERY && RESULTS=$(bw list items --search "$QUERY") && echo "$RESULTS" | jq -r '.[] | [.name, .login.username, .login.password] | @tsv' | fzf --delimiter='\t' --nth='1,2' --with-nth='{1,2}' --accept-nth='Username: {2}' --bind 'enter:execute(echo -n {3} | wl-copy -o)+accept' ''; + loadenv = "set -a; source .env; set +a;"; + }; + }; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + programs.steam = { + enable = true; + remotePlay.openFirewall = true; # Open ports in the firewall for Steam Remote Play + dedicatedServer.openFirewall = true; # Open ports in the firewall for Source Dedicated Server + localNetworkGameTransfers.openFirewall = true; # Open ports in the firewall for Steam Local Network Game Transfers + }; + + services.openssh.enable = true; + + services.ollama = { + enable = true; + package = pkgs-unstable.ollama-rocm; + acceleration = "rocm"; + rocmOverrideGfx = "11.0.1"; + environmentVariables = { + HSA_OVERRIDE_GFX_VERSION = "11.0.1"; + # Use UUID to prefer discrete GPU over iGPU + ROCR_VISIBLE_DEVICES = "GPU-198836ed61e1b1cc"; + }; + }; + + services.paperless = { + enable = true; + settings = { + PAPERLESS_DBHOST = "/run/postgresql"; + PAPERLESS_DATE_ORDER = "YMD"; + PAPERLESS_OCR_LANGUAGE = "deu+eng"; + PAPERLESS_OCR_USER_ARGS = { + # optimize = true; + invalidate_digital_signatures = true; + }; + }; + }; + + services.syncthing = { + enable = true; + user = "silas"; + dataDir = "/home/silas/.syncthing"; + configDir = "/home/silas/.config/syncthing"; + settings = { + devices = { + "Lolo's Macbook Pro" = { + id = "AODRMP6-CEUBLIG-QFOJBXH-2S5DZ43-F2OSK7I-DDLXY3A-OSGZZEY-GKG4EQF"; + }; + "Pixel 6a" = { + id = "W3J66VB-KZYFQXI-UKL5XNO-D6W4KSA-2YAB7AZ-2BJ2BXA-T5ID4YA-NR22FQD"; + }; + "Work Macbook Pro" = { + id = "W3RN76W-PDTHRF7-QYT6LAV-ML5OR5D-IH4MTHC-IQRJT6C-R7JGYYS-ISMEKQ6"; + }; + }; + folders = { + "Notes" = { + id = "7mruq-r5ufp"; + path = "/home/silas/notes"; + devices = [ + "Lolo's Macbook Pro" + "Pixel 6a" + "Work Macbook Pro" + ]; + }; + "Textbooks" = { + id = "z7wzr-eolsr"; + path = "/home/silas/docs/textbooks/"; + devices = [ + "Lolo's Macbook Pro" + "Pixel 6a" + "Work Macbook Pro" + ]; + }; + "Test" = { + id = "tkc8u-s54c3"; + path = "~/test"; + devices = [ "Lolo's Macbook Pro" ]; + }; + "Zotero" = { + id = "7xkgb-tuqgw"; + path = "/home/silas/Zotero/storage"; + devices = [ "Lolo's Macbook Pro" ]; + }; + }; + }; + }; + + services.postgresql = { + enable = true; + package = pkgs.postgresql_17; + extensions = ps: with ps; [ pgvector ]; + ensureDatabases = [ + "paperless" + ]; + ensureUsers = [ + { + name = "paperless"; + ensureDBOwnership = true; + } + ]; + authentication = pkgs.lib.mkOverride 10 '' + #TYPE DATABASE USER AUTH-METHOD OPTIONAL_IDENT_MAP + # local all all peer map=superuser_map + local all all trust + #TYPE DATABASE USER ADDRESS AUTH-METHOD + host all all 127.0.0.1/32 trust + host all all ::1/128 trust + ''; + identMap = '' + # MAPNAME SYSTEM-USERNAME PG-USERNAME + superuser_map root postgres + superuser_map postgres postgres + superuser_map /^(.*)$ \1 + ''; + }; + + services.nginx = { + enable = true; + virtualHosts."mkv-volume" = { + listen = [ + { addr = "10.100.0.4"; port = 8081; } + ]; + root = "/var/lib/mkv/volume"; + extraConfig = '' + autoindex on; + autoindex_format json; + dav_methods PUT DELETE; + create_full_put_path on; + client_max_body_size 256M; + ''; + }; + }; + systemd.tmpfiles.rules = [ + "d /var/lib/mkv/volume 0755 nginx nginx -" + ]; + networking.firewall.interfaces.wg0.allowedTCPPorts = [ 8081 ]; + systemd.services.nginx.serviceConfig = { + ReadWritePaths = [ "/var/lib/mkv/volume" ]; + ProtectSystem = lib.mkForce "full"; # downgrade from strict + }; + + services.gitea-actions-runner = { + package = pkgs.forgejo-runner; + instances.default = { + enable = true; + name = "silas-desktop"; + url = "https://git.fnarglebeast.com"; + tokenFile = "/run/secrets/gaia_forgejo_runner_token"; + labels = [ + "docker:docker://alpine:3.23" + "native:host" + ]; + hostPackages = with pkgs; [ + nix + nodejs + git + bash + coreutils + openssh + curl + jq + ]; + }; + }; + systemd.services.gitea-runner-default = { + serviceConfig.LoadCredential = "ssh-key:/run/secrets/gaia_gitea_runner_ssh_key"; + preStart = lib.mkAfter '' + mkdir -p /var/lib/gitea-runner/default/.ssh + cp $CREDENTIALS_DIRECTORY/ssh-key /var/lib/gitea-runner/default/.ssh/id_ed25519 + chmod 600 /var/lib/gitea-runner/default/.ssh/id_ed25519 + echo "46.62.150.48 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEOKImx9KgmG+/ggpuS2z/hXkWu3TgT/xK9fI18tPOI1" > /var/lib/gitea-runner/default/.ssh/known_hosts + echo "github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl" > /var/lib/gitea-runner/default/.ssh/known_hosts + echo "github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=" > /var/lib/gitea-runner/default/.ssh/known_hosts + echo "github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=" > /var/lib/gitea-runner/default/.ssh/known_hosts + echo "|1|PiQaXvl6v4orBo2zZIPay/MvyB4=|k1/4u7c1WUIPoR/7xYr1A79gwe8= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCmUGtd1MHIcgylnN6tkdSeVCZuxDKBAIdse3PGCeBxyxK924E9+oDm+gjRVYqoe4unYY0pgKrRK2nVa0c38nWsfv2VqohHUpMP2HBKjmm59iDd0SwLKIV2iwJrRi5d/ZO86N0kL/6Jv8/hd9PktTy4UReWK8QDKUl5VxPDmoRx5qAUgC0uvv8dli2QbDepbm/M4GYHP+hTC7c7bHejEI7jOG6/VDo9VCQvjFM4Z5jeqtwTIIE/CSd4e5jZFO2CL4nMyA/dhSDizKAIDXOvO6EwiHi2xxpWbM5Mv1sbeT1ThNBNnfD6p2fgF3QpGoTCniv0jIdTudjjssqECVsiKU68co2joV9UCZuaAbGkdq3DIfYq/2RKXDs9YaTRm5IkWjpEaTaw39bnVMRLbFXK2vDftOrrv/AKbbB1cNPLDW1tim7il2F4EmPzQ4pP/EHxzcqRlTm/kK75UGRvYioDzTDgx4/9r8bzQ3qg3Gc6qfJ8R6DVdUxwy9KvgcUU05ZXH5etmRCLlb07m7egs336ybD3r5lp2BUxzCP2CorcXT/yY6N/mW7d9DB1aq5TBCtNd6cktgYjRlDUU1P9SpDSZnnroyn5K6xhab/9bWqfgwR4Duv7TGr55LXGRNGuiYY+Z8jy3kamMuO9R0UWfBBWnKMs4jF56QqVepdWRrQ5NxIqLQ==" > /var/lib/gitea-runner/default/.ssh/known_hosts + echo "|1|3G0j02EwW+sHMD6NxAMWbxfIu3I=|cCLnI1svPTlsM28nMcOERdDKSHM= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEOKImx9KgmG+/ggpuS2z/hXkWu3TgT/xK9fI18tPOI1" > /var/lib/gitea-runner/default/.ssh/known_hosts + ''; + serviceConfig.ExecPaths = [ "/var/lib/gitea-runner" ]; + }; + + # This value determines the NixOS release from which the default + # settings for stateful data, like file locations and database versions + # on your system were taken. It‘s perfectly fine and recommended to leave + # this value at the release version of the first install of this system. + # Before changing this value read the documentation for this option + # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). + system.stateVersion = "23.11"; # Did you read the comment? + + virtualisation.containers.enable = true; + virtualisation.podman = { + enable = true; + dockerCompat = true; + defaultNetwork.settings.dns_enabled = true; + }; + users.extraGroups.podman.members = [ "silas" ]; +} diff --git a/nixos/gaia/hardware-configuration.nix b/nixos/gaia/hardware-configuration.nix @@ -0,0 +1,51 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ + config, + lib, + pkgs, + modulesPath, + ... +}: + +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ + "nvme" + "xhci_pci" + "ahci" + "usb_storage" + "usbhid" + "sd_mod" + ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = { + device = "/dev/disk/by-uuid/e16560d0-c7d2-4f25-b056-02973b1554a6"; + fsType = "ext4"; + }; + + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/8BFC-08B9"; + fsType = "vfat"; + }; + + swapDevices = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp8s0.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp9s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/nixos/gaia/home.nix b/nixos/gaia/home.nix @@ -0,0 +1,286 @@ +{ config, pkgs, ... }: + +{ + # imports = [ + # <home-manager/nixos> + # ]; + + home-manager.backupFileExtension = "backup"; + home-manager.users.silas = + { + pkgs, + lib, + config, + ... + }: + { + imports = [ + #<catppuccin/modules/home-manager> + ./hyprland.nix + ]; + # catppuccin = { + # enable = true; + # flavor = "macchiato"; + # accent = "peach"; + # cursors = { + # enable = true; + # flavor = "macchiato"; + # accent = "peach"; + # }; + # firefox.profiles.default.enable = false; + # }; + + home.sessionVariables = { + EDITOR = "vim"; + BROWSER = "firefox"; + TERMINAL = "kitty"; + }; + + home.stateVersion = "24.11"; + home.shellAliases = { + paperless-manage = "sudo -u paperless /var/lib/paperless/paperless-manage"; + }; + + programs.btop = { + enable = true; + package = pkgs.btop.override { rocmSupport = true; }; + }; + + programs.firefox = { + enable = true; + profiles = { + default = { + id = 0; + name = "default"; + settings = { + "browser.search.defaultenginename" = "Kagi"; + "browser.search.order.1" = "Kagi"; + }; + search = { + force = true; + default = "Kagi"; + order = [ + "k" + "ka" + "ddg" + "google" + ]; + engines = { + "Kagi" = { + urls = [ + { + template = "https://kagi.com/search?"; + params = [ + { + name = "q"; + value = "{searchTerms}"; + } + ]; + } + ]; + url = "https://kagi.com/favicon.ico"; + definedAliases = [ "@k" ]; + }; + + "Kagi Assistant" = { + urls = [ + { + template = "https://kagi.com/assistant?"; + params = [ + { + name = "q"; + value = "{searchTerms}"; + } + ]; + } + ]; + url = "https://kagi.com/favicon.ico"; + definedAliases = [ "@ka" ]; + }; + + "Nix Packages" = { + urls = [ + { + template = "https://search.nixos.org/packages"; + params = [ + { + name = "type"; + value = "packages"; + } + { + name = "query"; + value = "{searchTerms}"; + } + ]; + } + ]; + + definedAliases = [ "@np" ]; + }; + + "Nix Options" = { + urls = [ + { + template = "https://search.nixos.org/options"; + params = [ + { + name = "type"; + value = "options"; + } + { + name = "query"; + value = "{searchTerms}"; + } + ]; + } + ]; + updateInterval = 24 * 60 * 60 * 1000; # every day + definedAliases = [ "@no" ]; + }; + + "NixOS Wiki" = { + urls = [ { template = "https://wiki.nixos.org/w/index.php?search={searchTerms}"; } ]; + icon = "https://wiki.nixos.org/favicon.png"; + updateInterval = 24 * 60 * 60 * 1000; # every day + definedAliases = [ "@nw" ]; + }; + + "Home Manager Options" = { + urls = [ + { template = "https://home-manager-options.extranix.com/?query={searchTerms}&release=master"; } + ]; + icon = "https://wiki.nixos.org/favicon.png"; + updateInterval = 24 * 60 * 60 * 1000; # every day + definedAliases = [ "@hmo" ]; + }; + + "Hacker News" = { + urls = [ { template = "https://kagi.com/search?q=site:news.ycombinator.com+{searchTerms}"; } ]; + url = "https://news.ycombinator.com/y18.svg"; + updateInterval = 24 * 60 * 60 * 1000; # every day + definedAliases = [ "@hn" ]; + }; + + "reddit" = { + urls = [ { template = "https://kagi.com/search?q=site:reddit.com+{searchTerms}"; } ]; + icon = "https://www.redditstatic.com/desktop2x/img/favicon/apple-icon-120x120.png"; + updateInterval = 24 * 60 * 60 * 1000; # every day + definedAliases = [ "@r" ]; + }; + + "Youtube" = { + urls = [ { template = "https://www.youtube.com/results?search_query={searchTerms}"; } ]; + # updateInterval = 24 * 60 * 60 * 1000; # every day + definedAliases = [ "@yt" ]; + }; + }; + }; + }; + }; + }; + + programs.bash = { + enable = true; + }; + + programs.fzf = { + enable = true; + enableBashIntegration = true; + # enableFishIntegration = true; + }; + + programs.zathura = { + enable = true; + extraConfig = "set selection-clipboard clipboard"; + }; + + programs.neomutt = { + enable = true; + vimKeys = true; + }; + + # programs.fish = { + # enable = true; + # shellAbbrs = { + # ls = "ls --hyperlink --color=auto"; + # delta = "delta --hyperlinks --hyperlinks-file-link-format='file://{path}#{line}'"; + # rg = "rg --hyperlink-format=kitty"; + # }; + # interactiveShellInit = '' + # set fish_greeting + # ''; + # functions = { + # loadenv = '' + # # Load environment variables from a .env file + # for line in (cat .env) + # # Skip empty lines and comments + # if test -z "$line" -o (string sub -s 1 -l 1 -- "$line") = "#" + # continue + # end + # + # # Split the line on '=' character + # set parts (string split -m 1 "=" -- "$line" | string trim) + # + # # Check if we have both key and value + # if test (count $parts) -eq 2 + # set key $parts[1] + # set value $parts[2] + # + # # Set the environment variable + # set -gx $key $value + # echo "Set $key to $value" + # end + # end + # ''; + # }; + # }; + + programs.git = { + enable = true; + settings = { + user = { + name = "Silas Brack"; + email = "silasbrack@gmail.com"; + }; + init = { + defaultBranch = "main"; + }; + merge = { + conflictstyle = "zdiff3"; + }; + }; + }; + + programs.kitty = { + enable = true; + shellIntegration = { + enableBashIntegration = true; + # enableFishIntegration = true; + }; + settings = { + font_family = "Iosevka Nerd Font"; + font_size = 16; + }; + }; + + # programs.neovim = + # let + # source = builtins.fetchGit { + # url = "https://github.com/silasbrack/kickstart.nvim.git"; + # rev = "201dd59aff99f696bfa85c40e98856e8158f1328"; + # }; + # in + # { + # enable = true; + # extraLuaConfig = (builtins.readFile "${source}/init.lua"); + # }; + + # home.file.".config/nvim" = { + # source = builtins.fetchGit { + # url = "https://github.com/silasbrack/kickstart.nvim.git"; + # rev = "201dd59aff99f696bfa85c40e98856e8158f1328"; + # }; + # recursive = true; + # }; + }; +} diff --git a/nixos/gaia/hyprland.nix b/nixos/gaia/hyprland.nix @@ -0,0 +1,594 @@ +{ + config, + pkgs, + lib, + ... +}: + +{ + home.packages = with pkgs; [ + cliphist # for hyprland clipboard history + grim # for hyprland screenshotting + pamixer # audio control + slurp # for hyprland screenshotting + swappy # for hyprland screenshotting + ]; + wayland.windowManager.hyprland = { + enable = true; + settings = { + exec-once = [ + "hyprlock" + "hyprpaper" + "hypridle" + "waybar" + "wl-paste --type text --watch cliphist store" + "wl-paste --type image --watch cliphist store" + ]; + "$terminal" = "kitty"; + "$menu" = "rofi -case-smart -show drun"; + "$browser" = "firefox"; + # "$filemanager" = "kitty sh -c 'yazi ~'"; + "$notes" = "obsidian"; + "$mod" = "SUPER"; + "$mainMod" = "SUPER"; + general = { + border_size = 3; + "col.active_border" = "rgba(f5a97fee)"; + "col.inactive_border" = "rgba(ffffffff)"; + resize_on_border = true; + }; + decoration = { + active_opacity = 1.0; + inactive_opacity = 0.50; + rounding = 10; + }; + animations = { + enabled = false; + }; + input = { + kb_layout = "us,pt,dk"; + kb_options = "grp:win_space_toggle"; + touchpad = { + natural_scroll = true; + }; + }; + bind = [ + # Core bindings + "$mainMod, T, exec, $terminal" + "$mainMod, Q, killactive" + "$mainMod, N, exec, hyprlock" + "$mainMod, B, exec, $browser" + "$mainMod, R, exec, $menu" + "$mainMod, O, exec, $notes" + "$mainMod, F, fullscreen" + "$mainMod, V, exec, cliphist list | rofi -case-smart -dmenu | cliphist decode | wl-copy" + # "$mainMod, X, togglesplit" + ''$mainMod SHIFT, S, exec, slurp | grim -g - - | wl-copy && wl-paste > $HOME/screenshots/screenshot-$(date +"%Y-%m-%d--%H:%M:%S").png'' + # "$mainMod, M, togglespecialworkspace, magic" + # "$mainMod SHIFT, M, movetoworkspace, special:magic" + # "$mainMod, M, exit" + # Change window focus + "$mainMod, H, movefocus, l" + "$mainMod, L, movefocus, r" + "$mainMod, K, movefocus, u" + "$mainMod, J, movefocus, d" + # Resize windows + "$mainMod SHIFT CTRL, H, resizeactive, -10 0" + "$mainMod SHIFT CTRL, L, resizeactive, 10 0" + "$mainMod SHIFT CTRL, K, resizeactive, 0 -10" + "$mainMod SHIFT CTRL, J, resizeactive, 0 10" + # Move windows + "$mainMod SHIFT, H, movewindow, l" + "$mainMod SHIFT, L, movewindow, r" + "$mainMod SHIFT, K, movewindow, u" + "$mainMod SHIFT, J, movewindow, d" + # Change active workspace + "$mainMod, 1, workspace, 1" + "$mainMod, 2, workspace, 2" + "$mainMod, 3, workspace, 3" + "$mainMod, 4, workspace, 4" + "$mainMod, 5, workspace, 5" + "$mainMod, 6, workspace, 6" + "$mainMod, 7, workspace, 7" + "$mainMod, 8, workspace, 8" + "$mainMod, 9, workspace, 9" + "$mainMod, mouse_down, workspace, -1" + "$mainMod, mouse_up, workspace, +1" + # Move windows to workspaces + "$mainMod SHIFT, 1, movetoworkspace, 1" + "$mainMod SHIFT, 2, movetoworkspace, 2" + "$mainMod SHIFT, 3, movetoworkspace, 3" + "$mainMod SHIFT, 4, movetoworkspace, 4" + "$mainMod SHIFT, 5, movetoworkspace, 5" + "$mainMod SHIFT, 6, movetoworkspace, 6" + "$mainMod SHIFT, 7, movetoworkspace, 7" + "$mainMod SHIFT, 8, movetoworkspace, 8" + "$mainMod SHIFT, 9, movetoworkspace, 9" + ]; + bindel = [ + ",XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+" + ",XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" + ",XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + ",XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle" + ",XF86MonBrightnessUp, exec, brightnessctl s 10%+" + ",XF86MonBrightnessDown, exec, brightnessctl s 10%-" + ]; + bindm = [ + "$mainMod, mouse:272, movewindow" + "$mainMod, mouse:273, resizewindow" + ]; + }; + }; + programs.waybar = { + enable = true; + settings = { + mainBar = { + "layer" = "top"; + "position" = "top"; + "mode" = "dock"; + "exclusive" = true; + "passthrough" = false; + "gtk-layer-shell" = true; + "height" = 0; + "modules-left" = [ + "clock" + "hyprland/workspaces" + ]; + "modules-center" = [ "hyprland/window" ]; + "modules-right" = [ + "tray" + "hyprland/language" + "memory" + "disk" + "temperature" + "custom/gpu" + "cpu" + "network" + "battery" + "pulseaudio" + "pulseaudio#microphone" + ]; + "hyprland/window" = { + "format" = "󰣇 {}"; + }; + "hyprland/workspaces" = { + "disable-scroll" = true; + "all-outputs" = true; + # "on-click" = "activate"; + # "format" = "{icon}"; + }; + "hyprland/language" = { + "format" = "{}"; + "on-click" = "hyprctl switchxkblayout keychron-keychron-q1 next"; + }; + "tray" = { + "icon-size" = 13; + "spacing" = 10; + }; + "clock" = { + "format" = "{:%A  %B-%d-%Y  %I:%M:%S %p}"; + "interval" = 1; + "rotate" = 0; + "tooltip-format" = "<tt>{calendar}</tt>"; + "calendar" = { + "mode" = "month"; + "mode-mon-col" = 3; + "on-scroll" = 1; + "on-click-right" = "mode"; + "format" = { + "months" = "<span color='#a6adc8'><b>{}</b></span>"; + "weekdays" = "<span color='#a6adc8'><b>{}</b></span>"; + "today" = "<span color='#a6adc8'><b>{}</b></span>"; + "days" = "<span color='#555869'><b>{}</b></span>"; + }; + }; + }; + "battery" = { + "states" = { + "good" = 95; + "warning" = 30; + "critical" = 20; + }; + "format" = "{icon} {capacity}%"; + "format-charging" = " {capacity}%"; + "format-plugged" = " {capacity}%"; + "format-alt" = "{time} {icon}"; + "format-icons" = [ + "󰂃" + "󰁺" + "󰁻" + "󰁼" + "󰁽" + "󰁾" + "󰁿" + "󰂀" + "󰂁" + "󰂂" + "󰁹" + ]; + }; + "pulseaudio" = { + "format" = "{icon} {volume}%"; + "tooltip" = false; + "format-muted" = " Muted"; + "on-click" = "pamixer -t"; + "on-scroll-up" = "pamixer -i 1"; + "on-scroll-down" = "pamixer -d 1"; + "scroll-step" = 5; + "format-icons" = { + "headphone" = ""; + "hands-free" = ""; + "headset" = ""; + "phone" = ""; + "portable" = ""; + "car" = ""; + "default" = [ + "" + "" + "" + "" + ]; + }; + }; + "pulseaudio#microphone" = { + "format" = "{format_source}"; + "format-source" = " {volume}%"; + "format-source-muted" = " Muted"; + "on-click" = "pamixer --default-source -t"; + "on-scroll-up" = "pamixer --default-source -i 5"; + "on-scroll-down" = "pamixer --default-source -d 5"; + "scroll-step" = 5; + }; + "memory" = { + "states" = { + "c" = 90; + "h" = 60; + "m" = 30; + }; + "interval" = 10; + "format" = "󰾆 {used}GB"; + "format-m" = "󰾅 {used}GB"; + "format-h" = "󰓅 {used}GB"; + "format-c" = " {used}GB"; + "format-alt" = "󰾆 {percentage}%"; + "max-length" = 10; + "tooltip" = true; + "tooltip-format" = "󰾆 {percentage}%\n {used:0.1f}GB/{total:0.1f}GB"; + "on-click-right" = "kitty sh -c 'btop'"; + }; + "temperature" = { + "tooltip" = false; + "critical-threshold" = 80; + "format" = "{icon} {temperatureC}󰔄"; + "format-critical" = "🔥{icon} {temperatureC}󰔄"; + "format-icons" = [ + "" + "" + ]; + "on-click-right" = "kitty sh -c 'btop'"; + }; + "cpu" = { + "interval" = 10; + "format" = "󰍛 CPU {usage}%"; + "format-alt" = "{icon0}{icon1}{icon2}{icon3}"; + "format-icons" = [ + "▁" + "▂" + "▃" + "▄" + "▅" + "▆" + "▇" + "█" + ]; + "on-click-right" = "kitty sh -c 'btop'"; + }; + "custom/gpu" = { + "exec" = "cat /sys/class/hwmon/hwmon0/device/gpu_busy_percent"; + "format" = " GPU {}%"; + "return-type" = ""; + "interval" = 10; + }; + "disk" = { + "format" = "󰋊 {percentage_used}%"; + "tooltip-format" = + "({used}/{total})({percentage_used}%) in '{path}'; available {free}({percentage_free}%)"; + "states" = { + "high" = 90; + "upper-medium" = 70; + "medium" = 50; + "lower-medium" = 30; + "low" = 10; + }; + }; + "network" = { + "tooltip" = true; + "format-wifi" = " {essid}"; + "format-ethernet" = "󰈀 "; + "tooltip-format" = + "Network = <big><b>{essid}</b></big>\nSignal strength = <b>{signaldBm}dBm ({signalStrength}%)</b>\nFrequency = <b>{frequency}MHz</b>\nInterface = <b>{ifname}</b>\nIP = <b>{ipaddr}/{cidr}</b>\nGateway = <b>{gwaddr}</b>\nNetmask = <b>{netmask}</b>"; + "format-linked" = "󰈀 {ifname} (No IP)"; + "format-disconnected" = "󰖪 "; + "tooltip-format-disconnected" = "Disconnected"; + "format-alt" = + "<span foreground='#99ffdd'> {bandwidthDownBytes}</span> <span foreground='#ffcc66'> {bandwidthUpBytes}</span>"; + "interval" = 2; + }; + }; + }; + style = '' + * { + border: none; + border-radius: 0; + font-family: Iosevka Nerd Font, monospace; + font-weight: bold; + font-size: 16px; + min-height: 0; + } + + window#waybar { + background: rgba(21, 18, 27, 0); + color: #cdd6f4; + } + + #workspaces button { + padding: 5px; + color: #555869; + margin-right: 5px; + } + + #workspaces button.active { + color: #a6adc8; + } + + #workspaces button.focused { + color: #a6adc8; + background: #eba0ac; + border-radius: 10px; + } + + #workspaces button.urgent { + color: #11111b; + background: #a6e3a1; + border-radius: 10px; + } + + #workspaces button:hover { + background: #cdd6f4; + color: #11111b; + border-radius: 10px; + } + + #window, + #clock, + #battery, + #pulseaudio, + #network, + #cpu, + #temperature, + #custom-gpu, + #memory, + #disk, + #workspaces, + #language, + #tray { + background: #1e1e2e; + padding: 0px 10px; + margin: 3px 0px; + margin-top: 5px; + /* border: 1px solid #181825; */ + } + + #tray { + border-radius: 10px; + margin-right: 10px; + } + + #workspaces { + background: #1e1e2e; + border-radius: 10px; + margin-left: 10px; + padding-right: 0px; + padding-left: 5px; + } + + #language { + border-radius: 10px; + margin-left: 10px; + margin-right: 10px; + } + + #cpu { + border-radius: 0px 10px 10px 0px; + margin-right: 10px; + } + + #custom-gpu { + border-left: 0px; + border-right: 0px; + } + + #temperature { + border-left: 0px; + border-right: 0px; + } + + #disk { + border-left: 0px; + border-right: 0px; + } + + #memory { + border-radius: 10px 0px 0px 10px; + } + + #window { + border-radius: 10px; + margin-left: 60px; + margin-right: 60px; + } + + #clock { + color: #a6adc8; + border-radius: 10px 10px 10px 10px; + margin-left: 5px; + border-right: 0px; + } + + #network { + color: #a6adc8; + border-radius: 10px 0px 0px 10px; + + } + + #pulseaudio { + color: #a6adc8; + border-left: 0px; + border-right: 0px; + } + + #pulseaudio.microphone { + color: #a6adc8; + border-radius: 0px 10px 10px 0px; + border-left: 0px; + border-right: 0px; + margin-right: 5px; + } + + #battery { + color:#a6adc8; + border-radius: 0px 10px 10px 0px; + margin-right: 10px; + } + ''; + }; + programs.hyprlock = { + enable = true; + extraConfig = '' + background { + path = $HOME/Pictures/birds.png + blur_passes = 2 + } + ''; + }; + programs.rofi = { + enable = true; + # font = "JetBrainsMono Nerd Font 14"; + font = "Iosevka Nerd Font 16"; + theme = + let + inherit (config.lib.formats.rasi) mkLiteral; + in + { + "*" = { + bg-col = mkLiteral "#24273a"; + bg-col-light = mkLiteral "#24273a"; + border-col = mkLiteral "#24273a"; + selected-col = mkLiteral "#24273a"; + fg-col = mkLiteral "#cad3f5"; + fg-col2 = mkLiteral "#ed8796"; + grey = mkLiteral "#6e738d"; + orange = mkLiteral "#f5a97f"; + width = mkLiteral "600"; + border-radius = mkLiteral "15px"; + }; + "element-text, element-icon , mode-switcher" = { + background-color = mkLiteral "inherit"; + text-color = mkLiteral "inherit"; + }; + window = { + height = mkLiteral "360px"; + border = mkLiteral "2px"; + border-color = mkLiteral "@orange"; + background-color = mkLiteral "@bg-col"; + }; + mainbox = { + background-color = mkLiteral "@bg-col"; + }; + inputbar = { + children = mkLiteral "[prompt,entry]"; + background-color = mkLiteral "@bg-col"; + border-radius = mkLiteral "5px"; + padding = mkLiteral "2px"; + }; + prompt = { + background-color = mkLiteral "@orange"; + padding = mkLiteral "6px"; + text-color = mkLiteral "@bg-col"; + border-radius = mkLiteral "3px"; + margin = mkLiteral "20px 0px 0px 20px"; + }; + textbox-prompt-colon = { + expand = mkLiteral "false"; + str = ":"; + }; + entry = { + padding = mkLiteral "6px"; + margin = mkLiteral "20px 0px 0px 10px"; + text-color = mkLiteral "@fg-col"; + background-color = mkLiteral "@bg-col"; + }; + listview = { + border = mkLiteral "0px 0px 0px"; + padding = mkLiteral "6px 0px 0px"; + margin = mkLiteral "10px 0px 0px 20px"; + columns = 1; + lines = 5; + background-color = mkLiteral "@bg-col"; + }; + element = { + padding = mkLiteral "5px"; + background-color = mkLiteral "@bg-col"; + text-color = mkLiteral "@fg-col "; + }; + element-icon = { + size = mkLiteral "25px"; + }; + "element selected" = { + background-color = mkLiteral "@selected-col"; + text-color = mkLiteral "@orange"; + }; + mode-switcher = { + spacing = 0; + }; + button = { + padding = mkLiteral "10px"; + background-color = mkLiteral "@bg-col-light"; + text-color = mkLiteral "@grey"; + vertical-align = mkLiteral "0.5"; + horizontal-align = mkLiteral "0.5"; + }; + "button selected" = { + background-color = mkLiteral "@bg-col"; + text-color = mkLiteral "@orange"; + }; + message = { + background-color = mkLiteral "@bg-col-light"; + margin = mkLiteral "2px"; + padding = mkLiteral "2px"; + border-radius = mkLiteral "5px"; + }; + textbox = { + padding = mkLiteral "6px"; + margin = mkLiteral "20px 0px 0px 20px"; + text-color = mkLiteral "@orange"; + background-color = mkLiteral "@bg-col-light"; + }; + }; + }; + services.hyprpaper = { + enable = true; + settings = { + ipc = "on"; + splash = false; + preload = [ "/home/silas/Pictures/birds.png" ]; + wallpaper = [ ",/home/silas/Pictures/birds.png" ]; + }; + }; + services.gammastep = { + enable = true; + provider = "manual"; + latitude = 55.65; + longitude = 12.54; + }; +} diff --git a/nixos/gaia/vpn.nix b/nixos/gaia/vpn.nix @@ -0,0 +1,41 @@ +{ config, pkgs, ... }: + +{ + networking.firewall = { + # allowedTCPPorts = [ 28982 ]; + allowedUDPPorts = [ 10232 ]; + }; + # networking.firewall.interfaces.wg0.allowedTCPPorts = [ 28982 ]; + networking.extraHosts = '' + 10.100.0.1 server + 10.100.0.2 thinkpad + 10.100.0.3 pixel + 10.100.0.4 desktop + 10.100.0.5 ipad + 10.100.0.6 macbook + 10.100.0.7 hetzner + 10.100.0.8 xps + ''; + # networking.interfaces.enp8s0.wakeOnLan = { + # enable = true; + # }; + networking.wg-quick.interfaces = { + wg0 = { + address = [ "10.100.0.4/24" ]; + dns = [ "10.100.0.1" ]; + listenPort = 10232; + + autostart = true; + + privateKeyFile = "/run/secrets/gaia_wireguard_private_key"; + peers = [ + { + publicKey = "2jWfr5UmACvuS+0HOfSNgEUYqoqVNnfVDoaatmgEykw="; + allowedIPs = [ "0.0.0.0/0" ]; + endpoint = "188.166.127.72:51820"; + persistentKeepalive = 25; + } + ]; + }; + }; +} diff --git a/nixos/configuration-nixos-s-1vcpu-512mb-10gb-ams3-01.nix b/nixos/nixos-s-1vcpu-512mb-10gb-ams3-01.nix diff --git a/secrets.yaml b/secrets.yaml @@ -3,6 +3,9 @@ hetzner_wireguard_key: ENC[AES256_GCM,data:mHPlUfbysQdmdxy107G1/Xhi0JB/c3Fz3QYKj freshrss_password: ENC[AES256_GCM,data:oK/KbYmiux2YdXtNiTVJQUWO5+2K2eDx,iv:v3+cOq6oQGXcp22jDmncoJJFbqF/KZCh9CjcsDTrA50=,tag:aIFGAcfcfkT0QrIsO6lIrQ==,type:str] livebook_password_env_file: ENC[AES256_GCM,data:aic46wuBFngu24R3U6sGXNuB8zQSj6YWIum8szgt6UDJ3PZpYlCT6yNEEZ/NlQ87C4NUELWPE402qZ/hPqjW0X0HcEpXIBnQ4ZcO8uoI0zbMeLFMgGw3+27Uq3dyfMxfCWfBe/VHGBK1i8hKEZ0xzIdPktyTF/bZUnsXXgKvoJtJToWXMbX0/g==,iv:zhZvELSPfIcjAu/ZDastRCJJXg7z5Q0qdPA+N3UqBjg=,tag:QfdwD/hpb/6zc6SiNWj/8A==,type:str] mediawiki_admin_password: ENC[AES256_GCM,data:D9M75ub5+VJq5GpQ9/odPiDbohfHMsyLQF9ZYFO0PiX1z4ZpMroTn7Q/VNrNPseZYrAcqNxFlDG3vqCL9doAcw==,iv:l4yMfho5BydNIN7lRVHJSTfpxpel6olKoPA8ikMRAKA=,tag:uYWWpcFRGbIwVkK3G6Sf0A==,type:str] +gaia_wireguard_private_key: ENC[AES256_GCM,data:pWIY9Hf4/diJsREVZQR1D9noV1vdQrWgGH5v4ZmWJC+eiCgsZB6CFnh2Udg=,iv:zCDf2RgfIUW480WGJCWlBhTFEYR7U0lX/QMzm7q4LXQ=,tag:8PXAfQkIgEU/gqViJ9VPhw==,type:str] +gaia_forgejo_runner_token: ENC[AES256_GCM,data:0XA6nSeBW4uh/cx/95xw0Ood/a68qD4Z/8d77rj4WEnHQPNDRKzBBKQZFqjk7ME=,iv:CcWsra/iSYH+edNixzxw6WNYHZUJO1SDXwJrho6i1DE=,tag:3tximHNd2TnTZLAPOghpMg==,type:str] +gaia_gitea_runner_ssh_key: ENC[AES256_GCM,data:CZZMptDd9s7WQsx9vnHv7tF1CJ9cKd+lnwuv75+a1p4OWxANObfIFtJOTDDHNL1+fk4/48/OOtODrgZlfeLxVPmmiPsvnSPOA1POhi6q97bpOWk/YWgViIWaf4UsLWDBq3/tngcJCa5JebrKuY+T7MaJn1Lw+C8h+91WiIWYSzOSMmZIoMDo5Y85cPqesFKxgmSlgTYbv5mJnFQ6pvhqTLHRpIPW5PNgRjeXsjJrblvs/edYtLyAVm6H0IYMiMa24+272f90l/2Vc16PXk6RCCFIIJ9HuGYGRBFMAD0bYPDo/ESTMn2u1MATGVCPKCLMjTxFglowfavZpb7xLk7EvZoWPQXx/+KcTV3+iVabOv0kI8OLZFGUPCs4B1MiIeCfSLEr4nop2SNm3C7pGFuKJ0EFGbnhdfBqBqVKZVkXJNGY023BHC3eXx57VatisHQAwLbs2qgSWvOetTAhw8E12QylFtq6mXWG3lZuhJxoiZ6QMI9Yjc/Fvxt4NBOjFtbF0iDRd0g0FSv+geQ7BNid,iv:ufcXcVm2NQRTmG7mYDPwCihm4SYkQ9llpoKtP73Z9Ik=,tag:g4RNNXCBZL0EluwGTYC7fA==,type:str] sops: age: - recipient: age1s29qgfupgx7mqn9dk2rndp6xh63f5qan8vqa77ve603wd5m9a9rqkpq7re @@ -32,7 +35,7 @@ sops: dXNXQkF5SXZjWHRPNjZaR29YZ1pRQ3MKJvGVAm8M9oIQBHJH1o0NG8x0c4qvgvHr 1T/ghKHZWIpbXzct1LNy+5T10OgRxm5++NKuuuiAXW2XmnkJu1Bc3Q== -----END AGE ENCRYPTED FILE----- - lastmodified: "2026-04-02T08:39:10Z" - mac: ENC[AES256_GCM,data:OXWJYv8lQ3oHgCsM4q/hYLX5j2O6TQoXMYbiuCo3VjYxVUOvH8EaELHQRXIOobqRJXIqtnsxNzq3G3mE8ojbQR8dFLDLATDr0EWOGDdyMI/NRZjOPwEq6I1F4ZmF+iXOg8SMuZd5g0OdaA0CJUCtlDeNv33Y1km1AAtADjbevlg=,iv:BH5rRLejZzOU7ZSs/RvkwlgUn6yKicS28jha8lCR5rg=,tag:CMTpOH81v8NDDgrRBiyTdA==,type:str] + lastmodified: "2026-04-07T11:03:18Z" + mac: ENC[AES256_GCM,data:pgoUncoeDHSoLFQfHMx3ZFRfhmwTvabvODMGblahUYacSs1UA6h9pw0K/kp2xLsI/qMw4VyAdjnebprPO0khOP2GCj1TDL+dMVYlma8M9/X/VDzf96uiwTuIKIoIMrAj9v/k8RSZXiD/y7S/8sCuymIg8tT2BLfF1zO9WpgyPSI=,iv:vlu9suf6NMr/uTg9pFw+JXVeahNsslCg+vPxGPtk2TM=,tag:tBpbSEbcHDZBdom+MYFksA==,type:str] unencrypted_suffix: _unencrypted - version: 3.11.0 + version: 3.12.1