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


Getting Help
============

Need some help getting started? Feel free to ask on the `mailing list
<http://cloudstack.apache.org/mailing-lists.html>`_:

-  `users@ <http://mail-archives.apache.org/mod_mbox/cloudstack-users/>`_: This
   list is for users of CloudStack to seek and provide support. This is a
   moderately high volume list.
-  `dev@ <http://mail-archives.apache.org/mod_mbox/cloudstack-dev/>`_: Where
   discussions about development and the project itself happen. This is a high
   volume list.

Github users can also start discussion at
https://github.com/apache/cloudstack/discussions

Documentation Available
-----------------------

The following guides are available:

-  CloudStack Concepts and Terminology
-  Quick Installation Guide
-  Installation Guide
-  Upgradong CloudStack
-  Usage Guide
-  Developers Guide
-  Plugins Guide
-  Release Notes

All at |documentation_home|

Books
-----

|60recipe| |acs-packt| |jp1| |jp2|


Support
-------

For community support you may ask on the project's users mailing list or via
Github discussions.

Some companies offer commercial support for Apache CloudStack or their own
product based on CloudStack. You may ask on the list or `search yourself
<https://www.google.com/search?q=cloudstack+support>`__.


.. |60recipe| image:: /_static/images/60recipe.gif
   :alt: O'Reilly 60 Recipes for Apache CloudStack
   :target: http://shop.oreilly.com/product/0636920034377.do
.. |acs-packt| image:: /_static/images/packt.png
   :alt: Apache CloudStack Cloud Computing
   :target: https://www.packtpub.com/virtualization-and-cloud/apache-cloudstack-cloud-computing
.. |jp1| image:: /_static/images/jp1.jpg
   :alt: CloudStack徹底入門 大型本
   :target: http://www.amazon.co.jp/gp/product/4798130583/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4798130583&linkCode=as2&tag=aaaaaaaeaeaea-22
.. |jp2| image:: /_static/images/jp2.jpg
   :alt: CloudStack実践ガイド[前編]
   :target: http://www.amazon.co.jp/CloudStack%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%89%8D%E7%B7%A8-NextPublishing-%E5%A4%A7%E5%89%8A-%E7%B7%91/dp/4844395920/ref=pd_bxgy_b_img_y
