diff --git a/source/_static/kolab.css b/source/_static/kolab.css index 187c3b92..6d7c5ce4 100644 --- a/source/_static/kolab.css +++ b/source/_static/kolab.css @@ -1,154 +1,207 @@ a { color: #1f8fc0; } a tt { color: #1f8fc0; } a.internal em { font-style: normal; } blockquote.epigraph div p { font-style: italic; } body { font-family: sans-serif; letter-spacing: 0; } cite, code, pre, tt { font-family: "Liberation Mono", "Consolas","Deja Vu Sans Mono","Bitstream Vera Sans Mono", monospace; } div.admonition { border-left: 0.5em solid #59bc00; border-top: none; border-right: none; border-bottom: none; margin-bottom: 1em; padding-bottom: 0.5em; padding-left: 1.5em; padding-top: 0.5em; } div.admonition > div:last-child > *:last-child { margin-bottom: 0; } div.admonition p { margin: 1em 0 0.5em 0.5em; padding: 0; } div.admonition p.admonition-title { color: black; margin: 1em 0 0.5em 0.5em; padding: 0; font-weight: bold; display: block; background-color: inherit; border-bottom: none; } /* Green 'note' box */ div.admonition.note { border-left: 0.5em solid #59bc00; } div.admonition.important { border-color: #ffc200; } div.admonition.warning { border-color: #ff0000; } div.admonition.tip { border-color: #1e90ff; } div.admonition-todo { border-color: #cccccc; } div.admonition.caution { border-color: #950000; } div.body a { text-decoration: none; color: #1F8FC0; } div.body h1, div.body h2, div.body h3 { color: #002e50; } div.highlight { border-left: 0.5em solid #666666; padding: 0; margin: 1em 0 0.5em 0; } div.highlight pre { border: 0px solid; margin: 1em 0.5em 0.5em 0.5em; padding-bottom: 0.5em; padding-left: 1.5em; padding-top: 0.5em; } div.linenodiv pre { padding: 0.5em 0 0; } div.related { /* Would require a file navigation.png, which * is apparently not included background-color: #1F8FC0; */ background-color: #ffffff; } div.related ul li a { color: #1F8FC0; } div.sphinxsidebar h3, div.sphinxsidebar h4 { background-color: #002e50; border: 1px solid white; } ol.arabic li { margin-top: 1em; } p.caption { font-style: italic; } +span.blue { + background: #dee7f8 none repeat scroll 0 0; + border: 1px solid transparent; + border-color: #cfdbe3; + border-radius: 3px; + color: #464c5c; +/* font-size: 12px; */ + padding: 0 4px; +} + +/* + * span.blue::before { + * content: " "; + * font-family: FontAwesome; + * } + */ + +span.gray { + background: #edeef2 none repeat scroll 0 0; + border: 1px solid transparent; + border-color: #e3e4e8; + border-radius: 3px; + color: #555; + padding: 0 4px; +} + +span.green { + background: #ddefdd none repeat scroll 0 0; + border: 1px solid transparent; + border-color: #c6e6c7; + border-radius: 3px; + color: #326d34; + padding: 0 4px; +} + +span.orange { + background: #fbede1 none repeat scroll 0 0; + border: 1px solid transparent; + border-color: #f8dcc3; + color: #ba6016; + border-radius: 3px; + padding: 0 4px; +} + +span.red { + background: #f7e6e6 none repeat scroll 0 0; + border: 1px solid transparent; + border-color: #efcfcf; + border-radius: 3px; + color: #a53737; + padding: 0 4px; +} + table.highlighttable { width: 100%; } table.highlighttable td.linenos { width: 1%; } /* For bold-italic and italic inside other formatting styles */ /* ``command line `` :italic:`with italics` */ .bolditalic { font-weight: bold; font-style: italic; } .italic { font-style: italic; } diff --git a/source/conf.py b/source/conf.py index dc9c9bc7..42d09672 100644 --- a/source/conf.py +++ b/source/conf.py @@ -1,397 +1,430 @@ # -*- coding: utf-8 -*- # # Kolab Groupware documentation build configuration file, created by # sphinx-quickstart on Tue Jul 16 12:32:13 2013. # # 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, glob, imp # 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. thisdir = os.path.dirname(os.path.abspath(__file__)) extdir = os.path.abspath(os.path.join(thisdir, '..', 'ext')) sys.path = [ extdir ] + sys.path # -- 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.autodoc', 'sphinx.ext.extlinks', #'sphinx.ext.mathjax', 'sphinx.ext.todo', 'sphinx.ext.graphviz', 'sphinx.ext.ifconfig', 'kolab.fancyfigure', #'kolab.phabricator', ] # fancybox extension config fancybox_config = { 'helpers': { 'title': { 'type': 'inside' } } } # Add any paths that contain templates here, relative to this directory. templates_path = ['_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 = 'index' # General information about the project. project = u'Kolab' import datetime copyright = u'2010-%s, Kolab Systems AG' % (datetime.datetime.strftime(datetime.datetime.utcnow(), '%Y')) # 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 = '16' # The full version, including alpha/beta/rc tags. #import subprocess #p1 = subprocess.Popen(['git', 'log', '--oneline'], stdout=subprocess.PIPE) #p2 = subprocess.Popen(['wc', '-l'], stdin=p1.stdout, stdout=subprocess.PIPE) #p1.stdout.close() #(count, errors) = p2.communicate(p1.stdout) #release = '%s (%s)' % (version, count) release = '' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. language = None # If true, a document’s text domain is its docname if it is a top-level project file # and its very base directory otherwise. # By default, the document markup/code.rst ends up in the markup text domain. # With this option set to False, it is markup/code. gettext_compact=False locale_dirs = ['../locale/'] # 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 = [ 'webmail-user-guide/roundcubemail-plugins-kolab/*' ] # 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 = True # 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 --------------------------------------------------- +#import sphinx_rtd_theme +#html_theme = "sphinx_rtd_theme" +#html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. html_theme = 'sphinxdoc' - -# 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 = ['themes'] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". html_title = 'Kolab Groupware documentation' # A shorter title for the navigation bar. Default is the same as html_title. html_short_title = 'Kolab documentation' # 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 = ['_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 = True # 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 = 'KolabGroupwaredoc' # -- 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 = [ ('index', 'KolabGroupware.tex', u'Kolab Groupware Documentation', u'Jeroen van Meeuwen', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # 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 manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'kolabgroupware', u'Kolab Groupware Documentation', [u'Jeroen van Meeuwen'], 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 = [ ('index', 'KolabGroupware', u'Kolab Groupware Documentation', u'Jeroen van Meeuwen', 'KolabGroupware', 'One line description of project.', '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'Kolab Groupware' epub_author = u'Jeroen van Meeuwen' epub_publisher = u'Jeroen van Meeuwen' epub_copyright = u'2013, Jeroen van Meeuwen' # 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 todo_include_todos = True # -- Load variables for client configuration docs ----------------------------- variables = {} default_tags = [] custom_tags = False config_files = glob.glob('./*/conf.py') if os.path.exists('./conf.local.py'): config_files.append(os.path.relpath('./conf.local.py')) # collect variables from submodule configs for pathname in config_files: try: conf = imp.load_source('conf', pathname) if hasattr(conf, 'variables'): variables.update(conf.variables) if hasattr(conf, 'tags'): custom_tags = True for tag in conf.tags: tags.add(tag) if hasattr(conf, 'module_tags'): default_tags += conf.module_tags if hasattr(conf, 'extensions'): extensions += conf.extensions # TODO: merge other config options like rst_prolog, rst_epilog, etc. except Exception, e: print "Failed to open config file", pathname print e # add default tags if no custom ones defined if not custom_tags: for tag in default_tags: tags.add(tag) # add variables as substitutions to the head of each page rst_prolog = "" -for var,repl in variables.items(): +for var, repl in variables.items(): rst_prolog += " .. |%s| replace:: %s\n" % (var, repl) rst_prolog += " .. |**%s**| replace:: **%s**\n" % (var, repl) # forward variables for substitutions in fancyfigures fancyfigure_variables = variables extlinks = { 'rfc': ('http://tools.ietf.org/html/rfc%s', 'RFC '), 'mock': ('https://git.kolab.org/T%s', 'Mock #'), 'task': ('https://git.kolab.org/T%s', 'Task #'), } rst_prolog += """ .. _Architecture & Design: https://git.kolab.org/tag/architecture_design/ +.. _bugzilla: https://issues.kolab.org/ +.. _current sprint: https://git.kolab.org/tag/sprint_current/ +.. _next sprint: https://git.kolab.org/tag/sprint_next/ .. _Differential: https://git.kolab.org/differential/ .. _Diffusion: https://git.kolab.org/diffusion/ .. _Drydock: https://git.kolab.org/drydock/ .. _EPEL for Enterprise Linux 6: http://download.fedoraproject.org/pub/epel/6/x86_64/repoview/epel-release.html .. _EPEL for Enterprise Linux 7: http://download.fedoraproject.org/pub/epel/7/x86_64/repoview/epel-release.html .. _Harbormaster: https://git.kolab.org/harbormaster/ .. _Herald: https://git.kolab.org/herald/ .. _Kolab Systems AG: https://kolabsystems.com .. _Maniphest: https://git.kolab.org/maniphest/ .. _Phabricator: https://git.kolab.org/ .. _Process Managers: https://git.kolab.org/tag/process_managers/ .. _Product Owners: https://git.kolab.org/tag/product_owners/ .. _Projects: https://git.kolab.org/projects/ .. _Quality Assurance: https://git.kolab.org/tag/quality_assurance/ +.. _Report a bug: https://git.kolab.org/maniphest/task/edit/form/9/ +.. _Scrum: http://en.wikipedia.org/wiki/Scrum_%28software_development%29 .. _Scrum Masters: https://git.kolab.org/tag/process_managers/ .. _Sprints: https://git.kolab.org/project/sprint/ .. _Why Your System Should Have a Proper FQDN: https://kanarip.wordpress.com/2016/02/04/why-your-system-requires-a-proper-fqdn/ """ + +# +# Releases +# +rst_prolog += """ +.. |Winterfell| replace:: :orange:`Winterfell` +.. |K16| replace:: :orange:`Kolab 16` +.. |KE14| replace:: :orange:`Kolab Enterprise 14` +.. |KE13| replace:: :orange:`Kolab Enterprise 13` +""" + +# +# Target platforms +# +rst_prolog += """ +.. |maipo| replace:: :gray:`Maipo` +.. |santiago| replace:: :gray:`Santiago` +""" + +# +# Packages +# +rst_prolog += """ +.. |roundcubemail| replace:: :blue:`roundcubemail` +.. |roundcubemail-plugins-kolab| replace:: :blue:`roundcubemail-plugins-kolab` +""" + +rst_prolog += """ +.. role:: blue +.. role:: gray +.. role:: green +.. role:: orange +.. role:: red +""" diff --git a/source/contributor-guide/bug-reporting-casual.rst b/source/contributor-guide/bug-reporting-casual.rst new file mode 100644 index 00000000..27e387cb --- /dev/null +++ b/source/contributor-guide/bug-reporting-casual.rst @@ -0,0 +1,29 @@ +============================ +Reporting Bugs Against Kolab +============================ + +For the version of Kolab you are running, it is assumed that the issue you are +running in to exists in both your version, and the next version of Kolab (i.e. +the development version). + +At the time of this writing, this can be |K16| (stable) or |winterfell| +(development). + +Therefore, `report a bug`_ against Kolab in Phabricator. You'll describe what +it is you did, what the expected results are, what results you got, and how +those results do not meet your expectations. + +It is assumed all bugs are issues in the development of Kolab, for two main +reasons: + +* Development teams need to ensure the software is tested for the issue you + find. + +* The bug zappers are able to assist you with troubleshooting, suggesting + work-arounds, configuration, and providing the necessary information. + +.. seealso:: + + * :ref:`contributor-guide-structured-contributions-reporting-bugs` + +Return to other :ref:`contributor-guide-casual-contributions` you could make. diff --git a/source/contributor-guide/bug-reporting-structured.rst b/source/contributor-guide/bug-reporting-structured.rst new file mode 100644 index 00000000..4771b46e --- /dev/null +++ b/source/contributor-guide/bug-reporting-structured.rst @@ -0,0 +1,150 @@ +.. _contributor-guide-structured-contributions-reporting-bugs: + +=========================================================== +Reporting Bugs Against (Long-Term) Supported Kolab Versions +=========================================================== + +Long-term support versions of Kolab maintain larger sets of different versions +of software, and it becomes important to ensure that the fix for an issue in +`foo-1.0` does not require a properly entitled customer to upgrade to a later +version of Kolab, or even a later version of `foo`. + +The stability requirements imply that support be able to track issues with +specific versions of the software, targets these issues to be resolved in +certain newer versions of the software, and trusts the resolution of the issue +to be verifiable against multiple versions of the software collection. + +Example +======= + +The following table depicts the versions of the |roundcubemail| package, and +the |roundcubemail-plugins-kolab| package, as distributed for each product +stream. + +.. table:: Version table for Roundcubemail and Kolab Plugins + + +--------------+-----------------+-------------------------------+ + | | |roundcubemail| | |roundcubemail-plugins-kolab| | + +==============+=================+===============================+ + | |KE13| | `1.0.4` | `3.1.16` | + +--------------+-----------------+-------------------------------+ + | |KE14| | `1.1.4` | `3.2.11` | + +--------------+-----------------+-------------------------------+ + | |K16| | `1.2` | `3.3` | + +--------------+-----------------+-------------------------------+ + | |Winterfell| | `1.2` | `3.3` | + +--------------+-----------------+-------------------------------+ + +Stability requirements for |KE13| demand the following: + +* The version of |roundcubemail| shipped to the product stream is one of + the **1.0 series** of upstream releases, + +* Upstream maintains a **stable** 1.0 series for roundcubemail, + +* The version of |roundcubemail-plugins-kolab| shipped to the product + stream is one of the **3.1 series** of upstream releases, + +* Upstream maintains a **stable** 3.1 series for roundcubemail-plugins-kolab, + +* Future versions of |roundcubemail| in the 1.0 series remain backward + compatibility for consumers of its API (such as + |roundcubemail-plugins-kolab|), + +* Added functionality in |roundcubemail-plugins-kolab|, if any, does not + require any changes in |roundcubemail| that would break other compatibility, + +* The aforementioned conditions all last for up to 5 years, + +* For a large number of target platforms. + +The same conditions apply to |KE14| and |K16| -- with different version series, +different timelines and sometimes different stacks. + +Further down the dependency stack, this includes maintenance for +**libkolabxml**, **libkolab** and **libcalendaring**. + +In the future, this will extend up to 6 product streams that will need to be +maintained. + +It is therefore important that an issue logged against a version 1.0.1, with +the current version in the 1.0 series perhaps being 1.0.10, needs to go through +the following stages: + +#. Is the issue reproducible in the unstable development version of the + software suite? + + a. If it is, it is a development issue; `report a bug`_ in Phabricator. + + Developer teams become responsible for testing the resolution of the + issue first, and fixing the issue second (see + :ref:`contributor-guide-test-driven-development`). + + For each of the product streams in between current development and + the original issue report, create a ticket in `bugzilla`_. + + .. seealso:: + + * Something about backporting with the verification included. + + b. If it is not, in what product stream can the issue still be reproduced? + + This process can be a very costly lather-rinse-repeat exercise, and + therefore needs to be covered ahead of time, through + :ref:`contributor-guide-test-driven-development`. + + Create a `bugzilla`_ ticket for the appropriate + + .. seealso:: + + * Something about constructive troubleshooting efforts + +#. Using the input of 1) and outcome of 1a) or 1b), describe the range of + targets; + + * branch 1.2 for |K16|: yes or no? + * branch 1.1 for |KE14|: yes or no? + * etc. + + Each becomes a separate `bugzilla`_ ticket, each of them depending on the + resolution of the more recent product stream('s software version). + +Example +======= + +Let's assume "yay" fails on all versions of Roundcube. + +#. Issue: + + *Yay fails on Roundcube 1.0.1 on* :gray:`Enterprise Linux 6` + + This is an original ticket. The intended milestone for the resolution is + `1.0-next`. + +#. Support: + + #. *Does yay fail in* |Winterfell| *on* |maipo| *?* + + Yes, this is a new development issue; `Report a bug`_. Add a project + tag for :orange:`Winterfell` + + #. *Does yay fail in* |K16| *on* |maipo| *?* + + Yes, and |K16| is on the same software version series as |Winterfell|; + + It is thus a new development issue; `Report a bug`_ and have it + blocked by the bug created in 2.1). + + Associate the |K16| release target with the bug. + + Also create a `bugzilla`_ ticket. The milestone here is `1.2-next`. + Refer to the task created in Phabricator. + + #. *Does yay fail in* |KE14| *on* |santiago| *?* + + Yes, create a `bugzilla`_ ticket and block it with the ticket created + in 2.2). The milestone here is `1.1-next`. + + #. *Does yay fail in* |KE13| *on* |santiago| *using version 1.0.4?* + + Yes, block the original ticket in 1) with the ticket from 2.3). diff --git a/source/contributor-guide/continuous-integration.rst b/source/contributor-guide/continuous-integration.rst new file mode 100644 index 00000000..1608fb12 --- /dev/null +++ b/source/contributor-guide/continuous-integration.rst @@ -0,0 +1,10 @@ +================================ +(Ab)using Continuous Integration +================================ + +Continuous integration is a process that runs against the following two events: + +#. A commit is pushed to a GIT repository, + +#. A differential is created or updated. + diff --git a/source/contributor-guide/docker-containers.rst b/source/contributor-guide/docker-containers.rst new file mode 100644 index 00000000..dd5a3a3f --- /dev/null +++ b/source/contributor-guide/docker-containers.rst @@ -0,0 +1,4 @@ +================================= +Run Kolab Using Docker Containers +================================= + diff --git a/source/contributor-guide/documentation/index.rst b/source/contributor-guide/documentation/index.rst new file mode 100644 index 00000000..6cba4d3b --- /dev/null +++ b/source/contributor-guide/documentation/index.rst @@ -0,0 +1,76 @@ +.. _contributor-guide-documentation: + +================================= +Contributing to the Documentation +================================= + +This documentation can easily be contributed to by cloning the following git +repository. + + https://git.kolab.org/diffusion/D/docs.git + +.. IMPORTANT:: + + The documentation is only as good as your willingness to contribute + to it. + +Other documentation included here: + +.. toctree:: + :maxdepth: 1 + + writing-documentation + todolist + +Building the Documentation +========================== + +Most of our more regular contributors clone the repository to their +local workstation, and then build the documentation before pushing back +changes to their fork of kolab-docs. To build the documentation, you +need to have `Sphinx`_ installed. You can also find some hints, tips and +tricks on their website, with regards to the `reStructuredText`_ format +the documentation is written in. + +#. Naturally, first clone the git repository. + + .. parsed-literal:: + + $ :command:`git clone https://git.kolab.org/diffusion/D/docs.git` + +#. Navigate in to the fresh clone: + + .. parsed-literal:: + + $ :command:`cd docs` + +#. To build the documentation, issue the following command: + + .. parsed-literal:: + + $ :command:`make html` + +#. Make some changes, and build and view the result: + + .. parsed-literal:: + + $ :command:`make html` + $ :command:`xdg-open build/html/index.html` + +#. When you are satisfied, commit the results and submit a `Differential`_: + + .. parsed-literal:: + + $ :command:`git commit -a` + $ :command:`arc diff` + +#. Push your changes back into our Phabricator instance. + Timotheus wrote `a good tutorial on how to do that `_. + +Enjoy and thanks for contributing to Kolab! + +.. _Sphinx: http://sphinx-doc.org/ +.. _reStructuredText: http://sphinx-doc.org/rest.html +.. _Working with Git Submodules: http://git-scm.com/book/en/Git-Tools-Submodules +.. _docs.kolab.org: https://docs.kolab.org + diff --git a/source/contributor-guide/documentation/todolist.rst b/source/contributor-guide/documentation/todolist.rst new file mode 100644 index 00000000..64e3e86f --- /dev/null +++ b/source/contributor-guide/documentation/todolist.rst @@ -0,0 +1,12 @@ +Possible Contributions +====================== + +The following list is a collection of all the places where a todo item was included, +because there is more work to do. +Please consider picking one of those up helping to complete the documentation. + +That's left to do: +------------------ + +.. todolist:: + diff --git a/source/contributor-guide/documentation/writing-documentation.rst b/source/contributor-guide/documentation/writing-documentation.rst new file mode 100644 index 00000000..a1c0a3e1 --- /dev/null +++ b/source/contributor-guide/documentation/writing-documentation.rst @@ -0,0 +1,59 @@ +.. _dev-writing-documentation: + +===================== +Writing Documentation +===================== + +The Kolab community has a reference implementation of its releases, +which can best be described as a **next-next-finish** installation [#]_ +of a **single node** [#]_ running **Enterprise Linux 7** [#]_. + +For writing documentation, this means that all documented commands and +file paths mentioned need to match that specific implementation [#]_ of +Kolab installed on Enterprise Linux 7, and that every HOWTO needs to +start at the aforementioned *null* situation. + +This sounds harsh, and it probably is, but here's how you can work with +it: + +* When you create a HOWTO for something on Debian, your HOWTO should + probably be titled: *HOWTO: Achieve Greatness (on Debian Wheezy)*. + +* When you do write a generic HOWTO, you can re-iterate the commands + issued for different distributions:: + + After changing the configuration, restart the service: + + .. parsed-literal:: + + # :command:`systemctl restart postfix` + + On Debian Wheezy, execute the following instead: + + .. parsed-literal:: + + # :command:`/etc/init.d/postfix restart` + +.. rubric:: Footnotes + +.. [#] + + This means to confirm the default settings (other than perhaps the + passwords) during :ref:`installation-guide-setup-kolab`, including but not + limited to the characters used in the passwords chosen -- while we + have learned of issues when using passwords with special characters, + which relate to third party application defaults. + +.. [#] + + A single node is a single operating system instance; physical, + virtual, docked or contained. + +.. [#] + + In the family of Enterprise Linux 7 distributions that we provide + packages for are Red Hat Enterprise Linux and CentOS. + +.. [#] + + The specific implementation is a single-node deployment topology. diff --git a/source/contributor-guide/feature-requests/index.rst b/source/contributor-guide/feature-requests/index.rst new file mode 100644 index 00000000..2a74ab39 --- /dev/null +++ b/source/contributor-guide/feature-requests/index.rst @@ -0,0 +1,100 @@ +.. _contributor-guide-feature-requests: + +================ +Feature Requests +================ + +The Definition of a Feature Request +=================================== + +A feature request is a description of a problem space for which we may seek the +resolution to be provided within, or with the help of, Kolab. + +Such a problem space is articulated in and by itself, and allows for +understanding to be formed and interpretation to be fine-tuned over the course +of a process with multiple parties contributing. + +.. IMPORTANT:: + + Using **problem spaces** re-inforces the importance of the human + experience for the final product enhancement. + +A bad example of a feature request would be: + + *Make the button background red.* + +This example neither addresses the actual problem, nor the potential value of a +resolution. + +A better example would be: + + *The contrast between the button background and page is too low.* + +Any target use-case or workflow described must be considered only as a context +establishing a higher level of comprehension in elaboration, about the +dimensions of the problem space. Per the existing example: + + *Color vision deficiencies do not allow some people to distinguish the + button from the background.* + +This would allow us to clarify whether a high-contrast UI is needed, or a +slight adjustment suffices. We would also get to cover other angles. + +Feature requests without a sufficiently accurate or encompassing description of +the problem space to address will not be accepted. + +Where Do Feature Requests Go? +============================= + +Feature requests can be entered in to the Kolab development platform using +`this form `_. + +It's submitted to the backlog of the :red:`Architecture & Design` team. + +The `Architecture & Design`_ team evaluates the enhancement requests, requests +additional feedback if needed, and assigns the priority should the request be +promoted. + +The responsibility of this team is to ensure that, in the inception phase, and +before the elaboration phase; + +* we have an accurate and full problem space description, and + +* we understand the scope and dimensions of the problem space, and + +* we can successfully determine where the problem should be resolved, and + +* we can determine the resolution to this problem space makes sense for the + product that is Kolab, or + +* we can determine that the problem space is better addressed by existing, + external tooling, and find a means for that external tooling to be + integrated with Kolab, or + +* we can determine that addressing the problem space does not enhance the + Kolab product, and + +* an estimate value of resolving the problem space can be established. + +This leads to a common understanding of scope of delivery, the definition of +done, and the way to verify the results. + +**Backlog** + +All feature enhancement requests put forth. Mostly with wishlist priority. + +**Inception** + +Would this change the world? How would this change the world? + +**Elaboration** + +How do we change the world? + +**Construction** + +The hardhats get to putting the brick and mortar in place. + +**Transition** + +.. This part of the process is called :ref:`developer-guide-process-inception`. diff --git a/source/contributor-guide/getting-started.rst b/source/contributor-guide/getting-started.rst new file mode 100644 index 00000000..8b00cf5b --- /dev/null +++ b/source/contributor-guide/getting-started.rst @@ -0,0 +1,108 @@ +.. _contributor-guide-getting-started: + +================================ +Getting Started with Phabricator +================================ + +#. Navigate to https://git.kolab.org. We recommend you use a browser. + +#. Determine whether you are a Kolab Systems employee, and act accordingly; + + #. If you are a Kolab Systems employee, use your corporate credentials to + login using LDAP. + + #. If you are not a Kolab Systems employee, create yourself an account if + you have not already done so. You can use any of the forms except for + the one that requests LDAP credentials. + +#. `Set your date-time notation format `_. + +#. Set your profile picture. + +#. `Upload an SSH public key `_. + +#. `Set your text-area font to fixed width `_. + +#. `Configure email notifications `_, + especially the ones for actions you place yourself. + +#. :ref:`contributor-guide-setup-tools`. + +#. Hook up **arcanist** to your Phabricator account: + + .. parsed-literal:: + + $ :command:`arc install-certificate` + +Projects +======== + +Software development projects use a communication icon (envelope) in +:blue:`blue`. + +Each software development project is provided a workboard, such they could, at +their option, visualize a roadmap. + +.. NOTE:: + + The use of sub-projects and milestones in Phabricator is under review. + +Teams +===== + +Teams include groups of people that work on software development projects, or +form the :red:`Architecture & Design` team, :red:`Release Managers`, etc. + +Membership of these teams usually provides you with commit access to a GIT +repository, and is used to authorize differentials in +:ref:`contributor-guide-peer-review`. + +* Software developer teams are used to authorize commit access, and use a + group icon in :red:`red`. + +* You need to request membership from one of the existing members. + +* You only need membership in order to push to the GIT repositories directly. + +Sprints +======= + +Sprints are time-boxed team efforts with the duration of exactly one week -- +running from Monday morning to Friday afternoon. + +In Phabricator, sprints are projects named using the year and week number, such +as :green:`Sprint 201610`. + +On Monday mornings, at 10:00 in the morning (Europe/Zurich timezone), a sprint +planning meeting is held, with all participants in the sprint attending. The +goal is to reiterate the priority of tasks for the sprint, raise doubts where +there are any, but also assign tasks and give them story points. + +We use a sprint-specific backlog for the sprint planning, since the global +product backlog is just much too large to discuss. + +That said, all users of Phabricator are encouraged to propose tasks to include +in the next sprint, as well as go ahead and seed the information for the tickets +they know are going to be assigned to them, and provide feedback on others. + +At or near the end of the sprint, a meeting is held that shows off functional +software, also called a retrospective. To allow us to show functional software +a merge window is used between Thursday afternoon (at about 15:00 to 17:00 in +the Europe/Zurich timezone) all the way through Friday up to the retrospective. + +At this point, all tickets in Review can be moved to Done, which happens on the +premises the differential associated with the ticket is accepted, merged, +pushed, tested (continuous integration) and delivered (packaging). + +Release Targets +=============== + +Release targets are irrelevant for developers. The only release target that is +relevant for developers is |Winterfell|. + +Distributions +============= + +Distributions (target platforms) are irrelevant for developers. The only target +platform relevant to developers is the reference platform |maipo| (Enterprise +Linux 7). diff --git a/source/contributor-guide/index.rst b/source/contributor-guide/index.rst new file mode 100644 index 00000000..397ba073 --- /dev/null +++ b/source/contributor-guide/index.rst @@ -0,0 +1,83 @@ +.. _contributor-guide: + +================= +Contributor Guide +================= + +Kolab Groupware development largely follows an iterative and incremental +agile software development metholodogy also known as `Scrum`_. + +In summary, the development process is divided into stages, with different +teams participating in getting tasks to the next stage of the process. + +Kolab Groupware is a collaboration suite consisting of many components, +each of them separate software development projects, some of them +dependent on third-party software development projects, and some of them +separate altogether. + +.. IMPORTANT:: + + Still to do: + + * Contributing to translations (l10n and i18n) + + * Switch current documentation stuff over + + * Fixing packaging issues + + * Feature requests' inception/elaboration/construction/transition + phases + + * Testing Kolab + + * Participation section on Peer Review -- the actual execution of + things. + + Note that this includes the applying of a differential to review + the work in its full context. + + * Running docker containers + + * (Ab)using Continuous Integration (fully testing locally) + + * SCRUM details + + * Packaging and Continuous Delivery + +.. _contributor-guide-casual-contributions: + +Casual Contributions +==================== + +The following guides are intended for casual contributors and contributions, +such as a one-time 5-line patch for that one itch to scratch. + +.. toctree:: + :maxdepth: 1 + + translations + bug-reporting-casual + documentation/index + packaging/casual + feature-requests/index + testing + +.. _contributor-guide-structured-contributions: + +Structured Contributions +======================== + +The following guides set you up for regular, structured contributions to Kolab, +such as continued development and participation in sprints. + +.. toctree:: + :maxdepth: 1 + + getting-started + setup-development-environment + peer-review + docker-containers + continuous-integration + scrum + packaging + bug-reporting-structured diff --git a/source/contributor-guide/packaging.rst b/source/contributor-guide/packaging.rst new file mode 100644 index 00000000..db899411 --- /dev/null +++ b/source/contributor-guide/packaging.rst @@ -0,0 +1,3 @@ +================================= +Packaging and Continuous Delivery +================================= diff --git a/source/contributor-guide/packaging/casual.rst b/source/contributor-guide/packaging/casual.rst new file mode 100644 index 00000000..4f196dbe --- /dev/null +++ b/source/contributor-guide/packaging/casual.rst @@ -0,0 +1,4 @@ +======================= +Fixing Packaging Issues +======================= + diff --git a/source/contributor-guide/peer-review.rst b/source/contributor-guide/peer-review.rst new file mode 100644 index 00000000..c6f53e21 --- /dev/null +++ b/source/contributor-guide/peer-review.rst @@ -0,0 +1,33 @@ +.. _contributor-guide-peer-review: + +=========== +Peer Review +=========== + +Peer review is a process in which developers submit code changes to a staging +environment, so that other peers have the opportunity to review the work before +the code changes are submitted back to the source code management repository. + +In our development platform, this process is facilitated by `Differential`_. To +use `Differential`_, you must install **arcanist** and set it up. + +.. seealso:: + + * :ref:`contributor-guide-setup-your-development-environment` + +In Kolab development, this stage allows work to progress on writing tests that +fail, first, subsequently supplemented by the work on code changes that make +those tests succeed. + +.. seealso:: + + * :ref:`contributor-guide-test-driven-development` + +The changes submitted are reviewed on Thursday afternoons at the latest. + +Your changes need to be reviewed by at least one other person, who is a +software development project member. + +In :ref:`contributor-guide-test-driven-development`, the submission of the +differential associated with your review process aides in the staging of the +code changes. diff --git a/source/contributor-guide/scrum.rst b/source/contributor-guide/scrum.rst new file mode 100644 index 00000000..5a64a991 --- /dev/null +++ b/source/contributor-guide/scrum.rst @@ -0,0 +1,17 @@ +===== +SCRUM +===== + +Our agile development process is time-boxed with sprints. + +.. toctree:: + :maxdepth: 1 + + scrum/sprints + +.. toctree:: + :maxdepth: 1 + + scrum/start-of-sprint-checklist + scrum/during-the-sprint + scrum/end-of-sprint-checklist diff --git a/source/contributor-guide/scrum/during-the-sprint.rst b/source/contributor-guide/scrum/during-the-sprint.rst new file mode 100644 index 00000000..6e959ec8 --- /dev/null +++ b/source/contributor-guide/scrum/during-the-sprint.rst @@ -0,0 +1,3 @@ +================= +During the Sprint +================= diff --git a/source/contributor-guide/scrum/end-of-sprint-checklist.rst b/source/contributor-guide/scrum/end-of-sprint-checklist.rst new file mode 100644 index 00000000..18227327 --- /dev/null +++ b/source/contributor-guide/scrum/end-of-sprint-checklist.rst @@ -0,0 +1,33 @@ +======================= +End of Sprint Checklist +======================= + +* The `current sprint`_ must be archived after Friday, 17:00 CET. + +* The `current sprint`_ must have its additional ``#sprint_current`` + hashtag removed. + +* Tickets that remain open in the `current sprint`_ must be moved forward + on to the `next sprint`_. + + .. NOTE:: + + The column for these tickets in the `current sprint`_ should be + reflected in the `next sprint`_, which requires manual intervention. + +* The `next sprint`_ becomes the current sprint, and thus: + + * Remove the additional hashtag ``#sprint_next``, + + * Add the additional hashtag ``#sprint_curret``. + +* The sprint after the next sprint needs to be created; + + * The sprint runs from a Monday 09:00 AM to the following Friday 05:00 + PM. + + * Use an additional hashtag of ``#sprint_next``. + +* Verify the (now) `current sprint`_ (but actually next week's) actually has + sufficient tickets in its backlog, because idling is for jet engines with + reverse thrusters deployed while in flight. diff --git a/source/contributor-guide/scrum/sprints.rst b/source/contributor-guide/scrum/sprints.rst new file mode 100644 index 00000000..69b980f8 --- /dev/null +++ b/source/contributor-guide/scrum/sprints.rst @@ -0,0 +1,3 @@ +======= +Sprints +======= diff --git a/source/contributor-guide/scrum/start-of-sprint-checklist.rst b/source/contributor-guide/scrum/start-of-sprint-checklist.rst new file mode 100644 index 00000000..d4379db8 --- /dev/null +++ b/source/contributor-guide/scrum/start-of-sprint-checklist.rst @@ -0,0 +1,9 @@ +========================= +Start of Sprint Checklist +========================= + +* Contributors assign story points to the tickets in the backlog. + +* Product owners prioritize tickets. + +* A sprint planning meeting provides the opportunity to talk things over. diff --git a/source/contributor-guide/setup-development-environment.rst b/source/contributor-guide/setup-development-environment.rst new file mode 100644 index 00000000..fcda6b52 --- /dev/null +++ b/source/contributor-guide/setup-development-environment.rst @@ -0,0 +1,309 @@ +.. _contributor-guide-setup-your-development-environment: + +================================== +Setup Your Development Environment +================================== + +This guide sets you up a development workstation to contribute to Kolab +Groupware development on `Phabricator`_. + +#. :ref:`contributor-guide-setup-tools` + +.. _contributor-guide-setup-tools: + +Install the Tools +================= + +#. Ensure you have our Tools repository configured. + + .. parsed-literal:: + + # :command:`cd /etc/yum.repos.d/` + + For **Fedora 23**: + + .. parsed-literal:: + + # :command:`wget https://obs.kolabsys.com/repositories/Tools/Fedora_23/Tools.repo` + + For **Fedora 22**: + + .. parsed-literal:: + + # :command:`wget https://obs.kolabsys.com/repositories/Tools/Fedora_22/Tools.repo` + + For **Red Hat Enterprise Linux 7**: + + .. parsed-literal:: + + # :command:`wget https://obs.kolabsys.com/repositories/Tools/RHEL_7/Tools.repo` + +#. Import the GPG public key the packages are signed with: + + .. parsed-literal:: + + # :command:`rpm --import https://ssl.kolabsys.com/community.asc` + +#. Install **arcanist**: + + For **Fedora 22** and **Fedora 23**: + + .. parsed-literal:: + + # :command:`dnf -y install arcanist` + + For **Red Hat Enterprise Linux 7**: + + .. parsed-literal:: + + # :command:`yum -y install arcanist` + +.. _contributor-guide-setup-recommended-configuration: + +Recommended Configuration +========================= + +**SSH Configuration** + + Configure SSH to use the correct username and SSH identity when you use + ``git.kolab.org``: + + .. parsed-literal:: + + $ :command:`grep -A3 git.kolab.org ~/.ssh/config` + Host git.kolab.org + User git + IdentityFile ~/.ssh/id_rsa + +**BASH Completion** + + Say something about bash completion and how great it is. + +**GIT Prompt** + + Say something about the git prompt. + +**GIT Configuration** + + For each repository separately, or otherwise globally: + + .. parsed-literal:: + + $ :command:`git config [--global] user.name "Jeroen van Meeuwen (Kolab Systems)"` + $ :command:`git config [--global] user.email vanmeeuwen\@kolabsys.com` + $ :command:`git config [--global] branch.autosetuprebase always` + $ :command:`git config [--global] push.default matching` + +**~/.bashrc** + +A recommended snippet for `~/.bashrc` to assist you visually: + +.. parsed-literal:: + + export GIT_PS1_SHOWDIRTYSTATE=1 + export GIT_PS1_SHOWUNTRACKEDFILES=1 + export GIT_PS1_SHOWUPSTREAM="auto verbose" + + if [ ! -f "/etc/bash_completion" ]; then + if [ -f "/etc/bash_completion.d/git" ]; then + cp /etc/bash_completion.d/git ~/.git-completion.sh + . ~/.git-completion.sh + PS1='[\u\@\h \W$(__git_ps1 " (%s)")]\$ ' + elif [ -f "/usr/share/bash-completion/completions/git" ]; then + cp /usr/share/bash-completion/completions/git ~/.git-completion.sh + . ~/.git-completion.sh + PS1='[\u\@\h \W$(__git_ps1 " (%s)")]\$ ' + fi + else + PS1='[\u\@\h \W$(__git_ps1 " (%s)")]\$ ' + fi + + if [ -f "/usr/share/git-core/contrib/completion/git-prompt.sh" ]; then + source /usr/share/git-core/contrib/completion/git-prompt.sh + fi + +This makes your shell navigating in to a GIT repository appear as follows: + +#. :command:`cd` in to a GIT repository: + + .. parsed-literal:: + + [kanarip\@dws06 ~]$ :command:`cd ~/devel/puppet/domains/kolabsys.com` + [kanarip\@dws06 kolabsys.com (development u=)]$ + + This means a clean working copy. + +#. Create an untracked file: + + .. parsed-literal:: + + [kanarip\@dws06 kolabsys.com (development u=)]$ :command:`touch something` + [kanarip\@dws06 kolabsys.com (development % u=)]$ + + THe `%` means untracked files exist in the directory hierarchy. + +#. Add the untracked file: + + .. parsed-literal:: + + [kanarip\@dws06 kolabsys.com (development % u=)]$ :command:`git add something` + [kanarip\@dws06 kolabsys.com (development + u=)]$ + + The `+` means tracked, uncommitted files exist in the directory hierarchy. + +#. Change a file: + + .. parsed-literal:: + + [kanarip\@dws06 kolabsys.com (development + u=)]$ :command:`echo 1 > something` + [kanarip\@dws06 kolabsys.com (development \*+ u=)]$ + + The `*` means uncommitted changes to tracked files exist. The `+` still + indicates a tracked file is not yet committed. + +#. Checkout another branch. In this example, it is specifically made dirty to + show off: + + .. parsed-literal:: + + [kanarip\@dws06 kolabsys.com (development \*+ u=)]$ :command:`git checkout testing` + A something + Switched to branch 'testing' + Your branch and 'origin/testing' have diverged, + and have 4 and 65 different commits each, respectively. + (use "git pull" to merge the remote branch into yours) + [kanarip\@dws06 kolabsys.com (testing \*+ u+4-65)]$ + + This means we have 4 commits to our local working copy not yet in the + remote tracked, and 65 commits in the remote tracked not yet in our local + working copy. + +#. Attempt to rebase on top of the tracked remote: + + .. parsed-literal:: + + [kanarip\@dws06 kolabsys.com (testing \*+ u+4-65)]$ :command:`git rebase origin/testing --autostash` + Created autostash: 49f31f4 + HEAD is now at a6fb106 Ensure docker runs on atomic hosts + First, rewinding head to replay your work on top of it... + Applied autostash. + [kanarip\@dws06 kolabsys.com (testing + u=)]$ + + You'll notice the `+` again stands for the tracked, not yet committed file + :file:`something`. + +Pushing Changes +=============== + +There is virtually no need to push only to the development branch, but merging +and cherry-picking individual changes should be avoided: + +.. parsed-literal:: + + $ :command:`cd ~/devel/puppet/domains/kolabsys.net` + (...make some changes...) + $ :command:`git commit -a -m "Make some changes"` + +Attempt a push if you feel so inclined: + +.. parsed-literal:: + + $ :command:`git push origin development` + +This may be refused as a non-fast forward attempt, so fetch the origin first. + +.. IMPORTANT:: + + Do **NOT** just issue a :command:`git pull` if your prompt shows your + current local working copy is not clean -- this can still result in a merge + commit and those will not be allowed when pushing them back. + +.. parsed-literal:: + + $ :command:`git fetch origin` + $ :command:`git rebase origin/development --autostash` + +Your prompt should now show something like: + +.. parsed-literal:: + + [kanarip\@dws06 kolabsys.com (development u+1)]$ + +To push your changes: + +.. parsed-literal:: + + $ :command:`git push origin development` + $ :command:`git push origin development:testing` + $ :command:`git push origin development:production` + +Creating a Differential for Review +================================== + +A standard repository comes with three branches: development, testing, +production. + +Make sure you have **development** checked out, and for the sake of preventing +superfluous merge and rebase exercises, ensure it's in sync with upstream: + +.. parsed-literal:: + + $ :command:`git checkout development` + $ :command:`git fetch origin` + $ :command:`git rebase origin/development --autostash` + +Make sure you have a ticket for `Engineering`_ for your work and +`Operations`_ for the final application to production systems. + +Given such a ticket, such as :task:`144`, you can branch off the GIT +repository; + +.. parsed-literal:: + + [kanarip\@dws06 kolabsys.com (development u=)]$ :command:`git checkout -b T144` + [kanarip\@dws06 kolabsys.com (T144)]$ + +Make your changes, and commit them in however many commits you think is +reasonable. + +Then, create the `Differential`_: + +.. parsed-literal:: + + [kanarip\@dws06 kolabsys.net (T125 %)]$ arc diff + You have untracked files in this working copy. + + Working copy: /home/kanarip/devel/puppet/domains/kolabsys.net/ + + Untracked changes in working copy: + (To ignore these changes, add them to ".git/info/exclude".) + bin/reroute-vpn + files/haproxy/haproxy.cfg.transparent + haproxy.patch + nodes + puppet/manifests/classes/puppet.pp~HEAD + puppet/manifests/classes/yum.pp.rej + + Ignore these untracked files and continue? [y/N] :command:`y` + +You will now be requested to provide some information about your proposed +changes. + +Set the first ``Summary:`` line to ``Resolves T345678``, so that your +differential will be associated with the ticket automatically, and an accepted +differential also closes the ticket you refer to. + +.. parsed-literal:: + + Linting... + No lint engine configured for this project. + Running unit tests... + No unit test engine is configured for this project. + Updating commit message... + Created a new Differential revision: + Revision URI: https://noc.kolabsys.net/D8 + + Included changes: + M puppet/manifests/classes/puppet.pp + +And that's it. diff --git a/source/contributor-guide/test-driven-development.rst b/source/contributor-guide/test-driven-development.rst new file mode 100644 index 00000000..b334cbf5 --- /dev/null +++ b/source/contributor-guide/test-driven-development.rst @@ -0,0 +1,19 @@ +.. _contributor-guide-test-driven-development: + +======================= +Test-Driven Development +======================= + +Test-driven development is a process in the +:ref:`contributor-guide-phases-construction`. + +The process of development driven by testing can be transcribed as follows: + +#. You get handed a set of clear requirements -- mostly in the form of user + stories you can verify, and documentation on the design -- architecture and + mockups. + +#. You write the tests that verify those requirements are implemented. + +#. You write the code that makes the tests succeed. + diff --git a/source/contributor-guide/testing.rst b/source/contributor-guide/testing.rst new file mode 100644 index 00000000..419a095b --- /dev/null +++ b/source/contributor-guide/testing.rst @@ -0,0 +1,3 @@ +============= +Testing Kolab +============= diff --git a/source/contributor-guide/translations.rst b/source/contributor-guide/translations.rst new file mode 100644 index 00000000..4d1c6c34 --- /dev/null +++ b/source/contributor-guide/translations.rst @@ -0,0 +1,3 @@ +================================================== +Translation: Localization and Internationalization +================================================== diff --git a/source/developer-guide/packaging/obs-for-kolab/packages/roundcubemail.rst b/source/developer-guide/packaging/obs-for-kolab/packages/roundcubemail.rst index ea464aae..810946c0 100644 --- a/source/developer-guide/packaging/obs-for-kolab/packages/roundcubemail.rst +++ b/source/developer-guide/packaging/obs-for-kolab/packages/roundcubemail.rst @@ -1,94 +1,94 @@ -The **roundcubemail** package contains the upstream web-application used +The |roundcubemail| package contains the upstream web-application used for the webmail interface in Kolab Groupware. It's packaging is rather complex, with one tarball resulting in some 100 sub-packages. -The generic package **roundcubemail** is a so-called meta-package, that +The generic package |roundcubemail| is a so-called meta-package, that depends on a set of sub-packages. As such, a :command:`yum install roundcubemail` results in a fully function, minimal installation of Roundcube (with only the core, few required plugins, and one skin). Among the Roundcube sources are three generic categories of source code that are packaged separately -- the core, the plugins and the skins. The core program and each plugin may contain static files (assets) for the core program or the plugin to function, that are independent of the skin being used, but may also contain static files (assets) that are specific to a particular skin being used. Program code, skins and assets are all packaged separately, so that a particular server system can be made to serve only static contents. .. seealso:: * :ref:`article-what-goes-in-to-a-documentroot-and-what-does-not-belong-there` **Core Roundcube Library and Program** The core Roundcube library contains generic program code shared between applications such as :ref:`package-chwala`, :ref:`package-irony`, :ref:`package-kolab-freebusy` and :ref:`package-kolab-syncroton`. In packaging, the core Roundcube library is deployed to :file:`/usr/share/roundcubemail/program/lib/Roundcube/`, and configured using :file:`/etc/roundcubemail/config.inc.php` and :file:`/etc/roundcubemail/defaults.inc.php`. The core Roundcube program wraps up the core library, required plugins and the available skins in to the full webmail interface. The core is packaged as **roundcubemail-core**, providing a virtual capability of *roundcubemail(core) = %{version}-%{release}* that other packages depend on. This package also depends on the plugins that are required, and at least one skin (referred to by the virtual provides *roundcubemail(skin)*). **Required Plugins** Required plugins are packaged separately, and include: * ``filesystem_attachments`` * ``jqueryui`` **Additional Plugins** * ``acl`` * ``additional_message_headers`` * ``archive`` * ``attachment_reminder`` * ``autologon`` * ``database_attachments`` * ``debug_logger`` * ``emoticons`` * ``enigma`` * ``example_addressbook`` * ``help`` * ``hide_blockquote`` * ``http_authentication`` * ``identity_select`` * ``legacy_browser`` * ``managesieve`` * ``markasjunk`` * ``new_user_dialog`` * ``new_user_identity`` * ``newmail_notifier`` * ``password`` * ``redundant_attachments`` * ``show_additional_headers`` * ``squirrelmail_usercopy`` * ``subscriptions_option`` * ``userinfo`` * ``vcard_attachments`` * ``virtuser_file`` * ``virtuser_query`` * ``zipdownload`` **Skins** * ``classic`` * ``larry`` diff --git a/source/howtos/build-kolab-from-source.rst b/source/howtos/build-kolab-from-source.rst index d300dcf3..ca26ee63 100644 --- a/source/howtos/build-kolab-from-source.rst +++ b/source/howtos/build-kolab-from-source.rst @@ -1,663 +1,663 @@ =============================== HOWTO: Build Kolab From Sources =============================== This HOWTO uses an Enterprise Linux 6, default installation of Kolab Groupware. For the purpose of this HOWTO, setup-kolab should have been run already, either from the installed packages or using the command from source as outlined in :ref:`build-source_pykolab`. .. WARNING:: Out of Mainstream Continuing with this HOWTO, running Kolab Groupware directly from source, brings you out of mainline supply streams for updates. We recommend that after going through the procedure(s) outlined in this document, you disable the Kolab YUM repositories, or package updates might overwrite the files you compiled from source. We also recommend you subscribe to the following mailing lists to keep in touch with upstream, and be notified of important changes: * devel@lists.kolab.org * commits@lists.kolab.org libkolabxml =========== The libkolabxml libraries and modules for PHP and Python are used with :ref:`build-source_libkolab`, :ref:`build-source_pykolab_wallace`, and the Kolab plugins for Roundcube :ref:`build-source_kolab-plugins`. Building and Installing libkolabxml ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Clone the GIT repository: .. parsed-literal:: # git clone https://git.kolab.org/diffusion/LKX/libkolabxml.git libkolabxml.git Initialized empty Git repository in /root/libkolabxml.git/.git/ remote: Counting objects: 3566, done. remote: Compressing objects: 100% (1782/1782), done. remote: Total 3566 (delta 2616), reused 2333 (delta 1743) Receiving objects: 100% (3566/3566), 650.50 KiB, done. Resolving deltas: 100% (2616/2616), done. 2. Install the build dependencies: .. parsed-literal:: # yum-builddep libkolabxml 3. Build libkolabxml: .. parsed-literal:: # mkdir build # cd build # cmake \\ -DCMAKE_VERBOSE_MAKEFILE=ON \\ -DCMAKE_INSTALL_PREFIX=$(rpm --eval="%{_prefix}") \\ -DINCLUDE_INSTALL_DIR=$(rpm --eval="%{_includedir}") \\ -DLIB_INSTALL_DIR=$(rpm --eval="%{_libdir}") \\ -DPHP_BINDINGS=ON \\ -DPYTHON_BINDINGS=ON \\ .. # make 4. Install libkolabxml: .. parsed-literal:: # make install Testing Modifications ^^^^^^^^^^^^^^^^^^^^^ Your modifications to libkolabxml should be complete before submitting a patch or making a commit. To test whether libkolabxml builds with your modifications, use the following command: .. parsed-literal:: # ./autogen.sh libcalendaring ============== libcalendaring is only needed if the system packages do not include KDE >= 4.8. Building and Installing libcalendaring ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Clone the GIT repository: .. parsed-literal:: # git clone https://git.kolab.org/diffusion/LC/libcalendaring.git libcalendaring.git Initialized empty Git repository in /root/libcalendaring.git/.git/ remote: Counting objects: 2624, done. remote: Compressing objects: 100% (1830/1830), done. remote: Total 2624 (delta 927), reused 2317 (delta 716) Receiving objects: 100% (2624/2624), 3.28 MiB | 263 KiB/s, done. Resolving deltas: 100% (927/927), done. 2. Install the build dependencies: .. parsed-literal:: # yum-builddep libcalendaring 3. Build libcalendaring: .. parsed-literal:: # mkdir build # cd build # cmake \\ -DCMAKE_VERBOSE_MAKEFILE=ON \\ -DCMAKE_INSTALL_PREFIX=$(rpm --eval="%{_prefix}") \\ -DINCLUDE_INSTALL_DIR=$(rpm --eval="%{_includedir}") \\ -DLIB_INSTALL_DIR=$(rpm --eval="%{_libdir}") \\ -DCMAKE_BUILD_TYPE=Release \\ .. # make 4. Install libcalendaring: .. parsed-literal:: # make install Testing Modifications ^^^^^^^^^^^^^^^^^^^^^ Your modifications to libcalendaring should be complete before submitting a patch or making a commit. To test whether libcalendaring builds with your modifications, use the following command: .. parsed-literal:: # ./autogen.sh .. _build-source_libkolab: libkolab ======== Requires libkolabxml, and for systems that do not have KDE >= 4.8, libcalendaring. Building and Installing libkolab ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Clone the GIT repository: .. parsed-literal:: # git clone https://git.kolab.org/diffusion/LK/libkolab.git libkolab.git Initialized empty Git repository in /root/libkolab.git/.git/ remote: Counting objects: 2021, done. remote: Compressing objects: 100% (1925/1925), done. remote: Total 2021 (delta 1353), reused 101 (delta 53) Receiving objects: 100% (2021/2021), 441.36 KiB | 250 KiB/s, done. Resolving deltas: 100% (1353/1353), done. 2. Install the build dependencies: .. parsed-literal:: # yum-builddep libkolab 3. Build libkolab * Build libkolab with libcalendaring .. parsed-literal:: # mkdir build # cd build # cmake \\ -DCMAKE_VERBOSE_MAKEFILE=ON \\ -DCMAKE_INSTALL_PREFIX=$(rpm --eval="%{_prefix}") \\ -DLIB_INSTALL_DIR=$(rpm --eval="%{_libdir}") \\ -DINCLUDE_INSTALL_DIR=$(rpm --eval="%{_includedir}") \\ -DUSE_LIBCALENDARING=ON \\ -DPHP_BINDINGS=ON \\ -DPHP_INSTALL_DIR=$(rpm --eval="%{_libdir}")/php/modules \\ -DPYTHON_BINDINGS=ON \\ -DCMAKE_BUILD_TYPE=Release \\ .. # make * Build libkolab without libcalendaring .. parsed-literal:: # mkdir build # cd build # cmake \\ -DCMAKE_VERBOSE_MAKEFILE=ON \\ -DCMAKE_INSTALL_PREFIX=$(rpm --eval="%{_prefix}") \\ -DLIB_INSTALL_DIR=$(rpm --eval="%{_libdir}") \\ -DINCLUDE_INSTALL_DIR=$(rpm --eval="%{_includedir}") \\ -DPHP_BINDINGS=ON \\ -DPHP_INSTALL_DIR=$(rpm --eval="%{_libdir}")/php/modules \\ -DPYTHON_BINDINGS=ON \\ -DCMAKE_BUILD_TYPE=Release \\ .. # make 4. Install libkolab: .. parsed-literal:: # make install Testing Modifications ^^^^^^^^^^^^^^^^^^^^^ Your modifications to libkolab should be complete before submitting a patch or making a commit. To test whether libkolab builds with your modifications, use the following command: .. parsed-literal:: # ./autogen.sh .. _build-source_pykolab: PyKolab ======= This section outlines running PyKolab directly from source. This involves the Kolab daemon (kolabd), Wallace (wallaced), and the Kolab SASL Authentication daemon (kolab-saslauthd). 1. Clone the GIT repository: .. parsed-literal:: # git clone https://git.kolab.org/diffusion/P/pykolab.git pykolab.git Initialized empty Git repository in /root/pykolab.git/.git/ remote: Counting objects: 6938, done. remote: Compressing objects: 100% (5467/5467), done. remote: Total 6938 (delta 4713), reused 1964 (delta 1323) Receiving objects: 100% (6938/6938), 1.27 MiB | 1.22 MiB/s, done. Resolving deltas: 100% (4713/4713), done. 2. Install the build dependencies: .. parsed-literal:: # yum-builddep pykolab 3. Configure pykolab: .. parsed-literal:: # cd pykolab.git # autoreconf -v # ./configure Kolab Setup / Bootstrap ^^^^^^^^^^^^^^^^^^^^^^^ Running the Kolab setup procedure (setup-kolab) directly from source allows you to test fixes and enhancements otherwise not available, and develop your own. You probably want some level of increased verbosity when running setup-kolab from source. Use the -d 9 command-line option for protocol level tracing, and -d 8 for program level step tracing. .. rubric:: Running setup-kolab.py from Source .. parsed-literal:: # ./setup-kolab.py -d 9 Kolab Daemon ^^^^^^^^^^^^ Running the Kolab daemon (kolabd) directly from source allows you to test fixes and enhancements otherwise not available, and develop your own. You probably want some level of increased verbosity when running the Kolab daemon from source. Use the -d 9 command-line option for protocol level tracing, and -d 8 for program level step tracing. .. rubric:: Running kolabd.py from Source 1. Stop the system service and prevent it from starting on boot: .. parsed-literal:: # service kolabd stop # chkconfig kolabd off 2. Run the Kolab daemon .. parsed-literal:: # ./kolabd.py -d 9 .. _build-source_pykolab_wallace: Wallace Daemon ^^^^^^^^^^^^^^ Running the Wallace daemon (wallaced) directly from source allows you to test fixes and enhancements otherwise not available, and develop your own. You probably want some level of increased verbosity when running the Wallace daemon from source. Use the -d 9 command-line option for protocol level tracing, and -d 8 for program level step tracing. .. rubric:: Running wallace.py from Source 1. Stop the system service and prevent it from starting on boot: .. parsed-literal:: # service wallace stop # chkconfig wallace off 2. Run the Wallace daemon from source: .. parsed-literal:: # ./wallace.py -d 9 Kolab SMTP Access Policy ^^^^^^^^^^^^^^^^^^^^^^^^ Running the Kolab SMTP Access Policy directly from source allows you to test fixes and enhancements otherwise not available, and develop your own. You probably want some level of increased verbosity when running the Wallace daemon from source. Use the -d 9 command-line option for protocol level tracing, and -d 8 for program level step tracing. .. rubric:: Running the Kolab SMTP Access Policy from Source 1. Move the version of the Kolab SMTP Acccess Policy installed on the system out of the way: .. parsed-literal:: # mv /usr/libexec/postfix/kolab_smtp_access_policy \\ /usr/libexec/postfix/kolab_smtp_access_policy.orig 2. Create a symbolic link to the GIT version of the Kolab SMTP Access Policy: .. parsed-literal:: # cd /usr/libexec/postfix/ # ln -s /root/pykolab.git/bin/kolab_smtp_access_policy.py \\ kolab_smtp_access_policy 3. Edit /etc/postfix/master.cf to increase the verbosity the Kolab SMTP Access Policy logs interactions with. At the end of the file, replace the lines for the recipient_policy, recipient_policy_incoming, sender_policy, sender_policy_incoming and submission_policy with the following: .. NOTE:: The '\' at the end of these lines is supposed to indicate continuation of the line .. parsed-literal:: recipient_policy unix - n n - - spawn user=kolab-n argv=/usr/libexec/postfix/kolab_smtp_access_policy \\ --verify-recipient -d 9 recipient_policy_incoming unix - n n - - spawn user=kolab-n argv=/usr/libexec/postfix/kolab_smtp_access_policy \\ --verify-recipient --allow-unauthenticated -d 9 sender_policy unix - n n - - spawn user=kolab-n argv=/usr/libexec/postfix/kolab_smtp_access_policy \\ --verify-sender -d 9 sender_policy_incoming unix - n n - - spawn user=kolab-n argv=/usr/libexec/postfix/kolab_smtp_access_policy \\ --verify-sender --allow-unauthenticated -d 9 submission_policy unix - n n - - spawn user=kolab-n argv=/usr/libexec/postfix/kolab_smtp_access_policy \\ --verify-sender --verify-recipient -d 9 .. _build-source_kolab-plugins: Roundcube and Kolab Plugins for Roundcube ========================================= By default, the Roundcube web client interface is available at ``/roundcubemail/``, and served from ``/usr/share/roundcubemail/``. To install Roundcube and Kolab plugins from source, you will have perform the following procedure: Installing Roundcube and Kolab Plugins from Source ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Choose a location to install the GIT version of Roundcube. We suggest using ``/var/www/html/``. .. parsed-literal:: # cd /usr/share/ # rm -rf roundcubemail 2. Clone the Roundcube GIT repository: .. parsed-literal:: # git clone git://github.com/roundcube/roundcubemail Cloning into 'roundcubemail'... remote: Counting objects: 63856, done. remote: Compressing objects: 100% (17118/17118), done. remote: Total 63856 (delta 46441), reused 63204 (delta 45880) Receiving objects: 100% (63856/63856), 16.92 MiB | 2.28 MiB/s, done. Resolving deltas: 100% (46441/46441), done. 3. Use the configuration from the RPM Roundcube installation: .. parsed-literal:: # cd roundcubemail/config/ # cp -a /etc/roundcubemail/db.inc.php db.inc.php # cp -a /etc/roundcubemail/main.inc.php main.inc.php 4. We create a new database for this Roundcube version. .. parsed-literal:: # mysql -p -e 'CREATE DATABASE roundcube_git;' # mysql -p -e "GRANT ALL PRIVILEGES ON roundcube_git.* TO roundcube@localhost IDENTIFIED BY 'password';" # mysql -p -e 'FLUSH PRIVILEGES;' # sed -i -e "s\|/roundcube'\|/roundcube_git'\|g" config/db.inc.php # mysql -p roundcube_git < ./SQL/mysql.initial.sql 5. Clone the GIT repository for the Kolab plugins: .. parsed-literal:: # cd /usr/share/ # git clone https://git.kolab.org/diffusion/RPK/roundcubemail-plugins-kolab.git Cloning into 'roundcubemail-plugins-kolab'... remote: Counting objects: 11172, done. remote: Compressing objects: 100% (4664/4664), done. remote: Total 11172 (delta 6696), reused 8756 (delta 5080) Receiving objects: 100% (11172/11172), 2.42 MiB | 2.00 MiB/s, done. Resolving deltas: 100% (6696/6696), done. 6. Use the Kolab plugin configuration from the system directory - ``/etc/roundcubemail/`` as installed by the roundcubemail-plugins-kolab RPM + ``/etc/roundcubemail/`` as installed by the |roundcubemail-plugins-kolab| RPM package and configured using the setup-kolab utility: .. parsed-literal:: # cd roundcubemail-plugins-kolab/plugins # for plugin in \`ls -d \*\`; do if [ -f $plugin/config.inc.php.dist -a \\ -f /etc/roundcubemail/$plugin.inc.php ]; then cp -a /etc/roundcubemail/$plugin.inc.php $plugin/config.inc.php; \\ fi; \\ done 7. The libkolab plugin is special: .. parsed-literal:: # cp -a /etc/roundcubemail/kolab.inc.php libkolab/config.inc.php 8. Load the database schemas for the Kolab plugins: .. parsed-literal:: # mysql -p roundcube_git < calendar/drivers/kolab/SQL/mysql.initial.sql # mysql -p roundcube_git < libkolab/SQL/mysql.initial.sql 9. Put the Kolab plugins into the Roundcube plugins/ directory: .. parsed-literal:: # cd /usr/share/roundcubemail/ # for plugin in \`find ../roundcubemail-plugins-kolab/plugins/ \\ -mindepth 1 -maxdepth 1 -type d | \\ xargs -n 1 basename\`; do ln -s ../../roundcubemail-plugins-kolab/plugins/$plugin plugins/$plugin; \\ done 10. Make sure Roundcube can write to its log files and directory for temporary files: .. parsed-literal:: # chmod 777 logs temp Kolab Theme for Roundcube ========================= The Kolab groupware provides a custom skin for the web client. This can be added as follows: 1. Clone the GIT repository: .. parsed-literal:: # cd /usr/share/ # git clone https://git.kolab.org/diffusion/RSC/roundcubemail-skin-chameleon.git 2. Compile the CSS file using the `Less CSS pre-processor `_: .. parsed-literal:: # cd roundcubemail-skin-chameleon/skins/chameleon # lessc styles.less > styles.css .. NOTE:: Instead of compiling the CSS file on the server, you can enable development mode in Roundcube and have it compiled on the client. This is recommended if you intend to make changes to the style sheets and don't want to run ``lessc`` after every modification. Enable development mode in :file:`/config/config.inc.php`: .. parsed-literal:: $config['devel_mode'] = true; 3. Synlink from the Roundcube skins directory .. parsed-literal:: # cd /skins # ln -s /usr/share/roundcubemail-skin-chameleon/skins/chameleon chameleon 4. Set the Chameleon skin to be the default theme in :file:`/config/config.inc.php` .. parsed-literal:: $config['skin'] = 'chameleon' 5. Optionally disable the skin selection for the user. Set the following in :file:`/config/config.inc.php`: .. parsed-literal:: $config['dont_override'] = array('skin'); Kolab Web Administration Panel and API ====================================== By default, the Kolab Web Administration Panel client interface and API are normally available at /kolab-webadmin/, and served from ``/usr/share/kolab-webadmin/``. To install the Kolab Web Administration Panel client interface and API, execute the following procedure: Installing the Kolab WAP Client and API from Source ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Remove the version installed by packaging: .. parsed-literal:: # cd /usr/share/ # rm -rf kolab-webadmin 2. Clone the GIT repository: .. parsed-literal:: # git clone https://git.kolab.org/diffusion/WAP/webadmin.git kolab-webadmin Initialized empty Git repository in /usr/share/kolab-webadmin/.git/ remote: Counting objects: 6086, done. remote: Compressing objects: 100% (4140/4140), done. remote: Total 6086 (delta 4016), reused 2649 (delta 1669) Receiving objects: 100% (6086/6086), 1.52 MiB | 468 KiB/s, done. Resolving deltas: 100% (4016/4016), done. 3. Set the necessary file permissions: .. parsed-literal:: # cd kolab-webadmin/ # chmod 777 cache logs 4. Consider setting the following two options in :file:`/etc/kolab/kolab.conf`: .. parsed-literal:: [kolab_wap] devel_mode = 1 debug_mode = trace This will enable full debugging, and avoid the use of caching. Hosted Kolab Customer Control Panel =================================== .. todo:: Write the section on running the Hosted Kolab Customer Control Panel from source. Chwala ====== .. todo:: Write the section on running Chwala from source. iRony ===== .. todo:: Write the section on running iRony from source. Kolab Utilities =============== The Kolab utilities include Kolab Free/Busy Daemon, Migration, Format Upgrade. The Kolab utilities require libkolab to be successfully built and installed. Running Kolab Free/Busy from Source ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Install the build dependencies: .. parsed-literal:: # yum-builddep kolab-utils 2. Clone the GIT repository: .. parsed-literal:: # git clone https://git.kolab.org/diffusion/U/utils.git kolab-utils.git 3. Build the Kolab utilities: .. parsed-literal:: # cd kolab-utils.git # ./autogen.sh Free/Busy Generation and Aggregation ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Upgrading the Format Version ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Migration ^^^^^^^^^ Kolab Free/Busy Web Application =============================== diff --git a/source/howtos/nginx-webserver.rst b/source/howtos/nginx-webserver.rst index c219e0be..aca7f44c 100644 --- a/source/howtos/nginx-webserver.rst +++ b/source/howtos/nginx-webserver.rst @@ -1,1091 +1,1091 @@ ================================== HOWTO: Use NGINX as the Web Server ================================== This HOWTO consists of two separate approaches. Simple Installation =================== The simple configuration is supposed to provide only the webclient. This simple setup only includes the webmail part (roundcubemail) and doesn't provide the full experience (file browser, freebusy, caldav/carddav, etc). If you look for a more complete setup including webadmin, irony, etc. take a look on the complex setup. #. Install NGINX and PHP FPM: .. parsed-literal:: # :command:`yum -y install nginx php-fpm` #. Configure **php-fpm** to listen on a local UNIX socket: .. parsed-literal:: # :command:`sed -r -i \\ -e 's|^listen = 127\.0\.0\.1.*$|listen = /var/run/php-fpm/php-fpm.sock|g' \\ /etc/php-fpm.d/www.conf` #. Replace the contents of :file:`/etc/nginx/conf.d/default.conf`: .. parsed-literal:: # :command:`cat > /etc/nginx/conf.d/default.conf` << EOF server { listen 8080 default_server; server_name localhost:8080; - # support roundcubemail secure urls + # support |roundcubemail| secure urls rewrite "^/roundcubemail/[a-zA-Z0-9]{16}/(.*)" /roundcubemail/$1; # roundcube location /roundcubemail { alias /usr/share/roundcubemail/public_html; index index.php; location ~ \\.php$ { include fastcgi_params; fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_split_path_info ^(.+.php)(/.*)$; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $request_filename; } } } EOF .. note:: On debian based systems you might want to take a look at the configuration :file:`/etc/nginx/sites-enabled/default` and a the the default php-fpm socket: :file:`/var/run/php5-fpm.sock` #. Start the **php-fpm** service and configure the service to start on boot: .. parsed-literal:: # :command:`service php-fpm start` # :command:`chkconfig php-fpm on` #. Start the **nginx** service and configure the service to start on boot: .. parsed-literal:: # :command:`service nginx start` # :command:`chkconfig nginx on` More Complex Installation ========================= The following configuration is tested for Kolab 3.4 on CentOS6. It should also work under Debian and Ubuntu, provided you adjust paths and filenames according to their defaults. .. WARNING:: To not create conflicts with the default apache configuration (which is installed due to dependencies) we should move the apache default port from 80 to 8080. .. parsed-literal:: # :command:`sed -i -e 's/^Listen 80$/Listen 8080/g' /etc/httpd/conf/httpd.conf` # :command:`service httpd restart` In theory we don't need the apache daemon anymore. We can turn it off. .. parsed-literal:: # :command:`service httpd stop` # :command:`chkconfig httpd off` Preperation and PHP-FPM ----------------------- #. Install NGINX and PHP FPM: .. parsed-literal:: # :command:`yum -y install nginx php-fpm` Note that to get full WebDAV support, an additional module is needed for nginx. It's available from https://github.com/arut/nginx-dav-ext-module/, but requires a rebuild of nginx from source. Some clients work without it, others don't. .. note:: On Debian just install the ``nginx-full`` package to get the full WebDAV support of nginx (adjust your configuration accordingly. #. Disable the default **php-fpm** configuration (optional): .. parsed-literal:: # :command:`mv /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.bak` .. note:: On Debian the pool configuration folder is located here: ``/etc/php5/fpm/pool.d/`` #. Create the PHP FPM Pools [#fpm_pools]_: .. parsed-literal:: # :command:`cat > /etc/php-fpm.d/kolab.example.org_chwala.conf` << EOF [kolab.example.org_chwala] user = apache group = apache listen = /var/run/php-fpm/kolab.example.org_chwala.sock pm = dynamic pm.max_children = 40 pm.start_servers = 15 pm.min_spare_servers = 10 pm.max_spare_servers = 20 chdir = / php_value[upload_max_filesize] = 30M php_value[post_max_size] = 30M EOF # :command:`cat > /etc/php-fpm.d/kolab.example.org_iRony.conf` << EOF [kolab.example.org_iRony] user = apache group = apache listen = /var/run/php-fpm/kolab.example.org_iRony.sock pm = dynamic pm.max_children = 40 pm.start_servers = 15 pm.min_spare_servers = 10 pm.max_spare_servers = 20 chdir = / php_value[upload_max_filesize] = 30M php_value[post_max_size] = 30M EOF # :command:`cat > /etc/php-fpm.d/kolab.example.org_kolab-freebusy.conf` << EOF [kolab.example.org_kolab-freebusy] user = apache group = apache listen = /var/run/php-fpm/kolab.example.org_kolab-freebusy.sock pm = dynamic pm.max_children = 40 pm.start_servers = 15 pm.min_spare_servers = 10 pm.max_spare_servers = 20 chdir = / EOF # :command:`cat > /etc/php-fpm.d/kolab.example.org_kolab-syncroton.conf` << EOF [kolab.example.org_kolab-syncroton] user = apache group = apache listen = /var/run/php-fpm/kolab.example.org_kolab-syncroton.sock pm = dynamic pm.max_children = 40 pm.start_servers = 15 pm.min_spare_servers = 10 pm.max_spare_servers = 20 chdir = / php_flag[suhosin.session.encrypt] = Off EOF # :command:`cat > /etc/php-fpm.d/kolab.example.org_kolab-webadmin.conf` << EOF [kolab.example.org_kolab-webadmin] user = apache group = apache listen = /var/run/php-fpm/kolab.example.org_kolab-webadmin.sock pm = dynamic pm.max_children = 40 pm.start_servers = 15 pm.min_spare_servers = 10 pm.max_spare_servers = 20 chdir = / EOF # :command:`cat > /etc/php-fpm.d/kolab.example.org_roundcubemail.conf` << EOF [roundcubemail] user = apache group = apache listen = /var/run/php-fpm/kolab.example.org_roundcubemail.sock pm = dynamic pm.max_children = 40 pm.start_servers = 15 pm.min_spare_servers = 10 pm.max_spare_servers = 20 chdir = / # Derived from .htaccess of roundcube php_flag[display_errors] = Off php_flag[log_errors] = On php_value[upload_max_filesize] = 30M php_value[post_max_size] = 30M php_flag[zlib.output_compression] = Off php_flag[magic_quotes_gpc] = Off php_flag[magic_quotes_runtime] = Off php_flag[zend.ze1_compatibility_mode] = Off php_flag[suhosin.session.encrypt] = Off php_flag[session.auto_start] = Off php_value[session.gc_maxlifetime] = 21600 php_value[session.gc_divisor] = 500 php_value[session.gc_probability] = 1 # http://bugs.php.net/bug.php?id=30766 php_value[mbstring.func_overload] = 0 EOF .. note:: On Debian the pool configuration folder is located here: ``/etc/php5/fpm/pool.d/`` Also there's no explizit folder for php5-fpm socket folders. This is how you can take of it and make it reboot safe. Adjust the file: :file:`/etc/default/php5-fpm` .. parsed-literal:: # create /var/run/php5-fpm for all sockets # could be deleted during boot test -e /var/run/php5-fpm || install -m 755 -o root -g root -d /var/run/php5-fpm Now you can adjust all your socket files to: .. parsed-literal:: listen = /var/run/php5-fpm/kolab.example.org_.sock Or fix the files above with this quick command: .. parsed-literal:: # :command:`sed -i -e 's|/var/run/php-fpm/|/var/run/php5-fpm/|g' /etc/php5/fpm/pool.d/kolab*` #. Backup your nginx configuration .. parsed-literal:: # :command:`cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak` Single Domain Configuration --------------------------- If you've only one domain, one ssl certificate or for whatever reason get all the kolab services under one host/domainname this is your configuration. The iRony service will provide all 3 dav services on a single endpoint. ActiveSync devices can be pointed to the main url. They'll find them Microsoft Url automatically. +---------------------------+-----------------------------------------------+ | Application / Service | URL | +===========================+===============================================+ | Roundcubemail | ``https://kolab.example.org`` | +---------------------------+-----------------------------------------------+ | CardDAV, CalDAV, WebDAV | ``https://kolab.example.org/iRony`` | +---------------------------+-----------------------------------------------+ | FreeBusy | ``https://kolab.example.org/freebusy`` | +---------------------------+-----------------------------------------------+ | Chwala API / WebUI | ``https://kolab.example.org/chwala`` | +---------------------------+-----------------------------------------------+ | Kolab Web Admin Panel | ``https://kolab.example.org/kolab-webadmin`` | +---------------------------+-----------------------------------------------+ | ActiveSync Host | ``https://kolab.example.org`` | +---------------------------+-----------------------------------------------+ #. Replace the contents of :file:`/etc/nginx/conf.d/default.conf`: .. parsed-literal:: # # Force HTTP Redirect # server { listen 80 default_server; server_name _; server_name_in_redirect off; rewrite ^ https://$http_host$request_uri permanent; # enforce https redirect } # # Full Kolab Stack # server { listen 443 ssl default_server; server_name kolab.example.org; access_log /var/log/nginx/kolab.example.org-access_log; error_log /var/log/nginx/kolab.example.org-error_log; # enable ssl ssl on; ssl_certificate /etc/pki/tls/private/localhost.pem; ssl_certificate_key /etc/pki/tls/private/localhost.pem; # Start common Kolab config ## ## Chwala ## location /chwala { index index.php; alias /usr/share/chwala/public_html; client_max_body_size 30M; # set maximum upload size # enable php location ~ \.php$ { include fastcgi_params; fastcgi_param HTTPS on; fastcgi_pass unix:/var/run/php-fpm/kolab.example.org_chwala.sock; fastcgi_param SCRIPT_FILENAME $request_filename; # Without this, PHPSESSION is replaced by webadmin-api X-Session-Token fastcgi_param PHP_VALUE "session.auto_start=0 session.use_cookies=0"; fastcgi_pass_header X-Session-Token; } } ## ## iRony ## location /iRony { alias /usr/share/iRony/public_html/index.php; client_max_body_size 30M; # set maximum upload size # If Nginx was built with http_dav_module: dav_methods PUT DELETE MKCOL COPY MOVE; # Required Nginx to be built with nginx-dav-ext-module: # dav_ext_methods PROPFIND OPTIONS; include fastcgi_params; # fastcgi_param DAVBROWSER 1; fastcgi_param HTTPS on; fastcgi_index index.php; fastcgi_pass unix:/var/run/php-fpm/kolab.example.org_iRony.sock; fastcgi_param SCRIPT_FILENAME $request_filename; } location ~* /.well-known/(cal|card)dav { rewrite ^ /iRony/ permanent; } ## ## Kolab Webclient ## location / { index index.php; root /usr/share/roundcubemail/public_html; # support for csrf token rewrite "^/[a-zA-Z0-9]{16}/(.*)" /$1 break; # maximum upload size for mail attachments client_max_body_size 30M; # enable php location ~ \.php$ { include fastcgi_params; fastcgi_param HTTPS on; fastcgi_split_path_info ^(.+\.php)(/.*)$; fastcgi_pass unix:/var/run/php-fpm/kolab.example.org_roundcubemail.sock; fastcgi_param SCRIPT_FILENAME $request_filename; } } ## ## Kolab Web Administration Panel (WAP) and API ## location /kolab-webadmin { index index.php; alias /usr/share/kolab-webadmin/public_html; try_files $uri $uri/ @kolab-wapapi; # enable php location ~ \.php$ { include fastcgi_params; fastcgi_param HTTPS on; fastcgi_pass unix:/var/run/php-fpm/kolab.example.org_kolab-webadmin.sock; fastcgi_param SCRIPT_FILENAME $request_filename; # Without this, PHPSESSION is replaced by webadmin-api X-Session-Token fastcgi_param PHP_VALUE "session.auto_start=0 session.use_cookies=0"; fastcgi_pass_header X-Session-Token; } } # kolab-webadmin api location @kolab-wapapi { rewrite ^/kolab-webadmin/api/([^\.]*)\.([^\.]*)$ /kolab-webadmin/api/index.php?service=$1&method=$2; } ## ## Kolab syncroton ActiveSync ## location /Microsoft-Server-ActiveSync { alias /usr/share/kolab-syncroton/index.php; client_max_body_size 30M; # maximum upload size for mail attachments include fastcgi_params; fastcgi_param HTTPS on; fastcgi_read_timeout 1200; fastcgi_index index.php; fastcgi_pass unix:/var/run/php-fpm/kolab.example.org_kolab-syncroton.sock; fastcgi_param SCRIPT_FILENAME /usr/share/kolab-syncroton/index.php; } ## ## Kolab Free/Busy ## location /freebusy { alias /usr/share/kolab-freebusy/public_html/index.php; include fastcgi_params; fastcgi_param HTTPS on; fastcgi_index index.php; fastcgi_pass unix:/var/run/php-fpm/kolab.example.org_kolab-freebusy.sock; fastcgi_param SCRIPT_FILENAME /usr/share/kolab-freebusy/public_html/index.php; } # End common Kolab config } .. note:: On Debian you can use the site configuration found at * ``/etc/nginx/sites-available/`` * ``/etc/nginx/sites-enabled/`` #. Adjust your kolab webadmin api url in the :file:`/etc/kolab/kolab.conf` configuration, otherwise webadmin or commandline tools will not work. .. parsed-literal:: [kolab_wap] api_url = https://kolab.example.org/kolab-webadmin/api Multi Subdomain Configuration ----------------------------- Sometimes it's nice to create seperate host/domainnames for every service that kolab offers. You can limit iRony to only provide a single dav-service on each url endpoint. The Chwala API should be located on the webmail domain to not create any cross-domain api call problems. mtch the default configuration. If you like change your config files you also move those to their url. But usually people don't often need direct access to this url. .. note:: It helps to have a wildcard ssl certificate or a certificate that includes all needed hostnames as *SubjectAltNames*. **URL Scheme** +---------------------------+-----------------------------------------------+ | Application / Service | URL | +===========================+===============================================+ | Roundcubemail | ``https://webmail.example.org`` | +---------------------------+-----------------------------------------------+ | CardDAV | ``https://carddav.example.org`` | +---------------------------+-----------------------------------------------+ | CalDAV | ``https://caldav.example.org`` | +---------------------------+-----------------------------------------------+ | WebDAV | ``https://webdav.example.org`` | +---------------------------+-----------------------------------------------+ | FreeBusy | ``https://freebusy.example.org`` | +---------------------------+-----------------------------------------------+ | Chwala API / WebUI | ``https://webmail.example.org/chwala`` | +---------------------------+-----------------------------------------------+ | Kolab Web Admin Panel | ``https://kolab.example.org`` | +---------------------------+-----------------------------------------------+ | ActiveSync Host | ``https://activesync.example.org`` | +---------------------------+-----------------------------------------------+ You can also let the users use the serparte host/domain names for the non-web services. * ``imap.example.org`` * ``smtp.example.org`` * etc. But this all depends on you and your communication with your end users. #. Replace the contents of :file:`/etc/nginx/conf.d/default.conf`: .. parsed-literal:: # # Force HTTP Redirect # server { listen 80 default_server; server_name _; server_name_in_redirect off; rewrite ^ https://$http_host$request_uri permanent; # enforce https redirect } # # Webmail + Chwala + Freebusy # server { listen 443 ssl default_server; server_name webmail.example.org; access_log /var/log/nginx/webmail.example.org-access_log; error_log /var/log/nginx/webmail.example.org-error_log; # enable ssl ssl on; ssl_certificate /etc/pki/tls/private/localhost.pem; ssl_certificate_key /etc/pki/tls/private/localhost.pem; # Start common Kolab config ## ## Chwala ## location /chwala { index index.php; alias /usr/share/chwala/public_html; client_max_body_size 30M; # set maximum upload size # enable php location ~ \.php$ { include fastcgi_params; fastcgi_param HTTPS on; fastcgi_pass unix:/var/run/php-fpm/kolab.example.org_chwala.sock; fastcgi_param SCRIPT_FILENAME $request_filename; # Without this, PHPSESSION is replaced by webadmin-api X-Session-Token fastcgi_param PHP_VALUE "session.auto_start=0 session.use_cookies=0"; fastcgi_pass_header X-Session-Token; } } ## ## Kolab Webclient ## index index.php; root /usr/share/roundcubemail/public_html; # support for csrf token rewrite "^/[a-zA-Z0-9]{16}/(.*)" /$1 break; # maximum upload size for mail attachments client_max_body_size 30M; # enable php location ~ \.php$ { include fastcgi_params; fastcgi_param HTTPS on; fastcgi_split_path_info ^(.+\.php)(/.*)$; fastcgi_pass unix:/var/run/php-fpm/kolab.example.org_roundcubemail.sock; fastcgi_param SCRIPT_FILENAME $request_filename; } } # # CardDAV # server { listen 443 ssl; server_name carddav.example.org; access_log /var/log/nginx/carddav.example.org-access_log; error_log /var/log/nginx/carddav.example.org-error_log; # enable ssl ssl on; ssl_certificate /etc/pki/tls/private/localhost.pem; ssl_certificate_key /etc/pki/tls/private/localhost.pem; # Start common Kolab config ## ## DAV Discovery redirect ## location ~* /.well-known/carddav { rewrite ^ / permanent; } ## ## iRony ## root /usr/share/iRony/public_html; index index.php; try_files $uri $uri/ /index.php?$args; client_max_body_size 30M; # set maximum upload size # If Nginx was built with http_dav_module: dav_methods PUT DELETE MKCOL COPY MOVE; # Required Nginx to be built with nginx-dav-ext-module: # dav_ext_methods PROPFIND OPTIONS; location ~ \.php$ { include fastcgi_params; fastcgi_param CARDDAV 1; # fastcgi_param DAVBROWSER 1; fastcgi_param HTTPS on; fastcgi_index index.php; fastcgi_pass unix:/var/run/php-fpm/kolab.example.org_iRony.sock; fastcgi_param SCRIPT_FILENAME $request_filename; } } # # CalDAV # server { listen 443 ssl; server_name caldav.example.org; access_log /var/log/nginx/caldav.example.org-access_log; error_log /var/log/nginx/caldav.example.org-error_log; # enable ssl ssl on; ssl_certificate /etc/pki/tls/private/localhost.pem; ssl_certificate_key /etc/pki/tls/private/localhost.pem; # Start common Kolab config ## ## DAV Discovery redirect ## location ~* /.well-known/caldav { rewrite ^ / permanent; } ## ## iRony ## root /usr/share/iRony/public_html; index index.php; try_files $uri $uri/ /index.php?$args; client_max_body_size 30M; # set maximum upload size # If Nginx was built with http_dav_module: dav_methods PUT DELETE MKCOL COPY MOVE; # Required Nginx to be built with nginx-dav-ext-module: # dav_ext_methods PROPFIND OPTIONS; location ~ \.php$ { include fastcgi_params; fastcgi_param CALDAV 1; # fastcgi_param DAVBROWSER 1; fastcgi_param HTTPS on; fastcgi_index index.php; fastcgi_pass unix:/var/run/php-fpm/kolab.example.org_iRony.sock; fastcgi_param SCRIPT_FILENAME $request_filename; } } # # WebDAV # server { listen 443 ssl; server_name webadv.example.org; access_log /var/log/nginx/webadv.example.org-access_log; error_log /var/log/nginx/webadv.example.org-error_log; # enable ssl ssl on; ssl_certificate /etc/pki/tls/private/localhost.pem; ssl_certificate_key /etc/pki/tls/private/localhost.pem; # Start common Kolab config ## ## iRony ## root /usr/share/iRony/public_html; index index.php; try_files $uri $uri/ /index.php?$args; client_max_body_size 30M; # set maximum upload size # If Nginx was built with http_dav_module: dav_methods PUT DELETE MKCOL COPY MOVE; # Required Nginx to be built with nginx-dav-ext-module: # dav_ext_methods PROPFIND OPTIONS; location ~ \.php$ { include fastcgi_params; fastcgi_param WEBDAV 1; # fastcgi_param DAVBROWSER 1; fastcgi_param HTTPS on; fastcgi_index index.php; fastcgi_pass unix:/var/run/php-fpm/kolab.example.org_iRony.sock; fastcgi_param SCRIPT_FILENAME $request_filename; } } # # Kolab Web Admin Panel + API # server { listen 443 ssl; server_name kolab.example.org; access_log /var/log/nginx/kolab.example.org-access_log; error_log /var/log/nginx/kolab.example.org-error_log; # enable ssl ssl on; ssl_certificate /etc/pki/tls/private/localhost.pem; ssl_certificate_key /etc/pki/tls/private/localhost.pem; # Start common Kolab config ## ## Kolab Web Administration Panel (WAP) and API ## root /usr/share/kolab-webadmin/public_html; index index.php; try_files $uri $uri/ @kolab-wapapi; # enable php location ~ \.php$ { include fastcgi_params; fastcgi_param HTTPS on; fastcgi_pass unix:/var/run/php-fpm/kolab.example.org_kolab-webadmin.sock; fastcgi_param SCRIPT_FILENAME $request_filename; # Without this, PHPSESSION is replaced by webadmin-api X-Session-Token fastcgi_param PHP_VALUE "session.auto_start=0 session.use_cookies=0"; fastcgi_pass_header X-Session-Token; } # kolab-webadmin api location @kolab-wapapi { rewrite ^/api/([^\.]*)\.([^\.]*)$ /api/index.php?service=$1&method=$2; } } # # Syncroton / ActiveSync # server { listen 443 ssl; server_name activesync.example.org; access_log /var/log/nginx/kolab.example.org-access_log; error_log /var/log/nginx/kolab.example.org-error_log; # enable ssl ssl on; ssl_certificate /etc/pki/tls/private/localhost.pem; ssl_certificate_key /etc/pki/tls/private/localhost.pem; ## ## Kolab syncroton ActiveSync ## location /Microsoft-Server-ActiveSync { alias /usr/share/kolab-syncroton/index.php; client_max_body_size 30M; # maximum upload size for mail attachments include fastcgi_params; fastcgi_param HTTPS on; fastcgi_read_timeout 1200; fastcgi_index index.php; fastcgi_pass unix:/var/run/php-fpm/kolab.example.org_kolab-syncroton.sock; fastcgi_param SCRIPT_FILENAME /usr/share/kolab-syncroton/index.php; } ## ## Return to Webmail any other invalid request ## location / { rewrite ^ https://webmail.example.org permanent; } } # # FreeBusy # server { listen 443 ssl; server_name freebusy.example.org; access_log /var/log/nginx/freebusy.example.org-access_log; error_log /var/log/nginx/freebusy.example.org-error_log; # enable ssl ssl on; ssl_certificate /etc/pki/tls/private/localhost.pem; ssl_certificate_key /etc/pki/tls/private/localhost.pem; # Start common Kolab config ## ## Kolab Free/Busy ## root /usr/share/kolab-freebusy/public_html/index.php; index index.php; try_files $uri $uri/ /index.php?$args; location ~ \.php$ { include fastcgi_params; fastcgi_param HTTPS on; fastcgi_index index.php; fastcgi_pass unix:/var/run/php-fpm/kolab.example.org_kolab-freebusy.sock; fastcgi_param SCRIPT_FILENAME /usr/share/kolab-freebusy/public_html/index.php; } } .. note:: On Debian you can use the site configuration found at * ``/etc/nginx/sites-available/`` * ``/etc/nginx/sites-enabled/`` #. Adjust your kolab webadmin api url in the :file:`/etc/kolab/kolab.conf` configuration, otherwise webadmin or commandline tools will not work. .. parsed-literal:: [kolab_wap] api_url = https://kolab.example.org/api #. Since Freebusy has moved to a different location we've to adjust the api endpoint in :file:`/etc/roundcubemail/libkolab.inc.php` .. parsed-literal:: $config['kolab_freebusy_server'] = 'https://freebusy.example.org'; #. iRony basedir has to be adjusted in :file:`/etc/iRony/dav.inc.php` .. parsed-literal:: $config['base_uri'] = '/'; #. We can now set the absolute urls for the CalDAV/CardDAV integration :file:`/etc/roundcubemail/calendar.inc.php` .. parsed-literal:: $config['calendar_caldav_url'] = "https://caldav.example.org/calendars/%u/%i"; :file:`/etc/roundcubemail/kolab_addressbook.inc.php` .. parsed-literal:: $config['kolab_addressbook_carddav_url'] = "https://carddav.example.org/addressbooks/%u/%i"; Finalize / Common ----------------- #. Since we run Roundcube in the base directory ``/`` of the server, we've to set the correct asset path .. parsed-literal:: $config['assets_path'] = '/assets/'; #. For configurations that use SSL, make sure to work around a known issue in PHP pear module HTTP_Request2, and include in :file:`/etc/roundcubemail/config.inc.php`: .. parsed-literal:: $config['ssl_verify_host'] = false; $config['ssl_verify_peer'] = false; #. Start the **php-fpm** service and configure the service to start on boot: .. parsed-literal:: # :command:`service php-fpm start` # :command:`chkconfig php-fpm on` #. Start the **nginx** service and configure the service to start on boot: .. parsed-literal:: # :command:`service nginx start` # :command:`chkconfig nginx on` Tips, tweaks and optimizations ============================== Tweaking ssl cipher settings ---------------------------- To ensure Perfect Forward Secrecy is enabled when possible #. Add the following into **http** section of :file:`/etc/nginx/nginx.conf`: .. parsed-literal:: # These cipher settings should ensure Perfect Forward Secrecy is # enabled when possible. ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"; ssl_session_cache shared:SSL:10m; #. Restart the **nginx** service: .. parsed-literal:: # :command:`service nginx restart` Adding open file cache to nginx ------------------------------- Open file cache will make nginx cache static files, that were accessed ``open_file_cache_min_uses`` times. #. Add the following into **http** section of :file:`/etc/nginx/nginx.conf`: .. parsed-literal:: open_file_cache max=16384 inactive=5m; open_file_cache_valid 90s; open_file_cache_min_uses 2; open_file_cache_errors on; #. Restart the **nginx** service: .. parsed-literal:: # :command:`service nginx restart` Adding fastcgi_cache to nginx ----------------------------- #. Create and set ownership on the following directories: * :file:`/var/lib/nginx/fastcgi/` .. parsed-literal:: # :command:`mkdir -p /var/lib/nginx/fastcgi/` # :command:`chown -R nginx:nginx /var/lib/nginx/fastcgi/` # :command:`chmod -R 700 /var/lib/nginx/fastcgi/` #. Add the following into **http** section of :file:`/etc/nginx/nginx.conf`: .. parsed-literal:: fastcgi_cache_key "$scheme$request_method$host$request_uri"; fastcgi_cache_use_stale error timeout invalid_header http_500; fastcgi_cache_valid 200 302 304 10m; fastcgi_cache_valid 301 1h; fastcgi_cache_min_uses 2; #. Add the following outside **server** sections of :file:`/etc/nginx/conf.d/default.conf`: .. parsed-literal:: fastcgi_cache_path /var/lib/nginx/fastcgi/ levels=1:2 keys_zone=key-zone-name:16m max_size=256m inactive=1d; #. Add the following into **ssl server** section of :file:`/etc/nginx/conf.d/default.conf`: .. parsed-literal:: fastcgi_cache key-zone-name; #. Restart the **nginx** service: .. parsed-literal:: # :command:`service nginx restart` Browse CalDAV/CardDAV/WebDAV with your browser ---------------------------------------------- In the default configuration iRony only supports the default DAV commands. If you want to use GET to browse through your DAV instance to make sure everything is working, just uncomment the ``fastcgi_param DAVBROWSER 1`` option in the php section and point your browser to it. Splitting Kolab nginx config for use with multi-domain ------------------------------------------------------ You can put common Kolab config into separate file and include it into server configurations, if you need different settings for different domains in a multi-domain setup (eg. different ssl certificates). This way you wount have to keep up to date lines common to all Kolab servers in multitude of server configurations. #. Common Kolab config is between lines: .. parsed-literal:: # Start common Kolab config ... # End common Kolab config move it into separate file (eg. :file:`/etc/nginx/kolab_common.conf`) #. Use ``include`` directive to include the new file into configuration: .. parsed-literal:: # Start common Kolab config include /etc/nginx/kolab_common.conf # End common Kolab config So your server configuration file can look like similar to this: .. parsed-literal:: fastcgi_cache_path /var/lib/nginx/fastcgi/ levels=1:2 keys_zone=kolab1-key-zone-name:16m max_size=256m inactive=1d; server { listen 80 default_server; server_name kolab1.example.org; rewrite ^ https://$http_hosts$request_uri permanent; # enforce https redirect } server { listen 443 ssl; server_name kolab1.example.org; access_log /var/log/nginx/kolab1.example.org-access_log; error_log /var/log/nginx/kolab1.example.org-error_log; ssl on; ssl_certificate /etc/pki/tls/certs/kolab1.example.org.pem; ssl_certificate_key /etc/pki/tls/certs/kolab1.example.org.pem; fastcgi_cache kolab1-key-zone-name; # Start common Kolab config include /etc/nginx/kolab_common.conf # End common Kolab config } .. rubric:: Footnotes .. [#fpm_pools] Values for fpm servers are taken from a moderately loaded virtual server with 4x3.5GHz CPU and 4GB RAM, feel free to adjust them according to your setup. diff --git a/source/index.rst b/source/index.rst index 67e41e3d..b0512380 100644 --- a/source/index.rst +++ b/source/index.rst @@ -1,136 +1,143 @@ ===================== About Kolab Groupware ===================== Kolab Groupware is a Free Software groupware solution for Email communications, Events & Appointments, Contacts and more. It supports *mixed client environments* because of an *open storage format*, and the use of well-established, standard protocols such as IMAP and SMTP. For the full Kolab experience, you need a Kolab server, and one or more Kolab clients. What makes Kolab a unique groupware solution is its focus on security, scalability, data ownership (aka privacy) and the use of proven components and protocols. Read more in our :ref:`introduction`. +.. rubric:: The Currency of Kudo is Beer + +.. toctree:: + :maxdepth: 1 + + contributor-guide/index + .. rubric:: Planning Your Kolab Groupware Deployment .. toctree:: :maxdepth: 1 deployment-guide/index .. rubric:: Administrator Guides .. toctree:: :maxdepth: 1 installation-guide/index configuration-guide/index upgrade-guide/index administrator-guide/index .. rubric:: End-User Guides .. toctree:: :maxdepth: 1 webmail-user-guide/index client-configuration/index .. rubric:: Developer Guides .. toctree:: :maxdepth: 1 architecture-and-design/index developer-guide/index .. These are still here, but may be ignored for the docs' index. .. rubric:: Extras .. toctree:: :maxdepth: 1 docker/index puppet/index .. rubric:: HOWTOs The following HOWTOs have been contributed by fellow community members .. toctree:: :maxdepth: 1 howtos/multi-domain howtos/secure-kolab-server howtos/nginx-webserver howtos/build-kolab-from-source howtos/deploy-kolab-with-glusterfs-for-imap howtos/use-seafile-with-chwala howtos/kolab-webadmin-create-user .. The following HOWTOs are empty :/ howtos/nginx-imap-proxy howtos/deploy-high-available-and-load-balanced-ldap .. .. rubric:: Articles .. toctree:: :maxdepth: 1 :glob: articles/*/index .. The following are placeholders for documentation that is not to be included in the toctree, for it is otherwise referred to. .. toctree:: :glob: :hidden: about/index about/*/* architecture-and-design/ldap-intro architecture-and-design/bonnie-api architecture-and-design/bonnie-extra architecture-and-design/bonnie-orm articles/*/* client-configuration/settings developer-guide/packaging/obs-for-kolab/why-private-obs developer-guide/packaging/obs-for-kolab/packages/* developer-guide/packaging/obs-for-kolab/product/* puppet/module/kolab/why-multiple-parameterized-classes webmail-user-guide/roundcubemail/en_US/index .. The following are placeholders for documentation that is yet to be included. .. toctree:: :hidden: architecture-and-design/bonnie architecture-and-design/calendaring architecture-and-design/environment-management desktop-clients/index howtos/dnssec howtos/freeipa-integration howtos/kerberos-authentication howtos/logstash-and-elasticsearch howtos/split-domains-multiple-groupware-deployments installation-guide/first-login installation-guide/kolab-3.3/index installation-guide/kolab-3.4/index installation-guide/setup-kolab introduction/index kolab-enterprise-13 kolab-enterprise-14 reference-implementation-architecture/index diff --git a/source/upgrade-guide/kolab-3.1.rst b/source/upgrade-guide/kolab-3.1.rst index 8034d35a..0f7dda8a 100644 --- a/source/upgrade-guide/kolab-3.1.rst +++ b/source/upgrade-guide/kolab-3.1.rst @@ -1,223 +1,223 @@ ======================== Upgrading from Kolab 3.0 ======================== This chapter contains the upgrade notes for moving forward from Kolab 3.0 to Kolab 3.1. ChangeLog ========= Kolab 3.1 compared to Kolab 3.0 ships the following additional components: #. **iRony** A DAV access provider for groupware, including WebDAV with help of the **chwala** API, and CardDAV and CalDAV. #. **chwala** A properly designed and integrated file storage management layer, primarily for integration into other web applications through it's self-reliant UI component builder functions (JavaScript) obtaining information from its own API. -#. ``kolab_files`` for **roundcubemail-plugins-kolab** +#. ``kolab_files`` for |roundcubemail-plugins-kolab| One implementation of the integration of **chwala** into the Roundcube web client. Further software updates address the following issues: #. The Kolab Web Administration Panel has been enhanced to address duplicate surname issues, which in Kolab 3.0 would generate duplicate ``uid`` attributes. #. The way the ``uid`` is composed can now be configured with the introduction of a ``policy_uid`` setting in the ``[kolab_wap]`` section of :manpage:`kolab.conf(5)`. #. The **postfix** MTA is now configured to strip the ``Received from:`` headers that could otherwise disclose a user's geographical location. #. The **postfix** MTA is now configured to reject inbound email traffic that already has headers set to indicate a spam message. #. The **postfix** MTA is now configured to strip additional ``Received from: localhost [127.0.0.1] headers`` from emails that pass through Amavis. #. A new annotation ``/vendor/kolab/displayname`` was introduced to provide a compatibility layer with CardDAV and CalDAV access layers, neither of which understand IMAP folder hierarchy. #. A new annotation ``/vendor/kolab/uniqueid`` was introducted to provide a compatibility layer with CardDAV and CalDAV access layers, neither of which would have otherwise allowed an IMAP folder to be renamed or relocated in the IMAP folder hierarchy. .. NOTE:: This annotation is only used if ``/vendor/cmu/cyrus-imapd/uniqueid`` is not available. This Cyrus IMAP annotation became available in Cyrus IMAP 2.5. #. The ``kolab_auth`` plugin for Roundcube was enhanced to allow the use of a placeholder ``%dc`` to be substituted by the root dn for a supplied domain name. This enhances the Hosted Kolab Groupware deployment capabilities significantly. #. The **kolab-webadmin** software was enhanced to allow input of *KB*, *MB* and *GB* input for ``mailQuota``. #. The **kolab-webadmin** software was enhanced to allow *Shared Folders* to be created through the web administration panel. #. The **kolab-webadmin** software was enhanced to allow the configuration of *Dynamic Mail-enabled Distribution Groups*. Updates to Cyrus IMAP ===================== Updates to the Cyrus IMAP configuration can be applied automatically, by executing: .. parsed-literal:: # :command:`setup-kolab imap` .. WARNING:: Executing the aforementioned command assumes you had not made any changes to :manpage:`cyrus.conf(5)` nor :manpage:`imapd.conf(5)`. If you had, either read the sections for :ref:`admin_upgrade-3.0_cyrus.conf` and :ref:`admin_upgrade-3.0_imapd.conf` or re-apply the changes you need after executing the aforementioned setup command. .. _admin_upgrade-3.0_cyrus.conf: :manpage:`cyrus.conf(5)` (at :file:`/etc/cyrus.conf`) ----------------------------------------------------- Underscores in START, SERVICES and EVENTS Item Names ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The version of Cyrus IMAP shipped with Kolab 3.1 is incompatible with the use of underscore ('_') characters in the names for the START, SERVICES and EVENTS items. The EVENTS section in **cyrus.conf(5)** may have looked as follows: .. parsed-literal:: EVENTS { # this is required checkpoint cmd="ctl_cyrusdb -c" period=30 # this is only necessary if using duplicate delivery suppression, # Sieve or NNTP duplicate_prune cmd="cyr_expire -E 3" at=0400 # Expire data older then 69 days. Two full months of 31 days # each includes two full backup cycles, plus 1 week margin # because we run our full backups on the first sat/sun night # of each month. delete_prune cmd="cyr_expire -E 4 -D 69" at=0430 expunge_prune cmd="cyr_expire -E 4 -X 69" at=0445 # this is only necessary if caching TLS sessions tlsprune cmd="tls_prune" at=0400 # Create search indexes regularly squatter cmd="squatter -s -i" at=0530 } This will need to become: .. parsed-literal:: EVENTS { # this is required checkpoint cmd="ctl_cyrusdb -c" period=30 # this is only necessary if using duplicate delivery suppression, # Sieve or NNTP **duplicateprune** cmd="cyr_expire -E 3" at=0400 # Expire data older then 69 days. Two full months of 31 days # each includes two full backup cycles, plus 1 week margin # because we run our full backups on the first sat/sun night # of each month. **deleteprune** cmd="cyr_expire -E 4 -D 69" at=0430 **expungeprune** cmd="cyr_expire -E 4 -X 69" at=0445 # this is only necessary if caching TLS sessions tlsprune cmd="tls_prune" at=0400 # Create search indexes regularly squatter cmd="squatter -s -i" at=0530 } The Use of Squatter ^^^^^^^^^^^^^^^^^^^ Squatter is used to periodically create full-text indexes for messages in mailboxes. At the time of this writing, however, headers that are relevant for Kolab Groupware data searches are not included in such indexes. To circumvent this problem, remove running squatter from the EVENTS section in :file:`/etc/cyrus.conf`. To prevent existing squatter indexes from getting in the way, remove all files named **cyrus.squat** from your IMAP spools: .. parsed-literal:: # for partition in \`grep ^partition /etc/imapd.conf | awk '{print $2}'\`; do find $partition -type f -name cyrus.squat -delete done .. _admin_upgrade-3.0_imapd.conf: :manpage:`imapd.conf(5)` (at :file:`/etc/imapd.conf`) ----------------------------------------------------- A few additional settings are needed for Cyrus IMAP to feature message traffic directly into shared folders. If not already set, add the following setting to :file:`/etc/imapd.conf`: .. parsed-literal:: postuser: shared New Features in Cyrus IMAP -------------------------- * Event notifications. See the architecture and design document on Bonnie. * Multi-master replication Removing old and Adding new Plugins for Roundcube ================================================= The following plugins are no longer included: * ``kolab_core`` .. todo:: Is this list complete? The following plugins are new: * ``kolab_files`` .. todo:: Is this list complete? diff --git a/source/upgrade-guide/kolab-3.4.rst b/source/upgrade-guide/kolab-3.4.rst index fd22bace..c0fe2b39 100644 --- a/source/upgrade-guide/kolab-3.4.rst +++ b/source/upgrade-guide/kolab-3.4.rst @@ -1,440 +1,440 @@ ==================================== Upgrade Notes from Kolab 3.3 to 3.4 ==================================== ChangeLog ========= #. **New skin for Roundcube: Chameleon** **Chameleon** is the new default skin for Kolab Groupware and replaces the default **larry** skin. #. **Freebusy now supports resource collections** If you have a resource collection of multiple resources freebusy can now provide an aggregated view on the data from all its members #. **CSRF is now enabled by default for Debian** In the previous release the CSRF patch was only enabled within the RPM packages. With Kolab 3.4 this security patch has been applied to the Debian packages as well. So make sure your webserver configuration needs to be adjusted in case you modified it. #. **Kolab Webadmin provides a 'Default' Type** You no longer have to switch from 'Contact' to 'Kolab User' when creating a new user. #. **Lots Of Bugfixes** Updating the system =================== These update procecures are just an example. They don't differ too much from a basic installation. CentOS 6 -------- Update the repo to the new location .. parsed-literal:: # :command:`cd /etc/yum.repos.d/` # :command:`rm Kolab*.repo` # :command:`wget http://obs.kolabsys.com/repositories/Kolab:/3.4/CentOS_6/Kolab:3.4.repo` # :command:`wget http://obs.kolabsys.com/repositories/Kolab:/3.4:/Updates/CentOS_6/Kolab:3.4:Updates.repo` run the upgrade process .. parsed-literal:: # :command:`yum update` Debian 7 -------- Update the repo to the new location .. parsed-literal:: # :command:`echo "deb http://obs.kolabsys.com/repositories/Kolab:/3.4/Debian_7.0/ ./ deb http://obs.kolabsys.com/repositories/Kolab:/3.4:/Updates/Debian_7.0/ ./" > /etc/apt/sources.list.d/kolab.list` If you've don't have set a correct apt-pinning or release keys, please check the Installation Guide. Update and Upgrade the system .. parsed-literal:: # :command:`apt-get update` # :command:`apt-get dist-upgrade` .. WARNING:: You'll get ask if you want to replace your configuration files! DON'T overwrite them! You'll lose your configuration and credentials and end up with a broken frontend. Update your configuration files =============================== If you want to check want configuration files have changed, the best way is to compare the previous and current version in the GIT repository. /etc/imapd.conf --------------- With the most recent upstream cyrus-imapd version a few config parameters have changed. http://cgit.kolab.org/pykolab/diff/share/templates/imapd.conf.tpl?id=pykolab-0.7.6&id2=pykolab-0.7.1 The following parameters have been renamed: .. parsed-literal:: tls_cert_file --> tls_server_cert tls_key_file --> tls_server_key tls_ca_file --> tls_server_ca_file || tls_client_ca_file If you don't use server or client certificate validation feel free to remove the ``tls_ca_file`` parameter and/or consult the cyrus-imapd 2.5 documentation for clarification. Additionally we can enable 2 more sieve_extensions (date + index) and remove the flushseenstate option. .. parsed-literal:: sieve_extensions: fileinto reject envelope body vacation imapflags notify include regex subaddress relational copy date index # flushseenstate: 1 /etc/postfix/ldap/virtual_alias_maps_sharedfolders.cf ----------------------------------------------------- .. note:: This fix applies to other sharedfolders.cf configuration files as well (in a multidomain environment) Change the result_format to be enclosed by quotes otherwise you can't deliver mail messages to shared mailboxes that contains spaces in the mailbox name. .. parsed-literal:: result_format = "shared+%s" **Background** There's a mailbox that's called ``The A Team`` with a delivery address of ``team@example.org``. The resulting IMAP Folder would/should be ``shared/The A Team@example.org``. If you now send an email to ``team@example.org`` it will get remapped to ``"shared+shared/The A Team@example.org"@example.org``. Without the quotes you get 3 non-delivery-reports because whitespace would be considered a delimiter. /etc/kolab/kolab.conf --------------------- You can see the configuration differences here: http://cgit.kolab.org/pykolab/diff/conf/kolab.conf?id=pykolab-0.7.6&id2=pykolab-0.7.1 We only have one new option for wallace, which can be ignored if you don't use wallace for resource management. Restart wallace and kolab-server after upgrading all python modules should be done anyway. .. parsed-literal:: [wallace] resource_calendar_expire_days = 100 Don't forget to restart the wallace service **On Debian** .. parsed-literal:: # :command:`service wallace restart` # :command:`service kolab-server restart` **On CentOS** .. parsed-literal:: # :command:`service wallace restart` # :command:`service kolabd restart` /etc/kolab-freebusy/config.ini ------------------------------ You can see the configuration differences here: http://git.kolab.org/kolab-freebusy/diff/config/config.ini.sample?id=kolab-freebusy-1.0.6&id2=kolab-freebusy-1.0.5 Instead of editing the configuration by hand it's easier to just recreate the configuration using the setup-kolab tool. The :command:`setup-kolab freebusy` command has been fixed to generate a working default configuration right of the box. For Redhat/CentOS .. parsed-literal:: # :command:`cp /etc/kolab-freebusy/config.ini.rpmnew /etc/kolab-freebusy/config.ini` For Debian .. parsed-literal:: # :command:`cp /etc/kolab-freebusy/config.ini.dpkg-dist /etc/kolab-freebusy/config.ini` Recreate the configuation: .. parsed-literal:: # :command:`setup-kolab freebusy` /etc/roundcubemail/config.inc.php --------------------------------- You can see the configuration differences here: http://cgit.kolab.org/pykolab/diff/share/templates/roundcubemail/config.inc.php.tpl?id=pykolab-0.7.6&id2=pykolab-0.7.1 The 'threading_as_default' no longer exists and therfore don't need to be loaded. So you can safely remove it. .. parsed-literal:: $config['plugins'] = array( ... // 'threading_as_default', ... ); add or update the following $config entries .. parsed-literal:: $config['assets_dir'] = '/usr/share/roundcubemail/public_html/assets/'; $config['useragent'] = 'Kolab 3.4/Roundcube ' . RCUBE_VERSION; $config['skin'] = 'chameleon'; With Kolab Groupware having now it's own skin you can savely remove the skin_logo configuration. .. parsed-literal:: // $config['skin_logo'] = 'skins/kolab/images/kolab_logo.png'; .. ATTENTION:: Keep in mind that the CSRF patch has now been applied to the Debian packages as well. Make sure to update your webserver configuration and rewrite rules. Otherwise consider disabling **use_secure_urls**. /etc/roundcubemail/managesieve.inc.php -------------------------------------- You can see the configuration differences here: http://cgit.kolab.org/pykolab/diff/share/templates/roundcubemail/managesieve.inc.php.tpl?id=HEAD&id2=pykolab-0.7.1 Turn of debugging and add 2 additional entries: .. parsed-literal:: $config['managesieve_debug'] = false; $config['managesieve_filename_extension'] = ''; $config['managesieve_kolab_master'] = true; /etc/roundcubemail/libkolab.inc.php ----------------------------------- You can savely switch to a relative url for freebusy. .. parsed-literal:: $config['kolab_freebusy_server'] = '/freebusy'; /etc/iRony/dav.inc.php ---------------------- You can see the configuration differences here: http://cgit.kolab.org/iRony/diff/config/dav.inc.php.sample?id=iRony-0.3.0&id2=iRony-0.2.8 If you use the global addressbook <> CardDAV gateway you might want to take a look on the changes, otherwise you can just take the default configuration. For Redhat/CentOS .. parsed-literal:: # :command:`cp /etc/iRony/dav.inc.php.rpmnew /etc/iRony/dav.inc.php` For Debian .. parsed-literal:: # :command:`cp /etc/iRony/dav.inc.php.dpkg-dist /etc/iRony/dav.inc.php` Webserver ========= Check for new versions of the apache configuration files (in case you modified) them. **For Centos / RHEL** .. parsed-literal:: # :command:`find /etc/httpd/ -type f -name "*.rpm*"` **For Debian / Ubuntu** .. parsed-literal:: # :command:`find /etc/apache2/ -type f -name "*.dpkg*"` If you're running a different webserver configuration (like nginx) please check the howto or the configuration files for any changes and apply them to your setup accordingly. Database ======== mysql database: kolab --------------------- The admin database got a few minor updates: You can find the full sql file here: #. web: http://cgit.kolab.org/webadmin/tree/doc/kolab_wap.sql?id=kolab-webadmin-3.2.6 #. locally: :file:`/usr/share/doc/kolab-webadmin/kolab_wap.sql` The kolab-webadmin package doesn't provide auto updates or upgrade files for your database. Here's a summary of what has been changed. If you've made changes on the shared folder types you might want to change the types manually in the settings section of kolab-webadmin. Open the mysql cli or your favorite database administration frontend. .. parsed-literal:: # :command:`mysql -u root -p -D kolab` and apply the followin changes: The tables will be deleted and recreated. Don't forget: if you've made changes to shared folder types, please update them manually! .. ATTENTION:: Don't forget to make **backups** of your database before applying the changes! Fix the name field length. .. code-block:: sql ALTER TABLE `group_types` CHANGE `name` `name` VARCHAR( 255 ) NOT NULL ; ALTER TABLE `ou_types` CHANGE `name` `name` VARCHAR( 255 ) NOT NULL ; ALTER TABLE `resource_types` CHANGE `name` `name` VARCHAR( 255 ) NOT NULL ; ALTER TABLE `role_types` CHANGE `name` `name` VARCHAR( 255 ) NOT NULL ; ALTER TABLE `sharedfolder_types` CHANGE `name` `name` VARCHAR( 255 ) NOT NULL ; ALTER TABLE `user_types` CHANGE `name` `name` VARCHAR( 255 ) NOT NULL ; The old kolab was still in the latin1 format. We should unify everything into the utf-8 format. .. code-block:: sql ALTER TABLE `group_types` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE `ou_types` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE `resource_types` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE `role_types` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE `sharedfolder_types` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE `user_types` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; A new field got introduced to mark the default type (for example 'Kolab User'). .. code-block:: sql ALTER TABLE `group_types` ADD `is_default` tinyint(1) DEFAULT 0; ALTER TABLE `ou_types` ADD `is_default` tinyint(1) DEFAULT 0; ALTER TABLE `resource_types` ADD `is_default` tinyint(1) DEFAULT 0; ALTER TABLE `role_types` ADD `is_default` tinyint(1) DEFAULT 0; ALTER TABLE `sharedfolder_types` ADD `is_default` tinyint(1) DEFAULT 0; ALTER TABLE `user_types` ADD `is_default` tinyint(1) DEFAULT 0; UPDATE `user_types` SET `is_default` = 1 WHERE `key` = 'kolab'; After the database update has been applied. Logout from the kolab-webadmin interface and login back in to load the new changes. mysql database: roundcube ------------------------- The libkolab plugin had some changes. These changes are effecting the ``kolab_cache*`` tables. SQL upgrades are usually run during the package installation. Please verify that we the tables have been upgraded to the lastest version. .. parsed-literal:: # :command:`mysql -u root -p -D roundcube -e 'SELECT * FROM system WHERE name LIKE "libkolab%"'` +------------------+------------+ | name | value | +------------------+------------+ | libkolab-version | 2015020600 | +------------------+------------+ .. note:: - The initial Kolab 3.4 roundcubemail-plugins-kolab rpm packages had this + The initial Kolab 3.4 |roundcubemail-plugins-kolab| rpm packages had this upgrade database procedure missing. Under some circumstances it can be possible that his upgrade couldn't be applied as expected. If you experience probems with your mysql database check if the database was updated correctly and apply the pathces using the following command and verify the result: .. parsed-literal:: # :command:`/usr/share/roundcubemail/bin/updatedb.sh --dir /usr/share/roundcubemail/plugins/libkolab/SQL --package libkolab` # :command:`mysql -u root -p -D roundcube -e 'SELECT * FROM system WHERE name LIKE "libkolab%"'` +------------------+------------+ | name | value | +------------------+------------+ | libkolab-version | 2015020600 | +------------------+------------+ If you still have problems or the sql upgrade didn't went through as expected. It is save to recreate the libkolab tables (kolab_folders, kolab_cache_*) as they're only used to cache items from the imap storage. .. parsed-literal:: # :command:`mysql -u root -p -D roundcube < /usr/share/roundcubemail/plugins/libkolab/SQL/mysql.initial.sql`