GitLab Self-Hosting: Der komplette Guide für deine eigene DevOps-Plattform
Back
Willkommen, DevOps-Enthusiast! Du möchtest GitLab auf deinem eigenen Server hosten – die komplette CI/CD-Plattform unter deiner Kontrolle? Dieser Guide führt dich durch die komplette Installation, Konfiguration und Optimierung deiner eigenen GitLab-Instanz.
Warum GitLab self-hosted? Die Vorteile im Überblick
GitLab ist mehr als nur Git-Hosting. Es ist eine vollständige DevOps-Plattform mit:
-
✅ Git Repository Management
-
✅ CI/CD Pipelines
-
✅ Container Registry
-
✅ Issue Tracking & Wiki
-
✅ Code Review Tools
-
✅ Security Scanning
-
✅ Package Registry
Gründe für Self-Hosting:
-
100% Datenkontrolle – Dein Code bleibt auf deinen Servern
-
Keine Nutzungslimits – Unbegrenzte CI/CD-Minuten, Benutzer, Repositorys
-
Volle Customization – Anpassung an deine Workflows
-
Kostenkontrolle – Einmalige Investition statt monatlicher Gebühren
-
Offline-Fähigkeit – Lokale Entwicklung ohne Internet
-
Integration – Nahtlos mit deiner bestehenden Infrastruktur
Kapitel 1: Vorbereitung & Systemanforderungen
Hardware-Anforderungen
Minimal (für 10-20 Nutzer):
-
CPU: 4 Kerne
-
RAM: 8 GB (4 GB für GitLab + 4 GB für andere Services)
-
Speicher: 50 GB SSD (plus Backup-Space)
-
Bandwidth: 100 Mbps
Empfohlen (für Produktivumgebung):
-
CPU: 8+ Kerne
-
RAM: 16+ GB
-
Speicher: 200+ GB SSD (RAID 10 empfohlen)
-
Bandwidth: 1 Gbps
-
Backup: Separate Backup-Festplatte/Server
Software-Voraussetzungen
Betriebssystem (offiziell unterstützt):
-
Ubuntu 20.04/22.04 LTS (empfohlen)
-
Debian 11/12
-
CentOS 8/RHEL 8
-
OpenSUSE 15+
Netzwerk-Vorbereitung:
bash
# DNS-Einträge vorbereiten gitlab.deine-domain.de. A deine-server-ip registry.deine-domain.de. CNAME gitlab.deine-domain.de. pages.deine-domain.de. CNAME gitlab.deine-domain.de.
Kapitel 2: Installation – Der komplette Setup
Methode 1: Omnibus Package (Empfohlen)
1. System vorbereiten (Ubuntu 22.04 Beispiel):
bash
# System updaten sudo apt update && sudo apt upgrade -y # Benötigte Pakete installieren sudo apt install -y curl openssh-server ca-certificates tzdata perl
2. Postfix für Email konfigurieren (optional):
bash
sudo apt install -y postfix # Wähle während Installation: "Internet Site" # Domain eingeben: deine-domain.de
3. GitLab Repository hinzufügen:
bash
# Trusted Key hinzufügen curl -fsSL https://packages.gitlab.com/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/gitlab.gpg # Repository hinzufügen echo "deb [signed-by=/etc/apt/keyrings/gitlab.gpg] https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gitlab.list
4. GitLab installieren:
bash
sudo apt update sudo apt install gitlab-ce
Methode 2: Docker (Für skalierbare Umgebungen)
docker-compose.yml:
yaml
version: '3.8'
services:
gitlab:
image: gitlab/gitlab-ce:latest
container_name: gitlab
restart: unless-stopped
hostname: 'gitlab.deine-domain.de'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.deine-domain.de'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
gitlab_rails['time_zone'] = 'Europe/Berlin'
gitlab_rails['gitlab_email_from'] = 'gitlab@deine-domain.de'
ports:
- "80:80"
- "443:443"
- "2222:22"
volumes:
- gitlab_config:/etc/gitlab
- gitlab_logs:/var/log/gitlab
- gitlab_data:/var/opt/gitlab
networks:
- gitlab_network
volumes:
gitlab_config:
gitlab_logs:
gitlab_data:
networks:
gitlab_network:
driver: bridge
Methode 3: Helm auf Kubernetes (Enterprise)
values.yaml für GitLab:
yaml
global:
hosts:
domain: deine-domain.de
ingress:
configureCertmanager: true
minio:
enabled: false
registry:
bucket: gitlab-registry-storage
certmanager-issuer:
email: admin@deine-domain.de
gitlab:
gitlab-exporter:
enabled: true
Kapitel 3: Grundkonfiguration
1. Wichtige Konfigurationsdatei: /etc/gitlab/gitlab.rb
ruby
# Basic Configuration external_url 'https://gitlab.deine-domain.de' gitlab_rails['time_zone'] = 'Europe/Berlin' # Email Configuration gitlab_rails['gitlab_email_enabled'] = true gitlab_rails['gitlab_email_from'] = 'gitlab@deine-domain.de' gitlab_rails['gitlab_email_display_name'] = 'GitLab' gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.deine-domain.de" gitlab_rails['smtp_port'] = 587 gitlab_rails['smtp_user_name'] = "gitlab@deine-domain.de" gitlab_rails['smtp_password'] = "dein-passwort" gitlab_rails['smtp_domain'] = "deine-domain.de" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = false # Security gitlab_rails['initial_root_password'] = 'erstes-root-passwort' gitlab_rails['gitlab_default_can_create_group'] = false gitlab_rails['signup_enabled'] = false # Registrierung deaktivieren # Performance puma['worker_processes'] = 4 sidekiq['concurrency'] = 10 postgresql['max_worker_processes'] = 8 # Backup gitlab_rails['backup_keep_time'] = 604800 # 7 Tage
2. Konfiguration anwenden:
bash
sudo gitlab-ctl reconfigure
3. SSL-Zertifikat einrichten:
Mit Let's Encrypt (automatisch):
ruby
# In gitlab.rb hinzufügen letsencrypt['enable'] = true letsencrypt['contact_emails'] = ['admin@deine-domain.de'] letsencrypt['auto_renew'] = true letsencrypt['auto_renew_hour'] = 0 letsencrypt['auto_renew_minute'] = 30 letsencrypt['auto_renew_day_of_month'] = "*/7"
Manuelles Zertifikat:
bash
# Zertifikate kopieren sudo mkdir -p /etc/gitlab/ssl sudo chmod 700 /etc/gitlab/ssl sudo cp dein-cert.crt /etc/gitlab/ssl/gitlab.deine-domain.de.crt sudo cp dein-key.key /etc/gitlab/ssl/gitlab.deine-domain.de.key # In gitlab.rb konfigurieren nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.deine-domain.de.crt" nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.deine-domain.de.key"
Kapitel 4: Reverse Proxy & Load Balancer
Nginx als Reverse Proxy:
/etc/nginx/sites-available/gitlab:
nginx
upstream gitlab {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name gitlab.deine-domain.de;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name gitlab.deine-domain.de;
ssl_certificate /etc/letsencrypt/live/gitlab.deine-domain.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/gitlab.deine-domain.de/privkey.pem;
location / {
proxy_pass http://gitlab;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 300;
}
# Container Registry
location /v2/ {
proxy_pass http://gitlab:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Kapitel 5: Backup & Disaster Recovery
1. Automatische Backups einrichten:
Backup-Skript:
bash
#!/bin/bash # /usr/local/bin/gitlab-backup.sh BACKUP_DIR="/backup/gitlab" DATE=$(date +%Y%m%d_%H%M%S) RETENTION_DAYS=30 # Backup erstellen sudo gitlab-backup create BACKUP=$DATE # Konfiguration backupen tar -czf $BACKUP_DIR/config_$DATE.tar.gz /etc/gitlab/gitlab.rb /etc/gitlab/gitlab-secrets.json # Datenbank dump sudo gitlab-rake gitlab:backup:create SKIP=artifacts,uploads # Alte Backups löschen find $BACKUP_DIR -name "*.tar" -mtime +$RETENTION_DAYS -delete
Cron-Job für tägliche Backups:
bash
0 2 * * * /usr/local/bin/gitlab-backup.sh >> /var/log/gitlab-backup.log 2>&1
2. Backup-Wiederherstellung:
bash
# 1. GitLab stoppen sudo gitlab-ctl stop puma sudo gitlab-ctl stop sidekiq # 2. Backup kopieren cp 1672531200_2023_01_01_gitlab_backup.tar /var/opt/gitlab/backups/ # 3. Wiederherstellen sudo gitlab-backup restore BACKUP=1672531200_2023_01_01 # 4. Konfiguration wiederherstellen tar -xzf config_backup.tar.gz -C / # 5. GitLab starten sudo gitlab-ctl reconfigure sudo gitlab-ctl restart
Kapitel 6: Performance-Optimierung
1. Datenbank-Optimierung:
bash
# PostgreSQL Performance Tuning sudo nano /var/opt/gitlab/postgresql/data/postgresql.conf
conf
# Wichtige Einstellungen shared_buffers = 2GB # 25% von RAM effective_cache_size = 6GB # 50-75% von RAM work_mem = 16MB maintenance_work_mem = 512MB
2. Redis Konfiguration optimieren:
ruby
# In gitlab.rb redis['maxmemory'] = '2gb' redis['maxmemory_policy'] = 'allkeys-lru'
3. Sidekiq Worker optimieren:
ruby
sidekiq['min_concurrency'] = 5 sidekiq['max_concurrency'] = 15 sidekiq['queue_selector'] = true
4. Caching verbessern:
bash
# Redis als Cache aktivieren sudo gitlab-rails console > Feature.enable(:gitlab_cache_redis_cluster)
Kapitel 7: Monitoring & Logging
1. Prometheus & Grafana einrichten:
gitlab.rb Ergänzungen:
ruby
# Monitoring aktivieren prometheus['enable'] = true grafana['enable'] = true node_exporter['enable'] = true redis_exporter['enable'] = true postgres_exporter['enable'] = true
2. Wichtige Logs überwachen:
bash
# Logs in Echtzeit anzeigen sudo gitlab-ctl tail # Spezifische Logs sudo tail -f /var/log/gitlab/gitlab-rails/production.log sudo tail -f /var/log/gitlab/gitlab-rails/api.log sudo tail -f /var/log/gitlab/sidekiq/current
3. Health-Checks einrichten:
bash
# GitLab Status prüfen sudo gitlab-rake gitlab:check # Service Status sudo gitlab-ctl status # Liveness Endpoint curl -s https://gitlab.deine-domain.de/-/liveness | jq .
Kapitel 8: Sicherheits-Härtung
1. Firewall konfigurieren:
bash
# UFW Regeln sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow 2222/tcp # GitLab SSH sudo ufw enable
2. Rate Limiting aktivieren:
ruby
# In gitlab.rb
gitlab_rails['rate_limit_requests_per_period'] = 100
gitlab_rails['rate_limit_period'] = 60
gitlab_rails['rack_attack_git_basic_auth'] = {
'enabled' => true,
'ip_whitelist' => ["127.0.0.1"],
'maxretry' => 10,
'findtime' => 60,
'bantime' => 3600
}
3. Zwei-Faktor-Authentifizierung erzwingen:
bash
sudo gitlab-rails console
# Für alle Benutzer aktivieren
User.where.not(confirmed_at: nil).find_each { |u| u.update!(otp_required_for_login: true) }
4. Security Scanning aktivieren:
yaml
# .gitlab-ci.yml Beispiel include: - template: Security/SAST.gitlab-ci.yml - template: Security/Dependency-Scanning.gitlab-ci.yml - template: Security/Container-Scanning.gitlab-ci.yml
Kapitel 9: CI/CD & Runner Setup
1. GitLab Runner installieren:
bash
# Repository hinzufügen curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash # Installieren sudo apt install gitlab-runner # Registrieren sudo gitlab-runner register \ --url https://gitlab.deine-domain.de/ \ --registration-token DEIN_REGISTRATION_TOKEN \ --executor docker \ --description "Docker Runner" \ --docker-image "docker:latest" \ --docker-volumes /var/run/docker.sock:/var/run/docker.sock
2. Docker-in-Docker für CI/CD:
yaml
# .gitlab-ci.yml
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_DRIVER: overlay2
services:
- docker:dind
before_script:
- docker info
build:
stage: build
script:
- docker build -t myapp .
- docker run myapp /script/to/run/tests
Kapitel 10: Wartung & Updates
1. Regelmäßige Wartungsaufgaben:
bash
# Tägliche Tasks sudo gitlab-rake gitlab:cleanup:orphan_job_artifact_files sudo gitlab-rake gitlab:uploads:check sudo gitlab-rake cache:clear # Wöchentliche Tasks sudo gitlab-rake gitlab:cleanup:project_uploads sudo gitlab-rake gitlab:cleanup:sessions:active_sessions_lookup_keys # Monatliche Tasks sudo gitlab-rake gitlab:doctor:secrets
2. Updates durchführen:
bash
# Backup vor Update sudo gitlab-backup create # Update durchführen sudo apt update sudo apt install gitlab-ce # Konfiguration anwenden sudo gitlab-ctl reconfigure # Services neu starten sudo gitlab-ctl restart
3. Monitoring-Alerts einrichten:
bash
# Health Check Script
#!/bin/bash
STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://gitlab.deine-domain.de/-/health)
if [ $STATUS -ne 200 ]; then
echo "GitLab is down! Status: $STATUS" | mail -s "GitLab Alert" admin@deine-domain.de
# Automatischer Restart
sudo gitlab-ctl restart
fi
Troubleshooting Guide
Häufige Probleme & Lösungen:
1. GitLab startet nicht:
bash
# Logs prüfen sudo gitlab-ctl tail sudo journalctl -u gitlab* # Konfiguration prüfen sudo gitlab-rake gitlab:check SANITIZE=true
2. High Memory Usage:
bash
# Memory Usage analysieren sudo gitlab-psql -c "SELECT pg_stat_activity.* FROM pg_stat_activity" sudo gitlab-rails runner "puts Sidekiq::Stats.new.inspect"
3. Backup/Restore Probleme:
bash
# Backup verifizieren sudo gitlab-backup verify # Manuelle Wiederherstellung sudo gitlab-rake gitlab:backup:restore
Best Practices Checkliste
✅ Vor der Installation:
-
Hardware-Anforderungen geprüft
-
DNS-Einträge vorbereitet
-
Firewall konfiguriert
-
Backup-Strategy geplant
✅ Nach der Installation:
-
SSL-Zertifikat installiert
-
Initiales Backup getestet
-
SMTP konfiguriert
-
Security Settings angepasst
-
Monitoring eingerichtet
✅ Produktivbetrieb:
-
Regelmäßige Backups laufen
-
Updates geplant
-
Performance überwacht
-
Security Scans aktiviert
-
Disaster Recovery getestet
Community & Support
Offizielle Ressourcen:
-
📚 Docs: https://docs.gitlab.com
-
💬 Forum: https://forum.gitlab.com
-
🐦 Mastodon: https://mastodon.social/@gitlab
Deutsche Community:
-
🌐 GitLab Meetups Deutschland
-
📱 Telegram/Discord Gruppen
-
🎥 YouTube Tutorials (deutsch)
Dein GitLab ist jetzt bereit! 🚀
Zugangsdaten für den ersten Login:
-
User: root
-
Passwort: (Das aus /etc/gitlab/initial_root_password)
Nächste Schritte:
-
Passwort ändern
-
SSH Key hinzufügen
-
Erste Gruppe/Project erstellen
-
CI/CD Pipeline konfigurieren
-
Team-Mitglieder einladen
Viel Erfolg mit deiner eigenen GitLab-Instanz! 💻
More blog articles
Du suchst nach einem neuen Server oder Webhosting und wirst von günstigen Lockangeboten überschüttet? Vorsicht – was auf den ersten Blick wie ein Schnäppchen aussieht, kann langfristig zu einer teuren Überraschung werden. Wir zeigen d...
Was ist eigentlich... Webspace? Einfach erklärt (nicht nur für Oma!) Hast du schon mal von Webspace gehört und gedacht: "Was soll das sein?" Keine Sorge, du bist nicht allein. Viele Leute wissen nicht, was das ist - dabei nutzen sie es jeden Tag....
Du hast bereits erste Erfahrungen mit Minecraft Servern gesammelt und möchtest jetzt deinen eigenen, professionellen Server aufsetzen? Egal ob du mit Mods, Plugins oder im klassischen Vanilla-Stil spielen willst – dieser Guide führt dich durch die wichtigsten...