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}