.. 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 master 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`
