main
  1{lib, ...}: {
  2  den.aspects.services.forgejo.server = {
  3    settings.host = {
  4      domain = lib.mkOption {
  5        type = lib.types.str;
  6      };
  7      address = lib.mkOption {
  8        type = lib.types.str;
  9        default = "127.0.0.1";
 10      };
 11      port = lib.mkOption {
 12        type = lib.types.port;
 13        default = 3155;
 14      };
 15    };
 16
 17    reverseProxy = {host, ...}: let
 18      cfg = host.settings.services.forgejo.server;
 19    in {
 20      ${cfg.domain} = {
 21        port = cfg.port;
 22        maxSize = "128MiB";
 23      };
 24    };
 25
 26    persist = {config, ...}: {
 27      directories = [
 28        {
 29          directory = config.services.forgejo.stateDir;
 30          inherit (config.services.forgejo) user group;
 31          mode = "0700";
 32        }
 33      ];
 34    };
 35
 36    backup = {
 37      pkgs,
 38      lib,
 39      config,
 40      ...
 41    }: {
 42      forgejo = let
 43        backupDir = "/tmp/backups/forgejo";
 44      in {
 45        paths = [backupDir];
 46
 47        backupPrepareCommand = lib.getExe (pkgs.writeShellApplication {
 48          name = "backup-vaultwarden-prepare";
 49          runtimeInputs = [
 50            config.services.forgejo.package
 51            pkgs.sudo
 52          ];
 53          text = ''
 54            set -euo pipefail
 55
 56            DATA_DIR="${config.services.forgejo.stateDir}"
 57            FORGEJO_USER="${config.services.forgejo.user}"
 58
 59            mkdir -p "${backupDir}"
 60            chown "$FORGEJO_USER" "${backupDir}"
 61
 62            sudo -u "$FORGEJO_USER" forgejo dump \
 63              --work-path "$DATA_DIR" \
 64              --type "zip" \
 65              --file "${backupDir}/forgejo-dump.zip" \
 66              --verbose
 67          '';
 68        });
 69        backupCleanupCommand = ''
 70          rm -r "${backupDir}"
 71        '';
 72      };
 73    };
 74
 75    nixos = {
 76      host,
 77      pkgs,
 78      config,
 79      ...
 80    }: let
 81      hostCfg = host.settings.services.forgejo.server;
 82    in {
 83      services.forgejo = {
 84        enable = true;
 85        package = pkgs.forgejo;
 86        user = "git";
 87        group = "forgejo";
 88        database = {
 89          type = "sqlite3";
 90        };
 91        lfs.enable = true;
 92        settings = {
 93          DEFAULT = {
 94            APP_NAME = "Gate Of Infinity";
 95            APP_SLOGAN = "Walk toward the tomorrow where the stars gleam.";
 96            APP_DISPLAY_NAME_FORMAT = "{APP_NAME}";
 97          };
 98          server = {
 99            DOMAIN = hostCfg.domain;
100            HTTP_ADDR = hostCfg.address;
101            HTTP_PORT = hostCfg.port;
102            PROTOCOL = "http";
103            ROOT_URL = "https://${hostCfg.domain}/";
104          };
105          service = {
106            DISABLE_REGISTRATION = true;
107            ENABLE_BASIC_AUTHENTICATION = false;
108          };
109          repository = {
110            DEFAULT_REPO_UNITS = "repo.code,repo.releases,repo.issues,repo.pulls";
111            DEFAULT_FORK_REPO_UNITS = "repo.code,repo.pulls";
112            DEFAULT_MIRROR_REPO_UNITS = "repo.code";
113          };
114          actions = {
115            ENABLED = true;
116            DEFAULT_ACTIONS_URL = "https://${hostCfg.domain}";
117          };
118          webhook = {
119            ALLOWED_HOST_LIST = "external,loopback";
120          };
121          log = {
122            LEVEL = "Info";
123            LOGGER_ROUTER_MODE = "Error";
124          };
125          ui = {
126            DEFAULT_THEME = "catppuccin-mauve-auto";
127            THEMES = lib.concatStringsSep "," [
128              "forgejo-auto"
129              "forgejo-light"
130              "forgejo-dark"
131              "catppuccin-mauve-auto"
132            ];
133          };
134        };
135      };
136
137      systemd.tmpfiles.settings = let
138        customDir = config.services.forgejo.customDir;
139        themeDir = "${customDir}/public/assets/css";
140      in {
141        forgejo-assets-init = {
142          "${customDir}/public" = {
143            "d" = {inherit (config.services.forgejo) user group;};
144          };
145          "${customDir}/public/assets" = {
146            "d" = {inherit (config.services.forgejo) user group;};
147          };
148        };
149        forgejo-catppuccin-theme = let
150          catppuccin-forgejo = pkgs.fetchzip {
151            url = "https://git.trin.one/HPCesia/catppuccin-forgejo/releases/download/v0.1.0-rc1/catppuccin-forgejo.tar.xz";
152            hash = "sha256-M5go7mxVw/vupBpltX1GDJsYY6QtO7a17osmdhdeYV4=";
153            stripRoot = false;
154          };
155        in {
156          ${themeDir} = {
157            "C+" = {argument = toString catppuccin-forgejo;};
158          };
159        };
160      };
161
162      users.users."git" = {
163        isSystemUser = true;
164        useDefaultShell = true;
165        group = config.services.forgejo.group;
166        home = config.services.forgejo.stateDir;
167      };
168
169      services.openssh = {
170        extraConfig = ''
171          Match User git
172            AcceptEnv GIT_PROTOCOL
173        '';
174      };
175    };
176  };
177}