From 05e08da5ffe5844ecd95c15cadefb0b248264a96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Maciusiak?= <158472457+pmacius@users.noreply.github.com> Date: Mon, 13 May 2024 17:45:22 +0200 Subject: [PATCH] OPSEXP-2621 Generate documentation website with jekyll (#1144) Co-authored-by: Giovanni Toraldo --- .github/workflows/docs.yml | 28 +++ .gitignore | 2 + .markdownlint.yaml | 1 + .ruby-version | 1 + Gemfile | 6 + README.md | 104 +--------- _config.yml | 48 +++++ _includes/head_custom.html | 3 + _sass/color_schemes/alfresco.scss | 13 ++ docs/compose.md | 6 + docs/docker-compose/README.md | 42 ++-- .../examples/customisation-guidelines.md | 16 +- docs/helm-charts.md | 7 + docs/helm-deployment.md | 7 + docs/helm-examples.md | 7 + docs/helm-guides.md | 7 + docs/helm.md | 6 + docs/helm/README.md | 33 ++- docs/helm/autoscaling.md | 6 + docs/helm/desktop-deployment.md | 30 +-- docs/helm/eks-deployment.md | 19 +- .../helm/examples/customisation-guidelines.md | 13 +- docs/helm/examples/external-hazelcast.md | 19 +- docs/helm/examples/search-services.md | 8 +- docs/helm/examples/with-ai.md | 6 + docs/helm/examples/with-aws-services.md | 8 +- .../examples/with-external-infrastructure.md | 7 + docs/helm/examples/with-keycloak.md | 6 + docs/helm/examples/with-ms-teams.md | 6 + docs/helm/examples/with-ooi.md | 6 + docs/helm/ingress-nginx.md | 6 + docs/helm/kind-deployment.md | 6 + docs/helm/registry-authentication.md | 6 + docs/helm/security.md | 6 + docs/helm/storage.md | 6 + docs/helm/upgrades.md | 15 +- docs/images/favicon.ico | Bin 0 -> 15406 bytes docs/images/hyland-alfresco-logos.png | Bin 0 -> 93016 bytes docs/index.md | 124 +++++++++++ helm/acs-sso-example/Chart.yaml | 4 +- helm/acs-sso-example/README.md | 192 ++---------------- helm/acs-sso-example/README.md.gotmpl | 8 +- helm/acs-sso-example/docs/sso-guide.md | 9 +- .../docs/step-by-step-guide.md | 16 +- helm/alfresco-content-services/README.md | 6 + .../README.md.gotmpl | 6 + 46 files changed, 522 insertions(+), 359 deletions(-) create mode 100644 .github/workflows/docs.yml create mode 100644 .ruby-version create mode 100644 Gemfile create mode 100644 _config.yml create mode 100644 _includes/head_custom.html create mode 100644 _sass/color_schemes/alfresco.scss create mode 100644 docs/compose.md create mode 100644 docs/helm-charts.md create mode 100644 docs/helm-deployment.md create mode 100644 docs/helm-examples.md create mode 100644 docs/helm-guides.md create mode 100644 docs/helm.md create mode 100644 docs/images/favicon.ico create mode 100644 docs/images/hyland-alfresco-logos.png create mode 100644 docs/index.md diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 000000000..b521a14a7 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,28 @@ +name: Publish docs + +permissions: + contents: write + pages: write + id-token: write + +on: + push: + branches: + - master + paths: + - "docs/**" + - ".github/workflows/docs.yml" + pull_request: + branches: + - master + paths: + - "docs/**" + - ".github/workflows/docs.yml" + +jobs: + publish: + uses: Alfresco/jekyll-build-tools/.github/workflows/jekyll-publish.yml@main + with: + working-directory: . + publish: ${{ github.event_name == 'push' && github.ref_name == 'master'}} + validate-html: true diff --git a/.gitignore b/.gitignore index 843166d35..b5faa9bc5 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,5 @@ hs_err_pid* # updatecli workflow alfresco-updatecli merged.yaml + +_site diff --git a/.markdownlint.yaml b/.markdownlint.yaml index 5d76b9151..87653ffea 100644 --- a/.markdownlint.yaml +++ b/.markdownlint.yaml @@ -1,3 +1,4 @@ --- default: true MD013: false +MD025: false diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 000000000..0aec50e6e --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +3.1.4 diff --git a/Gemfile b/Gemfile new file mode 100644 index 000000000..222231a2f --- /dev/null +++ b/Gemfile @@ -0,0 +1,6 @@ +source 'https://rubygems.org' + +gem "jekyll", "~> 4.3.3" +gem "just-the-docs", "0.8.1" +gem "jekyll-relative-links" +gem "html-proofer" diff --git a/README.md b/README.md index 1e67068f4..153e85054 100644 --- a/README.md +++ b/README.md @@ -15,107 +15,7 @@ This project contains the code for running Alfresco Content Services (ACS) with Compose](https://docs.docker.com/compose) or on [Kubernetes](https://kubernetes.io) using [Helm Charts](https://helm.sh). -> Automated tests for helm charts are running on KinD cluster v1.29 and EKS v1.28. - -## Important changes for helm charts - -The v7.0.0 release is the first release of the acs helm charts which completely -leverage the new individual subcharts we started releasing since March 2023 in a -dedicated repo: -[alfresco-helm-charts](https://github.com/Alfresco/alfresco-helm-charts). - -This change will make life easier to whoever want to customize or extend the -helm deployments and simplify the future maintenance, at the cost of breaking -the compatibility with the values structure which remained almost stable since -the v6 release. - -Please review the new [values](helm/alfresco-content-services/values.yaml) -carefully and adapt any custom configuration you may have. You can read the -[upgrades guide](docs/helm/upgrades.md) for more details on the changes. - -> Deploying to new namespace is always the preferred way of upgrading ACS as we -> do not test charts for upgrade scenarios (even with previous versions) -> neither do we provide roll-back facilities. - -## Prerequisites - -The ACS Enterprise version is installed by default, using Docker images from -Quay.io. If you're an Alfresco customer, you can request Quay.io credentials by -logging a ticket with [Hyland Community](https://community.hyland.com). - -The repository Docker image provides a limited trial of the Enterprise version -of Alfresco Content Services, which switches to read-only mode after 2 days. For -a longer trial, you can request the 30-day [Download -Trial](https://www.alfresco.com/platform/content-services-ecm/trial/download). - -The Community Edition can be installed without the need of a license or quay.io -account. - -## Versioning - -As of version 8.0.0 of the chart we have changed the release policy. -Previously, the chart was released together with the ACS product and we were -delivering additional values files for each major release of ACS (e.g. 7.3, -7.4, ...) and chart version were bumped with a similar increment as ACS. -With version 6.0.0, we started applying major versions bumps to reflect -breaking changes in the chart, despite only minor ACS release happened. - -With 8.0.0 onward, the release pace of the chart is completely independent from -the product versions. We will also stick to Semver principles when choosing -next version number, meaning that: - -* patch version will be used for bug fixes (last digit) -* minor version will be used for new features and modifications which do not - introduce breaking changes in the configuration interface. -* major version will be used for changes which involve breaking changes in the - configuration interface. - -The `alfresco-content-services` chart has always provided the ability to deploy -any currently supported version of ACS and its components and will continue to -do so. You are encoraged to always use the latest version of the chart to -deploy your ACS version, using the appropriate values file. For that reason we -stop providing the table mapping chart versions with the ACS version they -deploy (by default). Instead we'll just maintain the list of deprecated versions -versions mapped with the latest versions of the charts we tested deployment -with, so you can use that version to deploy older ACS version on Kubernetes. -Check the [ACS End of Life'd versions](#acs-end-of-lifed-versions) paragraph. - -You are encouraged to always use the latest version of the chart to deploy your -currently supported ACS version, using the appropriate values file. - -Finally, the master branch of this repository used to contain the latest -versions, including non-released versions! -We're also moving away from this pattern and the chart will now only ever -deploy released versions of our products. - -Should you want to try our latest dev versions, we now provide an additional -values file called `pre-release_values.yaml` which will be bumped on a regular -basis. - -This also means we will not produce `-M*` versions of the chart anymore. - -Check the [Release page](https://github.com/Alfresco/acs-deployment/releases) for the list of existing versions. - -### ACS End of Life'd versions - -While our latest version of the charts should be able to deployment any version -of ACS (theoretically), we only ever test deployment of _currently_ supported -versions. Also we do not provide values files for older unsupported version. If -you need to deploy old version we provide a reference table below to allow you -find the older values files and charts. You can either try using the values -file for a version with the latest charts or using the old charts. - -| unsupported ACS version | Last chart version providing it | -|-------------------------|---------------------------------| -| 7.0 | 8.0.1 | -| 6.2 | 5.3.0 | -| 6.1 | 5.1.1 | - -> These charts should not be used for any new deployment but just for reference. - -## Getting Started - -To get started please refer to the [Docker Compose](./docs/docker-compose) and [Helm Chart](./docs/helm) documentation. +User docs available at: [https://alfresco.github.io/acs-deployment/](https://alfresco.github.io/acs-deployment/) ## License @@ -146,7 +46,7 @@ First ensure that: Start the release by opening a PR against the appropriate branch that will: -* Update the [EOL table](#acs-end-of-lifed-versions) in case a version is deprecated +* Update the [EOL table](docs/index.md#acs-end-of-lifed-versions) in case a version is deprecated * In [alfresco-content-services](helm/alfresco-content-services/Chart.yaml), bump chart version to the version you want to release * Run `pre-commit run --all-files helm-docs` to update helm docs diff --git a/_config.yml b/_config.yml new file mode 100644 index 000000000..a8cb15f20 --- /dev/null +++ b/_config.yml @@ -0,0 +1,48 @@ +title: ACS Deployment Documentation +description: User documentation for deploying Alfresco Content Services +theme: just-the-docs +color_scheme: alfresco + +url: https://alfresco.github.io + +aux_links: + Docs: https://docs.alfresco.com/ + GitHub Repository: https://github.com/Alfresco/acs-deployment + +aux_links_new_tab: true + +gh_edit_link: true +gh_edit_link_text: "Improve this page on GitHub" +gh_edit_repository: https://github.com/Alfresco/acs-deployment +gh_edit_branch: master +gh_edit_source: . +gh_edit_view_mode: edit + +logo: "docs/images/hyland-alfresco-logos.png" +favicon_ico: "docs/images/favicon.ico" + +defaults: + # apply the default layout to all markdown pages + - scope: + path: "*" + values: + layout: default + render_with_liquid: false + +exclude: + - Brewfile + - '*/ci/*' + - Gemfile + - Gemfile.lock + - '*.yaml' + - '*/Chart.lock' + - '*.tgz' + - '*/NOTES.txt' + - README.md + - LICENSE + +plugins: + - jekyll-relative-links + +mermaid: + version: "10.9.0" diff --git a/_includes/head_custom.html b/_includes/head_custom.html new file mode 100644 index 000000000..d555d471f --- /dev/null +++ b/_includes/head_custom.html @@ -0,0 +1,3 @@ + diff --git a/_sass/color_schemes/alfresco.scss b/_sass/color_schemes/alfresco.scss new file mode 100644 index 000000000..7cc0d84fe --- /dev/null +++ b/_sass/color_schemes/alfresco.scss @@ -0,0 +1,13 @@ +$link-color: #3273dc; +$body-font-family: "Inter", sans-serif; + +$font-size-5: 0.88rem; + +.main-content { + color: #212328; + font-weight: 300; +} + +td { + word-wrap: anywhere; +} diff --git a/docs/compose.md b/docs/compose.md new file mode 100644 index 000000000..f71f5f70e --- /dev/null +++ b/docs/compose.md @@ -0,0 +1,6 @@ +--- +title: Docker Compose +has_children: true +--- + +This section contains available guides for docker-compose deployment diff --git a/docs/docker-compose/README.md b/docs/docker-compose/README.md index 8ff8311bd..de14b167f 100644 --- a/docs/docker-compose/README.md +++ b/docs/docker-compose/README.md @@ -1,3 +1,8 @@ +--- +title: Deployment +parent: Docker Compose +--- + # Alfresco Content Services Docker Compose Deployment This page describes how to quickly deploy Alfresco Content Services (ACS) using @@ -110,8 +115,7 @@ suited for test or demo environment but certainly not for production use. ## Prerequisites -As well as the prerequisites mentioned on the [main -README](/README.md#prerequisites) you will need a machine with at least 13GB of +As well as the prerequisites mentioned on the [main README](../index.md#prerequisites) you will need a machine with at least 13GB of free memory and the following software installed: * [Docker](https://www.docker.com/products/docker-desktop) @@ -131,7 +135,7 @@ Docker Daemon). ## Deploy 1. Clone this repository or download one of the docker compose files from - [here](../../docker-compose) + [here](https://github.com/Alfresco/acs-deployment/tree/master/docker-compose) 2. Navigate to the folder where the docker compose file you want to use is located 3. Log in to Quay.io with your credentials: `docker login quay.io` (only @@ -140,14 +144,14 @@ Docker Daemon). `docker compose -f major.minor.N-docker-compose.yml up` to use a previous version of ACS, or `docker compose -f pre-release-docker-compose.yml up` 5. Open the following URLs in your browser to check that everything starts up: - * Administration and REST APIs: [http://:8080/alfresco](http://localhost:8080/alfresco) - * Control Center: [http://:8080/admin](http://localhost:8080/admin) - * Alfresco Digital Workspace: [http://:8080/workspace](http://localhost:8080/workspace) - * Share: [http://:8080/share](http://localhost:8080/share) - * Search administration: [http://:8083/solr](http://localhost:8083/solr) + * Administration and REST APIs: `http://:8080/alfresco` + * Control Center: `http://:8080/admin` + * Alfresco Digital Workspace: `http://:8080/workspace` + * Share: `http://:8080/share` + * Search administration: `http://:8083/solr` 6. If you requested an extended trial license navigate to the Admin Console and apply your license: - * [http://:8080/alfresco/service/enterprise/admin/admin-license](http://localhost:8080/alfresco/service/enterprise/admin/admin-license) (`` will usually just be `localhost`) + * `http://:8080/alfresco/service/enterprise/admin/admin-license` (`` will usually just be `localhost`) * Default username and password is `admin` * See [Uploading a new license](https://docs.alfresco.com/content-services/latest/admin/license/#uploadlicense) for more details @@ -314,15 +318,15 @@ share: | SEARCH_LOG_LEVEL | The root logger level (`ERROR`, `WARN`, `INFO`, `DEBUG` or `TRACE`). | INFO | | ENABLE_SPELLCHECK | Whether spellchecking is enabled or not (`true` or `false`). | | | DISABLE_CASCADE_TRACKING | Whether cascade tracking is enabled or not (`true` or `false`). Disabling cascade tracking will improve performance, but result in some feature loss (e.g. path queries). | | -| ALFRESCO_SECURE_COMMS | Whether communication with the repository is secured (`https` or `none`). See this [page](https://github.com/Alfresco/InsightEngine/blob/master/search-services/README.md) for more details. | none | -| SOLR_SSL_KEY_STORE | Path to SSL key store. See this [page](https://github.com/Alfresco/InsightEngine/blob/master/search-services/README.md#use-alfresco-search-services-docker-image-with-docker-compose) for more details. | | -| SOLR_SSL_KEY_STORE_PASSWORD | Password for key store. See this [page](https://github.com/Alfresco/InsightEngine/blob/master/search-services/README.md#use-alfresco-search-services-docker-image-with-docker-compose) for more details. | | -| SOLR_SSL_KEY_STORE_TYPE | Key store type. See this [page](https://github.com/Alfresco/InsightEngine/blob/master/search-services/README.md#use-alfresco-search-services-docker-image-with-docker-compose) for more details. | JCEKS | -| SOLR_SSL_TRUST_STORE | Path to SSL trust store. See this [page](https://github.com/Alfresco/InsightEngine/blob/master/search-services/README.md#use-alfresco-search-services-docker-image-with-docker-compose) for more details. | | -| SOLR_SSL_TRUST_STORE_PASSWORD | Password for trust store. See this [page](https://github.com/Alfresco/InsightEngine/blob/master/search-services/README.md#use-alfresco-search-services-docker-image-with-docker-compose) for more details. | | -| SOLR_SSL_TRUST_STORE_TYPE | Trust store type. See this [page](https://github.com/Alfresco/InsightEngine/blob/master/search-services/README.md#use-alfresco-search-services-docker-image-with-docker-compose) for more details. | JCEKS | -| SOLR_SSL_NEED_CLIENT_AUTH | This variable is used to configure SSL (`true` or `false`). See this [page](https://github.com/Alfresco/InsightEngine/blob/master/search-services/README.md#use-alfresco-search-services-docker-image-with-docker-compose) for more details. | | -| SOLR_SSL_WANT_CLIENT_AUTH | This variable is used to configure SSL (`true` or `false`). See this [page](https://github.com/Alfresco/InsightEngine/blob/master/search-services/README.md#use-alfresco-search-services-docker-image-with-docker-compose) for more details. | | +| ALFRESCO_SECURE_COMMS | Whether communication with the repository is secured (`https` or `none`). See this [page](https://github.com/Alfresco/SearchServices/blob/master/search-services/README.md) for more details. | none | +| SOLR_SSL_KEY_STORE | Path to SSL key store. See this [page](https://github.com/Alfresco/SearchServices/blob/master/search-services/README.md) for more details. | | +| SOLR_SSL_KEY_STORE_PASSWORD | Password for key store. See this [page](https://github.com/Alfresco/SearchServices/blob/master/search-services/README.md) for more details. | | +| SOLR_SSL_KEY_STORE_TYPE | Key store type. See this [page](https://github.com/Alfresco/SearchServices/blob/master/search-services/README.md) for more details. | JCEKS | +| SOLR_SSL_TRUST_STORE | Path to SSL trust store. See this [page](https://github.com/Alfresco/SearchServices/blob/master/search-services/README.md) for more details. | | +| SOLR_SSL_TRUST_STORE_PASSWORD | Password for trust store. See this [page](https://github.com/Alfresco/SearchServices/blob/master/search-services/README.md) for more details. | | +| SOLR_SSL_TRUST_STORE_TYPE | Trust store type. See this [page](https://github.com/Alfresco/SearchServices/blob/master/search-services/README.md) for more details. | JCEKS | +| SOLR_SSL_NEED_CLIENT_AUTH | This variable is used to configure SSL (`true` or `false`). See this [page](https://github.com/Alfresco/SearchServices/blob/master/search-services/README.md) for more details. | | +| SOLR_SSL_WANT_CLIENT_AUTH | This variable is used to configure SSL (`true` or `false`). See this [page](https://github.com/Alfresco/SearchServices/blob/master/search-services/README.md) for more details. | | ### Alfresco Transform Router (transform-router) @@ -464,6 +468,6 @@ The list below shows the location of the publicly available `Dockerfile` for the * [share](https://github.com/Alfresco/share/blob/master/packaging/docker/Dockerfile) * [content-app](https://github.com/Alfresco/alfresco-content-app/blob/master/Dockerfile) * [solr6](https://github.com/Alfresco/SearchServices/blob/master/search-services/packaging/src/docker/Dockerfile) -* [transform-core-aio](https://github.com/Alfresco/alfresco-transform-core/blob/master/alfresco-transform-core-aio/alfresco-transform-core-aio-boot/Dockerfile) +* [transform-core-aio](https://github.com/Alfresco/alfresco-transform-core/blob/master/engines/aio/Dockerfile) * [activemq](https://github.com/Alfresco/alfresco-docker-activemq/blob/master/Dockerfile) * [proxy](https://github.com/Alfresco/acs-ingress/blob/master/Dockerfile) diff --git a/docs/docker-compose/examples/customisation-guidelines.md b/docs/docker-compose/examples/customisation-guidelines.md index 3fb966d62..a81d08a20 100644 --- a/docs/docker-compose/examples/customisation-guidelines.md +++ b/docs/docker-compose/examples/customisation-guidelines.md @@ -1,3 +1,8 @@ +--- +title: Customisation Guidelines +parent: Docker Compose +--- + # Customisation Guidelines Although it's possible to change and mount files/folders into existing Docker images the recommended approach is to create new custom Docker images. @@ -29,9 +34,9 @@ This process requires some familiarty with [Docker](https://www.docker.com/) and You will now need to install the AMP files into the Alfresco Content Repository image. -1. The docker-compose folder contains a file for each main code line of ACS, examine the relevant docker compose file for the version of ACS you want to apply the AMPs to. For example, to apply to the latest version of 7.3 take a look at the [7.3.N-docker-compose file](../../../docker-compose/7.3.N-docker-compose.yml) +1. The docker-compose folder contains a file for each main code line of ACS, examine the relevant docker compose file for the version of ACS you want to apply the AMPs to. For example, to apply to the latest version of 7.3 take a look at the [7.3.N-docker-compose file](https://github.com/Alfresco/acs-deployment/blob/master/docker-compose/7.3.N-docker-compose.yml) -2. Take note of the image and tag being used for the **alfresco** service in the docker compose file you chose in the previous step. For example, if you are using 7.3.N-docker-compose.yml, you will find this on [line 15](https://github.com/Alfresco/acs-deployment/blob/229fe58d077414c5d91bab9f5cec91adc902453c/docker-compose/7.3.N-docker-compose.yml#L15) as follows: +2. Take note of the image and tag being used for the **alfresco** service in the docker compose file you chose in the previous step. For example, if you are using 7.3.N-docker-compose.yml, you will find this on [line 21](https://github.com/Alfresco/acs-deployment/blob/master/docker-compose/7.3.N-docker-compose.yml) as follows: ```bash alfresco/alfresco-content-repository:7.3.0.1 @@ -90,7 +95,7 @@ You will now need to install the AMP files into the Alfresco Content Repository We will now repeat the process for the Alfresco Share image. -1. Take note of the image and tag being used for the **share** service in the docker compose file you chose in the previous section. For example, if you are using 7.3.N-docker-compose.yml, you will find this on [line 89](https://github.com/Alfresco/acs-deployment/blob/229fe58d077414c5d91bab9f5cec91adc902453c/docker-compose/7.3.N-docker-compose.yml#L89) as follows: +1. Take note of the image and tag being used for the **share** service in the docker compose file you chose in the previous section. For example, if you are using 7.3.N-docker-compose.yml, you will find this on [line 102](https://github.com/Alfresco/acs-deployment/blob/master/docker-compose/7.3.N-docker-compose.yml) as follows: ```bash alfresco/alfresco-share:7.3.0 @@ -139,4 +144,7 @@ You can start your custom docker-compose.yml using the following command: docker-compose -f up ``` -Further information on starting up or troubleshooting can be found [here](../README.md) and a more advanced example of building a custom image with configuration can be found [here](https://github.com/Alfresco/acs-packaging/blob/master/docs/create-custom-image-using-existing-docker-image.md#applying-amps-that-require-additional-configuration-advanced). +Further information on starting up or troubleshooting can be found +[here](../README.md) and a more advanced example of building a custom image with +configuration can be found +[here](https://github.com/Alfresco/acs-packaging/blob/master/docs/create-custom-image-using-existing-docker-image.md). diff --git a/docs/helm-charts.md b/docs/helm-charts.md new file mode 100644 index 000000000..14585b2e5 --- /dev/null +++ b/docs/helm-charts.md @@ -0,0 +1,7 @@ +--- +title: Charts +parent: Helm +has_children: true +--- + +This section contains available documentation for charts. diff --git a/docs/helm-deployment.md b/docs/helm-deployment.md new file mode 100644 index 000000000..ce1ab366b --- /dev/null +++ b/docs/helm-deployment.md @@ -0,0 +1,7 @@ +--- +title: Deployment +parent: Helm +has_children: true +--- + +This section contains available documentation for charts deployment. diff --git a/docs/helm-examples.md b/docs/helm-examples.md new file mode 100644 index 000000000..a3ba2fb4f --- /dev/null +++ b/docs/helm-examples.md @@ -0,0 +1,7 @@ +--- +title: Examples +parent: Helm +has_children: true +--- + +This section contains available documentation for charts examples. diff --git a/docs/helm-guides.md b/docs/helm-guides.md new file mode 100644 index 000000000..d2020b854 --- /dev/null +++ b/docs/helm-guides.md @@ -0,0 +1,7 @@ +--- +title: Guides +parent: Helm +has_children: true +--- + +This section contains available documentation for charts guides. diff --git a/docs/helm.md b/docs/helm.md new file mode 100644 index 000000000..d2f581875 --- /dev/null +++ b/docs/helm.md @@ -0,0 +1,6 @@ +--- +title: Helm +has_children: true +--- + +This section contains available guides for helm deployment diff --git a/docs/helm/README.md b/docs/helm/README.md index 144996ab2..43f4ead6e 100644 --- a/docs/helm/README.md +++ b/docs/helm/README.md @@ -1,3 +1,10 @@ +--- +title: Overview +parent: Deployment +grand_parent: Helm +nav_order: 1 +--- + # Alfresco Content Services Helm Deployment Alfresco Content Services (ACS) is an Enterprise Content Management (ECM) system that is used for document and case management, project collaboration, web content publishing, and compliant records management. The flexible compute, storage, and database services that Kubernetes offers make it an ideal platform for Alfresco Content Services. This helm chart presents an enterprise-grade Alfresco Content Services configuration that you can adapt to virtually any scenario with the ability to scale up, down or out, depending on your use case. @@ -29,7 +36,7 @@ database via [Bitnami charts][bitnami-repo] and an ActiveMQ message broker with a simple [activemq subchart][activemq-readme], both with basic authentication and without any kind of redundancy. -[activemq-readme]: ../../helm/alfresco-content-services/charts/activemq/README.md +[activemq-readme]: https://github.com/Alfresco/alfresco-helm-charts/blob/main/charts/activemq/README.md [bitnami-repo]: https://github.com/bitnami/charts You typically want to disable the embedded postgres and activemq broker and @@ -63,8 +70,7 @@ the installation. ## Deploy -For the best results we recommend [deploying ACS to AWS -EKS](./eks-deployment.md). If you have a machine with at least 16GB of memory +For the best results we recommend [deploying ACS to AWS EKS](./eks-deployment.md). If you have a machine with at least 16GB of memory you can [deploy using Docker Desktop](./desktop-deployment.md) (or similar apps like Rancher and Podman Desktop) or via [KinD](kind-deployment.md) which just requires a working Docker install on any OS. @@ -72,19 +78,19 @@ requires a working Docker install on any OS. The recommended cluster resources for the Enterprise version with the components enabled by default are: at least 3 nodes with 12 cpu cores and 32 GB of memory in total. You can install with lower requirements by fine tuning the [resource requests](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-units-in-kubernetes) -available in the [values](../../helm/alfresco-content-services/values.yaml) for each component. +available in the [values](https://github.com/Alfresco/acs-deployment/blob/master/helm/alfresco-content-services/values.yaml) for each component. -There are also several [examples](./examples) showing how to deploy with various configurations: +There are also several [examples](../helm-examples.md) showing how to deploy with various configurations: * [Deploy with AWS Services (S3, RDS and MQ)](./examples/with-aws-services.md) * [Deploy with Intelligence Services](./examples/with-ai.md) * [Deploy with Microsoft 365 Connector (Office Online Integration)](./examples/with-ooi.md) * [Deploy with external Keycloak SSO authentication](./examples/with-keycloak.md) * [Deploy with external infrastructure components](./examples/with-external-infrastructure.md) (e.g. elasticsearch, activemq, postgres) -* [Enable access to Search Services](./examples/search-services.mdi#enable-alfresco-search-services-external-access) -* [Enable Email Services](./examples/email-enabled.md) -* [Use a custom metadata keystore](./examples/custom-metadata-keystore.md) -* [Install ACS license as part of the deployment](./examples/alf_license.md) +* [Enable access to Search Services](./examples/search-services.md#enable-alfresco-search-services-external-access) +* [Enable Email Services](https://alfresco.github.io/alfresco-helm-charts/charts/alfresco-repository/docs/email.html) +* [Use a custom metadata keystore](https://alfresco.github.io/alfresco-helm-charts/charts/alfresco-repository/docs/keystores.html) +* [Install ACS license as part of the deployment](https://alfresco.github.io/alfresco-helm-charts/charts/alfresco-repository/docs/enterprise-license.html) ## Upgrade @@ -97,13 +103,6 @@ helm charts versions. An autogenerated list of helm values used in the chart and their default values can be found here: [Alfresco Content Services Helm Chart](./../../helm/alfresco-content-services/README.md) -Since the Alfresco Content Services chart also has local chart dependencies you can find the list of values that can be configured for these charts in their respective base folder: - -* [Alfresco ActiveMQ Helm Chart](./../../helm/alfresco-content-services/charts/activemq/README.md) -* [Alfresco Search Helm Chart](./../../helm/alfresco-content-services/charts/alfresco-search/README.md) -* [Alfresco Insight Zeppelin Helm Chart](./../../helm/alfresco-content-services/charts/alfresco-search/charts/alfresco-insight-zeppelin/README.md) -* [Alfresco Sync Service Helm Chart](./../../helm/alfresco-content-services/charts/alfresco-sync-service/README.md) - ## Customise To customise the Helm deployment, for example applying AMPs, we recommend following the best practice of creating your own custom Docker image(s). The [Customisation Guide](./examples/customisation-guidelines.md) walks you through this process. @@ -112,7 +111,7 @@ To customise the Helm deployment, for example applying AMPs, we recommend follow ### Lens -The easiest way to troubleshoot issues on a Kubernetes deployment is to use the [Lens](https://k8slens.dev) desktop application, which is available for Mac, Windows and Linux. Follow the [getting started guide](https://docs.k8slens.dev/v4.0.3/getting-started) to configure your environment. +The easiest way to troubleshoot issues on a Kubernetes deployment is to use the [Lens](https://k8slens.dev) desktop application, which is available for Mac, Windows and Linux. Follow the [getting started guide](https://docs.k8slens.dev/getting-started/) to configure your environment. ![Lens Application](./images/k8s-lens.png) diff --git a/docs/helm/autoscaling.md b/docs/helm/autoscaling.md index 1729ba686..38b9ae8b3 100644 --- a/docs/helm/autoscaling.md +++ b/docs/helm/autoscaling.md @@ -1,3 +1,9 @@ +--- +title: Autoscaling +parent: Guides +grand_parent: Helm +--- + # Alfresco components auto-scaling `alfresco-content-services` can leverage Kubernetes HorinzontalPodAutoscaling diff --git a/docs/helm/desktop-deployment.md b/docs/helm/desktop-deployment.md index db6120514..5cb01b2be 100644 --- a/docs/helm/desktop-deployment.md +++ b/docs/helm/desktop-deployment.md @@ -1,3 +1,9 @@ +--- +title: Desktop +parent: Deployment +grand_parent: Helm +--- + # Alfresco Content Services Helm Deployment on local machines This page describes how to deploy Alfresco Content Services (ACS) Enterprise or @@ -7,7 +13,7 @@ Desktop](https://docs.docker.com/desktop/). ## Prerequisites -- You've read the projects [main README](/README.md#prerequisites) +- You've read the projects [main README](../index.md#prerequisites) prerequisites section - You've read the [main Helm README](./README.md) page - You are proficient in Kubernetes @@ -28,7 +34,7 @@ Then proceed to the [deployment](#deployment) section to install ingress-nginx. ### Docker Desktop specific configuration On top of the Docker desktop -[Prerequisites](./desktop-deployment.md#Prerequisites), it is essential to +[Prerequisites](./desktop-deployment.md#prerequisites), it is essential to install the latest version of [Kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl) & [Helm](https://helm.sh/docs/intro/install). @@ -77,7 +83,7 @@ helm repo update #### Community localhost deployment To install the latest version of Community we need to download the -[community_values.yaml file](../../helm/alfresco-content-services). Once +[community_values.yaml file](https://github.com/Alfresco/acs-deployment/blob/master/helm/alfresco-content-services/community_values.yaml). Once downloaded, execute the following to initiate the deployment. ```bash @@ -93,10 +99,10 @@ helm install acs alfresco/alfresco-content-services \ #### Enterprise localhost deployment -ACS enterprise version needs to pull container images from private image repositories. -To configure credentials for accessing the Alfresco Enterprise registry, please -review the information provided in the [registry -authentication](registry-authentication.md) +ACS enterprise version needs to pull container images from private image +repositories. To configure credentials for accessing the Alfresco Enterprise +registry, please review the information provided in the +[registry-authentication](./registry-authentication.md) The Enterprise Helm deployment is intended for a Cloud based Kubernetes cluster and therefore requires a large amount of resources out-of-the-box. To reduce the @@ -129,7 +135,7 @@ The `helm` command above installs the most current released version of ACS Enter To deploy a previous version of ACS Enterprise follow the steps below. -1. Download the version specific values file you require from [this folder](../../helm/alfresco-content-services) +1. Download the version specific values file you require from [this folder](https://github.com/Alfresco/acs-deployment/tree/master/helm/alfresco-content-services) 2. Deploying the specific version of ACS can be achieved by executing the following: ```bash @@ -151,7 +157,7 @@ To deploy ACS platform with the latest development version follow the steps belo 1. Download the [pre-release_values.yaml - file](https://raw.githubusercontent.com/Alfresco/acs-deployment/master/docs/helm/values/pre-release_values.yaml) + file](https://raw.githubusercontent.com/Alfresco/acs-deployment/master/helm/alfresco-content-services/pre-release_values.yaml) 2. Deploy ACS by executing the following command: ```bash @@ -199,7 +205,7 @@ If you deployed Enterprise you'll also have access to: In the event of a deployment failure, it is important to recognize that resource constraints are a common underlying cause. For further insights and guidance. Additionally, you can find more comprehensive troubleshooting advice -in the [Helm Troubleshooting section](./README.md#Troubleshooting) +in the [Helm Troubleshooting section](./README.md#troubleshooting) ### Lack Of Resources @@ -235,6 +241,6 @@ an increased timeout, eg. --timeout 15m0s. Alteratively run without following: --atomic --timeout 10m0s ``` -and then monitor the logs for any failing pods. Please also consult the [Helm -Troubleshooting section](./README.md#Troubleshooting) for deploying Kubernetes +and then monitor the logs for any failing pods. Please also consult the +[Helm Troubleshooting section](./README.md#troubleshooting) for deploying Kubernetes Dashboard and more generic troubleshooting tips and tricks. diff --git a/docs/helm/eks-deployment.md b/docs/helm/eks-deployment.md index a8113fbd7..86e07cd44 100644 --- a/docs/helm/eks-deployment.md +++ b/docs/helm/eks-deployment.md @@ -1,3 +1,9 @@ +--- +title: EKS +parent: Deployment +grand_parent: Helm +--- + # Alfresco Content Services Helm Deployment with AWS EKS This page describes how to deploy Alfresco Content Services (ACS) Enterprise or @@ -213,7 +219,7 @@ Deployment_solr --> PersistentVolumeClaim_solr-default-pvc --> EBS-solr ## Prerequisites -* You've read the projects [main README](/README.md#prerequisites) +* You've read the projects [main README](../index.md#prerequisites) prerequisites section * You've read the [main Helm README](./README.md) page * You are proficient in AWS and Kubernetes @@ -249,7 +255,7 @@ Set the cluster name in an environment variable that can be reused later: EKS_CLUSTER_NAME=my-alfresco-eks ``` -Create the cluster using the latest supported version - check the main [README](../../README.md). +Create the cluster using the latest supported version - check the main [README](https://github.com/Alfresco/acs-deployment/blob/master/README.md). Most common choices for instance types are `m5.xlarge` and `t3.xlarge`: ```sh @@ -333,7 +339,7 @@ you can alternatively: ``` 4. Go to the [Security Groups section of the VPC - Console](https://console.aws.amazon.com/vpc/home#SecurityGroups) and search + Console](https://console.aws.amazon.com/vpc/home) and search for the VPC using the ID retrieved in step 2, as shown in the screenshot below: @@ -612,8 +618,7 @@ helm upgrade --install acs alfresco/alfresco-content-services \ #### Previous Enterprise Versions -Download the version-specific values file you require from the -[chart folder](../../helm/alfresco-content-services). +1. Download the version-specific values file you require from [this folder](https://github.com/Alfresco/acs-deployment/blob/master/helm/alfresco-content-services). Deploy the specific version of ACS by running the following command (replacing `YOUR-DOMAIN-NAME` with the hosted zone you created earlier and `MAJOR` & @@ -675,7 +680,7 @@ If you deployed Enterprise you'll also have access to: If you requested an extended trial license navigate to the Admin Console and apply your license: -* [https://acs.YOUR-DOMAIN-NAME/alfresco/service/enterprise/admin/admin-license](http://localhost:8080/alfresco/service/enterprise/admin/admin-license) +* `https://acs.YOUR-DOMAIN-NAME/alfresco/service/enterprise/admin/admin-license` * Default username and password is ```admin``` * See [Uploading a new license](https://docs.alfresco.com/content-services/latest/admin/license/#uploadlicense) @@ -685,7 +690,7 @@ apply your license: By default, this tutorial installs an out-of-the-box setup, however there are many configurations options described [here](./README.md#configure). There are -also several [examples](./examples) covering various use cases. +also several [examples](../helm-examples.md) covering various use cases. This deployment is also not fully secured by default, to learn about and apply further restrictions including pod security, network policies etc. please refer diff --git a/docs/helm/examples/customisation-guidelines.md b/docs/helm/examples/customisation-guidelines.md index 4186bfb8e..aae4ded00 100644 --- a/docs/helm/examples/customisation-guidelines.md +++ b/docs/helm/examples/customisation-guidelines.md @@ -1,3 +1,9 @@ +--- +title: Customisation Guidelines +parent: Examples +grand_parent: Helm +--- + # Customisation Guidelines Any customisations (including major configuration changes) should be done @@ -14,17 +20,16 @@ values files. ## Creating Custom Docker Images -The [docker compose Customisation -Guide](../../docker-compose/examples/customisation-guidelines.md) provides a +The [docker compose Customisation Guide](../../docker-compose/examples/customisation-guidelines.md) provides a detailed example of how to apply an AMP in a custom image and a more advanced example of building a custom image with configuration can be found -[here](https://github.com/Alfresco/acs-packaging/blob/master/docs/create-custom-image-using-existing-docker-image.md#applying-amps-that-require-additional-configuration-advanced). +[here](https://github.com/Alfresco/acs-packaging/blob/master/docs/create-custom-image-using-existing-docker-image.md). ## Using Custom Docker Images Once you have created your custom image you can either change the default values in the appropriate values file in [this -folder](../../../helm/alfresco-content-services) or you can override the values +folder](https://github.com/Alfresco/acs-deployment/blob/master/helm/alfresco-content-services) or you can override the values via the `--set` command line option during install as shown below: ```bash diff --git a/docs/helm/examples/external-hazelcast.md b/docs/helm/examples/external-hazelcast.md index 260d1bb11..37588d7d7 100644 --- a/docs/helm/examples/external-hazelcast.md +++ b/docs/helm/examples/external-hazelcast.md @@ -1,3 +1,9 @@ +--- +title: Hazelcast +parent: Examples +grand_parent: Helm +--- + # Alfresco Content Services Helm Deployment with external Hazelcast cluster - [Alfresco Content Services Helm Deployment with external Hazelcast @@ -26,8 +32,7 @@ ## Step by step guide -1. Deploy alfresco-content-services. See [desktop - deployment](../desktop-deployment.md) section. Remember to stick to one +1. Deploy alfresco-content-services. See [desktop deployment](../desktop-deployment.md) section. Remember to stick to one namespace in next steps. 2. Prepare a valid Hazelcast xml configuration, which also must include @@ -92,13 +97,13 @@ Now copy generated xml configuration into manifest file. (Remember to correctly indent copied text) -7. Deploy created [manifest](external-hazelcast_files/configmap-hazelcast.yaml) +7. Deploy created [manifest](https://github.com/Alfresco/acs-deployment/blob/master/docs/helm/examples/external-hazelcast_files/configmap-hazelcast.yaml) ```bash kubectl apply -f configmap-hazelcast.yaml ``` -8. Deploy hazelcast with [values](external-hazelcast_files/hazelcast.yaml) +8. Deploy hazelcast with [values](https://github.com/Alfresco/acs-deployment/blob/master/docs/helm/examples/external-hazelcast_files/hazelcast.yaml) presented below ```yaml @@ -119,7 +124,7 @@ ``` 9. Now change the config of alfresco-repository by adding another [values - file](external-hazelcast_files/acs-hazelcast.yaml). In below file specify + file](https://github.com/Alfresco/acs-deployment/blob/master/docs/helm/examples/external-hazelcast_files/acs-hazelcast.yaml). In below file specify properties that will make repository use external hazelcast cluster deployed in previous step. Remember to accordingly change the values if needed. @@ -170,8 +175,8 @@ You should get empty response. -4. Login into [Alfresco - UI](http://localhost/alfresco/s/enterprise/admin/admin-clustering) and after +4. Login into Alfresco UI on + `http://localhost/alfresco/s/enterprise/admin/admin-clustering` and after that repeat commands from previous step. You should see response from all nodes similar to this: diff --git a/docs/helm/examples/search-services.md b/docs/helm/examples/search-services.md index bb5195820..66b9e76bc 100644 --- a/docs/helm/examples/search-services.md +++ b/docs/helm/examples/search-services.md @@ -1,3 +1,9 @@ +--- +title: Search Services +parent: Examples +grand_parent: Helm +--- + # Dealing with Search service deployment Solr has some internal behavior that make it a not so great fit for orchestrated @@ -73,7 +79,7 @@ api, so it doesn't make much sense to use external access. ### Install ACS Helm Chart With Search External Access Follow the [EKS deployment](../eks-deployment.md) guide up until the -[ACS](../eks-deployment.md#acs) section, once the docker registry secret is +[ACS](../eks-deployment.md#development-version-of-charts) section, once the docker registry secret is installed come back here. Deploy the latest version of ACS Enterprise by running the command below diff --git a/docs/helm/examples/with-ai.md b/docs/helm/examples/with-ai.md index be0c0b926..4bb2669a4 100644 --- a/docs/helm/examples/with-ai.md +++ b/docs/helm/examples/with-ai.md @@ -1,3 +1,9 @@ +--- +title: Intelligence Services +parent: Examples +grand_parent: Helm +--- + # ACS Helm Deployment with Intelligence Services By default, [Alfresco Intelligence diff --git a/docs/helm/examples/with-aws-services.md b/docs/helm/examples/with-aws-services.md index e72f171ae..e2b51451a 100644 --- a/docs/helm/examples/with-aws-services.md +++ b/docs/helm/examples/with-aws-services.md @@ -1,3 +1,9 @@ +--- +title: AWS Services +parent: Examples +grand_parent: Helm +--- + # Alfresco Content Services Helm Deployment with AWS Services - [Alfresco Content Services Helm Deployment with AWS Services](#alfresco-content-services-helm-deployment-with-aws-services) @@ -21,7 +27,7 @@ The diagram below shows the deployment produced by this example: ## Prerequisites Follow the [EKS deployment](../eks-deployment.md) guide up until the -[ACS](../eks-deployment.md#acs) section, once the docker registry secret is +[ACS](../eks-deployment.md#development-version-of-charts) section, once the docker registry secret is installed return to this page. :information_source: In the EKS installation documentation mentioned above, the diff --git a/docs/helm/examples/with-external-infrastructure.md b/docs/helm/examples/with-external-infrastructure.md index b2e35bd4c..c01b8871e 100644 --- a/docs/helm/examples/with-external-infrastructure.md +++ b/docs/helm/examples/with-external-infrastructure.md @@ -1,3 +1,10 @@ +--- +title: External infrastructure +parent: Examples +grand_parent: Helm +--- + + # Alfresco Content Services Helm Deployment with external infrastructure - [Alfresco Content Services Helm Deployment with external infrastructure](#alfresco-content-services-helm-deployment-with-external-infrastructure) diff --git a/docs/helm/examples/with-keycloak.md b/docs/helm/examples/with-keycloak.md index 52abb236e..b1bc582e9 100644 --- a/docs/helm/examples/with-keycloak.md +++ b/docs/helm/examples/with-keycloak.md @@ -1,3 +1,9 @@ +--- +title: Keycloak server +parent: Examples +grand_parent: Helm +--- + # ACS Helm Deployment with an external Keycloak server In this section we are going to describe how to install Alfresco with Helm on diff --git a/docs/helm/examples/with-ms-teams.md b/docs/helm/examples/with-ms-teams.md index 7649d7a2d..5c1875265 100644 --- a/docs/helm/examples/with-ms-teams.md +++ b/docs/helm/examples/with-ms-teams.md @@ -1,3 +1,9 @@ +--- +title: Microsoft Teams Connector +parent: Examples +grand_parent: Helm +--- + # ACS Helm Deployment with Microsoft Teams Connector The [Alfresco Microsoft Teams Connector](https://docs.alfresco.com/) enables diff --git a/docs/helm/examples/with-ooi.md b/docs/helm/examples/with-ooi.md index db309ce88..731a8e49c 100644 --- a/docs/helm/examples/with-ooi.md +++ b/docs/helm/examples/with-ooi.md @@ -1,3 +1,9 @@ +--- +title: Microsoft 365 Connector +parent: Examples +grand_parent: Helm +--- + # ACS Helm Deployment with Microsoft 365 Connector The [Alfresco Microsoft 365 diff --git a/docs/helm/ingress-nginx.md b/docs/helm/ingress-nginx.md index 9d84aa95c..4467eb328 100644 --- a/docs/helm/ingress-nginx.md +++ b/docs/helm/ingress-nginx.md @@ -1,3 +1,9 @@ +--- +title: Ingress guide +parent: Guides +grand_parent: Helm +--- + # Install ingress-nginx We currently support and test only diff --git a/docs/helm/kind-deployment.md b/docs/helm/kind-deployment.md index f51efed8b..62ba37975 100644 --- a/docs/helm/kind-deployment.md +++ b/docs/helm/kind-deployment.md @@ -1,3 +1,9 @@ +--- +title: Kind +parent: Deployment +grand_parent: Helm +--- + # Alfresco Content Services Helm Deployment on KinD cluster This page describe how to get ACS up and running on a [Kubernetes In diff --git a/docs/helm/registry-authentication.md b/docs/helm/registry-authentication.md index 25c0e7257..e28557136 100644 --- a/docs/helm/registry-authentication.md +++ b/docs/helm/registry-authentication.md @@ -1,3 +1,9 @@ +--- +title: Registry authentication +parent: Guides +grand_parent: Helm +--- + # Private registry authentication For pulling images served by a registry that requires authentication, you have diff --git a/docs/helm/security.md b/docs/helm/security.md index f4889e24a..e4853bab6 100644 --- a/docs/helm/security.md +++ b/docs/helm/security.md @@ -1,3 +1,9 @@ +--- +title: Security +parent: Guides +grand_parent: Helm +--- + # Security This pages focuses on providing information on making a secure ACS installation diff --git a/docs/helm/storage.md b/docs/helm/storage.md index 56ac2b475..4e5337259 100644 --- a/docs/helm/storage.md +++ b/docs/helm/storage.md @@ -1,3 +1,9 @@ +--- +title: Storage +parent: Guides +grand_parent: Helm +--- + # ACS Storage persistence in kubernetes ACS platform in order to serve users' requests, needs to persist several type diff --git a/docs/helm/upgrades.md b/docs/helm/upgrades.md index 82e60efdf..bfa409052 100644 --- a/docs/helm/upgrades.md +++ b/docs/helm/upgrades.md @@ -1,3 +1,9 @@ +--- +title: Upgrades +parent: Guides +grand_parent: Helm +--- + # Upgrading the helm charts Our helm charts are continuously improved and sometimes arise the need to @@ -13,8 +19,7 @@ version in which they have been released. ## 8.0.0 * Search Enterprise is now the default search engine when installing Enterprise - version. For production it's suggested to use an [external elaticsearch - index](examples/with-external-infrastructure.md#elasticsearch-index). + version. For production it's suggested to use an [external elaticsearch index](examples/with-external-infrastructure.md#elasticsearch-index). ## 8.0.0-M.1 @@ -123,12 +128,12 @@ that using this values has always required and still requires using a custom image embedding the Alfresco S3 connector. Please refer to the [alfresco-repository chart -documentation](https://github.com/Alfresco/alfresco-helm-charts/blob/main/charts/alfresco-repository/docs/properties.md) +documentation](https://github.com/Alfresco/alfresco-helm-charts/blob/main/charts/alfresco-repository/docs/repository-properties.md) ### Chart modularization: Alfresco repository Repository is now deployed as part of an independent subchart. Checkout -[alfresco-repository](https://github.com/Alfresco/alfresco-helm-charts/charts/alfresco-repository/README.md) +[alfresco-repository](https://github.com/Alfresco/alfresco-helm-charts/blob/main/charts/alfresco-repository/README.md) for details on how to use that new chart. This `alfresco-content-services` chart is now essentially a wrapper of subcharts @@ -398,7 +403,7 @@ according to the standard [kubernetes resources management](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-units-in-kubernetes). For example, in the [alfresco-content-services values -file](../../helm/alfresco-content-services/values.yaml) you can find: +file](https://github.com/Alfresco/acs-deployment/blob/master/helm/alfresco-content-services/values.yaml) you can find: ```yaml repository: diff --git a/docs/images/favicon.ico b/docs/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d246c0b86d83ed95ad86e3e493449cae5cf54bb1 GIT binary patch literal 15406 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 NzxVKW34C)2{13=g0k8l7 literal 0 HcmV?d00001 diff --git a/docs/images/hyland-alfresco-logos.png b/docs/images/hyland-alfresco-logos.png new file mode 100644 index 0000000000000000000000000000000000000000..0fd08dda537cfdb7bf1fd2519ffa0417f0081216 GIT binary patch literal 93016 zcmeFZcT|&0*FFpg2q-F`ARUn+UAhUq2+~oc69Uq^^xgzSq>FSRDAFNF??n;my+nF1 zA%q%0Li>gDoaY>m_^x% z!luH)`{Ni3OA(v;uj41!_x`*G2Ma6I3Jdqod-O2h=ZBoo+cX#J@=jV2Cvf$wb002Dq`FQyF zxG;BcIeXf>7<+KpJKz0JA^$B$*38+&$?Ca_m4iLQdAY{V99&(*7#Yti`s?3+WYWKi0|gf*|hV(s<}d=v2Bo9 zck5SNY8qz+G&%FTMFG$8%gnRi=7M$JbJ?ZHWB@$Vg%(j#aL>U-CIHt;PoMxmOezNd z5v^psiqbW<3@d28Y^@Ff-w0Ykurk93?$3qri#UHSdF79`$zjr2Z|UF>GQU*ir2!{MP`mMb6N?U?)TPuSN2tU}%nWf2R7IF8|FqV;U7u zg@sM$K&|+%MQX3Z!cMOzbH@4CmaHC+V9R4d{lx_}`(2-6&Ph&V9#~9EBKy6>zbR&x zOEREs;w9<77HNlDGJtjS>$`tDa#+|77!98mdi$?M`rnlJR~q%dDeVH$>{|5S> z=J5Zl#J|J+|5=HD#XJ7LScxWglHXH~w>bfbT15F$q?O)`h3@FSz|ze-7e@<^jG(I5Qea6;6ycfxV*En^;daL;lp-Y#I?dG(a;ay#RawrvekAlt~uuTp%BdPcckM z6_9uJH@(P^h(q;}H!y9x;!dKgnnof3=4w)4DY6egQ3Z(*?B?QJ`Au=ny;gQlf6GOi zIq?KIhYD@#pi_DynYH$#6)|(PVpEh|L{m*wH@<=q(MFMi8*)LdbqiX~= zW|J>bBy<1T98Bx77&AU6klQJRLOER0wo4K1uj)Suv-503wnOjo0tCp%JIcT0xDi82 z5KoAA3k^wQh&g1OT07YrB&c=(CT(zGfmLpIYw!fBQYA>cYJB(C&OaxpP+WoLQdPuSzpGuPYf7x! zhQH9es(#hl{iK+FlZnf52#=%{{>@@YN4scMo>X{xfo72C6ueh~@?8X5U(lJcFPG& z#?Dt@wX!1dJw_#_EjWozGqI`vMl_+|@A^vt(-2XT3#x;u&WStYPW-hZ7w7C-P1VAT zVE=lx>0!3APBXwTMPjk2mnhB?Kg4rOOK+`m{HfoVhn9D6qr$Odo zBZ$~DKEIU{GY*Bq%$%O_3y#3fkinvrzW3v%l$_}KsnjMKbTdq1Y7 zjwljrn@YEe{|bvw8!;YEXVW*-jlZ<)ulnx2YS!_{QBtcEiX#)Raee@J5lOiH^vg5p zM`}o_gkoQxKm%__R~8WC*SIj!qhHnP{$*S~v~vbvR+8dZ7yX>ynDg{!X)04sW8hPS z4!{le_$1HHT+gp+fi^+!MYgG#jti5`!*5HZ>t9foq*M&7EHAs}z`ztwE_dQ`&RTixX5ldYQPrI73k6H@;w{rT`@ll8|a zWNr)rru>54Rj-(l%)_a6#eDA{T(~*o1K#niDG}gB6((Sa;lU=GwtA!um`me#{U*<7 z-B7sS{bfi$qF~z&&;alDHo3c(#4z%sbgHzlar^S*1;mv+#DFmy#O9&WMI8#%C5(t% zD^=y-eSh6qq_I3=Ci(e9(Ls+jIT_KIy}ckqDF|T&JA$pQ)nH)KqgO3;Da1rtw2R8O z)Yz=uhNA3*%JmfN<*f``E*UYXs;Kqi_Uisx3XTw49h|T)TifG5(7o8&ub5GI`yKB+ z;5VbdjVsV@{DqFI7Ml7z)$J?Il*9ZRz6^e520q6#jRSXD$~*PWig)+Y^yx)eXoYza zMwDLUx!;~bAG(B4zKsO8Z0l3j`4z90fXqiE)hzJ$KK+J2oNH=&U>@Ct(Y$f*ZNN)@ zWt|)q7&&MtYWTyFr!M}7s7Z7)FQNRq`e86zJQYNQ4jz9b@KuAp^vV?1?&N)hok?JN z8>*3T$Au3sk^R%JlUN-$@P$86Jy_gH@z*(XLo(wTp0cGptj+~Fs%k&9Cj?S?kaeH}GaUPR!(-8dP2dn{_qCxmy?^C#D3mL!|K9j7bRnSGfRv$` zKM^YA`|vLi`qLK*d`;3H^AN*=Dr6Skr`^gLthrtU{R4w+8%%1BN90pYb?*jAdV^9i z=C|vlFQnmhc!_UWI?Bq|-ZfgRjVgSApf~Inlx;S^Fi?IN^ufu+`buy0OFqnmB5U`p zSi4`bJ*2i`C6nbB99GeWb&-J$*k@`SW6xoH@e`n`PfYEg>vN+=-rfZ6mu}~7T+eRj zCn{v9HueieqKjc3^Ca+yC(kLu%2h)V5y zgHaW;k$oRwAsWX;jx64It$b+8N{VMMv;3k$#ifZ0dTO+f69E?Wma+bgFS)~#@i|SX zs2-%v�)HKye`VW^Y}Tl#Gl{p(^Q9Pkjt?LEp94l#eYcyIwA{d;aK4Y{wY-CB&KA zv+>=&eV-+#p_QEh=@vTI`yTkN-?cJ|SiT+`7K4}(!oPAkf_F6x(n zY8y1~R0{k)-& ze4J9h5uC$)m4d~5P1l@C3#T^aB|(_n0Pus4RYrhPH~7@?dB;+S6m_~rAHaE z7u2PZ*kf*U;zYdTqqtbAFPAgj35A~J-ASJ)6A5m(faXRYn%7ymAv)9t7cQNX1*VL- zG%c~`bx_Js_ijrO^YN^L)BOOSrGW)J;>{%0eHsL>a8AM_0hYdcM_K6U4u9!lUwUkl z_wiOv;ypcJ0-TCs7Prp_-XP=|FG56t%3Gw=n~c!1$+E9H0>?ITv; z2Lj8j_aL?7Tqtp}Kr@DQdMsA^EN)(7mM`MXgx&Pwl_KL`ii7RgZw4GEdV}NFQq$k? zoOv|C>@951`q!*$HkVsVy~5fE1T1JCi&KA@d(Ky0rq&`NLp8sxce+{G@@79JCDv)D zLRRhd`ti19%nHSsCexa4WRAdR+`ihqntJ(C1M$wIi!01el&~PE>GU ztLUn;QI$;M>30ZYlt5?nChvQ(?4{o5%S0dBcbQu3Ur2!jK0bE`$S$B7Rv^w5WrEEl ztI$DimO^L5C9$25%ifDIs%e@;;mJho8H{zk?>7mH zi~yXmV0Xhw>e%aNQ+F^R^c-9N!AYJul_F*FScJ0kN{|R2U1ZKXY0-tujU;#}O&jIr zPK5p0M2mMrG{>-jo`(KbJ-&zE2Y%CsM>z=}y_8?E#uHtzJdf^RvJH4dslVwB9|BXd z=^FiuzBO>bphxbH-;Ez3xf#%OopBLlG0I&1zkxrI#RPkGW6>;Y}42Ij2vX_}dL7H*szF_A_t<}30V z=hZwXA%-#@YV4>2>;aopiy zquCuUXz>tcb8?Kz@z1MrXLl=( zoL+_?6)HSk^m#9dX5+DZ-QDFerJ9Ei-cZ}MY&oR3P**n5eVo3hBy@LwWm#A_0P_A> z={l_%0I1^f(R{~NZ>qf9AW{oe`k5xWnZHD4<`7o3n7!F3<~T%ofRL$lnXK38wqxTI zYx7#{pA*Pj>@JO+*hhK6K0S|oq#5My`CgIl%68IAw>6vhCF(u%qQ7$Ew{enIK7)@{ zpOxRbAm@#CX~|1hfPFEO$r~{ss_~lB^t(^i=F)UHS&|&~N$%+*$TdW~v(Q`tL;7vDyO{P9FjzN5Q`3@CancxRKm6 zuZG2~XNM~*gDRPOr_us<%A8Hf=f?_*!z;VlO?iHWtmP;Szo~I9f?tfL-89V5P=f>7 zVhNFd=mWi{#XBz2u!xzSBcz1*cBRi;qnK5n^U%m1#%sBU6hFKt@Hx#Vx}Lves>z36 zMcs0`hRmJo)R$}?u+{B?thV8t6q@pT`|GIRx4`%<-N{NS@)zuDMhp&>x+QEknJq{( zQJ;R5Ep;mjF3Y4>jTH@;aX;PTIt*ovPO3}qau=^q?|!QnqW5L)Q&L_TQBA$8W%H5C zZtpfXhgOH0a5$@T;3D!k>YvODD(RW1YmmS5 z=E*y`E&;!l=!b3+;w97?o2hx_gD
6%S`)kt>DW^f*DCYbr&^DeYxki*Ab2}@XY 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 literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..efa4111d0 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,124 @@ +--- +title: ACS Deployment +layout: home +nav_order: 1 +permalink: /index.html +--- +# Alfresco Content Services Containerized Deployment + +[![release](https://img.shields.io/github/v/release/Alfresco/acs-deployment?display_name=release)](https://github.com/Alfresco/acs-deployment/releases/latest) +![kubernetes tested version](https://img.shields.io/badge/k8s%20version-v1.29-blue) +[![Helm release](https://github.com/Alfresco/acs-deployment/actions/workflows/helm-release.yml/badge.svg)](https://github.com/Alfresco/acs-deployment/actions/workflows/helm-release.yml) + +[![helm charts (enterprise)](https://github.com/Alfresco/acs-deployment/actions/workflows/helm-enterprise.yml/badge.svg)](https://github.com/Alfresco/acs-deployment/actions/workflows/helm-enterprise.yml) +[![helm charts (community)](https://github.com/Alfresco/acs-deployment/actions/workflows/helm-community.yml/badge.svg)](https://github.com/Alfresco/acs-deployment/actions/workflows/helm-community.yml) + +[![docker-compose (enterprise)](https://github.com/Alfresco/acs-deployment/actions/workflows/docker-compose-enterprise.yml/badge.svg)](https://github.com/Alfresco/acs-deployment/actions/workflows/docker-compose-enterprise.yml) +[![docker-compose (community)](https://github.com/Alfresco/acs-deployment/actions/workflows/docker-compose-community.yml/badge.svg)](https://github.com/Alfresco/acs-deployment/actions/workflows/docker-compose-community.yml) + +This project contains the code for running Alfresco Content Services (ACS) with +[Docker](https://docs.docker.com/get-started) using [Docker +Compose](https://docs.docker.com/compose) or on +[Kubernetes](https://kubernetes.io) using [Helm Charts](https://helm.sh). + +> Automated tests for helm charts are running on KinD cluster v1.29 and EKS v1.28. + +## Important changes for helm charts + +The v7.0.0 release is the first release of the acs helm charts which completely +leverage the new individual subcharts we started releasing since March 2023 in a +dedicated repo: +[alfresco-helm-charts](https://github.com/Alfresco/alfresco-helm-charts). + +This change will make life easier to whoever want to customize or extend the +helm deployments and simplify the future maintenance, at the cost of breaking +the compatibility with the values structure which remained almost stable since +the v6 release. + +Please review the new [values](https://github.com/Alfresco/acs-deployment/blob/master/helm/alfresco-content-services/values.yaml) +carefully and adapt any custom configuration you may have. You can read the +[upgrades guide](helm/upgrades.md) for more details on the changes. + +> Deploying to new namespace is always the preferred way of upgrading ACS as we +> do not test charts for upgrade scenarios (even with previous versions) +> neither do we provide roll-back facilities. + +## Prerequisites + +The ACS Enterprise version is installed by default, using Docker images from +Quay.io. If you're an Alfresco customer, you can request Quay.io credentials by +logging a ticket with [Hyland Community](https://community.hyland.com). + +The repository Docker image provides a limited trial of the Enterprise version +of Alfresco Content Services, which switches to read-only mode after 2 days. For +a longer trial, you can request the 30-day [Download +Trial](https://www.alfresco.com/platform/content-services-ecm/trial/download). + +The Community Edition can be installed without the need of a license or quay.io +account. + +## Versioning + +As of version 8.0.0 of the chart we have changed the release policy. +Previously, the chart was released together with the ACS product and we were +delivering additional values files for each major release of ACS (e.g. 7.3, +7.4, ...) and chart version were bumped with a similar increment as ACS. +With version 6.0.0, we started applying major versions bumps to reflect +breaking changes in the chart, despite only minor ACS release happened. + +With 8.0.0 onward, the release pace of the chart is completely independent from +the product versions. We will also stick to Semver principles when choosing +next version number, meaning that: + +* patch version will be used for bug fixes (last digit) +* minor version will be used for new features and modifications which do not + introduce breaking changes in the configuration interface. +* major version will be used for changes which involve breaking changes in the + configuration interface. + +The `alfresco-content-services` chart has always provided the ability to deploy +any currently supported version of ACS and its components and will continue to +do so. You are encoraged to always use the latest version of the chart to +deploy your ACS version, using the appropriate values file. For that reason we +stop providing the table mapping chart versions with the ACS version they +deploy (by default). Instead we'll just maintain the list of deprecated versions +versions mapped with the latest versions of the charts we tested deployment +with, so you can use that version to deploy older ACS version on Kubernetes. +Check the [ACS End of Life'd versions](#acs-end-of-lifed-versions) paragraph. + +You are encouraged to always use the latest version of the chart to deploy your +currently supported ACS version, using the appropriate values file. + +Finally, the master branch of this repository used to contain the latest +versions, including non-released versions! +We're also moving away from this pattern and the chart will now only ever +deploy released versions of our products. + +Should you want to try our latest dev versions, we now provide an additional +values file called `pre-release_values.yaml` which will be bumped on a regular +basis. + +This also means we will not produce `-M*` versions of the chart anymore. + +Check the [Release page](https://github.com/Alfresco/acs-deployment/releases) for the list of existing versions. + +### ACS End of Life'd versions + +While our latest version of the charts should be able to deployment any version +of ACS (theoretically), we only ever test deployment of _currently_ supported +versions. Also we do not provide values files for older unsupported version. If +you need to deploy old version we provide a reference table below to allow you +find the older values files and charts. You can either try using the values +file for a version with the latest charts or using the old charts. + +| unsupported ACS version | Last chart version providing it | +|-------------------------|---------------------------------| +| 7.0 | 8.0.1 | +| 6.2 | 5.3.0 | +| 6.1 | 5.1.1 | + +> These charts should not be used for any new deployment but just for reference. + +## Getting Started + +To get started please refer to the [Docker Compose](compose.md) and [Helm Chart](helm.md) documentation. diff --git a/helm/acs-sso-example/Chart.yaml b/helm/acs-sso-example/Chart.yaml index 9fb183533..16f8f203a 100644 --- a/helm/acs-sso-example/Chart.yaml +++ b/helm/acs-sso-example/Chart.yaml @@ -10,7 +10,7 @@ description: | * Composing your ACS from individual component charts we provide. Check the [step by step documentation](./docs/step-by-step-guide.md) * SSO integration, to add keycloak and configure Alfresco applications - accordingly: [SSO guide](./docs/step-by-step-guide.md) + accordingly: [SSO guide](./docs/sso-guide.md) > Note: this chart is just an example that can run on a localhost only. > It ships ACS repo, the repository database, the message broker, the @@ -25,7 +25,7 @@ version: 0.1.0 appVersion: 23.2.0-A12 home: https://www.alfresco.com sources: - - https://github.com/Alfresco/acs-deployment/helm/acs-sso-example + - https://github.com/Alfresco/acs-deployment dependencies: - name: postgresql repository: oci://registry-1.docker.io/bitnamicharts diff --git a/helm/acs-sso-example/README.md b/helm/acs-sso-example/README.md index 32b12b905..a3e3d54c3 100644 --- a/helm/acs-sso-example/README.md +++ b/helm/acs-sso-example/README.md @@ -1,3 +1,9 @@ +--- +title: acs-sso-example +parent: Charts +grand_parent: Helm +--- + # acs-sso-example ![Version: 0.1.0](https://img.shields.io/badge/Version-0.1.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 23.2.0-A12](https://img.shields.io/badge/AppVersion-23.2.0--A12-informational?style=flat-square) @@ -11,7 +17,7 @@ be enough but the principals are also documented in two differents steps: * Composing your ACS from individual component charts we provide. Check the [step by step documentation](./docs/step-by-step-guide.md) * SSO integration, to add keycloak and configure Alfresco applications - accordingly: [SSO guide](./docs/step-by-step-guide.md) + accordingly: [SSO guide](./docs/sso-guide.md) > Note: this chart is just an example that can run on a localhost only. > It ships ACS repo, the repository database, the message broker, the @@ -25,7 +31,7 @@ deployment is destroyed or rolled back! ## Source Code -* +* ## Requirements @@ -40,171 +46,17 @@ deployment is destroyed or rolled back! ## Values - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyTypeDefaultDescription
activemqobject
-check values.yaml
-
-
Configure the ACS ActiveMQ message broker as per https://github.com/Alfresco/alfresco-helm-charts/tree/activemq-3.4.1/charts/activemq
alfresco-content-appobject
-check values.yaml
-
-
Configure the Alfresco Conent-app as per https://github.com/Activiti/activiti-cloud-common-chart/tree/8.2.0/charts/common
alfresco-repositoryobject
-check values.yaml
-
-
Configure the ACS repository as per https://github.com/Alfresco/alfresco-helm-charts/tree/alfresco-repository-0.1.3/charts/alfresco-repository
alfresco-shareobject
-check values.yaml
-
-
Configure the Alfresco Share as per https://github.com/Alfresco/alfresco-helm-charts/tree/alfresco-share-0.3.0/charts/alfresco-share
global.known_urlslist
-[
-  "http://localhost"
-]
-
-
list of trusted URLs. URLs a re used to configure Cross-origin protections Also the first entry is considered the main hosting domain of the platform.
keycloakxobject
-check values.yaml
-
-
Configure the ACS Keycloak Identity provider as per https://github.com/codecentric/helm-charts/tree/keycloakx-2.3.0
keycloakx.admin.passwordstring
-random ascii string
-
-
Keycloak admin password. By default generated on first deployment, to get its value use:
kubectl get secrets keycloak -o jsonpath='{@.data.KEYCLOAK_ADMIN_PASSWORD}' | base64 -d
keycloakx.admin.realm[0]object
-{
-  "clients": [
-    {
-      "clientId": "alfresco",
-      "enabled": true,
-      "implicitFlowEnabled": true,
-      "publicClient": true,
-      "redirectUris": "{{- $redirectUris := list }} {{- range (index (include \"alfresco-common.known.urls\" $ | mustFromJson) \"known_urls\") }} {{- $redirectUris = append $redirectUris (printf \"%s/*\" .) }} {{- end }} {{- $redirectUris }}",
-      "standardFlowEnabled": true,
-      "webOrigins": "{{ index (include \"alfresco-common.known.urls\" $ | mustFromJson) \"known_urls\" }}"
-    }
-  ],
-  "defaultLocale": "en",
-  "enabled": true,
-  "id": "alfresco",
-  "internationalizationEnabled": true,
-  "loginTheme": "alfresco",
-  "realm": "alfresco",
-  "sslRequired": "none",
-  "supportedLocales": [
-    "ca",
-    "de",
-    "en",
-    "es",
-    "fr",
-    "it",
-    "ja",
-    "lt",
-    "nl",
-    "no",
-    "pt-BR",
-    "ru",
-    "sv",
-    "zh-CN"
-  ],
-  "users": [
-    {
-      "credentials": [
-        {
-          "type": "password",
-          "value": "secret"
-        }
-      ],
-      "enabled": true,
-      "username": "admin"
-    }
-  ]
-}
-
-
Alfresco Realm definition
keycloakx.admin.realm[0].users[0].credentials[0].valuestring
-"secret"
-
-
default Alfresco admin password
keycloakx.admin.realm[0].users[0].usernamestring
-"admin"
-
-
default Alfresco admin user
keycloakx.admin.usernamestring
-"admin"
-
-
Keycloak admin username
repository-databaseobject
-check values.yaml
-
-
Configure the ACS repository Postgres database as per https://github.com/bitnami/charts/tree/002c752f871c8fa068a770dc80fec4cf798798ab/bitnami/postgresql
- +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| activemq | object | check values.yaml | Configure the ACS ActiveMQ message broker as per https://github.com/Alfresco/alfresco-helm-charts/tree/activemq-3.4.1/charts/activemq | +| alfresco-content-app | object | check values.yaml | Configure the Alfresco Conent-app as per https://github.com/Activiti/activiti-cloud-common-chart/tree/8.2.0/charts/common | +| alfresco-repository | object | check values.yaml | Configure the ACS repository as per https://github.com/Alfresco/alfresco-helm-charts/tree/alfresco-repository-0.1.3/charts/alfresco-repository | +| alfresco-share | object | check values.yaml | Configure the Alfresco Share as per https://github.com/Alfresco/alfresco-helm-charts/tree/alfresco-share-0.3.0/charts/alfresco-share | +| global.known_urls | list | `["http://localhost"]` | list of trusted URLs. URLs a re used to configure Cross-origin protections Also the first entry is considered the main hosting domain of the platform. | +| keycloakx | object | check values.yaml | Configure the ACS Keycloak Identity provider as per https://github.com/codecentric/helm-charts/tree/keycloakx-2.3.0 | +| keycloakx.admin.password | string | random ascii string | Keycloak admin password. By default generated on first deployment, to get its value use:
kubectl get secrets keycloak -o jsonpath='{@.data.KEYCLOAK_ADMIN_PASSWORD}' | base64 -d | +| keycloakx.admin.realm[0] | object | `{"clients":[{"clientId":"alfresco","enabled":true,"implicitFlowEnabled":true,"publicClient":true,"redirectUris":"{{- $redirectUris := list }} {{- range (index (include \"alfresco-common.known.urls\" $ | mustFromJson) \"known_urls\") }} {{- $redirectUris = append $redirectUris (printf \"%s/*\" .) }} {{- end }} {{- $redirectUris }}","standardFlowEnabled":true,"webOrigins":"{{ index (include \"alfresco-common.known.urls\" $ | mustFromJson) \"known_urls\" }}"}],"defaultLocale":"en","enabled":true,"id":"alfresco","internationalizationEnabled":true,"loginTheme":"alfresco","realm":"alfresco","sslRequired":"none","supportedLocales":["ca","de","en","es","fr","it","ja","lt","nl","no","pt-BR","ru","sv","zh-CN"],"users":[{"credentials":[{"type":"password","value":"secret"}],"enabled":true,"username":"admin"}]}` | Alfresco Realm definition | +| keycloakx.admin.realm[0].users[0].credentials[0].value | string | `"secret"` | default Alfresco admin password | +| keycloakx.admin.realm[0].users[0].username | string | `"admin"` | default Alfresco admin user | +| keycloakx.admin.username | string | `"admin"` | Keycloak admin username | +| repository-database | object | check values.yaml | Configure the ACS repository Postgres database as per https://github.com/bitnami/charts/tree/002c752f871c8fa068a770dc80fec4cf798798ab/bitnami/postgresql | diff --git a/helm/acs-sso-example/README.md.gotmpl b/helm/acs-sso-example/README.md.gotmpl index 4ce76be30..532775f03 100644 --- a/helm/acs-sso-example/README.md.gotmpl +++ b/helm/acs-sso-example/README.md.gotmpl @@ -1,3 +1,9 @@ +--- +title: {{ template "chart.name" . }} +parent: Charts +grand_parent: Helm +--- + {{ template "chart.header" . }} {{ template "chart.deprecationWarning" . }} @@ -13,4 +19,4 @@ {{ template "chart.requirementsSection" . }} -{{ template "chart.valuesSectionHtml" . }} +{{ template "chart.valuesSection" . }} diff --git a/helm/acs-sso-example/docs/sso-guide.md b/helm/acs-sso-example/docs/sso-guide.md index dcd0d22cc..925e6b28d 100644 --- a/helm/acs-sso-example/docs/sso-guide.md +++ b/helm/acs-sso-example/docs/sso-guide.md @@ -1,7 +1,12 @@ +--- +title: SSO +parent: Examples +grand_parent: Helm +--- + # SSO integration with Keycloak (vanilla) -This is an extension of the base setup presented in the [step by step -guide](./step-by-step-guide.md). Make sure you have it running before reading +This is an extension of the base setup presented in the [step by step guide](./step-by-step-guide.md). Make sure you have it running before reading further (unless you just want to look at how to integrate Keycloak with ACS component without trying it on your local machine). diff --git a/helm/acs-sso-example/docs/step-by-step-guide.md b/helm/acs-sso-example/docs/step-by-step-guide.md index 936948936..1fc3c09ea 100644 --- a/helm/acs-sso-example/docs/step-by-step-guide.md +++ b/helm/acs-sso-example/docs/step-by-step-guide.md @@ -1,3 +1,9 @@ +--- +title: Step by step +parent: Guides +grand_parent: Helm +--- + # Anatomy of the example chart (and how you can build your own) This document explains the mechanisms used in this chart to build a Alfresco @@ -5,7 +11,7 @@ platform to deploy on [Kubernetes](https://kubernetes.io/). ## Why an example charts when there is already the alfresco-content-services? -With [alfresco-content-services chart](../../alfrescocontent-services/) we +With [alfresco-content-services chart](../../alfresco-content-services/README.md) we tried to provide something that can deploy most of our software components - still not all of them are included - but also serves as a basis for customization for real world scenarios. These two paradigms have actually @@ -18,7 +24,7 @@ including third party ones (database, message broker, Identity provider, ...). For that reason we have started creating individual charts for Alfresco components in the [alfresco-helm-charts -repository](https://github.com/Alfresco/alfreso-helm-charts/charts/) (more to +repository](https://github.com/Alfresco/alfresco-helm-charts/tree/main/charts) (more to come and PR are welcome). ## High overview of the example chart @@ -311,7 +317,7 @@ approach we prefer using to configure Alfresco component charts. #### Configuring the repository subchart The [Alfresco repository chart -documentation](ihttps://github.com/Alfresco/alfresco-helm-charts/tree/main/charts/alfresco-repository) +documentation](https://github.com/Alfresco/alfresco-helm-charts/tree/main/charts/alfresco-repository) shows how to configure the repo db and message broker using configmaps and secrets: ```yaml @@ -407,7 +413,7 @@ Now we can create configmaps to compute the services URL: The URL is built dynamically using string concatenation and the very same [named template](https://helm.sh/docs/chart_template_guide/named_templates/) that's used in the postgresql subchart to define the postgresql service name: see the -[code](https://github.com/bitnami/charts/blob/fc36e80c9ae42fd6a423a567c7fa1f6dab44ffd3/bitnami/postgresql/templates/primary/svc.yaml#L9). +[code](https://github.com/bitnami/charts/blob/fc36e80c9ae42fd6a423a567c7fa1f6dab44ffd3/bitnami/postgresql/templates/primary/svc.yaml). > Note we are building a `$dbCtx` to mimic the context the subchart uses when > evaluating `postgresql.v1.primary.fullname`. This is where it's important to @@ -455,7 +461,7 @@ helm dep build # pull dependencies helm install --generate-name --atomic . ``` -You can now open your browser on [http://localhost/alfresco](http://localhost/alfresco) +You can now open your browser on `http://localhost/alfresco` ## Next steps diff --git a/helm/alfresco-content-services/README.md b/helm/alfresco-content-services/README.md index 240ada0fe..d31db3720 100644 --- a/helm/alfresco-content-services/README.md +++ b/helm/alfresco-content-services/README.md @@ -1,3 +1,9 @@ +--- +title: alfresco-content-services +parent: Charts +grand_parent: Helm +--- + # alfresco-content-services ![Version: 8.1.1](https://img.shields.io/badge/Version-8.1.1-informational?style=flat-square) ![AppVersion: 23.2.1](https://img.shields.io/badge/AppVersion-23.2.1-informational?style=flat-square) diff --git a/helm/alfresco-content-services/README.md.gotmpl b/helm/alfresco-content-services/README.md.gotmpl index 82698597d..1d5d3c9f7 100644 --- a/helm/alfresco-content-services/README.md.gotmpl +++ b/helm/alfresco-content-services/README.md.gotmpl @@ -1,3 +1,9 @@ +--- +title: {{ template "chart.name" . }} +parent: Charts +grand_parent: Helm +--- + {{ template "chart.header" . }} {{ template "chart.deprecationWarning" . }}