Tag Archives: Usvn

USVN — переводим хост на SSL

В предыдущем посте я рассказал, как настроить usvn для управления свн на сервере.

Сейчас я тут решил переехать с локальной виртуальной машины на удаленный сервер и соответственно свн поднять там. В целом все делал как и раньше, но решил сайт перевести на ssl соединение.

Сделать это очень просто.

1. Генерирует SSL сертификат.

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mysitename.key -out mysitename.crt

На выходе получаем два файла, которые в последствии будем использовать.

2. Подключаем ssl на nginx, для чего нужно изменить значение listen с 80 на 443 и добавить опции, выкладываю итоговый конфиг nginx:

server {
        listen  443;
        server_name  svn.site.com;

        ssl on;
        ssl_certificate /usr/local/etc/nginx/ssl/svn.site.com.crt;
        ssl_certificate_key /usr/local/etc/nginx/ssl/svn.site.com.key;

        access_log  /var/log/nginx/svn.2kumba.com_access.log;

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }
        root /usr/local/www/usvn-1.0/public/;

         location /medias {
                try_files       $uri
                                @usvn-backend;
        }

        location  / {
            fastcgi_pass   php-backend;
            fastcgi_param  SCRIPT_FILENAME  /usr/local/www/usvn-1.0/public/index.php;
            include        fastcgi_params;
        }

        location @usvn-backend {
            fastcgi_pass   php-backend;
            fastcgi_param  SCRIPT_FILENAME  /usr/local/www/usvn-1.0/public/index.php;
            include        fastcgi_params;
        }

}

Где путь «/usr/local/etc/nginx/ssl/» это путь к папке где лежит сгенерированный сертификат.

3. Подключаем ssl для apache, для этого добавляю просто перед нужным Location параметры, включащие поддержку ssl. При этом стоит заметить что в этом случае ssl включится для всех хостов которые обслуживаются апачем, но так как  апач у меня используется только для svn то мне это по барабану.

Мой конфиг апача:

 SSLEngine on
    SSLCertificateFile /usr/local/etc/apache22/ssl/svn.site.com.crt
    SSLCertificateKeyFile /usr/local/etc/apache22/ssl/svn.site.com.key

<Location /usvn/svn>
    DAV svn
    SVNParentPath /usr/local/www/usvn-1.0/files/svn
    SVNListParentPath off
    SVNPathAuthz on
    AuthzSVNAnonymous Off

    AuthType Basic
    AuthName "svn repository"
    AuthUserFile /usr/local/www/usvn-1.0/files/htpasswd
    AuthzSVNAccessFile /usr/local/www/usvn-1.0/files/authz
    Require valid-user
</Location>

Путь к SSL сертификатам указывайте тот же что и для nginx. Я себе просто сделал симлинк для удобства.

Рестартуем nginx, apache и все должно уже работать через https://

Среда разработки — установка и настройка usvn

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

Напишу по свежей памяти о недавном разворачивании usvn (usvn.info) как UI для управления SVN репозиториями.

Напомню, что речь идет о виртуальном сервере на freebsd работающим из под виртуалки. Нужен ли кому то личный репозиторий пусть решает сам, лично я считаю очень полезным даже при самостоятельной разработке (в случае работы в команде необходимость в таком инструменте вообще не возникает).

Забегая вперед, скажу, что программа smartSvn которой я пользуюсь для работы с репозиториями имеет возможность создания и работы через локальный репозиторий, так что возможно если бы я увидел эту возможность до настройки всего этого, то попробовал бы сначала поработать с локальным.

Лирика

Кому  нужны только технические детали, может листать вниз.

Так вот, как то у меня бывает получается, что, казалось бы, простая задача (скачать архив, распаковать, настроить хост в нгинсе и апач) усложняется какими то проблеммами.

Так вот и в этот раз. Во-первых, я видимо попал как раз на тот момент, когда старая команда, занимающаяся usvn прекратила работу над ним (следуя из их новостей), а какая то новая принялась. И видимо они как раз начали вникать в разработку, так как за несколько дней, которые я занимался поднятием этого дела  у себя, у них вышли 1.0.2 а затем 1.0.3 версии. Во-вторых, сайт самого usvn падал почему то каждый вечер, и даже почитать их документацию было невозможно.

Лирика закончена.

Напомню базовую систему, на которой нужно поднять usvn: freebsd, nginx, php-fpm. Nginx стоит фронтэндом. Апача пока и в помине нету.

В общем вот краткая инструкция по  быстрому поднятию нужного:

  1. Ставим apache2 (я ставил из портов — /usr/ports/www/apache22/ ), подключая обязательно модули auth_file, auth_basic, mod_dav, dav_fs, советую еще поставить mod_ssl);
  2. Ставим subversion (/usr/ports/devel/subversion), не забыв включить в опции его конфига mod_dav, остальные параметры вроде можно оставить по дефолту;
  3. При этом subversion закинет в папку /usr/local/libexec/apache22/ пару модулей для апача, необходимые для правильной работы этой системы;
  4. Правим конфиг апача. Главное — вешаем его не на стандартный 80, а на другой порт, я выбрал 433 (не путать с 443 который является дефолтным для https). Совет: если у вас по итогу не будет работать свн как нужно (например при переходе по нужному адресу будут ошибки 403, 404  и т.п., попробуйте перед директивой <location> для усвн поставить ServerRoot «/usr/local/www/usvn/files/svn/» — если сам усвн вы ставили в /usr/local/www/usvn/ и для репозиториев была указана стандартная папка). Не забываем так же вручную прописать для апача подключение модулей (добавлять после всех остальных): LoadModule dav_svn_module libexec/apache22/mod_dav_svn.so
    LoadModule authz_svn_module libexec/apache22/mod_authz_svn.so
  5. Настраиваем nginx для обработки нужного сайта, перенаправляя все запросы на index.php
  6. Перезапускаем nginx, apache. Если все ок, можно пробовать открывать адрес на который настроен nginx.

Не забудьте так же включить short_open_tag для php, потому что будет криво отображаться сайт усвн. Сначала на этапе установки я этого не заметил, все работало, хоть и криво, но потом пользоваться уже невозможно :-)

И еще поясню, кто не понял: сам сайт работает через nginx+php-fpm, а все что касается работы svn обслуживается модулем апача на другом порту. Таким образом менеджмент сервера выполняется с браузера, а комиты/апдейты и все остальное через адрес, например http://svn.site.ru:433/usvn/svn/

Приведу так же пример конфига апача:

Listen 433
ServerName svn.site.ru:433

LoadModule authn_file_module libexec/apache22/mod_authn_file.so
LoadModule auth_basic_module libexec/apache22/mod_auth_basic.so
LoadModule dav_module libexec/apache22/mod_dav.so
# ssl
LoadModule ssl_module libexec/apache22/mod_ssl.so

LoadModule dav_svn_module libexec/apache22/mod_dav_svn.so
LoadModule authz_svn_module libexec/apache22/mod_authz_svn.so

User www
Group www

ServerAdmin you@example.com
ErrorLog "/var/log/apache/httpd-error.log"
LogLevel warn

DefaultType text/plain

EnableMMAP off
EnableSendfile off
AcceptFilter http none

ServerRoot "/usr/local/www/usvn-1.0/files/svn"

<Location /usvn/svn>
DAV svn
SVNParentPath /usr/local/www/usvn-1.0/files/svn
SVNListParentPath off
SVNPathAuthz on
AuthzSVNAnonymous Off

AuthType Basic
AuthName "site repository"
AuthUserFile /usr/local/www/usvn-1.0/files/htpasswd
AuthzSVNAccessFile /usr/local/www/usvn-1.0/files/authz
Require valid-user
</Location>

Update: забыл добавить еще. После того как все уже было настроено, усвн отказывался создавать репозитории возвращая ошибку «Can’t create subversion repository». В итоге оказалось что все дело в том, что вызов команды svn … или svnadmin … возвращалось с 127 кодов выхода. Фикс этого: либо прописать для нужного юзера переменную окружения либо заменить команду svn -> /usr/local/bin/svn, svnadmin -> /usr/local/bin/svnadmin

После этого все работает четко =)

 

P.S. Новый пост о том, как сделать то же самое с использованием SSL (через https://).