| # 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.␊ | 
| ␊ |