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.
Setelah itu akan muncul opsi platform yang dapat digunakan beserta perintah untuk register 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:
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
Referensi: