Как обслуживать GIT через HTTP через NGINX с именем пользователя / паролем? - PullRequest
19 голосов
/ 20 июня 2011

Несмотря на все ссылки, которые я нашел по настройке git / nginx для получения моих репозиториев, я не могу заставить их работать.

Я следовал этому уроку, Репозиторий Git через HTTP WebDAVс nginx , но ограничение пользователя / пароля не работает.Любой может клонировать репозиторий.

Я из конфигурации, использующей SVN + Apache + DAV_SVN, с файлом пароля (созданным с помощью htpasswd) и файлом для authz.Я хотел бы сделать то же самое, используя git + nginx.Как это возможно?

Спасибо за помощь!

Ответы [ 3 ]

20 голосов
/ 09 июля 2013

Взгляните на следующую статью: http://www.toofishes.net/blog/git-smart-http-transport-nginx/

В ней приведен пример конфигурации nginx:

http {
    ...
    server {
        listen       80;
        server_name  git.mydomain.com;

        location ~ /git(/.*) {
            # fcgiwrap is set up to listen on this host:port
            fastcgi_pass  localhost:9001;
            include       fastcgi_params;
            fastcgi_param SCRIPT_FILENAME     /usr/lib/git-core/git-http-backend;
            # export all repositories under GIT_PROJECT_ROOT
            fastcgi_param GIT_HTTP_EXPORT_ALL "";
            fastcgi_param GIT_PROJECT_ROOT    /srv/git;
            fastcgi_param PATH_INFO           $1;
        }
    }
}

Это означает, что вы передаете репо, который находится после / git вURL, до /usr/lib/git-core/git-http-backend.Например, http://git.mydomain.com/git/someapp будет указывать на хранилище someapp.Этот репо будет находиться в /srv/git/someapp, как определено в fastcgi_param из GIT_PROJECT_ROOT, и его можно изменить в соответствии с вашим сервером.

Это очень полезно, и вы можете применить HttpAuthBasicModule для nginx для защиты паролем доступа вашего репо через HTTP.

Редактировать: Если вам не хватает git-http-backend, вы можете установить пакет git-core в Ubuntu / Debian или в RPMплатформы на основе Как установить git на CENTOS 5.5?

15 голосов
/ 01 апреля 2016

Вот полная конфигурация для Git по HTTP, с шифрованием TLS, Basic Auth и GitWeb . Я предполагаю, что корень хранилища находится в /home/git. Вам следует заменить example.com своим доменом.

# Remove this block if you don't want TLS
server {
    listen 80;
    server_name git.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen       443 ssl; # Replace 443 ssl by 80 if you don't want TLS
    server_name  git.example.com;
    root         /usr/share/gitweb; # Remove if you don't want Gitweb

    error_log  /home/git/nginx-error.log;
    access_log /home/git/nginx-access.log;

    # Remove ssl_* lines if you don't want TLS
    ssl_certificate           /etc/letsencrypt/live/git.example.com/fullchain.pem;
    ssl_certificate_key       /etc/letsencrypt/live/git.example.com/privkey.pem;
    ssl_protocols             TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers               'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

    # Remove auth_* if you don't want HTTP Basic Auth
    auth_basic "example Git";
    auth_basic_user_file /etc/nginx/.htpasswd;

    # static repo files for cloning over https
    location ~ ^.*\.git/objects/([0-9a-f]+/[0-9a-f]+|pack/pack-[0-9a-f]+.(pack|idx))$ {
        root /home/git/;
    }

    # requests that need to go to git-http-backend
    location ~ ^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {
        root /home/git/;

        fastcgi_pass  unix:/var/run/fcgiwrap.socket;
        fastcgi_param SCRIPT_FILENAME   /usr/lib/git-core/git-http-backend;
        fastcgi_param PATH_INFO         $uri;
        fastcgi_param GIT_PROJECT_ROOT  $document_root;
        fastcgi_param GIT_HTTP_EXPORT_ALL "";
        fastcgi_param REMOTE_USER $remote_user;
        include fastcgi_params;
    }

    # Remove all conf beyond if you don't want Gitweb
    try_files $uri @gitweb;
    location @gitweb {
        fastcgi_pass  unix:/var/run/fcgiwrap.socket;
        fastcgi_param SCRIPT_FILENAME   /usr/share/gitweb/gitweb.cgi;
        fastcgi_param PATH_INFO         $uri;
        fastcgi_param GITWEB_CONFIG     /etc/gitweb.conf;
        include fastcgi_params;
   }
}

Вы должны установить Git, Gitweb и FastCgiWrap:

sudo apt-get install git gitweb fcgiwrap

Для TLS я использую Let's Encrypt бесплатные сертификаты.

sudo letsencrypt certonly -d git.example.com --rsa-key-size 4096

Чтобы получить доступ к Gitweb, просто перейдите на git.example.com. Вам также необходимо настроить его для установки корня хранилища:

sudo vim /etc/gitweb.conf

Чтобы получить HTTP Basic Auth, вам нужно использовать команду htpasswd для добавления пользователей в /etc/nginx/.htpasswd:

sudo apt-get install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd username

Удалите переключатель -c при следующем запуске команды, поскольку он создает только файл (по умолчанию в Nginx нет файла .htpasswd в каталоге конфигурации).

Если вы хотите что-то более сложное, мощное, похожее на GitHub, отметьте Gitlab .

0 голосов
/ 14 марта 2019

Добавим больше деталей, нам нужно 3 компонента: nginx, git-http-backend и fcgiwrap.

  • git-http-backend - это отдельный исполняемый двоичный файл, который может быть построен из https://github.com/git/git. Это официальное решение для обработки доступа к git http / https, я не знаю, является ли оно лучшим из существующих.
  • Nginx не имеет встроенного общего сервера FastCGI (или я не смог найти, как правильно использовать fastcgi_bind nginx). Поэтому следует использовать другой сервер fastcgi, например fcgiwarp (хорошее руководство https://www.nginx.com/resources/wiki/start/topics/examples/fcgiwrap/)
  • Используйте fastcgi_pass unix:/tmp/cgi.sock; в конфигурации nginx (ссылка на другие ответы)

== Обновление ==

fastcgi не является обязательным, и git-http-backend не записывается только для fastcgi, а fastcgi не является ни простым, ни быстродействующим. например, я написал сервлет для взаимодействия между nginx и git-http-backend, используя nginx proxy_pass, он также работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...