From ee1ed4739ef8086c041b496dff9235aa5716b39e Mon Sep 17 00:00:00 2001 From: Chris Toph Date: Sun, 22 Sep 2024 01:07:26 -0400 Subject: [PATCH] Complete Merge of all Hosts WIP but should should be mostly working --- .../acme/cloudflare.ini.example | 0 common/acme/default.nix | 18 +++ common/lxc/default.nix | 21 +++ {nixos/modules => common}/ssh/default.nix | 0 flake.nix | 47 +++++- {home-manager => home}/default.nix | 0 .../modules/fastfetch/default.nix | 0 home/modules/fastfetch/host/caenus/oracle.png | Bin 0 -> 9126 bytes home/modules/fastfetch/host/caenus/oracle.txt | 12 ++ .../modules/fastfetch/host/cloud}/cloud.png | Bin .../modules/fastfetch/host/cloud}/cloud.txt | 0 home/modules/fastfetch/host/nix/default.nix | 84 +++++++++++ home/modules/fastfetch/host/nix/nixos.png | Bin 0 -> 31641 bytes home/modules/fastfetch/host/nix/nixos.txt | 13 ++ .../modules/fish/default.nix | 0 {home-manager => home}/modules/fish/init.fish | 0 host/caenus/default.nix | 60 ++++++++ host/caenus/hardware.nix | 42 ++++++ host/caenus/modules/frp/default.nix | 13 ++ host/caenus/modules/frp/frp.token | 1 + host/caenus/modules/frp/frp.token.example | 1 + host/caenus/modules/nginx/default.nix | 36 +++++ host/cloud/default.nix | 71 +++++++++ .../cloud/hardware.nix | 7 +- .../cloud}/modules/cron/default.nix | 0 .../cloud}/modules/logrotate/default.nix | 0 .../cloud}/modules/logrotate/logrotate.conf | 0 .../cloud}/modules/nextcloud/default.nix | 0 .../modules/nextcloud/nextcloud-admin-pass | 1 + .../cloud}/modules/nginx/default.nix | 0 .../cloud}/modules/snapraid/default.nix | 0 .../cloud}/modules/snapraid/snapraid.conf | 0 host/dockge/default.nix | 55 +++++++ host/dockge/hardware.nix | 13 ++ host/nix/default.nix | 56 +++++++ host/nix/hardware.nix | 7 + host/proxy/default.nix | 61 ++++++++ host/proxy/hardware.nix | 6 + .../proxy/modules/acme/cloudflare.ini.example | 1 + .../proxy}/modules/acme/default.nix | 0 host/proxy/modules/caddy/default.nix | 107 ++++++++++++++ host/proxy/modules/nginx/default.nix | 18 +++ host/proxy/modules/ssh/default.nix | 18 +++ nix/default.nix | 49 +++++++ {nixos => nix}/overlays/default.nix | 0 .../pkgs/snapraid-runner/default.nix | 0 .../pkgs/snapraid-runner/snapraid-runner.conf | 0 .../pkgs/snapraid-runner/snapraid-runner.py | 0 nixos/default.nix | 137 ------------------ 49 files changed, 805 insertions(+), 150 deletions(-) rename {nixos/modules => common}/acme/cloudflare.ini.example (100%) create mode 100644 common/acme/default.nix create mode 100644 common/lxc/default.nix rename {nixos/modules => common}/ssh/default.nix (100%) rename {home-manager => home}/default.nix (100%) rename {home-manager => home}/modules/fastfetch/default.nix (100%) create mode 100644 home/modules/fastfetch/host/caenus/oracle.png create mode 100644 home/modules/fastfetch/host/caenus/oracle.txt rename {home-manager/modules/fastfetch => home/modules/fastfetch/host/cloud}/cloud.png (100%) rename {home-manager/modules/fastfetch => home/modules/fastfetch/host/cloud}/cloud.txt (100%) create mode 100644 home/modules/fastfetch/host/nix/default.nix create mode 100644 home/modules/fastfetch/host/nix/nixos.png create mode 100644 home/modules/fastfetch/host/nix/nixos.txt rename {home-manager => home}/modules/fish/default.nix (100%) rename {home-manager => home}/modules/fish/init.fish (100%) create mode 100644 host/caenus/default.nix create mode 100644 host/caenus/hardware.nix create mode 100644 host/caenus/modules/frp/default.nix create mode 100644 host/caenus/modules/frp/frp.token create mode 100644 host/caenus/modules/frp/frp.token.example create mode 100644 host/caenus/modules/nginx/default.nix create mode 100644 host/cloud/default.nix rename nixos/hardware-configuration.nix => host/cloud/hardware.nix (72%) rename {nixos => host/cloud}/modules/cron/default.nix (100%) rename {nixos => host/cloud}/modules/logrotate/default.nix (100%) rename {nixos => host/cloud}/modules/logrotate/logrotate.conf (100%) rename {nixos => host/cloud}/modules/nextcloud/default.nix (100%) create mode 100644 host/cloud/modules/nextcloud/nextcloud-admin-pass rename {nixos => host/cloud}/modules/nginx/default.nix (100%) rename {nixos => host/cloud}/modules/snapraid/default.nix (100%) rename {nixos => host/cloud}/modules/snapraid/snapraid.conf (100%) create mode 100644 host/dockge/default.nix create mode 100644 host/dockge/hardware.nix create mode 100644 host/nix/default.nix create mode 100644 host/nix/hardware.nix create mode 100644 host/proxy/default.nix create mode 100644 host/proxy/hardware.nix create mode 100644 host/proxy/modules/acme/cloudflare.ini.example rename {nixos => host/proxy}/modules/acme/default.nix (100%) create mode 100644 host/proxy/modules/caddy/default.nix create mode 100644 host/proxy/modules/nginx/default.nix create mode 100644 host/proxy/modules/ssh/default.nix create mode 100644 nix/default.nix rename {nixos => nix}/overlays/default.nix (100%) rename {nixos => nix}/pkgs/snapraid-runner/default.nix (100%) rename {nixos => nix}/pkgs/snapraid-runner/snapraid-runner.conf (100%) rename {nixos => nix}/pkgs/snapraid-runner/snapraid-runner.py (100%) delete mode 100644 nixos/default.nix diff --git a/nixos/modules/acme/cloudflare.ini.example b/common/acme/cloudflare.ini.example similarity index 100% rename from nixos/modules/acme/cloudflare.ini.example rename to common/acme/cloudflare.ini.example diff --git a/common/acme/default.nix b/common/acme/default.nix new file mode 100644 index 0000000..a403be6 --- /dev/null +++ b/common/acme/default.nix @@ -0,0 +1,18 @@ +{ config, lib, pkgs, ... }: +{ + + # letsencrypt + security.acme = { + acceptTerms = true; + defaults = { + email = "chris@toph.cc"; + dnsProvider = "cloudflare"; + environmentFile = ./cloudflare.ini; + }; + certs = { + "ryot.foo" = { + extraDomainNames = ["*.ryot.foo"]; + }; + }; + }; +} \ No newline at end of file diff --git a/common/lxc/default.nix b/common/lxc/default.nix new file mode 100644 index 0000000..002211f --- /dev/null +++ b/common/lxc/default.nix @@ -0,0 +1,21 @@ +{ modulesPath, ... }: +{ + imports = [ + # Include the default lxc/lxd configuration. + "${modulesPath}/virtualisation/lxc-container.nix" + ]; + + # Treats the system as a container. + boot.isContainer = true; + + # Set your system kind (needed for flakes) + nixpkgs.hostPlatform = "x86_64-linux"; + + # Supress systemd units that don't work because of LXC. + # https://blog.xirion.net/posts/nixos-proxmox-lxc/#configurationnix-tweak + systemd.suppressedSystemUnits = [ + "dev-mqueue.mount" + "sys-kernel-debug.mount" + "sys-fs-fuse-connections.mount" + ]; +} \ No newline at end of file diff --git a/nixos/modules/ssh/default.nix b/common/ssh/default.nix similarity index 100% rename from nixos/modules/ssh/default.nix rename to common/ssh/default.nix diff --git a/flake.nix b/flake.nix index 75b2e9f..fcbef74 100644 --- a/flake.nix +++ b/flake.nix @@ -15,22 +15,55 @@ lib = nixpkgs.lib; pkgs = import nixpkgs { inherit system; - overlays = [ (import ./nixos/overlays) ]; + # overlays = [ (import ./nixos/overlays) ]; }; in { nixosConfigurations = { + caenus = lib.nixosSystem { + inherit system; + modules = [ + ./nix + ./host/caenus + ]; + }; + cloud = lib.nixosSystem { inherit system; modules = [ - ./nixos - ]; + ./nix + ./host/cloud + ]; + }; + + dockge = lib.nixosSystem { + inherit system; + modules = [ + ./nix + ./host/dockge + ]; + }; + + nix = lib.nixosSystem { + inherit system; + modules = [ + ./nix + ./host/nix + ]; + }; + + proxy = lib.nixosSystem { + inherit system; + modules = [ + ./nix + ./host/proxy + ]; }; }; homeConfigurations = { - toph = home-manager.lib.homeManagerConfiguration { - inherit pkgs; - modules = [ ./home-manager ]; - }; + toph = home-manager.lib.homeManagerConfiguration { + inherit pkgs; + modules = [ ./home-manager ]; + }; }; }; } diff --git a/home-manager/default.nix b/home/default.nix similarity index 100% rename from home-manager/default.nix rename to home/default.nix diff --git a/home-manager/modules/fastfetch/default.nix b/home/modules/fastfetch/default.nix similarity index 100% rename from home-manager/modules/fastfetch/default.nix rename to home/modules/fastfetch/default.nix diff --git a/home/modules/fastfetch/host/caenus/oracle.png b/home/modules/fastfetch/host/caenus/oracle.png new file mode 100644 index 0000000000000000000000000000000000000000..18adc2faedb670564b5b39d2ea1def8fa5d9724d GIT binary patch literal 9126 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 literal 0 HcmV?d00001 diff --git a/home/modules/fastfetch/host/caenus/oracle.txt b/home/modules/fastfetch/host/caenus/oracle.txt new file mode 100644 index 0000000..fa5f9c6 --- /dev/null +++ b/home/modules/fastfetch/host/caenus/oracle.txt @@ -0,0 +1,12 @@ + + + + [?25l โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„  + โ–„โ–„โ•ณโ•ณโ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ•ณโ•ณโ–„โ–„  + โ–Œโ•ณโ•ณโ–„โ–„ โ–„โ–„โ•ณโ•ณโ–Œ + โ–Œโ•ณโ•ณโ–Œ โ–Œโ•ณโ•ณโ–Œ + โ–Œโ•ณโ•ณโ–Œ โ–Œโ•ณโ•ณโ–Œ + โ–Œโ•ณโ•ณโ–„โ–„ โ–„โ–„โ•ณโ•ณโ–Œ + โ–„โ–„โ•ณโ•ณโ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ•ณโ•ณโ–„โ–„  + โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„  + [?25h \ No newline at end of file diff --git a/home-manager/modules/fastfetch/cloud.png b/home/modules/fastfetch/host/cloud/cloud.png similarity index 100% rename from home-manager/modules/fastfetch/cloud.png rename to home/modules/fastfetch/host/cloud/cloud.png diff --git a/home-manager/modules/fastfetch/cloud.txt b/home/modules/fastfetch/host/cloud/cloud.txt similarity index 100% rename from home-manager/modules/fastfetch/cloud.txt rename to home/modules/fastfetch/host/cloud/cloud.txt diff --git a/home/modules/fastfetch/host/nix/default.nix b/home/modules/fastfetch/host/nix/default.nix new file mode 100644 index 0000000..effb24a --- /dev/null +++ b/home/modules/fastfetch/host/nix/default.nix @@ -0,0 +1,84 @@ +{ + programs.fastfetch = { + enable = true; + settings = { + logo = { + # Created with Chafa + # chafa -s 26x13 -w 9 --symbols stipple+vhalf --view-size 26x13 nixos.png > nixos.txt + source = builtins.readFile ./nixos.txt; + type = "data"; + position = "left"; + padding = { + top = 0; + }; + }; + display = { + separator = " "; + }; + modules = [ + { + key = "โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ"; + type = "custom"; + } + { + key = "โ”‚ {#31}๏€‡ user {#keys}โ”‚"; + type = "title"; + format = "{user-name}"; + } + { + key = "โ”‚ {#32}๓ฐ‡… host {#keys}โ”‚"; + type = "title"; + format = "{host-name}"; + } + { + key = "โ”‚ {#33}๓ฐ… uptime {#keys}โ”‚"; + type = "uptime"; + } + { + key = "โ”‚ {#34}{icon} distro {#keys}โ”‚"; + type = "os"; + } + { + key = "โ”‚ {#36}๓ฐ‡„ desktop {#keys}โ”‚"; + type = "de"; + } + { + key = "โ”‚ {#32}๏’‰ shell {#keys}โ”‚"; + type = "shell"; + } + { + key = "โ”‚ {#33}๓ฐ› cpu {#keys}โ”‚"; + type = "cpu"; + showPeCoreCount = true; + } + { + key = "โ”‚ {#34}๓ฐ‰‰ disk {#keys}โ”‚"; + type = "disk"; + folders = "/"; + } + { + key = "โ”‚ {#35}๎ฟ… memory {#keys}โ”‚"; + type = "memory"; + } + { + key = "โ”‚ {#36}๓ฐฉŸ network {#keys}โ”‚"; + type = "localip"; + format = "{ipv4} ({ifname})"; + } + { + key = "โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค"; + type = "custom"; + } + { + key = "โ”‚ {#39}๎ฟŒ colors {#keys}โ”‚"; + type = "colors"; + symbol = "circle"; + } + { + key = "โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ"; + type = "custom"; + } + ]; + }; + }; +} \ No newline at end of file diff --git a/home/modules/fastfetch/host/nix/nixos.png b/home/modules/fastfetch/host/nix/nixos.png new file mode 100644 index 0000000000000000000000000000000000000000..a182000daad1ad8a5664ec4af2c8fec2f051c7eb GIT binary patch literal 31641 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%0DI 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 BwyFRC literal 0 HcmV?d00001 diff --git a/home/modules/fastfetch/host/nix/nixos.txt b/home/modules/fastfetch/host/nix/nixos.txt new file mode 100644 index 0000000..d5c8e8f --- /dev/null +++ b/home/modules/fastfetch/host/nix/nixos.txt @@ -0,0 +1,13 @@ + + [?25l โ–„โ–„โ–„ โ–„โ–„โ–„ โ–„โ–„โ–„  + โ–„โ–„โ–„โ–„ โ–„โ–„โ–„โ–„โ–„โ–„โ–„  + โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„ โ–„โ–„  + โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„ โ–„โ–‘โ–„  + โ–„โ–„โ–„โ–„โ–„ โ–„โ–„โ–„โ–„โ–„โ–„  + โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„ โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–‘ + โ–„โ–„โ–„โ–„โ–„โ–„ โ–„โ–„โ–„  + โ–‘โ–„โ–„ โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„  + โ–„ โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–‘โ–‘โ–„โ–„โ–„โ–„  + โ–„โ–„โ–„โ–„โ–„โ–„โ–„ โ–„โ–‘โ–„  + โ–„โ–„โ–„ โ–„โ–„โ–„โ–„ โ–„โ–„โ–„  + [?25h \ No newline at end of file diff --git a/home-manager/modules/fish/default.nix b/home/modules/fish/default.nix similarity index 100% rename from home-manager/modules/fish/default.nix rename to home/modules/fish/default.nix diff --git a/home-manager/modules/fish/init.fish b/home/modules/fish/init.fish similarity index 100% rename from home-manager/modules/fish/init.fish rename to home/modules/fish/init.fish diff --git a/host/caenus/default.nix b/host/caenus/default.nix new file mode 100644 index 0000000..a4bee68 --- /dev/null +++ b/host/caenus/default.nix @@ -0,0 +1,60 @@ +{ modulesPath, config, pkgs, ... }: + +let + + hostname = "caenus"; + +in { + + ## MODULES & IMPORTS ## + + imports = + [ + # FRP + ./modules/frp + # Nginx + ./modules/nginx + # Include the results of the hardware scan. + ./hardware.nix + ]; + + ## BOOTLOADER ## + + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + + ## NETWORKING ## + networking = { + firewall = { + allowedTCPPorts = [ 22 80 443 4040 ]; + allowedUDPPorts = [ 25565 4040 ]; + }; + dhcpcd.enable = false; + hostName = hostname; + networkmanager.enable = true; + useHostResolvConf = false; + }; + + systemd.network = { + enable = true; + networks."50-enp0s6" = { + matchConfig.Name = "enp0s6"; + networkConfig = { + DHCP = "yes"; + IPv6AcceptRA = true; + }; + linkConfig.RequiredForOnline = "routable"; + }; + }; + + ## PACKAGES ## + + environment.systemPackages = with pkgs; [ + git + micro + openssh + ranger + sshfs + wget + ]; +} diff --git a/host/caenus/hardware.nix b/host/caenus/hardware.nix new file mode 100644 index 0000000..b83e502 --- /dev/null +++ b/host/caenus/hardware.nix @@ -0,0 +1,42 @@ +# 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 + "/profiles/qemu-guest.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "virtio_scsi" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/467be3e2-75cb-439f-8255-e1ed3a00c2d8"; + fsType = "ext4"; + }; + + fileSystems."/storage" = + { device = "/dev/disk/by-uuid/a3666a64-591c-45ab-8393-3dd1a0a51d79"; + fsType = "ext4"; + }; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/E12E-D69C"; + fsType = "vfat"; + options = [ "fmask=0022" "dmask=0022" ]; + }; + + 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..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.eth0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "aarch64-linux"; +} diff --git a/host/caenus/modules/frp/default.nix b/host/caenus/modules/frp/default.nix new file mode 100644 index 0000000..67427c2 --- /dev/null +++ b/host/caenus/modules/frp/default.nix @@ -0,0 +1,13 @@ +{ + services.frp = { + enable = true; + role = "server"; + settings = { + bindPort = 4040; + auth = { + method = "token"; + token = builtins.readFile ./frp.token; + }; + }; + }; +} \ No newline at end of file diff --git a/host/caenus/modules/frp/frp.token b/host/caenus/modules/frp/frp.token new file mode 100644 index 0000000..862383d --- /dev/null +++ b/host/caenus/modules/frp/frp.token @@ -0,0 +1 @@ +$2b$05$3hq3mA559Yxy679kKbzou..ao9d7annFWAo4MRo0tO04bYJsteWTu \ No newline at end of file diff --git a/host/caenus/modules/frp/frp.token.example b/host/caenus/modules/frp/frp.token.example new file mode 100644 index 0000000..d4aa30e --- /dev/null +++ b/host/caenus/modules/frp/frp.token.example @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/host/caenus/modules/nginx/default.nix b/host/caenus/modules/nginx/default.nix new file mode 100644 index 0000000..9d681e4 --- /dev/null +++ b/host/caenus/modules/nginx/default.nix @@ -0,0 +1,36 @@ +{ + users.users.nginx.extraGroups = [ "acme" ]; + + # Nginx + services.nginx = { + enable = true; + # Use recommended settings + recommendedGzipSettings = true; + recommendedOptimisation = true; + recommendedProxySettings = true; + recommendedTlsSettings = true; + + virtualHosts = { + "ryot.foo" = { + http2 = true; + forceSSL = true; + useACMEHost = "ryot.foo"; + locations."/".proxyPass = "http://0.0.0.0:8080"; + }; + + "*.ryot.foo" = { + http2 = true; + forceSSL = true; + useACMEHost = "ryot.foo"; + locations."/" = { + proxyPass = "http://0.0.0.0:8080"; + proxyWebsockets = true; + extraConfig = '' + proxy_ssl_server_name on; + proxy_pass_header Authorization; + ''; + }; + }; + }; + }; +} \ No newline at end of file diff --git a/host/cloud/default.nix b/host/cloud/default.nix new file mode 100644 index 0000000..eaeff0c --- /dev/null +++ b/host/cloud/default.nix @@ -0,0 +1,71 @@ +{ modulesPath, config, pkgs, ... }: + +let + + hostname = "cloud"; + +in { + + ## MODULES & IMPORTS ## + imports = [ + # Common Modules + ../../common/acme + ../../common/lxc + ../../common/ssh + + # Import hardware configuration. + ./hardware.nix + + # Local Modules + + # cron + ./modules/cron + # Logrotate + ./modules/logrotate + # Nextcloud + ./modules/nextcloud + # Nginx + ./modules/nginx + # Snapraid-runner + ./modules/snapraid + ]; + + ## NETWORKING ## + networking = { + firewall = { + allowedTCPPorts = [ 22 80 443 ]; + allowedUDPPorts = [ ]; + }; + dhcpcd.enable = false; + hostName = hostname; + networkmanager.enable = true; + useDHCP = false; + useHostResolvConf = false; + }; + + systemd.network = { + enable = true; + networks."50-eth0" = { + matchConfig.Name = "eth0"; + networkConfig = { + DHCP = "ipv4"; + IPv6AcceptRA = true; + }; + linkConfig.RequiredForOnline = "routable"; + }; + }; + + ## PACKAGES ## + nixpkgs.overlays = [ (import ./overlays) ]; + environment.systemPackages = with pkgs; [ + git + mergerfs + micro + openssh + ranger + sshfs + snapraid + snapraid-runner + wget + ]; +} diff --git a/nixos/hardware-configuration.nix b/host/cloud/hardware.nix similarity index 72% rename from nixos/hardware-configuration.nix rename to host/cloud/hardware.nix index 9c96edf..0972f43 100644 --- a/nixos/hardware-configuration.nix +++ b/host/cloud/hardware.nix @@ -1,7 +1,5 @@ { - # Treats the system as a container. - boot.isContainer = true; - + # for sshfs programs.fuse.userAllowOther = true; fileSystems = { @@ -17,7 +15,4 @@ options = ["bind" "nofail"]; }; }; - - # Set your system kind (needed for flakes) - nixpkgs.hostPlatform = "x86_64-linux"; } diff --git a/nixos/modules/cron/default.nix b/host/cloud/modules/cron/default.nix similarity index 100% rename from nixos/modules/cron/default.nix rename to host/cloud/modules/cron/default.nix diff --git a/nixos/modules/logrotate/default.nix b/host/cloud/modules/logrotate/default.nix similarity index 100% rename from nixos/modules/logrotate/default.nix rename to host/cloud/modules/logrotate/default.nix diff --git a/nixos/modules/logrotate/logrotate.conf b/host/cloud/modules/logrotate/logrotate.conf similarity index 100% rename from nixos/modules/logrotate/logrotate.conf rename to host/cloud/modules/logrotate/logrotate.conf diff --git a/nixos/modules/nextcloud/default.nix b/host/cloud/modules/nextcloud/default.nix similarity index 100% rename from nixos/modules/nextcloud/default.nix rename to host/cloud/modules/nextcloud/default.nix diff --git a/host/cloud/modules/nextcloud/nextcloud-admin-pass b/host/cloud/modules/nextcloud/nextcloud-admin-pass new file mode 100644 index 0000000..00221b9 --- /dev/null +++ b/host/cloud/modules/nextcloud/nextcloud-admin-pass @@ -0,0 +1 @@ +snYBkSxkFZ6a7Y \ No newline at end of file diff --git a/nixos/modules/nginx/default.nix b/host/cloud/modules/nginx/default.nix similarity index 100% rename from nixos/modules/nginx/default.nix rename to host/cloud/modules/nginx/default.nix diff --git a/nixos/modules/snapraid/default.nix b/host/cloud/modules/snapraid/default.nix similarity index 100% rename from nixos/modules/snapraid/default.nix rename to host/cloud/modules/snapraid/default.nix diff --git a/nixos/modules/snapraid/snapraid.conf b/host/cloud/modules/snapraid/snapraid.conf similarity index 100% rename from nixos/modules/snapraid/snapraid.conf rename to host/cloud/modules/snapraid/snapraid.conf diff --git a/host/dockge/default.nix b/host/dockge/default.nix new file mode 100644 index 0000000..84c43d0 --- /dev/null +++ b/host/dockge/default.nix @@ -0,0 +1,55 @@ +{ modulesPath, config, pkgs, ... }: + +let + + hostname = "cloud"; + +in { + + ## MODULES & IMPORTS ## + imports = [ + # Common Modules + ../../common/lxc + ../../common/ssh + + # Import hardware configuration. + ./hardware.nix + + # Local Modules + ]; + + ## NETWORKING ## + networking = { + firewall = { + allowedTCPPorts = [ 22 80 443 ]; + allowedUDPPorts = [ ]; + }; + dhcpcd.enable = false; + hostName = hostname; + networkmanager.enable = true; + useDHCP = false; + useHostResolvConf = false; + }; + + systemd.network = { + enable = true; + networks."50-eth0" = { + matchConfig.Name = "eth0"; + networkConfig = { + DHCP = "ipv4"; + IPv6AcceptRA = true; + }; + linkConfig.RequiredForOnline = "routable"; + }; + }; + + ## PACKAGES ## + environment.systemPackages = with pkgs; [ + git + micro + openssh + ranger + sshfs + wget + ]; +} diff --git a/host/dockge/hardware.nix b/host/dockge/hardware.nix new file mode 100644 index 0000000..fff62ff --- /dev/null +++ b/host/dockge/hardware.nix @@ -0,0 +1,13 @@ +{ + # Treats the system as a container. + boot.isContainer = true; + + # TODO: SSHFS + # fileSystems."/" = { + # device = "/dev/sda1"; + # fsType = "ext4"; + # }; + + # Set your system kind (needed for flakes) + nixpkgs.hostPlatform = "x86_64-linux"; +} \ No newline at end of file diff --git a/host/nix/default.nix b/host/nix/default.nix new file mode 100644 index 0000000..dd74a99 --- /dev/null +++ b/host/nix/default.nix @@ -0,0 +1,56 @@ +{ modulesPath, config, pkgs, ... }: +let + + admin = "toph"; + password = "[REDACTED]"; + timeZone = "America/New_York"; + defaultLocale = "en_US.UTF-8"; + +in { + + ## MODULES & IMPORTS ## + imports = [ + # Common Modules + ../../common/lxc + ../../common/ssh + + # Import hardware configuration. + ./hardware.nix + ]; + + ## NETWORKING ## + networking = { + firewall = { + allowedTCPPorts = [ 80 443 ]; + }; + dhcpcd.enable = false; + hostName = hostname; + networkmanager.enable = true; + useDHCP = false; + useHostResolvConf = false; + }; + + systemd.network = { + enable = true; + networks."50-eth0" = { + matchConfig.Name = "eth0"; + networkConfig = { + DHCP = "ipv4"; + IPv6AcceptRA = true; + }; + linkConfig.RequiredForOnline = "routable"; + }; + }; + + ## PACKAGES ## + environment.systemPackages = with pkgs; [ + git + micro + openbox + openssh + ranger + sshfs + wget + x2goserver + ]; +} diff --git a/host/nix/hardware.nix b/host/nix/hardware.nix new file mode 100644 index 0000000..1068b3e --- /dev/null +++ b/host/nix/hardware.nix @@ -0,0 +1,7 @@ +{ + # TODO: SSHFS + # fileSystems."/" = { + # device = "/dev/sda1"; + # fsType = "ext4"; + # }; +} diff --git a/host/proxy/default.nix b/host/proxy/default.nix new file mode 100644 index 0000000..acbfc66 --- /dev/null +++ b/host/proxy/default.nix @@ -0,0 +1,61 @@ +{ modulesPath, config, pkgs, ... }: + +let + + hostname = "proxy"; + admin = "toph"; + password = "[REDACTED]"; + timeZone = "America/New_York"; + defaultLocale = "en_US.UTF-8"; + +in { + + ## MODULES & IMPORTS ## + imports = [ + # Common Modules + ../../common/acme + ../../common/lxc + ../../common/ssh + + # Import hardware configuration. + ./hardware.nix + + # Local Modules + + # caddy + ./modules/caddy + ]; + + ## NETWORKING ## + networking = { + firewall = { + allowedTCPPorts = [ 22 80 443 ]; + allowedUDPPorts = [ ]; + }; + dhcpcd.enable = false; + hostName = hostname; + networkmanager.enable = true; + useHostResolvConf = false; + }; + + systemd.network = { + enable = true; + networks."50-net0" = { + matchConfig.Name = "net0"; + networkConfig = { + DHCP = "yes"; + IPv6AcceptRA = true; + }; + linkConfig.RequiredForOnline = "routable"; + }; + }; + + ## PACKAGES ## + environment.systemPackages = with pkgs; [ + git + micro + openssh + ranger + sshfs + ]; +} diff --git a/host/proxy/hardware.nix b/host/proxy/hardware.nix new file mode 100644 index 0000000..c6d4323 --- /dev/null +++ b/host/proxy/hardware.nix @@ -0,0 +1,6 @@ +{ + # fileSystems."/" = { + # device = "/dev/sda1"; + # fsType = "ext4"; + # }; +} \ No newline at end of file diff --git a/host/proxy/modules/acme/cloudflare.ini.example b/host/proxy/modules/acme/cloudflare.ini.example new file mode 100644 index 0000000..3bb6b44 --- /dev/null +++ b/host/proxy/modules/acme/cloudflare.ini.example @@ -0,0 +1 @@ +CF_DNS_API_TOKEN= \ No newline at end of file diff --git a/nixos/modules/acme/default.nix b/host/proxy/modules/acme/default.nix similarity index 100% rename from nixos/modules/acme/default.nix rename to host/proxy/modules/acme/default.nix diff --git a/host/proxy/modules/caddy/default.nix b/host/proxy/modules/caddy/default.nix new file mode 100644 index 0000000..6b9adcf --- /dev/null +++ b/host/proxy/modules/caddy/default.nix @@ -0,0 +1,107 @@ +{ + services.caddy = { + enable = true; + virtualHosts = { + "ryot.foo" = { + useACMEHost = "ryot.foo"; + extraConfig = '' + reverse_proxy 104.40.4.44:80 + ''; + }; + + "adguard.ryot.foo" = { + useACMEHost = "ryot.foo"; + extraConfig = '' + reverse_proxy opnsense:81 + ''; + }; + + "cloud.ryot.foo" = { + useACMEHost = "ryot.foo"; + extraConfig = '' + reverse_proxy https://104.40.4.24:443 { + transport http { + tls_insecure_skip_verify + } + } + ''; + }; + + "cloudflared.ryot.foo" = { + useACMEHost = "ryot.foo"; + extraConfig = '' + reverse_proxy http://104.40.4.44:14333 + ''; + }; + + "dash.ryot.foo" = { + useACMEHost = "ryot.foo"; + extraConfig = '' + reverse_proxy http://104.40.4.44:3001 + ''; + }; + + "dazzle.ryot.foo" = { + useACMEHost = "ryot.foo"; + extraConfig = '' + reverse_proxy http://104.40.4.44:8070 + ''; + }; + + "dockge.ryot.foo" = { + useACMEHost = "ryot.foo"; + extraConfig = '' + reverse_proxy http://104.40.4.44:5001 + ''; + }; + + "drive.ryot.foo" = { + useACMEHost = "ryot.foo"; + extraConfig = '' + reverse_proxy http://104.40.4.44:8080 + ''; + }; + + "frp.ryot.foo" = { + useACMEHost = "ryot.foo"; + extraConfig = '' + reverse_proxy http://104.40.4.44:4041 + ''; + }; + + + "home.ryot.foo" = { + useACMEHost = "ryot.foo"; + extraConfig = '' + reverse_proxy http://104.40.4.44:7575 + ''; + }; + + + "nginx.ryot.foo" = { + useACMEHost = "ryot.foo"; + extraConfig = '' + reverse_proxy http://104.40.4.44:81 + ''; + }; + + "pve.ryot.foo" = { + useACMEHost = "ryot.foo"; + extraConfig = '' + reverse_proxy 10.163.22.82:8006 { + transport http { + tls_insecure_skip_verify + } + } + ''; + }; + + "upsnap.ryot.foo" = { + useACMEHost = "ryot.foo"; + extraConfig = '' + reverse_proxy http://104.40.4.44:8090 + ''; + }; + }; + }; +} \ No newline at end of file diff --git a/host/proxy/modules/nginx/default.nix b/host/proxy/modules/nginx/default.nix new file mode 100644 index 0000000..13db7f9 --- /dev/null +++ b/host/proxy/modules/nginx/default.nix @@ -0,0 +1,18 @@ +{ + + # INFO: migth need at some point so keeping it here + + # Nginx + services.nginx = { + enable = true; + # Use recommended settings + recommendedGzipSettings = true; + recommendedOptimisation = true; + recommendedProxySettings = true; + recommendedTlsSettings = true; + + # Add a virtual host + virtualHosts."ryot.com" = {}; + + }; +} \ No newline at end of file diff --git a/host/proxy/modules/ssh/default.nix b/host/proxy/modules/ssh/default.nix new file mode 100644 index 0000000..f959784 --- /dev/null +++ b/host/proxy/modules/ssh/default.nix @@ -0,0 +1,18 @@ +{ + programs.ssh.startAgent = true; + + users.users.root.openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIClZstYoT64zHnGfE7LMYNiQPN5/gmCt382lC+Ji8lrH PVE" + ]; + + services.openssh = { + enable = true; + settings = { + AllowUsers = null; # everyone + GatewayPorts = "yes"; # allow remote port forwarding with AutoSSH + KbdInteractiveAuthentication = false; + PasswordAuthentication = false; + PermitRootLogin = "yes"; + }; + }; +} \ No newline at end of file diff --git a/nix/default.nix b/nix/default.nix new file mode 100644 index 0000000..1b51bb3 --- /dev/null +++ b/nix/default.nix @@ -0,0 +1,49 @@ +{ modulesPath, config, pkgs, ... }: + +let + + admin = "toph"; + password = "[REDACTED]"; + timeZone = "America/New_York"; + defaultLocale = "en_US.UTF-8"; + +in { + ## TIMEZONE & LOCALE ## + time.timeZone = timeZone; + i18n.defaultLocale = defaultLocale; + + ## USERS ## + users.mutableUsers = false; + users.users."${admin}" = { + isNormalUser = true; + createHome = true; + homeMode = "750"; + home = "/home/${admin}"; + password = password; + extraGroups = [ "wheel" ]; + shell = pkgs.fish; + openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIClZstYoT64zHnGfE7LMYNiQPN5/gmCt382lC+Ji8lrH PVE" + ]; + }; + + # INFO: Enable passwordless sudo. + security.sudo.extraRules = [{ + users = [ admin ]; + commands = [{ + command = "ALL" ; + options = [ "NOPASSWD" ]; + }]; + }]; + + ## PROGRAMS & SERVICES ## + # Shells + environment.shells = with pkgs; [ bash fish ]; + programs.fish.enable = true; + + ## NIXOS ## + # This value determines the NixOS release with which your system is to be + system.stateVersion = "24.11"; + # Enable Flakes + nix.settings.experimental-features = [ "nix-command" "flakes" ]; +} \ No newline at end of file diff --git a/nixos/overlays/default.nix b/nix/overlays/default.nix similarity index 100% rename from nixos/overlays/default.nix rename to nix/overlays/default.nix diff --git a/nixos/pkgs/snapraid-runner/default.nix b/nix/pkgs/snapraid-runner/default.nix similarity index 100% rename from nixos/pkgs/snapraid-runner/default.nix rename to nix/pkgs/snapraid-runner/default.nix diff --git a/nixos/pkgs/snapraid-runner/snapraid-runner.conf b/nix/pkgs/snapraid-runner/snapraid-runner.conf similarity index 100% rename from nixos/pkgs/snapraid-runner/snapraid-runner.conf rename to nix/pkgs/snapraid-runner/snapraid-runner.conf diff --git a/nixos/pkgs/snapraid-runner/snapraid-runner.py b/nix/pkgs/snapraid-runner/snapraid-runner.py similarity index 100% rename from nixos/pkgs/snapraid-runner/snapraid-runner.py rename to nix/pkgs/snapraid-runner/snapraid-runner.py diff --git a/nixos/default.nix b/nixos/default.nix deleted file mode 100644 index 15d98d5..0000000 --- a/nixos/default.nix +++ /dev/null @@ -1,137 +0,0 @@ -{ modulesPath, config, pkgs, ... }: - -let - - hostname = "cloud"; - admin = "toph"; - password = "[REDACTED]"; - timeZone = "America/New_York"; - defaultLocale = "en_US.UTF-8"; - -in { - - ## MODULES & IMPORTS ## - - imports = - [ - # Include the default lxc/lxd configuration. - "${modulesPath}/virtualisation/lxc-container.nix" - # Import hardware configuration. - ./hardware-configuration.nix - - # Module imports - - # ACME - ./modules/acme - # cron - ./modules/cron - # Logrotate - ./modules/logrotate - # Nextcloud - ./modules/nextcloud - # Nginx - ./modules/nginx - # Snapraid-runner - ./modules/snapraid - # SSH - ./modules/ssh - ]; - - ## NETWORKING ## - networking = { - firewall = { - allowedTCPPorts = [ 80 443 ]; - }; - dhcpcd.enable = false; - hostName = hostname; - networkmanager.enable = true; - useDHCP = false; - useHostResolvConf = false; - }; - - systemd.network = { - enable = true; - networks."50-eth0" = { - matchConfig.Name = "eth0"; - networkConfig = { - DHCP = "ipv4"; - IPv6AcceptRA = true; - }; - linkConfig.RequiredForOnline = "routable"; - }; - }; - - ## TIMEZONE & LOCALE ## - time.timeZone = timeZone; - i18n.defaultLocale = defaultLocale; - - ## USERS ## - users = { - mutableUsers = false; - users = { - "${admin}" = { - isNormalUser = true; - createHome = true; - homeMode = "750"; - home = "/home/${admin}"; - password = password; - extraGroups = [ "wheel" ]; - shell = pkgs.fish; - openssh.authorizedKeys.keys = [ - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIClZstYoT64zHnGfE7LMYNiQPN5/gmCt382lC+Ji8lrH PVE" - ]; - }; - - nextcloud.extraGroups = [ "users" "root" "wheel" ]; - nextcloud.homeMode = "750"; - }; - }; - - # INFO: Enable passwordless sudo. - security.sudo.extraRules= [ - { users = [ admin ]; - commands = [ - { command = "ALL" ; - options= [ "NOPASSWD" ]; - } - ]; - } - ]; - - ## PACKAGES ## - - nixpkgs.overlays = [ (import ./overlays) ]; - environment.systemPackages = with pkgs; [ - git - mergerfs - micro - openssh - ranger - sshfs - snapraid - snapraid-runner - wget - ]; - - ## PROGRAMS & SERVICES ## - - # Shells - environment.shells = with pkgs; [ bash fish ]; - programs.fish.enable = true; - - ## NIXOS ## - - # LXC specific configuration - # Supress systemd units that don't work because of LXC. - # https://blog.xirion.net/posts/nixos-proxmox-lxc/#configurationnix-tweak - systemd.suppressedSystemUnits = [ - "dev-mqueue.mount" - "sys-kernel-debug.mount" - "sys-fs-fuse-connections.mount" - ]; - - # This value determines the NixOS release with which your system is to be - system.stateVersion = "24.11"; - # Enable Flakes - nix.settings.experimental-features = [ "nix-command" "flakes" ]; -}