Установка Hg (mercurial) на vps Linux CentOS с доступом по http(s)
Сделаю заметку, может кому пригодиться. Нужны репозитории mercurial для разработки проекта и обмена изменениями между разработчиками. Github и Bitbucket не подходят. Есть свой vps. Установим hg на vps, с доступом по http.
Почему http, а не https? У меня работает https, но не у всех может быть сертификат и т.п. По этому рассмотрю на примере http. Хотя отличий минимум.
Инструкция может использоваться для других ОС например debian/ubuntu, т.к. смысл тот же с не большими изменениями.
Установка на сервер CentOS
Версия ос CentOS
# cat /etc/redhat-release
CentOS release 6.7 (Final)
В репозитории ос hg очень старый. По этому скачаем более свежую версию, заходим сюда https://www.mercurial-scm.org/wiki/Download
Выбираем нужный дистрибутив, выбрал centos 6, попал сюда: https://www.mercurial-scm.org/release/centos6/RPMS/x86_64/
Выбрал нужную версию hg (в данном случае mercurial-3.9.1), переходим на vps через ssh и устанавливаем:
# rpm -Uvh https://www.mercurial-scm.org/release/centos6/RPMS/x86_64/mercurial-3.9.1-1.x86_64.rpm
Проверяем версию:
# hg --version
Распределенная SCM Mercurial (версия 3.9.1)
(see https://mercurial-scm.org for more information)
Copyright (C) 2005-2016 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Подразумевается что веб сервер у вас установлен. У меня на vps стоит веста панель и там уже установлена связка httpd (apache) и nginx.
По этому идём в стандартную папку для веста панели и создадим хост, где будут лежать репозитории:
# cd /home/admin/web
У вас пути могут различаться. Создадим папку хоста:
# mkdir repository
И перейдём в папку:
# cd repository
Создадим файл конфига:
# touch hgweb.config
Создадим папку для репозитория:
# mkdir project1
Теперь нужно скопировать cgi скрипт (hgweb.cgi) hg в папку хоста. Он уже готовы и лежит в папке: /usr/share/doc/mercurial-Ваша_версия_из_названия. Копируем:
# cp /usr/share/doc/mercurial-3.9.1/hgweb.cgi /home/admin/web/repository
Если не смогли его найти папку mercurial-3.9.1, ни чего страшного идите в папку и найдите вручную эту папку с вашей версией.
Открываем для редактирования файл hgweb.cgi (людым доступным и удобным редактором):
# nano /home/admin/web/repository/hgweb.cgi
Находим параметр "config =" и вставляем наш путь к файлу конфига (который мы создали ранее):
config = "/home/admin/web/repository/hgweb.config"
Сохраняем. Открываем для редактирования конфиг hgweb.config:
# nano /home/admin/web/repository/hgweb.config
Вставляем в него параметры и сохраняем:
[web]
allow_push = *
push_ssl = false
base_url = /
[collections]
/ = project1/
Обратите внимание что я вставил название созданного репозитория.
Http доступ к hg
Теперь надо настроить http доступ к репозиторию. Для этого надо добавить хосты в веб сервер. Например для httpd (apache) надо добавить в файле /etc/httpd/conf/httpd.conf
У меня стоит связка httpd (apache) и nginx. Плюс веста панель им меняет пути на нестандартные. Открываем файл для apache:
# nano /home/admin/conf/web/httpd.conf
Вставляем хост:
ServerName project1.hgrepo.com
DocumentRoot /home/admin/web/repository/
ScriptAliasMatch (.*) /home/admin/web/repository/hgweb.cgi/$1
<Directory "/home/admin/web/repository/">
SetHandler cgi-script
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
ErrorLog /var/log/httpd/hg.log
AuthType Basic
AuthName "Mercurial"
AuthUserFile /home/admin/web/repository/.htpasswd
Require valid-user
Детально расписывать параметры не буду, смотрите по путям и вписывайте свои, измените IP и домен. Запомните строку /home/admin/web/repository/.htpasswd вставте путь к хосту туда, файле мы создадим позже.
Теперь nginx, тут всё стандартно:
server {
listen 127.0.0.1:80;
server_name project1.hgrepo.com;
error_log /var/log/httpd/domains/project1.hgrepo.com.error.log error;
location / {
proxy_pass http://127.0.0.1:8080;
}
location /error/ {
alias /home/admin/web/project1.hgrepo.com/document_errors/;
}
location @fallback {
proxy_pass http://127.0.0.1:8080;
}
location ~ /\.ht {return 404;}
location ~ /\.svn/ {return 404;}
location ~ /\.git/ {return 404;}
location ~ /\.hg/ {return 404;}
location ~ /\.bzr/ {return 404;}
include /home/admin/conf/web/nginx.project1.hgrepo.com.conf*;
}
Теперь создадим файл с паролями для доступа:
# htpasswd -c /home/admin/web/repository/.htpasswd chas
Вставляем свой путь к папке с репозиториями и имя пользователя. Два раза пишем пароль. Всё пользователю доступ открыт.
У меня репозиторий уже был. Я закинул его туда и разархивировал:
# unzip .hg.zip
Вы можете его создать:
hg init project1
Обязательно меняем владельца на репозитории, на пользователя из под которого работает веб сервер:
# chown -R apache:apache /home/admin/web/repository/project1
Разрешаем запускаться скрипту:
# chmod a+x /home/admin/web/repository/hgweb.cgi
Перезагружаем веб сервер:
/etc/init.d/httpd restart
/etc/init.d/nginx restart
Ошибки
Какие ошибки я встретил.
1) при push мне выдавало:
abort: HTTP Error 403: ssl required
Был заполнен не правильно конфиг, заполнил корректно конфиг. Параметры которые виляют на пуш без ssl:
[web]
allow_push = *
push_ssl = false
2) После я получил:
abort: HTTP Error 404: Not Found
Проблема оказалась в правах на папку, установил права:
# chown -R apache:apache /home/admin/web/repository/project1
И всё заработало.
Hg и https
Добавляете сертификат, дописываете те же параметре в конфиги веб сервера, изменяете конфиг секцию [web] там без перевода всё понятно и у нас работает https.