.. Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information#
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at
   http://www.apache.org/licenses/LICENSE-2.0
   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.

.. Apache CloudStack documentation main file, created by
   sphinx-quickstart on Fri Jul 20 17:32:34 2018.
   You can adapt this file completely to your liking, but it should at least
   contain the root `toctree` directive.


|menu_acs_logo|


Welcome to Apache CloudStack's Documentation
============================================

We have a number of guides, starting with a guide to cloudstack's terminology and concepts, moving through some information about possible topologies.  We then have a quick start guide to help you get a very simple cloudstack up and running.  Followed by the full installation guide, an administrator's guide and then further detailed guides on complex configurations.

Information can also be found at CloudStack's wiki https://cwiki.apache.org/confluence/display/CLOUDSTACK/Home and on cloudstack mailing lists http://cloudstack.apache.org/mailing-lists.html

.. toctree::
   :maxdepth: 3
   :caption: Contents:

   conceptsandterminology/index
   quickinstallationguide/qig
   installguide/index
   upgrading/index
   adminguide/index
   developersguide/index
   plugins/index
   releasenotes/index


.. toctree::
   :caption: Other Documentation:

   API Documentation <http://cloudstack.apache.org/api.html>
   Apache CloudStack Wiki <https://cwiki.apache.org/confluence/display/CLOUDSTACK/Home>
   Apache CloudStack web site <http://cloudstack.apache.org/>
   Apache CloudStack Source Code <http://cloudstack.apache.org/downloads.html>
   Apache CloudStack on GitHub <https://github.com/apache/cloudstack>


.. toctree::
   :caption: Pre 4.11 Documentation:

   Installation Guide <http://docs.cloudstack.apache.org/projects/cloudstack-installation>
   Administration Guide <http://docs.cloudstack.apache.org/projects/cloudstack-administration>
   Release Notes <http://docs.cloudstack.apache.org/projects/cloudstack-release-notes>


Indices and Tables
==================

* :ref:`genindex`
* :ref:`search`
