Deploying Forgejo Lightweight Git Server on Ubuntu 24.04

Forgejo is a community-managed, lightweight Git server forked from Gitea, offering repository hosting, code review, issue tracking, and CI/CD with a strong focus on open governance. This guide deploys Forgejo with a MariaDB backend using Docker Compose, with Traefik handling automatic HTTPS. By the end, you’ll have a self-hosted Forgejo instance served securely at your domain.

Set Up the Directory Structure

1. Create the project directory structure:

$ mkdir -p ~/forgejo/{data,db,letsencrypt}
$ cd ~/forgejo

2. Create the environment file:

$ nano .env
FORGEJO_DB_USER=forgejo
FORGEJO_DB_PASS=STRONG_APP_PASSWORD
MYSQL_ROOT_PASS=STRONG_MYSQL_ROOT_PASSWORD
FORGEJO_DB_NAME=forgejodb
FORGEJO_DOMAIN=forgejo.example.com
LETSENCRYPT_EMAIL=admin@example.com

Deploy with Docker Compose

1. Add your user to the Docker group:

$ sudo usermod -aG docker $USER
$ newgrp docker

2. Create the Docker Compose manifest:

$ nano docker-compose.yml
services:
  traefik:
    image: traefik:latest
    container_name: traefik
    restart: unless-stopped
    environment:
      DOCKER_API_VERSION: "1.44"
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
      - "--certificatesresolvers.le.acme.httpchallenge=true"
      - "--certificatesresolvers.le.acme.httpchallenge.entrypoint=web"
      - "--certificatesresolvers.le.acme.email=${LETSENCRYPT_EMAIL}"
      - "--certificatesresolvers.le.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt

  db:
    image: mariadb:latest
    container_name: forgejo-db
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASS}
      - MYSQL_DATABASE=${FORGEJO_DB_NAME}
      - MYSQL_USER=${FORGEJO_DB_USER}
      - MYSQL_PASSWORD=${FORGEJO_DB_PASS}
    volumes:
      - ./db:/var/lib/mysql

  forgejo:
    image: codeberg.org/forgejo/forgejo:latest
    container_name: forgejo
    restart: unless-stopped
    depends_on:
      - db
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - FORGEJO__database__DB_TYPE=mysql
      - FORGEJO__database__HOST=db:3306
      - FORGEJO__database__NAME=${FORGEJO_DB_NAME}
      - FORGEJO__database__USER=${FORGEJO_DB_USER}
      - FORGEJO__database__PASSWD=${FORGEJO_DB_PASS}
      - FORGEJO__server__ROOT_URL=https://${FORGEJO_DOMAIN}
    volumes:
      - ./data:/data
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.forgejo.rule=Host(`${FORGEJO_DOMAIN}`)"
      - "traefik.http.routers.forgejo.entrypoints=websecure"
      - "traefik.http.routers.forgejo.tls=true"
      - "traefik.http.routers.forgejo.tls.certresolver=le"
      - "traefik.http.services.forgejo.loadbalancer.server.port=3000"

3. Start the services:

$ docker compose up -d

4. Verify the services are running:

$ docker compose ps

Complete the Installation

  1. Open https://forgejo.example.com in a browser to load the installation page.
  2. Leave the database settings at their defaults — they match the Compose environment.
  3. Configure the administrator account with your username, password, and email.
  4. Click Install Forgejo to finalize the setup.

Next Steps

Forgejo is running and served securely over HTTPS. From here you can:

  • Create organizations and repositories, and invite collaborators
  • Enable Forgejo Actions for built-in CI/CD pipelines
  • Configure SMTP for notifications and SSH for Git over SSH

For the full guide with additional tips, visit the original article on Vultr Docs.