Reverse proxy

You may wish to place your Forgejo instance behind a reverse proxy. A reverse proxy is a server that accepts requests from the outside and routes them to internal services, like Forgejo.

nginx

Basic HTTP

To set up a basic HTTP reverse proxy in nginx, create a file forgejo.conf in /etc/nginx/conf.d and add the following configuration:

server {
    listen 80; # Listen on IPv4 port 80
    listen [::]:80; # Listen on IPv6 port 80

    server_name git.example.com; # Change this to the server domain name.

    location / {
        proxy_pass http://127.0.0.1:3000; # Port 3000 is the default Forgejo port

        proxy_set_header Connection $http_connection;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        client_max_body_size 512M;
    }
}

Make sure to reload/restart nginx after chaning the configuration.

HTTP with a subpath

If you want to serve Forgejo on a subpath, e.g. on http://example.com/forgejo, use the following configuration:

server {
    listen 80; # Listen on IPv4 port 80
    listen [::]:80; # Listen on IPv6 port 80

    server_name git.example.com; # Change this to the server domain name.

    location /forgejo/ { # Replace forgejo here with your subpath
        rewrite ^ $request_uri;
        rewrite ^/forgejo(/.*) $1 break;
        return 400;
        proxy_pass http://127.0.0.1:3000$uri;

        proxy_set_header Connection $http_connection;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        client_max_body_size 512M;
    }
}

Make sure to set the Forgejo ROOT_URL configuration key to the URL with the subpath, otherwise links generated by Forgejo will be broken.

HTTPS

When using a reverse proxy, it’s usually easier to let the proxy handle HTTPS. It’s easy to set up HTTPS on nginx.

HTTPS with Certbot

To set up HTTPS with Certbot, first set up an HTTP reverse proxy with the configuration above and ensure that it works as expected. To use HTTPS you need to have a domain name.

Then, install certbot. When running certbot, select the domain name that your Forgejo instance is hosted under, and choose automatic installation. This should automatically set up HTTPS on port 443 and a redirect on the old port 80.

You may wish to change the ROOT_URL configuration key to the HTTPS protocol so links generated by Forgejo automatically use HTTPS.

HTTPS with manually installed certificates

If you have obtained certificates from elsewhere or have chosen not to let certbot automatically install them, make the following changes to the configuration file:

Change the listening ports

Change the lines

listen 80;
listen [::]:80;

to

listen 443 ssl http2;
listen [::]:443 ssl http2;

Add the SSL certificate information

Generate an SSL configuration at mozilla, and add the SSL parameters to your configuration file. Make sure to replace the paths in the example with paths to your certificate files.

Add a redirect from HTTP

Outside the server block, add this redirection block:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    location / {
        return 301 https://$host$request_uri;
    }
}

This will redirect anyone visiting the HTTP site to the HTTPS site.

Apache

Basic HTTP

To set up a basic HTTP proxy in Apache, create a file 100-forgejo.conf in /etc/apache2/sites-available and add the following configuration:

<VirtualHost *:80>
    ServerName git.example.com

    ProxyPreserveHost On
    ProxyRequests off
    AllowEncodedSlashes NoDecode
    ProxyPass / http://127.0.0.1:3000/ nocanon
</VirtualHost>

Next, enable the site with a2ensite 100-forgejo.conf and enable the proxy modules with a2enmod proxy proxy_http. Finally, restart the apache server.

HTTP with a subpath

If you want to serve Forgejo on a subpath, e.g. on http://example.com/forgejo, use the following configuration:

<VirtualHost *:80>
    ServerName git.example.com

    ProxyPreserveHost On
    ProxyRequests off
    AllowEncodedSlashes NoDecode
    ProxyPass /forgejo http://127.0.0.1:3000/ nocanon # Change /forgejo here to your desired subpath.
</VirtualHost>

Make sure to set the Forgejo ROOT_URL configuration key to the URL with the subpath, otherwise links generated by Forgejo will be broken.

HTTPS

When using a reverse proxy, it’s usually easier to let the proxy handle HTTPS. It’s easy to set up HTTPS on apache.

HTTPS with Certbot

To set up HTTPS with Certbot, first set up an HTTP reverse proxy with the configuration above and ensure that it works as expected. To use HTTPS you need to have a domain name.

Then, install certbot. When running certbot, select the domain name that your Forgejo instance is hosted under, and choose automatic installation. This should automatically set up HTTPS on port 443 and a redirect on the old port 80.

You may wish to change the ROOT_URL configuration key to the HTTPS protocol so links generated by Forgejo automatically use HTTPS.

HTTPS with manually installed certificates

If you have obtained certificates from elsewhere or have chosen not to let certbot automatically install them, make the following changes to the configuration file:

Change the listening ports

Change <VirtualHost *:80> to <VirtualHost *:443>.

Add the SSL certificate information

Generate an SSL configuration at mozilla, and add the SSL parameters to your configuration file. Make sure to replace the paths in the example with paths to your certificate files.

Add a redirect from HTTP

Outside the VirtualHost *:443, add this configuration:

<VirtualHost *:80>
    ServerName git.example.com

    RewriteEngine on
    RewriteCond %{SERVER_NAME} =git.example.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

This will redirect anyone visiting the HTTP site to the HTTPS site.

Proxy Authentication

Forgejo supports Reverse Proxy Header authentication, it will read headers as a trusted login user name or user email address. This hasn’t been enabled by default, you can enable it with

[service]
ENABLE_REVERSE_PROXY_AUTHENTICATION = true

The default login user name is in the X-WEBAUTH-USER header, you can change it via changing [security].REVERSE_PROXY_AUTHENTICATION_USER in app.ini. If the user doesn’t exist, you can enable automatic registration with ENABLE_REVERSE_PROXY_AUTO_REGISTRATION=true.

The default login user email is X-WEBAUTH-EMAIL, you can change it via changing [security].REVERSE_PROXY_AUTHENTICATION_EMAIL in app.ini, this could also be disabled with ENABLE_REVERSE_PROXY_EMAIL

If set ENABLE_REVERSE_PROXY_FULL_NAME=true, a user full name expected in X-WEBAUTH-FULLNAME will be assigned to the user when auto creating the user. You can also change the header name with [security].REVERSE_PROXY_AUTHENTICATION_FULL_NAME.

You can also limit the reverse proxy’s IP address range with [security].REVERSE_PROXY_TRUSTED_PROXIES which default value is 127.0.0.0/8,::1/128. By [security].REVERSE_PROXY_LIMIT, you can limit trusted proxies level.

Notice: Reverse Proxy Auth doesn’t support the API. You still need an access token or basic auth to make API requests.

Docker / Container Registry

The container registry uses a fixed sub-path /v2 which can’t be changed. Even if you deploy Gitea with a different sub-path, /v2 will be used by the docker client. Therefore you may need to add an additional route to your reverse proxy configuration.