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


Or on one of the following IRC channels on irc.freenode.net:

-  #cloudstack - General Apache CloudStack conversation and end user support
-  #cloudstack-dev - Development discussions
-  #cloudstack-meeting - Weekly and ad-hoc meeting room for the Apache CloudStack community


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|


Commercial support
------------------

Some companies offer commercial support for Apache CloudStack or their own
product based on CloudStack.


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