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
- Open
https://forgejo.example.comin a browser to load the installation page. - Leave the database settings at their defaults — they match the Compose environment.
- Configure the administrator account with your username, password, and email.
- 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.
Top comments (0)