Files
nixos-dotfiles/hosts/nixserve/services.nix
T
2026-07-12 10:21:16 +02:00

156 lines
4.5 KiB
Nix

{ pkgs, ... }:
let
proxyVhost = { upstream, websockets ? true, maxBodySize ? "1g" }: {
forceSSL = true;
enableACME = true;
locations."/" = {
proxyPass = upstream;
proxyWebsockets = websockets;
extraConfig = ''
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 3600;
proxy_send_timeout 3600;
proxy_buffering off;
client_max_body_size ${maxBodySize};
'';
};
};
dockerService = { name, description, dir }: {
inherit description;
after = [ "docker.service" "network.target" ];
requires = [ "docker.service" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
WorkingDirectory = dir;
ExecStart = "${pkgs.docker-compose}/bin/docker-compose up -d";
ExecStop = "${pkgs.docker-compose}/bin/docker-compose down";
};
};
in
{
services.nfs.server = {
enable = true;
statdPort = 4000;
lockdPort = 4001;
mountdPort = 4002;
exports = ''
/media 192.168.50.0/24(rw,sync,no_subtree_check,all_squash,anonuid=1000,anongid=1000,fsid=0)
'';
};
services.jellyfin.enable = true;
services.tailscale = {
enable = true;
openFirewall = true;
useRoutingFeatures = "server";
};
services.syncthing = {
enable = true;
user = "ulve";
dataDir = "/home/ulve";
configDir = "/home/ulve/.config/syncthing";
openDefaultPorts = true;
settings.devices."macbook" = {
id = "U4YVRUT-JAAXHQ4-TA6FAGH-SO6Z7CI-KDFPRNG-UZYNXDK-6OQY7ZA-UBTZRQW";
};
settings.devices."phone" = {
id = "WXTP2PT-GW3C3EJ-JYYYXUT-VEKCAQV-NQTPQLI-TOMDAI3-CSUUHF5-6DH72AM";
};
settings.folders."Downloads" = {
path = "/home/ulve/Downloads";
devices = [ "macbook" ];
};
settings.folders."yrw8u-ut036" = {
path = "/home/ulve/Phone";
devices = [ "phone" ];
};
settings.folders."xdnt7-iaqtd" = {
path = "/home/ulve/Vaults";
devices = [ "macbook" ];
};
};
services.immich = {
enable = true;
mediaLocation = "/media/immich";
};
virtualisation.docker = {
enable = true;
enableOnBoot = true;
autoPrune = {
enable = true;
dates = "weekly";
flags = [ "--all" ];
};
};
systemd.services.transmission = dockerService {
name = "transmission";
description = "Transmission via Mullvad VPN";
dir = "/home/ulve/code/transmission";
};
systemd.services.aftersummer = dockerService {
name = "aftersummer";
description = "Aftersummer";
dir = "/home/ulve/code/aftersummer";
};
systemd.services.spine = dockerService {
name = "spine";
description = "Spine ebook server";
dir = "/home/ulve/code/wargaming";
};
systemd.services.bookthing = dockerService {
name = "bookthing";
description = "Bookthing audiobook server";
dir = "/home/ulve/code/bookthing";
};
systemd.services.tailscale-exit = dockerService {
name = "tailscale-exit";
description = "Tailscale exit node via Mullvad VPN";
dir = "/home/ulve/code/tailscale";
};
systemd.services.dozzle = {
description = "Dozzle Docker log viewer";
after = [ "docker.service" "network.target" ];
requires = [ "docker.service" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "simple";
ExecStartPre = "${pkgs.docker}/bin/docker rm -f dozzle || true";
ExecStart = "${pkgs.docker}/bin/docker run --rm --name dozzle -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock amir20/dozzle";
ExecStop = "${pkgs.docker}/bin/docker stop dozzle";
Restart = "on-failure";
};
};
security.acme = {
acceptTerms = true;
defaults.email = "johansson.olov@gmail.com";
};
services.nginx = {
enable = true;
virtualHosts."transmission.maybec.at" = proxyVhost { upstream = "http://127.0.0.1:9091"; };
virtualHosts."aftersummer.maybec.at" = proxyVhost { upstream = "http://127.0.0.1:5588"; };
virtualHosts."spine.maybec.at" = proxyVhost { upstream = "http://localhost:3000"; };
virtualHosts."bookthing.maybec.at" = proxyVhost { upstream = "http://127.0.0.1:8000"; };
virtualHosts."jelly.maybec.at" = proxyVhost { upstream = "http://127.0.0.1:8096"; };
virtualHosts."photos.maybec.at" = proxyVhost { upstream = "http://[::1]:2283"; maxBodySize = "50g"; };
};
}