# Plugin SyncMonotone by Thomas Keller (me@thomaskeller.biz)␊ |
␊ |
The SyncMonotone plugin allow the direct creation and synchronisation of␊ |
monotone repositories with the InDefero database. It has been built to␊ |
work together with monotone's "super server" usher, which is used to control␊ |
several repositories at once, acts as proxy and single entrance.␊ |
␊ |
## Prerequisites␊ |
␊ |
* a unixoid operating system␊ |
* monotone >= 0.99␊ |
* for a proxy setup with usher:␊ |
* boost headers (for usher compilation)␊ |
* a current version of usher␊ |
* a daemonizer, like supervise␊ |
␊ |
## Installation of monotone␊ |
␊ |
If you install monotone from a distribution package, ensure you do not␊ |
install and / or activate the server component. We just need a plain␊ |
client installation which usually consists only of the `mtn` binary and␊ |
a few docs.␊ |
␊ |
If you install monotone from source (<http://monotone.ca/downloads.php>),␊ |
please follow the `INSTALL` document which comes with the software.␊ |
It contains detailed instructions, including all needed dependencies.␊ |
␊ |
## Choose your indefero setup␊ |
␊ |
The monotone plugin can be used in several different ways:␊ |
␊ |
1. One database for everything. This is the easiest setup and of possible␊ |
use in case you do not want indefero to manage the access to your project.␊ |
Your `idf.php` should look like this:␊ |
␊ |
$ cat idf.php␊ |
...␊ |
$cfg['mtn_path'] = 'mtn';␊ |
$cfg['mtn_opts'] = array('--no-workspace', '--no-standard-rcfiles');␊ |
$cfg['mtn_repositories'] = '/home/monotone/all_projects.mtn';␊ |
$cfg['mtn_remote_url'] = 'ssh://monotone@my.server.com:~all_projects.mtn';␊ |
$cfg['mtn_db_access'] = 'local';␊ |
...␊ |
␊ |
Pro:␊ |
* easy to setup and to manage␊ |
␊ |
Con:␊ |
* you need to give committers SSH access to your machine␊ |
* database lock problem: the database from which␊ |
indefero reads its data might be locked in case a user␊ |
syncs at the very moment via SSH␊ |
␊ |
2. One database for every project. Similar to the above setup, but this␊ |
time you use the '%s' placeholder which is replaced with the short name␊ |
of the indefero project:␊ |
␊ |
$ cat idf.php␊ |
...␊ |
$cfg['mtn_path'] = 'mtn';␊ |
$cfg['mtn_opts'] = array('--no-workspace', '--no-standard-rcfiles');␊ |
$cfg['mtn_repositories'] = '/home/monotone/%s.mtn';␊ |
$cfg['mtn_remote_url'] = 'ssh://monotone@my.server.com:~%s.mtn';␊ |
$cfg['mtn_db_access'] = 'local';␊ |
...␊ |
␊ |
The same pro's and con's apply. Additionally you have to be careful about␊ |
not giving people physical read/write access of another project's database.␊ |
␊ |
Furthermore, if you do not want to use `ssh`, but `netsync` transport,␊ |
each project's database must be served over a separate port.␊ |
␊ |
3. One database for every project, all managed with usher. This is the␊ |
recommended setup for a mid-size forge setup. The remaining part of this␊ |
document will describe the process to set this up in detail.␊ |
␊ |
Pro:␊ |
* access rights can be granted per project and are automatically␊ |
managed by indefero, just like the user's public monotone keys␊ |
* no database locking issues␊ |
* one public server running on the one well-known port␊ |
␊ |
Con:␊ |
* harder to setup␊ |
␊ |
## Installation and configuration of usher␊ |
␊ |
1. Clone usher's monotone repository:␊ |
␊ |
$ mtn clone "mtn://monotone.ca?net.venge.monotone.contrib.usher"␊ |
␊ |
2. Compile usher:␊ |
␊ |
$ autoreconf -i␊ |
$ ./configure && make␊ |
$ sudo make install␊ |
␊ |
This installs the usher binary in $prefix/bin.␊ |
␊ |
3. Create a new usher user:␊ |
␊ |
$ adduser --system --disabled-login --home /var/lib/usher usher␊ |
␊ |
4. Create the basic usher setup:␊ |
␊ |
$ cd /var/lib/usher␊ |
$ mkdir projects logs␊ |
$ cat > usher.conf␊ |
userpass "admin" "<secret-password>"␊ |
adminaddr "127.0.0.1:12345"␊ |
logdir "log"␊ |
^D␊ |
$ chmod 600 usher.conf␊ |
␊ |
Your indefero www user needs later write access to `usher.conf` and␊ |
`projects/`. There are two ways of setting this up:␊ |
␊ |
* Make the usher user the web user, for example via Apache's `suexec`␊ |
* Use acls, like this:␊ |
␊ |
$ setfacl -m u:www:rw usher.conf␊ |
$ setfacl -m d:u:www:rwx projects/␊ |
␊ |
5. Wrap a daemonizer around usher, for example supervise from daemontools␊ |
(<http://cr.yp.to/damontools.html>):␊ |
␊ |
$ cat > run␊ |
#!/bin/sh␊ |
cd /var/lib/usher␊ |
exec 2>&1␊ |
exec \␊ |
setuidgid usher \␊ |
usher usher.conf␊ |
^D␊ |
␊ |
The service can now be started through supervise:␊ |
␊ |
$ supervise /var/lib/usher␊ |
␊ |
## Configuration of indefero␊ |
␊ |
Based on the above setup, the configuration in `src/IDF/conf/idf.php` should␊ |
look like this:␊ |
␊ |
$ cat idf.php␊ |
...␊ |
$cfg['mtn_path'] = 'mtn';␊ |
$cfg['mtn_opts'] = array('--no-workspace', '--no-standard-rcfiles');␊ |
$cfg['mtn_repositories'] = '/var/lib/usher/projects/%s/';␊ |
$cfg['mtn_remote_url'] = 'mtn://my.server.com/%s';␊ |
$cfg['mtn_db_access'] = 'remote';␊ |
$cfg['mtn_remote_auth'] = true;␊ |
$cfg['mtn_usher_conf'] = '/var/lib/usher/usher.conf';␊ |
...␊ |
␊ |
The `%s` placeholders are automatically replaced by the name of the␊ |
indefero project. The plugin assumes that every project is separated␊ |
by a distinct server name in the monotone URL (hence the use of `/%s`),␊ |
so if a user calls␊ |
␊ |
$ mtn sync mtn://my.server.com/project1␊ |
␊ |
then the database / repository of the indefero `project1` is used.␊ |
Note that 'mtn_remote_url' is also used as internal URI to query the data␊ |
for indefero's source view, so it *must* be a valid host!␊ |
␊ |
Usher also allows the identification of a project repository by hostname,␊ |
which would allow an URL template like `mtn://%s.my.server.com`, however␊ |
the plugin does not write out the configuration which is needed for this␊ |
yet.␊ |
␊ |
For even more advanced setups, usher can also be used to forward sync␊ |
requests to other remote servers for load balancing, please consult the␊ |
README file for more information.␊ |
␊ |