From 9875027ea3592e2e9dbb96e459dc0ea2a5f09314 Mon Sep 17 00:00:00 2001 From: Carla Schroder Date: Fri, 8 Jan 2016 14:45:15 -0800 Subject: [PATCH] more updates --- admin_manual/contents.rst | 1 - .../deployment_recommendations/index.rst | 8 - deployment_recommendations/Create HTML.lnk | Bin 0 -> 2413 bytes deployment_recommendations/Create PDF.lnk | Bin 0 -> 2207 bytes deployment_recommendations/Makefile | 173 ++++++++++ deployment_recommendations/conf.py | 296 ++++++++++++++++++ deployment_recommendations/contents.rst | 10 + .../images/deprecs-1.png | Bin 0 -> 14389 bytes .../images/deprecs-2.png | Bin .../images/deprecs-3.png | Bin .../index.rst | 203 ++++++------ deployment_recommendations/make.bat | 199 ++++++++++++ 12 files changed, 787 insertions(+), 103 deletions(-) delete mode 100644 admin_manual/deployment_recommendations/index.rst create mode 100644 deployment_recommendations/Create HTML.lnk create mode 100644 deployment_recommendations/Create PDF.lnk create mode 100644 deployment_recommendations/Makefile create mode 100644 deployment_recommendations/conf.py create mode 100644 deployment_recommendations/contents.rst create mode 100644 deployment_recommendations/images/deprecs-1.png rename {admin_manual/deployment_recommendations => deployment_recommendations}/images/deprecs-2.png (100%) rename {admin_manual/deployment_recommendations => deployment_recommendations}/images/deprecs-3.png (100%) rename admin_manual/deployment_recommendations/deployment_recommendations.rst => deployment_recommendations/index.rst (72%) create mode 100644 deployment_recommendations/make.bat diff --git a/admin_manual/contents.rst b/admin_manual/contents.rst index bf069bc2f..1c92d0ff0 100644 --- a/admin_manual/contents.rst +++ b/admin_manual/contents.rst @@ -9,7 +9,6 @@ Table of Contents release_notes whats_new_admin installation/index - deployment_recommendations/index configuration_server/index configuration_user/index configuration_files/index diff --git a/admin_manual/deployment_recommendations/index.rst b/admin_manual/deployment_recommendations/index.rst deleted file mode 100644 index 8a7efa2cc..000000000 --- a/admin_manual/deployment_recommendations/index.rst +++ /dev/null @@ -1,8 +0,0 @@ -=================================== -ownCloud Deployment Recommendations -=================================== - -.. toctree:: - :maxdepth: 2 - - deployment_recommendations diff --git a/deployment_recommendations/Create HTML.lnk b/deployment_recommendations/Create HTML.lnk new file mode 100644 index 0000000000000000000000000000000000000000..0dd9e1c91889dc925f014b4713d802d1e3504f35 GIT binary patch literal 2413 zcmd^BZETBC6nwdtVNC*G`cTjn6WV!@>kb}u@EMt;Qh^au6>zenMI#Um0$AX zHX?`+{HR7P!t|Pm4Sf-_Jv+Rk+Ii83{zXm~4)>%xnK(?R;OHX+HJASbn(e&3P;Jqhuvn1RZ}1 zCAI~GlutROkq^w-f~D%IK0eigBJO>aswOajzT;%#5+TznZeRLx&mhV%G8W;Y5H?|B zMOY#vyY<`0Q4b6v9wa33=Z7{GT`wtcU;CbREW1U&uT!7M$;N?~JC#G^5e_9ePyi=o zCv`$|+2?XGPUO>)$G(8wq5KP|6E6p8zM>M%t~!IWbr6!sTl3 zX6pUoAQdbmDmc{D3$R61GlV_VRk1WP;D(C_Vm&u6z^w~Y_R|)kx6YSE!zvzf3p|v4 zoTbw%#ElfcV*1ozIkj8Wtbrb~=|Rp4VWy;_T71h-@AS=B)ci2@@?%6xpJa5m(mGW< zB;jSmU`hQ?I@({$p{e5ZKedumyxpb1qZ=84&nUwjLm4K;O^Ta%gzS`#@{p`k#f+6) z3jMFGe`JPJH;>#e>UbrBH30mfp&`adDIyw;l8d2N{m|Ph62UGil5}1fj2p4m@*)lH zwrb(N>+jc9!5KrNS@}hXeH(&&0jxaA;iP*#`Mw((bs1`_l&>fMszl`b^N5fy?P!i` zSKrEfY23WJ(_`ysU(?blwsL~6P-GLiv|YX!kJAQQ{^K^Yv!vfeK5oOe(R<2up+_yOJP^qQttfDCl{QZsjVx=+4f^`*Ys&ocDWw&Ue0I0J=Cm zIWVL+3a{&p zX#we2?V(WvC0M?h>S&>yv``pGqh~X;Ir!{aX^6~I!|W(mB9j)QszntVSP>($s6s6> zFykOKu^eGu)ws*q}Qx++QWL26Kd9YEp(Iz~b zPX?2*A(tyTeDe8N6+VwPL0QRj6&G(7_0Ty-FG&LVV0rM;f!3m{QzNmLg4OHWY4->~ zD!7GI#i?H%{{yO;0UV{Rj-^R~19l#VJ#3wqjSEuua4kTzpP!0`T|DAOIH|k2%TH8* z%@kY_F^$+x>p`_^HbPqNr;y-KHj9J-!B$7M!^-etujb=)9LE-l5aCsgH-o#P$ax zZo$!*oHvy`On9T;U()Y1_x9}W=$Exh5$R_9t__a++VyR@bFGV?A7v*R0ssI2 literal 0 HcmV?d00001 diff --git a/deployment_recommendations/Makefile b/deployment_recommendations/Makefile new file mode 100644 index 000000000..74c47b133 --- /dev/null +++ b/deployment_recommendations/Makefile @@ -0,0 +1,173 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " pdf to make PDF files" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: html-org + +html-all: html-release html-org html-com + +html-release: + $(SPHINXBUILD) -b html -D html_theme='owncloud_release' $(ALLSPHINXOPTS) $(BUILDDIR)/html/release + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html/release." + +html-org: + $(SPHINXBUILD) -b html -D html_theme='owncloud_org' $(ALLSPHINXOPTS) $(BUILDDIR)/html/org + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html/org." + +html-com: + $(SPHINXBUILD) -b html -D html_theme='owncloud_com' $(ALLSPHINXOPTS) $(BUILDDIR)/html/com + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html/com." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/OwncloudDocumentation.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/OwncloudDocumentation.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/OwncloudDocumentation" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/OwncloudDocumentation" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +pdf: + $(SPHINXBUILD) -b pdf $(ALLSPHINXOPTS) $(BUILDDIR)/pdf + @echo + @echo "build finished. the text files are in $(BUILDDIR)/pdf." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "build finished. the text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/deployment_recommendations/conf.py b/deployment_recommendations/conf.py new file mode 100644 index 000000000..20df10d2e --- /dev/null +++ b/deployment_recommendations/conf.py @@ -0,0 +1,296 @@ +# -*- coding: utf-8 -*- +# +# ownCloud Documentation documentation build configuration file, created by +# sphinx-quickstart on Mon Oct 22 23:16:40 2012-2014. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.todo', 'rst2pdf.pdfbuilder'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['../_shared_assets/templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'contents' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '1.0' +# The full version, including alpha/beta/rc tags. +release = '1.0' + +# General information about the project. +project = u'ownCloud Deployment Recommendations' +copyright = u'2012-2016, The ownCloud developers' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +html_theme_path = ['../_shared_assets/themes'] + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'owncloud_org' +html_theme_options = { +# "rightsidebar": "true", +} +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +html_short_title = "ownCloud Deployment Recommendations" + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['../_shared_assets/static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +html_show_sphinx = False + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'ownCloudDeploymentRecommendations' + + +# -- Options for LaTeX output -------------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('contents', 'ownCloud_Deployment_Recommendations.tex', u'ownCloud Deployment Recommendations', + u'The ownCloud developers', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +latex_logo = '../_shared_assets/static/logo-blue.pdf' + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + +# -- Options for pdf page output ----------------------------------------------- + +pdf_documents = [('contents', u'ownCloudDeploymentRecommendations', u'ownCloud Deployment Recommendations', u'The ownCloud developers'),] + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('contents', 'ownCloudDeploymentRecommendations', u'ownCloud Deployment Recommendations', + [u'The ownCloud developers'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------------ + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('contents', 'ownCloudDeploymentRecommendations', u'ownCloud Deployment Recommendations', + u'The ownCloud developers', 'ownCloud', 'ownCloud Deployment Recommendations.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + + +# -- Options for Epub output --------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = u'ownCloud Deployment Recommendations' +epub_author = u'The ownCloud developers' +epub_publisher = u'The ownCloud developers' +epub_copyright = u'2012-2016, The ownCloud developers' + +# The language of the text. It defaults to the language option +# or en if the language is not set. +#epub_language = '' + +# The scheme of the identifier. Typical schemes are ISBN or URL. +#epub_scheme = '' + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +#epub_identifier = '' + +# A unique identification for the text. +#epub_uid = '' + +# A tuple containing the cover image and cover page html template filenames. +#epub_cover = () + +# HTML files that should be inserted before the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_pre_files = [] + +# HTML files shat should be inserted after the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_post_files = [] + +# A list of files that should not be packed into the epub file. +#epub_exclude_files = [] + +# The depth of the table of contents in toc.ncx. +#epub_tocdepth = 3 + +# Allow duplicate toc entries. +#epub_tocdup = True + +# Include todos? +todo_include_todos = True + +# substitutions go here +rst_epilog = '.. |version| replace:: %s' % version diff --git a/deployment_recommendations/contents.rst b/deployment_recommendations/contents.rst new file mode 100644 index 000000000..52d419ce3 --- /dev/null +++ b/deployment_recommendations/contents.rst @@ -0,0 +1,10 @@ +.. _contents: + +================= +Table of Contents +================= + +.. toctree:: + :maxdepth: 2 + + index diff --git a/deployment_recommendations/images/deprecs-1.png b/deployment_recommendations/images/deprecs-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b80961460b4e7279843cd2893f385ba7446021f1 GIT binary patch literal 14389 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 literal 0 HcmV?d00001 diff --git a/admin_manual/deployment_recommendations/images/deprecs-2.png b/deployment_recommendations/images/deprecs-2.png similarity index 100% rename from admin_manual/deployment_recommendations/images/deprecs-2.png rename to deployment_recommendations/images/deprecs-2.png diff --git a/admin_manual/deployment_recommendations/images/deprecs-3.png b/deployment_recommendations/images/deprecs-3.png similarity index 100% rename from admin_manual/deployment_recommendations/images/deprecs-3.png rename to deployment_recommendations/images/deprecs-3.png diff --git a/admin_manual/deployment_recommendations/deployment_recommendations.rst b/deployment_recommendations/index.rst similarity index 72% rename from admin_manual/deployment_recommendations/deployment_recommendations.rst rename to deployment_recommendations/index.rst index f4032e929..8c62f14a6 100644 --- a/admin_manual/deployment_recommendations/deployment_recommendations.rst +++ b/deployment_recommendations/index.rst @@ -2,8 +2,8 @@ ownCloud Deployment Recommendations =================================== -What is the best way to install and maintain ownCloud? The answer to that, of -course, is *"it depends"* because every ownCloud customer has their own +What is the best way to install and maintain ownCloud? The answer to that is +*"it depends"* because every ownCloud customer has their own particular needs and IT infrastructure. ownCloud and the LAMP stack are highly-configurable, so we will present three typical scenarios and make best-practice recommendations for both software and hardware. @@ -45,29 +45,27 @@ Small Workgroups or Departments 100 GB to 10TB. * High availability level - Nightly interruption of service for backup, component failure leads to - interruption of service. + Zero-downtime backups via Btrfs snapshots, component failure leads to + interruption of service. Alternate backup scheme on other filesystems: + nightly backups with service interruption. -*Image is missing* - Recommended System Requirements ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. comment: ***this image is missing*** ![OC small deployment - scenario](http://yuml.me/diagram/scruffy/class/OC small deployment scenario, - [Web server|Apache;DB Server;local storage], [Web server]-[LDAP Server]) - One machine running the application server, Webserver, database server and local storage. Authentication via an existing LDAP or Active Directory server. +.. figure:: images/deprecs-1.png + :alt: Network diagram for small enterprises. + * Components One server with at least 2 CPU cores, 16GB RAM, local storage as needed. * Operating system - Enterprise grade Linux distribution with full support from OS vendor. Red - Hat Enterprise Linux or SUSE Linux Enterprise Server 12 are recommended. + Enterprise-grade Linux distribution with full support from OS vendor. We + recommend Red Hat Enterprise Linux or SUSE Linux Enterprise Server 12. * SSL Configuration The SSL termination is done in Apache. A standard SSL certificate is @@ -77,22 +75,26 @@ Authentication via an existing LDAP or Active Directory server. None. * Database - MySQL, MariaDB or PostgreSQL. - -.. comment: We currently recommend MySQL / MariaDB, as our customers have - had good experiences when moving to a Galera cluster to scale the DB. + MySQL, MariaDB or PostgreSQL. We currently recommend MySQL / MariaDB, as our + customers have had good experiences when moving to a Galera cluster to + scale the DB. * Backup - Automatic nightly backups: + Install owncloud, ownCloud data directory and database on Btrfs filesystem. + Make regular snapshots at desired intervals for zero downtime backups. + Mount DB partitions with the "nodatacow" option to prevent fragmentation. + + Alternatively, make nightly backups with service interruption: * Shut down Apache. * Create database dump. * Push data directory to backup. * Push database dump to backup. * Start Apache. - * Optionally rsync to a backup storage and tape backup. (See the - `Maintenance`_ section of the Administration manual for tips on backups - and restores.) + + Then optionally rsync to a backup storage or tape backup. (See the + `Maintenance`_ section of the Administration manual for tips on backups + and restores.) * Authentication User authentication via one or several LDAP or Active Directory servers. (See @@ -108,7 +110,7 @@ Authentication via an existing LDAP or Active Directory server. ``echo "tmpfs /var/lib/php5/pool-www tmpfs defaults,noatime,mode=1777 0 0" >> /etc/fstab``. -* Caching +* Memory Caching A memcache speeds up server performance, and ownCloud supports four memcaches; refer to `Configuring Memory Caching`_ for information on selecting and configuring a memcache. @@ -132,9 +134,6 @@ Mid-sized Enterprises * High availability level Every component is fully redundant and can fail without service interruption. Backups without service interruption - -.. figure:: images/deprecs-2.png - :alt: Network diagram for mid-sized enterprise. Recommended System Requirements ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -147,20 +146,22 @@ Storage on an NFS server. Authentication via an existing LDAP or Active Directory server. +.. figure:: images/deprecs-2.png + :alt: Network diagram for mid-sized enterprise. + * Components - 2 to 4 application servers with 4 sockets and 32GB RAM. - 2 DB servers with 4 sockets and 64GB RAM - 1 HAproxy load balancer with 2 sockets and 16GB RAM. - NFS storage server as needed. + * 2 to 4 application servers with 4 sockets and 32GB RAM. + * 2 DB servers with 4 sockets and 64GB RAM. + * 1 HAproxy load balancer with 2 sockets and 16GB RAM. + * NFS storage server as needed. * Operating system Enterprise grade Linux distribution with full support from OS vendor. Red Hat Enterprise Linux or SUSE Linux Enterprise Server 12 are recommended. * SSL Configuration - The SSL termination is done in the HAProxy Load Balancer. A standard SSL - certificate is needed, installed according to the `HAProxy - documentation `_.) + The SSL termination is done in the HAProxy load balancer. A standard SSL + certificate is needed, installed according to the `HAProxy documentation`_. * Load Balancer HAProxy running on a dedicated server in front of the application servers. @@ -199,7 +200,7 @@ Authentication via an existing LDAP or Active Directory server. * Restart MySQL replication. * Authentication - User authentication can be used via one or several LDAP or AD directories. + User authentication via one or several LDAP or Active Directory servers. (See `User Authentication with LDAP`_ for information on configuring ownCloud to use LDAP and AD.) @@ -208,17 +209,22 @@ Authentication via an existing LDAP or Active Directory server. optimal scalability * Session Management - Local Session management on the application server. PHP sessions are stored - in /tmp which is mounted as tmpfs. (please add configuration details here) + Session management on the application server. PHP sessions are stored + in a tmpfs mounted at the operating system-specific session storage + location. You can find out where that is by running ``grep -R + 'session.save_path` /etc/php5`` and then add it to the ``/etc/fstab`` file, + for example: + ``echo "tmpfs /var/lib/php5/pool-www tmpfs defaults,noatime,mode=1777 0 0" + >> /etc/fstab``. -* Caching +* Memory Caching A memcache speeds up server performance, and ownCloud supports four memcaches; refer to `Configuring Memory Caching`_ for information on selecting and configuring a memcache. * Storage - An off-the-shelf NFS solution should be used. Examples are IBM Elastic - Storage or RedHat CEPH. + Use an off-the-shelf NFS solution, such as IBM Elastic Storage or RedHat + Ceph. * ownCloud Edition Enterprise Edition. (See `ownCloud Server or Enterprise Edition`_ for @@ -235,14 +241,7 @@ Large Enterprises and Service Providers * High availabily level Every component is fully redundant and can fail without service interruption. - Backups without service interruption - -.. figure:: images/deprecs-3.png - :scale: 60% - :alt: Network diagram for large enterprise. - -.. comment: ![Not pretty ... but needs discussion anyway] - (http://yuml.me/cfeebddd) + Backups without service interruption Recommended System Requirements ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -257,18 +256,22 @@ Cloud federation for a distributed setup over several data centers. Authentication via an existing LDAP or Active Directory server, or SAML. +.. figure:: images/deprecs-3.png + :scale: 60% + :alt: Network diagram for large enterprise. + * Components - 4 to 20 application servers with 4 sockets and 64GB RAM. - 4 DB servers with 4 sockets and 128GB RAM - 2 Hardware load balancer, for example BIG IP from F5 - NFS storage server as needed. + * 4 to 20 application servers with 4 sockets and 64GB RAM. + * 4 DB servers with 4 sockets and 128GB RAM + * 2 Hardware load balancer, for example BIG IP from F5 + * NFS storage server as needed. * Operating system RHEL 7 with latest service packs. * SSL Configuration - The SSL termination is done in the Load Balancer. A standard SSL certificate - is needed, installed according to the Load Balancer documentation. + The SSL termination is done in the load balancer. A standard SSL certificate + is needed, installed according to the load balancer documentation. * Load Balancer A redundant hardware load-balancer with heartbeat, for example `F5 Big-IP`_. @@ -299,19 +302,16 @@ Authentication via an existing LDAP or Active Directory server, or SAML. optimal scalability. * Session Management - Redis should be use for the session management storage (see `Configuring - Memory Caching`_). + Redis should be used for the session management storage. * Caching Redis for distributed in-memory caching (see `Configuring Memory Caching`_). -* Storage - An off-the-shelf NFS solution should be used. Examples are IBM Elastic - Storage or RedHAT CEPH. Optionally, an S3 compatible object store can also - be used. - - .. comment: (please add more meat here) +* Storage + An off-the-shelf NFS solution should be used. Examples are IBM Elastic + Storage or RedHAT Ceph. Optionally, an S3 compatible object store can also + be used. * ownCloud Edition Enterprise Edition. (See `ownCloud Server or Enterprise Edition`_ for @@ -321,28 +321,29 @@ Hardware Considerations ----------------------- * Solid-state drives (SSDs) for I/O. -* Separate hard disks for storage and database, SSDs for DBs. +* Separate hard disks for storage and database, SSDs for databases. * Multiple network interfaces to distribute server synchronisation and backend traffic across multiple subnets. Single Machine / Scale-Up Deployment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Widely used in the community. Lowest end hardware: RaspberryPI. +The single-machine deployment is widely used in the community. Pros: -* Easy setup (no session storage daemon-> use tmpfs for performance, local - storage). +* Easy setup: no session storage daemon, use tmpfs and memory caching to + enhance performance, local storage. * No network latency to consider. -* To scale buy bigger CPU, memory, or hard drive. +* To scale buy a bigger CPU, more memory, larger hard drive, or additional hard + drives. Cons: -* No high availability -* Amount of data in oC tends to never shrink -> sooner rather than later a - single machine will not scale (multiple up- and downloads kill I/O, even with - SSD) +* Fewer high availability options. +* The amount of data in ownCloud tends to continually grow. Eventually a + single machine will not scale; I/O performance decreases and becomes a + bottleneck with multiple up- and downloads, even with solid-state drives. Scale-Out Deployment ^^^^^^^^^^^^^^^^^^^^ @@ -381,8 +382,8 @@ A Single Master DB is Single Point of Failure, Does Not Scale ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ When master fails another slave can become master. Multi-master has the risk of -split brain and is more complicated. Can run into deadlocks which oC tries -to solve with high level file locking -> here be dragons. +split brain and is more complicated. Can run into deadlocks which ownCloud tries +to solve with high-level file locking. Software Considerations ----------------------- @@ -390,12 +391,14 @@ Software Considerations Operating System ^^^^^^^^^^^^^^^^ -We are dependent on distributions that offer an easy way to install the -various components in an up-to-date version. Debian is loved by administrators -for its stability and can integrate recent versions of PHP fairly easy. - -That being said, ownCloud has a partnership with RedHat and SUSE for customers -who need commercial support. +We are dependent on distributions that offer an easy way to install the various +components in up-to-date versions. ownCloud has a partnership with RedHat +and SUSE for customers who need commercial support. Canonical, the parent +company of Ubuntu Linux, also offers enterprise service and support. Debian +and Ubuntu are free of cost, and include newer software packages. CentOS is the +community-supported free-of-cost Red Hat Enterprise Linux clone. openSUSE is +community-supported, and includes many of the same system administration tools +as SUSE Linux Enterprise Server. Webserver ^^^^^^^^^ @@ -412,14 +415,17 @@ deployments separate PHP pools are simply not necessary. .. comment: Nginx stores uploaded files on disk before handing them to php-fpm which is a performance problem with GB-sized files. There seems to be an - Nginx fork from China that handles that better. + Nginx fork from China that handles that better. + +.. comment from carla: We shouldn't recommend forks unless they are proven, + well-supported and dependable. Relational Database ^^^^^^^^^^^^^^^^^^^ More often than not the customer already has an opinion on what database to use. In general, the recommendation is to use what their database administrator -is most familiar with. Taking into account what GCX is seeing at customer +is most familiar with. Taking into account what we are seeing at customer deployments, we recommend MySQL/MariaDB in a master-slave deployment with a MySQL proxy in front of them to send updates to master, and selects to the slave(s). @@ -435,8 +441,8 @@ slave(s). emojis cannot be used. This can be fixed by [moving to utf8mb4/utf8mb4_bin](https://github.com/owncloud/core/issues/7030). -The second best option is PostgreSQL (alter table does not lock table - makes -migration less painful) although we have yet to find a customer who uses a +The second best option is PostgreSQL (alter table does not lock table, which +makes migration less painful) although we have yet to find a customer who uses a master-slave setup. .. comment: PostgreSQL may produce excessive amounts of dead tuples due to @@ -447,18 +453,17 @@ What about the other DBMS? * Sqlite is adequate for simple testing, and for low-load single-user deployments. It is not adequate for production systems. * MSSQL is not automatically tested. -* Oracle is a pain, but the de facto standard at huge enterprises. Developers - need to be aware of the 30 char identifier limit, empty string equals null - and varchar2 can only be made 4000 chars wide. +* Oracle is expensive, but is the de facto standard at large enterprises. + Developers need to be aware of the 30 char identifier limit, empty string + equals null and varchar2 can only be made 4000 chars wide. File Storage ------------ -This is what separates us from WordPress or typo3. Our main use case is up- and -download of files. Sooner or later that requires scale-out storage. Currently, -the options are GPFS or an object store like Ceph/s3 or Openstack/Swift. GPFS -is expensive, and our s3 and Swift implementations use temp files which -prevents them from scaling adequately. +Our main use case is up- and download of files. Sooner or later, that requires +scale-out storage. Currently, the options are GPFS or an object store like +Ceph/s3 or Openstack/Swift. GPFS is expensive, and our s3 and Swift +implementations use temp files which prevents them from scaling adequately. .. comment: A proof of concept implementation based on [phprados](https://github.com/ceph/phprados) that talks directly to a @@ -473,10 +478,11 @@ prevents them from scaling adequately. Session Storage --------------- -* Redis (persistent, nice graphical inspection tools available, ownCloud high - level locking supported) -* If Shibboleth is a requirement you must use Memcached, as it can also be used - to scale-out shibd session storage (see `Memcache StorageService`_). +* Redis: provides persistence, nice graphical inspection tools available, + supports ownCloud high-level file locking. + +* If Shibboleth is a requirement you must use Memcached, and it can also be + used to scale-out shibd session storage (see `Memcache StorageService`_). .. comment: High Availability / Failover deployment Use Case: site replication -> different problem @@ -486,7 +492,10 @@ References `Database High Availability`_ -`Performance enhancements for Apache and PHP`_ +`Performance enhancements for Apache and PHP`_ + +`How to Set Up a Redis Server as a Session Handler for PHP on Ubuntu 14.04`_ + .. _Maintenance: https://doc.owncloud.org/server/9.0/admin_manual/maintenance/index.html @@ -506,8 +515,14 @@ References .. _Memcache StorageService: https://wiki.shibboleth.net/confluence/display/SHIB2/ NativeSPStorageService#NativeSPStorageService-MemcacheStorageService + .. _Database High Availability: http://www.severalnines.com/blog/become-mysql-dba-blog-series-database-high- availability .. _Performance enhancements for Apache and PHP: - http://blog.bitnami.com/2014/06/performance-enhacements-for-apache-and.html \ No newline at end of file + http://blog.bitnami.com/2014/06/performance-enhacements-for-apache-and.html +.. _How to Set Up a Redis Server as a Session Handler for PHP on Ubuntu 14.04: + https://www.digitalocean.com/community/tutorials/how-to-set-up-a-redis-server + -as -a-session-handler-for-php-on-ubuntu-14-04 +.. _HAProxy documentation: + http://www.haproxy.org/#docs \ No newline at end of file diff --git a/deployment_recommendations/make.bat b/deployment_recommendations/make.bat new file mode 100644 index 000000000..3fbb57f5d --- /dev/null +++ b/deployment_recommendations/make.bat @@ -0,0 +1,199 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pdf to make a PDF file with rst2pdf + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pdf" ( + %SPHINXBUILD% -b pdf %ALLSPHINXOPTS% %BUILDDIR%/pdf + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The PDF file is in %BUILDDIR%/pdf. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\OwncloudDocumentation.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\OwncloudDocumentation.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +:end