{ config, pkgs, ... }: let inherit (config.networking) fqdn; acmeEnabled = config.acme.enable; themeName = "tuxcord"; forgejoPublic = pkgs.linkFarm "forgejo-public" [ { name = "assets/css/theme-${themeName}.css"; path = ../../assets/forgejo/theme.css; } { name = "assets/img"; path = makeForgejoImages { big = ../../assets/branding/logo.svg; small = ../../assets/branding/logo-head.svg; rasterWidth = 1024; }; } { name = "assets/images/full-logo.svg"; path = ../../assets/branding/logo.svg; } ]; forgejoTemplates = ../../assets/forgejo/templates; makeForgejoImages = { big, small, rasterWidth, }: pkgs.stdenv.mkDerivation rec { name = "forgejo-images"; srcs = [ big small ]; unpackPhase = "true"; buildInputs = with pkgs; [ inkscape ]; # https://forgejo.org/docs/next/contributor/customization/#changing-the-logo buildPhase = '' mkdir -p $out cp "${big}" $out/logo.svg inkscape -w ${toString rasterWidth} ${big} -o $out/logo.png cp "${small}" $out/favicon.svg inkscape -w ${toString rasterWidth} ${small} -o $out/favicon.png ''; }; in { services.forgejo = { enable = true; database.type = "mysql"; lfs.enable = true; settings = { DEFAULT = { APP_NAME = "TuxCord Code Forge"; }; server = { DOMAIN = fqdn; ROOT_URL = "${if acmeEnabled then "https" else "http"}://${fqdn}/"; HTTP_PORT = 3000; }; service = { DISABLE_REGISTRATION = true; REQUIRE_SIGNIN_VIEW = false; }; repository = { ENABLE_PUSH_CREATE_USER = true; ENABLE_PUSH_CREATE_ORG = true; DEFAULT_BRANCH = "main"; }; ui = { DEFAULT_THEME = themeName; }; # TODO: once we have email setup this would be nice mailer.ENABLED = true; actions = { ENABLED = true; # DEFAULT_ACTIONS_URL = "github"; }; }; }; systemd.services.forgejo-branding = { enable = true; wantedBy = [ "forgejo.service" ]; before = [ "forgejo.service" ]; serviceConfig = { Type = "oneshot"; ExecStart = pkgs.writeShellScript "forgejo-branding.oneshot" '' ${pkgs.rsync}/bin/rsync -rl --chown forgejo:forgejo --delete ${forgejoPublic}/ ${config.services.forgejo.customDir}/public ${pkgs.rsync}/bin/rsync -rl --chown forgejo:forgejo --delete ${forgejoTemplates}/ ${config.services.forgejo.customDir}/templates ''; }; }; environment.persistence."/persist".directories = [ { directory = config.services.forgejo.stateDir; group = "forgejo"; user = "forgejo"; } ]; }