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:

Deutsche Community:

  • 🌐 GitLab Meetups Deutschland

  • 📱 Telegram/Discord Gruppen

  • 🎥 YouTube Tutorials (deutsch)


Dein GitLab ist jetzt bereit! 🚀

Zugangsdaten für den ersten Login:

Nächste Schritte:

  1. Passwort ändern

  2. SSH Key hinzufügen

  3. Erste Gruppe/Project erstellen

  4. CI/CD Pipeline konfigurieren

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