From 8c1c2a443e935ffb2a759c7b6539e7a071b9cae4 Mon Sep 17 00:00:00 2001 From: servius Date: Sun, 3 May 2026 05:03:39 +0530 Subject: [PATCH] feat: Added suwayomi and update some komga stuff --- nixos/tako/services/default.nix | 3 +- nixos/tako/services/kobo.nix | 6 +-- nixos/tako/services/komga.nix | 9 ++++- nixos/tako/services/suwayomi.nix | 69 ++++++++++++++++++++++++++++++++ secrets/secrets.yaml | 7 +++- 5 files changed, 86 insertions(+), 8 deletions(-) create mode 100644 nixos/tako/services/suwayomi.nix diff --git a/nixos/tako/services/default.nix b/nixos/tako/services/default.nix index 9c6db70..cf187d4 100644 --- a/nixos/tako/services/default.nix +++ b/nixos/tako/services/default.nix @@ -2,7 +2,7 @@ imports = [ ./atuin.nix ./authelia.nix - # ./kobo.nix + ./kobo.nix ./caddy.nix ./fail2ban.nix ./glance.nix @@ -34,6 +34,7 @@ ./rsshub.nix # ./searxng.nix ./shitpost.nix + ./suwayomi.nix ./vaultwarden.nix ]; } diff --git a/nixos/tako/services/kobo.nix b/nixos/tako/services/kobo.nix index 9fa671a..110a0f7 100644 --- a/nixos/tako/services/kobo.nix +++ b/nixos/tako/services/kobo.nix @@ -1,7 +1,7 @@ { config, inputs, - pkgs, + # pkgs, ... }: let port = 8293; @@ -15,13 +15,13 @@ in { services = { kobors = { - enable = true; + enable = false; socket = "127.0.0.1:${toString port}"; externalUrl = "https://books.darksailor.dev"; calibreLibraryPath = libraryPath; }; caddy = { - virtualHosts."books.darksailor.dev".extraConfig = '' + virtualHosts."kobo.darksailor.dev".extraConfig = '' reverse_proxy localhost:${toString port} ''; }; diff --git a/nixos/tako/services/komga.nix b/nixos/tako/services/komga.nix index d6c820d..731a962 100644 --- a/nixos/tako/services/komga.nix +++ b/nixos/tako/services/komga.nix @@ -1,15 +1,17 @@ { config, device, + pkgs, ... }: let port = 25600; in { - networking.domains.subDomains."comics.darksailor.dev".a.data = device.tailscaleIp; + networking.domains.subDomains."comics.darksailor.dev" = {}; systemd.tmpfiles.rules = [ "Z /media/comics - ${config.services.komga.user} ${config.services.komga.group} - -" ]; + systemd.services.komga.environment.KOMGA_KEPUBIFYPATH = "${pkgs.kepubify}/bin/kepubify"; services = { komga = { enable = true; @@ -17,6 +19,9 @@ in { }; caddy = { virtualHosts."comics.darksailor.dev".extraConfig = '' + log { + output stdout + } import auth reverse_proxy localhost:${toString port} ''; @@ -29,7 +34,7 @@ in { { domain = "comics.darksailor.dev"; policy = "bypass"; - resources = ["^/(api|opds|sse)([/?].*)?$"]; + resources = ["^/(api|opds|sse|kobo)([/?].*)?$"]; } { domain = "comics.darksailor.dev"; diff --git a/nixos/tako/services/suwayomi.nix b/nixos/tako/services/suwayomi.nix new file mode 100644 index 0000000..04e05df --- /dev/null +++ b/nixos/tako/services/suwayomi.nix @@ -0,0 +1,69 @@ +{config, ...}: let + port = 4567; + downloadsDir = "/media/manga"; +in { + networking.domains.subDomains."manga.darksailor.dev" = {}; + + sops.secrets."suwayomi/basicAuthPassword".owner = config.services.suwayomi-server.user; + sops.secrets."suwayomi/basicAuthB64".owner = config.services.caddy.user; + sops.templates."suwayomi-caddy.env" = { + content = '' + SUWAYOMI_BASIC_B64=${config.sops.placeholder."suwayomi/basicAuthB64"} + ''; + owner = config.services.caddy.user; + }; + services.caddy.environmentFile = config.sops.templates."suwayomi-caddy.env".path; + + users.users.${config.services.suwayomi-server.user}.extraGroups = [config.services.komga.group]; + + systemd.tmpfiles.rules = [ + "d ${downloadsDir} 0775 ${config.services.suwayomi-server.user} ${config.services.komga.group} - -" + ]; + + services = { + suwayomi-server = { + enable = true; + settings.server = { + ip = "127.0.0.1"; + port = port; + downloadAsCbz = true; + downloadsPath = downloadsDir; + basicAuthEnabled = true; + basicAuthUsername = "kobo"; + basicAuthPasswordFile = config.sops.secrets."suwayomi/basicAuthPassword".path; + }; + }; + caddy.virtualHosts."manga.darksailor.dev".extraConfig = '' + @api_browser { + path /api /api/* + header Cookie *authelia_session* + } + @api_plugin { + path /api /api/* + not header Cookie *authelia_session* + } + handle @api_browser { + import auth + reverse_proxy localhost:${toString port} { + header_up Authorization "Basic {$SUWAYOMI_BASIC_B64}" + } + } + handle @api_plugin { + reverse_proxy localhost:${toString port} + } + handle { + import auth + reverse_proxy localhost:${toString port} { + header_up Authorization "Basic {$SUWAYOMI_BASIC_B64}" + } + } + ''; + authelia.instances.darksailor.settings.access_control.rules = [ + { + domain = "manga.darksailor.dev"; + policy = "bypass"; + resources = ["^/api([/?].*)?$"]; + } + ]; + }; +} diff --git a/secrets/secrets.yaml b/secrets/secrets.yaml index 41d4018..eb3e269 100644 --- a/secrets/secrets.yaml +++ b/secrets/secrets.yaml @@ -142,6 +142,9 @@ users: servius: plaintext: ENC[AES256_GCM,data:MagD7GeNuINlIXjAeJTw8TpzXZgBHSWDus68VI85RRU=,iv:OPaZEewmHMYXvkjb1X0Vg4eLosDQ/zIVZOyFUBl/I2g=,tag:bfH2sot/UqDSb+gaZwVvVQ==,type:str] password: ENC[AES256_GCM,data:UlHqoRbAXJsG7TMy3CEhqiDVxdLreFIsMoYhNe0KxPd0ZDH50LmwY6/+7OV3cLxWv3qO3OUk7bWs8HS7eTbIIQn+srK1Hd6s5CBN6sKsD/D3oUfdHrpOeH3OUlAJiHVb7yC9a0s4gqf8oQ==,iv:pYij3/izDDF/Wk+RrCb4cKa8njY++/kSIwy8PR3EvOg=,tag:/Fw8HoWzXGpQZVt82GpOow==,type:str] +suwayomi: + basicAuthPassword: ENC[AES256_GCM,data:0aQyCP26OGTHN7+zOJoTRqMGlYEql6EUXgg2nUU7zLX2LSUjQsMzRNMFSF4e+nGweyLozqg4OPQnqkDGerXDWA==,iv:3Py99XBwCg2ug+ekxEE2hKc5jyaRInk2MyNMBFsAMtA=,tag:z03Lh6qhnL3DGU3JF+PK+w==,type:str] + basicAuthB64: ENC[AES256_GCM,data:wWUxQ78XrJTab4IQ/eLhjiNjLyG6DUqjPQXiUcGBwguQwdlSbJbX1C+YLEHwSoJx2OlqRSuYC8qIhDQZ95ugdUyCtD+47oVz0ZDSBiSCaMxM0g4ESWvtFt5poPA=,iv:RntrN4cKB8gETATh8M2VBxJfkca5cnApsf161sXtN80=,tag:dOpHnQJuLjQ3RLvRnPJKHA==,type:str] sops: age: - recipient: age1pw7kluxp7872c63ne4jecq75glj060jkmqwzkk6esatuyck9egfswufdpk @@ -153,7 +156,7 @@ sops: VGZKdHpVeFRpQUxtSEkyaEhLMlBJcGsKLb0DvPNZosPBUuiX6qz1s5IO5INQh8CK ZtXTVClwMSmaUYhdSB2gKFrKVZHXTJZ4oAL5t/BpC0pOHyr+o96T3Q== -----END AGE ENCRYPTED FILE----- - lastmodified: "2026-05-01T17:26:41Z" - mac: ENC[AES256_GCM,data:n1rjFLuy+ubCnRfFb3IBPQJ5DRPaA9o1mfXMAs3/qm287qjppNKAAVX/ErR+KFe12zD9Uo2wd6VCWNcvInTrk9BV4m0L3cwuWgYSK7LJqjC9s0jipufO3Ffqp0Y+EQFndTHnSBX9b0/9fvtDf767OfHueHRJyPvueTucI87o4qI=,iv:+8AtZa5COxjouT+Qc3C2rY7N/r/3crkfZSRaznbp9xY=,tag:5zfDCZaVfv2wYHVxNmoLsw==,type:str] + lastmodified: "2026-05-02T19:07:30Z" + mac: ENC[AES256_GCM,data:SEAoxn0UGbc3RZz5+v94YlFvVUK8rVfBqXEHbPct+fCSXxWgmlbm09s56q6GehozLtky/xgpvWcC40js5w94JfBBUPcV02M6Q1MmHO9/zmDYyl81lKDh+acr285UPNmB66Pcz5vdunwAQLSLEP2nFdKXnyl1LG5r295njt3W7EI=,iv:eIXv3zqUa2d4kX51bMgKwRgsAbyxUBn/wt6FFJnbmcs=,tag:3BFv5CXkXFTVgmDDpypRAg==,type:str] unencrypted_suffix: _unencrypted version: 3.12.2 -- 2.51.2