Gitlab – Uploads werden nicht mehr angezeigt

Nach mehreren Updates von Gitlab bzw. der Linux-Distribution fiel auf. dass bei Issues/Tickets zwar weiterhin Uploads (unabhängig von Typen) möglich waren und diese auch abgelegt wurden – ein Abrufen war jedoch nicht möglich.

Schritt 1 – Überprüfung des Uploads
Aufruf von
sudo gitlab-rake gitlab:uploads:check
(vergl. https://docs.gitlab.com/administration/raketasks/check/#uploaded-files-integrity)

Nach dem anschließenden Upload, sollte der Filecounter entsprechend angestiegen sein. Dies war im vorliegenden Fall gegeben.

Schritt 2 – Betrachtung der Architektur
Als Webserver kommt auf dem System apache2 zum Einsatz – primär um auch weitere Sites auszuliefern. Es handelt sich dabei um ein „Multi-Domain-Setup“. Es steht dabei nur eine IP zur Verfügung.
Apache2 ist daher als Reverse-Proxy konfiguriert und liefert entsprechend die GIT-UI aus. Der GIT-interne NGINX ist dabei deaktiviert.
Bewertung:
Zahlreiche Beiträge weisen darauf hin, dass man trotz apache2 nicht auf den zwischengeschalteten NGINX verzichten sollte.

Schritt 3 – Umsetzung der Optimierungen
Als Webserver kommt auf dem System apache2 zum Einsatz – primär um auch weitere Sites auszuliefern. Es handelt sich dabei um ein „Multi-Domain-Setup“. Es steht dabei nur eine IP zur Verfügung.

Anpassungen im Detail:

  • lokaler NGINX (aus gitlab-Package) auf localhost:8081

    Reaktivierung NGINX (inkl. Deaktivierung sendfile)
    /etc/gitlab/gitlab.rb ############################################################
    # Externe URL (die URL, die Benutzer aufrufen) ############################################################
    external_url 'https://gitlab.mydomain.org' ############################################################
    # GitLab interner Nginx ############################################################
    nginx['enable'] = true
    # Alle nginx-Listener (Frontend + interne Ports) nur lokal binden
    nginx['listen_addresses'] = ['127.0.0.1']
    # Frontend-Port für Apache-Proxy nginx['listen_port'] = 8081
    nginx['listen_https'] = false

    # Apache-Proxy-Kompatibilität: sendfile deaktivieren
    gitlab_workhorse['sendfile'] = false

    # Optional: größere Uploads erlauben
    nginx['client_max_body_size'] = '250m' ############################################################
    # Optional: Logging
    ############################################################
    nginx['log_format'] = 'combined'

    Nach einem
    gitlab-ctl reconfigure
    gitlab-ctl restart

    kann man die Umsetzung kontrollieren:
  • Schützen weiterer NGINX-Ports mittels lokaler Firewall (ufw)
    Wie im Screenshot zu sehen, lässt sich der Port tcp/8060 nicht einschränken. Um auf diesen den unberechtigten Zugriff zu verhindern, kommt daher UFW zu Einsatz.
    Vor der Einrichtung der lokalen Firewall sollte dringend verifiziert werden, dass es noch einen weiteren Zugriffsweg (z.B. über das Web-Interface des Cloud-Server-Anbieters) gibt.
    Anschließend kann UFW installiert und konfiguriert werden:

    Installation und setzen der Default-Einstellungen (inkl. Erlauben des SSH-Zugriffs):
    demo-adm@demo2:~# sudo apt-get install ufw
    Reading package lists... Done
    Building dependency tree...
    Done Reading state information... Done
    demo-adm@demo2:~# sudo ufw default allow outgoing
    Default outgoing policy changed to 'allow' (be sure to update your rules accordingly)
    demo-adm@demo2:~# sudo ufw default allow incoming
    Default incoming policy changed to 'allow' (be sure to update your rules accordingly)
    demo-adm@demo2:~# sudo ufw allow ssh
    Rules updated
    Rules updated (v6)

    Blockieren des Zugriffs auf tcp/8060:
    demo-adm@demo2:~# sudo ufw deny 8060 Rules updated Rules updated (v6)

    Aktivieren:
    demo-adm@demo2:~# sudo ufw enable
    Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup@admin-phf

    Kontrolle:

  • Konfiguration von Apache2 als Reverse-Proxy
    Als letzten Schritt gilt es nun, den Apache zu konfigurieren bzw. die Konfiguration auf das Zusammenspiel mit NGINX zu optimieren.
/etc/apache2/sites.available/gitlab.conf

<VirtualHost *:443>
    ServerName gitlab.mydomain.org

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/gitlab.example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/gitlab.example.com/privkey.pem

    # Proxy Einstellungen
    ProxyPreserveHost On
    ProxyRequests Off
    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-Ssl "on"

    # Apache-Optimierungen für GitLab
    EnableSendfile Off
    EnableMMAP Off
    LimitRequestBody 0

    # ProxyPass zum internen GitLab-nginx
    ProxyPass        / http://127.0.0.1:8081/ nocanon retry=0 timeout=300
    ProxyPassReverse / http://127.0.0.1:8081/

    # WebSocket-Unterstützung (ActionCable)
    RewriteEngine On
    RewriteCond %{HTTP:Upgrade} =websocket [NC]
    RewriteRule /(.*)  ws://127.0.0.1:8081/$1  [P,L]

    # Logging
    ErrorLog  ${APACHE_LOG_DIR}/gitlab_error.log
    CustomLog ${APACHE_LOG_DIR}/gitlab_access.log combined
</VirtualHost>

Anschließend noch relevante Module aktivieren, die Site aktivieren und Apache2 neu starten.

a2enmod proxy proxy_http proxy_wstunnel ssl headers rewrite
a2ensite gitlab
systemctl restart apache2