Skip to main content
  1. Posts/

Membangun Git Server Sendiri dengan GitLab

·4 mins·
gitlab git gitlab
Table of Contents

GitLab adalah platform DevOps berbasis Git yang memungkinkan otomatisasi pipeline, kolaborasi antar tim, pengelolaan repositori kode, hingga kontrol keamanan yang granular.

Dengan membangun Git server sendiri akan memberikan otonomi penuh atas repositori kode, database, maupun kebijakan akses pengguna. Semua data tetap berada di lingkungan Anda, sehingga risiko kebocoran atau akses tidak sah oleh pihak ketika seperti penyedia cloud dapat diminimalisir

Persiapan
#

1. 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.

2. Menginstal Docker
#

Gunakan perintah berikut untuk menginstal Docker:

curl -L get.docker.com | sh

Setelah instalasi selesai, verifikasi bahwa Docker telah terinstal dengan menjalankan:

docker version

Jika informasi versi Docker muncul, berarti instalasi berhasil.

3. Firewall untuk HTTP/HTTPS + SSH
#

sudo ufw allow http
sudo ufw allow https
sudo ufw allow OpenSSH
sudo ufw allow 2222/tcp
sudo ufw status

Instalasi GitLab
#

1. Membuat Folder GitLab
#

Buat folder untuk menyimpan file docker-compose.yml:

mkdir gitlab-docker
cd gitlab-docker

2. Menyiapkan Docker Compose
#

Buat file docker-compose.yml dan isi dengan konfigurasi berikut:

services:
  gitlab:
    image: gitlab/gitlab-ce:18.6.2-ce.0
    deploy:
      mode: replicated
      replicas: 1
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: '${CPU_LIMIT:-2.0}'
          memory: ${MEMORY_LIMIT:-8192M}
    shm_size: '256m'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://${DOMAIN_GITLAB}'
        gitlab_rails['backup_keep_time'] = 604800
        gitlab_rails['trusted_proxies'] = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']
        gitlab_rails['initial_root_password'] = ENV['GITLAB_ROOT_PASSWORD']
        nginx['listen_port'] = 80
        nginx['listen_https'] = false
        nginx['real_ip_trusted_addresses'] = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']
        nginx['real_ip_header'] = 'X-Forwarded-For'
        nginx['real_ip_recursive'] = 'on'
        prometheus_monitoring['enable'] = false        
    ports:
      - '22:22'
    volumes:
      - '$GITLAB_HOME/config:/etc/gitlab'
      - '$GITLAB_HOME/logs:/var/log/gitlab'
      - '$GITLAB_HOME/data:/var/opt/gitlab'
    networks:
      - internal
      - external
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.${APP_NAME}.rule=Host(`${DOMAIN_GITLAB}`)"
      - "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=80"
      # Middleware keamanan tambahan
      - "traefik.http.routers.${APP_NAME}.middlewares=security-headers@file,compress@file"
      - "traefik.docker.network=${NETWORK}"
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
        labels: "service,environment"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/-/health"]
      interval: 60s
      timeout: 30s
      retries: 3
      start_period: 30s

  gitlab-runner:
    image: gitlab/gitlab-runner:alpine
    deploy:
      mode: replicated
      replicas: 1
      restart_policy:
        condition: on-failure
    depends_on:
      gitlab:
        condition: service_healthy
    volumes:
      - '$GITLAB_HOME/runner/config:/etc/gitlab-runner'
      - '/var/run/docker.sock:/var/run/docker.sock'
    networks:
      - internal
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
        labels: "service,environment"

  traefik:
    image: traefik:latest
    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
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
        labels: "service,environment"

networks:
  internal:
    name: ${APP_NAME}
  external:
    external: true
    name: ${NETWORK}

Selanjutnya tambahkan .env seperti contoh berikut.

GITLAB_HOME=/root/gitlab-docker
APP_NAME=gitlab
NETWORK=traefik
CPU_LIMIT=7.5
MEMORY_LIMIT=14336M
DOMAIN_GITLAB=gitlab.example.com
GITLAB_ROOT_PASSWORD=securepass
CERTRESOLVER=letsencrypt
CLOUDFLARE_EMAIL=xxx
CLOUDFLARE_API_KEY=xxx

Untuk konfigurasi traefik dapat Anda lihat di repo GitHub

3. Menjalankan GitLab
#

Setelah konfigurasi selesai, jalankan GitLab menggunakan perintah:

docker compose up -d

4. Akses GitLab Melalui Browser
#

Buka browser dan akses http://gitlab.example.com, kemudian login menggunakan user root dan password sesuai env GITLAB_ROOT_PASSWORD

Register GitLab Runner
#

1. Create instance runner
#

Buat instance runner melalui Admin -> CI/CD -> Runners atau bisa melalui URL berikut

https://gitlab.example.com/admin/runners

Kemudian klik tombol Create instance runner lalu beri nama tags.

Create runner

Setelah itu akan muncul opsi platform yang dapat digunakan beserta perintah untuk register runner

token runner

2. Register GitLab Runner
#

Masuk ke container gitlab runner.

docker compose exec -it gitlab-runner bash

Lalu jalankan perintah berikut untuk register runner.

gitlab-runner register \
 --url https://gitlab.example.com \
 --token glrt-xxx

Setelah dijalankan, Anda dapat menentuka executor gitlab runner.

Runtime platform                                    arch=amd64 os=linux pid=158 revision=901991dd version=18.7.0
Running in system-mode.

Enter the GitLab instance URL (for example, https://gitlab.com/):
[https://gitlab.example.com]:
Verifying runner... is valid                        correlation_id=01KDGA6QTHQG57VFAANX10C9FS runner=YEI4ncIfx
Enter a name for the runner. This is stored only in the local config.toml file:
[38a7c4998075]: gitlab-runnner
Enter an executor: custom, shell, ssh, docker, docker-windows, kubernetes, instance, parallels, virtualbox, docker+machine, docker-autoscaler:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"

3. Verifikasi Registrasi Runner
#

Jika registrasi runner berhasil, runner akan muncul di daftar seperti gambar berikut:

Runner Terdaftar

Best Practices
#

Aktifkan rate limits untuk request unauthenticated melalui Admin area -> Network atau bisa melalui URL berikut.

https://gitlab.example.com/admin/application_settings/network

Kemudian search unauth lalu aktifkan semua checklist yang tersedia

rate unauth

Referensi:

Related

Membangun Git Server Sendiri dengan Gitea
·5 mins
gitea git gitea
Git Commands Cheat Sheet
·5 mins
git git
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