2023-08-31 01:55:45 +03:00
|
|
|
{ cluster, config, depot, lib, pkgs, ... }:
|
2023-07-21 02:26:26 +03:00
|
|
|
|
|
|
|
let
|
2023-08-31 01:55:45 +03:00
|
|
|
inherit (depot.lib.meta) domain;
|
|
|
|
inherit (depot.lib.nginx) vhosts;
|
2023-07-21 02:26:26 +03:00
|
|
|
inherit (config.age) secrets;
|
|
|
|
|
|
|
|
patroni = cluster.config.links.patroni-pg-access;
|
|
|
|
|
|
|
|
host = "forge.${domain}";
|
|
|
|
|
|
|
|
link = config.links.forge;
|
|
|
|
|
2024-06-04 19:57:24 +03:00
|
|
|
exe = lib.getExe config.services.forgejo.package;
|
2023-07-21 02:26:26 +03:00
|
|
|
in
|
|
|
|
|
|
|
|
{
|
2024-06-04 20:54:44 +03:00
|
|
|
system.ascensions.forgejo = {
|
2024-06-05 02:51:28 +03:00
|
|
|
requiredBy = [ "forgejo.service" ];
|
|
|
|
before = [ "forgejo.service" ];
|
|
|
|
incantations = i: [
|
|
|
|
(i.execShell "chown -R forgejo:forgejo /srv/storage/private/forge")
|
|
|
|
];
|
2024-06-04 20:54:44 +03:00
|
|
|
};
|
|
|
|
|
2023-07-21 02:26:26 +03:00
|
|
|
age.secrets = {
|
|
|
|
forgejoOidcSecret = {
|
|
|
|
file = ./credentials/forgejo-oidc-secret.age;
|
2024-06-04 19:57:24 +03:00
|
|
|
owner = "forgejo";
|
2023-07-21 02:26:26 +03:00
|
|
|
};
|
|
|
|
forgejoDbCredentials = {
|
|
|
|
file = ./credentials/forgejo-db-credentials.age;
|
2024-06-04 19:57:24 +03:00
|
|
|
owner = "forgejo";
|
2023-07-21 02:26:26 +03:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
links.forge.protocol = "http";
|
|
|
|
|
2024-06-04 19:57:24 +03:00
|
|
|
services.forgejo = {
|
2023-07-21 02:26:26 +03:00
|
|
|
enable = true;
|
|
|
|
package = depot.packages.forgejo;
|
|
|
|
stateDir = "/srv/storage/private/forge";
|
|
|
|
database = {
|
|
|
|
createDatabase = false;
|
|
|
|
type = "postgres";
|
|
|
|
host = patroni.ipv4;
|
|
|
|
inherit (patroni) port;
|
|
|
|
name = "forge";
|
|
|
|
user = "forge";
|
|
|
|
passwordFile = secrets.forgejoDbCredentials.path;
|
|
|
|
};
|
|
|
|
settings = {
|
2024-06-04 20:11:38 +03:00
|
|
|
DEFAULT = {
|
|
|
|
APP_NAME = "The Forge";
|
|
|
|
};
|
2023-07-21 02:26:26 +03:00
|
|
|
server = {
|
|
|
|
DOMAIN = host;
|
|
|
|
ROOT_URL = "https://${host}/";
|
|
|
|
PROTOCOL = link.protocol;
|
|
|
|
HTTP_ADDR = link.ipv4;
|
|
|
|
HTTP_PORT = link.port;
|
|
|
|
};
|
|
|
|
oauth2_client = {
|
|
|
|
REGISTER_EMAIL_CONFIRM = false;
|
|
|
|
ENABLE_AUTO_REGISTRATION = true;
|
|
|
|
ACCOUNT_LINKING = "auto";
|
|
|
|
UPDATE_AVATAR = true;
|
|
|
|
};
|
|
|
|
session.COOKIE_SECURE = true;
|
|
|
|
service = {
|
|
|
|
DISABLE_REGISTRATION = false;
|
|
|
|
ALLOW_ONLY_INTERNAL_REGISTRATION = false;
|
|
|
|
ALLOW_ONLY_EXTERNAL_REGISTRATION = true;
|
|
|
|
};
|
|
|
|
log.ENABLE_XORM_LOG = false;
|
|
|
|
# enabling this will leak secrets to the log
|
|
|
|
database.LOG_SQL = false;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
services.nginx.virtualHosts."${host}" = vhosts.proxy link.url;
|
|
|
|
|
2024-06-04 19:57:24 +03:00
|
|
|
systemd.services.forgejo.preStart = let
|
2023-07-21 02:26:26 +03:00
|
|
|
providerName = "PrivateVoidAccount";
|
|
|
|
args = lib.escapeShellArgs [
|
|
|
|
"--name" providerName
|
|
|
|
"--provider" "openidConnect"
|
|
|
|
"--key" "net.privatevoid.forge1"
|
|
|
|
"--auto-discover-url" "https://login.${domain}/auth/realms/master/.well-known/openid-configuration"
|
|
|
|
"--group-claim-name" "groups"
|
|
|
|
"--admin-group" "/forge_admins@${domain}"
|
|
|
|
];
|
|
|
|
in lib.mkAfter /*bash*/ ''
|
|
|
|
providerId="$(${exe} admin auth list | ${pkgs.gnugrep}/bin/grep -w '${providerName}' | cut -f1)"
|
|
|
|
if [[ -z "$providerId" ]]; then
|
|
|
|
FORGEJO_ADMIN_OAUTH2_SECRET="$(< ${secrets.forgejoOidcSecret.path})" ${exe} admin auth add-oauth ${args}
|
|
|
|
else
|
|
|
|
FORGEJO_ADMIN_OAUTH2_SECRET="$(< ${secrets.forgejoOidcSecret.path})" ${exe} admin auth update-oauth --id "$providerId" ${args}
|
|
|
|
fi
|
|
|
|
'';
|
|
|
|
}
|