forgejo.nix (3455B)
1 { 2 config, 3 lib, 4 pkgs, 5 haravara, 6 ... 7 }: let 8 cfg = config.services.haravara.forgejo; 9 in { 10 options.services.haravara.forgejo = { 11 enable = lib.mkEnableOption "Forgejo git service"; 12 httpPort = lib.mkOption { 13 type = lib.types.port; 14 default = 3482; 15 description = "Internal HTTP port for Forgejo"; 16 }; 17 sshPort = lib.mkOption { 18 type = lib.types.port; 19 default = 22; 20 description = "SSH port for Forgejo"; 21 }; 22 23 domain = lib.mkOption { 24 type = lib.types.str; 25 }; 26 }; 27 28 config = lib.mkIf cfg.enable { 29 users = { 30 users.forgejo = { 31 isSystemUser = true; 32 group = lib.mkForce "forgejo"; 33 }; 34 }; 35 36 systemd = { 37 tmpfiles.rules = [ 38 "d /data/forgejo 0700 forgejo forgejo -" 39 "d /data/forgejo/repositories 0700 forgejo forgejo -" 40 "d /var/lib/forgejo 0700 forgejo forgejo -" 41 "d /var/lib/forgejo/custom 0700 forgejo forgejo -" 42 "d /var/lib/forgejo/custom/conf 0700 forgejo forgejo -" 43 ]; 44 45 services.forgejo = { 46 serviceConfig.TimeoutSec = 3600; 47 }; 48 }; 49 50 fileSystems."/var/lib/forgejo/repositories" = { 51 device = "/data/forgejo/repositories"; 52 fsType = "none"; 53 options = ["bind" "nofail"]; 54 }; 55 56 services = { 57 forgejo = { 58 enable = true; 59 package = pkgs.forgejo; 60 stateDir = "/var/lib/forgejo"; 61 database.type = "sqlite3"; 62 lfs.enable = true; 63 64 secrets = { 65 "FORGEJO__SECURITY__SECRET_KEY".path = "/var/lib/forgejo/custom/conf/secret_key"; 66 "FORGEJO__SECURITY__INTERNAL_TOKEN".path = "/var/lib/forgejo/custom/conf/internal_token"; 67 "FORGEJO__OAUTH2__JWT_SECRET".path = "/var/lib/forgejo/custom/conf/oauth2_jwt_secret"; 68 "FORGEJO__SERVER__LFS_JWT_SECRET".path = "/var/lib/forgejo/custom/conf/lfs_jwt_secret"; 69 }; 70 71 settings = { 72 DEFAULT = { 73 APP_NAME = cfg.domain; 74 }; 75 server = { 76 DOMAIN = cfg.domain; 77 SSH_DOMAIN = haravara.stripSubdomain cfg.domain; 78 ROOT_URL = "https://${cfg.domain}/"; 79 HTTP_PORT = cfg.httpPort; 80 HTTP_ADDR = "127.0.0.1"; 81 SSH_PORT = cfg.sshPort; 82 SSH_LISTEN_PORT = cfg.sshPort; 83 }; 84 other = { 85 SHOW_FOOTER_VERSION = false; 86 }; 87 repository = { 88 FORCE_CHMOD_OFF = true; 89 MAX_CREATION_LIMIT = 0; 90 }; 91 service = { 92 DISABLE_REGISTRATION = true; 93 }; 94 "repository.signing" = { 95 TRUST_MODEL = "committer"; 96 }; 97 "git.timeout" = { 98 DEFAULT = 3600; 99 EVENT = 3600; 100 PULL = 3600; 101 }; 102 mailer = { 103 ENABLED = false; 104 }; 105 }; 106 }; 107 108 openssh.ports = [cfg.sshPort]; 109 110 caddy.virtualHosts."${cfg.domain}".extraConfig = '' 111 # Bypass auth for Docker Registry and Git CLI 112 @cli_paths { 113 path /v2/* 114 path */info/refs* 115 path */git-upload-pack* 116 path */git-receive-pack* 117 } 118 119 handle @cli_paths { 120 reverse_proxy 127.0.0.1:${toString cfg.httpPort} 121 } 122 123 handle { 124 import remote_auth 125 reverse_proxy 127.0.0.1:${toString cfg.httpPort} 126 } 127 ''; 128 }; 129 130 networking.firewall.allowedTCPPorts = [cfg.sshPort]; 131 }; 132 }