From 921f8fc6a7c0a7488da07031d3ded61d0552ae54 Mon Sep 17 00:00:00 2001 From: "Lennart J. Kurzweg (Nx2)" Date: Mon, 31 Mar 2025 01:23:45 +0200 Subject: [PATCH 1/6] dyn_dns --- configuration.nix | 1 + sops-secrets.yaml | 7 ++++--- system-modules/nx2site.nix | 2 ++ system-modules/nx2site/dyn_dns.nix | 22 ++++++++++++++++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 system-modules/nx2site/dyn_dns.nix diff --git a/configuration.nix b/configuration.nix index 9d84c13..20259aa 100644 --- a/configuration.nix +++ b/configuration.nix @@ -45,6 +45,7 @@ ./system-modules/postgres.nix ./system-modules/nx2site/proxy.nix ./system-modules/nx2site/audiobookshelf.nix + # ./system-modules/nx2site/dyn_dns.nix ./system-modules/nx2site/gitea.nix ./system-modules/nx2site/open-web-calendar.nix ./system-modules/nx2site/radicale.nix diff --git a/sops-secrets.yaml b/sops-secrets.yaml index d249be7..a90532c 100644 --- a/sops-secrets.yaml +++ b/sops-secrets.yaml @@ -23,6 +23,7 @@ nx2site: cloudflare: api-token-dns-edit: ENC[AES256_GCM,data:fR4fH6NqwtHI8aebEwjUn5JMoy3q3GXgu/dREe8JK7yRBIOhJ8BKuw==,iv:fQqLRYCN/7zhpHzYxMcn8q1aA7x4qd3qWGgrFWn2E/U=,tag:GJ1muJG755ch/84Sgcf2Vw==,type:str] global-api-key: ENC[AES256_GCM,data:7WBmyEYFG0jEkxeiF9H4isfrCrn7Uv21hEJgX5i2/fOu3+evZA==,iv:IicsZo7qMG3xOKVr8lHzsOu2pTaDKUSx+85SyehDe20=,tag:nQ+CWX2kEmk3vIH4pi6Vlw==,type:str] + global-api-key-env: ENC[AES256_GCM,data:eb+Lg4R39VBNKG+NpH4n51E9MwMcW0Qm8x9cQZ4o/MnggZrAAR6wVOhzq8fCb0hB7CrIkPBcIS78044=,iv:MmGpDBC6uDOQ3cF4H2SvWXceBLxPyk42udSwe5jboBc=,tag:GP02DUCyQevfryhrO6py0w==,type:str] sslCertificate.pem: ENC[AES256_GCM,data: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,iv:r4vqXNMieiy9+E1ZIknUxQtxgEoZh7zSSrJ0yS5KQUs=,tag:AYX7RayP3dmNgUnkytQg7Q==,type:str] sslCertificateKey.pem: ENC[AES256_GCM,data:Wzmi17UA4mpCr4VaUolfKwZJEZ5K9Ybp2/K3noC/D/QYlgJfwWnQEoXDfLj3lVVnz0V/m71NAtZ9p3/jhiQCyIwt0cOmsAmd1isHf0KQwGagc8cHttwDeZT7AzLW4axqevpZM8bjVk/TJ/k+uGbArqSwgu2W7C77uCltSS8AydWzD2D7eQciDZzQ4yyHShW9f0SH8Q/wumuY4ksjLs4roYtQgtr1ezUb1U329xA1y81apd47RHviJ/moOBQYY2Y8fbNryUmfqvGYtsfXxmNElJpGAStqjBCo0bncOetP+bfj90CJlbkIn1JzcPOa5ZJjDg==,iv:28PcaWyOsQ8gN6qvZYDS3H4lKKlU7ihxxLUXMYgHPEY=,tag:6t+jvoAZkYlqg/2d8V5Emw==,type:str] dhparams.pem: ENC[AES256_GCM,data:wGIUlT8QHruxHvrlaUdEDU3aKkB5hvQLZXic1ryKr1hIFw9uOv1hOCOPY+QUDBzfm+DXv62hTFAeq4siAoZ0wWvQ0uBuSZZBGrfuY1ZTsTJmpgTphdHi+S4/kl/Vt7nuBlvdW8VbwU+mzmSK4UuIjuvAl0RI+q9C/BAu0tsXvKfaCkrbYwSi6pdPjToEoATPWfuCdkZUulENBIdBkTLZ6F97fgNgsXub2xOEIRxqFAzg3G2nO3Mn7rSRRJraZNIsHgBTYpSNcijDBwZpgYKjcKsochYUNzVrCuLOu5xJPUU87pmd+Rup2hpMfWyK0xtUjncvHyfctEZANqfo+RdEBg81n1WHkFb1WnWUsRh8RmcVZuA9skI5S7Xhp4L2B5IKn0XGnKLG3og9iYb9tDVQys4o5/68+jjxdm51fmRYo3FvghnyFCYkQ/tm+ClCcRSPocYDrfSf0Rvg2v9nPmMj0IrEHlzVnafiJgp3VjI9cYLNW2wKiwf0Z8dWkrtnS8G7p072+w0fklmvLrdvlLZduAwrY6gS2nMbPUz1AwjAoMmQi7sFmbkP6M/PmkVV+hNP7T9ntmC4BQr2k5/3gKZPOEPO/xeMLlla68QpDVxU06NhC0Z3d5t3YY0wIVISNZXi4fgQO0G5nvFpPyyWCvvg39gulyAwUJfFQ3erNNFTjJe7X9RjqoJvjTgFm4IaYcL64Cr49KDu6Za01g492rBCEL842o3lVmZSqOYCG3UEEsSwOxn2iROZKgorZ5dyd1n1WevM+pKTUAaucy52iLJGLISRAVv82ZkmbS5L4zMHkYxVjUnqrYIZsk6+7sRHIQ31E0YtUFdMjRYUcOwfR1u+Ox+zV1NawpKjsuhKl+DRN+Q1TXUdEumUU1pDHT/RXtNHsyYOgeCBbTs93kdhFcHgO0dh5Ou/2N8EcTzWwAYd/qyE3wMZZTggTb44xwu6h0XhaLtnAk2lZ4vXwSaozf+Vq/uxAvYLxrhx6ujKVyX/O053YsKqOPKerYoN17uO8PrKoA==,iv:e0RPF9ZtzSRBRzMtWTWY3AVGsMXxvldA2HjiW9hf97Q=,tag:eb9ACnuGR+8eqncWoKQ/pw==,type:str] @@ -87,8 +88,8 @@ sops: SHJLR3lvdlFiRmJuU25RUHFFTmpjamMKbzycdDvQBAuOiRROTZEQSnaXoPapz73L yVS9EUP25FSx/sGqRqaCefbeaybuM1aso6LDnlomv4Bib7zjugWKSw== -----END AGE ENCRYPTED FILE----- - lastmodified: "2025-01-31T18:19:08Z" - mac: ENC[AES256_GCM,data:RpbqXk0JclXNVcHs5jCHVaw59AwzCnfhGsxoQnOwNEYWnAxEC5b0fXtjIC6Od4ziPJkPzUtfHgBG9Ub+b+RL7LUMPmsPOZ8XxE16YTrr+athK1s07I8doON8UpIsGj+MP/quJgy9pb/AvReOce/5Qe8SZG4Lig68I3iqHYFsiJ4=,iv:Huc7dZQPkJ+aPBgfqxdhy+PRl+8520aZMmqBeNd/C2w=,tag:M897FVr8TfAx3zDaml69Ww==,type:str] + lastmodified: "2025-03-07T17:02:01Z" + mac: ENC[AES256_GCM,data:js375bjy8Z4ApUXbw4eIqNl5BBgeX2bwMFBCx63LNCsb56OlHyYobQGtL1CwcDGW/+hwVLJSxbEDwqzJiu5vQ/2Cp00nVwvumHrvqZi/Ka4r87uNd6psE4nMq6ROHP0kJm6STKqd6MDyuLRjfX5zrki7ZhYTWsYS90/d9SUHUj8=,iv:W3w1f7lkL3fuOWmNhLUsOTKG18+wLhWA04GjygDIUEc=,tag:AYy9O7OcsY2W4VbOzyM5oA==,type:str] pgp: - created_at: "2024-06-09T19:44:41Z" enc: |- @@ -103,4 +104,4 @@ sops: -----END PGP MESSAGE----- fp: 22FB2CC03DC5292AB81CF67D0AF27B383170E634 unencrypted_suffix: _unencrypted - version: 3.9.2 + version: 3.9.4 diff --git a/system-modules/nx2site.nix b/system-modules/nx2site.nix index 0ee89ca..7022dd4 100644 --- a/system-modules/nx2site.nix +++ b/system-modules/nx2site.nix @@ -49,11 +49,13 @@ let dns-user = "cloudflare"; in } /* python */ '' import requests import subprocess +from time import sleep def get_public_ip(ipv6: bool = False) -> str: return subprocess.run(['${pkgs.curl}/bin/curl', '-s', '-6' if ipv6 else '-4', 'https://ifconfig.me'], capture_output=True, text=True).stdout.strip() def update_record(record_id: str, record_name: str, ip: str, type: str, proxied: bool, pw: str) -> None: + sleep(5) return requests.patch( f'https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/{record_id}', headers={ diff --git a/system-modules/nx2site/dyn_dns.nix b/system-modules/nx2site/dyn_dns.nix new file mode 100644 index 0000000..6663a22 --- /dev/null +++ b/system-modules/nx2site/dyn_dns.nix @@ -0,0 +1,22 @@ +{ config, pkgs, domain, ... }: +{ + sops.secrets = { + # "nx2site/namecheap.pw" = { }; + # "nx2site/cloudflare/api-token-dns-edit" = { }; + "nx2site/cloudflare/global-api-key-env" = { + owner = "root"; + }; + }; + services.cloudflare-dyndns = { + enable = true; + ipv4 = true; + ipv6 = config.networking.enableIPv6; + domains = [ + "${domain}" + "*.${domain}" + "ssh.${domain}" + ]; + proxied = true; + apiTokenFile = config.sops.secrets."nx2site/cloudflare/global-api-key-env".path; + }; +} From 8a8780ff71bff8f97d6ca35db99c0be549a470d8 Mon Sep 17 00:00:00 2001 From: "Lennart J. Kurzweg (Nx2)" Date: Mon, 31 Mar 2025 01:24:45 +0200 Subject: [PATCH 2/6] hugo --- configuration.nix | 1 + home-modules/hugo.nix | 7 ------- home.nix | 1 - system-modules/hugo.nix | 32 ++++++++++++++++++++++++++++++++ system-modules/nx2site/proxy.nix | 17 ++++++++++++++--- 5 files changed, 47 insertions(+), 11 deletions(-) delete mode 100644 home-modules/hugo.nix create mode 100644 system-modules/hugo.nix diff --git a/configuration.nix b/configuration.nix index 20259aa..0afddfa 100644 --- a/configuration.nix +++ b/configuration.nix @@ -42,6 +42,7 @@ ./system-modules/ydotool.nix ]) ++ (if (host == "NxACE") then [ ./system-modules/nx2site.nix + ./system-modules/hugo.nix ./system-modules/postgres.nix ./system-modules/nx2site/proxy.nix ./system-modules/nx2site/audiobookshelf.nix diff --git a/home-modules/hugo.nix b/home-modules/hugo.nix deleted file mode 100644 index d2f30f6..0000000 --- a/home-modules/hugo.nix +++ /dev/null @@ -1,7 +0,0 @@ -{ pkgs, ... }: -{ - home.packages = with pkgs; [ - hugo - dart-sass - ]; -} diff --git a/home.nix b/home.nix index 7e1e70e..52a9bec 100644 --- a/home.nix +++ b/home.nix @@ -62,7 +62,6 @@ ./home-modules/zathura.nix ./home-modules/zoxide.nix ] ++ (if (host == "NxACE") then [ - ./home-modules/hugo.nix ./home-modules/nx2site.nix ./home-modules/nx2site-backup.nix ] else []); diff --git a/system-modules/hugo.nix b/system-modules/hugo.nix new file mode 100644 index 0000000..713662a --- /dev/null +++ b/system-modules/hugo.nix @@ -0,0 +1,32 @@ +{ pkgs-unstable, user, ... }: +let p = pkgs-unstable; in +{ + environment.systemPackages = with p; [ + hugo + dart-sass + ]; + + users = { + groups = { + "hugo".name = "hugo"; + }; + users = { + "${user}".extraGroups = [ "hugo" ]; + "nginx".extraGroups = [ "hugo" ]; + "hugo" = { + isSystemUser = true; + group = "hugo"; + }; + }; + }; + + systemd.services."hugo" = { + script = with p; /* shell */ '' + ${hugo}/bin/hugo serve --port 8000 --bind 10.0.1.1 --baseURL http://10.0.1.1:8000 -s /var/lib/hugo/nx2site/ + ''; + serviceConfig = { + Type = "simple"; + User = "hugo"; + }; + }; +} diff --git a/system-modules/nx2site/proxy.nix b/system-modules/nx2site/proxy.nix index fe6b9cb..a8e85ec 100644 --- a/system-modules/nx2site/proxy.nix +++ b/system-modules/nx2site/proxy.nix @@ -14,7 +14,7 @@ }; certs = { "${domain}" = { - extraDomainNames = builtins.map (subd: "${subd}.${domain}") [ "sync" ]; + extraDomainNames = builtins.map (subd: "${subd}.${domain}") [ "sync" "dev" ]; }; }; }; @@ -145,10 +145,21 @@ # }; "abs.${domain}" = vh // { listen = dl; - locations = { "/" = { + locations."/" = { proxyPass = "http://127.0.0.1:${builtins.toString config.services.audiobookshelf.port}"; proxyWebsockets = true; - }; }; + }; + }; + "dev.${domain}" = vh // { + listen = dl ++ [ + # { addr = "0.0.0.0"; port = 8000; ssl = true; } + # { addr = "[::0]"; port = 8000; ssl = true; } + ]; + root = "/var/lib/hugo/nx2site/public"; + # locations."/" = { + # proxyPass = "http://127.0.0.1:8000"; + # proxyWebsockets = true; + # }; }; # is done atomatically # "cal.${domain}" = vh // { From 61a788961d7df59f5625d3981c40a19597d69e8e Mon Sep 17 00:00:00 2001 From: "Lennart J. Kurzweg (Nx2)" Date: Mon, 31 Mar 2025 01:26:42 +0200 Subject: [PATCH 3/6] calendar lr + dicos description + cleanup --- configuration.nix | 1 + system-modules/calendar-dicos.nix | 13 ++++-- system-modules/calendar-lec.nix | 8 ---- system-modules/calendar-lr.nix | 74 +++++++++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 12 deletions(-) create mode 100644 system-modules/calendar-lr.nix diff --git a/configuration.nix b/configuration.nix index 0afddfa..6dc0e36 100644 --- a/configuration.nix +++ b/configuration.nix @@ -56,6 +56,7 @@ ./system-modules/calendar-publish.nix ./system-modules/calendar-lec.nix + ./system-modules/calendar-lr.nix ./system-modules/calendar-dicos.nix ] else []); diff --git a/system-modules/calendar-dicos.nix b/system-modules/calendar-dicos.nix index ac91913..2960bb4 100644 --- a/system-modules/calendar-dicos.nix +++ b/system-modules/calendar-dicos.nix @@ -56,7 +56,7 @@ def modify_event(event): global latest_week global deficit - if event.name and "DICOS" in event.name: + if event.name is not None and "DICOS" in event.name: length = (event.end - event.begin).seconds / 3600 money_made = divmod(length * NETTO_STUNDE, 1) @@ -78,9 +78,14 @@ def modify_event(event): latest_goal = goal latest_week = week - progress_line = f"({fraction_to_unicode(progress)}/{fraction_to_unicode(goal)})" + new_description = [event.description.split("\n")[0] or "::"] + new_description.append("") + new_description.append(f"Netto: {money_made[0]:.0f},{int(money_made[1] * 10):02d}€") + new_description.append(f"This weeks porgress: ({fraction_to_unicode(progress)}/{fraction_to_unicode(goal)})") + new_description.append(f"This weeks deficit: {fraction_to_unicode(deficit)}") + + event.description = "\n".join(new_description) - event.description = f"Netto: {money_made[0]:.0f},{int(money_made[1] * 10):02d}€\nThis weeks porgress: {progress_line}\nThis weeks deficit: {fraction_to_unicode(deficit)}" event.name = f"DICOS {fraction_to_unicode(length)}" return event @@ -92,7 +97,7 @@ def process_ics_file(filepath): modified = False for event in calendar.events: - if 'DICOS' in event.name: + if event.name is not None and 'DICOS' in event.name: event = modify_event(event) modified = True diff --git a/system-modules/calendar-lec.nix b/system-modules/calendar-lec.nix index 0fd5742..280c13a 100644 --- a/system-modules/calendar-lec.nix +++ b/system-modules/calendar-lec.nix @@ -21,18 +21,10 @@ ]; flakeIgnore = [ "E302" "E305" "E226" "E501" ]; } /*python */ '' -import hashlib from ics import Calendar import requests from datetime import timedelta -def get_event_hash(event): - """ - Generate a unique hash for an event based on its details. - """ - event_data = f"{event.name}{event.begin}{event.end}{event.description}" - return hashlib.md5(event_data.encode('utf-8')).hexdigest() - def adjust_events(events): """ Adjust overlapping events to ensure they do not conflict. diff --git a/system-modules/calendar-lr.nix b/system-modules/calendar-lr.nix new file mode 100644 index 0000000..d9678ed --- /dev/null +++ b/system-modules/calendar-lr.nix @@ -0,0 +1,74 @@ +{ config, pkgs, domain, ... }: +{ + systemd.timers."nx_cal_lr" = { + enable = true; + wantedBy = [ "timers.target" ]; + timerConfig = { + OnBootSec = "41m"; + OnUnitActiveSec = "24h"; + Unit = "nx_cal_lr.service"; + }; + }; + + systemd.services."nx_cal_lr" = { + script = let + nx_cal_lr = (pkgs.writers.writePython3Bin "nx_cal_lr" { + libraries = with pkgs.python3Packages; [ + ics + requests + ]; + flakeIgnore = [ "E302" "E305" "E226" "E501" ]; + } /*python */ '' +from ics import Calendar +import requests + +def filter_events(events): + return [event for event in events if ("LR" in event.name) or ("TBD" in event.name)] + +def fetch_and_save_ical_events(ical_url, save_path): + """ + Fetch events from an iCal URL and save them as a single combined calendar. + """ + try: + # Fetch the iCal data + response = requests.get(ical_url) + response.raise_for_status() + + # Parse the iCal data + calendar = Calendar(response.text) + + # Adjust events + adjusted_events = filter_events(list(calendar.events)) + + # Create a new combined calendar + combined_calendar = Calendar() + for event in adjusted_events: + combined_calendar.events.add(event) + + # Save the combined calendar to a single .ics file + with open(save_path, 'w') as file: + file.writelines(combined_calendar.serialize_iter()) + + print(f"Saved combined calendar to {save_path}") + + except requests.exceptions.RequestException as e: + print(f"Error fetching iCal data: {e}") + except Exception as e: + print(f"Error processing iCal data: {e}") + +if __name__ == "__main__": + # Replace with your iCal URL and target file path + ICAL_URL = "https://zlypher.github.io/lol-events/cal/league-of-legends-nlc.ical" + SAVE_PATH = "${config.services.nginx.virtualHosts."${domain}".root}/lr.ics" + + fetch_and_save_ical_events(ICAL_URL, SAVE_PATH) +''); + in '' + ${nx_cal_lr}/bin/nx_cal_lr + ''; + serviceConfig = { + Type = "oneshot"; + User = "nx2"; + }; + }; +} From 2b5150803017077661245704ee152cbf146631ce Mon Sep 17 00:00:00 2001 From: "Lennart J. Kurzweg (Nx2)" Date: Mon, 31 Mar 2025 01:51:15 +0200 Subject: [PATCH 4/6] nxace no games --- home-modules/games.nix | 3 ++- system-modules/games.nix | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/home-modules/games.nix b/home-modules/games.nix index 544539d..17a14cb 100644 --- a/home-modules/games.nix +++ b/home-modules/games.nix @@ -1,5 +1,6 @@ { pkgs-unstable, pkgs, lib, host, ... }: -lib.mkIf (host == "NxNORTH" || host == "NxACE") +# lib.mkIf (host == "NxNORTH" || host == "NxACE") +lib.mkIf (host == "NxNORTH") { home = { packages = (with pkgs-unstable; [ diff --git a/system-modules/games.nix b/system-modules/games.nix index 1ee3d21..2a203b6 100644 --- a/system-modules/games.nix +++ b/system-modules/games.nix @@ -1,5 +1,6 @@ { lib, host, ... }: -lib.mkIf (host == "NxNORTH" || host == "NxACE") +# lib.mkIf (host == "NxNORTH" || host == "NxACE") +lib.mkIf (host == "NxNORTH") { programs = { steam = { From 014fca20a9a86d2b9c48175df93a343c1bf492e0 Mon Sep 17 00:00:00 2001 From: "Lennart J. Kurzweg (Nx2)" Date: Mon, 31 Mar 2025 01:51:29 +0200 Subject: [PATCH 5/6] nxace default kernel --- system-modules/boot.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system-modules/boot.nix b/system-modules/boot.nix index 66a3f8c..fd5f90c 100644 --- a/system-modules/boot.nix +++ b/system-modules/boot.nix @@ -118,7 +118,7 @@ in efiSupport = true; }; }; - kernelPackages = pkgs-unstable.linuxPackages_6_11; + kernelPackages = pkgs.linuxPackages; # default kernel of pkgs }; }; } From 6c6dd819a85cc5fd84ba0da7c4a8abdc95708e40 Mon Sep 17 00:00:00 2001 From: "Lennart J. Kurzweg (Nx2)" Date: Mon, 31 Mar 2025 01:51:39 +0200 Subject: [PATCH 6/6] nxace no obsidian --- home.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home.nix b/home.nix index fca738e..b77d179 100644 --- a/home.nix +++ b/home.nix @@ -121,11 +121,11 @@ inputs.zen-browser.packages."${system}".default ] ++ (with pkgs-unstable; [ - obsidian firefox spotify ]) ++ (if host != "NxACE" then (with pkgs; [ signal-desktop + obsidian zoom-us inkscape ]) else (with pkgs-unstable; [