Русский
Русский
English
Статистика
Реклама

Cgit

CGit-UI web-интерфейс для Git-репозиториев

09.12.2020 10:19:32 | Автор: admin

cGit-ui это web-интерфейс для Git-репозиториев, основу которого предстваляет CGI-скрипт написанный на языке С.


cGit-ui поддерживает Markdown-файлы, которые обрабатываются на стороне сервера с помощью библиотеки md4c, зарекомендовавшей себя в проекте KDE Plasma. cGit-ui предоставляет возможность размещения кодов верификации сайта, а также скриптов от таких систем как Google Analytics и Yandex.Metrika для анализа трафика.


Пользователи cGit-ui получают широкие возможности для настройки как внешнего вида, так и функциональности собственного сайта, на котором они представляют свои репозитории. Кроме того, cGit-ui позволяет создавать и размещать на сайте, так называемые Donation-диалоги для приема пожертвований в пользу тех или иных проектов.


Внешний вид и функциональность сайтов, построенных на cGit-ui, можно рассмотреть на примере где, в том числе, представлены достаточно большие Git-репозитории, что позволяет примерно оценить скорость работы интерфейса. Рассматривать сайт в работе лучше начинать со смартфона, а затем переходить на более широкие экраны.


С момента выхода интерфейса к Subversion-репозиториям произошел ряд изменений в структуре пакетов, необходимых для установки. Так, например, cScm-демон, который служит для разбора конфигурационных файлов, выделен в отдельный пакет.


Поэтому в данной статье дается более развернутое описание cGit-ui.



Установку и настройку cGit-ui необходимо начинать с инсталляции cScm-демона, который одновременно может поддерживать как cSvn-ui, так и интерфейс к Git-репозиториям.



Инсталляция cScm-демона


cScm-демон служит для того, чтобы не нагружать лишней работой, связаной с разбором конфирурационных файлов, основные CGI-скрипты cSvn-ui и cGit-ui. cScm-демон преобразует список репозиториев /etc/cgit-ui.rc(5) в двоичный формат, который поступает на вход cGit-ui CGI-скрипта через разделяемую память. Таким образом CGI-скрипт не тратит время на синтаксический анализ списка репозиториев.


Исходный пакет cScm можно получить двумя способами: загрузить с FTP-сервера или с помощью Subversion:


svn checkout svn://radix.pro/cscm/tags/cscm-0.1.3 cscm-0.1.3

Если использован второй способ, то перед сборкой пакета необходимо приготовить исходные тексты для их последующего конфигурирования. Для этого нужно воспользоваться скриптом bootstrap:


cd cscm-0.1.3./bootstarp

который установит Autotools средства, соберет коллекцию aclocal.m4 и создаст configure скрипт.


Далее как обычно для пакетов использующих Autotools:


./configure --prefix=/usr \            --sysconfdir=/etc \            --with-controldir=/etc/rc.d \            --with-logrotatedir=/etc/logrotate.d \            --with-homepath=/var/lib \            --with-logdir=/var/log \            --with-piddir=/var/runmakemake install


Для запуска cScm-демона надо сделать следующие файлы исполняемыми:


chmod a+x /etc/rc.d/rc.csvndchmod a+x /etc/rc.d/rc.cgitd


Если же вы хотите запускать cscmd(8) демоны при старте системы, которая имеет BSD-like инициализацию, такой как Slackware, необходимо в скрипты /etc/rc.d/rc.M и /etc/rc.d/rc.6 добавить следующие строки, соответственно:


/etc/rc.d/rc.M:
# Start cSvn SCM daemon:if [ -x /etc/rc.d/rc.csvnd ] ; then  /etc/rc.d/rc.csvnd startfi# Start cGit SCM daemon:if [ -x /etc/rc.d/rc.cgitd ] ; then  /etc/rc.d/rc.cgitd startfi

/etc/rc.d/rc.6:
# Stop cSvn SCM daemon:if [ -x /etc/rc.d/rc.csvnd ] ; then  /etc/rc.d/rc.csvnd stopfi# Stop cGit SCM daemon:if [ -x /etc/rc.d/rc.cgitd ] ; then  /etc/rc.d/rc.cgitd stopfi


Для систем использующих systemd, необходимо установить файлы, подобные следующим:


/etc/systemd/system/csvnd.service:
[Unit]Description=The cSvn daemonAfter=network.target[Service]PIDFile=/var/run/csvnd.pidExecStart=/usr/sbin/cscmd --daemonize --inotify --scm=svn --pid=/var/run/csvnd.pid --log=/var/log/csvnd.log --config=/etc/csvn-ui.rcExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s TERM $MAINPID[Install]WantedBy=multi-user.target

/etc/systemd/system/cgitd.service:
[Unit]Description=The cGit daemonAfter=network.target[Service]PIDFile=/var/run/cgitd.pidExecStart=/usr/sbin/cscmd --daemonize --inotify --scm=git --pid=/var/run/cgitd.pid --log=/var/log/cgitd.log --config=/etc/cgit-ui.rcExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s TERM $MAINPID[Install]WantedBy=multi-user.target


Прежде чем запускать cscmd-демон надо создать конфигурационный файл с описанием репозиториев, например, /etc/cgit-ui.rc(5). После запуска демона в log-файле /var/log/cgitd.log можно будет видеть текущее состояние работы или описание ошибок, которые допущены в файле конфигурации.


Обратите внимание на опцию --inotify. Данная опция позволяет не посылать демону сигнал о том что надо перечитать конфигурационный файл после каждого редактирования настроек списка репозиториев. Демон самостоятельно будет отслеживать изменения в файле /etc/cgit-ui.rc(5).


Граматика файлов /etc/cgit-ui.rc(5) и /etc/csvn-ui.rc(5) элементарна. Посмотреть не нее можно в файле parse.y. Структура бинарного файла списка репозиториев описана в файле bcf.h.



Бинарные пакеты


Еще нет Linux-дистрибутивов, имеющих в пакетной базе программы cSvn-ui и cGit-ui. Однако пользователи могут самостоятельно собрать нужные им пакеты по инструкциям в каталоге doc/build-packages. Здесь есть наброски spec-файла для систем, использующих RPM, файл сборки пакета для ArchLinux, а также скрипт для Slackware.


Дополнительную информацию о cscmd(8) можно получить на странице руководства:


man 8 cscmd


Подготовка исходного пакета cGit-ui


Исходный пакет cGit-ui так же можно получить двумя способами: загрузить с FTP-сервера или с помощью Subversion:


svn checkout svn://radix.pro/cgit-ui/tags/cgit-ui-0.1.4 cgit-ui-0.1.4

Второй способ, как всегда, подразумевает использование скрипта bootstrap для подготовки к сборке:


cd cgit-ui-0.1.4./bootstarp


Требуемые пакеты


cGit-ui CGI-скрипт зависит от следующих библиотек: libpcre2, libmd4c, libmd4c-html, libmagic, libgit2.


Разумеется, для использования cGit-ui, в системе должен быть установлен web-сервер и какой-либо сервер приложений. Далее мы будем рассматривать связку Nginx + uWsgi, однако на ряду с uWsgi, пользователи могут выбрать CGI или FastCGI, которые поддерживаются сервером Nginx.



Инсталляция cGit-ui


Здесь необходимо только выбрать каталог, в который будут установлены, как сам CGI-скрипт, так и все необходимые компоненты web-сайта пользователя:


./configure --prefix=/usr \            --with-scriptdir=/var/www/htdocs/cgitmakemake install


После установки пакета необходимо отдать права на каталог пользователю, от имени которого работает web-сервер:


chown -R nginx:nginx /var/www/htdocs/cgit


uWsgi


Поскольку, на стадии конфигурирования исходых текстов, мы выбрали каталог установки --with-scriptdir=/var/www/htdocs/cgit, далее все настройки будут производиться относительно именно этого каталога. Конфигурационный файл сервера приложений /etc/uwsgi/cgit-ui.ini должен выглядеть следующим образом:


/etc/uwsgi/cgit-ui.ini:
[uwsgi]master          = trueplugins         = cgisocket          = /run/uwsgi/%n.sockuid             = nginxgid             = nginxprocname-master = uwsgi cgit-uiprocesses       = 1threads         = 2cgi             = /var/www/htdocs/cgit/cgit-ui.cgi

Здесь cgi = /var/www/htdocs/cgit/cgit-ui.cgi представляет полное имя CGI-скрипта cGit-ui.


Для запуска uWSGI-демона можно воспользоваться следующим скриптом:


/ets/rc.d/rc.cgit-ui-uwsgi:
#!/bin/sh## uWSGI daemon control script.#CONF=cgit-uiBIN=/usr/bin/uwsgiCONFDIR=/etc/uwsgiPID=/var/run/$CONF-uwsgi.piduwsgi_start() {  # Sanity checks.  if [ ! -r $CONFDIR/cgit-ui.ini ]; then # no config files, exit:    echo "There are config files in $CONFDIR directory. Abort."    exit 1  fi  if [ -s $PID ]; then    echo "uWSGI for cGit-ui appears to already be running?"    exit 1  fi  echo "Starting uWSGI for cGit-ui server daemon..."  if [ -x $BIN ]; then    /bin/mkdir -p /run/uwsgi    /bin/chown nginx:nginx /run/uwsgi    /bin/chmod 0755 /run/uwsgi    $BIN --thunder-lock --pidfile $PID --daemonize /var/log/cgit-ui-uwsgi.log --ini $CONFDIR/$CONF.ini  fi}uwsgi_stop() {  echo "Shutdown uWSGI for cGit-ui gracefully..."  /bin/kill -INT $(cat $PID)  /bin/rm -f $PID}uwsgi_reload() {  echo "Reloading uWSGI for cGit-ui configuration..."  kill -HUP $(cat $PID)}uwsgi_restart() {  uwsgi_stop  sleep 3  uwsgi_start}case "$1" in  start)    uwsgi_start    ;;  stop)    uwsgi_stop    ;;  reload)    uwsgi_reload    ;;  restart)    uwsgi_restart    ;;  *)  echo "usage: `basename $0` {start|stop|reload|restart}"esac

Если же необходимо запускать uWSGI-демон во время загрузки системы c BSD-like инициализацией, такой, например, как Slackware, то в файлы /etc/rc.d/rc.M, /etc/rc.d/rc.6 нужно добавить следующие строки:


/etc/rc.d/rc.M:
# Start uWSGI for cGit-ui server:if [ -x /etc/rc.d/rc.cgit-ui-uwsgi ] ; then  /etc/rc.d/rc.cgit-ui-uwsgi startfi

/etc/rc.d/rc.6:
# Stop uWSGI for cGit-ui server:if [ -x /etc/rc.d/rc.cgit-ui-uwsgi ] ; then  /etc/rc.d/rc.cgit-ui-uwsgi stopfi


Nginx


Прежде всего, необходимо включить новый виртуальный сервер в конфигурационный файл Nginx:


/etc/nginx/nginx.conf:
    include /etc/nginx/vhosts/cgit.example.org.conf;


Следующая конфигурация сервера подразумевает использование uWsgi и скрипта cGit-UI на поддомене cgit.example.org:


/etc/nginx/vhosts/cgit.example.org.conf:
## cGit server:#    server {        listen 80;        server_name cgit.example.org;        return 301 https://cgit.example.org$request_uri;    }    server {        listen 443 ssl;        server_name cgit.example.org;        root /var/www/htdocs/cgit;        charset UTF-8;        #        # see:        #   https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security ,        #   https://raymii.org/s/tutorials/HTTP_Strict_Transport_Security_for_Apache_NGINX_and_Lighttpd.html        #        # see also: http://classically.me/blogs/how-clear-hsts-settings-major-browsers        # and do not include includeSubdomains; parameter into line:        #        add_header Strict-Transport-Security "max-age=63072000; preload";        error_log /var/log/nginx/cgit.example.org-error.log;        access_log /var/log/nginx/cgit.example.org-access.log;        keepalive_timeout        60;        ssl_certificate          /etc/letsencrypt/live/cgit.example.org/fullchain.pem;        ssl_certificate_key      /etc/letsencrypt/live/cgit.example.org/privkey.pem;        ssl_trusted_certificate  /etc/letsencrypt/live/cgit.example.org/chain.pem;        ssl_protocols            SSLv3 TLSv1 TLSv1.1 TLSv1.2;        ssl_ciphers              "RC4:HIGH:!aNULL:!MD5:!kEDH";        gzip on;        gzip_disable "msie6";        gzip_comp_level 6;        gzip_min_length 1100;        gzip_buffers 16 8k;        gzip_proxied any;        gzip_types text/plain text/css text/js text/xml text/javascript                   image/svg+xml image/gif image/jpeg image/png                   application/json application/x-javascript application/xml application/xml+rss application/javascript                   font/truetype font/opentype application/font-woff application/font-woff2                   application/x-font-ttf application/x-font-opentype application/vnd.ms-fontobject application/font-sfnt;        #        # Serve static content with nginx        #        #        # Rewrite rules for versioning CSS + JS thtouh filemtime directive        #        location ~* ^.+.(css|js)$ {            rewrite ^(.+).(d+).(css|js)$ $1.$3 last;            expires 31536000s;            access_log off;            log_not_found off;            add_header Pragma public;            add_header Cache-Control "max-age=31536000, public";        }        #        # Caching of static files        #        location ~* .(asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|ogv|otf|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|t?gz|tif|tiff|ttf|wav|webm|wma|woff|wri|xla|xls|xlsx|xlt|xlw|zip)$ {            expires 31536000s;            access_log off;            log_not_found off;            add_header Pragma public;            add_header Cache-Control "max-age=31536000, public";        }        location ~* ^.+(favicon.ico|robots.txt) {            root /var/www/htdocs/cgit;            expires 30d;        }        location = /robots.txt {            allow all;            log_not_found off;            access_log off;        }        location / {            try_files $uri @cgit-ui;        }        location @cgit-ui {            gzip off;            include uwsgi_params;            uwsgi_modifier1 9;            uwsgi_pass unix:/run/uwsgi/cgit-ui.sock;        }    }


Создание списка репозиториев


Детальные инструкции, описывающие формат файла cgit-ui.rc(5) можно найти на странице руководства:


man 5 cgit-ui.rc


Рабочий Пример


Следующий конфигурационный файл содержит все необходимые, для работы сервера, настройки, одну секцию из списка репозиториев, именуемую Tools и содержащую описание Git-репозитория pkgtools.git.


git-utc-offset = +0300;clone-prefix-readonly = 'git://radix.pro';clone-prefix          = 'git://git@radix.pro:pub';trunk    = 'master';snapshots = 'tar.xz';css = '/.cgit/css/cgit.css';logo = '/.cgit/pixmaps/cgit-banner-280x280.png';logo-alt = "Radix.pro";logo-link = "https://radix.pro";main-menu-logo = '/.cgit/pixmaps/logo/git-logo-white-256x256.svg';favicon-path = '/.cgit/pixmaps/favicon';syntax-highlight-css = '_cgit.css';header = '/.cgit/html/header.html';footer = '/.cgit/html/footer.html';page-size = 200;owner = "Andrey V.Kosteltsev";author = "Andrey V.Kosteltsev";title = "Radix.pro Git Repositories";description = "Git repositories hosted at radix.pro (St.-Petersburg)";keywords = "cGit repositories cgit-ui web web-ui user interface Git";copyright = " Andrey V. Kosteltsev, 2019  2020.";copyright-notice = "Where any material of this site is being reproduced, published or issued to others the reference to the source is obligatory.";home-page = "https://radix.pro/";section "Tools" {  repo 'pkgtools.git' {    owner = "Andrey V.Kosteltsev";    title = "Package Tools Utilities";    description = "Pkgtools  is a set of utilities to create, install, remove and update packages";    home-page = "https://radix.pro/";    git-root = '/u3/scm/git';    clone-prefix-readonly = 'git://git@radix.pro:git';    clone-prefix          = 'git://git@radix.pro:git';  }}


Здесь можно видеть, что cGit-ui CGI-скрипт использует HTML-шаблоны заголовка и подножия страниц, в котрые подставляет значения некоторых переменных, определенных в конфигурационном файле cgit-ui.rc(5).


Такой подход дает возможность пользователю полностью контролировать как внешний вид интерфейса, так и его поведение исходя из собственных предпочтений:


Все необходимые файлы для работы на стороне web-клиента находятся в каталоге /var/www/htdocs/cgit/.cgit/. Редактируя файл /.cgit/html/header.html и меняя значения переменных в файле /etc/cgit-ui.rc, пользователь может сменить favicon.ico, поменять тему подсветки синтаксиса, выбрать изображения для собственных репозиториев, задать ключевые слова для поисковых систем, а также выполнить множество других настроек собственного сервера, представляющего Git-репозиториии.


Внешний вид интерфейса определяется единственным CSS-файлом и поэтому, пользователь может поменять тему web-интерфейса так, как ему будет необходимо.



Дополнительная информация


README, cscmd(8), cgit-ui.rc(5)

Подробнее..

Установка и настройка cSvn

14.11.2020 22:12:09 | Автор: admin

cSvn это web-интерфейс к Subversion репозиториям. Основу cSvn представляет CGI-скрипт написанный на языке С.


В данной статье рассматривается установка и настройка cSvn для работы с использованием Nginx + uWsgi. Настройка серверных компонентов достаточно проста и практически не отличается от настройки cGit.


На стороне клиента работает элементарный JavaScript составляющий не более 350 строк и таблица стилей размером 24K в распакованном виде. Markdown-тексты обрабатываются на стороне сервера с помощью библиотеки md4c, которая успешно зарекомендовала себя в проекте KDE Plasma.


Стоит заметить, что с помощью cSvn можно просматривать не только собственные репозитории, но и настроить просмотр сторонних ресурсов по протоколам HTTPS и SVN.



Требования к системе


cSvn использует библиотеки libpcre2, md4c, libmagic, входящую в состав пакета File и libxml2. На сервере должны быть установлены: HTTP сервер Nginx, сервер uWsgi и, разумеется Apache Subversion.


Инсталляция продуктов


cSvn пакет состоит из двух частей. Первая представляет собой обычный Linux демон, который отвечает за разбор конфигурационного файла /etc/csvnrc. Вторая непосредственно является CGI-скриптом, отвечающим на HTTP запросы клиента. Обе части устанавливаются одновременно.


Исходные тексты


Получить исходный пакет cSvn можно двумя способами: загрузить с FTP-сервера или с помощью Subversion:


svn checkout svn://radix.pro/csvn/trunk csvn

Если использован второй способ, то перед сборкой пакета необходимо приготовить исходные тексты для их последующего конфигурирования. Для этого нужно воспользоваться скриптом bootstrap:


cd csvn./bootstarp

который установит Autotools средства, соберет коллекцию aclocal.m4 и создаст configure скрипт.


Сборка пакета


Сборка и установка cSvn ни чем не отличается от любых других продуктов, использующих средства Autoconf, Automake:


./configure --prefix=/usr \            --sysconfdir=/etc \            --with-config=/etc/csvnrc \            --with-controldir=/etc/rc.d \            --with-logrotatedir=/etc/logrotate.d \            --with-scriptdir=/var/www/htdocs/csvn \            --with-homedir=/var/lib/csvn \            --with-logdir=/var/log \            --with-piddir=/var/runmakemake install

Здесь, параметр --with-scriptdir определяет место установки CGI-скрипта и связанных с ним файлов, необходимых для работы сервера cSvn. Далее, в описании настроек сервера Nginx, мы будем использовать именно этот каталог. Разумеется, пользователи могут настроить работу cSvn и виртуального HTTP сервера относительно любого другоро каталога.


Права доступа


После инсталляции пакета cSvn необходимо отдать права на каталог /var/www/htdocs/csvn пользователю, от имени которого работает Nginx:


  chown -R nginx:nginx /var/www/htdocs/csvn


Subversion репозитории


Перед первым запуском сервера cSvn необходимо создать конфигурационный файл /etc/csvnrc, в котором должны быть определены все обязательные переменные и описан хотя бы один репозиторий.


На странице руководства csvnrc(5) приведен рабочий файл конфигурации сервера:


/etc/csvnrc:
svn-utc-offset = +0300;checkout-prefix-readonly = 'svn://radix.pro';checkout-prefix          = 'svn+ssh://svn@radix.pro';branches = 'branches';trunk    = 'trunk';tags     = 'tags';snapshots = 'tar.xz';css = '/.csvn/css/csvn.css';logo = '/.csvn/pixmaps/csvn-banner-280x280.png';logo-alt = "Radix.pro";logo-link = "https://radix.pro";main-menu-logo = '/.csvn/pixmaps/logo/SVN-logo-white-744x744.svg';favicon-path = '/.csvn/pixmaps/favicon';syntax-highlight-css = '_csvn.css';header = '/.csvn/html/header.html';footer = '/.csvn/html/footer.html';page-size = 200;owner = "Andrey V.Kosteltsev";author = "Andrey V.Kosteltsev";title = "Radix.pro SVN Repositories";description = "Subversion repositories hosted at radix.pro (St.-Petersburg)";keywords = "cSvn repositories";copyright = " Andrey V. Kosteltsev, 2019  2020.";copyright-notice = "Where any material of this site is being reproduced, published or issued to others the reference to the source is obligatory.";home-page = "https://radix.pro/";section "Tools" {  repo 'csvn' {    owner = "Andrey V.Kosteltsev";    title = "cSvn CGI Script";    description = "cSvn CGI Script  is a web frontend for Subversion Repositories";    home-page = "https://radix.pro/";  }}

Его можно использовать как начальный шаблон.


После создания конфигурационного файла /etc/csvnrc можно проверить работу csvnd(8) демона.


В случае работы на системе с BSD-like инициализацией, для запуска csvnd(8) демона достаточно выполнить команду


/etc/rc.d/rc.csvnd start

Для систем использующих systemd, необходимо воспользоваться утилитой systemctl:


systemctl enable csvnd.servicesystemctl start csvnd.service

Здесь необходимо упомянуть следующее...

При сборке и установке исходного пакета cSvn, устанавливается start/stop скрипт /etc/rc.d/rc.csvnd. Если же речь идет о системах использующих systemd, то для установки cSvn лучше использовать бинарный RPM или pacman пакет, поскольку в таких пакетах файл /etc/rc.d/rc.csvnd заменяется на Systemd Unit,


/usr/lib/systemd/system/csvnd.service:
[Unit]Description=The cSvn daemonAfter=network.target[Service]PIDFile=/var/run/csvnd.pidExecStart=/usr/sbin/csvnd --daemonize --inotify --config=/etc/csvnrcExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s TERM $MAINPID[Install]WantedBy=multi-user.target

устанавливаемый в каталог /usr/lib/systemd/system.


Если для используемой вами системы еще не создан пакет cSvn, то вы его можете приготовить самостоятельно, по инструкциям, приведенным к каталоге doc/build-packages.


Если же вы не хотите создавать пакет для вашей системы, то вы можете просто поместить файл csvnd.service в каталог /usr/lib/systemd/system/ и выполнить запуск демона самостоятельно.



После запуска csvnd(8) демона надо убедиться в существовании файла /dev/shm/csvn.bcf и, в случае его отсутствия посмотреть на ошибки приведенные в /var/log/csvnd.log файле.


Настройка uWsgi


Поскольку на этапе конфигурирования мы выбрали для инсталляции cSvn CGI-скрипта каталог /var/www/htdocs/csvn/, файл /etc/uwsgi/csvn.ini должен ваглядеть следующим образом:


/etc/uwsgi/csvn.ini:
[uwsgi]master          = trueplugins         = cgisocket          = /run/uwsgi/%n.sockuid             = nginxgid             = nginxprocname-master = uwsgi csvnprocesses       = 1threads         = 2cgi             = /var/www/htdocs/csvn/csvn.cgi

Здесь переменная cgi устанавливает полное имя CGI-скрипта cSvn.


Для запуска uWsgi демона на системах с BSD-like инициализацией, такой как Slackware, необходимо создать start/stop скрипт следующего вида:


/ets/rc.d/rc.csvn-uwsgi:
#!/bin/sh## uWSGI daemon control script.#CONF=csvnBIN=/usr/bin/uwsgiCONFDIR=/etc/uwsgiPID=/var/run/$CONF-uwsgi.piduwsgi_start() {  # Sanity checks.  if [ ! -r $CONFDIR/csvn.ini ]; then # no config files, exit:    echo "There are config files in $CONFDIR directory. Abort."    exit 1  fi  if [ -s $PID ]; then    echo "uWSGI for cSvn appears to already be running?"    exit 1  fi  echo "Starting uWSGI for cSvn server daemon..."  if [ -x $BIN ]; then    /bin/mkdir -p /run/uwsgi    /bin/chown nginx:nginx /run/uwsgi    /bin/chmod 0755 /run/uwsgi    $BIN --thunder-lock --pidfile $PID --daemonize /var/log/csvn-uwsgi.log --ini $CONFDIR/$CONF.ini  fi}uwsgi_stop() {  echo "Shutdown uWSGI for cSvn gracefully..."  /bin/kill -INT $(cat $PID)  /bin/rm -f $PID}uwsgi_reload() {  echo "Reloading uWSGI for cSvn configuration..."  kill -HUP $(cat $PID)}uwsgi_restart() {  uwsgi_stop  sleep 3  uwsgi_start}case "$1" in  start)    uwsgi_start    ;;  stop)    uwsgi_stop    ;;  reload)    uwsgi_reload    ;;  restart)    uwsgi_restart    ;;  *)  echo "usage: `basename $0` {start|stop|reload|restart}"esac

Дать ему права на выполнение


  chmod a+x /ets/rc.d/rc.csvn-uwsgi

и добавить следующие строчки в файлы /etc/rc.d/rc.M, /etc/rc.d/rc.6, соответственно:


/etc/rc.d/rc.M:
# Start uWSGI for cSvn server:if [ -x /etc/rc.d/rc.csvn-uwsgi ]; then  /etc/rc.d/rc.csvn-uwsgi startfi

/etc/rc.d/rc.6:
# Stop uWSGI for cSvn server:if [ -x /etc/rc.d/rc.csvn-uwsgi ]; then  /etc/rc.d/rc.csvn-uwsgi stopfi


Настройка Nginx


Конфигурационный файл, для выбранного нами каталога установки и домена csvn.example.org должен выглядеть следующим образом:


/etc/nginx/vhosts/csvn.example.org.conf:
## cSvn server:#    server {        listen 80;        server_name csvn.example.org;        return 301 https://csvn.example.org$request_uri;    }    server {        listen 443 ssl;        server_name csvn.example.org;        root /var/www/htdocs/csvn;        charset UTF-8;        #        # see:        #   https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security ,        #   https://raymii.org/s/tutorials/HTTP_Strict_Transport_Security_for_Apache_NGINX_and_Lighttpd.html        #        # see also: http://classically.me/blogs/how-clear-hsts-settings-major-browsers        # and do not include includeSubdomains; parameter into line:        #        add_header Strict-Transport-Security "max-age=63072000; preload";        error_log /var/log/nginx/csvn.example.org-error.log;        access_log /var/log/nginx/csvn.example.org-access.log;        keepalive_timeout        60;        ssl_certificate          /etc/letsencrypt/live/csvn.example.org/fullchain.pem;        ssl_certificate_key      /etc/letsencrypt/live/csvn.example.org/privkey.pem;        ssl_trusted_certificate  /etc/letsencrypt/live/csvn.example.org/chain.pem;        ssl_protocols            SSLv3 TLSv1 TLSv1.1 TLSv1.2;        ssl_ciphers              "RC4:HIGH:!aNULL:!MD5:!kEDH";        gzip on;        gzip_disable "msie6";        gzip_comp_level 6;        gzip_min_length 1100;        gzip_buffers 16 8k;        gzip_proxied any;        gzip_types text/plain text/css text/js text/xml text/javascript                   image/svg+xml image/gif image/jpeg image/png                   application/json application/x-javascript application/xml application/xml+rss application/javascript                   font/truetype font/opentype application/font-woff application/font-woff2                   application/x-font-ttf application/x-font-opentype application/vnd.ms-fontobject application/font-sfnt;        #        # Serve static content with nginx        #        #        # Rewrite rules for versioning CSS + JS thtouh filemtime directive        #        location ~* ^.+.(css|js)$ {            rewrite ^(.+).(d+).(css|js)$ $1.$3 last;            expires 31536000s;            access_log off;            log_not_found off;            add_header Pragma public;            add_header Cache-Control "max-age=31536000, public";        }        #        # Caching of static files        #        location ~* .(eot|gif|gz|gzip|ico|jpg|jpeg|otf|pdf|png|svg|svgz|swf|tar|t?gz|woff|zip)$ {            expires 31536000s;            access_log off;            log_not_found off;            add_header Pragma public;            add_header Cache-Control "max-age=31536000, public";        }        location ~ ^/favicon.ico$ {            root /u3/nginx/vhosts/csvn;            access_log off;            log_not_found off;            expires 30d;        }        location = /robots.txt {            allow all;            log_not_found off;            access_log off;        }        location / {            try_files $uri @csvn;        }        location @csvn {            gzip off;            include uwsgi_params;            uwsgi_modifier1 9;            uwsgi_pass unix:/run/uwsgi/csvn.sock;        }    }

После создания файла /etc/nginx/vhosts/csvn.example.org.conf его необходимо включить в основной конфигурационный файл Nginx:


/etc/nginx/nginx.conf:
    include /etc/nginx/vhosts/csvn.example.org.conf;

После запуска uWsgi и Nginx можно заняться настройкой репозториев используя руководство csvnrc(5).



Заключительная настройка


Все необходимые файлы для работы на стороне web-клиента находятся в каталоге /var/www/htdocs/csvn/.csvn/. Редактируя файл /.csvn/html/header.html и меняя значения переменных в файле /etc/csvnrc, пользователь может сменить favicon.ico, поменять тему подсветки синтаксиса, выбрать изображения для собственных репозиториев, задать ключевые слова для поисковых систем, а также выполнить множество других настроек своего сервера.


Внешний вид интерфейса определяется единственным CSS-файлом и поэтому, пользователь может поменять тему web-интерфейса так, как ему будет необходимо.


Посмотреть на рабочую копию cSvn сервера можно здесь.

Подробнее..

Современный Web-UI для SVN в 2020 году

15.11.2020 00:20:52 | Автор: admin

cSvn это web-интерфейс к Subversion репозиториям. Основу cSvn представляет CGI-скрипт написанный на языке С.


В мае 2020 года был опубликован релиз очередной версии Apache Subversion 1.14.0. В свете этого события, был создан новый, современный web-интерфейс для просмотра Subversion репозиториев на любых устройствах. Это весьма позитивная новость для тех, кто использует централизованные системы версионного контроля по тому, что до вчерашнего дня существовал лишь один достойный web-UI (WebSVN), написанный на PHP и, к сожалению, отстающий от современных требований.


В данной статье рассматривается установка и настройка cSvn для работы с использованием Nginx + uWsgi. Настройка серверных компонентов достаточно проста и практически не отличается от настройки cGit.


На стороне клиента работает элементарный JavaScript составляющий не более 350 строк и таблица стилей размером 24K в распакованном виде. Markdown-тексты обрабатываются на стороне сервера с помощью библиотеки md4c, которая успешно зарекомендовала себя в проекте KDE Plasma.


Стоит заметить, что с помощью cSvn можно просматривать не только собственные репозитории, но и настроить просмотр сторонних ресурсов по протоколам HTTPS и SVN.



Требования к системе


cSvn использует библиотеки libpcre2, md4c, libmagic, входящую в состав пакета File и libxml2. На сервере должны быть установлены: HTTP сервер Nginx, сервер uWsgi и, разумеется Apache Subversion.


Инсталляция продуктов


cSvn пакет состоит из двух частей. Первая представляет собой обычный Linux демон, который отвечает за разбор конфигурационного файла /etc/csvnrc. Вторая непосредственно является CGI-скриптом, отвечающим на HTTP запросы клиента. Обе части устанавливаются одновременно.


Исходные тексты


Получить исходный пакет cSvn можно двумя способами: загрузить с FTP-сервера или с помощью Subversion:


svn checkout svn://radix.pro/csvn/trunk csvn

Если использован второй способ, то перед сборкой пакета необходимо приготовить исходные тексты для их последующего конфигурирования. Для этого нужно воспользоваться скриптом bootstrap:


cd csvn./bootstarp

который установит Autotools средства, соберет коллекцию aclocal.m4 и создаст configure скрипт.


Сборка пакета


Сборка и установка cSvn ни чем не отличается от любых других продуктов, использующих средства Autoconf, Automake:


./configure --prefix=/usr \            --sysconfdir=/etc \            --with-config=/etc/csvnrc \            --with-controldir=/etc/rc.d \            --with-logrotatedir=/etc/logrotate.d \            --with-scriptdir=/var/www/htdocs/csvn \            --with-homedir=/var/lib/csvn \            --with-logdir=/var/log \            --with-piddir=/var/runmakemake install

Здесь, параметр --with-scriptdir определяет место установки CGI-скрипта и связанных с ним файлов, необходимых для работы сервера cSvn. Далее, в описании настроек сервера Nginx, мы будем использовать именно этот каталог. Разумеется, пользователи могут настроить работу cSvn и виртуального HTTP сервера относительно любого другоро каталога.


Права доступа


После инсталляции пакета cSvn необходимо отдать права на каталог /var/www/htdocs/csvn пользователю, от имени которого работает Nginx:


  chown -R nginx:nginx /var/www/htdocs/csvn


Subversion репозитории


Перед первым запуском сервера cSvn необходимо создать конфигурационный файл /etc/csvnrc, в котором должны быть определены все обязательные переменные и описан хотя бы один репозиторий.


На странице руководства csvnrc(5) приведен рабочий файл конфигурации сервера:


/etc/csvnrc:
svn-utc-offset = +0300;checkout-prefix-readonly = 'svn://radix.pro';checkout-prefix          = 'svn+ssh://svn@radix.pro';branches = 'branches';trunk    = 'trunk';tags     = 'tags';snapshots = 'tar.xz';css = '/.csvn/css/csvn.css';logo = '/.csvn/pixmaps/csvn-banner-280x280.png';logo-alt = "Radix.pro";logo-link = "https://radix.pro";main-menu-logo = '/.csvn/pixmaps/logo/SVN-logo-white-744x744.svg';favicon-path = '/.csvn/pixmaps/favicon';syntax-highlight-css = '_csvn.css';header = '/.csvn/html/header.html';footer = '/.csvn/html/footer.html';page-size = 200;owner = "Andrey V.Kosteltsev";author = "Andrey V.Kosteltsev";title = "Radix.pro SVN Repositories";description = "Subversion repositories hosted at radix.pro (St.-Petersburg)";keywords = "cSvn repositories";copyright = " Andrey V. Kosteltsev, 2019  2020.";copyright-notice = "Where any material of this site is being reproduced, published or issued to others the reference to the source is obligatory.";home-page = "https://radix.pro/";section "Tools" {  repo 'csvn' {    owner = "Andrey V.Kosteltsev";    title = "cSvn CGI Script";    description = "cSvn CGI Script  is a web frontend for Subversion Repositories";    home-page = "https://radix.pro/";  }}

Его можно использовать как начальный шаблон.


После создания конфигурационного файла /etc/csvnrc можно проверить работу csvnd(8) демона.


В случае работы на системе с BSD-like инициализацией, для запуска csvnd(8) демона достаточно выполнить команду


/etc/rc.d/rc.csvnd start

Для систем использующих systemd, необходимо воспользоваться утилитой systemctl:


systemctl enable csvnd.servicesystemctl start csvnd.service

Здесь необходимо упомянуть следующее...

При сборке и установке исходного пакета cSvn, устанавливается start/stop скрипт /etc/rc.d/rc.csvnd. Если же речь идет о системах использующих systemd, то для установки cSvn лучше использовать бинарный RPM или pacman пакет, поскольку в таких пакетах файл /etc/rc.d/rc.csvnd заменяется на Systemd Unit,


/usr/lib/systemd/system/csvnd.service:
[Unit]Description=The cSvn daemonAfter=network.target[Service]PIDFile=/var/run/csvnd.pidExecStart=/usr/sbin/csvnd --daemonize --inotify --config=/etc/csvnrcExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s TERM $MAINPID[Install]WantedBy=multi-user.target

устанавливаемый в каталог /usr/lib/systemd/system.


Если для используемой вами системы еще не создан пакет cSvn, то вы его можете приготовить самостоятельно, по инструкциям, приведенным к каталоге doc/build-packages.


Если же вы не хотите создавать пакет для вашей системы, то вы можете просто поместить файл csvnd.service в каталог /usr/lib/systemd/system/ и выполнить запуск демона самостоятельно.



После запуска csvnd(8) демона надо убедиться в существовании файла /dev/shm/csvn.bcf и, в случае его отсутствия посмотреть на ошибки приведенные в /var/log/csvnd.log файле.


Настройка uWsgi


Поскольку на этапе конфигурирования мы выбрали для инсталляции cSvn CGI-скрипта каталог /var/www/htdocs/csvn/, файл /etc/uwsgi/csvn.ini должен ваглядеть следующим образом:


/etc/uwsgi/csvn.ini:
[uwsgi]master          = trueplugins         = cgisocket          = /run/uwsgi/%n.sockuid             = nginxgid             = nginxprocname-master = uwsgi csvnprocesses       = 1threads         = 2cgi             = /var/www/htdocs/csvn/csvn.cgi

Здесь переменная cgi устанавливает полное имя CGI-скрипта cSvn.


Для запуска uWsgi демона на системах с BSD-like инициализацией, такой как Slackware, необходимо создать start/stop скрипт следующего вида:


/ets/rc.d/rc.csvn-uwsgi:
#!/bin/sh## uWSGI daemon control script.#CONF=csvnBIN=/usr/bin/uwsgiCONFDIR=/etc/uwsgiPID=/var/run/$CONF-uwsgi.piduwsgi_start() {  # Sanity checks.  if [ ! -r $CONFDIR/csvn.ini ]; then # no config files, exit:    echo "There are config files in $CONFDIR directory. Abort."    exit 1  fi  if [ -s $PID ]; then    echo "uWSGI for cSvn appears to already be running?"    exit 1  fi  echo "Starting uWSGI for cSvn server daemon..."  if [ -x $BIN ]; then    /bin/mkdir -p /run/uwsgi    /bin/chown nginx:nginx /run/uwsgi    /bin/chmod 0755 /run/uwsgi    $BIN --thunder-lock --pidfile $PID --daemonize /var/log/csvn-uwsgi.log --ini $CONFDIR/$CONF.ini  fi}uwsgi_stop() {  echo "Shutdown uWSGI for cSvn gracefully..."  /bin/kill -INT $(cat $PID)  /bin/rm -f $PID}uwsgi_reload() {  echo "Reloading uWSGI for cSvn configuration..."  kill -HUP $(cat $PID)}uwsgi_restart() {  uwsgi_stop  sleep 3  uwsgi_start}case "$1" in  start)    uwsgi_start    ;;  stop)    uwsgi_stop    ;;  reload)    uwsgi_reload    ;;  restart)    uwsgi_restart    ;;  *)  echo "usage: `basename $0` {start|stop|reload|restart}"esac

Дать ему права на выполнение


  chmod a+x /ets/rc.d/rc.csvn-uwsgi

и добавить следующие строчки в файлы /etc/rc.d/rc.M, /etc/rc.d/rc.6, соответственно:


/etc/rc.d/rc.M:
# Start uWSGI for cSvn server:if [ -x /etc/rc.d/rc.csvn-uwsgi ]; then  /etc/rc.d/rc.csvn-uwsgi startfi

/etc/rc.d/rc.6:
# Stop uWSGI for cSvn server:if [ -x /etc/rc.d/rc.csvn-uwsgi ]; then  /etc/rc.d/rc.csvn-uwsgi stopfi


Настройка Nginx


Конфигурационный файл, для выбранного нами каталога установки и домена csvn.example.org должен выглядеть следующим образом:


/etc/nginx/vhosts/csvn.example.org.conf:
## cSvn server:#    server {        listen 80;        server_name csvn.example.org;        return 301 https://csvn.example.org$request_uri;    }    server {        listen 443 ssl;        server_name csvn.example.org;        root /var/www/htdocs/csvn;        charset UTF-8;        #        # see:        #   https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security ,        #   https://raymii.org/s/tutorials/HTTP_Strict_Transport_Security_for_Apache_NGINX_and_Lighttpd.html        #        # see also: http://classically.me/blogs/how-clear-hsts-settings-major-browsers        # and do not include includeSubdomains; parameter into line:        #        add_header Strict-Transport-Security "max-age=63072000; preload";        error_log /var/log/nginx/csvn.example.org-error.log;        access_log /var/log/nginx/csvn.example.org-access.log;        keepalive_timeout        60;        ssl_certificate          /etc/letsencrypt/live/csvn.example.org/fullchain.pem;        ssl_certificate_key      /etc/letsencrypt/live/csvn.example.org/privkey.pem;        ssl_trusted_certificate  /etc/letsencrypt/live/csvn.example.org/chain.pem;        ssl_protocols            SSLv3 TLSv1 TLSv1.1 TLSv1.2;        ssl_ciphers              "RC4:HIGH:!aNULL:!MD5:!kEDH";        gzip on;        gzip_disable "msie6";        gzip_comp_level 6;        gzip_min_length 1100;        gzip_buffers 16 8k;        gzip_proxied any;        gzip_types text/plain text/css text/js text/xml text/javascript                   image/svg+xml image/gif image/jpeg image/png                   application/json application/x-javascript application/xml application/xml+rss application/javascript                   font/truetype font/opentype application/font-woff application/font-woff2                   application/x-font-ttf application/x-font-opentype application/vnd.ms-fontobject application/font-sfnt;        #        # Serve static content with nginx        #        #        # Rewrite rules for versioning CSS + JS thtouh filemtime directive        #        location ~* ^.+.(css|js)$ {            rewrite ^(.+).(d+).(css|js)$ $1.$3 last;            expires 31536000s;            access_log off;            log_not_found off;            add_header Pragma public;            add_header Cache-Control "max-age=31536000, public";        }        #        # Caching of static files        #        location ~* .(eot|gif|gz|gzip|ico|jpg|jpeg|otf|pdf|png|svg|svgz|swf|tar|t?gz|woff|zip)$ {            expires 31536000s;            access_log off;            log_not_found off;            add_header Pragma public;            add_header Cache-Control "max-age=31536000, public";        }        location ~ ^/favicon.ico$ {            root /u3/nginx/vhosts/csvn;            access_log off;            log_not_found off;            expires 30d;        }        location = /robots.txt {            allow all;            log_not_found off;            access_log off;        }        location / {            try_files $uri @csvn;        }        location @csvn {            gzip off;            include uwsgi_params;            uwsgi_modifier1 9;            uwsgi_pass unix:/run/uwsgi/csvn.sock;        }    }

После создания файла /etc/nginx/vhosts/csvn.example.org.conf его необходимо включить в основной конфигурационный файл Nginx:


/etc/nginx/nginx.conf:
    include /etc/nginx/vhosts/csvn.example.org.conf;

После запуска uWsgi и Nginx можно заняться настройкой репозториев используя руководство csvnrc(5).



Заключительная настройка


Все необходимые файлы для работы на стороне web-клиента находятся в каталоге /var/www/htdocs/csvn/.csvn/. Редактируя файл /.csvn/html/header.html и меняя значения переменных в файле /etc/csvnrc, пользователь может сменить favicon.ico, поменять тему подсветки синтаксиса, выбрать изображения для собственных репозиториев, задать ключевые слова для поисковых систем, а также выполнить множество других настроек своего сервера.


Внешний вид интерфейса определяется единственным CSS-файлом и поэтому, пользователь может поменять тему web-интерфейса так, как ему будет необходимо.


Посмотреть на рабочую копию cSvn сервера можно здесь.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru