main
 1{den, ...}: {
 2  den.hosts.mobius = {
 3    settings = {
 4      services.webserver.external = false;
 5      services.webserver.caddy.tailscaleUseHttps = true;
 6
 7      services.forgejo = {
 8        domain = "git.net.trin.one";
 9      };
10      services.forgejo.runner = {
11        instances.internal = {
12          name = "runner-internal";
13          servers = {
14            gateOfInfinity = {
15              url = "https://git.net.trin.one";
16              uuid = "53fa1df5-f0dd-423c-91a7-afee2488f253";
17              tokenFileAged = ./forgejo-runner-goi-token.age;
18            };
19          };
20          labels = [
21            "ubuntu-latest:docker://ghcr.io/catthehacker/ubuntu:act-latest"
22            "nixos-latest:docker://git.net.trin.one/hpcesia/nix-act-image:latest-x86_64-linux"
23          ];
24          extraSettings = {
25            container.network = "host";
26          };
27        };
28      };
29      services.navidrome = {
30        domain = "navidrome.net.trin.one";
31      };
32      services.woodpecker.agent.agents = {
33        codeberg = {
34          server = "grpc.ci.codeberg.org:443";
35          secretFileAged = ./woodpecker-agent-codeberg-token.age;
36          labels = {
37            tier = "high";
38          };
39        };
40      };
41    };
42  };
43
44  den.aspects.mobius = {
45    includes = with den.aspects; [
46      services.webserver
47      services.tailscale-nginx-auth
48
49      services.forgejo
50      services.forgejo.runner
51      services.navidrome
52      services.woodpecker.agent
53
54      {
55        nixos = {
56          config,
57          pkgs,
58          ...
59        }: {
60          # TODO: Remove this workaround if Headscale land it's tailscale cert support.
61          # See: https://github.com/juanfont/headscale/issues/2527
62          services.caddy = {
63            package = pkgs.caddy.withPlugins {
64              plugins = [
65                "github.com/caddy-dns/cloudflare@v0.2.4"
66              ];
67              hash = "sha256-hEHgAG0F0ozHRAPuxEqLyTATBrE+pajeXDiSNwniorg=";
68            };
69            virtualHosts.headscale = {
70              hostName = "*.net.trin.one";
71              extraConfig = ''
72                tls {
73                  dns cloudflare {env.CF_API_TOKEN}
74                  resolvers 1.1.1.1 1.0.0.1
75                }
76                abort
77              '';
78            };
79          };
80
81          systemd.services.caddy.serviceConfig.EnvironmentFile = [config.vaultix.templates.caddy-headscale-env.path];
82
83          vaultix.secrets.headscale-subnet-tls-cf-token.file = ./tailscale-cloudflare-token.age;
84          vaultix.templates.caddy-headscale-env = {
85            content = ''
86              CF_API_TOKEN=${config.vaultix.placeholder.headscale-subnet-tls-cf-token}
87            '';
88            owner = config.services.caddy.user;
89            group = config.services.caddy.group;
90            mode = "0400";
91          };
92        };
93      }
94    ];
95  };
96}