From 5b4e8ef554afaff12e22b979f5222a23729e0ff3 Mon Sep 17 00:00:00 2001 From: Sergiu-Alexandru Vidrascu Date: Fri, 15 Dec 2017 18:15:54 +0200 Subject: [PATCH] DEPLOY-276: ACS helm chart for community --- README.md | 22 +++++- helm/alfresco-content-services/.helmignore | 21 ++++++ helm/alfresco-content-services/Chart.yaml | 13 ++++ .../charts/nginx-ingress-0.8.18.tgz | Bin 0 -> 9411 bytes .../charts/postgresql-0.8.5.tgz | Bin 0 -> 6803 bytes .../requirements.lock | 9 +++ .../requirements.yaml | 8 +++ .../templates/NOTES.txt | 8 +++ .../templates/_helpers.tpl | 8 +++ .../templates/config-repository.yaml | 20 ++++++ .../templates/config-share.yaml | 11 +++ .../templates/config-solr.yaml | 18 +++++ .../templates/deployment-repository.yaml | 32 +++++++++ .../templates/deployment-share.yaml | 28 ++++++++ .../templates/deployment-solr.yaml | 28 ++++++++ .../templates/ingress-repository.yaml | 15 ++++ .../templates/ingress-share.yaml | 15 ++++ .../templates/ingress-solr.yaml | 15 ++++ .../templates/svc-repository.yaml | 18 +++++ .../templates/svc-share.yaml | 18 +++++ .../templates/svc-solr.yaml | 18 +++++ helm/alfresco-content-services/values.yaml | 64 ++++++++++++++++++ 22 files changed, 386 insertions(+), 3 deletions(-) create mode 100644 helm/alfresco-content-services/.helmignore create mode 100644 helm/alfresco-content-services/Chart.yaml create mode 100644 helm/alfresco-content-services/charts/nginx-ingress-0.8.18.tgz create mode 100644 helm/alfresco-content-services/charts/postgresql-0.8.5.tgz create mode 100644 helm/alfresco-content-services/requirements.lock create mode 100644 helm/alfresco-content-services/requirements.yaml create mode 100644 helm/alfresco-content-services/templates/NOTES.txt create mode 100644 helm/alfresco-content-services/templates/_helpers.tpl create mode 100644 helm/alfresco-content-services/templates/config-repository.yaml create mode 100644 helm/alfresco-content-services/templates/config-share.yaml create mode 100644 helm/alfresco-content-services/templates/config-solr.yaml create mode 100644 helm/alfresco-content-services/templates/deployment-repository.yaml create mode 100644 helm/alfresco-content-services/templates/deployment-share.yaml create mode 100644 helm/alfresco-content-services/templates/deployment-solr.yaml create mode 100644 helm/alfresco-content-services/templates/ingress-repository.yaml create mode 100644 helm/alfresco-content-services/templates/ingress-share.yaml create mode 100644 helm/alfresco-content-services/templates/ingress-solr.yaml create mode 100644 helm/alfresco-content-services/templates/svc-repository.yaml create mode 100644 helm/alfresco-content-services/templates/svc-share.yaml create mode 100644 helm/alfresco-content-services/templates/svc-solr.yaml create mode 100644 helm/alfresco-content-services/values.yaml diff --git a/README.md b/README.md index 545ba6e855..de6394ef4a 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,8 @@ This project contains the code for packaging the entire Alfresco Content Service * ```mvn clean install``` in the root of the project will build everything. Note: It is not easy to build the full installer locally (and impossible on Windows) so, most likely you don't want to create the installer locally. Comment out the installer in the root pom.xml in order to avoid building the installer locally. -## Docker-compose -Build and start Alfresco Content Services Community using docker-compose, containing: +## Docker-compose & Kubernetes +Build and start Alfresco Content Services Community using docker-compose or Kubernetes, containing: 1. Alfresco Repository for community, with: 1.1. Alfresco Share Services amp 1.2. Alfresco AOS amp @@ -19,7 +19,7 @@ Build and start Alfresco Content Services Community using docker-compose, contai 3. A Postgres DB 4. Alfresco Solr6 -### Instructions: +### Docker Compose Instructions: #### Prerequisite: * Docker installed locally * Access to docker-internal.alfresco.com and quay.io repositories - Platform Services team is working on getting the images in [Docker Hub](https://hub.docker.com/u/alfresco/) registry. @@ -34,6 +34,22 @@ Build and start Alfresco Content Services Community using docker-compose, contai * The images used in the docker-compose.yml are images that are build in the 'docker-alfresco' and 'docker-share' subfolders of the project - see the relevant sections below * If you don't have access to the docker-internal.alfresco.com and quay.io images, or if you want custom data in your docker images, you can use the 'docker-alfresco' and 'docker-share' folders to customize and build your customized docker images that are used in the docker-compose project. Just make sure you use proper tags when you create the images and update the docker-compose.yml with these proper tags that you created. +### Kubernetes Instructions: +#### Prerequisite: +* A minikube k8s cluster up and ready +* Access to docker-internal.alfresco.com and quay.io repositories - Platform Services team is working on getting the images in [Docker Hub](https://hub.docker.com/u/alfresco/) registry. + +#### Steps +1. Go to **helm** folder +2. Run ```helm install alfresco-content-services``` +3. After deploying the helm chart you will get information for obtaining the URL for alfresco, share and solr. + +#### Notes: + +* The images used in the docker-compose.yml are images that are build in the 'docker-alfresco' and 'docker-share' subfolders of the project - see the relevant sections below +* If you don't have access to the docker-internal.alfresco.com and quay.io images, or if you want custom data in your docker images, you can use the 'docker-alfresco' and 'docker-share' folders to customize and build your customized docker images that are used in the docker-compose project. Just make sure you use proper tags when you create the images and update the docker-compose.yml with these proper tags that you created. + + ## Docker images These images are used to build the images used by the docker-compose.yml project to bring up an ACS Community, similar to what the installer did/does. The images are based on *pure* _content services_ and _share_ images done by the _acs-packaging_ and _share_ projects and adds the amps and settings necessary for running the images in a similar fashion to what the ACS deployment with the installer did/does. diff --git a/helm/alfresco-content-services/.helmignore b/helm/alfresco-content-services/.helmignore new file mode 100644 index 0000000000..f0c1319444 --- /dev/null +++ b/helm/alfresco-content-services/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm/alfresco-content-services/Chart.yaml b/helm/alfresco-content-services/Chart.yaml new file mode 100644 index 0000000000..9091863fda --- /dev/null +++ b/helm/alfresco-content-services/Chart.yaml @@ -0,0 +1,13 @@ +name: alfresco-content-services +version: 0.0.1 +description: A Helm chart for deploying Alfresco Content Services +keywords: +- content +- content services +- alfresco +- community +- alfresco community +home: https://www.alfresco.com +sources: +- https://github.com/Alfresco/acs-community-full-packaging/tree/master/helm +icon: https://avatars0.githubusercontent.com/u/391127?s=200&v=4 \ No newline at end of file diff --git a/helm/alfresco-content-services/charts/nginx-ingress-0.8.18.tgz b/helm/alfresco-content-services/charts/nginx-ingress-0.8.18.tgz new file mode 100644 index 0000000000000000000000000000000000000000..03b8a5398a8de8389b212631acb4d48091f45e13 GIT binary patch literal 9411 zcmV;!Bs|+6iwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PMYMbK5x5D7>HbEBck^*|qaVl;m3`+RfJEvGeS>CgZqbXU^Hm znTjD2k}xI-4gkv0BtF0W6mBF)krZV+PO>9@NGuX)G#Y(FqXEQI5`XBCc*-#6{o@&8 z!dsvy{L2GAgTY|%?BGECKNt+k{|^Vlefzh5KioUq-~S6dBo4Jt$^~M784T_Vr`)-3 z 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 JGZ6p=0Ra1ej_&{f literal 0 HcmV?d00001 diff --git a/helm/alfresco-content-services/charts/postgresql-0.8.5.tgz b/helm/alfresco-content-services/charts/postgresql-0.8.5.tgz new file mode 100644 index 0000000000000000000000000000000000000000..ad298dc869dd725a1f7df31c0dd73d9742dffaf8 GIT binary patch literal 6803 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