Introduction
Comme bapt, j'ai pour mes besoins personnels de mettre en place une forge sur mon OS préféré afin de dégager mon vieux truc sur une jail et quelques wrappers...
Redmine est donc une bonne alternative a tout ce qui trainne et en plus c'est en ruby (balle avec des branches dedans !).
Pas mal de composants sont sur les ports donc nous allons les utiliser port :
- redmine : /usr/ports/www/redmine
- mysql (ou pgsql... a vous de choisir)
- ruby-mysql : /usr/ports/databases/ruby-mysql
- thin : le serveur web du coma pour ruby : /usr/ports/www/rubygem-thin
- le binding image magic : ruby-rmagick : /usr/ports/graphics/ruby-rmagick
- subversion : /usr/ports/devel/subversion (git me gonflant par manque de doc et le bordel général de ce soft...)
- apache2.2 : /usr/ports/www/apache22
- lighttpd : /usr/ports/www/lighttpd
- mod_perl : /usr/ports/www/mod_perl2 (pour svn pawah)
Pour l'installation des ports, c'est assez simple et je passe donc cette étape.
Après compilation de tous ces packages, il vous reste a configurer redmine, la base mysql, thin et le serveur SVN :p
Configuration de redmine
Il s'agit de prendre en gros ce qu'il y a dans le manuel d'install de redmine.
Créer la base SQL :
En ligne de commande ou via phpmyadmin :p
create database redmine character set utf8; create user 'redmine'@'localhost' identified by 'my_password'; grant all privileges on redmine.* to 'redmine'@'localhost';
Configurer redmine
Dans /usr/local/www/redmine
cd config cp database.yml.example database.yml cp email.yml.example email.yml
Editer les 2 fichiers pour que la configuration soit correspondante a vos paramètres.
Configuration de base de redmine
Session store secret :
RAILS_ENV=production rake config/initializers/session_store.rb
Initialisation de la DB :
RAILS_ENV=production rake db:migrate
Insertion des valeurs par défaut :
RAILS_ENV=production rake redmine:load_default_data
Initialisation des plugins locaux
RAILS_ENV=production rake db:migrate_plugins
1er lancement
ruby script/server webrick -e production
Se connecter sur http://127.0.0.1:3000/ avec comme login admin et password admin. Vérifier que tout est ok puis arreter le server webrick a coup de Ctrl+C.
Configuration du serveur thin.
Thin permet d'avoir un serveur web rapide.
Droits d'accès
Dans notre forge, les accès web seront fait en tant www:www. Comme dans notre test, nous avons accédés a pas mal de pages en tant que root. Il faut changer les droits pour le serveur web thin se pete pas la tete :
cd /usr/local/www && chown -R www:www redmine
Fichier de démarrage
Il reprends le fichier de démarrage de bapt avec les modification FreeBSD :
[kiwi@dev2 /usr/local/etc/rc.d]$ cat thin
#!/bin/sh
#
# PROVIDE: thin
# REQUIRE: DAEMON
#
# thin_enable="YES"
#
thin_enable=${thin_enable-"NO"}
. /etc/rc.subr
name=thin
rcvar=`set_rcvar`
command=/usr/local/bin/${name}
stop_cmd="/usr/local/bin/thin -c /usr/local/www/redmine -e production stop"
command_args="-c /usr/local/www/redmine -e production -d -u www -g www start"
load_rc_config ${name}
run_rc_command "$1"
Pour l'activer :
# chmod 755 /usr/local/etc/rc.d/thin # echo "thin_enable=YES" >> /etc/rc.conf # /usr/local/etc/rc.d/thin start
Le serveur web tourne alors sur le port 3000, vous pouvez donc vous connecter dessus sans soucis. En cas d'un internal error, il faut jeter un coup d'oeil dans /usr/local/www/redmine/log/* afin de voir où est l'erreur... (en général c'est des problèmes de droits...).
Lighttpd
Afin de rendre la chose propre et éviter que thin soit direct sur le net, un coup de lighttpd sera a installer.
La compilation est simple, soit laisser les options par défaut, soit les modifier 
Fichier de conf (sans les commentaires, histoire de garder de la place) :
server.modules = (
"mod_redirect",
"mod_access",
"mod_proxy",
"mod_accesslog" )
# [...] configuration du reste selon vos envies
server.document-root = "/usr/local/www/data/"
$SERVER["socket"] == "0.0.0.0:443" {
##### SSL engine
ssl.engine = "enable"
ssl.pemfile = "/usr/local/etc/CA/xxx.pem"
ssl.ca-file = "/usr/local/etc/CA/ca-bundle.pem"
}
$SERVER["socket"] == ":80" {
$HTTP["host"] =~ "redmine.oav.net$" {
url.redirect = ( "^/(.*)" => "https://redmine.oav.net/$1" )
server.name = "redmine.oav.net"
}
}
$HTTP["host"] == "redmine.oav.net" {
proxy.server = ( "" =>
(
( "host" => "127.0.0.1",
"port" => 3000
)
)
)
}
Evidement le reste de la conf de lighttpd est a compléter selon vos envies.
SVN et ses amis...
Introduction
Dans le cas de redmine, on peux couple SVN avec la base d'authentification de redmine afin de n'avoir qu'un seul point d'accès.
Dans mon exemple j'ai voulu avoir accès au module SVN, _que_ via SSL. Subversion aimant apache 2.0 par defaut, il faut donc compiler apache avant SVN
Compilation de apache 2.2
Dans /usr/ports/www/apache22, compiler apache avec les options suivantes :
_OPTIONS_READ=apache-2.2.14_5 WITHOUT_APR_FROM_PORTS=true WITH_THREADS=true WITH_MYSQL=true WITHOUT_PGSQL=true WITH_SQLITE=true WITH_IPV6=true WITH_BDB=true WITH_AUTH_BASIC=true WITH_AUTH_DIGEST=true WITH_AUTHN_FILE=true WITH_AUTHN_DBD=true WITH_AUTHN_DBM=true WITH_AUTHN_ANON=true WITH_AUTHN_DEFAULT=true WITH_AUTHN_ALIAS=true WITH_AUTHZ_HOST=true WITH_AUTHZ_GROUPFILE=true WITH_AUTHZ_USER=true WITH_AUTHZ_DBM=true WITH_AUTHZ_OWNER=true WITH_AUTHZ_DEFAULT=true WITH_CACHE=true WITH_DISK_CACHE=true WITH_FILE_CACHE=true WITHOUT_MEM_CACHE=true WITH_DAV=true WITH_DAV_FS=true WITHOUT_BUCKETEER=true WITHOUT_CASE_FILTER=true WITHOUT_CASE_FILTER_IN=true WITHOUT_EXT_FILTER=true WITHOUT_LOG_FORENSIC=true WITHOUT_OPTIONAL_HOOK_EXPORT=true WITHOUT_OPTIONAL_HOOK_IMPORT=true WITHOUT_OPTIONAL_FN_IMPORT=true WITHOUT_OPTIONAL_FN_EXPORT=true WITHOUT_LDAP=true WITHOUT_AUTHNZ_LDAP=true WITH_ACTIONS=true WITH_ALIAS=true WITH_ASIS=true WITH_AUTOINDEX=true WITH_CERN_META=true WITH_CGI=true WITH_CHARSET_LITE=true WITH_DBD=true WITHOUT_DEFLATE=true WITH_DIR=true WITH_DUMPIO=true WITH_ENV=true WITH_EXPIRES=true WITH_HEADERS=true WITH_IMAGEMAP=true WITH_INCLUDE=true WITH_INFO=true WITH_LOG_CONFIG=true WITH_LOGIO=true WITH_MIME=true WITH_MIME_MAGIC=true WITH_NEGOTIATION=true WITH_REWRITE=true WITH_SETENVIF=true WITH_SPELING=true WITH_STATUS=true WITH_UNIQUE_ID=true WITH_USERDIR=true WITH_USERTRACK=true WITH_VHOST_ALIAS=true WITH_FILTER=true WITH_VERSION=true WITHOUT_PROXY=true WITHOUT_PROXY_CONNECT=true WITHOUT_PATCH_PROXY_CONNECT=true WITHOUT_PROXY_FTP=true WITHOUT_PROXY_HTTP=true WITHOUT_PROXY_AJP=true WITHOUT_PROXY_BALANCER=true WITHOUT_PROXY_SCGI=true WITH_SSL=true WITHOUT_SUEXEC=true WITHOUT_CGID=true
Compilation de mod_perl2
Dans ''/usr/ports/www/mod_perl2", compiler avec les options par defaut
Compilation de SVN
Dans /usr/ports/devel, compiler avec les options :
_OPTIONS_READ=subversion-1.6.6_1 WITH_MOD_DAV_SVN=true WITH_APACHE2_APR=true WITH_MOD_DONTDOTHAT=true WITH_NEON=true WITHOUT_SERF=true WITHOUT_SASL=true WITH_BDB=true WITHOUT_ASVN=true WITHOUT_MAINTAINER_DEBUG=true WITHOUT_SVNSERVE_WRAPPER=true WITHOUT_STATIC=true WITHOUT_BOOK=true
Quelques modules perl a ajouter
- p5-DBD-mysql : /usr/ports/database/p5-DBD-mysql
- p5-Digest-SHA1 : /usr/ports/security/p5-Digest-SHA1
Configuration de redmine pour qu'il accepte l'autocreation des repository SVN
Par rapport a la doc de redmine, il faut donc autoriser ''Enable WS for repository management", qui se trouve dans le compte admin de Redmine dans :
Administration -> Settings -> Repository -> Enable WS for repository management
C'est la seconde case a cocher... j'ai un poil jamais vu cette case... peut-être que mes yeux auto-filtrent(tm)(r)(c) les trucs dont j'ai besoin 
Créer le répertoire père pour svn et configurer l'autocreate de respository.
mkdir /svn chown www:www /svn cd /usr/local/www/redmine && /usr/local/bin/ruby extra/svn/reposman.rb --redmine 127.0.0.1:3000 --svn-dir /svn --owner www --url file:///svn --verbose
Vous pouvez mettre la dernière ligne en crontab ou dans un script shell, type /etc/daily.local par exemple. Normalement lors de l'exécution de la dernière ligne les repository sont automatiquement crées *et* ajouté dans les "dépôts" sur l'interface web...
Il ne reste plus qu'à mettre à dispo les repository en http.
Configuration du Sioux
Remarque
Je voulais mettre Apache derrière un lighttpd, mais il me semble que lighttpd 1.4.x manque quelques fonctions importantes pour le webdav ou sont un poil incomplètes en mod_proxy. Si vous avez des infos et/ou des modifications faites le moi parvenir.
Fichier ''httpd.conf'
Ne garder que les modules suivants et dans l'ordre (il y a peut être quelques modules superflux... merci de me l'indiquer !) :
ServerRoot "/usr/local" Listen 8080 # port a la con pas utilisé ! # LoadModule authn_file_module libexec/apache22/mod_authn_file.so LoadModule authn_dbm_module libexec/apache22/mod_authn_dbm.so LoadModule authn_anon_module libexec/apache22/mod_authn_anon.so LoadModule authn_dbd_module libexec/apache22/mod_authn_dbd.so LoadModule authn_default_module libexec/apache22/mod_authn_default.so LoadModule authn_alias_module libexec/apache22/mod_authn_alias.so LoadModule authz_host_module libexec/apache22/mod_authz_host.so LoadModule authz_groupfile_module libexec/apache22/mod_authz_groupfile.so LoadModule authz_user_module libexec/apache22/mod_authz_user.so LoadModule authz_dbm_module libexec/apache22/mod_authz_dbm.so LoadModule authz_owner_module libexec/apache22/mod_authz_owner.so LoadModule authz_default_module libexec/apache22/mod_authz_default.so LoadModule auth_basic_module libexec/apache22/mod_auth_basic.so LoadModule auth_digest_module libexec/apache22/mod_auth_digest.so LoadModule log_config_module libexec/apache22/mod_log_config.so LoadModule logio_module libexec/apache22/mod_logio.so LoadModule env_module libexec/apache22/mod_env.so LoadModule mime_magic_module libexec/apache22/mod_mime_magic.so LoadModule cern_meta_module libexec/apache22/mod_cern_meta.so LoadModule headers_module libexec/apache22/mod_headers.so LoadModule usertrack_module libexec/apache22/mod_usertrack.so LoadModule unique_id_module libexec/apache22/mod_unique_id.so LoadModule setenvif_module libexec/apache22/mod_setenvif.so LoadModule ssl_module libexec/apache22/mod_ssl.so LoadModule mime_module libexec/apache22/mod_mime.so LoadModule asis_module libexec/apache22/mod_asis.so LoadModule info_module libexec/apache22/mod_info.so LoadModule rewrite_module libexec/apache22/mod_rewrite.so LoadModule perl_module libexec/apache22/mod_perl.so LoadModule dav_module libexec/apache22/mod_dav.so LoadModule dav_svn_module libexec/apache22/mod_dav_svn.so
plus loin dans le fichier :
# Server-pool management (MPM specific) Include etc/apache22/extra/httpd-mpm.conf #... # Secure (SSL/TLS) connections Include etc/apache22/extra/httpd-ssl.conf
dans le répertoire ''/usr/local/etc/apache22/extra :
cp httpd-mpm.conf httpd-mpm.conf.orig cp httpd-ssl.con httpd-ssl.conf.orig
fichier httpd-mpm.conf
<IfModule mpm_prefork_module>
StartServers 1
MinSpareServers 1
MaxSpareServers 10
MaxClients 15
MaxRequestsPerChild 10
</IfModule>
fichier httpd-ssl.conf
more httpd-ssl.conf Listen 1443 AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl SSLPassPhraseDialog builtin SSLSessionCache "shmcb:/var/run/ssl_scache(512000)" SSLSessionCacheTimeout 300 SSLMutex "file:/var/run/ssl_mutex"
Créer le fichier /usr/local/etc/apache22/Include/svn.conf
C'est ce fichier qui faire la magie webdav / svn / redmine
PerlRequire /usr/local/etc/apache22/perl/startup.pl
<VirtualHost *:1443>
DocumentRoot "/var/empty"
ServerName svn.oav.net:443
ServerAdmin kiwi@oav.net
ErrorLog "/var/log/httpd-error.log"
TransferLog "/var/log/httpd-access.log"
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/usr/local/etc/CA/domain.crt"
SSLCertificateKeyFile "/usr/local/etc/CA/domain.key"
SSLCACertificateFile "/usr/local/etc/CA/ca-bundle.pem"
BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
PerlLoadModule Apache::Authn::Redmine
<Location />
DAV svn
SVNParentPath /svn
Order deny,allow
Deny from all
Satisfy any
PerlAccessHandler Apache::Authn::Redmine::access_handler
PerlAuthenHandler Apache::Authn::Redmine::authen_handler
AuthType Basic
Authname "SVN repository"
Require valid-user
RedmineDSN "DBI:mysql:database=redmine;host=sql-srv"
RedmineDbUser "redmine-user"
RedmineDbPass "redmine-pass"
# Read only access
<Limit GET PROPFIND OPTIONS REPORT>
Require valid-user
Allow from 111.222.222.333
# Allow from ip...
Allow from 127.0.0.1
Satisfy any
</Limit>
# Write Access
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
</Location>
</VirtualHost>
Creer la magie nécessaire a mod_perl
cd /usr/local/etc/apache22 mkdir -p perl/Apache/Authn cd perl cp /usr/local/www/redmine/extra/Redmine.pm Apache/Authn
Dans le fichier startup.pl :
use lib qw(/usr/local/etc/apache22/perl); 1;
Démarrez apache2.2 et vous avez votre repository.
TODO
- Mail on commit
- Quoi d'autres?










Il y a quelques semaines, j'ai ouvert vers 22h ou 23h une fenêtre afin d'aérer un peu.... Bref rien de plus que 10 minutes d'une fenêtre ouverte avec la lumière dans la pièce.