diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 84c03c9..0000000 --- a/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/scripts/download/.direnv/ -configuration.nix -/apps/ diff --git a/bundles/gaming.nix b/bundles/gaming.nix index 563228d..845fadb 100644 --- a/bundles/gaming.nix +++ b/bundles/gaming.nix @@ -1,35 +1,38 @@ -{ config, pkgs, ... }: +{ config, pkgs, lib, ... }: { - programs = { - steam = { - enable = true; - remotePlay.openFirewall = true; - dedicatedServer.openFirewall = true; + options = { gaming.enable = lib.mkEnableOption "enables gaming"; }; + config = lib.mkIf config.gaming.enable { + programs = { + steam = { + enable = true; + remotePlay.openFirewall = true; + dedicatedServer.openFirewall = true; + }; }; - }; - users.users.jawz.packages = with pkgs; ([ - (lutris.override { - extraPkgs = pkgs: [ - winetricks - wine64Packages.stable - wineWowPackages.stable - ]; - }) - cartridges # games launcher - heroic # install epic games - gamemode # optimizes linux to have better gaming performance - # grapejuice # roblox manager - # minecraft # minecraft official launcher - protonup-qt # update proton-ge - # ns-usbloader # load games into my switch + users.users.jawz.packages = with pkgs; ([ + (lutris.override { + extraPkgs = pkgs: [ + winetricks + wine64Packages.stable + wineWowPackages.stable + ]; + }) + cartridges # games launcher + heroic # install epic games + gamemode # optimizes linux to have better gaming performance + # grapejuice # roblox manager + # minecraft # minecraft official launcher + protonup-qt # update proton-ge + # ns-usbloader # load games into my switch - # emulators - rpcs3 # ps3 emulator - pcsx2 # ps2 emulator - cemu # wii u emulator - dolphin-emu # wii emulator - citra-nightly # 3Ds emulator - snes9x-gtk # snes emulator - ]); + # emulators + rpcs3 # ps3 emulator + pcsx2 # ps2 emulator + cemu # wii u emulator + dolphin-emu # wii emulator + citra-nightly # 3Ds emulator + snes9x-gtk # snes emulator + ]); + }; } diff --git a/hosts/miniserver/configuration.nix b/hosts/miniserver/configuration.nix new file mode 100644 index 0000000..099b34c --- /dev/null +++ b/hosts/miniserver/configuration.nix @@ -0,0 +1,689 @@ +{ config, pkgs, lib, ... }: +let + version = "23.11"; + myEmail = "CaptainJawZ@outlook.com"; + myName = "Danilo Reyes"; + cpuArchitecture = "alderlake"; + home-manager = builtins.fetchTarball + # "https://github.com/nix-community/home-manager/archive/master.tar.gz"; + "https://github.com/nix-community/home-manager/archive/release-${version}.tar.gz"; + unstable = import + (builtins.fetchTarball "https://github.com/nixos/nixpkgs/tarball/master") { + config = config.nixpkgs.config; + }; + jawzManageLibrary = pkgs.writeScriptBin + "manage-library" (builtins.readFile ../scripts/manage-library.sh); + jawzTasks = pkgs.writeScriptBin + "tasks" (builtins.readFile ../scripts/tasks.sh); + jawzSubs = pkgs.writeScriptBin + "sub-sync" (builtins.readFile ../scripts/sub-sync.sh); + jawzStream = pkgs.writeScriptBin + "stream-dl" (builtins.readFile ../scripts/stream-dl.sh); +in +{ # Remember to close this bracket at the end of the document + +imports = [ + ./fstab.nix + ./servers.nix + ./docker.nix + # ./mail.nix + # ./openldap.nix + # + (import "${home-manager}/nixos") +]; + +powerManagement.cpuFreqGovernor = lib.mkDefault "performance"; +networking = { + useDHCP = lib.mkDefault true; + enableIPv6 = false; + hostName = "miniserver"; + networkmanager.enable = true; + extraHosts = '' + 192.168.1.64 workstation + 192.168.1.69 server + ''; + firewall = let + open_firewall_ports = [ + 51413 # torrent sedding + 9091 # qbittorrent + 2049 # nfs + ]; + open_firewall_port_ranges = [ ]; + in + { + enable = true; + allowPing = true; + allowedTCPPorts = open_firewall_ports; + allowedUDPPorts = open_firewall_ports; + allowedTCPPortRanges = open_firewall_port_ranges; + allowedUDPPortRanges = open_firewall_port_ranges; + }; +}; + +time.timeZone = "America/Mexico_City"; +i18n = { + defaultLocale = "en_CA.UTF-8"; + extraLocaleSettings = { + LC_MONETARY = "es_MX.UTF-8"; + }; +}; +console = { + font = "Lat2-Terminus16"; + keyMap = "us"; + # useXkbConfig = true; # use xkbOptions in tty. +}; + +system = { + copySystemConfiguration = true; + stateVersion = "${version}"; +}; +nix = let featuresList = [ + "nixos-test" + "benchmark" + "big-parallel" + "kvm" + "gccarch-${cpuArchitecture}" + "gccarch-znver3" + ]; + in + { + gc = { + automatic = true; + dates = "weekly"; + }; + buildMachines = [ { + hostName = "workstation"; + system = "x86_64-linux"; + sshUser = "nixremote"; + maxJobs = 14; + speedFactor = 1; + supportedFeatures = featuresList; + } ]; + distributedBuilds = true; + settings = { + cores = 3; + auto-optimise-store = true; + trusted-users = [ "nixremote" ]; + system-features = featuresList; + substituters = [ + "https://nix-gaming.cachix.org" + "https://nixpkgs-python.cachix.org" + "https://devenv.cachix.org" + "https://cuda-maintainers.cachix.org" + ]; + trusted-public-keys = [ + "nix-gaming.cachix.org-1:nbjlureqMbRAxR1gJ/f3hxemL9svXaZF/Ees8vCUUs4=" + "nixpkgs-python.cachix.org-1:hxjI7pFxTyuTHn2NkvWCrAUcNZLNS3ZAvfYNuYifcEU=" + "devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw=" + "cuda-maintainers.cachix.org-1:0dq3bujKpuEPMCX6U4WylrUDZ9JyUG0VpVZa7CNfq5E=" + ]; + }; +}; + +security = { + acme = { + acceptTerms = true; + defaults.email = myEmail; + }; + rtkit.enable = true; + sudo = { + enable = true; + wheelNeedsPassword = false; + }; + pam.loginLimits = [{ + domain = "*"; + type = "soft"; + item = "nofile"; + value = "8192"; + }]; +}; + +nixpkgs = { + hostPlatform = lib.mkDefault "x86_64-linux"; + config = { + allowUnfree = true; + permittedInsecurePackages = [ + "openssl-1.1.1w" + ]; + }; + # localSystem = { + # gcc.arch = cpuArchitecture; + # gcc.tune = cpuArchitecture; + # system = "x86_64-linux"; + # }; +}; + +users = { + groups.nixremote = { + name = "nixremote"; + gid = 555; + }; + users.nixremote = { + isNormalUser = true; + createHome = true; + group = "nixremote"; + home = "/var/nixremote/"; + openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICiyTwryzw8CblPldplDpVUkXD9C1fXVgO8LeXdE5cuR root@workstation" + "" + ]; + }; +}; +users.users.jawz = { + isNormalUser = true; + extraGroups = [ "wheel" "networkmanager" "docker" + "scanner" "lp" "piracy" "kavita" + "render" "video" + ]; + initialPassword = "password"; + openssh = { + authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB5GaQM4N+yGAByibOFQOBVMV/6TjOfaGIP+NunMiK76 gpodeacero\cdreyes@100CDREYES" + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMkpeIV9G26W2/e9PsjBx3sNwPGoicJ807ExRGh4KjhW jawz@server" + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH2wtsaMvfEUm//2YnFHyrc16o+TOXXBfIGPJ9nL8RMp jawz@workstation" + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINBEblxSDhWPEo33crSjooeUg4W02ruENxHLmmBqCuIo jawz@galaxy" + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN6HsajaTL+nTJtSIu00M5WJwgt/7fyU59gBr2R7tbnv root@server" + ]; + }; + +packages = (with pkgs; [ + +hunspell +hunspellDicts.it_IT +hunspellDicts.es_MX +hunspellDicts.en_CA + +symbola + +unstable.yt-dlp # downloads videos from most video websites +unstable.gallery-dl # similar to yt-dlp but for most image gallery websites + +fd # modern find, faster searches +fzf # fuzzy finder! super cool and useful +gdu # disk-space utility, somewhat useful +du-dust # rusty du +trash-cli # oop! didn't meant to delete that +eza # like ls but with colors +rmlint # probably my favourite app, amazing dupe finder that integrates well with BTRFS +smartmontools # check hard drie health + +jawzManageLibrary +jawzTasks +jawzSubs +jawzStream +(writeScriptBin "ffmpeg4discord" (builtins.readFile ../scripts/ffmpeg4discord.py)) +(writeScriptBin "ffmpreg" (builtins.readFile ../scripts/ffmpreg.sh)) +(writeScriptBin "split-dir" (builtins.readFile ../scripts/split-dir.sh)) +(writeScriptBin "pika-list" (builtins.readFile ../scripts/pika-list.sh)) +(writeScriptBin "run" (builtins.readFile ../scripts/run.sh)) +(writeScriptBin "find-dup-episodes" (builtins.readFile ../scripts/find-dup-episodes.sh)) + +tldr # man for retards + +# SH +bats # testing system, required by Exercism +bashdb # autocomplete +shellcheck # linting +shfmt # a shell parser and formatter + +# NIX +expect # keep color when nom'ing +nix-output-monitor # autistic nix builds +nixfmt # linting +cachix # why spend time compiling? + +# PYTHON. +(python3.withPackages (ps: with ps; [ + flake8 # wraper for pyflakes, pycodestyle and mccabe + isort # sort Python imports + nose # testing and running python scripts + pyflakes # checks source code for errors + pytest # framework for writing tests + speedtest-cli # check internet speed from the comand line + editorconfig # follow rules of contributin + black # Python code formatter + pylint # bug and style checker for python +])) # base language + +]) ++ (with pkgs.python3Packages; [ +(buildPythonApplication rec { + pname = "download"; + version = "1.5"; + src = ../scripts/download/.; + doCheck = false; + buildInputs = [ setuptools ]; + propagatedBuildInputs = + [ pyyaml types-pyyaml ]; +}) +(buildPythonApplication rec { + pname = "ffpb"; + version = "0.4.1"; + src = fetchPypi { + inherit pname version; + sha256 = "sha256-7eVqbLpMHS1sBw2vYS4cTtyVdnnknGtEI8190VlXflk="; + }; + doCheck = false; + buildInputs = [ setuptools ]; + propagatedBuildInputs = + [ tqdm ]; +}) +# (buildPythonApplication rec { +# pname = "qbit_manage"; +# version = "4.0.3"; +# src = fetchPypi { +# inherit pname version; +# sha256 = "sha256-7eVqbLpMHS1sBw2vYS4cTtyVdnnknGtEI8190VlXflk="; +# }; +# doCheck = true; +# buildInputs = [ setuptools ]; +# propagatedBuildInputs = +# [ gitpython requests retrying ruamel-yaml schedule unstable.qbittorrent-api ]; +# }) + +]) ++ (with pkgs.nodePackages; [ + # Language servers + dockerfile-language-server-nodejs + yaml-language-server + bash-language-server + vscode-json-languageserver + pyright + + markdownlint-cli # Linter + prettier # Linter + pnpm # Package manager + +]); }; # <--- end of package list + +home-manager = { + useUserPackages = true; + useGlobalPkgs = true; + users.jawz = { config, pkgs, ... }:{ + home.stateVersion = "${version}"; + +programs.bash = { + enable = true; + historyFile = "\${XDG_STATE_HOME}/bash/history"; + historyControl = [ "erasedups" "ignorespace" ]; + shellAliases = { + hh = "hstr"; + ls = "eza --icons --group-directories-first"; + edit = "emacsclient -t"; + comic = "download -u jawz -i \"$(cat $LC | fzf --multi --exact -i)\""; + gallery = "download -u jawz -i \"$(cat $LW | fzf --multi --exact -i)\""; + cp = "cp -i"; + mv = "mv -i"; + mkcd = "mkdir -pv \"$1\" && cd \"$1\" || exit"; + mkdir = "mkdir -p"; + rm = "trash"; + ".." = "cd .."; + "..." = "cd ../.."; + ".3" = "cd ../../.."; + ".4" = "cd ../../../.."; + ".5" = "cd ../../../../.."; + dl = "download -u jawz -i"; + e = "edit"; + c = "cat"; + f = "fzf --multi --exact -i"; + sc = "systemctl --user"; + jc = "journalctl --user -xefu"; + open-gallery = "cd /mnt/pool/scrapping/JawZ/gallery-dl && + xdg-open $(fd . ./ Husbands -tdirectory -d 1 | fzf -i)\""; + unique-extensions = "fd -tf | rev | cut -d. -f1 | rev | + tr '[:upper:]' '[:lower:]' | sort | + uniq --count | sort -rn"; + }; + enableVteIntegration = true; + initExtra = '' + $HOME/.local/bin/pokemon-colorscripts -r --no-title + # Lists + list_root="${config.xdg.configHome}"/jawz/lists/jawz + export LW=$list_root/watch.txt + export LI=$list_root/instant.txt + export LC=$list_root/comic.txt + export command_timeout=30 + + if command -v fzf-share >/dev/null; then + source "$(fzf-share)/key-bindings.bash" + source "$(fzf-share)/completion.bash" + fi + + nixos-reload () { + nixfmt /home/jawz/Development/NixOS/miniserver/*.nix + sudo unbuffer nixos-rebuild switch -I nixos-config=/home/jawz/Development/NixOS/miniserver/configuration.nix |& nom + } + ''; +}; + +xdg = { + enable = true; + userDirs = { + enable = true; + createDirectories = false; + desktop = "${config.home.homeDirectory}"; + documents = "${config.home.homeDirectory}/Documents"; + download = "${config.home.homeDirectory}/Downloads"; + music = "${config.home.homeDirectory}/Music"; + pictures = "${config.home.homeDirectory}/Pictures"; + templates = "${config.xdg.dataHome}/Templates"; + videos = "${config.home.homeDirectory}/Videos"; + }; + configFile = { + "wgetrc".source = ../dotfiles/wget/wgetrc; + "configstore/update-notifier-npm-check.json".source = ../dotfiles/npm/update-notifier-npm-check.json; + "npm/npmrc".source = ../dotfiles/npm/npmrc; + "gallery-dl/config.json".source = ../dotfiles/gallery-dl/config.json; + "htop/htoprc".source = ../dotfiles/htop/htoprc; + "python/pythonrc".source = ../dotfiles/pythonrc; + "unpackerr.conf".source = ../dotfiles/unpackerr.conf; + }; +}; + +programs = { + helix = { + enable = true; + }; + hstr.enable = true; + emacs.enable = true; + direnv = { + enable = true; + enableBashIntegration = true; + nix-direnv.enable = true; + }; + bat = { + enable = true; + config = { + pager = "less -FR"; + theme = "base16"; + }; + extraPackages = with pkgs.bat-extras; [ + batman # man pages + batpipe # piping + batgrep # ripgrep + batdiff # this is getting crazy! + batwatch # probably my next best friend + prettybat # trans your sourcecode! + ]; + }; + git = { + enable = true; + userName = "${myName}"; + userEmail = "${myEmail}"; + }; + htop = { + enable = true; + package = pkgs.htop-vim; + }; +}; + +services = { + lorri.enable = true; + emacs = { + enable = true; + defaultEditor = true; + package = pkgs.emacs; + startWithUserSession = "graphical"; + }; +}; + +}; }; + +environment = { + systemPackages = with pkgs; [ + wget + jellyfin-ffmpeg # coolest video converter! + mediainfo + dlib + fd + ripgrep + ]; + variables = rec { + # PATH + XDG_CACHE_HOME = "\${HOME}/.cache"; + XDG_CONFIG_HOME = "\${HOME}/.config"; + XDG_BIN_HOME = "\${HOME}/.local/bin"; + XDG_DATA_HOME = "\${HOME}/.local/share"; + XDG_STATE_HOME = "\${HOME}/.local/state"; + + # DEV PATH + CABAL_DIR = "${XDG_CACHE_HOME}/cabal"; + CARGO_HOME = "${XDG_DATA_HOME}/cargo"; + GEM_HOME = "${XDG_DATA_HOME}/ruby/gems"; + GEM_PATH = "${XDG_DATA_HOME}/ruby/gems"; + GEM_SPEC_CACHE = "${XDG_DATA_HOME}/ruby/specs"; + GOPATH = "${XDG_DATA_HOME}/go"; + NPM_CONFIG_USERCONFIG = "${XDG_CONFIG_HOME}/npm/npmrc"; + PNPM_HOME = "${XDG_DATA_HOME}/pnpm"; + PSQL_HISTORY="${XDG_DATA_HOME}/psql_history"; + REDISCLI_HISTFILE="${XDG_DATA_HOME}/redis/rediscli_history"; + WINEPREFIX="${XDG_DATA_HOME}/wine"; + PYTHONSTARTUP="${XDG_CONFIG_HOME}/python/pythonrc"; + STACK_ROOT="${XDG_DATA_HOME}/stack"; + + # OPTIONS + HISTFILE = "${XDG_STATE_HOME}/bash/history"; + LESSHISTFILE = "-"; + GHCUP_USE_XDG_DIRS = "true"; + RIPGREP_CONFIG_PATH = "${XDG_CONFIG_HOME}/ripgrep/ripgreprc"; + ELECTRUMDIR = "${XDG_DATA_HOME}/electrum"; + VISUAL = "emacsclient -ca emacs"; + WGETRC = "${XDG_CONFIG_HOME}/wgetrc"; + XCOMPOSECACHE = "${XDG_CACHE_HOME}/X11/xcompose"; + "_JAVA_OPTIONS" = "-Djava.util.prefs.userRoot=${XDG_CONFIG_HOME}/java"; + DOCKER_CONFIG="${XDG_CONFIG_HOME}/docker"; + + # NVIDIA + CUDA_CACHE_PATH = "${XDG_CACHE_HOME}/nv"; + + # Themes + # WEBKIT_DISABLE_COMPOSITING_MODE = "1"; + CALIBRE_USE_SYSTEM_THEME = "1"; + + PATH = [ + "\${HOME}/.local/bin" + "${XDG_CONFIG_HOME}/emacs/bin" + "${XDG_DATA_HOME}/npm/bin" + "${XDG_DATA_HOME}/pnpm" + ]; + + # needed for tensorflow + # CUDA_PATH = "${pkgs.cudatoolkit}"; + # # LD_LIBRARY_PATH = "${pkgs.linuxPackages.nvidia_x11}/lib:${pkgs.ncurses5}/lib"; + # EXTRA_LDFLAGS = "-L/lib -L${pkgs.linuxPackages.nvidia_x11}/lib"; + # EXTRA_CCFLAGS = "-I/usr/include"; + }; +}; + +programs = { + starship.enable = true; + tmux.enable = true; + fzf.fuzzyCompletion = true; + neovim = { + enable = true; + vimAlias = true; + }; + gnupg.agent = { + enable = true; + enableSSHSupport = true; + }; +}; + +services = { + # minidlna = { + # enable = true; + # openFirewall = true; + # settings = { + # inotify = "yes"; + # media_dir = [ + # "/mnt/pool/glue" + # ]; + # }; + # }; + avahi = { + enable = true; + nssmdns = true; + }; + fstrim.enable = true; + smartd.enable = true; + btrfs.autoScrub = { + enable = true; + fileSystems = [ + "/" + "/mnt/pool" + ]; + }; + openssh = { + enable = true; + openFirewall = true; + startWhenNeeded = true; + settings = { + PasswordAuthentication = false; + KbdInteractiveAuthentication = false; + }; + }; +}; + +systemd = { + packages = let + pkgs = import (builtins.fetchTarball { + url = "https://github.com/NixOS/nixpkgs/archive/9957cd48326fe8dbd52fdc50dd2502307f188b0d.tar.gz"; + }) {}; + + myPkg = pkgs.qbittorrent-nox; +in [ myPkg ]; + services = { + "qbittorrent-nox@jawz" = { + enable = true; + overrideStrategy = "asDropin"; + wantedBy = [ "multi-user.target" ]; + }; + }; + timers = { + }; + user = { + services = { + "stream@" = { + description = "monitors a stream channel for online streams."; + restartIfChanged = true; + wantedBy = [ "default.target" ]; + path = [ + pkgs.nix + jawzStream + ]; + serviceConfig = { + Restart = "on-failure"; + RestartSec = 30; + ExecStart = "${jawzStream}/bin/stream-dl %I"; + }; + }; + # unpackerr = { + # enable = true; + # restartIfChanged = true; + # description = "Run unpackerr"; + # wantedBy = [ "default.target" ]; + # serviceConfig = { + # Restart = "on-failure"; + # RestartSec = 30; + # ExecStart = "${pkgs.unpackerr}/bin/unpackerr -c /home/jawz/.config/unpackerr.conf"; + # }; + # }; + manage-library = { + enable = true; + restartIfChanged = true; + description = "Run the manage library bash script"; + wantedBy = [ "default.target" ]; + path = [ + pkgs.nix + jawzManageLibrary + ]; + serviceConfig = { + Restart = "on-failure"; + RestartSec = 30; + ExecStart = "${jawzManageLibrary}/bin/manage-library"; + }; + }; + tasks = { + restartIfChanged = true; + description = "Run a tasks script which keeps a lot of things organized"; + wantedBy = [ "default.target" ]; + path = [ + pkgs.nix + jawzTasks + ]; + serviceConfig = { + Restart = "on-failure"; + RestartSec = 30; + ExecStart = "${jawzTasks}/bin/tasks"; + }; + }; + qbit_manage = let qbit_dir = "/home/jawz/Development/Git/qbit_manage"; in { + restartIfChanged = true; + description = "Tidy up my torrents"; + wantedBy = [ "default.target" ]; + path = [ + pkgs.python3 + pkgs.pipenv + ]; + serviceConfig = { + Restart = "on-failure"; + RestartSec = 30; + ExecStart = "${qbit_dir}/venv/bin/python3 ${qbit_dir}/qbit_manage.py -r -c ${qbit_dir}/config.yml"; + }; + }; + }; + timers = let + streamTimer = { + enable = true; + description = "monitors a stream channel for online streams."; + wantedBy = [ "timers.target" ]; + timerConfig = { + OnBootSec = "5min"; + OnUnitActiveSec = "65min"; + RandomizedDelaySec = 30; + }; + }; + in { + "stream@johnneal911" = streamTimer // { }; + "stream@uk2011boy" = streamTimer // { }; + "stream@tommy9x6" = streamTimer // { }; + "stream@brocollirob" = streamTimer // { }; + "stream@tomayto\\x20picarto" = streamTimer // { }; + tasks = { + enable = true; + description = "Run a tasks script which keeps a lot of things organized"; + wantedBy = [ "timers.target" ]; + timerConfig = { + OnCalendar = "*:0/10"; + }; + }; + manage-library = { + enable = true; + description = "Run the manage library bash script"; + wantedBy = [ "timers.target" ]; + timerConfig = { + OnCalendar = "00:30"; + }; + }; + qbit_manage = { + enable = true; + description = "Tidy up my torrents"; + wantedBy = [ "timers.target" ]; + timerConfig = { + OnCalendar = "*:0/10"; + }; + }; + }; + }; +}; + +fonts.fontconfig.enable = true; + +hardware = { + cpu.intel.updateMicrocode = lib.mkDefault true; + opengl = { + enable = true; + driSupport = true; + driSupport32Bit = true; + }; +}; + +} diff --git a/hosts/server/.gitignore b/hosts/server/.gitignore deleted file mode 100644 index 985d863..0000000 --- a/hosts/server/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/dotfiles/*.Appimage -/scripts/download/.direnv/ -/configuration.nix -/scripts/PureRef-1.11.1_x64.Appimage diff --git a/hosts/server/configuration.nix b/hosts/server/configuration.nix new file mode 100644 index 0000000..ab20c98 --- /dev/null +++ b/hosts/server/configuration.nix @@ -0,0 +1,716 @@ +{ config, pkgs, lib, ... }: +let + version = "23.11"; + myEmail = "CaptainJawZ@outlook.com"; + myName = "Danilo Reyes"; + cpuArchitecture = "skylake"; + home-manager = builtins.fetchTarball + # "https://github.com/nix-community/home-manager/archive/master.tar.gz"; + "https://github.com/nix-community/home-manager/archive/release-${version}.tar.gz"; + unstable = import + (builtins.fetchTarball "https://github.com/nixos/nixpkgs/tarball/master") { + config = config.nixpkgs.config; + }; + jawzManageLibrary = pkgs.writeScriptBin + "manage-library" (builtins.readFile ../scripts/manage-library.sh); + jawzTasks = pkgs.writeScriptBin + "tasks" (builtins.readFile ../scripts/tasks.sh); + jawzSubs = pkgs.writeScriptBin + "sub-sync" (builtins.readFile ../scripts/sub-sync.sh); + jawzStream = pkgs.writeScriptBin + "stream-dl" (builtins.readFile ../scripts/stream-dl.sh); +in +{ # Remember to close this bracket at the end of the document + +imports = [ + ./fstab.nix + ./servers.nix + ./docker.nix + # ./mail.nix + # ./openldap.nix + # + (import "${home-manager}/nixos") +]; + +powerManagement.cpuFreqGovernor = lib.mkDefault "performance"; +networking = { + useDHCP = lib.mkDefault true; + enableIPv6 = false; + hostName = "server"; + networkmanager.enable = true; + extraHosts = '' + 192.168.1.64 workstation + 192.168.1.100 miniserver + ''; + firewall = let + open_firewall_ports = [ + 6969 # HentaiAtHome + 51413 # torrent sedding + 9091 # qbittorrent + 2049 # nfs + ]; + open_firewall_port_ranges = [ ]; + in + { + enable = true; + allowPing = true; + allowedTCPPorts = open_firewall_ports; + allowedUDPPorts = open_firewall_ports; + allowedTCPPortRanges = open_firewall_port_ranges; + allowedUDPPortRanges = open_firewall_port_ranges; + }; +}; + +time.timeZone = "America/Mexico_City"; +i18n = { + defaultLocale = "en_CA.UTF-8"; + extraLocaleSettings = { + LC_MONETARY = "es_MX.UTF-8"; + }; +}; +console = { + font = "Lat2-Terminus16"; + keyMap = "us"; + # useXkbConfig = true; # use xkbOptions in tty. +}; + +system = { + copySystemConfiguration = true; + stateVersion = "${version}"; +}; +nix = let featuresList = [ + "nixos-test" + "benchmark" + "big-parallel" + "kvm" + "gccarch-${cpuArchitecture}" + "gccarch-znver3" + ]; + in + { + gc = { + automatic = true; + dates = "weekly"; + }; + buildMachines = [ { + hostName = "workstation"; + system = "x86_64-linux"; + sshUser = "nixremote"; + maxJobs = 14; + speedFactor = 1; + supportedFeatures = featuresList; + } ]; + distributedBuilds = true; + settings = { + cores = 6; + auto-optimise-store = true; + trusted-users = [ "nixremote" ]; + system-features = featuresList; + substituters = [ + "https://nix-gaming.cachix.org" + "https://nixpkgs-python.cachix.org" + "https://devenv.cachix.org" + "https://cuda-maintainers.cachix.org" + ]; + trusted-public-keys = [ + "nix-gaming.cachix.org-1:nbjlureqMbRAxR1gJ/f3hxemL9svXaZF/Ees8vCUUs4=" + "nixpkgs-python.cachix.org-1:hxjI7pFxTyuTHn2NkvWCrAUcNZLNS3ZAvfYNuYifcEU=" + "devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw=" + "cuda-maintainers.cachix.org-1:0dq3bujKpuEPMCX6U4WylrUDZ9JyUG0VpVZa7CNfq5E=" + ]; + }; +}; + +security = { + acme = { + acceptTerms = true; + defaults.email = myEmail; + }; + rtkit.enable = true; + sudo = { + enable = true; + wheelNeedsPassword = false; + }; + pam.loginLimits = [{ + domain = "*"; + type = "soft"; + item = "nofile"; + value = "8192"; + }]; +}; + +nixpkgs = { + hostPlatform = lib.mkDefault "x86_64-linux"; + config = { + allowUnfree = true; + permittedInsecurePackages = [ + "openssl-1.1.1w" + ]; + }; + # localSystem = { + # gcc.arch = cpuArchitecture; + # gcc.tune = cpuArchitecture; + # system = "x86_64-linux"; + # }; +}; + +users = { + groups.nixremote = { + name = "nixremote"; + gid = 555; + }; + users.nixremote = { + isNormalUser = true; + createHome = true; + group = "nixremote"; + home = "/var/nixremote/"; + openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICiyTwryzw8CblPldplDpVUkXD9C1fXVgO8LeXdE5cuR root@workstation" + ]; + }; +}; +users.users.jawz = { + isNormalUser = true; + extraGroups = [ "wheel" "networkmanager" "docker" + "scanner" "lp" "piracy" "kavita" + "render" "video" + ]; + initialPassword = "password"; + openssh = { + authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB5GaQM4N+yGAByibOFQOBVMV/6TjOfaGIP+NunMiK76 gpodeacero\cdreyes@100CDREYES" + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH2wtsaMvfEUm//2YnFHyrc16o+TOXXBfIGPJ9nL8RMp jawz@workstation" + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINBEblxSDhWPEo33crSjooeUg4W02ruENxHLmmBqCuIo jawz@galaxy" + ]; + }; + +packages = (with pkgs; [ + +hunspell +hunspellDicts.it_IT +hunspellDicts.es_MX +hunspellDicts.en_CA + +symbola + +unstable.yt-dlp # downloads videos from most video websites +unstable.gallery-dl # similar to yt-dlp but for most image gallery websites + +fd # modern find, faster searches +fzf # fuzzy finder! super cool and useful +gdu # disk-space utility, somewhat useful +du-dust # rusty du +trash-cli # oop! didn't meant to delete that +eza # like ls but with colors +rmlint # probably my favourite app, amazing dupe finder that integrates well with BTRFS +smartmontools # check hard drie health + +jawzManageLibrary +jawzTasks +jawzSubs +jawzStream +(writeScriptBin "ffmpeg4discord" (builtins.readFile ../scripts/ffmpeg4discord.py)) +(writeScriptBin "ffmpreg" (builtins.readFile ../scripts/ffmpreg.sh)) +(writeScriptBin "split-dir" (builtins.readFile ../scripts/split-dir.sh)) +(writeScriptBin "pika-list" (builtins.readFile ../scripts/pika-list.sh)) +(writeScriptBin "run" (builtins.readFile ../scripts/run.sh)) +(writeScriptBin "find-dup-episodes" (builtins.readFile ../scripts/find-dup-episodes.sh)) + +tldr # man for retards + +# SH +bats # testing system, required by Exercism +bashdb # autocomplete +shellcheck # linting +shfmt # a shell parser and formatter + +# NIX +expect # keep color when nom'ing +nix-output-monitor # autistic nix builds +nixfmt # linting +cachix # why spend time compiling? + +# PYTHON. +(python3.withPackages (ps: with ps; [ + flake8 # wraper for pyflakes, pycodestyle and mccabe + isort # sort Python imports + nose # testing and running python scripts + pyflakes # checks source code for errors + pytest # framework for writing tests + speedtest-cli # check internet speed from the comand line + editorconfig # follow rules of contributin + black # Python code formatter + pylint # bug and style checker for python +])) # base language + +]) ++ (with pkgs.python3Packages; [ +(buildPythonApplication rec { + pname = "download"; + version = "1.5"; + src = ../scripts/download/.; + doCheck = false; + buildInputs = [ setuptools ]; + propagatedBuildInputs = + [ pyyaml types-pyyaml ]; +}) +(buildPythonApplication rec { + pname = "ffpb"; + version = "0.4.1"; + src = fetchPypi { + inherit pname version; + sha256 = "sha256-7eVqbLpMHS1sBw2vYS4cTtyVdnnknGtEI8190VlXflk="; + }; + doCheck = false; + buildInputs = [ setuptools ]; + propagatedBuildInputs = + [ tqdm ]; +}) +# (buildPythonApplication rec { +# pname = "qbit_manage"; +# version = "4.0.3"; +# src = fetchPypi { +# inherit pname version; +# sha256 = "sha256-7eVqbLpMHS1sBw2vYS4cTtyVdnnknGtEI8190VlXflk="; +# }; +# doCheck = true; +# buildInputs = [ setuptools ]; +# propagatedBuildInputs = +# [ gitpython requests retrying ruamel-yaml schedule unstable.qbittorrent-api ]; +# }) + +]) ++ (with pkgs.nodePackages; [ + # Language servers + dockerfile-language-server-nodejs + yaml-language-server + bash-language-server + vscode-json-languageserver + pyright + + markdownlint-cli # Linter + prettier # Linter + pnpm # Package manager + +]); }; # <--- end of package list + +home-manager = { + useUserPackages = true; + useGlobalPkgs = true; + users.jawz = { config, pkgs, ... }:{ + home.stateVersion = "${version}"; + +programs.bash = { + enable = true; + historyFile = "\${XDG_STATE_HOME}/bash/history"; + historyControl = [ "erasedups" "ignorespace" ]; + shellAliases = { + hh = "hstr"; + ls = "eza --icons --group-directories-first"; + edit = "emacsclient -t"; + comic = "download -u jawz -i \"$(cat $LC | fzf --multi --exact -i)\""; + gallery = "download -u jawz -i \"$(cat $LW | fzf --multi --exact -i)\""; + cp = "cp -i"; + mv = "mv -i"; + mkcd = "mkdir -pv \"$1\" && cd \"$1\" || exit"; + mkdir = "mkdir -p"; + rm = "trash"; + ".." = "cd .."; + "..." = "cd ../.."; + ".3" = "cd ../../.."; + ".4" = "cd ../../../.."; + ".5" = "cd ../../../../.."; + dl = "download -u jawz -i"; + e = "edit"; + c = "cat"; + f = "fzf --multi --exact -i"; + sc = "systemctl --user"; + jc = "journalctl --user -xefu"; + open-gallery = "cd /mnt/pool/scrapping/JawZ/gallery-dl && + xdg-open $(fd . ./ Husbands -tdirectory -d 1 | fzf -i)\""; + unique-extensions = "fd -tf | rev | cut -d. -f1 | rev | + tr '[:upper:]' '[:lower:]' | sort | + uniq --count | sort -rn"; + }; + enableVteIntegration = true; + initExtra = '' + $HOME/.local/bin/pokemon-colorscripts -r --no-title + # Lists + list_root="${config.xdg.configHome}"/jawz/lists/jawz + export LW=$list_root/watch.txt + export LI=$list_root/instant.txt + export LC=$list_root/comic.txt + export command_timeout=30 + + if command -v fzf-share >/dev/null; then + source "$(fzf-share)/key-bindings.bash" + source "$(fzf-share)/completion.bash" + fi + + nixos-reload () { + nixfmt /home/jawz/Development/NixOS/server/*.nix + sudo unbuffer nixos-rebuild switch -I nixos-config=/home/jawz/Development/NixOS/server/configuration.nix |& nom + } + ''; +}; + +xdg = { + enable = true; + userDirs = { + enable = true; + createDirectories = false; + desktop = "${config.home.homeDirectory}"; + documents = "${config.home.homeDirectory}/Documents"; + download = "${config.home.homeDirectory}/Downloads"; + music = "${config.home.homeDirectory}/Music"; + pictures = "${config.home.homeDirectory}/Pictures"; + templates = "${config.xdg.dataHome}/Templates"; + videos = "${config.home.homeDirectory}/Videos"; + }; + configFile = { + "wgetrc".source = ../dotfiles/wget/wgetrc; + "configstore/update-notifier-npm-check.json".source = ../dotfiles/npm/update-notifier-npm-check.json; + "npm/npmrc".source = ../dotfiles/npm/npmrc; + "gallery-dl/config.json".source = ../dotfiles/gallery-dl/config.json; + "htop/htoprc".source = ../dotfiles/htop/htoprc; + "python/pythonrc".source = ../dotfiles/pythonrc; + }; +}; + +programs = { + helix = { + enable = true; + }; + hstr.enable = true; + emacs.enable = true; + direnv = { + enable = true; + enableBashIntegration = true; + nix-direnv.enable = true; + }; + bat = { + enable = true; + config = { + pager = "less -FR"; + theme = "base16"; + }; + extraPackages = with pkgs.bat-extras; [ + batman # man pages + batpipe # piping + batgrep # ripgrep + batdiff # this is getting crazy! + batwatch # probably my next best friend + prettybat # trans your sourcecode! + ]; + }; + git = { + enable = true; + userName = "${myName}"; + userEmail = "${myEmail}"; + }; + htop = { + enable = true; + package = pkgs.htop-vim; + }; +}; + +services = { + lorri.enable = true; + emacs = { + enable = true; + defaultEditor = true; + package = pkgs.emacs; + startWithUserSession = "graphical"; + }; +}; + +}; }; + +environment = { + systemPackages = with pkgs; [ + wget + jellyfin-ffmpeg # coolest video converter! + mediainfo + dlib + fd + ripgrep + ]; + variables = rec { + # PATH + XDG_CACHE_HOME = "\${HOME}/.cache"; + XDG_CONFIG_HOME = "\${HOME}/.config"; + XDG_BIN_HOME = "\${HOME}/.local/bin"; + XDG_DATA_HOME = "\${HOME}/.local/share"; + XDG_STATE_HOME = "\${HOME}/.local/state"; + + # DEV PATH + CABAL_DIR = "${XDG_CACHE_HOME}/cabal"; + CARGO_HOME = "${XDG_DATA_HOME}/cargo"; + GEM_HOME = "${XDG_DATA_HOME}/ruby/gems"; + GEM_PATH = "${XDG_DATA_HOME}/ruby/gems"; + GEM_SPEC_CACHE = "${XDG_DATA_HOME}/ruby/specs"; + GOPATH = "${XDG_DATA_HOME}/go"; + NPM_CONFIG_USERCONFIG = "${XDG_CONFIG_HOME}/npm/npmrc"; + PNPM_HOME = "${XDG_DATA_HOME}/pnpm"; + PSQL_HISTORY="${XDG_DATA_HOME}/psql_history"; + REDISCLI_HISTFILE="${XDG_DATA_HOME}/redis/rediscli_history"; + WINEPREFIX="${XDG_DATA_HOME}/wine"; + PYTHONSTARTUP="${XDG_CONFIG_HOME}/python/pythonrc"; + STACK_ROOT="${XDG_DATA_HOME}/stack"; + + # OPTIONS + HISTFILE = "${XDG_STATE_HOME}/bash/history"; + LESSHISTFILE = "-"; + GHCUP_USE_XDG_DIRS = "true"; + RIPGREP_CONFIG_PATH = "${XDG_CONFIG_HOME}/ripgrep/ripgreprc"; + ELECTRUMDIR = "${XDG_DATA_HOME}/electrum"; + VISUAL = "emacsclient -ca emacs"; + WGETRC = "${XDG_CONFIG_HOME}/wgetrc"; + XCOMPOSECACHE = "${XDG_CACHE_HOME}/X11/xcompose"; + "_JAVA_OPTIONS" = "-Djava.util.prefs.userRoot=${XDG_CONFIG_HOME}/java"; + DOCKER_CONFIG="${XDG_CONFIG_HOME}/docker"; + + # NVIDIA + CUDA_CACHE_PATH = "${XDG_CACHE_HOME}/nv"; + + # Themes + # WEBKIT_DISABLE_COMPOSITING_MODE = "1"; + CALIBRE_USE_SYSTEM_THEME = "1"; + + PATH = [ + "\${HOME}/.local/bin" + "\${XDG_CONFIG_HOME}/emacs/bin" + "\${XDG_DATA_HOME}/npm/bin" + "\${XDG_DATA_HOME}/pnpm" + ]; + + # needed for tensorflow + # CUDA_PATH = "${pkgs.cudatoolkit}"; + # # LD_LIBRARY_PATH = "${pkgs.linuxPackages.nvidia_x11}/lib:${pkgs.ncurses5}/lib"; + # EXTRA_LDFLAGS = "-L/lib -L${pkgs.linuxPackages.nvidia_x11}/lib"; + # EXTRA_CCFLAGS = "-I/usr/include"; + }; +}; + +programs = { + starship.enable = true; + tmux.enable = true; + fzf.fuzzyCompletion = true; + neovim = { + enable = true; + vimAlias = true; + }; + gnupg.agent = { + enable = true; + enableSSHSupport = true; + }; +}; + +services = { + minidlna = { + enable = true; + openFirewall = true; + settings = { + inotify = "yes"; + media_dir = [ + "/mnt/pool/glue" + ]; + }; + }; + avahi = { + enable = true; + nssmdns = true; + }; + fstrim.enable = true; + smartd.enable = true; + btrfs.autoScrub = { + enable = true; + fileSystems = [ + "/" + "/mnt/pool" + ]; + }; + openssh = { + enable = true; + openFirewall = true; + startWhenNeeded = true; + settings = { + PasswordAuthentication = false; + KbdInteractiveAuthentication = false; + }; + }; +}; + +systemd = { + packages = let + pkgs = import (builtins.fetchTarball { + url = "https://github.com/NixOS/nixpkgs/archive/9957cd48326fe8dbd52fdc50dd2502307f188b0d.tar.gz"; + }) {}; + + myPkg = pkgs.qbittorrent-nox; +in [ myPkg ]; + services = { + # "qbittorrent-nox@jawz" = { + # enable = true; + # overrideStrategy = "asDropin"; + # wantedBy = [ "multi-user.target" ]; + # }; + # sub-sync = { + # restartIfChanged = true; + # description = "syncronizes subtitles downloaded & modified today"; + # wantedBy = [ "default.target" ]; + # path = [ + # pkgs.bash + # pkgs.nix + # jawzSubs + # ]; + # serviceConfig = { + # Restart = "on-failure"; + # RestartSec = 30; + # ExecStart = "${jawzSubs}/bin/sub-sync all"; + # Type = "forking"; + # User = "root"; + # }; + # }; + }; + timers = { + # sub-sync = { + # enable = true; + # description = "syncronizes subtitles downloaded & modified today"; + # wantedBy = [ "timers.target" ]; + # timerConfig = { + # OnCalendar = "22:00"; + # }; + # }; + }; + user = { + services = { + "stream@" = { + description = "monitors a stream channel for online streams."; + restartIfChanged = true; + wantedBy = [ "default.target" ]; + path = [ + pkgs.nix + jawzStream + ]; + serviceConfig = { + Restart = "on-failure"; + RestartSec = 30; + ExecStart = "${jawzStream}/bin/stream-dl %I"; + }; + }; + # unpackerr = { + # enable = true; + # restartIfChanged = true; + # description = "Run unpackerr"; + # wantedBy = [ "default.target" ]; + # serviceConfig = { + # Restart = "on-failure"; + # RestartSec = 30; + # ExecStart = "${pkgs.unpackerr}/bin/unpackerr -c /home/jawz/.config/unpackerr.conf"; + # }; + # }; + # manage-library = { + # enable = true; + # restartIfChanged = true; + # description = "Run the manage library bash script"; + # wantedBy = [ "default.target" ]; + # path = [ + # pkgs.bash + # pkgs.nix + # jawzManageLibrary + # ]; + # serviceConfig = { + # Restart = "on-failure"; + # RestartSec = 30; + # ExecStart = "${jawzManageLibrary}/bin/manage-library"; + # }; + # }; + # tasks = { + # restartIfChanged = true; + # description = "Run a tasks script which keeps a lot of things organized"; + # wantedBy = [ "default.target" ]; + # path = [ + # pkgs.bash + # pkgs.nix + # jawzTasks + # ]; + # serviceConfig = { + # Restart = "on-failure"; + # RestartSec = 30; + # ExecStart = "${jawzTasks}/bin/tasks"; + # }; + # }; + # qbit_manage = let qbit_dir = "/home/jawz/Development/Git/qbit_manage"; in { + # restartIfChanged = true; + # description = "Tidy up my torrents"; + # wantedBy = [ "default.target" ]; + # path = [ + # pkgs.python3 + # pkgs.pipenv + # ]; + # serviceConfig = { + # Restart = "on-failure"; + # RestartSec = 30; + # ExecStart = "${qbit_dir}/.venv/bin/python3 ${qbit_dir}/qbit_manage.py -r -c ${qbit_dir}/config.yml"; + # }; + # }; + }; + timers = let + streamTimer = { + enable = true; + description = "monitors a stream channel for online streams."; + wantedBy = [ "timers.target" ]; + timerConfig = { + OnBootSec = "5min"; + OnUnitActiveSec = "65min"; + RandomizedDelaySec = 30; + }; + }; + in { + "stream@johnneal911" = streamTimer // { }; + "stream@uk2011boy" = streamTimer // { }; + "stream@tomayto\\x20picarto" = streamTimer // { }; + "stream@retrohurricaneLIVE\\x20picarto" = streamTimer // { }; + # tasks = { + # enable = true; + # description = "Run a tasks script which keeps a lot of things organized"; + # wantedBy = [ "timers.target" ]; + # timerConfig = { + # OnCalendar = "*:0/10"; + # }; + # }; + # manage-library = { + # enable = true; + # description = "Run the manage library bash script"; + # wantedBy = [ "timers.target" ]; + # timerConfig = { + # OnCalendar = "00:30"; + # }; + # }; + # qbit_manage = { + # enable = true; + # description = "Tidy up my torrents"; + # wantedBy = [ "timers.target" ]; + # timerConfig = { + # OnCalendar = "*:0/10"; + # }; + # }; + }; + }; +}; + +fonts.fontconfig.enable = true; + +hardware = { + nvidia = { + modesetting.enable = true; + powerManagement.enable = true; + }; + cpu.intel.updateMicrocode = lib.mkDefault true; + opengl = { + enable = true; + driSupport = true; + driSupport32Bit = true; + }; +}; + +} diff --git a/hosts/workstation/configuration.nix b/hosts/workstation/configuration.nix new file mode 100644 index 0000000..9005dea --- /dev/null +++ b/hosts/workstation/configuration.nix @@ -0,0 +1,239 @@ +{ config, lib, pkgs, ... }: +let + unstable = import + (builtins.fetchTarball "https://github.com/nixos/nixpkgs/tarball/master") { + config = config.nixpkgs.config; + }; +in { + imports = [ + # + ./hardware-configuration.nix + ../../base.nix + ../../gnome.nix + ../../jawz.nix + ../../home-manager/default.nix + ../../services/network.nix + ../../services/nvidia.nix + ../../services/printing.nix + ../../services/sound.nix + ../../services/systemd-user/tasks.nix + ../../bundles/art.nix + ../../bundles/dictionaries.nix + ../../bundles/fonts.nix + ../../bundles/gaming.nix + ../../bundles/internet.nix + ../../bundles/office.nix + ../../bundles/dev/haskell.nix + ../../bundles/dev/nix.nix + ../../bundles/dev/python.nix + ]; + gaming.enable = true; + + networking = { + hostName = "workstation"; + firewall = let + openPorts = [ + 7860 # chatgpt + 6674 # ns-usbloader + ]; + openPortRanges = [{ + from = 1714; # kdeconnect + to = 1764; # kdeconnect + }]; + in { + allowedTCPPorts = openPorts; + allowedUDPPorts = openPorts; + allowedTCPPortRanges = openPortRanges; + allowedUDPPortRanges = openPortRanges; + }; + }; + nix = let + featuresList = [ + "nixos-test" + "benchmark" + "big-parallel" + "kvm" + "gccarch-znver3" + "gccarch-skylake" + "gccarch-alderlake" + ]; + in { + distributedBuilds = true; + settings = { + cores = 16; + trusted-users = [ "nixremote" ]; + system-features = featuresList; + }; + }; + + nixpkgs = { + config = { + allowUnfree = true; + permittedInsecurePackages = [ ]; + }; + }; + + users = { + groups.nixremote.gid = 555; + users = { + nixremote = { + isNormalUser = true; + createHome = true; + group = "nixremote"; + home = "/var/nixremote/"; + openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN6HsajaTL+nTJtSIu00M5WJwgt/7fyU59gBr2R7tbnv root@server" + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGrC7sVvDT0is2oq/H1Do99LPaQKvyGMAsrF6/fuf1aP root@miniserver" + ]; + }; + jawz = { + packages = (with pkgs; [ + + godot_4 # game development + unstable.gdtoolkit # gdscript language server + + blanket # background noise + pika-backup # backups + metadata-cleaner # remove any metadata and geolocation from files + # sequeler # friendly SQL client + # czkawka # duplicate finder + # celeste # sync tool for any cloud provider + + easyeffects # equalizer + celluloid # video player + # cozy # audiobooks player + # hakuneko # manga & comic GUI downloader + # gnome-podcasts # podcast player + handbrake # video converter, may be unnecessary + curtail # image compressor + pitivi # video editor + identity # compare images or videos + gnome-obfuscate # censor private information + mousai # poor man shazam + tagger # tag music files + obs-studio # screen recorder & streamer + shortwave # listen to world radio + + unstable.yt-dlp # downloads videos from most video websites + unstable.gallery-dl # similar to yt-dlp but for most image gallery websites + + fd # modern find, faster searches + fzf # fuzzy finder! super cool and useful + gdu # disk-space utility checker, somewhat useful + du-dust # rusty du similar to gdu + (ripgrep.override { withPCRE2 = true; }) # modern grep + trash-cli # oop! did not meant to delete that + eza # like ls but with colors + gocryptfs # encrypted filesystem! shhh!!! + rmlint # probably my favourite app, amazing dupe finder that integrates well with BTRFS + imagemagick # photoshop what?? + + ffmpeg_5-full # not ffmpreg, the coolest video conversion tool! + torrenttools # create torrent files from the terminal! + vcsi # video thumbnails for torrents, can I replace it with ^? + + (writeScriptBin "tasks" (builtins.readFile ../../scripts/tasks.sh)) + (writeScriptBin "ffmpeg4discord" + (builtins.readFile ../../scripts/ffmpeg4discord.py)) + (writeScriptBin "ffmpreg" + (builtins.readFile ../../scripts/ffmpreg.sh)) + (writeScriptBin "split-dir" + (builtins.readFile ../../scripts/split-dir.sh)) + (writeScriptBin "run" (builtins.readFile ../../scripts/run.sh)) + (writeScriptBin "pika-list" + (builtins.readFile ../../scripts/pika-list.sh)) + + # required (optionally) by doom emacs, but still are rather useful + tree-sitter # code parsing based on symbols and shit, I do not get it + graphviz # graphs + tetex + languagetool # proofreader for English + # these two are for doom everywhere + xorg.xwininfo + xdotool + xclip + + tldr # man for retards + exercism # learn to code + + # SH + bats # testing system, required by Exercism + bashdb # autocomplete + shellcheck # linting + shfmt # a shell parser and formatter + + # C# & Rust + # omnisharp-roslyn # c# linter and code formatter + + # DOCKER + dockfmt + + # JS + nodejs # not as bad as I thought + jq # linting + + ]) ++ (with pkgs.python3Packages; [ + (buildPythonApplication rec { + pname = "download"; + version = "1.5"; + src = ../../scripts/download/.; + doCheck = false; + buildInputs = [ setuptools ]; + propagatedBuildInputs = [ pyyaml types-pyyaml ]; + }) + (buildPythonApplication rec { + pname = "ffpb"; + version = "0.4.1"; + src = fetchPypi { + inherit pname version; + sha256 = "sha256-7eVqbLpMHS1sBw2vYS4cTtyVdnnknGtEI8190VlXflk="; + }; + doCheck = false; + buildInputs = [ setuptools ]; + propagatedBuildInputs = [ tqdm ]; + }) + + ]) ++ (with pkgs.nodePackages; [ + # Language servers + dockerfile-language-server-nodejs + yaml-language-server + bash-language-server + vscode-json-languageserver + pyright + + markdownlint-cli # Linter + prettier # Linter + pnpm # Package manager + ]); + }; + }; + }; + + environment.etc = { + "wireplumber/bluetooth.lua.d/51-bluez-config.lua".text = '' + bluez_monitor.properties = { + ["bluez5.enable-sbc-xq"] = true, + ["bluez5.enable-msbc"] = true, + ["bluez5.enable-hw-volume"] = true, + ["bluez5.headset-roles"] = "[ hsp_hs hsp_ag hfp_hf hfp_ag ]" + } + ''; + }; + + programs.kdeconnect = { + enable = true; + package = pkgs.gnomeExtensions.gsconnect; + }; + + services.resilio = { + deviceName = "chichis"; + enable = true; + useUpnp = true; + enableWebUI = true; + httpPass = "528491"; + httpLogin = "chichis"; + httpListenPort = 9876; + httpListenAddr = "0.0.0.0"; + directoryRoot = "/resilio"; + }; +}