Мне нравится иметь git-сервер на компьютере (бэкэнд) без прямого доступа в Интернет. Должна быть базовая аутентификация. Доступ должен быть доступен через обратный прокси-сервер (интерфейс) на другом компьютере, который поддерживает SSL / HTTPS. Оба работают под управлением стабильной версии Debian 7 (wheezy + wheezy-backports для nginx и git).
Пока все (= git clone
) работает, но git push
:
$ git push --set-upstream origin master
Username for 'https://myfrontend:443': myusername
Password for 'https://myusername@myfrontend:443':
error: Cannot access URL https://myserver:443/git/gittest.git/, return code 22
fatal: git-http-push failed
Сообщение об ошибке в журнале серверной части nginx:
2014/04/01 01:00:00 [error] 27000#0: *7 no user/password was provided for
basic authentication, client: myfrontend, server: mybackend, request:
"PROPFIND /git/gittest.git/ HTTP/1.0", host: "myfrontend"
Кажется, что базовая авторизация работает для clone
, но не для push
.
Конфигурация внешнего интерфейса nginx:
server {
listen 443;
server_name myfrontend;
resolver 127.0.0.1;
charset UTF-8;
#
root /var/www/;
index index.html;
#
ssl on;
ssl_certificate /etc/ssl/certs/myfronted.crt;
ssl_certificate_key /etc/ssl/private/myfrontend.key;
#
ssl_session_timeout 5m;
#
ssl_protocols SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
ssl_prefer_server_ciphers on;
#
location ~ /git(/.*) {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://mybackend:8081/git$1;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header REMOTE_USER $remote_user;
}
}
Конфигурация nginx для бэкэнда:
server {
listen 8081;
server_name mybackend;
root /var/www;
charset UTF-8;
#
location ~ /git(/.*) {
auth_basic "Restricted";
auth_basic_user_file /var/lib/git/.htpasswd;
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS;
create_full_put_path on;
#
fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
fastcgi_param GIT_HTTP_EXPORT_ALL "";
fastcgi_param GIT_PROJECT_ROOT /var/lib/git;
fastcgi_param PATH_INFO $1;
fastcgi_param DOCUMENT_ROOT /usr/lib/git-core/;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
include fastcgi_params;
}
}
Конфигурация git на внутреннем сервере:
[core]
repositoryformatversion = 0
filemode = true
bare = true
[http]
receivepack = true
[gitweb]
owner = My Name
Есть ли другой, возможно, более простой способ обслуживать git на стороне сервера? Может без nginx или без fcgiwrap? Но я бы хотел выжить без Apache ...
Спасибо заранее!
Проблема заключалась в синтаксисе внешнего интерфейса. Пришлось поменять:
proxy_pass http://mybackend:8081/git$1;
к правильному:
proxy_pass http://mybackend:8081/git$1$is_args$args;
или альтернативно:
proxy_pass http://mybackend:8081$request_uri;
Спасибо, Уилл!