<?xml version="1.0" encoding="UTF-8"?>
<section xml:id="installing-openstack-object-storage"
    xmlns="http://docbook.org/ns/docbook"
    xmlns:xi="http://www.w3.org/2001/XInclude"
    xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0">
    <title>Install Object Storage</title>
    <para>Though you can install OpenStack Object Storage for
        development or testing purposes on one server, a
        multiple-server installation enables the high availability and
        redundancy you want in a production distributed object storage
        system.</para>
    <para>To perform a single-node installation for development
        purposes from source code, use the Swift All In One
        instructions (Ubuntu) or DevStack (multiple distros). See
            <link
            xlink:href="http://swift.openstack.org/development_saio.html"
            >http://swift.openstack.org/development_saio.html</link>
        for manual instructions or <link
            xlink:href="http://devstack.org"
            >http://devstack.org</link> for all-in-one including
        authentication with the Identity Service (keystone).</para>
    <section xml:id="before-you-begin-swift-install">
        <title>Before you begin</title>
        <para>Have a copy of the operating system installation media
            available if you are installing on a new server.</para>
        <para>These steps assume you have set up repositories for
            packages for your operating system as shown in <link
                linkend="basics-packages">OpenStack
            Packages</link>.</para>
        <para>This document demonstrates how to install a cluster by
            using the following types of nodes:</para>
        <itemizedlist>
            <listitem>
                <para>One proxy node which runs the swift-proxy-server
                    processes. The proxy server proxies requests to
                    the appropriate storage nodes.</para>
            </listitem>
            <listitem>
                <para>Five storage nodes that run the
                    swift-account-server, swift-container-server, and
                    swift-object-server processes which control
                    storage of the account databases, the container
                    databases, as well as the actual stored
                    objects.</para>
            </listitem>
        </itemizedlist>
        <note>
            <para>Fewer storage nodes can be used initially, but a
                minimum of five is recommended for a production
                cluster.</para>
        </note>
    </section>
    <section xml:id="general-installation-steps-swift">
        <title>General installation steps</title>
        <procedure>
            <step>
                <para>Install core Swift files and openSSH.</para>
                <screen os="ubuntu"><prompt>#</prompt> <userinput>apt-get install swift openssh-server rsync memcached python-netifaces \
  python-xattr python-memcache</userinput></screen>
                <screen os="rhel;centos;fedora"><prompt>#</prompt> <userinput>yum install openstack-swift openstack-swift-proxy \
  openstack-swift-account openstack-swift-container \
  openstack-swift-object memcached</userinput></screen>
                <screen os="opensuse;sles"><prompt>#</prompt> <userinput>zypper install openstack-swift openstack-swift-proxy \
  openstack-swift-account openstack-swift-container \
  openstack-swift-object memcached</userinput></screen>
            </step>
            <step os="rhel;centos;fedora;opensuse;sles;ubuntu">
                <para>Create a <literal>swift</literal> user that the Object
                    Storage
                    Service can use to authenticate with the Identity Service.
                    Choose a password and specify an email address for the
                    <literal>swift</literal> user. Use the
                    <literal>service</literal> tenant and give the user the
                    <literal>admin</literal> role.</para>
                <screen><prompt>#</prompt> <userinput>keystone user-create --name=swift --pass=<replaceable>SWIFT_PASS</replaceable> \
   --email=<replaceable>swift@example.com</replaceable></userinput>
<prompt>#</prompt> <userinput>keystone user-role-add --user=swift --tenant=service --role=admin</userinput></screen>
            </step>
            <step>
                <para>Create a service entry for the Object Storage Service:</para>
                <screen><prompt>#</prompt> <userinput>keystone service-create --name=swift --type=object-store \
  --description="Object Storage Service"</userinput>
<computeroutput>+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
| description |      Object Storage Service      |
|             |                                  |
|             |                                  |
|      id     | eede9296683e4b5ebfa13f5166375ef6 |
|     name    |              swift               |
|     type    |           object-store           |
+-------------+----------------------------------+</computeroutput></screen>
                <para>The service ID is randomly generated and is different from
                    the one shown here.</para>
            </step>
            <step>
                <para>Specify an API endpoint for the Object Storage Service by using
                    the returned service ID. When you specify an endpoint, you
                    provide URLs for the public API, internal API, and admin API.
                    In this guide, the <literal>controller</literal> host name is
                    used.</para>
                <screen><prompt>#</prompt> <userinput>keystone endpoint-create \
  --service-id=<replaceable>the_service_id_above</replaceable> \
  --publicurl='http://<replaceable>controller</replaceable>:8080/v1/AUTH_%(tenant_id)s' \
  --internalurl='http://<replaceable>controller</replaceable>:8080/v1/AUTH_%(tenant_id)s' \
  --adminurl=http://<replaceable>controller</replaceable>:8080</userinput>
<computeroutput>+-------------+---------------------------------------------------+
|   Property  |                       Value                       |
+-------------+---------------------------------------------------+
|   adminurl  |            http://controller:8080/                |
|      id     |          9e3ce428f82b40d38922f242c095982e         |
| internalurl | http://controller:8080/v1/AUTH_%(tenant_id)s      |
|  publicurl  | http://controller:8080/v1/AUTH_%(tenant_id)s      |
|    region   |                     regionOne                     |
|  service_id |          eede9296683e4b5ebfa13f5166375ef6         |
+-------------+---------------------------------------------------+</computeroutput></screen>
            </step>
            <step>
                <para>Create and populate configuration directories on
                    all nodes:</para>
                <screen os="ubuntu;debian;rhel;centos;fedora"><prompt>#</prompt> <userinput>mkdir -p /etc/swift</userinput>
<prompt>#</prompt> <userinput>chown -R swift:swift /etc/swift/</userinput></screen>
                <screen os="opensuse;sles"><prompt>#</prompt> <userinput>mkdir -p /etc/swift</userinput>
<prompt>#</prompt> <userinput>chown -R openstack-swift:openstack-swift /etc/swift/</userinput></screen>
            </step>
            <step>
                <para>Create
                        <filename>/etc/swift/swift.conf</filename> on
                    all nodes:</para>
                <programlisting language="ini"><xi:include parse="text" href="../samples/swift.conf.txt"/></programlisting>
            </step>
        </procedure>
        <note>
            <para>The suffix value in
                    <filename>/etc/swift/swift.conf</filename> should
                be set to some random string of text to be used as a
                salt when hashing to determine mappings in the ring.
                This file should be the same on every node in the
                cluster!</para>
        </note>
        <para>Next, set up your storage nodes and proxy node. This
            example uses the Identity Service for the common
            authentication piece.</para>
    </section>
</section>