Как обслуживать GIT через HTTP через NGINX с помощью пользователя/пароля?
Несмотря на все ссылки, которые я нашел о том, как настроить git/nginx, чтобы получить мои репозитории, я не могу заставить их работать.
Я выполнил этот учебник, Git репозиторий через HTTP WebDAV с nginx, но ограничение пользователя/пароля не работает. Любой может клонировать репозиторий.
Я из конфигурации, использующей SVN + Apache + DAV_SVN, с файлом для пароля (созданным с помощью htpasswd) и файлом для authz. Я хотел бы сделать то же самое, используя git + nginx. Как это возможно?
Спасибо за вашу помощь!
Ответы
Ответ 1
Взгляните на следующую статью: 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
of GIT_PROJECT_ROOT
и может быть изменено в соответствии с вашим сервером.
Это очень полезно, и вы можете применить HttpAuthBasicModule
к nginx для защиты вашего доступа репо через HTTP.
Изменить: Если вам не хватает git-http-backend
, вы можете установить пакет git-core
на платформе Ubuntu/Debian или на платформах, основанных на RPM, на можно установить git на CENTOS 5.5?
Ответ 2
Вот полная конфигурация для Git через HTTP, с шифрованием TLS, Basic Auth и GitWeb (очень простой просмотрщик репозиториев). Я предполагаю, что корень репозитория находится в /home/ git.
# Remove this block if you don't want TLS
server {
listen 80;
server_name git.YOURDOMAIN.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.YOURDOMAIN.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.YOURDOMAIN.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/git.YOURDOMAIN.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
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 "YOURDOMAIN 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 Encrypt бесплатные сертификаты.
sudo letsencrypt certonly -d git.YOURDOMAIN.com --rsa-key-size 4096
Чтобы получить доступ к Gitweb, просто перейдите к git.YOURDOMAIN.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.