diff --git a/modules/nix/ncps.nix b/modules/nix/ncps.nix index bed6064..030778e 100644 --- a/modules/nix/ncps.nix +++ b/modules/nix/ncps.nix @@ -10,7 +10,7 @@ cacheHost = "ncps.${vars.groundDomain}"; cacheUrl = "https://${cacheHost}"; - uploadKeySecret = "nix_secret_keys/ncps-upload-1"; + uploadKeySecret = "nix_ncps_upload_secret_key"; ncpsPublicKey = "${cacheHost}:jhlVJBu6bD3n1MCG153qnMFXLNfzqh7aBDK/gRULvdc="; in { diff --git a/modules/programs/gpg.nix b/modules/programs/gpg.nix index 275e5b5..fb7f125 100644 --- a/modules/programs/gpg.nix +++ b/modules/programs/gpg.nix @@ -2,10 +2,62 @@ flake.modules.homeManager.gpg = { # keep-sorted start config, + lib, pkgs, # keep-sorted end ... - }: { + }: let + inherit + (lib) + # keep-sorted start + escapeShellArg + getExe + # keep-sorted end + ; + inherit (lib.hm.dag) entryAfter; + inherit (pkgs) writeShellApplication; + + gpgHomedir = config.programs.gpg.homedir; + ownertrustSecret = config.sops.secrets."gpg/ownertrust".path; + privateKeysSecret = config.sops.secrets."gpg/private_keys".path; + + importGpgSecrets = writeShellApplication { + name = "import-gpg-secrets"; + runtimeInputs = [ + # keep-sorted start + config.programs.gpg.package + pkgs.coreutils + # keep-sorted end + ]; + text = '' + gpgHomedir=${escapeShellArg gpgHomedir} + ownertrustSecret=${escapeShellArg ownertrustSecret} + privateKeysSecret=${escapeShellArg privateKeysSecret} + + mkdir -p "$gpgHomedir" + chmod 700 "$gpgHomedir" + + if [[ -f "$privateKeysSecret" ]]; then + GNUPGHOME="$gpgHomedir" gpg --batch --import "$privateKeysSecret" + fi + + if [[ -f "$ownertrustSecret" ]]; then + GNUPGHOME="$gpgHomedir" gpg --batch --import-ownertrust "$ownertrustSecret" + fi + ''; + }; + in { + sops.secrets = { + # keep-sorted start + "gpg/ownertrust" = {}; + "gpg/private_keys" = {}; + # keep-sorted end + }; + + home.activation.importGpgSecrets = entryAfter ["sops-nix"] '' + run ${getExe importGpgSecrets} + ''; + # keep-sorted start block=yes newline_separated=yes # Supply gcr for the gnome pinentry integration. home.packages = [pkgs.gcr]; diff --git a/modules/programs/tui/television/nix-search.nix b/modules/programs/tui/television/nix-search.nix index a9c460b..dbebfcf 100644 --- a/modules/programs/tui/television/nix-search.nix +++ b/modules/programs/tui/television/nix-search.nix @@ -120,8 +120,10 @@ nix-index-database = { rawDoc = mkHomeManagerDoc inputs.nix-index-database.homeModules.nix-index; prefixes = [ - "programs.nix-index-database" + # keep-sorted start "programs.nix-index" + "programs.nix-index-database" + # keep-sorted end ]; }; @@ -171,11 +173,13 @@ authentik-nix = { rawDoc = mkNixosDoc inputs.authentik-nix.nixosModules.default; prefixes = [ + # keep-sorted start "services.authentik" "services.authentik-ldap" "services.authentik-proxy" "services.authentik-rac" "services.authentik-radius" + # keep-sorted end ]; }; diff --git a/modules/services/data/mysql.nix b/modules/services/data/mysql.nix index fa4a2d1..d712011 100644 --- a/modules/services/data/mysql.nix +++ b/modules/services/data/mysql.nix @@ -9,7 +9,7 @@ }: let inherit (vars) username; in { - sops.secrets."mysql/admin_password" = {}; + sops.secrets.mysql_admin_password = {}; services.mysql = { enable = true; @@ -81,7 +81,7 @@ # keep-sorted end # keep-sorted start - LoadCredential = ["admin_password:${config.sops.secrets."mysql/admin_password".path}"]; + LoadCredential = ["admin_password:${config.sops.secrets.mysql_admin_password.path}"]; RemainAfterExit = true; # keep-sorted end }; diff --git a/modules/services/data/postgres.nix b/modules/services/data/postgres.nix index a218705..ff51349 100644 --- a/modules/services/data/postgres.nix +++ b/modules/services/data/postgres.nix @@ -12,7 +12,7 @@ inherit (vars) username; in { - sops.secrets."postgres/admin_password" = {}; + sops.secrets.postgres_admin_password = {}; services.postgresql = { enable = true; @@ -116,7 +116,7 @@ # keep-sorted end # keep-sorted start - LoadCredential = ["admin_password:${config.sops.secrets."postgres/admin_password".path}"]; + LoadCredential = ["admin_password:${config.sops.secrets.postgres_admin_password.path}"]; RemainAfterExit = true; # keep-sorted end }; diff --git a/modules/services/data/rclone.nix b/modules/services/data/rclone.nix index 6469326..5108162 100644 --- a/modules/services/data/rclone.nix +++ b/modules/services/data/rclone.nix @@ -71,8 +71,8 @@ in { sops.secrets = { # keep-sorted start - "rclone/copyparty/basic_auth_header" = {}; - "rclone/google/token" = {}; + "rclone/copyparty_basic_auth_header" = {}; + "rclone/google_token" = {}; # keep-sorted end }; @@ -93,7 +93,7 @@ options.vfs-cache-mode = "writes"; }; - secrets.headers = config.sops.secrets."rclone/copyparty/basic_auth_header".path; + secrets.headers = config.sops.secrets."rclone/copyparty_basic_auth_header".path; }; google = { @@ -108,12 +108,19 @@ options.vfs-cache-mode = "writes"; }; - secrets.token = config.sops.secrets."rclone/google/token".path; + secrets.token = config.sops.secrets."rclone/google_token".path; }; }; }; systemd.user = { + tmpfiles.rules = [ + # keep-sorted start + "d ${config.home.homeDirectory}/Remote/copyparty 0755 - - -" + "d ${config.home.homeDirectory}/Remote/google 0755 - - -" + # keep-sorted end + ]; + services = mapAttrs' ( name: sync: nameValuePair "copyparty-${name}-bisync" (mkBisyncService name sync) diff --git a/modules/services/server/cloudbeaver.nix b/modules/services/server/cloudbeaver.nix index 367b353..4498a31 100644 --- a/modules/services/server/cloudbeaver.nix +++ b/modules/services/server/cloudbeaver.nix @@ -16,11 +16,11 @@ inherit (vars) groundDomain; in { sops = { - secrets."cloudbeaver/database_password" = {}; + secrets.cloudbeaver_database_password = {}; templates."cloudbeaver.env".content = '' - CLOUDBEAVER_DB_PASSWORD=${config.sops.placeholder."cloudbeaver/database_password"} - CLOUDBEAVER_QM_DB_PASSWORD=${config.sops.placeholder."cloudbeaver/database_password"} + CLOUDBEAVER_DB_PASSWORD=${config.sops.placeholder.cloudbeaver_database_password} + CLOUDBEAVER_QM_DB_PASSWORD=${config.sops.placeholder.cloudbeaver_database_password} ''; }; @@ -93,7 +93,7 @@ # keep-sorted end # keep-sorted start - LoadCredential = ["database_password:${secrets."cloudbeaver/database_password".path}"]; + LoadCredential = ["database_password:${secrets.cloudbeaver_database_password.path}"]; RemainAfterExit = true; # keep-sorted end }; diff --git a/secrets.yaml b/secrets.yaml index 73d22b1..266d6c8 100644 --- a/secrets.yaml +++ b/secrets.yaml @@ -58,12 +58,9 @@ dockhand: database_password: ENC[AES256_GCM,data:RtFwVrJOFgo6Kb/i9wAvq7eQhSu4/amNGfagvntKvtfo8npmtnCXRwHtO74=,iv:agnK2uU94zUTMnAR6OeYKqtF+cxqfO+xxzKIxB5iOLQ=,tag:jLal4i+vgCdAcbjE0yQA6Q==,type:str] hawser_tokens: euclid: ENC[AES256_GCM,data:MLNRRfihFLrAloft/jUccUfs0QP6DNT6xpv+JTqopaHXdBfVjxkUVnyxuQ==,iv:DgSNT0PUI+97Q0UGgpZfmf5QPE0xypCTOn5gq1Y0PTM=,tag:1ISD6HLELhz86eQpbXaJcQ==,type:str] -cloudbeaver: - database_password: ENC[AES256_GCM,data:+E2z4Hlt6E6Ju04abQ4ZVeuesdvHXjv9/N/pdWkxqzMwhKwe/HMV53b5TRWoPUlv,iv:we63yxP3d4+VUKQrFINxxq4YmvURCEtFDpseHZ3aQ+0=,tag:VI/0DZ2OVSzRdEIkbsPnMg==,type:str] -postgres: - admin_password: ENC[AES256_GCM,data:6nUmFBVCR6LiATN1za/PMAw5KP5mvuNOjtqfYR2X7SnPFxVxgHSsrAtxGn0SXB4ijPtOIOEhzPezfZJMvPLaVA==,iv:6apa7tcoOd5T6/VPu/9Zu6YmFN4phlM590+URkfynVs=,tag:i9nQViENLa6GGAZpX9kqMg==,type:str] -mysql: - admin_password: ENC[AES256_GCM,data:egySL8SuW3W+jWW0Rd2a3MvUkYrl6MmT3SfonnPOTNg6B+W90yzrKoqyilEh8MMVIDn5qhRPdtSIp8MGwi9wZQ==,iv:d4AL+Lc8kxk+9zKHAyPIRFigkCZeVk0WtoYbrGB7j+Q=,tag:aEFZKufG0ZXHxvmxJHeFVQ==,type:str] +cloudbeaver_database_password: ENC[AES256_GCM,data:Z0aZjw+PEHp5ZwkGgurbURGKHgQvbAOQIs3KcLSpDy71GhAMIofYmhemA0rATK28,iv:zO8sczluBtFUt5eV5hR0XSOwQjlx/EXDBHnuv3rsxp4=,tag:LppVYYKJzVfjSxjcDU3sDA==,type:str] +postgres_admin_password: ENC[AES256_GCM,data:DWOxuUbvu7feiIYGivUQIuVvSMyOJ3Hy2sivQkpOJfEDC+yGM9biNfMjqhXJQ9CPaSoqXQhxvbzAu4tzziCRNg==,iv:qVHpDP+FygEP3kJJzTqJ+E/67qLEGuIYE6pMwek0EEc=,tag:VPWUrSOdjWujrh+sow8eHQ==,type:str] +mysql_admin_password: ENC[AES256_GCM,data:Bp9jHvr4yoVzN16e38TNemeAQNPoRP4nvljl7Ua5MpZk0SNLg/3YY1B2rs3dSCCulpc4j4iUjOllBt6huTvxGQ==,iv:xmqu11bYmy6kiKPPjkfjYBmjj9TrDbfrNoWyE4+2w1Q=,tag:sXAWvbrVGNT6DCngY/VG2Q==,type:str] wireguard: euclid: private_key: ENC[AES256_GCM,data:dGh0qAiYgloX6EoV0Q72UP/faOpeoPqXUaxkN8lKq6KQbxycRqBHapPo+5s=,iv:jb/sliGbNK2r7yWoaL7u6RTUnbMTH6+wFJgq/LCxucE=,tag:mdfz5/aRkozRB8lRRPtd2Q==,type:str] @@ -83,12 +80,12 @@ gotify: desktop_token: ENC[AES256_GCM,data:LsEQ+gXlyXpl7BF6d+S1okv9t4OlMCk=,iv:Gq+Z5OiQR4cKy7+hM5JswAVtol+WX7nb9a7pNgmW5ZA=,tag:wz64fqoNyKmpGnIrjHt1mA==,type:str] qbittorrent_proxy_path: ENC[AES256_GCM,data:FGSBt2MQZ8Flq0y1VG0OYlrlKzweSaaiB+xKSWFObJXX2q/oNODo/7dPL8r29Fb79GKV7n5hXpQDLzSYOwd0A0EPijj/SAk=,iv:yJqKvC2L2O0eOTKvO/cAX1ldEx8z8GTvG6cbjdiXN+Q=,tag:cpFgkJoVXgfiTrLVS/KTdA==,type:str] rclone: - copyparty: - basic_auth_header: ENC[AES256_GCM,data:LuCkGzj9LxVuJKT5lS7cXCJlmeqCrZGsP1ojlk17mHpesyqQEc/3s8pwGvNLNciTA2dGlYYcECyJKly40tclKYTRrM+1vYInAlz/usA9H4OCTY+HsQB/QTrNON2hkvn2daqI679jRZS7MpyC,iv:c1i+qaSh5z8Sse2TixyWKv19aAuwdq3zw/MvQwO2+es=,tag:CnuKAWn12/dpv28WtF0SMQ==,type:str] - google: - token: ENC[AES256_GCM,data:y9fZmPYszm6B0ucuKdEA3aWx33B3VuXYj9ajglUoqVXUIxbOiprEFKNGjl6yR7SxV0MVU3e81/3Q856otA3TkQhsboDteiJOE3hHrn/iJwqCiKzX2yKzkzann0VA2ArPWjnRVTp+CZOQZu868Qwm5yHWFPpnNtVm1ST12hQe6p1DB6HjLZVj66mtZmzqKdcRwL0hTLw35Zys/l7BHb/JrDbe87K7Z/lDwGKXZruL8xgIKfc51mgO69+MPCsA8zGdH74Xv+CzHhp4lT305bGEKGjrHJICExL2i3mzRnWWBv0NJVKIQUsLylEaDLxbpZkXWqqOyO9NtmMhACobQJFCxGFChjvFLzNivF6T3tjiUiH+Ka4VkndaOAB/BbYgUCPHFNhOJ5i+9Js2tPQE/CB+20SlFPm2jSIcJmS0iSSkypJiJVSZFSftOf4PIL0wRdmI6UkQzal89e07ebMUZTqi0F38qkZDAA8swyL21n+85N2/Myjg+cvsKzPnph0GSinZUqPb9sfkANYuYBQZc7fKjgHDwYJL4h+izgCfL0hTFNKPxteHYo2hirWs984FfSnDBO4luA7kkHNbcV1QZpapFxP0DMsEMtO27ciUHX7xjItKVkQIjP+c0rjSm2l56hfYjkw=,iv:u1efJOuHXZ9OS7cD4dTV7FjqZFlr+EahfxSfN8hzUns=,tag:sU499A/nucn3hoi8e37kKw==,type:str] -nix_secret_keys: - ncps-upload-1: ENC[AES256_GCM,data:+XzdRKHu2aVMVGVD5p2pg4BrAwbERr3eQ0+mXnLMj0aZ2JPeZmi6+FFBB/cQXAMf7/lhIGRYkQwiHLy6+9Qs0o9D1RYzpo7n+bYxCgK4Y7deCe257STWEQuaFTcyBbASDUgjGgvV,iv:l4M4/1HA/IGRBv9791wzfFnwFRcEw9xSMdHsGOcjx/o=,tag:uYYQi9FfhPjTz7S4H6Zr/w==,type:str] + copyparty_basic_auth_header: ENC[AES256_GCM,data:+8jbFDYg8LnG16PKCMYGAYjELvRtjcXNPkJZNZLPoGbgkUi3kjjAFtlrhuMFxtzF816hDxmW0ABTb18wpqg3mO6RXRNuy+cgfRTwrTSBIZlrLSuLRPa5M7+gXFOwwgWiRW7sQwMnjX3o4RIp,iv:G6WsetPZxxx1D+rEteFH1DKORE/HLvwhaTaBorefMXo=,tag:Mo6faL2enVB+lWIYVmZGYA==,type:str] + google_token: ENC[AES256_GCM,data:aXMCZwDTI36qdVVqxNZbngYZ/17atvtlYTlJMGscfCG/Z7qXRB/1XixoriWlelasI9kggvycg0h+rdBo4w47KC857TSNnQpfegZJ/VGXSB1iPXXcKSmqh/69goBBAoDkdIjhcN5vHzN0VHWgHpTcPYvVBsbVagW7VdnZkgUIXuJRhQ6PCm75/+IUUcvZkV3L7VcqwJOvL/szU57zA0Vz1FZoLoYdfSGhGAV9KIh9N+TIbrS2fAPdu9D8UfV9pqZaYtSq0tYYQZGSoZAbl+GL5WwVb/woxpUtSy7AItQ9DjxuJfLLVSiEoDXSz1nG8i9PCDSY9+GXUXSadGjeZt0nWJJ2jcwoTF8eOr1USrdww35f7PaxjKe8QNTd2c66sDMeLhRDfWdGxPhgiQBjpllIdYyHbYkXeuzBzR2tj7+IawL4STIFIMgBmpOhWsDRe55y4//XjOrXFlzs7dYrorfZy01UrB6IAnU8ypAfqY4CyRKTYWfATnw3Tz3FHDAgjwokgZCBxq5K9Z7fauiCPqY8DmA8IFs1Ln3SvqC6qIDFKuWwVD/mz4Ri8iqdxx6EYR5F4BKB2CenXPGMcebXNKLm/6l9WQ6PPsHlw0Qp+fnh5oFi0bkhlkqAt0u52s7p9wZeLvc=,iv:UBFhEsJo04EHuszTJnP3qszNLOnB/mDqanb0WjYLwio=,tag:/k7BLFPn0RcrWeYJ5xXyrQ==,type:str] +nix_ncps_upload_secret_key: ENC[AES256_GCM,data:8GuPgrLyM86WyLDb3MbfH4ZLAHq21YBvUEUbc+aJ86sCUZbeEYwTktEGnkTEnPEHaaRc/s6CBwK0rA5Y0pCuNtCOivTjVC6sW7jx+qY0im7C0T24piGDZVm5PIZBs8M3NpVmfgx0,iv:eTX6/iNxN8n9Hmc0Ui36Umlsn4ORarhk/mA6E9yN//Q=,tag:iTQNJhAxiSn9AwNtIVSXlw==,type:str] +gpg: + private_keys: ENC[AES256_GCM,data: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,iv:cWOG/YEJ/vbk41rD+yeVurIb5uFUeU1bc9WA8KuD/CQ=,tag:wXMcN0KOb7PJn0FijBeWvw==,type:str] + ownertrust: ENC[AES256_GCM,data:lkCOnk4Fe+DTKeTuBtjrhD4y/OsrJVW9z74ihfGLjRxXfh8aKapruUx0CNyiFGzeCNM9Cy1MeA+nFa5xodUDd7g8ZZrnG+4/s8N84UfDzlzR+2v2mhg/a8Os5R5hYVLyP22Dzn2Qye2eVPtV2VQoCnKwShHlrIA3sUipRKDm2HaZZ8Rv0g7tzsqec2vN99CKXpe60kq5zNaeK26UIdRar3YBqqlM1j2rE4VmjWyauztKOvCgwRZpM0ymlgxetmH/tPng4heL85CIvdOhCrnu+8pRVg==,iv:4LpN7y5Q6uwrt6dS5Pst/gWIPzBICyLyOc/cD9yAGMQ=,tag:3DXppR87QE7E7LqCkxfYdg==,type:str] sops: age: - enc: | @@ -127,8 +124,8 @@ sops: w2ToACYVigKMSlqPNG9bKcK75XI/iAONG48DQm1Nse3yB9/q3jwd+Q== -----END AGE ENCRYPTED FILE----- recipient: age1yl52c6aemw9anmfuqayamvsnkvlu6fmy0kk3gzvrraexxd9pr90qvs8pe5 - lastmodified: "2026-07-07T23:28:17Z" - mac: ENC[AES256_GCM,data:3IvBXFR9Ung2qTfk8GiEM6kXSm1vaNvmX+yrr0KyyBkEW2yCSqOh9JtE5XGaumWFwSxZvlDWOar/VJAqA6aMr6xNXUpGlcIKJ6YPsZwuD+g+MnNbH+NcqOAUUe/HfRs0QAtSh+XyQDW/Wl35LKS7NiubitmaJM0HlH8zfX35MK4=,iv:4UoRnZht2c5FGi8PT4W/xa6M5A0HMVvt3c0IlirYuOQ=,tag:YRqVheCSB4uJCs0Cu8U7PA==,type:str] + lastmodified: "2026-07-10T14:43:34Z" + mac: ENC[AES256_GCM,data:pH1EMsRMuLC0jS8aS5dY0vpO/m7kuzqqnRJunMfzcW63/qx6x86CFkuOEqpKCKH+qrzXCFAAPH39o05jbEHNLvq/561juEDOct54hHNSLa8DpbNyynGoURxgc0fZ2q+qAJbnsn087lTbCvu2cA6u63Eo3DVQ7LVAvf09+3p3Z4s=,iv:dMJpcsbqvOqBYggn4DICjXf0+DV5ZJi/VGB7T3oAzTo=,tag:fi4PiadB6LI2Wflf1yeFbQ==,type:str] pgp: - created_at: "2026-06-02T01:50:38Z" enc: |-