Skip to main content
  1. Posts/

Membangun Git Server Sendiri dengan Gitea

·4 mins·
gitea git gitea
Table of Contents

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
Jika server Anda memiliki user dengan UID 1000, sebaiknya hapus user tersebut terlebih dahulu dan pastikan user itu tidak digunakan untuk login ke server.

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.

Setup Gitea

Pada tahap setup, Anda dapat membuat akun administrator.

Create Admin Account

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

Setup Selesai

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.

Create Token

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} dan GITEA_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:

Runner Terdaftar

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

docker compose restart

Referensi:

Related

Menjalankan GitHub Actions Secara Lokal dengan Act
·1 min
git git
Configuring Git Push Notifications on Telegram
·2 mins
git git
Auto Deployment on cPanel Using Github Actions
·2 mins
cpanel cpanel git
Implementasi Git Deployment di cPanel
·3 mins
cpanel cpanel git
Memahami Format XML Domain Libvirt
·41 mins
libvirt libvirt kvm
Setup WireGuard VPN
·3 mins
wireguard wireguard vpn