Gitea adalah layanan manajemen kode sumber (source code management) berbasis Git, mirip seperti GitHub, GitLab, atau Bitbucket. Bedanya, Gitea bersifat ringan, open-source, dan dapat di-hosting secara mandiri (self-hosted). Gitea bisa diinstal menggunakan binary, Docker, atau package manager, serta mendukung berbagai platform seperti Windows, macOS, Linux, ARM, dan lainnya.
Dalam panduan ini, kita akan menginstal Gitea menggunakan Docker, agar memudahkan instalasi runner untuk menjalankan action pipelines.
Persiapan #
1. Membuat User Git #
Buat user baru khusus untuk Git dengan perintah berikut:
adduser --shell /bin/bash --disabled-password --home /home/git git
2. Mengubah Port Default SSH #
Untuk menghindari konflik, ubah port SSH standar sehingga port 22 dapat digunakan untuk layanan Git. Edit konfigurasi SSH:
nano /etc/ssh/sshd_config
Cari baris Port
dan ubah nilainya, misalnya menjadi:
Port 2222
Simpan perubahan dan restart layanan SSH agar konfigurasi baru diterapkan.
Instalasi Docker #
1. Menginstal Docker #
Gunakan perintah berikut untuk menginstal Docker:
curl -L get.docker.com | sh
2. Verifikasi Instalasi #
Setelah instalasi selesai, verifikasi bahwa Docker telah terinstal dengan menjalankan:
docker version
Jika informasi versi Docker muncul, berarti instalasi berhasil.
Instalasi Gitea #
1. Membuat Folder Gitea #
Buat folder untuk menyimpan file docker-compose.yml
:
mkdir gitea
cd gitea
2. Menyiapkan Docker Compose #
Buat file docker-compose.yml
dan isi dengan konfigurasi berikut:
services:
traefik:
image: traefik:latest # Versi spesifik
container_name: traefik
environment:
- CF_API_EMAIL=${CLOUDFLARE_EMAIL}
- CF_DNS_API_TOKEN=${CLOUDFLARE_API_KEY}
command:
- "--configFile=/etc/traefik/traefik.yml"
ports:
- "80:80"
- "443:443"
volumes:
- ./traefik/traefik.yml:/etc/traefik/traefik.yml
- ./traefik/custom:/etc/traefik/custom
- ./letsencrypt:/letsencrypt
- /var/run/docker.sock:/var/run/docker.sock:ro
restart: unless-stopped
networks:
- external
security_opt:
- no-new-privileges:true
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.rule=Host(`${DOMAIN_TRAEFIK}`)"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.routers.traefik.entrypoints=websecure"
- "traefik.http.routers.traefik.tls.certresolver=${CERTRESOLVER}"
- "traefik.http.routers.traefik.middlewares=traefik-auth"
- "traefik.http.middlewares.traefik-auth.basicauth.users=${TRAEFIK_PASSWORD}"
gitea:
image: docker.gitea.com/gitea:1.23.6
container_name: gitea
environment:
USER_UID: 1000
USER_GID: 1000
GITEA__database__DB_TYPE: postgres
GITEA__database__HOST: db:5432
GITEA__database__NAME: ${DB_NAME}
GITEA__database__USER: ${DB_USER}
GITEA__database__PASSWD: ${DB_PASSWORD}
restart: always
networks:
- internal
- external
volumes:
- ./gitea/ssh:/data/ssh
- /home/git/.ssh:/data/git/.ssh
- /home/git/repositories:/data/git/repositories
- /home/git/lfs:/data/git/lfs
- /home/git/gitea:/data/gitea
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "22:22"
depends_on:
- db
labels:
- "traefik.enable=true"
- "traefik.http.routers.${APP_NAME}.rule=Host(`${GITEA_DOMAIN}`)"
- "traefik.http.routers.${APP_NAME}.entrypoints=websecure"
- "traefik.http.routers.${APP_NAME}.service=${APP_NAME}"
- "traefik.http.routers.${APP_NAME}.tls.certresolver=${CERTRESOLVER}"
- "traefik.http.services.${APP_NAME}.loadbalancer.server.port=3000"
# Middleware keamanan tambahan
- "traefik.http.routers.${APP_NAME}.middlewares=security-headers@file,compress@file"
- "traefik.docker.network=${NETWORK}"
db:
image: postgres:14
container_name: gitea_db
restart: always
shm_size: 128mb
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_NAME}
networks:
- internal
volumes:
- ./postgres:/var/lib/postgresql/data
runner:
image: gitea/act_runner
container_name: gitea_runner
links:
- docker-in-docker
restart: unless-stopped
privileged: true
depends_on:
gitea:
condition: service_started
docker-in-docker:
condition: service_started
volumes:
- ./data/config.yaml:/config.yaml
- ./data/act_runner:/data
environment:
GITEA_INSTANCE_URL: https://${GITEA_DOMAIN}
GITEA_RUNNER_REGISTRATION_TOKEN: ${RUNNER_TOKEN}
DOCKER_HOST: tcp://docker-in-docker:2375
CONFIG_FILE: /config.yaml
networks:
- internal
docker-in-docker:
image: docker:dind
container_name: docker_dind
cap_add:
- SYS_ADMIN
- NET_ADMIN
privileged: true
ulimits:
nofile: 65536
nproc: 65536
core: 0
pids_limit: 65536
oom_score_adj: -500
command:
- dockerd
- -H
- tcp://0.0.0.0:2375
- --tls=false
restart: unless-stopped
volumes:
- dind-data:/var/lib/docker
environment:
DOCKER_HOST: tcp://docker-in-docker:2375
networks:
- internal
volumes:
dind-data:
networks:
internal:
name: ${APP_NAME}
external:
external: true
name: ${NETWORK}
Catatan:
Jangan lupa mengganti${GITEA_DOMAIN}
dan${RUNNER_TOKEN}
sesuai dengan server Anda.
Jika memungkinkan, disarankan untuk memisahkan runner dan docker-in-docker ke server atau mesin berbeda dari Gitea.
Tujuannya adalah untuk menjaga performa Gitea tetap optimal, terutama saat runner menjalankan proses build yang berat.
Selanjutnya tambahkan .env
seperti contoh berikut.
# Trefik
## htpasswd -nb admin secure_password | sed -e s/\\$/\\$\\$/g
TRAEFIK_PASSWORD=admin:$$apr1$$KNBNzB4i$$HYhKfWmaHrFTAtcR4eJmX.
DOMAIN_TRAEFIK=traefik.local
CERTRESOLVER=cloudflare
[email protected]
CLOUDFLARE_API_KEY=XXXX
APP_NAME=gitea
NETWORK=traefik
# Gitea
GITEA_DOMAIN=gitea.yourdomain.com
RUNNER_TOKEN=XXXX
# Database
DB_USER=gitea
DB_PASSWORD=gitea
DB_NAME=gitea
Untuk konfigurasi traefik dapat Anda lihat di repo GitHub
3. Menjalankan Gitea #
Setelah konfigurasi selesai, jalankan Gitea menggunakan perintah:
docker compose up -d
4. Setup Gitea Melalui Browser #
Buka browser dan akses http://<IP_or_domain>
, kemudian ikuti langkah-langkah setup Gitea.

Pada tahap setup, Anda dapat membuat akun administrator.

Setelah proses instalasi selesai, Anda sudah bisa mulai membuat repository pertama Anda.

Instalasi Gitea Runner #
1. Mendapatkan Registration Token #
Untuk mendapatkan Registration Token, buka URL berikut melalui browser:
http://<IP_or_domain>/-/admin/actions/runners
Kemudian klik tombol Create new Runner.

Salin token yang telah dibuat.
2. Menambahkan Token ke Docker Compose #
Tambahkan token tersebut ke bagian environment pada service runner
di file docker-compose.yml
. Contohnya:
environment:
- GITEA_INSTANCE_URL=https://${GITEA_DOMAIN}
- DOCKER_HOST=unix:///var/run/docker.sock
- GITEA_RUNNER_REGISTRATION_TOKEN=88EineyRnUIbT6IN1YDoNB1KBq2eL3QhxZLMqPaL
Catatan:
Pastikan Anda mengganti${GITEA_DOMAIN}
danGITEA_RUNNER_REGISTRATION_TOKEN
dengan nilai yang sesuai.
3. Generate config.yaml #
Generate config.yaml dengan perintah berikut
docker compose exec runner act_runner generate-config > data/config.yaml
Edit config.yaml
pada bagian berikut
runner:
envs:
DOCKER_HOST: tcp://docker-in-docker:2375
container:
network: "host"
privileged: true
docker_host: "tcp://docker-in-docker:2375"
4. Restart Gitea #
Setelah menambahkan token di file docker-compose.yml
, restart Gitea dengan perintah:
docker compose down
docker compose up -d
5. Verifikasi Registrasi Runner #
Jika token berhasil diregistrasikan, runner akan muncul di daftar seperti gambar berikut:

Jika runner belum muncul, Anda bisa mencoba me-restart container runner:
docker compose restart
Referensi: