My Nix Configuration

Compare changes

Choose any two refs to compare.

Changed files
+649 -175
devShells
default
homeModules
profiles
hosts
lib
nixosModules
default-config
homes
pyrox
thehedgehog
services
forgejo-runner
packages
anubis-files
src
policies
bgutil-pot-server
glide-browser-bin
planka
-2
TODO.md
···
- [ ] Move all Docker containers to using native versions of databases, redis, etc.
- Ensures higher performance and reduces the number of running containers.
- https://github.com/felschr/nixos-config/blob/main/services/immich.nix for an example of how to do it
-
- [ ] Add Archivebox service(needs custom module)
-
- [ ] Add Immich service
## Zaphod
···
- [ ] Move all Docker containers to using native versions of databases, redis, etc.
- Ensures higher performance and reduces the number of running containers.
- https://github.com/felschr/nixos-config/blob/main/services/immich.nix for an example of how to do it
## Zaphod
+7 -3
devShells/default/default.nix
···
}:
pkgs.mkShellNoCC {
packages = [
pkgs.deadnix
pkgs.just
pkgs.nil
pkgs.nix-tree
pkgs.nixd
-
pkgs.nix-output-monitor
pkgs.nixfmt-rfc-style
-
pkgs.statix
pkgs.nvd
-
pkgs.nixos-rebuild-ng
];
}
···
}:
pkgs.mkShellNoCC {
packages = [
+
# keep-sorted start
pkgs.deadnix
pkgs.just
pkgs.nil
+
pkgs.nix-output-monitor
pkgs.nix-tree
+
pkgs.nix-update
pkgs.nixd
pkgs.nixfmt-rfc-style
+
pkgs.nixos-rebuild-ng
pkgs.nvd
+
pkgs.statix
+
pkgs.tokei
+
# keep-sorted endd
];
}
+38 -38
flake.lock
···
]
},
"locked": {
-
"lastModified": 1764132349,
-
"narHash": "sha256-nXYDlrLaqEmb7JJ1aAt1cC97EyMFNNtJ4i1Ma/WsQX8=",
"owner": "caelestia-dots",
"repo": "shell",
-
"rev": "24b313497f22f837577371675c145ba9b51d7ee5",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1763517499,
-
"narHash": "sha256-N5y55DwDNT+0kLFck2sy1+DcnLOZ/N05UEvZ2R5pmWo=",
"owner": "caelestia-dots",
"repo": "cli",
-
"rev": "1cfd405eaa74e66f33e7790c5c6586676f03a395",
"type": "github"
},
"original": {
···
"nixpkgs": "nixpkgs"
},
"locked": {
-
"lastModified": 1764250936,
-
"narHash": "sha256-fwwd6/j9QsL++TiNHZy2258NDkJiTi9B5cUyOntlR2g=",
"owner": "catppuccin",
"repo": "nix",
-
"rev": "c11bfcf5671358a12fa2d906e7c859d0644d9b2d",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1764299593,
-
"narHash": "sha256-LhzVs1rGbtT2ia+Nh1BNNGB09h3WQwtAQEuYjhKCsxI=",
"owner": "AvengeMedia",
"repo": "DankMaterialShell",
-
"rev": "966021bfd4fdbf45893994cb38352a526fb1cca7",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1764119541,
-
"narHash": "sha256-WmrejR45x4oFf3g3kJFi3jPhoQ9h8oaAGiIAb8ulZcw=",
"owner": "pyrox0",
"repo": "dn43.nix",
-
"rev": "afdab3ea9e7ef9c4472143e63941cd7bdd5d1c77",
"type": "github"
},
"original": {
···
},
"hardware": {
"locked": {
-
"lastModified": 1764269296,
-
"narHash": "sha256-lXAKymcMNIvuw3WLHBhdNWUs1bXl/BYWBtYNhhK+D1s=",
"owner": "nixos",
"repo": "nixos-hardware",
-
"rev": "00e9525fb65da500852aae7bef666071eedf1b3e",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1764194569,
-
"narHash": "sha256-iUM9ktarEzThkayyZrzQ7oycPshAY2XRQqVKz0xX/L0=",
"owner": "nix-community",
"repo": "home-manager",
-
"rev": "9651819d75f6c7ffaf8a9227490ac704f29659f0",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1763870992,
-
"narHash": "sha256-NPyc76Wxmv/vAsXJ8F+/8fXECHYcv2YGSqdiSHp/F/A=",
"owner": "Mic92",
"repo": "nix-index-database",
-
"rev": "d7423982c7a26586aa237d130b14c8b302c7a367",
"type": "github"
},
"original": {
···
},
"nixpkgs": {
"locked": {
-
"lastModified": 1763421233,
-
"narHash": "sha256-Stk9ZYRkGrnnpyJ4eqt9eQtdFWRRIvMxpNRf4sIegnw=",
"owner": "NixOS",
"repo": "nixpkgs",
-
"rev": "89c2b2330e733d6cdb5eae7b899326930c2c0648",
"type": "github"
},
"original": {
···
},
"nixpkgs_2": {
"locked": {
-
"lastModified": 1764230294,
-
"narHash": "sha256-LGU93g01gClmIpYL0xR0fJ5rs5it7ttjjcB+xKaMcH4=",
-
"rev": "0d59e0290eefe0f12512043842d7096c4070f30e",
"type": "tarball",
-
"url": "https://releases.nixos.org/nixpkgs/nixpkgs-26.05pre903204.0d59e0290eef/nixexprs.tar.xz"
},
"original": {
"type": "tarball",
···
]
},
"locked": {
-
"lastModified": 1764045583,
-
"narHash": "sha256-W24ReyRrhOKTKIsuAMkY5hnVlCufGoONM79sjUoyQkk=",
"owner": "quickshell-mirror",
"repo": "quickshell",
-
"rev": "e9bad67619ee9937a1bbecfc6ad3b4231d2ecdc3",
"type": "github"
},
"original": {
···
"sqlite-lib-src": "sqlite-lib-src"
},
"locked": {
-
"lastModified": 1764005195,
-
"narHash": "sha256-PzuWiW/nMxwQTX0i1bHwGazQF4ptLNI9OGwpmhDb9i0=",
"ref": "refs/heads/master",
-
"rev": "7358ec6edfa4d17b8b8f543d99e83a4705901148",
-
"revCount": 1687,
"type": "git",
"url": "https://tangled.org/@tangled.org/core"
},
···
]
},
"locked": {
+
"lastModified": 1764466211,
+
"narHash": "sha256-rBK+usqfAP9ZuEthw9wMCwTKQgKUMmziuzrrkpDZdzY=",
"owner": "caelestia-dots",
"repo": "shell",
+
"rev": "40813e520582c5df11f6d4c870a31900fe171cce",
"type": "github"
},
"original": {
···
]
},
"locked": {
+
"lastModified": 1764381410,
+
"narHash": "sha256-WR/oQQjveFqQxo8oHngZuOVgBQINDgPe+lCXLeNhAAg=",
"owner": "caelestia-dots",
"repo": "cli",
+
"rev": "ed12d4cb82600872a82feb577711be1148c7af35",
"type": "github"
},
"original": {
···
"nixpkgs": "nixpkgs"
},
"locked": {
+
"lastModified": 1764325801,
+
"narHash": "sha256-LQ7tsrXs1wuB6KBwUctL3JlUsG/FWI2pCI6NkoO52dk=",
"owner": "catppuccin",
"repo": "nix",
+
"rev": "a696fed6b9b6aa89ef495842cdca3fc2a7cef0de",
"type": "github"
},
"original": {
···
]
},
"locked": {
+
"lastModified": 1764553800,
+
"narHash": "sha256-kHlx3E3K2UNWI1Hpbyl5zieoOVevZfwz8P/OcyViDHY=",
"owner": "AvengeMedia",
"repo": "DankMaterialShell",
+
"rev": "7959a795753d9f646cfb9e21cfb778adf7e5c933",
"type": "github"
},
"original": {
···
]
},
"locked": {
+
"lastModified": 1764646680,
+
"narHash": "sha256-HEVzGL23bev8CuZXbLgDZRWy+mD/qPZhRBpjag7G/dU=",
"owner": "pyrox0",
"repo": "dn43.nix",
+
"rev": "c8b68602cf1ef696e6a9f9c25e8c177d4101331b",
"type": "github"
},
"original": {
···
},
"hardware": {
"locked": {
+
"lastModified": 1764440730,
+
"narHash": "sha256-ZlJTNLUKQRANlLDomuRWLBCH5792x+6XUJ4YdFRjtO4=",
"owner": "nixos",
"repo": "nixos-hardware",
+
"rev": "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3",
"type": "github"
},
"original": {
···
]
},
"locked": {
+
"lastModified": 1764544324,
+
"narHash": "sha256-GVBGjO7UsmzLrlOJV8NlKSxukHaHencrJqWkCA6FkqI=",
"owner": "nix-community",
"repo": "home-manager",
+
"rev": "e4e25a8c310fa45f2a8339c7972dc43d2845a612",
"type": "github"
},
"original": {
···
]
},
"locked": {
+
"lastModified": 1764475780,
+
"narHash": "sha256-77jL5H5x51ksLiOUDjY0ZK8e2T4ZXLhj3ap8ETvknWI=",
"owner": "Mic92",
"repo": "nix-index-database",
+
"rev": "5a3ff8c1a09003f399f43d5742d893c0b1ab8af0",
"type": "github"
},
"original": {
···
},
"nixpkgs": {
"locked": {
+
"lastModified": 1763966396,
+
"narHash": "sha256-6eeL1YPcY1MV3DDStIDIdy/zZCDKgHdkCmsrLJFiZf0=",
"owner": "NixOS",
"repo": "nixpkgs",
+
"rev": "5ae3b07d8d6527c42f17c876e404993199144b6a",
"type": "github"
},
"original": {
···
},
"nixpkgs_2": {
"locked": {
+
"lastModified": 1764527385,
+
"narHash": "sha256-gpwyCnyi2or0InBXe+4I9YeED3Uly3EGH58qvVnchBY=",
+
"rev": "23258e03aaa49b3a68597e3e50eb0cbce7e42e9d",
"type": "tarball",
+
"url": "https://releases.nixos.org/nixpkgs/nixpkgs-26.05pre904683.23258e03aaa4/nixexprs.tar.xz"
},
"original": {
"type": "tarball",
···
]
},
"locked": {
+
"lastModified": 1764482797,
+
"narHash": "sha256-ynV90KoBrPe38YFlKAHtPFk4Ee3IANUsIFGxRaq7H/s=",
"owner": "quickshell-mirror",
"repo": "quickshell",
+
"rev": "d24e8e9736287d01ee73ef9d573d2bc316a62d5c",
"type": "github"
},
"original": {
···
"sqlite-lib-src": "sqlite-lib-src"
},
"locked": {
+
"lastModified": 1764494836,
+
"narHash": "sha256-u1i7aMo0fTQ6WVdOZhG2fo/gEx2Fq8+3URmuqEBZGWI=",
"ref": "refs/heads/master",
+
"rev": "d37f774fb8c60aa2bd0cb965c9884457d0afb660",
+
"revCount": 1689,
"type": "git",
"url": "https://tangled.org/@tangled.org/core"
},
+1 -1
homeModules/profiles/base/default.nix
···
{
options.py.profiles.base.enable = lib.mkEnableOption "Base Home Profile";
config = lib.mkIf cfg.enable {
-
home.stateVersion = "25.11";
home.language = {
base = "en_US.utf8";
};
···
{
options.py.profiles.base.enable = lib.mkEnableOption "Base Home Profile";
config = lib.mkIf cfg.enable {
+
home.stateVersion = "26.05";
home.language = {
base = "en_US.utf8";
};
+1
hosts/marvin/default.nix
···
./services/git.nix
./services/golink.nix
./services/grafana.nix
./services/jellyfin.nix
./services/matrix.nix
./services/miniflux.nix
···
./services/git.nix
./services/golink.nix
./services/grafana.nix
+
./services/immich.nix
./services/jellyfin.nix
./services/matrix.nix
./services/miniflux.nix
+5 -5
hosts/marvin/services/git.nix
···
};
settings = {
DEFAULT = {
-
APP_NAME = "PyroNet Git";
RUN_MODE = "prod";
};
attachment = {
MAX_SIZE = 200;
};
-
log."logger.router.MODE" = "";
mailer = {
ENABLED = true;
-
FROM = "PyroNet Git <git@pyrox.dev>";
PROTOCOL = "smtps";
SMTP_ADDR = "mail.pyrox.dev";
SMTP_PORT = 465;
···
};
"ui.meta" = {
AUTHOR = "dish";
-
DESCRIPTION = "PyroNet Git Services";
};
metrics = {
ENABLED = true;
···
ISSUE_INDEXER_PATH = "indexers/issues.bleve";
# Enable repo indexing
REPO_INDEXER_ENABLED = true;
-
REPO_INDEXER_REPO_TYPES = "sources,forks,templates,mirrors";
REPO_INDEXER_TYPE = "bleve";
REPO_INDEXER_PATH = "indexers/repos.bleve";
};
···
};
settings = {
DEFAULT = {
+
APP_NAME = "dishNet Git";
RUN_MODE = "prod";
};
attachment = {
MAX_SIZE = 200;
};
+
log.LOGGER_ROUTER_MODE = "";
mailer = {
ENABLED = true;
+
FROM = "dishNet Git <git@pyrox.dev>";
PROTOCOL = "smtps";
SMTP_ADDR = "mail.pyrox.dev";
SMTP_PORT = 465;
···
};
"ui.meta" = {
AUTHOR = "dish";
+
DESCRIPTION = "dishNet Git Services";
};
metrics = {
ENABLED = true;
···
ISSUE_INDEXER_PATH = "indexers/issues.bleve";
# Enable repo indexing
REPO_INDEXER_ENABLED = true;
+
REPO_INDEXER_REPO_TYPES = "sources,forks";
REPO_INDEXER_TYPE = "bleve";
REPO_INDEXER_PATH = "indexers/repos.bleve";
};
+3 -3
hosts/marvin/services/grafana.nix
···
};
smtp = {
enabled = true;
-
user = "grafana@thehedgehog.me";
-
from_address = "grafana@thehedgehog.me";
-
host = "smtp.migadu.com:465";
password = "$__file{${config.age.secrets.grafana-smtp-password.path}}";
};
};
···
};
smtp = {
enabled = true;
+
user = "grafana@pyrox.dev";
+
from_address = "grafana@pyrox.dev";
+
host = "mail.pyrox.dev:465";
password = "$__file{${config.age.secrets.grafana-smtp-password.path}}";
};
};
+223
hosts/marvin/services/immich-config.json
···
···
+
{
+
"backup": {
+
"database": {
+
"cronExpression": "0 02 * * *",
+
"enabled": true,
+
"keepLastAmount": 14
+
}
+
},
+
"ffmpeg": {
+
"accel": "vaapi",
+
"accelDecode": true,
+
"acceptedAudioCodecs": ["aac", "mp3", "libopus"],
+
"acceptedContainers": ["mov", "ogg", "webm"],
+
"acceptedVideoCodecs": ["h264"],
+
"bframes": -1,
+
"cqMode": "auto",
+
"crf": 23,
+
"gopSize": 0,
+
"maxBitrate": "0",
+
"preferredHwDevice": "auto",
+
"preset": "veryfast",
+
"refs": 0,
+
"targetAudioCodec": "aac",
+
"targetResolution": "720",
+
"targetVideoCodec": "h264",
+
"temporalAQ": false,
+
"threads": 0,
+
"tonemap": "hable",
+
"transcode": "required",
+
"twoPass": false
+
},
+
"image": {
+
"colorspace": "p3",
+
"extractEmbedded": false,
+
"fullsize": {
+
"enabled": false,
+
"format": "jpeg",
+
"quality": 80
+
},
+
"preview": {
+
"format": "jpeg",
+
"quality": 80,
+
"size": 1440
+
},
+
"thumbnail": {
+
"format": "webp",
+
"quality": 80,
+
"size": 250
+
}
+
},
+
"job": {
+
"backgroundTask": {
+
"concurrency": 5
+
},
+
"faceDetection": {
+
"concurrency": 2
+
},
+
"library": {
+
"concurrency": 5
+
},
+
"metadataExtraction": {
+
"concurrency": 5
+
},
+
"migration": {
+
"concurrency": 5
+
},
+
"notifications": {
+
"concurrency": 5
+
},
+
"ocr": {
+
"concurrency": 1
+
},
+
"search": {
+
"concurrency": 5
+
},
+
"sidecar": {
+
"concurrency": 5
+
},
+
"smartSearch": {
+
"concurrency": 2
+
},
+
"thumbnailGeneration": {
+
"concurrency": 3
+
},
+
"videoConversion": {
+
"concurrency": 1
+
},
+
"workflow": {
+
"concurrency": 5
+
}
+
},
+
"library": {
+
"scan": {
+
"cronExpression": "0 0 * * *",
+
"enabled": true
+
},
+
"watch": {
+
"enabled": false
+
}
+
},
+
"logging": {
+
"enabled": true,
+
"level": "log"
+
},
+
"machineLearning": {
+
"availabilityChecks": {
+
"enabled": true,
+
"interval": 30000,
+
"timeout": 2000
+
},
+
"clip": {
+
"enabled": true,
+
"modelName": "ViT-B-16-SigLIP2__webli"
+
},
+
"duplicateDetection": {
+
"enabled": true,
+
"maxDistance": 0.01
+
},
+
"enabled": true,
+
"facialRecognition": {
+
"enabled": true,
+
"maxDistance": 0.5,
+
"minFaces": 7,
+
"minScore": 0.7,
+
"modelName": "buffalo_l"
+
},
+
"ocr": {
+
"enabled": true,
+
"maxResolution": 736,
+
"minDetectionScore": 0.5,
+
"minRecognitionScore": 0.8,
+
"modelName": "EN__PP-OCRv5_mobile"
+
},
+
"urls": ["http://localhost:3003"]
+
},
+
"map": {
+
"darkStyle": "https://tiles.immich.cloud/v1/style/dark.json",
+
"enabled": true,
+
"lightStyle": "https://tiles.immich.cloud/v1/style/light.json"
+
},
+
"metadata": {
+
"faces": {
+
"import": false
+
}
+
},
+
"newVersionCheck": {
+
"enabled": false
+
},
+
"nightlyTasks": {
+
"clusterNewFaces": true,
+
"databaseCleanup": true,
+
"generateMemories": true,
+
"missingThumbnails": true,
+
"startTime": "00:00",
+
"syncQuotaUsage": true
+
},
+
"notifications": {
+
"smtp": {
+
"enabled": true,
+
"from": "dishNet Photos <immich@pyrox.dev>",
+
"replyTo": "",
+
"transport": {
+
"host": "mail.pyrox.dev",
+
"ignoreCert": false,
+
"port": 25,
+
"secure": true,
+
"username": "immich@pyrox.dev"
+
}
+
}
+
},
+
"oauth": {
+
"autoLaunch": false,
+
"autoRegister": true,
+
"buttonText": "Login with Pocket-ID",
+
"clientId": "f1312240-d9fc-4336-aca6-b98316867848",
+
"defaultStorageQuota": null,
+
"enabled": true,
+
"issuerUrl": "https://auth.pyrox.dev",
+
"mobileOverrideEnabled": false,
+
"mobileRedirectUri": "",
+
"profileSigningAlgorithm": "none",
+
"roleClaim": "immich_role",
+
"scope": "openid email profile immich_role",
+
"signingAlgorithm": "RS256",
+
"storageLabelClaim": "preferred_username",
+
"storageQuotaClaim": "immich_quota",
+
"timeout": 30000,
+
"tokenEndpointAuthMethod": "client_secret_post"
+
},
+
"passwordLogin": {
+
"enabled": true
+
},
+
"reverseGeocoding": {
+
"enabled": true
+
},
+
"server": {
+
"externalDomain": "https://img.pyrox.dev",
+
"loginPageMessage": "",
+
"publicUsers": true
+
},
+
"storageTemplate": {
+
"enabled": false,
+
"hashVerificationEnabled": true,
+
"template": "{{y}}/{{y}}-{{MM}}-{{dd}}/{{filename}}"
+
},
+
"templates": {
+
"email": {
+
"albumInviteTemplate": "",
+
"albumUpdateTemplate": "",
+
"welcomeTemplate": ""
+
}
+
},
+
"theme": {
+
"customCss": ""
+
},
+
"trash": {
+
"days": 30,
+
"enabled": true
+
},
+
"user": {
+
"deleteDelay": 7
+
}
+
}
+51
hosts/marvin/services/immich.nix
···
···
+
{
+
self,
+
config,
+
lib,
+
...
+
}:
+
let
+
d = self.lib.data.services.immich;
+
in
+
{
+
services = {
+
immich = {
+
inherit (d) port;
+
enable = true;
+
host = "0.0.0.0";
+
redis.enable = true;
+
mediaLocation = "/var/media/photos/";
+
accelerationDevices = [ "/dev/dri/renderD128" ];
+
settings = lib.recursiveUpdate (builtins.fromJSON (builtins.readFile ./immich-config.json)) {
+
oauth.clientSecret._secret = config.age.secrets.immich-oauth-secret.path;
+
notifications.smtp.transport.password._secret = config.age.secrets.immich-mail-pw.path;
+
server.externalDomain = "https://${d.extUrl}";
+
};
+
};
+
immich-public-proxy = {
+
enable = true;
+
port = d.pubProxy;
+
immichUrl = "http://localhost:${toString d.port}";
+
settings.ipp = {
+
downloadedFilename = 1;
+
};
+
};
+
};
+
systemd.services.immich-public-proxy.environment.PUBLIC_BASE_URL = "https://${d.extUrl}";
+
users.users.immich.extraGroups = [
+
"video"
+
"render"
+
];
+
age.secrets = {
+
immich-oauth-secret = {
+
file = ./secrets/immich/oauth-secret.age;
+
owner = "immich";
+
group = "immich";
+
};
+
immich-mail-pw = {
+
file = ./secrets/immich/mail-pw.age;
+
owner = "immich";
+
group = "immich";
+
};
+
};
+
}
+97 -32
hosts/marvin/services/planka.nix
···
{
config,
self,
...
}:
let
-
dataDir = "/var/lib/planka";
d = self.lib.data.services.planka;
in
{
-
virtualisation.oci-containers.containers = {
-
planka-server = {
-
image = "ghcr.io/plankanban/planka:2.0.0-rc.4";
-
ports = [ "${toString d.port}:1337" ];
-
environment = {
-
BASE_URL = "https://${d.extUrl}";
-
DATABASE_URL = "postgresql://planka@planka-db/planka";
-
# Default Admin
-
DEFAULT_ADMIN_EMAIL = "pyrox@pyrox.dev";
-
DEFAULT_ADMIN_USERNAME = "pyrox";
-
TRUST_PROXY = "true";
-
DEFAULT_LANGUAGE = "en-US";
};
-
environmentFiles = [ config.age.secrets.planka-env.path ];
-
volumes = [
-
"${dataDir}/user-avatars:/app/public/user-avatars"
-
"${dataDir}/project-background-images:/app/public/project-background-images"
-
"${dataDir}/attachments:/app/private/attachments"
-
"${dataDir}/favicons:/app/public/favicons"
-
"${dataDir}/background-images:/app/public/background-images"
-
];
-
extraOptions = [ "--network=planka" ];
};
-
planka-db = {
-
image = "postgres:16-alpine";
-
volumes = [ "${dataDir}/db:/var/lib/postgresql/data" ];
-
environment = {
-
POSTGRES_USER = "planka";
-
POSTGRES_DB = "planka";
-
POSTGRES_HOST_AUTH_METHOD = "trust";
};
-
extraOptions = [ "--network=planka" ];
};
};
age.secrets.planka-env = {
file = ./secrets/planka-env.age;
-
owner = "thehedgehog";
-
group = "misc";
};
services.anubis.instances.planka = {
settings = {
···
{
+
lib,
config,
self,
+
self',
+
pkgs,
...
}:
let
d = self.lib.data.services.planka;
+
+
commonServiceConfig = {
+
EnvironmentFile = config.age.secrets.planka-env.path;
+
StateDirectory = "planka";
+
WorkingDirectory = "/var/lib/planka";
+
User = "planka";
+
Group = "planka";
+
+
# Hardening
+
LockPersonality = true;
+
NoNewPrivileges = true;
+
PrivateDevices = true;
+
PrivateMounts = true;
+
PrivateTmp = true;
+
PrivateUsers = true;
+
ProtectClock = true;
+
ProtectControlGroups = true;
+
ProtectHome = true;
+
ProtectHostname = true;
+
ProtectKernelLogs = true;
+
ProtectKernelModules = true;
+
ProtectKernelTunables = true;
+
ProtectProc = "invisible";
+
RemoveIPC = true;
+
RestrictRealtime = true;
+
RestrictSUIDSGID = true;
+
UMask = "0660";
+
RestrictAddressFamilies = [
+
"AF_UNIX"
+
"AF_INET"
+
"AF_INET6"
+
];
+
};
in
{
+
systemd = {
+
tmpfiles.settings = {
+
"10-planka"."/var/lib/planka".d = {
+
group = "planka";
+
user = "planka";
+
mode = "0755";
};
};
+
services = {
+
planka-init-db = {
+
wantedBy = [ "multi-user.target" ];
+
after = [ "postgres.target" ];
+
description = "Planka Kanban Database Init Script";
+
path = [
+
pkgs.nodejs
+
];
+
script = ''
+
if [ ! -f /var/lib/planka/db-init-ran ]; then
+
node run ${self'.packages.planka}/lib/node_modules/planka/db/init.js && \
+
touch /var/lib/planka/db-init-ran
+
fi
+
'';
+
serviceConfig = commonServiceConfig // {
+
Type = "oneshot";
+
SyslogIdentifier = "planka-init-db";
+
};
};
+
planka-server = {
+
after = [ "planka-init-db.service" ];
+
wantedBy = [ "multi-user.target" ];
+
description = "Planka Kanban Server";
+
documentation = [ "https://docs.planka.cloud" ];
+
environment = {
+
DATABASE_URL = "postgresql://%2Frun%2Fpostgresql/planka";
+
DEFAULT_ADMIN_EMAIL = "pyrox@pyrox.dev";
+
DEFAULT_ADMIN_USERNAME = "pyrox";
+
TRUST_PROXY = "true";
+
DEFAULT_LANGUAGE = "en-US";
+
BASE_URL = "https://${d.extUrl}";
+
NODE_ENV = "production";
+
};
+
serviceConfig = commonServiceConfig // {
+
Type = "simple";
+
ExecStart = "${lib.getExe self'.packages.planka} --port ${toString d.port}";
+
SyslogIdentifier = "planka";
+
};
+
};
};
};
+
users.users.planka = {
+
isSystemUser = true;
+
group = "planka";
+
};
+
users.groups.planka = { };
+
services.postgresql = {
+
ensureUsers = [
+
{
+
name = "planka";
+
ensureDBOwnership = true;
+
ensureClauses.login = true;
+
}
+
];
+
ensureDatabases = [ "planka" ];
+
};
age.secrets.planka-env = {
file = ./secrets/planka-env.age;
+
owner = "planka";
+
group = "planka";
};
services.anubis.instances.planka = {
settings = {
-23
hosts/marvin/services/secrets/iceshrimp-db-password.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 iqBxIA g+DkjSGDd+i/sdqRCuU2I2Qzmq4Q+FI7wSyfkdM9q0Q
-
cG52xAS/VPjCNgHdky0/jbMvF5tF+cB8BxFNCHYlf2s
-
-> ssh-rsa fFaiTA
-
r5mQer6QBi+HdSS16OLHfv/oh0hbug5drdX/BuQHMORogiDfHEM03K6pmg9064Ep
-
CJgl6z3IS9hlLX7cSq2kVSvP9gk+l5AmI+pMZkJyT9ED43g6wtRI7yiy1ALO0rqB
-
z/CPaoLkFNFlt7sDg5rijAB+t6DNAxULfFj8KR3b+NvGrrW6Vbaio+T5mg1A2PTd
-
60eEfuqdn9dHVI82FQFmai1LwoyButrUNn3UiP8aIdvFUueixcqsAXSK1zjPJZ5B
-
VeAkshwhB9+HKMH1cyRa6LUbzJYxAQBhkgTFqS/r64h3ZAYHTc0lY44VtVhbnEQI
-
76PBEOcQXXjvPR6yvbcVZfpqCkqfo9hb7wogPfJiRMjKM/qlpR19KOf21T0hsV6q
-
b7nYf01yBscx6GKXREkZoxgpo6iLLzVQqU5SzQgs7nxW089JdJ62WoZvJwTxv2G8
-
AdzImnsw73q55MgOYtv/A3hGM8O1Jw4Q4UfMSS43xB+cuvtlEmSqi5mFh0gPbqQR
-
LN8+OcDLz0SR8U6xHj9ufXfhHc4nwO8iZpzav5nZXMEb3Gmva3k8U+nnmuPKqsrL
-
VxFmGNxqmWPfxO0FJC/cxLKME/Lj2MU9r6KT8RQ00BjHUfoDgbFzHVLqIEbIE+Vr
-
/Glcmz/Ecrt3kTwfAhEDpj6g0XVNHt7HA+r4SDWjI00
-
-> ssh-ed25519 wpmdHA LUF/UncaQTEMQepVAhEqFm345dICeW3d3QGhiflTSH8
-
ImxpR4innOw1jMSF4gvmOGRDl0BzqAhOyz+GFstsJG4
-
-> Cg-grease k7q9
-
MLRf60C4nbEc9XHo26cg7UYySbZtOMP2kZtZmvLiS1XFeIqQaR0RgRcUOoTblYzo
-
KQ
-
--- PV6HHY8kDdpFcgNu83K/cwz4qQCW38jcHkTOkCunxrk
-
�*ǜ�lq��^��fʀ���l�� R��C}Մ�ɧ���F�ĩ�&�~h�
-
̟�r��6ʞac,����lc� >
···
hosts/marvin/services/secrets/iceshrimp-secret-config.age

This is a binary file and will not be displayed.

+19
hosts/marvin/services/secrets/immich/mail-pw.age
···
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA 3PVJMF6BgxuDxN9NAEYqcZaYEUhK9TB5XprRyW13Kx0
+
AIQQG+4/9SVPcfq9ZtL/JsWDmLvW03UiAJaJ1nHSckQ
+
-> ssh-rsa fFaiTA
+
ZPBI1w2a48Md+Rt92ssVcfxN26zTLCEalT+jG8SJBv07ouOzd4ibPq65m6uOQU/+
+
EEgHe23fGsPP4oISWDUgVFxesLA3wjsTWmbVrkrBzGQNeNnevIRMcJu7vWDtby/+
+
dVxPQIoXH0jPlcDQCm2lwOGD+du+Nb4PnVseRPDaXRypKKmx+J057FQemYBk4OWx
+
yUfbKV2gHHcuRTVUQG6XAQwWvhh4e25fyc+MzKZNPUK4c/SVibjAsUH+Edd+NaV5
+
yxku5k4TFZkU69sl2zCdgWfYVTowTGYGyf4Kf+I/kl9m13zIk9vRpocgt4APaJnv
+
p+KxJvbYRiprWl+IzZg6TwXY5mA1IbvlppR4aak1pwaIE76CgF5mGNDGkviGndtP
+
+eCMIocp6lk2U0dJEYkBtmjNbxFh3dxOcirgdNDypYPlZTSGvSRGhpL4nUJRsR+l
+
A7rJ5aHH2B4Vi93zgSV0PWiWSA7899bzgN1kQKKIgYln6Tl8UxQSNt5L3L4VajuW
+
3UqCltyGWt/926BMS+GrDZSWCEtVsDs5XQqDKEx6D+iviHZJXniI+RhH/eM7FLjp
+
iXgCRkBIALo2lOiScpr2rtfGDViq3Nh64cIslEPiewjVFTCxkxH+LuQ1stukrNki
+
IF0+pZ65rgatMAdnZRFXfRxmywKD99z4WRHAxvYloXc
+
-> ssh-ed25519 wpmdHA SQlzD3yqbnoF0JHqPFFDUugbm8jlBsdntLzF/WlJbjo
+
FggpB1k5xbq62QNlwkocwjiWhEqNjHAxR/GwoPhXbC8
+
--- 1g4f2OQbS5iXm/cqBamEWuapvZHorxfX7wHizfPcYsc
+
�z�92�LN=9���$O���fP���E���~�.��}7�eڰq��y�N�I�L����"%�V�lz'�أ�
+19
hosts/marvin/services/secrets/immich/oauth-secret.age
···
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA 4osfKV5/wFT7mCdc4TjP7pJHdD8wzV7VKKiBSGRqImk
+
wU6RSxJh8SBbXbiwCl4lXD/m1THoAg5n1Y7pyKFPiec
+
-> ssh-rsa fFaiTA
+
RTHaBLsBWbDEmY80LktVL/C6CeFinLm3/4t/hoWmbzLLoElBL86EGVdrE5ovjUYl
+
j5+ZacmqahwjCtF/ZGBt8MFkWOK9u90YDfLp+kb2ILVy/E+CcQ3xPpH9bf83pPl/
+
aZmttaRlhnhSDYVXB0lHx3u/cCrYhTf6TjEoVGZ/XrLW0BRmO6GSwcmTrachZzdJ
+
je+pf2ug//mnAJR0y4MxjGlNPD/Vaj/UiaFQjPT+7ZvUUSkbv/QpPqyhhosFA11e
+
1EGp21ppwUnJSNdYh2vulpQGurB5bPlv6Y8FpcFKivq/qKmA4ydyER3NcCca5Ly+
+
01jQ1HRqWylYJj7K4hnxSjnNlOXCrJATuPJYoNdt2U1DnolUAqL6JIP/qNmYx8Fb
+
ZrfFINBmPsNc9XJn14T4J+VB6e68ODBOvZdbzoBQOWAObnP5OH+zLYCB3II+aLPp
+
Zo5WsNBBdZih4EbO0Y9PNWBjyCzxqs7zXPg1PjjDVHN/tIpSGnqoCqCPGuePhgRV
+
h1gnP/lqOW2U1oL004hi3etsUsk3kXHjr35GXMVBeay+3uGXkZqhNYYSluQnJSrs
+
rzahZZ8/q0FDdlUixWHb2uQjL1XMTqUcw8wPsUak8shkx8s7GPKNxtEKFcK46jk4
+
ac9TCyee4HzPC/SWkLGFl0bt9s9lGTBSNQrVzogY/sg
+
-> ssh-ed25519 wpmdHA C6npqn5aqimGJlo+UlvYOoqXSu/hW1JVNAmBPP1Vvjk
+
gWzXqL92jI83iqSr3dydJo+UAz5OGBo6kw6QC4KRWgM
+
--- ltHFDmeAbJsQtyY4CKFEz8OGAkPkue/8upHNOOQgn5I
+
��O�ӌ#&`���P�IZ�#�[��+�tdeG�ui�����?n"��(��b� ]s� y줔���
-20
hosts/marvin/services/secrets/pingvin-secrets.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 iqBxIA HdZwcvp9cLpqrUp0M7sK7ipTslMxK0EYqFfS8xtYeDk
-
Ud7ismLtRG4RlugV3P5wRNjRe8HcJW0rAz/adadWCNc
-
-> ssh-rsa fFaiTA
-
KwjETLhUBpq8Hfp41rg3++syweOB+yNIIdd0KeS2YjxjbDfgwzRVoM+wlB/C3b4X
-
W0561y9+wsnB5A6k/peXLASfVodw30vI9LdW+nHejQr9v/UooXPztoJNrfgaKUow
-
PsLbLUj+M8Y4i22GRKrY6rrCfJk8F4a+2b0PzDc1EqUcZOjMV7aE+fQ4U7+FD1jv
-
xGmrKNRXNUL1j5GpPAi7E7YXuGj2SxjZOiisKqyep5KTEFyIJ04lrN/rtbi2vkEJ
-
ejAFg2jIvxAWiEzEUbjOLFzeIdpb8pPqQJ3OUF4U0crT/r5dxmJKxB0J7ktS6eEY
-
NZ4/CtY/kLXjo9sWc6G2UtWAm+myXKsxETxFtp/RQ6LXMjS+3xbzGvkAoY/fzVMt
-
zLGdOV0X/paLb1jGl9CHkflq7qrpkdgqc6I5nmsOCRLHrsiVWLaCVCvu2T1fpjCh
-
tP+Mwdjv5ONXduoGUOxjCT8IVv7ceTt93S/9cZakpDIFJ38I1XymrjuFLfbhLMVK
-
VMfo9cLhWyz2/DAKA4gKnmagUhnYO2vdNBzzM9dg0/ysrLoX71ujEcxB0tx21pkE
-
eB3LEfFH94Izzn9crNJ1YMUFCpFayedN2uQjv89LN2oHx+mUKemXCdl+AV2sLP7P
-
pi4/UDjKOcIeK8cSvqJtsemjUn7QJdOamH4/IpgFh5o
-
-> ssh-ed25519 wpmdHA X+4vtGSjMeIuSearcEfYA8Mv5kmghhItcE1n5BPWLSo
-
uYkj1VkPXs8mJu99J4GFth6LyqhWymEH5fsN0+5TDsw
-
--- Ql8rRuZH0kS1eDQ9EYB7mW+GvcHtjXcW/Wu1ZGhjpKI
-
虌d0dj̭�ھ�f����� g�D�+�q��W��d������%5��1�?�U��)�tܫ��[
-
S�DV�+��U�".� q�i�,g{}#y�@���3O/M~��CЎBV�š� }�=����*#�7�?Q��
···
+2 -3
hosts/marvin/services/secrets/secrets.nix
···
"golink-authkey.age".publicKeys = marvinDefault;
"grafana-admin-password.age".publicKeys = marvinDefault;
"grafana-smtp-password.age".publicKeys = marvinDefault;
-
"iceshrimp-secret-config.age".publicKeys = marvinDefault;
-
"iceshrimp-db-password.age".publicKeys = marvinDefault;
"jellyfin-exporter-config.age".publicKeys = marvinDefault;
"minio-root.age".publicKeys = marvinDefault;
"miniflux-admin.age".publicKeys = marvinDefault;
"../nextcloud/nextcloud-admin-pw.age".publicKeys = marvinDefault;
"nix-serve-priv.age".publicKeys = marvinDefault;
"pinchflat-secrets.age".publicKeys = marvinDefault;
-
"pingvin-secrets.age".publicKeys = marvinDefault;
"planka-env.age".publicKeys = marvinDefault;
"pocket-id-secrets.age".publicKeys = marvinDefault;
"vaultwarden-vars.age".publicKeys = marvinDefault;
···
"golink-authkey.age".publicKeys = marvinDefault;
"grafana-admin-password.age".publicKeys = marvinDefault;
"grafana-smtp-password.age".publicKeys = marvinDefault;
+
"immich/oauth-secret.age".publicKeys = marvinDefault;
+
"immich/mail-pw.age".publicKeys = marvinDefault;
"jellyfin-exporter-config.age".publicKeys = marvinDefault;
"minio-root.age".publicKeys = marvinDefault;
"miniflux-admin.age".publicKeys = marvinDefault;
"../nextcloud/nextcloud-admin-pw.age".publicKeys = marvinDefault;
"nix-serve-priv.age".publicKeys = marvinDefault;
"pinchflat-secrets.age".publicKeys = marvinDefault;
"planka-env.age".publicKeys = marvinDefault;
"pocket-id-secrets.age".publicKeys = marvinDefault;
"vaultwarden-vars.age".publicKeys = marvinDefault;
+2 -23
hosts/marvin/services/vaultwarden.nix
···
rocketAddress = "0.0.0.0";
rocketCliColors = false;
rocketPort = d.port;
-
websocketEnabled = true;
-
ipHeader = "X-Real-IP";
reloadTemplates = false;
logTimestampFormat = "%Y-%m-%d %H:%M:%S.%3f";
# # Ratelimiting
···
# Logging
useSyslog = true;
-
logLevel = "info";
extendedLogging = true;
# Features
···
# Invitations
invitationsAllowed = true;
-
invitationOrgName = "PyroNet Vault";
invitationExpirationHours = 168;
# Database
···
# Signups
signupsAllowed = false;
signupsVerify = true;
-
signupsVerifyResendTime = 3600;
-
signupsVerifyResendLimit = 5;
signupsDomainWhitelist = "pyrox.dev";
# Passwords
···
# Mail
smtpFrom = "vault@pyrox.dev";
-
smtpFromName = "PyroNet Vault <vault@pyrox.dev>";
smtpUsername = "vault@pyrox.dev";
smtpSecurity = "force_tls";
smtpPort = 465;
···
smtpTimeout = 20;
smtpEmbedImages = true;
useSendmail = false;
-
smtpDebug = false;
-
smtpAcceptInvalidCerts = false;
-
smtpAcceptInvalidHostnames = false;
# Authentication
-
authenticatorDisableTimeDrift = false;
-
disable2faRemember = false;
incomplete2faTimeLimit = 5;
# # Email 2FA
-
emailAttemptsLimit = 3;
emailExpirationTime = 180;
emailTokenSize = 7;
requireDeviceEmail = true;
-
-
# Icons
-
disableIconDownload = false;
-
iconService = "internal";
-
iconRedirectCode = 302;
-
iconDownloadTimeout = 10;
-
iconBlacklistNonGlobalIps = true;
-
# # 30 Day TTL
-
iconCacheTtl = 30 * 24 * 60 * 60;
-
iconCacheNegttl = 30 * 24 * 60 * 60;
# Misc Settings
trashAutoDeleteDays = 14;
···
rocketAddress = "0.0.0.0";
rocketCliColors = false;
rocketPort = d.port;
reloadTemplates = false;
logTimestampFormat = "%Y-%m-%d %H:%M:%S.%3f";
# # Ratelimiting
···
# Logging
useSyslog = true;
extendedLogging = true;
# Features
···
# Invitations
invitationsAllowed = true;
+
invitationOrgName = "dishNet Vault";
invitationExpirationHours = 168;
# Database
···
# Signups
signupsAllowed = false;
signupsVerify = true;
signupsDomainWhitelist = "pyrox.dev";
# Passwords
···
# Mail
smtpFrom = "vault@pyrox.dev";
+
smtpFromName = "dishNet Vault <vault@pyrox.dev>";
smtpUsername = "vault@pyrox.dev";
smtpSecurity = "force_tls";
smtpPort = 465;
···
smtpTimeout = 20;
smtpEmbedImages = true;
useSendmail = false;
# Authentication
incomplete2faTimeLimit = 5;
# # Email 2FA
emailExpirationTime = 180;
emailTokenSize = 7;
requireDeviceEmail = true;
# Misc Settings
trashAutoDeleteDays = 14;
+4 -1
hosts/prefect/dn42/default.nix
···
v4 = [ "172.20.43.96/27" ];
v6 = [ "fd21:1500:66b0::/48" ];
};
-
# Enable StayRTR
# https://github.com/bgp/stayrtr
stayrtr.enable = true;
wg.tunnelDefaults = {
privateKeyFile = "/run/agenix/dn42-privkey";
localAddrs.v4 = cfg42.addr.v4;
···
v4 = [ "172.20.43.96/27" ];
v6 = [ "fd21:1500:66b0::/48" ];
};
# Enable StayRTR
# https://github.com/bgp/stayrtr
stayrtr.enable = true;
+
# Peer with GRC
+
# https://dn42.dev/services/Route-Collector
+
collector.enable = true;
+
wg.tunnelDefaults = {
privateKeyFile = "/run/agenix/dn42-privkey";
localAddrs.v4 = cfg42.addr.v4;
+1
hosts/prefect/dn42/peers/default.nix
···
(import ./kioubit.nix { inherit dn42Types; })
(import ./lare.nix { inherit dn42Types; })
(import ./potato.nix { inherit dn42Types; })
(import ./routedbits.nix { inherit dn42Types; })
(import ./sunnet.nix { inherit dn42Types; })
(import ./uffsalot.nix { inherit dn42Types; })
···
(import ./kioubit.nix { inherit dn42Types; })
(import ./lare.nix { inherit dn42Types; })
(import ./potato.nix { inherit dn42Types; })
+
(import ./prefixlabs.nix { inherit dn42Types; })
(import ./routedbits.nix { inherit dn42Types; })
(import ./sunnet.nix { inherit dn42Types; })
(import ./uffsalot.nix { inherit dn42Types; })
+26
hosts/prefect/dn42/peers/prefixlabs.nix
···
···
+
{ dn42Types, ... }:
+
{
+
config.dn42 = {
+
peers.prefixlabs = {
+
as = 4242421240;
+
addr.v6 = "fe80::1240:2";
+
interface = "wg42_prefixlabs";
+
extendedNextHop = true;
+
# My side
+
srcAddr.v6 = "fe80::240";
+
# Communities
+
crypto = dn42Types.crypto.safePFS;
+
latency = dn42Types.latency."7.3ms";
+
bandwidth = dn42Types.bandwidth."1000mb";
+
transit = true;
+
};
+
wg.tunnels.prefixlabs = {
+
listenPort = 43240;
+
peerPubKey = "uRYzFGi+/B6pD0FR2SW3G/OzC5LPJXePNIt0s+nJfW0=";
+
peerEndpoint = "us-01.prefixlabs.net:22459";
+
peerAddrs.v4 = "172.20.209.11";
+
peerAddrs.v6 = "fe80::1240:2";
+
localAddrs.v6 = "fe80::240";
+
};
+
};
+
}
+8 -13
hosts/prefect/services/caddy.nix
···
# Authentication
${pns.pocket-id.extUrl} = {
extraConfig = ''
-
reverse_proxy / ${marvin}:${toString pns.pocket-id.port} {
-
header_up X-Real-IP {remote_host}
-
header_up X-Http-Version {http.request.proto}
-
}
'';
};
···
'';
};
-
# Pingvin Share
-
${pns.pingvin-share.extUrl} = {
extraConfig = ''
-
reverse_proxy /api/* ${marvin}:${toString pns.pingvin-share.be-anubis} {
-
header_up X-Real-IP {remote_host}
-
header_up X-Http-Version {http.request.proto}
-
}
-
reverse_proxy /* ${marvin}:${toString pns.pingvin-share.anubis} {
-
header_up X-Real-IP {remote_host}
-
header_up X-Http-Version {http.request.proto}
}
'';
};
# Tangled Services
${pns.tangled-knot.extUrl} = {
extraConfig = ''
···
# Authentication
${pns.pocket-id.extUrl} = {
extraConfig = ''
+
reverse_proxy ${marvin}:${toString pns.pocket-id.port}
'';
};
···
'';
};
+
# Immich
+
${pns.immich.extUrl} = {
extraConfig = ''
+
@public path /share /share/*
+
handle @public {
+
reverse_proxy ${marvin}:${toString pns.immich.pubProxy}
}
+
reverse_proxy ${marvin}:${toString pns.immich.port}
'';
};
+
# Tangled Services
${pns.tangled-knot.extUrl} = {
extraConfig = ''
+7
lib/data/services.toml
···
# anubis: What port the anubis service for this domain will use, int
# tsHost: (optional) What Tailscale host this service will run on, for services only available via Tailscale.
# # Should only be set if this is available externally, if at all, since TS-only services aren't able to be scraped.
[authentik]
port = 6908
host = "marvin"
···
port = 6923
host = "marvin"
extUrl = "soc.pyrox.dev"
[jellyfin]
port = 8096
···
# anubis: What port the anubis service for this domain will use, int
# tsHost: (optional) What Tailscale host this service will run on, for services only available via Tailscale.
# # Should only be set if this is available externally, if at all, since TS-only services aren't able to be scraped.
+
# Current lowest unassigned port: 6938
[authentik]
port = 6908
host = "marvin"
···
port = 6923
host = "marvin"
extUrl = "soc.pyrox.dev"
+
+
[immich]
+
port = 6936
+
host = "marvin"
+
extUrl = "img.pyrox.dev"
+
pubProxy = 6937
[jellyfin]
port = 8096
+1 -1
nixosModules/default-config/default.nix
···
./users.nix
];
system = {
-
stateVersion = "25.11";
disableInstallerTools = true;
tools.nixos-rebuild.enable = true;
};
···
./users.nix
];
system = {
+
stateVersion = "26.05";
disableInstallerTools = true;
tools.nixos-rebuild.enable = true;
};
+1 -1
nixosModules/homes/pyrox/default.nix
···
inputs.self.homeModules.allModules
{
home.username = "pyrox";
-
home.stateVersion = "25.11";
py.profiles.server.enable = lib.mkDefault true;
py.profiles.desktop.enable = lib.mkDefault false;
}
···
inputs.self.homeModules.allModules
{
home.username = "pyrox";
+
home.stateVersion = "26.05";
py.profiles.server.enable = lib.mkDefault true;
py.profiles.desktop.enable = lib.mkDefault false;
}
+1 -1
nixosModules/homes/thehedgehog/default.nix
···
inputs.self.homeModules.allModules
{
home.username = "thehedgehog";
-
home.stateVersion = "25.11";
py.profiles.server.enable = lib.mkDefault true;
py.profiles.desktop.enable = lib.mkDefault false;
}
···
inputs.self.homeModules.allModules
{
home.username = "thehedgehog";
+
home.stateVersion = "26.05";
py.profiles.server.enable = lib.mkDefault true;
py.profiles.desktop.enable = lib.mkDefault false;
}
-2
nixosModules/services/forgejo-runner/default.nix
···
};
cache = {
enabled = true;
-
dir = "/var/lib/forgejo/runners/cache/";
-
host = "";
port = 0;
};
container = {
···
};
cache = {
enabled = true;
port = 0;
};
container = {
+6
packages/anubis-files/src/policies/forgejo.yaml
···
- import: CUSTOM/policies/meta/base.yaml
- import: (data)/clients/git.yaml
- import: (data)/apps/gitea-rss-feeds.yaml
dnsbl: false
openGraph:
enabled: true
···
- import: CUSTOM/policies/meta/base.yaml
- import: (data)/clients/git.yaml
- import: (data)/apps/gitea-rss-feeds.yaml
+
+
# Allow forgejo runner connections from localhost and tailscale
+
- name: forgejo-runner
+
user_agent_regex: connect-go
+
action: ALLOW
+
dnsbl: false
openGraph:
enabled: true
+26
packages/bgutil-pot-server/librusty_v8.nix
···
···
+
# COPIED FROM nixpkgs/pkgs/by-name/router
+
{
+
lib,
+
stdenv,
+
fetchurl,
+
}:
+
+
let
+
fetch_librusty_v8 =
+
args:
+
fetchurl {
+
name = "librusty_v8-${args.version}";
+
url = "https://github.com/denoland/rusty_v8/releases/download/v${args.version}/librusty_v8_release_${stdenv.hostPlatform.rust.rustcTarget}.a";
+
sha256 = args.shas.${stdenv.hostPlatform.system};
+
meta = {
+
inherit (args) version;
+
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+
};
+
};
+
in
+
fetch_librusty_v8 {
+
version = "130.0.7";
+
shas = {
+
x86_64-linux = "sha256-pkdsuU6bAkcIHEZUJOt5PXdzK424CEgTLXjLtQ80t10=";
+
};
+
}
+49
packages/bgutil-pot-server/package.nix
···
···
+
{
+
lib,
+
callPackage,
+
rustPlatform,
+
fetchFromGitHub,
+
pkg-config,
+
openssl,
+
_experimental-update-script-combinators,
+
nix-update-script,
+
}:
+
rustPlatform.buildRustPackage (finalAttrs: {
+
pname = "bgutil-pot-server";
+
version = "0.6.0";
+
+
src = fetchFromGitHub {
+
owner = "jim60105";
+
repo = "bgutil-ytdlp-pot-provider-rs";
+
tag = "v${finalAttrs.version}";
+
hash = "sha256-kEu5WqOymH8yAyMhGKtVPOq3qlTRpFU/FO71uWEX/e8=";
+
};
+
+
cargoHash = "sha256-fJZeyIsFUfpWeC1MWsU1hANb6cqC9xHQOnhcohEMTeM=";
+
+
nativeBuildInputs = [
+
pkg-config
+
];
+
+
buildInputs = [
+
openssl
+
];
+
+
env.RUSTY_V8_ARCHIVE = callPackage ./librusty_v8.nix { };
+
+
doCheck = false;
+
+
passthru.updateScript = _experimental-update-script-combinators.sequence [
+
(nix-update-script { })
+
./update-librusty.sh
+
];
+
+
meta = {
+
changelog = "https://github.com/jim60105/bgutil-ytdlp-pot-provider-rs/releases/tag/v${finalAttrs.version}";
+
description = "Proof-of-origin token provider plugin for yt-dlp in Rust";
+
homepage = "https://github.com/jim60105/bgutil-ytdlp-pot-provider-rs";
+
license = lib.licenses.gpl3Plus;
+
maintainers = with lib.maintainers; [ pyrox0 ];
+
mainProgram = "bgutil-pot";
+
};
+
})
+45
packages/bgutil-pot-server/update-librusty.sh
···
···
+
#!/usr/bin/env nix-shell
+
#!nix-shell -i bash -p gnugrep gnused nix jq
+
# shellcheck shell=bash
+
# COPIED FROM nixpkgs/pkgs/by-name/wi/windmill
+
+
set -eu -o pipefail
+
+
echo "librusty_v8: UPDATING"
+
+
BGUTIL_LATEST_VERSION=$(curl ${GITHUB_TOKEN:+-u ":$GITHUB_TOKEN"} --silent --fail --location "https://api.github.com/repos/jim60105/bgutil-ytdlp-pot-provider-rs/releases/latest" | jq --raw-output .tag_name)
+
CARGO_LOCK=$(curl ${GITHUB_TOKEN:+-u ":$GITHUB_TOKEN"} --silent --fail --location "https://github.com/jim60105/bgutil-ytdlp-pot-provider-rs/raw/$BGUTIL_LATEST_VERSION/Cargo.lock")
+
+
PACKAGE_DIR=$(dirname "$(readlink --canonicalize-existing "${BASH_SOURCE[0]}")")
+
OUTPUT_FILE="$PACKAGE_DIR/librusty_v8.nix"
+
NEW_VERSION=$(echo "$CARGO_LOCK" | grep --after-context 5 'name = "v8"' | grep 'version =' | sed -E 's/version = "//;s/"//')
+
+
CURRENT_VERSION=""
+
if [ -f "$OUTPUT_FILE" ]; then
+
CURRENT_VERSION="$(grep 'version =' "$OUTPUT_FILE" | sed -E 's/version = "//;s/"//')"
+
fi
+
+
if [ "$CURRENT_VERSION" == "$NEW_VERSION" ]; then
+
echo "No update needed, $CURRENT_VERSION is already latest"
+
exit 0
+
fi
+
+
x86Hash="$(nix-prefetch-url --type sha256 https://github.com/denoland/rusty_v8/releases/download/v"$NEW_V")"
+
TEMP_FILE="$OUTPUT_FILE.tmp"
+
cat >"$TEMP_FILE" <<EOF
+
# COPIED FROM nixpkgs/pkgs/by-name/wi/windmill
+
# auto-generated file -- DO NOT EDIT!
+
{ fetchLibrustyV8 }:
+
+
fetchLibrustyV8 {
+
version = "$NEW_VERSION";
+
shas = {
+
# NOTE; Follows supported platforms of package (see meta.platforms attribute)!
+
x86_64-linux = "$(nix hash convert --hash-algo sha256 --from nix32 "$x86Hash")";
+
};
+
}
+
EOF
+
+
mv "$TEMP_FILE" "$OUTPUT_FILE"
+
+
echo "librusty_v8: UPDATE DONE"
+2 -2
packages/glide-browser-bin/package.nix
···
}:
stdenv.mkDerivation (finalAttrs: {
pname = "glide-browser";
-
version = "0.1.54a";
src = fetchurl {
url = "https://github.com/glide-browser/glide/releases/download/${finalAttrs.version}/glide.linux-x86_64.tar.xz";
-
hash = "sha256-Rw85b+9eaiM9szWpYZiF7FqJY7OpliOwt09/c8UWlGk=";
};
nativeBuildInputs = [
···
}:
stdenv.mkDerivation (finalAttrs: {
pname = "glide-browser";
+
version = "0.1.55a";
src = fetchurl {
url = "https://github.com/glide-browser/glide/releases/download/${finalAttrs.version}/glide.linux-x86_64.tar.xz";
+
hash = "sha256-mjk8KmB/T5ZpB9AMQw1mtb9VbMXVX2VV4N+hWpWkSYI=";
};
nativeBuildInputs = [
+4 -1
packages/planka/package.nix
···
in
stdenv.mkDerivation (finalAttrs: {
pname = "planka";
-
inherit version src meta;
sourceRoot = "${finalAttrs.src.name}/server";
···
'';
passthru.updateScript = nix-update-script { extraArgs = [ "--version=unstable" ]; };
})
···
in
stdenv.mkDerivation (finalAttrs: {
pname = "planka";
+
inherit version src;
sourceRoot = "${finalAttrs.src.name}/server";
···
'';
passthru.updateScript = nix-update-script { extraArgs = [ "--version=unstable" ]; };
+
meta = meta // {
+
mainProgram = "planka";
+
};
})