Установка Hg (mercurial) на vps Linux CentOS с доступом по http(s)

2016-09-17 09:05:20 Блог

Сделаю заметку, может кому пригодиться. Нужны репозитории mercurial для разработки проекта и обмена изменениями между разработчиками. Github и Bitbucket не подходят. Есть свой vps. Установим hg на vps, с доступом по http.

  1. Установка на сервер CentOS
  2. Http доступ к hg
  3. Ошибки
  4. Hg и https

Почему 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.