cSvn é uma interface da web para repositórios Subversion . Base cSvn é CGI-script escrito em C .
Em maio de 2020, o lançamento da próxima versão do Apache Subversion 1.14.0 foi publicado . À luz desse evento, uma nova e moderna interface da web foi criada para visualizar os repositórios Subversion em qualquer dispositivo. Esta é uma notícia muito positiva para aqueles que usam sistemas de controle de versão centralizados devido ao fato de que até ontem havia apenas uma web-UI decente ( WebSVN ) escrita em PHP e, infelizmente, atrasada em relação aos requisitos modernos.
Este artigo cobre a instalação e configuração do cSvn para funcionar com Nginx + uWsgi . Configurar os componentes do servidor é bastante simples e praticamente não difere da configuração do cGit .
No lado do cliente, o JavaScript básico está sendo executado com no máximo 350 linhas e uma folha de estilo de 24K descompactada. Os textos de markdown são processados no lado do servidor usando a biblioteca md4c , que foi comprovada com sucesso no projeto KDE Plasma .
Em vez de capturas de tela, é melhor olhar para um servidor cSvn em execução .
É importante notar que usando o cSvn, você pode visualizar não apenas seus próprios repositórios, mas também configurar a visualização de recursos de terceiros usando os protocolos HTTPS e SVN.
Requisitos de sistema
cSvn usa as bibliotecas libpcre2 , md4c , libmagic incluídas no pacote de arquivos e libxml2 . O servidor deve ser instalado: servidor Nginx HTTP , servidor uWsgi e, claro, Apache Subversion .
Instalação de produtos
O pacote cSvn tem duas partes. O primeiro é um daemon regular do Linux que é responsável por analisar o arquivo de configuração / etc / csvnrc . O segundo é diretamente um script CGI que responde às solicitações do cliente HTTP. Ambas as peças são instaladas ao mesmo tempo.
Textos fonte
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/run
make
make 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, .
/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.service
systemctl 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 daemon
After=network.target
[Service]
PIDFile=/var/run/csvnd.pid
ExecStart=/usr/sbin/csvnd --daemonize --inotify --config=/etc/csvnrc
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/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 = true
plugins = cgi
socket = /run/uwsgi/%n.sock
uid = nginx
gid = nginx
procname-master = uwsgi csvn
processes = 1
threads = 2
cgi = /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=csvn
BIN=/usr/bin/uwsgi
CONFDIR=/etc/uwsgi
PID=/var/run/$CONF-uwsgi.pid
uwsgi_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 start
fi
/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 stop
fi
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, , , , .
A aparência da interface é determinada por um único arquivo CSS e, portanto, o usuário pode alterar o tema da interface da web conforme sua necessidade.
Você pode ver uma cópia de trabalho do servidor cSvn aqui .