Apache CouchDB README
=====================

Apache CouchDB is alpha software and still under heavy development. Please be
aware that important areas such as the public API or internal database format
may see backwards incompatible changes between versions.

Apache CouchDB is an effort undergoing incubation at the Apache Software
Foundation (ASF), sponsored by the Apache Incubator PMC. Incubation is required
of all newly accepted projects until a further review indicates that the
infrastructure, communications, and decision making process have stabilized in a
manner consistent with other successful ASF projects. While incubation status is
not necessarily a reflection of the completeness or stability of the code, it
does indicate that the project has yet to be fully endorsed by the ASF.

Building From Subversion
------------------------

You can skip this section if you are installing from a release tarball.

### Dependencies ###

To build Apache CouchDB from checkout you need some of the following installed:

 * [GNU Automake][01] (>=1.6.3) (required)
 * [GNU Autoconf][02] (>=2.59) (required)
 * [GNU Libtool][03] (required)
 * [help2man][04] (optional)

If you are running a Debian GNU/Linux system (or a derivative such as Ubuntu
GNU/Linux) you can install these dependencies using the `apt-get` command:

    apt-get install automake autoconf libtool help2man

The OS X version of these dependencies may be out of date so it is recommended
that you use [MacPorts][05] to install newer versions using the `port` command:

    port install automake autoconf libtool help2man

### Bootstrapping ###

Note: You must repeat this step every time you update your Subversion checkout.

Follow the [check out instructions][06] and bootstrap the pristine source by
running the following command:

    ./bootstrap

Installation And First Run
--------------------------

You will need the following installed:

 * [Erlang OTP][07] (>=R11B) (required)
 * [ICU][08] (required)
 * [Mozilla SpiderMonkey][09] (required)
 * [GNU Make][10] (required)
 * [GNU Compiler Collection][11] (required)

### UNIX-like Operating Systems (inc. OS X) ###

#### Dependencies ####

##### Debian-based (inc. Ubuntu) Systems #####

If you are running a Debian GNU/Linux system (or a derivative such as Ubuntu
GNU/Linux) you can install the dependencies using the `apt-get` command:

    apt-get install build-essential erlang libicu38 libicu-dev libmozjs-dev

If you get an error regarding the `libicu38` or `libicu-dev` be sure to check
the version used by your distribution (using `apt-cache search libicu`) and
install those packages instead.

##### OS X #####

To install GNU Make and the GNU Compiler Collection on OS X you should install
the Xcode Tools metapackage by running the following command:

    open /Applications/Installers/Xcode\ Tools/XcodeTools.mpkg

We recommend that you satisfy the other dependancies by installing
[MacPorts][07] and running the following command:

    port install icu erlang spidermonkey

Note: Don't forget to open a new terminal after you have installed MacPorts
as it updates your PATH and you will not be able to run the `port` command
without the effects of this change.

To update your `locate` database you may want to run the following command:

    sudo /usr/libexec/locate.updatedb

#### Installing ####

Once you have satisfied dependencies you should run the following command:

    ./configure

Note: Apache CouchDB is installed into `/usr/local` by default. If you want to
change where Apache CouchDB is installed (or where to find Erlang) be sure to
read the output from running the `./configure --help` command.

Note: All the examples assume you have installed into `/usr/local`.

If everything was successful you should see the following message:

    You have configured Apache CouchDB. Time to relax.

Relax.

To install Apache CouchDB you should then run the following command:

    make && sudo make install

If you do not wish to be prompted to overwrite any existing Apache CouchDB
configuration files you should run the following command:

    sudo make && yes | sudo make install

Note: Use of the `sudo` command is only required if you are installing into a
system owned directory. You do not need to do this if you are installing
elsewhere, such as your home directory.

More options can be found by reading the `INSTALL` file.

#### Security Considerations ####

It is not advisable to run Apache CouchDB as the superuser. We strongly
recommend that you create a specific user to run Apache CouchDB and own the
data/log directories.

You can use whatever tool your system provides to create a new `couchdb` user.

On many UNIX-like systems you can run the following command:

    adduser --system --home /var/lib/couchdb --no-create-home \
            --shell /bin/bash --group --gecos "CouchDB Administrator" couchdb

OS X provides the standard Accounts option from the System Preferences
application or you can optionally use the Workgroup Manager application which
can be downloaded as part of the [Server Admin Tools][12].

You should make sure that the `couchdb` user has a working POSIX shell and set
the home directory to `/usr/local/var/lib/couchdb` which is the Apache CouchDB
database directory.

Make sure to change the ownership of the Apache CouchDB data directories by
running the following commands:

    chown -R couchdb /usr/local/var/lib/couchdb
    chown -R couchdb /usr/local/var/log/couchdb

#### Running Manually ####

To start the Apache CouchDB server you should run the following command:

    sudo -u couchdb couchdb

This uses the `sudo` command to run the `couchdb` command as the `couchdb` user.

When Apache CouchDB starts it should eventually display the following message:

    Apache CouchDB has started. Time to relax.

Relax.

To check that everything has worked point your web browser to
[http://localhost:5984/_utils/index.html][13] and run the test suite.

##### OS X #####

If you get error when running Apache CouchDB that look like the following:

    dyld: Library not loaded: libicuuc.38.dy

You should make sure that your `~/.profile` file contains the following line:

    export DYLD_LIBRARY_PATH=/opt/local/lib:$DYLD_LIBRARY_PATH

This should have been added for you by MacPorts but may be missing.

#### Running as a Daemon ####

Note: These instructions assume you have created the `couchdb` user. See the
specific system information included below to learn how to reconfigure this.

Note: If any of these methods report a failure you can run the `couchdb`
command manually to see the error messages it is displaying.

The `/usr/local/etc/logrotate.d/couchdb` file is provided as a logrotate
configuration that you can use to rotate Apache CouchDB's logs.

##### SysV/BSD-style Systems #####

Depending on your system the `couchdb` init script will be installed into a
direcory called `init.d` (for SysV-style systems) or `rc.d` (for BSD-style
systems). These examples use the `[init.d|rc.d]` notation to indicate this.

You can control the Apache CouchDB daemon by running the following command:

    /usr/local/etc/[init.d|rc.d]/couchdb [start|stop|restart|force-reload|status]

If you wish to configure how the init script works, such as which user to run
Apache CouchDB as, you must edit the `/usr/local/etc/default/couchdb` file as
appropriate. If you are running the init script as a non-superuser you need to
remove the line with the `COUCHDB_USER` setting.

If you wish the ApacheCouchDB daemon to run as a system service you need to copy
the `/usr/local/etc/[init.d|rc.d]/couchdb` script into your system wide
`/etc/[init.d|rc.d]` directory and update your system configuration as
appropriate.  Consult your system documentation for more information.

If you are running a Debian GNU/Linux system (or a derivative such as Ubuntu
GNU/Linux) you can configure your system using the following command:

    sudo update-rc.d couchdb defaults

##### OS X #####

You can use the `launchctl` command to control the Apache CouchDB daemon.

To load the launchd configuration you must run the following command:

    sudo launchctl load /usr/local/Library/LaunchDaemons/org.apache.couchdb

You can stop the Apache CouchDB daemon by running the following command:

    sudo launchctl unload /usr/local/Library/LaunchDaemons/org.apache.couchdb

If you wish to change the launchd configuration, such as which user to run
Apache CouchDB as, you must edit the
`/usr/local/Library/LaunchDaemons/org.apache.couchdb.plist` file as
appropriate.

If you wish the Apache CouchDB daemon to run as a system service you need to
copy the `/usr/local/Library/LaunchDaemons/org.apache.couchdb.plist` file into
your system wide `/Library/LaunchDaemons` directory.

### Windows ###

Windows documentation is incomplete. Please submit suggestions.

[01]: http://www.gnu.org/software/automake/
[02]: http://www.gnu.org/software/autoconf/
[03]: http://www.gnu.org/software/libtool/
[04]: http://www.gnu.org/software/help2man/
[05]: http://www.macports.org/
[06]: http://incubator.apache.org/couchdb/community/code.html
[07]: http://erlang.org/
[08]: http://icu.sourceforge.net/
[09]: http://www.mozilla.org/js/spidermonkey/
[10]: http://www.gnu.org/software/make/
[11]: http://gcc.gnu.org/
[12]: http://www.apple.com/support/downloads/serveradmintools1047.html
[13]: http://localhost:5984/_utils/index.html
