GitLab Community Edition — instalacja na VPS
Opublikowano: 10 kwietnia 2026 · Kategoria: VPS i serwery
GitLab Community Edition to kompletna platforma DevOps open-source: Git hosting, issue tracker, CI/CD pipelines, Container Registry, Package Registry i wiele więcej — wszystko self-hosted na Twoim VPS. W porównaniu z GitHub czy GitLab.com daje pełną kontrolę nad kodem i danymi. Ten artykuł przeprowadzi Cię przez instalację, konfigurację CI/CD i backup.
1. Instalacja GitLab CE (metoda Omnibus)
Metoda Omnibus to oficjalnie rekomendowana instalacja — jeden pakiet zawiera wszystkie zależności (PostgreSQL, Redis, Nginx, Puma, Sidekiq, Gitaly). Nie musisz nic konfigurować osobno. Wymagania minimalne: 4 GB RAM, 4 vCPU, 20 GB SSD.
# Ubuntu 22.04 / 24.04 # 1. Zainstaluj zaleznosci sudo apt update && sudo apt install -y curl ca-certificates postfix # 2. Dodaj repozytorium GitLab curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash # 3. Ustaw URL GitLab i zainstaluj (ZMIEN na swoj URL!) sudo EXTERNAL_URL="https://gitlab.example.com" apt install gitlab-ce -y # Instalacja trwa kilka minut — konfiguruje PostgreSQL, Redis, Nginx... # 4. Sprawdz status wszystkich komponentow sudo gitlab-ctl status # 5. Pobierz haslo root (generowane przy instalacji) sudo cat /etc/gitlab/initial_root_password # Haslo wazne przez 24h — zmien je od razu! # 6. Zaloguj sie: https://gitlab.example.com # Login: root, Haslo: z kroku 5 # Jesli instalujesz za istniejacym Nginx (reverse proxy): # W gitlab.rb ustaw: # external_url 'http://gitlab.example.com' # http (bez SSL) # nginx['listen_port'] = 8080 # nginx['listen_https'] = false
2. Konfiguracja gitlab.rb — kluczowe ustawienia
# /etc/gitlab/gitlab.rb — główny plik konfiguracyjny # Po każdej zmianie: sudo gitlab-ctl reconfigure # === PODSTAWOWE USTAWIENIA === external_url 'https://gitlab.example.com' # Certyfikat SSL Let's Encrypt (automatyczny jesli external_url = https://) letsencrypt['enable'] = true letsencrypt['email'] = '[email protected]' letsencrypt['auto_renew'] = true letsencrypt['auto_renew_hour'] = 3 # === EMAIL (SMTP) === gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.gmail.com" gitlab_rails['smtp_port'] = 587 gitlab_rails['smtp_user_name'] = "[email protected]" gitlab_rails['smtp_password'] = "app_password" gitlab_rails['smtp_domain'] = "gmail.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['gitlab_email_from'] = '[email protected]' # === OPTYMALIZACJA RAM (dla VPS z 4-8 GB) === # Ogranicz Puma (aplikacja Ruby) puma['worker_processes'] = 2 puma['min_threads'] = 1 puma['max_threads'] = 4 # Ogranicz Sidekiq (jobs) sidekiq['max_concurrency'] = 5 # Ogranicz PostgreSQL postgresql['shared_buffers'] = "256MB" postgresql['max_connections'] = 50 # Ogranicz Gitaly gitaly['configuration'] = { git: { use_bundled_git: true, }, } # Wylacz Prometheus jesli nie potrzebujesz (oszczedza RAM) prometheus_monitoring['enable'] = false alertmanager['enable'] = false node_exporter['enable'] = false redis_exporter['enable'] = false postgres_exporter['enable'] = false gitlab_exporter['enable'] = false # === BACKUPY === gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" gitlab_rails['backup_keep_time'] = 604800 # 7 dni (w sekundach) # === SSH === gitlab_rails['gitlab_shell_ssh_port'] = 22 # Po zmianach: sudo gitlab-ctl reconfigure
3. GitLab Runner — instalacja i rejestracja
# === INSTALACJA RUNNERA ===
# Najlepiej na osobnej maszynie (VPS) — nie na tym samym co GitLab
# Dodaj repozytorium GitLab Runner
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
sudo apt install gitlab-runner -y
# Alternatywnie przez Docker:
docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
# === REJESTRACJA RUNNERA ===
# Pobierz token: GitLab → Admin → CI/CD → Runners → New instance runner
# lub dla projektu: Settings → CI/CD → Runners → New project runner
sudo gitlab-runner register
# Interaktywna rejestracja zapyta o:
# - GitLab instance URL: https://gitlab.example.com
# - Registration token: glrt-xxxxxxxxxxxx
# - Runner name: docker-runner-1
# - Executor: docker (rekomendowany)
# - Default Docker image: docker:24-dind lub alpine:latest
# Nieinteraktywna rejestracja:
sudo gitlab-runner register \
--non-interactive \
--url "https://gitlab.example.com" \
--token "glrt-xxxxxxxxxxxx" \
--name "docker-runner-1" \
--executor "docker" \
--docker-image "alpine:latest" \
--docker-volumes "/var/run/docker.sock:/var/run/docker.sock"
# Sprawdz status i lista runnerow:
sudo gitlab-runner status
sudo gitlab-runner list
# Runner config: /etc/gitlab-runner/config.toml 4. Pipeline CI/CD — przykładowy .gitlab-ci.yml
# .gitlab-ci.yml — w root repo
# Kompletny pipeline: test → build → deploy
stages:
- test
- build
- deploy
# Globalne zmienne
variables:
DOCKER_REGISTRY: registry.gitlab.example.com
IMAGE_NAME: ${DOCKER_REGISTRY}/${CI_PROJECT_PATH}
IMAGE_TAG: ${CI_COMMIT_SHORT_SHA}
# Cache node_modules miedzy jobami
.node_cache:
cache:
key: "${CI_COMMIT_REF_SLUG}"
paths:
- node_modules/
# ===== STAGE: TEST =====
test:
stage: test
image: node:20-alpine
extends: .node_cache
script:
- npm ci
- npm run lint
- npm test
coverage: '/Statements.*?(\d+(?:\.\d+)?)%/'
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: coverage/cobertura-coverage.xml
only:
- merge_requests
- main
# ===== STAGE: BUILD =====
build:
stage: build
image: docker:24
services:
- docker:24-dind
variables:
DOCKER_TLS_CERTDIR: "/certs"
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t ${IMAGE_NAME}:${IMAGE_TAG} -t ${IMAGE_NAME}:latest .
- docker push ${IMAGE_NAME}:${IMAGE_TAG}
- docker push ${IMAGE_NAME}:latest
only:
- main
# ===== STAGE: DEPLOY =====
deploy:
stage: deploy
image: alpine:latest
environment:
name: production
url: https://example.com
before_script:
- apk add --no-cache openssh-client
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh && chmod 700 ~/.ssh
- ssh-keyscan -H $DEPLOY_HOST >> ~/.ssh/known_hosts
script:
- ssh deploy@$DEPLOY_HOST "
cd /opt/myapp &&
docker pull ${IMAGE_NAME}:${IMAGE_TAG} &&
docker compose up -d --no-deps app &&
docker image prune -f
"
only:
- main
when: manual # Wymaga recznego potwierdzenia w UI 5. Backup i restore
# ===== BACKUP =====
# Natychmiastowy backup (repozytoria + baza + attachmenty)
sudo gitlab-backup create
# Z timestamp w nazwie pliku:
sudo gitlab-backup create BACKUP=mybackup_$(date +%Y%m%d)
# Lokalizacja backupow:
ls -la /var/opt/gitlab/backups/
# WAZNE: Backupuj tez te pliki osobno! (nie sa w standardowym backupie)
sudo cp /etc/gitlab/gitlab.rb /backup/
sudo cp /etc/gitlab/gitlab-secrets.json /backup/
# gitlab-secrets.json zawiera klucze szyfrowania — bez niego restore nie zadziala!
# Automatyczny backup przez cron (codziennie o 2:00)
# sudo crontab -e
0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1 2>> /var/log/gitlab-backup.log
# Transfer backupu na zewnetrzny storage (S3, rsync):
# W gitlab.rb:
# gitlab_rails['backup_upload_connection'] = { 'provider' => 'AWS', ... }
# gitlab_rails['backup_upload_remote_directory'] = 'my-backup-bucket'
# ===== RESTORE =====
# 1. Zainstaluj identyczna wersje GitLab (!) na nowym serwerze
# 2. Skopiuj plik backupu do /var/opt/gitlab/backups/
# 3. Skopiuj gitlab.rb i gitlab-secrets.json do /etc/gitlab/
# 4. Zatrzymaj uslugi zapisujace dane
sudo gitlab-ctl stop puma
sudo gitlab-ctl stop sidekiq
# 5. Przywroc backup (TIMESTAMP z nazwy pliku)
sudo gitlab-backup restore BACKUP=1234567890_gitlab_backup.tar
# 6. Uruchom ponownie i sprawdz
sudo gitlab-ctl restart
sudo gitlab-rake gitlab:check SANITIZE=true
sudo gitlab-rake gitlab:doctor:secrets Porównanie GitLab CE z Gitea
| Cecha | GitLab CE | Gitea |
|---|---|---|
| RAM (minimum) | 4 GB (8+ zalecane) | 256 MB (1 GB zalecane) |
| CI/CD | Wbudowany GitLab CI — bardzo zaawansowany | Gitea Actions (GitHub Actions kompatybilny) |
| Container Registry | Wbudowany (per projekt) | Brak natywnego |
| Security scanning | SAST, DAST, Dependency Scanning | Brak |
| Issue tracker | Pełny (board, epics, roadmap) | Podstawowy |
| GitLab Pages | Wbudowane | Brak |
| Złożoność | Wysoka | Niska |
| Dla kogo | Zespoły DevOps, firmy, kompleksowe projekty | Homelaby, małe projekty, ograniczone zasoby |