├── lab └── kubernetes │ ├── k3s │ ├── k3s_install.sh │ ├── edit_traefik.sh │ ├── dashboard │ │ ├── remove.sh │ │ ├── deploy.sh │ │ ├── get_token.sh │ │ ├── dashboard.admin-user.yml │ │ ├── dashboard.admin-user-role.yml │ │ └── install.sh │ └── k3s_fix_pvc_perm.sh │ └── domino │ ├── api │ ├── create_service_account.sh │ ├── role.yml │ ├── role_binding.yml │ ├── pvc.json │ └── kapi.sh │ ├── pvc_storage.yml │ ├── service_nrpc.yml │ ├── service_http.yml │ ├── service_https.yml │ ├── ingress_http.yml │ ├── create_registry_secret.sh │ ├── domino12_auto_config.yml │ └── domino12.yml ├── testing ├── .env ├── build.sh ├── custom_tests.sh ├── makefile └── README.md ├── docs ├── favicon.ico ├── _includes │ ├── nav_footer_custom.html │ └── yewtube.html ├── architecture.md ├── assets │ └── images │ │ ├── png │ │ ├── qnap-app-center.png │ │ ├── qnap-docker-images.png │ │ ├── qnap-createcontainer-1.png │ │ ├── qnap-createcontainer-2.png │ │ ├── qnap-createcontainer-3.png │ │ ├── qnap-createcontainer-4.png │ │ ├── qnap-createcontainer-5.png │ │ ├── qnap-filestation-folders.png │ │ └── qnap-createcontainer-volumes.png │ │ └── svg │ │ ├── DominoIcon.svg │ │ └── Domino.svg ├── howto.md ├── reference.md ├── run.md ├── build_capi.sh ├── concept_license.md ├── plantuml │ ├── projectstructure.plantuml │ ├── containerstartscript.plantuml │ └── repository-setup.plantuml ├── reference_startscript.md ├── dominoleap.md ├── howto_docker-linux.md ├── howto_download-software.md ├── reference_environment-vars.md ├── reference_custom_roots.md ├── howto_github.md ├── reference_custom_mirror.md ├── run_dominoctl.md ├── howto_docker-run.md ├── run_docker.md ├── resources.md ├── architecture_concept.md ├── run_ots.md ├── howto_use_externally.md ├── concept_benefits.md ├── concept_autotesting.md ├── _config.yml ├── architecture_startup-cfg-flow.md ├── howto_docker-wsl.md ├── index.md ├── architecture_components.md └── quickstart.md ├── dockerfiles ├── install_dir_domino │ ├── domsetup │ │ └── domsetup-webroot │ │ │ ├── index.html │ │ │ ├── favicon.ico │ │ │ ├── completed.html │ │ │ ├── domino-ots-setup.html │ │ │ └── assets │ │ │ └── domsetup-logo.svg │ ├── makefile │ ├── startscript │ │ ├── systemdbs.ind │ │ ├── install_borg │ │ ├── domino.cfg │ │ ├── OneTouchSetup │ │ │ ├── first_server.env │ │ │ └── additional_server.env │ │ └── domino.service │ ├── domino_install.properties │ ├── installer_traveler_domino1201.properties │ ├── installer_traveler_domino1202.properties │ ├── installer_traveler_domino140.properties │ ├── installer_traveler_hcl.properties │ ├── installer_traveler_domino12.properties │ ├── linux_repositories │ │ ├── debian_bookworm.sources_hetzner │ │ ├── ubuntu_noble.sources_hetzner │ │ └── README.md │ ├── domino14_install.properties │ ├── domino14_ontime_install.properties │ ├── domino14_full_install.properties │ ├── create_keyring.sh │ ├── custom │ │ └── README.md │ └── nuid2pw.c ├── README.md ├── install_dir_traveler │ ├── installer_domino1201.properties │ ├── installer_hcl.properties │ └── installer_domino12.properties ├── dockerfile_alpine_build_environment ├── install_dir_squid │ ├── entrypoint.sh │ └── install.sh ├── install_dir_nginx │ ├── entrypoint.sh │ ├── install.sh │ └── nginx.conf ├── dockerfile_nginx ├── dockerfile_squid ├── dockerfile_leap ├── dockerfile_volt ├── dockerfile_safelinx ├── dockerfile_traveler ├── dockerfile_hcl ├── dockerfile_init ├── dockerfile ├── install_dir_safelinx │ ├── install_linux.sh │ ├── install.sh │ └── healthcheck.sh ├── install_dir_leap │ └── install.sh ├── install_dir_volt │ └── install.sh └── install_dir_common │ └── healthcheck.sh ├── .gitignore ├── software ├── readme.txt ├── current_version.txt ├── update_software_file ├── README.md └── software-repo.sh ├── CONTRIBUTING.md ├── examples ├── domino │ ├── docker-compose.yml │ └── README.md └── safelinx │ ├── docker-compose_mysql.yml │ ├── docker-compose.yml │ ├── .env │ └── nginx.conf ├── start_script └── we_have_moved.txt ├── compile.sh ├── CODE_OF_CONDUCT.md └── README.md /lab/kubernetes/k3s/k3s_install.sh: -------------------------------------------------------------------------------- 1 | curl -sfL https://get.k3s.io | sh - 2 | -------------------------------------------------------------------------------- /lab/kubernetes/k3s/edit_traefik.sh: -------------------------------------------------------------------------------- 1 | 2 | kubectl edit svc traefik -n kube-system 3 | -------------------------------------------------------------------------------- /lab/kubernetes/k3s/dashboard/remove.sh: -------------------------------------------------------------------------------- 1 | 2 | kubectl delete ns kubernetes-dashboard 3 | -------------------------------------------------------------------------------- /testing/.env: -------------------------------------------------------------------------------- 1 | 2 | # Specify environment variables passed to the test container 3 | 4 | -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HCL-TECH-SOFTWARE/domino-container/HEAD/docs/favicon.ico -------------------------------------------------------------------------------- /docs/_includes/nav_footer_custom.html: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /lab/kubernetes/k3s/dashboard/deploy.sh: -------------------------------------------------------------------------------- 1 | kubectl create -f dashboard.admin-user.yml -f dashboard.admin-user-role.yml 2 | -------------------------------------------------------------------------------- /lab/kubernetes/domino/api/create_service_account.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | kubectl create serviceaccount domino-admin 4 | -------------------------------------------------------------------------------- /lab/kubernetes/k3s/dashboard/get_token.sh: -------------------------------------------------------------------------------- 1 | 2 | kubectl -n kubernetes-dashboard create token admin-user --duration=1h 3 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/domsetup/domsetup-webroot/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /docs/architecture.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Architecture" 4 | nav_order: 4 5 | description: "Architecture" 6 | has_children: true 7 | --- 8 | -------------------------------------------------------------------------------- /docs/assets/images/png/qnap-app-center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HCL-TECH-SOFTWARE/domino-container/HEAD/docs/assets/images/png/qnap-app-center.png -------------------------------------------------------------------------------- /docs/assets/images/png/qnap-docker-images.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HCL-TECH-SOFTWARE/domino-container/HEAD/docs/assets/images/png/qnap-docker-images.png -------------------------------------------------------------------------------- /docs/assets/images/png/qnap-createcontainer-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HCL-TECH-SOFTWARE/domino-container/HEAD/docs/assets/images/png/qnap-createcontainer-1.png -------------------------------------------------------------------------------- /docs/assets/images/png/qnap-createcontainer-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HCL-TECH-SOFTWARE/domino-container/HEAD/docs/assets/images/png/qnap-createcontainer-2.png -------------------------------------------------------------------------------- /docs/assets/images/png/qnap-createcontainer-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HCL-TECH-SOFTWARE/domino-container/HEAD/docs/assets/images/png/qnap-createcontainer-3.png -------------------------------------------------------------------------------- /docs/assets/images/png/qnap-createcontainer-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HCL-TECH-SOFTWARE/domino-container/HEAD/docs/assets/images/png/qnap-createcontainer-4.png -------------------------------------------------------------------------------- /docs/assets/images/png/qnap-createcontainer-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HCL-TECH-SOFTWARE/domino-container/HEAD/docs/assets/images/png/qnap-createcontainer-5.png -------------------------------------------------------------------------------- /docs/assets/images/png/qnap-filestation-folders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HCL-TECH-SOFTWARE/domino-container/HEAD/docs/assets/images/png/qnap-filestation-folders.png -------------------------------------------------------------------------------- /lab/kubernetes/k3s/dashboard/dashboard.admin-user.yml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ServiceAccount 3 | metadata: 4 | name: admin-user 5 | namespace: kubernetes-dashboard 6 | -------------------------------------------------------------------------------- /docs/assets/images/png/qnap-createcontainer-volumes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HCL-TECH-SOFTWARE/domino-container/HEAD/docs/assets/images/png/qnap-createcontainer-volumes.png -------------------------------------------------------------------------------- /docs/howto.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Howto" 4 | nav_order: 6 5 | description: "Howto Guides" 6 | has_children: true 7 | --- 8 | 9 | # Howto Guides 10 | 11 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/makefile: -------------------------------------------------------------------------------- 1 | 2 | NAME=nuid2pw 3 | 4 | $(NAME): $(NAME).o 5 | gcc -o $(NAME) $(NAME).o 6 | 7 | $(NAME).o: $(NAME).c 8 | gcc -c -m64 $(NAME).c 9 | 10 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/startscript/systemdbs.ind: -------------------------------------------------------------------------------- 1 | names.nsf 2 | events4.nsf 3 | admin4.nsf 4 | ddm.nsf 5 | certstore.nsf 6 | cscancfg.nsf 7 | cscanlog.nsf 8 | cscanquarantine.nsf 9 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/domsetup/domsetup-webroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HCL-TECH-SOFTWARE/domino-container/HEAD/dockerfiles/install_dir_domino/domsetup/domsetup-webroot/favicon.ico -------------------------------------------------------------------------------- /docs/reference.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Reference" 4 | nav_order: 4 5 | description: "Reference" 6 | has_children: true 7 | --- 8 | 9 | 10 | # Reference Information Domino Containers 11 | 12 | -------------------------------------------------------------------------------- /docs/run.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Run Image" 4 | nav_order: 3 5 | description: "Run Image on different platforms" 6 | has_children: true 7 | --- 8 | 9 | # Run Images on different Platforms 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/domino_install.properties: -------------------------------------------------------------------------------- 1 | USER_INSTALL_DIR=/opt/hcl/domino 2 | IA_IS_PARTITION=0 3 | USER_INSTALL_DATA_DIR=/local/notesdata 4 | IA_USERNAME=notes 5 | IA_GROUPNAME=notes 6 | USER_MAGIC_FOLDER_1=/local/notesdata 7 | CHOSEN_INSTALL_SET=Enterprise 8 | 9 | -------------------------------------------------------------------------------- /lab/kubernetes/domino/pvc_storage.yml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PersistentVolumeClaim 3 | 4 | metadata: 5 | name: local-path-pvc 6 | namespace: default 7 | 8 | spec: 9 | accessModes: 10 | - ReadWriteOnce 11 | resources: 12 | requests: 13 | storage: 4Gi 14 | -------------------------------------------------------------------------------- /lab/kubernetes/domino/service_nrpc.yml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: domino-nrpc 5 | 6 | spec: 7 | selector: 8 | app: hcl-domino 9 | ports: 10 | - name: nrpc 11 | protocol: TCP 12 | port: 1352 13 | externalIPs: 14 | - 1.2.3.4 15 | -------------------------------------------------------------------------------- /testing/build.sh: -------------------------------------------------------------------------------- 1 | docker run -it --rm -w /build --entrypoint= -v $(pwd):/build -u 0 -e LOTUS=/opt/hcl/domino -e Notes_ExecDirectory=/opt/hcl/domino/notes/latest/linux -e LD_LIBRARY_PATH=/opt/hcl/domino/notes/latest/linux -e INCLUDE=/opt/hcl/domino/notesapi/include hclcom/domino:build make 2 | -------------------------------------------------------------------------------- /lab/kubernetes/domino/service_http.yml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | 4 | metadata: 5 | name: domino-http 6 | namespace: default 7 | 8 | spec: 9 | selector: 10 | app: hcl-domino 11 | ports: 12 | - protocol: TCP 13 | port: 80 14 | targetPort: 80 15 | 16 | -------------------------------------------------------------------------------- /dockerfiles/README.md: -------------------------------------------------------------------------------- 1 | # Description 2 | 3 | This directory contains Docker build scripts and tools required to successfully build a Docker image with Domino 12 or later. 4 | 5 | Please use the main build.sh script and description for details. 6 | This directory contains the internal build script and install routines used by the main build script. 7 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_traveler/installer_domino1201.properties: -------------------------------------------------------------------------------- 1 | ACCEPT_LICENSE=true 2 | DOMINO_PROGRAM_DIRECTORY=/opt/hcl/domino/notes/latest/linux 3 | DOMINO_DATA_DIRECTORY_1=/local/notesdata 4 | DOMINO_NOTESINI_DIRECTORY_1=/local/notesdata 5 | NTS_WEBSITE_HOME=0 6 | INSTALLED_DOMINO_VERSION=12.0.1 7 | BYPASS_DOMINO_VERSION_CHECK=true 8 | 9 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_traveler/installer_hcl.properties: -------------------------------------------------------------------------------- 1 | 2 | ACCEPT_LICENSE=true 3 | DOMINO_PROGRAM_DIRECTORY=/opt/hcl/domino/notes/latest/linux 4 | DOMINO_DATA_DIRECTORY_1=/local/notesdata 5 | DOMINO_NOTESINI_DIRECTORY_1=/local/notesdata 6 | NTS_WEBSITE_HOME=0 7 | OVERRIDE_BACKREV=false 8 | BYPASS_DOMINO_VERSION_CHECK=true 9 | 10 | -------------------------------------------------------------------------------- /lab/kubernetes/domino/api/role.yml: -------------------------------------------------------------------------------- 1 | kind: Role 2 | apiVersion: rbac.authorization.k8s.io/v1 3 | 4 | metadata: 5 | name: domino-admin-role 6 | namespace: default 7 | 8 | rules: 9 | 10 | - apiGroups: [""] 11 | resources: ["pods", "persistentvolumeclaims" ] 12 | verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] 13 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/installer_traveler_domino1201.properties: -------------------------------------------------------------------------------- 1 | ACCEPT_LICENSE=true 2 | DOMINO_PROGRAM_DIRECTORY=/opt/hcl/domino/notes/latest/linux 3 | DOMINO_DATA_DIRECTORY_1=/local/notesdata 4 | DOMINO_NOTESINI_DIRECTORY_1=/local/notesdata 5 | NTS_WEBSITE_HOME=0 6 | INSTALLED_DOMINO_VERSION=12.0.1 7 | BYPASS_DOMINO_VERSION_CHECK=true 8 | 9 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/installer_traveler_domino1202.properties: -------------------------------------------------------------------------------- 1 | ACCEPT_LICENSE=true 2 | DOMINO_PROGRAM_DIRECTORY=/opt/hcl/domino/notes/latest/linux 3 | DOMINO_DATA_DIRECTORY_1=/local/notesdata 4 | DOMINO_NOTESINI_DIRECTORY_1=/local/notesdata 5 | NTS_WEBSITE_HOME=0 6 | INSTALLED_DOMINO_VERSION=12.0.2 7 | BYPASS_DOMINO_VERSION_CHECK=true 8 | 9 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/installer_traveler_domino140.properties: -------------------------------------------------------------------------------- 1 | ACCEPT_LICENSE=true 2 | DOMINO_PROGRAM_DIRECTORY=/opt/hcl/domino/notes/latest/linux 3 | DOMINO_DATA_DIRECTORY_1=/local/notesdata 4 | DOMINO_NOTESINI_DIRECTORY_1=/local/notesdata 5 | NTS_WEBSITE_HOME=0 6 | INSTALLED_DOMINO_VERSION=14.0 7 | BYPASS_DOMINO_VERSION_CHECK=true 8 | 9 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/installer_traveler_hcl.properties: -------------------------------------------------------------------------------- 1 | 2 | ACCEPT_LICENSE=true 3 | DOMINO_PROGRAM_DIRECTORY=/opt/hcl/domino/notes/latest/linux 4 | DOMINO_DATA_DIRECTORY_1=/local/notesdata 5 | DOMINO_NOTESINI_DIRECTORY_1=/local/notesdata 6 | NTS_WEBSITE_HOME=0 7 | OVERRIDE_BACKREV=false 8 | BYPASS_DOMINO_VERSION_CHECK=true 9 | 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | software/*.tar 2 | software/*.tgz 3 | software/*.gz 4 | software/*.zip 5 | !*.md 6 | /dockerfiles/volt/install_dir/demopack.zip 7 | /dockerfiles/install_dir_domino/custom/*.sources 8 | /dockerfiles/install_dir_domino/custom/*.pem 9 | /dockerfiles/install_dir_domino/custom/*.svg 10 | /dockerfiles/install_dir_domino/custom/*.policy 11 | .DominoContainer 12 | -------------------------------------------------------------------------------- /testing/custom_tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Example custom test command 4 | 5 | ERROR_MSG= 6 | 7 | header "Custom test command" 8 | echo "Container CMD : $CONTAINER_CMD" 9 | echo "Domino Volume : $DOMINO_VOLUME" 10 | 11 | #ERROR_MSG="Just setting an error text will make the test fail" 12 | 13 | test_result "custom.check" "Custom Check" "" "$ERROR_MSG" 14 | 15 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_traveler/installer_domino12.properties: -------------------------------------------------------------------------------- 1 | ACCEPT_LICENSE=true 2 | DOMINO_PROGRAM_DIRECTORY=/opt/hcl/domino/notes/latest/linux 3 | DOMINO_DATA_DIRECTORY_1=/local/notesdata 4 | DOMINO_NOTESINI_DIRECTORY_1=/local/notesdata 5 | NTS_WEBSITE_HOME=0 6 | OVERRIDE_BACKREV=false 7 | INSTALLED_DOMINO_VERSION=12.0.0 8 | BYPASS_DOMINO_VERSION_CHECK=true 9 | 10 | -------------------------------------------------------------------------------- /lab/kubernetes/domino/service_https.yml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | 4 | metadata: 5 | name: domino-https 6 | namespace: default 7 | 8 | spec: 9 | 10 | type: ClusterIP 11 | selector: 12 | app: hcl-domino 13 | 14 | ports: 15 | - name: https 16 | protocol: TCP 17 | port: 443 18 | targetPort: 443 19 | 20 | externalIPs: 21 | - 1.2.3.4 22 | -------------------------------------------------------------------------------- /lab/kubernetes/k3s/dashboard/dashboard.admin-user-role.yml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1 2 | kind: ClusterRoleBinding 3 | metadata: 4 | name: admin-user 5 | roleRef: 6 | apiGroup: rbac.authorization.k8s.io 7 | kind: ClusterRole 8 | name: cluster-admin 9 | subjects: 10 | - kind: ServiceAccount 11 | name: admin-user 12 | namespace: kubernetes-dashboard 13 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/installer_traveler_domino12.properties: -------------------------------------------------------------------------------- 1 | ACCEPT_LICENSE=true 2 | DOMINO_PROGRAM_DIRECTORY=/opt/hcl/domino/notes/latest/linux 3 | DOMINO_DATA_DIRECTORY_1=/local/notesdata 4 | DOMINO_NOTESINI_DIRECTORY_1=/local/notesdata 5 | NTS_WEBSITE_HOME=0 6 | OVERRIDE_BACKREV=false 7 | INSTALLED_DOMINO_VERSION=12.0.0 8 | BYPASS_DOMINO_VERSION_CHECK=true 9 | 10 | -------------------------------------------------------------------------------- /lab/kubernetes/domino/api/role_binding.yml: -------------------------------------------------------------------------------- 1 | kind: RoleBinding 2 | apiVersion: rbac.authorization.k8s.io/v1 3 | 4 | metadata: 5 | name: domino-admin-role-binding 6 | namespace: default 7 | 8 | subjects: 9 | - kind: ServiceAccount 10 | name: domino-admin 11 | namespace: default 12 | 13 | roleRef: 14 | kind: Role 15 | name: domino-admin-role 16 | apiGroup: rbac.authorization.k8s.io 17 | -------------------------------------------------------------------------------- /lab/kubernetes/domino/api/pvc.json: -------------------------------------------------------------------------------- 1 | { 2 | "apiVersion": "v1", 3 | "kind": "PersistentVolumeClaim", 4 | "metadata": { 5 | "name": "local-path-pvc-api-created", 6 | "namespace": "default" 7 | }, 8 | "spec": { 9 | "accessModes": [ 10 | "ReadWriteOnce" 11 | ], 12 | "resources": { 13 | "requests": { 14 | "storage": "4Gi" 15 | } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /software/readme.txt: -------------------------------------------------------------------------------- 1 | 2 | This directory is supposed to contain the original downloaded files from [My HCLSoftware Portal](https://my.hcltechsw.com/). 3 | Make sure to keep the file name unchanged otherwise build scripts will not work. 4 | The build script shows missing download packages and points you to the right download location. 5 | And it also contains configuration to use a different folder or a remote HTTP(S) download location. 6 | -------------------------------------------------------------------------------- /lab/kubernetes/k3s/dashboard/install.sh: -------------------------------------------------------------------------------- 1 | 2 | GITHUB_URL=https://github.com/kubernetes/dashboard/releases 3 | VERSION_KUBE_DASHBOARD=$(curl -w '%{url_effective}' -I -L -s -S ${GITHUB_URL}/latest -o /dev/null | sed -e 's|.*/||') 4 | 5 | echo 6 | echo "Installing Dashboard $VERSION_KUBE_DASHBOARD" 7 | echo 8 | 9 | kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/${VERSION_KUBE_DASHBOARD}/aio/deploy/recommended.yaml 10 | 11 | 12 | -------------------------------------------------------------------------------- /dockerfiles/dockerfile_alpine_build_environment: -------------------------------------------------------------------------------- 1 | ############################################################################ 2 | # Copyright Nash!Com, Daniel Nashed 2025 - APACHE 2.0 see LICENSE 3 | ############################################################################ 4 | 5 | FROM alpine:latest 6 | 7 | USER root 8 | 9 | RUN apk add --no-cache g++ make musl-dev rapidjson-dev curl-dev openssl-dev openssl-libs-static 10 | 11 | WORKDIR /src 12 | 13 | USER 1000 14 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/linux_repositories/debian_bookworm.sources_hetzner: -------------------------------------------------------------------------------- 1 | # Hetzner Debian 12 (Bookworm) repositories 2 | 3 | Types: deb 4 | URIs: https://mirror.hetzner.com/debian/packages 5 | Suites: bookworm bookworm-updates 6 | Components: main 7 | Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg 8 | 9 | Types: deb 10 | URIs: https://mirror.hetzner.com/debian/packages 11 | Suites: bookworm-security 12 | Components: main 13 | Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg 14 | 15 | -------------------------------------------------------------------------------- /docs/build_capi.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ -z "$1" ]; then 4 | COMMAND=make 5 | else 6 | COMMAND="$@" 7 | fi 8 | 9 | if [ -z "$CONTAINER_IMAGE_DOMINO_CAPI" ]; then 10 | CONTAINER_IMAGE_DOMINO_CAPI=hclcom/domino:latest 11 | fi 12 | 13 | docker run -it --rm -w /build --entrypoint= -v $(pwd):/build -u 0 -e LOTUS=/opt/hcl/domino -e Notes_ExecDirectory=/opt/hcl/domino/notes/latest/linux -e LD_LIBRARY_PATH=/opt/hcl/domino/notes/latest/linux -e INCLUDE=/opt/hcl/domino/notesapi/include "$CONTAINER_IMAGE_DOMINO_CAPI" $COMMAND 14 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/startscript/install_borg: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Domino Borg Backup script installation 3 | 4 | SCRIPT_NAME=$0 5 | PARAM1=$1 6 | SCRIPT_DIR=$(dirname $SCRIPT_NAME) 7 | 8 | LOTUS=/opt/hcl/domino 9 | BORG_SCRIPT_DIR=$SCRIPT_DIR/extra/backup/borg 10 | BORG_DOMINO_DIR=$LOTUS/backup/borg 11 | 12 | mkdir -p $BORG_DOMINO_DIR 13 | cp $BORG_SCRIPT_DIR/*.sh $BORG_DOMINO_DIR 14 | chmod 755 $BORG_DOMINO_DIR/*.sh 15 | 16 | cp $BORG_SCRIPT_DIR/*.dxl $BORG_DOMINO_DIR 17 | chmod 644 $BORG_DOMINO_DIR/*.dxl 18 | 19 | exit 0 20 | -------------------------------------------------------------------------------- /software/current_version.txt: -------------------------------------------------------------------------------- 1 | domino|14.5|FP1 2 | domino-14.5.1|14.5.1EA1 3 | domino-14.0|14.0|FP5 4 | domino-12.0.2|12.0.2|FP7|IF1 5 | domiq|14.5 6 | domiq-14.5.1|14.5.1EA1 7 | traveler-14.5.1|14.5.1EA1 8 | traveler|14.5 9 | volt|1.0.5.15 10 | leap|1.1.9 11 | verse|3.2.6 12 | capi|14.5 13 | safelinx|1.4.3 14 | nomadweb|1.0.18 15 | nomad|1.0.18 16 | domrestapi|1.1.6 17 | tika|3.2.3 18 | borg|1.4.1 19 | domborg|0.9.7 20 | node_exporter|1.9.1 21 | domprom|0.9.2 22 | iqsuite|28.1 23 | mysql-jdbc|9.4.0 24 | postgresql-jdbc|42.7.8 25 | nshmailx|1.1.0 26 | -------------------------------------------------------------------------------- /lab/kubernetes/domino/ingress_http.yml: -------------------------------------------------------------------------------- 1 | apiVersion: networking.k8s.io/v1 2 | kind: Ingress 3 | 4 | metadata: 5 | name: domino-http 6 | namespace: default 7 | 8 | annotations: 9 | nginx.ingress.kubernetes.io/rewrite-target: /$1 10 | 11 | spec: 12 | rules: 13 | - host: master.domino-lab.net 14 | http: 15 | paths: 16 | - path: / 17 | pathType: Prefix 18 | backend: 19 | service: 20 | name: domino-http 21 | port: 22 | number: 80 23 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/linux_repositories/ubuntu_noble.sources_hetzner: -------------------------------------------------------------------------------- 1 | # Hetzner Ubuntu 24.04 LTS (Noble) repositories 2 | 3 | Types: deb 4 | URIs: http://mirror.hetzner.com/ubuntu/packages 5 | Suites: noble noble-updates noble-backports 6 | Components: main universe restricted multiverse 7 | Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg 8 | 9 | Types: deb 10 | URIs: http://mirror.hetzner.com/ubuntu/security 11 | Suites: noble-security 12 | Components: main universe restricted multiverse 13 | Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg 14 | 15 | -------------------------------------------------------------------------------- /docs/_includes/yewtube.html: -------------------------------------------------------------------------------- 1 |
2 | 5 |
6 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/domino14_install.properties: -------------------------------------------------------------------------------- 1 | USER_INSTALL_DIR=/opt/hcl/domino 2 | IA_IS_PARTITION=0 3 | USER_INSTALL_DATA_DIR=/local/notesdata 4 | IA_USERNAME=notes 5 | IA_GROUPNAME=notes 6 | IA_NUMBER_PARTITION=1 7 | USER_MAGIC_FOLDER_1=/local/notesdata 8 | 9 | USER_INPUT_CONSOLE_RESULTS=\"Manual\",\"\",\"\" 10 | USER_INPUT_RESULT_1=\"NO\" 11 | 12 | CHOSEN_FEATURE_LIST=Domino,Help 13 | CHOSEN_INSTALL_FEATURE_LIST=Domino,Help 14 | CHOSEN_INSTALL_SET= 15 | 16 | -fileOverwrite_/opt/hcl/domino/notes/14000000/linux/_HCL Domino_installation/Change HCL Domino Installation.lax=Yes 17 | 18 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/domino14_ontime_install.properties: -------------------------------------------------------------------------------- 1 | USER_INSTALL_DIR=/opt/hcl/domino 2 | IA_IS_PARTITION=0 3 | USER_INSTALL_DATA_DIR=/local/notesdata 4 | IA_USERNAME=notes 5 | IA_GROUPNAME=notes 6 | IA_NUMBER_PARTITION=1 7 | USER_MAGIC_FOLDER_1=/local/notesdata 8 | 9 | USER_INPUT_CONSOLE_RESULTS=\"Manual\",\"\",\"\" 10 | USER_INPUT_RESULT_1=\"NO\" 11 | 12 | CHOSEN_FEATURE_LIST=Domino,OnTime,Help 13 | CHOSEN_INSTALL_FEATURE_LIST=Domino,OnTime,Help 14 | CHOSEN_INSTALL_SET= 15 | 16 | -fileOverwrite_/opt/hcl/domino/notes/14000000/linux/_HCL Domino_installation/Change HCL Domino Installation.lax=Yes 17 | 18 | -------------------------------------------------------------------------------- /lab/kubernetes/domino/create_registry_secret.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | log_error_exit() 4 | { 5 | echo $@ 6 | exit 1 7 | } 8 | 9 | if [ -z "$LAB_REGISTRY_HOST" ]; then 10 | log_error_exit "No registry host specified" 11 | fi 12 | 13 | if [ -z "$LAB_REGISTRY_USER" ]; then 14 | log_error_exit "No registry user specified" 15 | fi 16 | 17 | if [ -z "$LAB_REGISTRY_PASSWORD" ]; then 18 | log_error_exit "No registry password specified" 19 | fi 20 | 21 | kubectl create secret docker-registry --namespace default regcred --docker-server=$LAB_REGISTRY_HOST --docker-username=$LAB_REGISTRY_USER --docker-password=$LAB_REGISTRY_PASSWORD 22 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/domino14_full_install.properties: -------------------------------------------------------------------------------- 1 | USER_INSTALL_DIR=/opt/hcl/domino 2 | IA_IS_PARTITION=0 3 | USER_INSTALL_DATA_DIR=/local/notesdata 4 | IA_USERNAME=notes 5 | IA_GROUPNAME=notes 6 | IA_NUMBER_PARTITION=1 7 | USER_MAGIC_FOLDER_1=/local/notesdata 8 | 9 | USER_INPUT_CONSOLE_RESULTS=\"Manual\",\"\",\"\" 10 | USER_INPUT_RESULT_1=\"NO\" 11 | 12 | CHOSEN_FEATURE_LIST=Domino,Nomad,Verse,OnTime,Help 13 | CHOSEN_INSTALL_FEATURE_LIST=Domino,Nomad,Verse,OnTime,Help 14 | CHOSEN_INSTALL_SET= 15 | 16 | -fileOverwrite_/opt/hcl/domino/notes/14000000/linux/_HCL Domino_installation/Change HCL Domino Installation.lax=Yes 17 | 18 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_squid/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ############################################################################ 4 | # Copyright Nash!Com, Daniel Nashed 2023 - APACHE 2.0 see LICENSE 5 | ############################################################################ 6 | 7 | # This script is the main entry point for the SQUID container. 8 | # The entry point is invoked by the container run-time to start SQUID. 9 | 10 | # Set more paranoid umask to ensure files can be only read by user 11 | umask 0077 12 | 13 | 14 | echo 15 | echo 16 | echo Squid Server 17 | echo ------------------------------------------ 18 | squid --version 19 | echo ------------------------------------------ 20 | echo 21 | echo 22 | 23 | squid -N 24 | 25 | exit 0 26 | 27 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/startscript/domino.cfg: -------------------------------------------------------------------------------- 1 | { 2 | "index": { 3 | "cfg": [ 4 | { 5 | "name": ".", 6 | "index": "/onetouch", 7 | "URL": "" 8 | } 9 | ] 10 | }, 11 | 12 | "onetouch": { 13 | "cfg": [ 14 | { 15 | "name": "First server JSON", 16 | "oneTouchJSON": "/opt/nashcom/startscript/OneTouchSetup/first_server.json", 17 | "oneTouchENV": "/opt/nashcom/startscript/OneTouchSetup/first_server.env" 18 | }, 19 | { 20 | "name": "Additional server JSON", 21 | "oneTouchJSON": "/opt/nashcom/startscript/OneTouchSetup/additional_server.json", 22 | "oneTouchENV": "/opt/nashcom/startscript/OneTouchSetup/additional_server.env" 23 | } 24 | ] 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /docs/concept_license.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Software Licenses" 4 | nav_order: 9 5 | parent: "Concept & Overview" 6 | description: "Software Licenses" 7 | has_children: false 8 | --- 9 | 10 | ## GitHub Project License 11 | 12 | The Dockerfiles and associated scripts are licensed under the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0.html). 13 | 14 | ## HCL Software License 15 | 16 | HCL Domino and add-on products are commercial software - The software licenses agreement does not permit further distribution of the docker image that was built using this script! 17 | Refer to the [HCL license home page](https://www.hcl-software.com/resources/license-agreements) for detailed information about the HCL Domino and add-on product license terms. 18 | 19 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | 2 | Source code contributions are currently not accepted to this repository. 3 | 4 | ## Generate requirements 5 | 6 | - Never store credentials in the source code, always pass in as environment variables. 7 | 8 | 9 | ## Shell script code 10 | 11 | - Use two spaces for indentation 12 | - Try to use similar style used in existing scripts 13 | 14 | ### Reporting a bug 15 | 16 | Please raise any bug reports on the project's [issue tracker](https://github.com/HCL-TECH-SOFTWARE/domino-container/issues). 17 | Be sure to search the list to see if your issue has already been raised. 18 | 19 | A good bug report is one that make it easy for us to understand what you were trying to do and what went wrong. 20 | Also, provide as much context as possible so we can try to recreate the issue. 21 | 22 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/startscript/OneTouchSetup/first_server.env: -------------------------------------------------------------------------------- 1 | 2 | # Domino first server setup 3 | SERVERSETUP_SERVER_TYPE=first 4 | SERVERSETUP_ADMIN_FIRSTNAME=John 5 | SERVERSETUP_ADMIN_LASTNAME=Doe 6 | SERVERSETUP_ADMIN_PASSWORD=my-secure-admin-password 7 | SERVERSETUP_ADMIN_IDFILEPATH=/local/notesdata/admin.id 8 | SERVERSETUP_SERVER_TITLE="Domino AdminServer" 9 | SERVERSETUP_SERVER_NAME=my-domino-server 10 | SERVERSETUP_NETWORK_HOSTNAME=my-domino-server.acme.com 11 | SERVERSETUP_ORG_CERTIFIERPASSWORD=my-secure-certifier-password 12 | SERVERSETUP_SERVER_DOMAINNAME=Acme 13 | SERVERSETUP_ORG_ORGNAME=Acme 14 | 15 | # Configuration 16 | SERVERSETUP_NOTESINI_SERVERTASKS=replica,router,update,amgr,adminp,http,certmgr 17 | SERVERSETUP_SECURITY_ACL_PROHIBITANONYMOUSACCESS=true 18 | SERVERSETUP_SECURITY_ACL_ADDLOCALDOMAINADMINS=true 19 | 20 | -------------------------------------------------------------------------------- /lab/kubernetes/k3s/k3s_fix_pvc_perm.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # The permissions the local provisioner sets are more restictive in the current versions. 4 | # The root of the volumes are always owned by root and only root as the owner has permissions. 5 | # Usually a provisioner allows to use fgroup to specify the group owning the mounted volume. 6 | # But this isn't inplemented in the simple local storage driver k3s uses. 7 | 8 | # An alternate way would be an init container to change the permissions. 9 | 10 | 11 | # Patch provioner's config map 12 | kubectl get -n kube-system cm/local-path-config -o yaml | sed 's/mkdir -m 0700/mkdir -m 0777/g' | kubectl apply -f - 13 | 14 | # Restart provisioner and get status 15 | kubectl rollout restart deploy/local-path-provisioner -n kube-system 16 | kubectl rollout status deploy/local-path-provisioner -n kube-system 17 | 18 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/startscript/OneTouchSetup/additional_server.env: -------------------------------------------------------------------------------- 1 | 2 | # Domino additional server setup 3 | SERVERSETUP_SERVER_TYPE=additional 4 | SERVERSETUP_ADMIN_CN="John Doe" 5 | SERVERSETUP_SERVER_IDFILEPATH=server.id 6 | SERVERSETUP_SERVER_TITLE="Domino 2nd server" 7 | SERVERSETUP_SERVER_NAME=my-2nd-domino-server 8 | SERVERSETUP_NETWORK_HOSTNAME=my-2nd-domino-servername.acme.com 9 | SERVERSETUP_SERVER_DOMAINNAME=Acme 10 | SERVERSETUP_ORG_ORGNAME=Acme 11 | SERVERSETUP_SECURITY_ACL_PROHIBITANONYMOUSACCESS=true 12 | SERVERSETUP_SECURITY_ACL_ADDLOCALDOMAINADMINS=true 13 | 14 | # Existing server to connect to during setup 15 | SERVERSETUP_EXISTINGSERVER_CN=my-domino-server 16 | SERVERSETUP_EXISTINGSERVER_HOSTNAMEORIP=my-domino-server.acme.com 17 | 18 | # Configuration 19 | SERVERSETUP_NOTESINI_SERVERTASKS=replica,router,update,amgr,adminp,http,certmgr 20 | 21 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_nginx/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ############################################################################ 4 | # Copyright Nash!Com, Daniel Nashed 2022 - APACHE 2.0 see LICENSE 5 | ############################################################################ 6 | 7 | # This script is the main entry point for the NGINX container. 8 | # The entry point is invoked by the container run-time to start NGINX. 9 | 10 | # Set more paranoid umask to ensure files can be only read by user 11 | umask 0077 12 | 13 | # Create log directory with owner nginx 14 | mkdir /tmp/nginx 15 | chown nginx:nginx /tmp/nginx 16 | 17 | echo 18 | echo 19 | echo NGINX Server 20 | echo ------------------------------------------ 21 | nginx -V 22 | echo ------------------------------------------ 23 | echo 24 | echo 25 | 26 | nginx -g 'daemon off;' 27 | 28 | exit 0 29 | 30 | -------------------------------------------------------------------------------- /docs/plantuml/projectstructure.plantuml: -------------------------------------------------------------------------------- 1 | @startwbs ProjectTree 2 | * **Domino Docker Container Project** 3 | ** <&globe> **Root** directory\nMain entry scripts 4 | *** **build.sh**\nmain build script 5 | *** **build.cfg**\ntemplate for build configration 6 | ** **dockerfiles**\nindiivdual docker files per product 7 | ***< **install_dir_common**\nCode used by all flavours 8 | *** **install_dir_domino**\nDomino **Base** image 9 | *** **install_dir_traveler**\nTraveler **AddOn** image 10 | *** **install_dir_volt**\nDomino Volt **AddOn** image 11 | ** **software**\nInventory of\navailable software 12 | ** **docs**\nProject documentation\nin GitHub markdown 13 | ** **lab**\nTutorials for practise 14 | ***< **setup**\nLab install scripts 15 | *** **docker**\nDocker workshop 16 | *** **kubernetes**\nKubernes lab 17 | ** **examples**\nSample configrations\nto get you going 18 | @endwbs 19 | -------------------------------------------------------------------------------- /dockerfiles/dockerfile_nginx: -------------------------------------------------------------------------------- 1 | ############################################################################ 2 | # Copyright Nash!Com, Daniel Nashed 2022 - APACHE 2.0 see LICENSE 3 | ############################################################################ 4 | 5 | ARG NGINX_BASE_IMAGE=registry.access.redhat.com/ubi9/ubi-minimal 6 | FROM $NGINX_BASE_IMAGE 7 | 8 | # External arguments with a default value 9 | ARG LinuxYumUpdate= 10 | ARG LocalInstallDir=/tmp/install 11 | 12 | USER root 13 | 14 | # Copy Install Files to container 15 | COPY install_dir_common $LocalInstallDir 16 | COPY install_dir_nginx $LocalInstallDir 17 | 18 | # Prepare environment 19 | # Update, Install required packages and run separate install script 20 | 21 | RUN $LocalInstallDir/install.sh && \ 22 | rm -rf $LocalInstallDir 23 | 24 | # Expose Ports HTTP HTTPS 25 | EXPOSE 80 443 26 | 27 | ENTRYPOINT ["/entrypoint.sh"] 28 | 29 | USER 1000 30 | -------------------------------------------------------------------------------- /dockerfiles/dockerfile_squid: -------------------------------------------------------------------------------- 1 | ############################################################################ 2 | # Copyright Nash!Com, Daniel Nashed 2023 - APACHE 2.0 see LICENSE 3 | ############################################################################ 4 | 5 | ARG SQUID_BASE_IMAGE=registry.access.redhat.com/ubi9/ubi-minimal 6 | FROM $SQUID_BASE_IMAGE 7 | 8 | # External arguments with a default value 9 | ARG LinuxYumUpdate= 10 | ARG LocalInstallDir=/tmp/install 11 | 12 | USER root 13 | 14 | # Copy Install Files to container 15 | COPY install_dir_common $LocalInstallDir 16 | COPY install_dir_squid $LocalInstallDir 17 | 18 | # Prepare environment 19 | # Update, Install required packages and run separate install script 20 | 21 | RUN $LocalInstallDir/install.sh && \ 22 | rm -rf $LocalInstallDir 23 | 24 | # Expose Ports HTTP HTTPS 25 | EXPOSE 3128 26 | 27 | ENTRYPOINT ["/entrypoint.sh"] 28 | 29 | USER 1000 30 | -------------------------------------------------------------------------------- /software/update_software_file: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ############################################################################ 4 | # Copyright Nash!Com, Daniel Nashed 2019, 2020 - APACHE 2.0 see LICENSE 5 | # Copyright IBM Corporation 2015, 2019 - APACHE 2.0 see LICENSE 6 | ############################################################################ 7 | 8 | SCRIPT_NAME=$0 9 | PARAM1=$1 10 | 11 | update_file() 12 | { 13 | SOURCE_FILE=$1 14 | TARGET_FILE=$2 15 | 16 | if [ ! -r "$SOURCE_FILE" ]; then 17 | echo "source file does not exist or is not readable" 18 | return 0 19 | fi 20 | 21 | if [ -e "$TARGET_FILE" ]; then 22 | cmp -s "$SOURCE_FILE" "$TARGET_FILE" 23 | if [ $? -eq 0 ]; then 24 | return 0 25 | fi 26 | fi 27 | 28 | echo "Updating [$TARGET_FILE]" 29 | cp -f "$SOURCE_FILE" "$TARGET_FILE" 30 | 31 | return 0 32 | } 33 | 34 | update_file software.txt ../dockerfiles/install_dir_common/software.txt 35 | 36 | 37 | -------------------------------------------------------------------------------- /docs/assets/images/svg/DominoIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /testing/makefile: -------------------------------------------------------------------------------- 1 | TARGET = nshver 2 | SOURCE= $(TARGET).cpp 3 | OBJECT = $(TARGET).o 4 | 5 | CC = g++ 6 | CCOPTS = -c -m64 7 | NOTESDIR = $(Notes_ExecDirectory) 8 | LINKOPTS = -o $(TARGET) 9 | 10 | INCDIR = $(LOTUS)/notesapi/include 11 | LIBS = -lnotes -lm -lpthread -lc -ldl -lresolv 12 | 13 | DEFINES = -DGCC3 -DGCC4 -fno-strict-aliasing -DGCC_LBLB_NOT_SUPPORTED -Wformat -Wall -Wcast-align -Wconversion -DUNIX -DLINUX -DLINUX86 -DND64 -DLINUX64 -DW -DLINUX86_64 -DDTRACE -DPTHREAD_KERNEL -D_REENTRANT -DUSE_THREADSAFE_INTERFACES -D_POSIX_THREAD_SAFE_FUNCTIONS -DHANDLE_IS_32BITS -DHAS_IOCP -DHAS_BOOL -DHAS_DLOPEN -DUSE_PTHREAD_INTERFACES -DLARGE64_FILES -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -DNDUNIX64 -DLONGIS64BIT -DPRODUCTION_VERSION -DOVERRIDEDEBUG -fPIC -Wno-write-strings 14 | 15 | 16 | $(TARGET): $(OBJECT) 17 | $(CC) $(LINKOPTS) $(OBJECT) -L$(NOTESDIR) -Wl,-rpath-link $(NOTESDIR) $(LIBS) 18 | 19 | $(OBJECT): $(SOURCE) 20 | $(CC) $(CCOPTS) $(DEFINES) -I$(INCDIR) $(SOURCE) 21 | 22 | clean: 23 | rm -f *.o 24 | rm -f ./$(TARGET) 25 | 26 | test: $(TARGET) 27 | ./$(TARGET) =/local/notesdata/notes.ini 28 | 29 | -------------------------------------------------------------------------------- /examples/domino/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.6' 2 | services: 3 | 4 | domino: 5 | 6 | image: hclcom/domino:latest 7 | container_name: domino-acme-01 8 | hostname: domino-acme-v12.acme.com 9 | stop_grace_period: 60s 10 | 11 | environment: 12 | SetupAutoConfigure: 1 13 | SERVERSETUP_SERVER_TYPE: first 14 | SERVERSETUP_ADMIN_FIRSTNAME: John 15 | SERVERSETUP_ADMIN_LASTNAME: Doe 16 | SERVERSETUP_ADMIN_PASSWORD: domino4ever 17 | SERVERSETUP_ADMIN_IDFILEPATH: admin.id 18 | SERVERSETUP_ORG_CERTIFIERPASSWORD: domino4ever 19 | SERVERSETUP_SERVER_DOMAINNAME: DominoDemo 20 | SERVERSETUP_ORG_ORGNAME: Domino-Demo 21 | SERVERSETUP_SERVER_NAME: domino-demo-v12 22 | SERVERSETUP_NETWORK_HOSTNAME: domino-acme-v12.acme.com 23 | LANG: en_US.UTF-8 24 | 25 | cap_add: 26 | - SYS_PTRACE 27 | 28 | ports: 29 | - 1352:1352 30 | - 80:80 31 | - 443:443 32 | 33 | volumes: 34 | - domino_vol:/local/notesdata 35 | 36 | volumes: 37 | 38 | domino_vol: 39 | name: domino_acme_01_notesdata 40 | external: false 41 | 42 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_squid/install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ############################################################################ 4 | # Copyright Nash!Com, Daniel Nashed 2022 - APACHE 2.0 see LICENSE 5 | ############################################################################ 6 | 7 | INSTALL_DIR=$(dirname $0) 8 | 9 | # Include helper functions 10 | 11 | . $INSTALL_DIR/script_lib.sh 12 | 13 | # --- Main Install Logic --- 14 | 15 | cd $INSTALL_DIR 16 | 17 | check_linux_update 18 | 19 | header "Installing required packages and adding user squid" 20 | 21 | if [ -e /etc/photon-release ]; then 22 | install_packages shadow 23 | else 24 | install_package shadow-utils 25 | fi 26 | 27 | useradd squid -U 28 | 29 | header "Installing Squid ..." 30 | 31 | install_package squid 32 | 33 | #cp squid.conf /etc/squid/squid.conf 34 | chmod 444 /etc/squid/squid.conf 35 | 36 | cp entrypoint.sh /entrypoint.sh 37 | chmod 555 /entrypoint.sh 38 | 39 | chown squid:squid /var/log/squid 40 | chown squid:squid /run 41 | 42 | cd / 43 | 44 | # Cleanup repository cache to save space 45 | clean_linux_repo_cache 46 | 47 | header "Successfully completed installation!" 48 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_nginx/install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ############################################################################ 4 | # Copyright Nash!Com, Daniel Nashed 2022 - APACHE 2.0 see LICENSE 5 | ############################################################################ 6 | 7 | INSTALL_DIR=$(dirname $0) 8 | 9 | # Include helper functions 10 | 11 | . $INSTALL_DIR/script_lib.sh 12 | 13 | # --- Main Install Logic --- 14 | 15 | cd $INSTALL_DIR 16 | 17 | check_linux_update 18 | 19 | header "Installing required packages and adding user nginx" 20 | 21 | if [ -e /etc/photon-release ]; then 22 | install_packages shadow 23 | else 24 | install_package shadow-utils 25 | fi 26 | 27 | useradd nginx -U 28 | 29 | header "Installing NGINX ..." 30 | 31 | install_package nginx 32 | 33 | cp nginx.conf /etc/nginx/nginx.conf 34 | chmod 444 /etc/nginx/nginx.conf 35 | setcap 'cap_net_bind_service=+ep' /usr/sbin/nginx 36 | 37 | cp entrypoint.sh /entrypoint.sh 38 | chmod 555 /entrypoint.sh 39 | 40 | chown nginx:nginx /var/log/nginx 41 | 42 | cd / 43 | 44 | # Cleanup repository cache to save space 45 | clean_linux_repo_cache 46 | 47 | header "Successfully completed installation!" 48 | -------------------------------------------------------------------------------- /start_script/we_have_moved.txt: -------------------------------------------------------------------------------- 1 | 2 | We've moved 3 | ----------- 4 | 5 | The Nash!Com Domino Start script has moved sources to a separate GitHub project. 6 | Those sources have been in the project for convenience and have never been actively used. 7 | 8 | The container project uses a tar file containing the start script as part of the deployment. 9 | With the current build script the start script is now pluggable and can be downloaded separately like any other install software. 10 | It is part of the software.txt directory and can be switched once new versions are released. 11 | 12 | You find the new git repository, the new documentation and the download here: 13 | 14 | 15 | GitHub Repository 16 | ----------------- 17 | 18 | https://github.com/nashcom/domino-startscript 19 | 20 | 21 | To clone the repository you can use the following git command in a directory outside this repo (e.g. cd ..) 22 | 23 | git clone https://github.com/nashcom/domino-startscript.git 24 | 25 | 26 | Documentation 27 | ------------- 28 | 29 | https://nashcom.github.io/domino-startscript/ 30 | 31 | 32 | Release Download 33 | ---------------- 34 | 35 | https://github.com/nashcom/domino-startscript/releases 36 | 37 | 38 | -------------------------------------------------------------------------------- /examples/domino/README.md: -------------------------------------------------------------------------------- 1 | # Docker-Compose Examples 2 | 3 | Docker Compose is a separate component (not shipped wth Docker CE). Docker Compose is a conventient way to define one or multiple containers. Start and stop, creation of required components like volumes or networks etc. are automatically performed by Docker Compose. 4 | 5 | It is also a good practice to use Docker Compose to be prepared for Kubernetes (K8s) which is also leveraging yml files to describe "pod" created in "services". 6 | 7 | See details and installation instructions here https://docs.docker.com/compose/. 8 | 9 | This dicrectroy contains examples for docker compose files for images built with this project. 10 | 11 | 12 | ## How to use the examples 13 | 14 | The default docker-compose.yml file can be just started via the "up" command. 15 | To run the server in background, add the -d option. 16 | 17 | ```bash 18 | docker-compose up -d 19 | ``` 20 | 21 | Other examples can be started specifying the yml file explicitly. 22 | 23 | ```bash 24 | docker-compose -f myimage.yml up -d 25 | ``` 26 | 27 | To stop a service you specify the corresponding "down" command. 28 | 29 | ```bash 30 | docker-compose -f myimage.yml down 31 | ``` 32 | 33 | 34 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | 2 | worker_processes auto; 3 | error_log /tmp/nginx/error.log; 4 | pid /tmp/nginx/nginx.pid; 5 | 6 | events { 7 | worker_connections 1024; 8 | } 9 | 10 | http { 11 | log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 12 | '$status $body_bytes_sent "$http_referer" ' 13 | '"$http_user_agent" "$http_x_forwarded_for"'; 14 | 15 | access_log /tmp/nginx/access.log main; 16 | client_body_temp_path /tmp/nginx/client_body; 17 | proxy_temp_path /tmp/nginx; 18 | fastcgi_temp_path /tmp/nginx/fastcgi; 19 | uwsgi_temp_path /tmp/nginx/uwsgi; 20 | scgi_temp_path /tmp/nginx/scgi_tmp; 21 | 22 | sendfile on; 23 | tcp_nopush on; 24 | tcp_nodelay on; 25 | keepalive_timeout 65; 26 | types_hash_max_size 4096; 27 | 28 | include /etc/nginx/mime.types; 29 | default_type application/octet-stream; 30 | 31 | server { 32 | listen 80; 33 | listen [::]:80; 34 | server_name _; 35 | root /usr/share/nginx/html; 36 | } 37 | 38 | include /etc/nginx/conf.d/*.conf; 39 | } 40 | 41 | -------------------------------------------------------------------------------- /docs/reference_startscript.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Domino Start Script" 4 | nav_order: 3 5 | parent: "Reference" 6 | description: "Domino Start Script" 7 | has_children: false 8 | --- 9 | 10 | # Domino Start Script for Docker Containers 11 | 12 | ## Introduction 13 | 14 | This project leverages the Nash!Com Domino starts script inside the container to run and maintain the container. 15 | 16 | The start script is separate [GitHub project](https://github.com/nashcom/domino-startscript) 17 | with it's own [documentation](https://nashcom.github.io/domino-startscript/). 18 | 19 | ## How the start script is used 20 | 21 | The `entrypoint.sh` script is started when the container is launched. 22 | This script takes care of managing the lifetime of the container and invokes the start script to run the Domino server. 23 | 24 | Once the Domino server is started with the start script, you can leverage the `domino` command inside the container to interact with the Domino server. 25 | 26 | One very important and popular command is the `domino console` command, providing a live console to a Domino server. 27 | 28 | For a complete reference check [Domino Start Script Commands](https://nashcom.github.io/domino-startscript/startscript/commands/) -------------------------------------------------------------------------------- /dockerfiles/dockerfile_leap: -------------------------------------------------------------------------------- 1 | 2 | ############################################################################ 3 | # Copyright Nash!Com, Daniel Nashed 2019, 2022 - APACHE 2.0 see LICENSE 4 | ############################################################################ 5 | 6 | ARG BASE_IMAGE=registry.access.redhat.com/ubi9/ubi-minimal:latest 7 | FROM $BASE_IMAGE 8 | 9 | # External arguments with a default value 10 | ARG LinuxYumUpdate= 11 | ARG DownloadFrom= 12 | ARG SOFTWARE_REPO_IP= 13 | ARG PROD_NAME= 14 | ARG PROD_VER= 15 | ARG PROD_DOWNLOAD_FILE= 16 | ARG LocalInstallDir=/tmp/install 17 | ARG SPECIAL_CURL_ARGS= 18 | 19 | USER root 20 | 21 | # Copy Install Files to container 22 | COPY install_dir_common $LocalInstallDir 23 | COPY install_dir_leap $LocalInstallDir 24 | 25 | # Prepare environment for Domino 26 | # Update, Install required packages and run separate install script 27 | 28 | RUN $LocalInstallDir/install.sh && \ 29 | rm -rf $LocalInstallDir 30 | 31 | HEALTHCHECK --interval=60s --timeout=10s CMD /healthcheck.sh 32 | 33 | # Expose Ports NRPC SMTP HTTP POP3 IMAP LDAP HTTPS LDAPS IMAPS POP3S DIIOP DIIOPS 34 | EXPOSE 1352 25 80 110 143 389 443 636 993 995 2050 63148 63149 35 | 36 | ENTRYPOINT ["/entrypoint.sh"] 37 | 38 | USER 1000 39 | 40 | -------------------------------------------------------------------------------- /dockerfiles/dockerfile_volt: -------------------------------------------------------------------------------- 1 | 2 | ############################################################################ 3 | # Copyright Nash!Com, Daniel Nashed 2019, 2022 - APACHE 2.0 see LICENSE 4 | ############################################################################ 5 | 6 | ARG BASE_IMAGE=registry.access.redhat.com/ubi9/ubi-minimal:latest 7 | FROM $BASE_IMAGE 8 | 9 | # External arguments with a default value 10 | ARG LinuxYumUpdate= 11 | ARG DownloadFrom= 12 | ARG SOFTWARE_REPO_IP= 13 | ARG PROD_NAME= 14 | ARG PROD_VER= 15 | ARG PROD_DOWNLOAD_FILE= 16 | ARG LocalInstallDir=/tmp/install 17 | ARG SPECIAL_CURL_ARGS= 18 | 19 | USER root 20 | 21 | # Copy Install Files to container 22 | COPY install_dir_common $LocalInstallDir 23 | COPY install_dir_volt $LocalInstallDir 24 | 25 | # Prepare environment for Domino 26 | # Update, Install required packages and run separate install script 27 | 28 | RUN $LocalInstallDir/install.sh && \ 29 | rm -rf $LocalInstallDir 30 | 31 | HEALTHCHECK --interval=60s --timeout=10s CMD /healthcheck.sh 32 | 33 | # Expose Ports NRPC SMTP HTTP POP3 IMAP LDAP HTTPS LDAPS IMAPS POP3S DIIOP DIIOPS 34 | EXPOSE 1352 25 80 110 143 389 443 636 993 995 2050 63148 63149 35 | 36 | ENTRYPOINT ["/entrypoint.sh"] 37 | 38 | USER 1000 39 | 40 | -------------------------------------------------------------------------------- /docs/dominoleap.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Domino Leap" 4 | nav_order: 5 5 | parent: "Concept & Overview" 6 | description: "Domino Leap" 7 | has_children: false 8 | --- 9 | 10 | # Domino Leap 11 | 12 | [HCL Domino Leap](https://www.hcl-software.com/domino/offerings/domino-leap) is a no-code capability that makes it easy to develop powerful, secure, and enterprise-grade workflow-based applications. While it runs on Domino, you don’t need any specialized Domino or IT skills. 13 | 14 | 15 | Domino Leap used to be a separate image build on top the Domino image. 16 | Beginning with Domino 14, it is now available as an build options for the standard Domino image and can be combined with other add-ons like Traveler or the REST API. 17 | 18 | The separate add-on image build remains to be available for now. 19 | 20 | To build an image including Domino Leap, just specify the `-leap` build option. 21 | 22 | ``` 23 | ./build domino -leap 24 | ``` 25 | 26 | The build script automatically determines the latest version. 27 | An earlier version can be specified explicitly via e.g. `--leap=1.1.2` 28 | 29 | 30 | For details Domino Leap administration refer to the [Domino Leap documentation](https://help.hcltechsw.com/domino-leap/welcome/index.html). 31 | 32 | -------------------------------------------------------------------------------- /dockerfiles/dockerfile_safelinx: -------------------------------------------------------------------------------- 1 | ############################################################################ 2 | # Copyright Nash!Com, Daniel Nashed 2022 - APACHE 2.0 see LICENSE 3 | ############################################################################ 4 | 5 | ARG BASE_IMAGE=registry.access.redhat.com/ubi9/ubi-minimal:latest 6 | FROM $BASE_IMAGE 7 | 8 | # External arguments with a default value 9 | ARG LinuxYumUpdate= 10 | ARG DownloadFrom= 11 | ARG SOFTWARE_REPO_IP= 12 | ARG PROD_NAME= 13 | ARG PROD_VER= 14 | ARG PROD_DOWNLOAD_FILE= 15 | ARG NOMADWEB_VERSION= 16 | ARG MYSQL_INSTALL= 17 | ARG MSSQL_INSTALL= 18 | ARG LocalInstallDir=/tmp/install 19 | ARG SPECIAL_CURL_ARGS= 20 | 21 | USER root 22 | 23 | # Copy Install Files to container 24 | COPY install_dir_common $LocalInstallDir 25 | COPY install_dir_safelinx $LocalInstallDir 26 | 27 | # Prepare environment for Domino 28 | # Update, Install required packages and run separate install script 29 | 30 | RUN $LocalInstallDir/install_linux.sh && \ 31 | $LocalInstallDir/install.sh && \ 32 | rm -rf $LocalInstallDir 33 | 34 | HEALTHCHECK --interval=60s --timeout=10s CMD /healthcheck.sh 35 | 36 | # Expose Ports HTTP HTTPS SafeLinx Admin/AdminSSL/Monitoring? 37 | EXPOSE 80 443 9555 9559 9557 8889 38 | 39 | ENTRYPOINT ["/entrypoint.sh"] 40 | 41 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/linux_repositories/README.md: -------------------------------------------------------------------------------- 1 | 2 | # Use a custom mirror for Ubuntu and Debian packages 3 | 4 | In case you or your provider has an Ubuntu APT mirror, this file allows to pass the repository to the build container. 5 | The build container replaces the repository, before installing the packages. 6 | Those repositories are only supported for certain platforms and code streams, because they need to be tested. 7 | 8 | The functionality should work for corporate mirrors and also for provider mirrors. 9 | Below you find the Ubnuntu and Debian mirrors from Hetzner which only work when building on Hetzner infrastructure. 10 | They are a good example how a mirror file should look like. 11 | 12 | 13 | ## Hetzner Ubuntu 24.04 (Noble) 14 | 15 | When running container builds on Hetzner servers, copy the following file to `ubuntu_noble.sources` in the custom directory one level up. 16 | The file contains Ubuntu Noble APT repositories as a HTTP resource. 17 | 18 | ``` 19 | ubuntu_noble.sources_hetzner 20 | ``` 21 | 22 | 23 | ## Debian 12 (Bookworm) 24 | 25 | When running container builds on Hetzner servers, copy the following file to `debian_bookworm.sources`. 26 | The file contains Debian 12 Bookworm APT repositories as a HTTP resource. 27 | 28 | ``` 29 | debian_bookworm.sources_hetzner 30 | ``` 31 | 32 | -------------------------------------------------------------------------------- /dockerfiles/dockerfile_traveler: -------------------------------------------------------------------------------- 1 | ############################################################################ 2 | # Copyright Nash!Com, Daniel Nashed 2019, 2022 - APACHE 2.0 see LICENSE 3 | # Copyright IBM Corporation 2015, 2019 - APACHE 2.0 see LICENSE 4 | ############################################################################ 5 | 6 | ARG BASE_IMAGE=registry.access.redhat.com/ubi9/ubi-minimal:latest 7 | FROM $BASE_IMAGE 8 | 9 | # External arguments with a default value 10 | ARG LinuxYumUpdate= 11 | ARG DownloadFrom= 12 | ARG SOFTWARE_REPO_IP= 13 | ARG PROD_NAME= 14 | ARG PROD_VER= 15 | ARG PROD_DOWNLOAD_FILE= 16 | ARG LocalInstallDir=/tmp/install 17 | ARG SPECIAL_CURL_ARGS= 18 | 19 | USER root 20 | 21 | # Copy Install Files to container 22 | COPY install_dir_common $LocalInstallDir 23 | COPY install_dir_traveler $LocalInstallDir 24 | 25 | # Prepare environment for Domino 26 | # Update, Install required packages and run separate install script 27 | 28 | RUN $LocalInstallDir/install.sh && \ 29 | rm -rf $LocalInstallDir 30 | 31 | HEALTHCHECK --interval=60s --timeout=10s CMD /healthcheck.sh 32 | 33 | # Expose Ports NRPC SMTP HTTP POP3 IMAP LDAP HTTPS LDAPS IMAPS POP3S Traveler-HA DIIOP DIIOPS 34 | EXPOSE 1352 25 80 110 143 389 443 636 993 995 2050 50125 50126 63148 63149 35 | 36 | ENTRYPOINT ["/entrypoint.sh"] 37 | 38 | USER 1000 39 | 40 | -------------------------------------------------------------------------------- /lab/kubernetes/domino/api/kapi.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | CURL_OPTIONS=-ks 4 | 5 | if [ -z "$NAMESPACE" ]; then 6 | NAMESPACE=default 7 | fi 8 | 9 | if [ -z "$SERVICE_ACCOUNT" ]; then 10 | SERVICE_ACCOUNT=domino-admin 11 | fi 12 | 13 | if [ -z "$APISERVER" ]; then 14 | APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}') 15 | fi 16 | 17 | if [ -z "$TOKEN" ]; then 18 | TOKEN=$(cat $SERVICE_ACCOUNT.jwt) 19 | fi 20 | 21 | echo "API Server: $APISERVER" 22 | 23 | echo 24 | echo "------------------------------------------------------------------------------------------" 25 | curl $CURL_OPTIONS $APISERVER/api --header "Authorization: Bearer $TOKEN" 26 | echo 27 | echo "------------------------------------------------------------------------------------------" 28 | echo 29 | 30 | curl $CURL_OPTIONS --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api/v1/namespaces/$NAMESPACE/pods/domino12 > api_domino12.log 31 | 32 | curl $CURL_OPTIONS --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api/v1/namespaces/$NAMESPACE/persistentvolumeclaims > api_pvc.log 33 | 34 | curl "$CURL_OPTIONS" -H "Authorization: Bearer ${TOKEN}" -H 'Accept: application/json' -H 'Content-Type: application/json' -X POST ${APISERVER}/api/v1/namespaces/$NAMESPACE/persistentvolumeclaims -d @pvc.json > api_pvc_create.log 35 | 36 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/create_keyring.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ############################################################################ 4 | # Copyright Nash!Com, Daniel Nashed 2019, 2020 - APACHE 2.0 see LICENSE 5 | # Copyright IBM Corporation 2015, 2019 - APACHE 2.0 see LICENSE 6 | ############################################################################ 7 | 8 | # Create keyring file and import certificates 9 | # $1 = PEM File 10 | # $2 = keyring file (default: keyfile.kyr) 11 | # $3 = keyring password (default: random) 12 | 13 | if [ -z "$1" ]; then 14 | echo 15 | echo "No PEM file specified!" 16 | echo 17 | exit 1 18 | fi 19 | 20 | LOTUS=/opt/hcl/domino 21 | PEM_FILE=$(readlink -f "$1") 22 | KEYRING_FILE="$2" 23 | KEYRING_PASSWORD="$3" 24 | 25 | cd /local/notesdata 26 | 27 | if [ -z "$KEYRING_FILE" ]; then 28 | KEYRING_FILE=keyfile.kyr 29 | fi 30 | 31 | if [ -e "$KEYRING_FILE" ]; then 32 | echo "Removing existing keyring [$KEYRING_FILE]" 33 | rm -f "$KEYRING_FILE" 34 | fi 35 | 36 | if [ -z "$KEYRING_PASSWORD" ]; then 37 | echo "Generating random keyring-file password" 38 | KEYRING_PASSWORD=$(sha1sum /local/notesdata/notes.ini) 39 | fi 40 | 41 | $LOTUS/bin/kyrtool create -k "$KEYRING_FILE" -p "$KEYRING_PASSWORD" 42 | $LOTUS/bin/kyrtool import all -k "$KEYRING_FILE" -i "$PEM_FILE" 43 | 44 | echo 45 | echo "Successfully created/updated [$KEYRING_FILE] with [$PEM_FILE]" 46 | echo 47 | 48 | -------------------------------------------------------------------------------- /docs/plantuml/containerstartscript.plantuml: -------------------------------------------------------------------------------- 1 | @startuml 2 | state "**Admin**" as Admin 3 | Admin : bash 4 | 5 | state "**domino_container**" as DominoContainerScript 6 | 7 | DominoContainerScript: dir: /opt/nashcom/start_script 8 | 9 | state "**domino_container (cfg)**" as DominoContainerCfg 10 | DominoContainerCfg: /etc/sysconfig/ 11 | 12 | state "**Docker Daemon**" as DockerDaemon 13 | DockerDaemon : ( or Podman etc. ) 14 | 15 | state "**Docker Container**" as Container { 16 | 17 | state "**entrypoint.sh**" as Entrypoint 18 | 19 | state "**docker_prestart.sh**" as DockerPrestartSh 20 | state "**domino_install_data_copy.sh**" as DominoInstallDataCopySh 21 | 22 | state "**Bash**" as ContainerBash 23 | 24 | state "**rc_domino_script**" as RcDominoScript 25 | RcDominoScript : dir: /opt/nashcom/startscript 26 | 27 | state "**rc_domino_config**" as RcDominoConfig 28 | RcDominoConfig : dir: /etc/sysconfig 29 | 30 | state "**Domino Server**" as DominoServer 31 | DominoServer : /local/notesdata\nnotes.ini\nNSF... 32 | 33 | } 34 | 35 | Admin --> DominoContainerScript : Invoke 36 | DominoContainerScript --> DockerDaemon : Start/Stop/Cmd 37 | DominoContainerCfg -> DominoContainerScript : Read 38 | DockerDaemon --> Entrypoint : Start/Stop 39 | DockerDaemon --> ContainerBash : Exec 40 | 41 | Entrypoint --> RcDominoScript : Start/Stop 42 | Entrypoint --> DockerPrestartSh : Setup 43 | Entrypoint --> DominoInstallDataCopySh : Setup/Update(Run) 44 | RcDominoConfig -> RcDominoScript : Read 45 | RcDominoScript --> DominoServer : Start/Console 46 | ContainerBash --> RcDominoScript : Invoke 47 | @enduml -------------------------------------------------------------------------------- /software/README.md: -------------------------------------------------------------------------------- 1 | ## Description 2 | 3 | This directory is used to host the installation packages that will be used inside of a Docker image. 4 | 5 | All packages required for building the corresponding image should be located in this folder without using any sub folders. You must download the software before building the image(s). File names are important so please keep the default file names. 6 | 7 | ## Software Repository Server 8 | The software repository server is used by the build scripts to download IBM software packages rather than adding them to the image. It is not required to start or stop this repository server manually, all actions are taken care of in the build scripts. However, we are providing the script ```software-repo.sh``` for manual handling in case its required. 9 | 10 | ### Hosting this software repository 11 | 12 | To build the Docker images an NGINX server will be serving this folder so that it can be used as a source for automated software downloads. It is possible to host this repository elsewhere in your corporate environment as long as it is accessible via HTTP and the folder structure and file names remain the same. 13 | 14 | ### Using the Software Repository Server 15 | 16 | Use the script ```software-repo.sh``` to start or stop an NGINX container which will host this directory for HTTP access. The script also allows to obtain the IP address of the container using the command ```software-repo.sh ip``` 17 | 18 | When the software repository server is no longer needed you can shut down and remove the container using the command ```software-repo.sh stopremove``` 19 | 20 | ## What to download 21 | 22 | This directory is supposed to contain the original downloaded files from [My HCLSoftware Portal](https://my.hcltechsw.com/). 23 | Make sure to keep the file name unchanged otherwise build scripts will not work. 24 | The build script shows missing download packages and points you to the right download location. 25 | 26 | -------------------------------------------------------------------------------- /dockerfiles/dockerfile_hcl: -------------------------------------------------------------------------------- 1 | ############################################################################ 2 | # Copyright Nash!Com, Daniel Nashed 2019, 2025 - APACHE 2.0 see LICENSE 3 | # Copyright IBM Corporation 2015, 2019 - APACHE 2.0 see LICENSE 4 | ############################################################################ 5 | 6 | # Build a base image for Linux with all required packages 7 | FROM registry.access.redhat.com/ubi10/ubi:10.0 AS linux_image 8 | 9 | # External arguments with a default value 10 | ARG LinuxYumUpdate= 11 | ARG DownloadFrom= 12 | ARG SOFTWARE_REPO_IP= 13 | ARG PROD_NAME= 14 | ARG PROD_VER= 15 | ARG PROD_FP= 16 | ARG PROD_HF= 17 | ARG PROD_DOWNLOAD_FILE= 18 | ARG PROD_FP_DOWNLOAD_FILE= 19 | ARG PROD_HF_DOWNLOAD_FILE= 20 | ARG DominoResponseFile=domino14_full_install.properties 21 | ARG LocalInstallDir=/tmp/install 22 | ARG DominoUserID= 23 | ARG DOMINO_LANG= 24 | ARG DOCKER_TZ= 25 | ARG SPECIAL_CURL_ARGS= 26 | ARG BUILD_SCRIPT_OPTIONS= 27 | ARG VERSE_VERSION= 28 | ARG CAPI_VERSION= 29 | ARG STARTSCRIPT_VER= 30 | ARG K8S_RUNAS_USER_SUPPORT= 31 | ARG CONTAINER_INSTALLER=hcl 32 | 33 | USER root 34 | 35 | # Copy install files to container 36 | COPY install_dir_common $LocalInstallDir 37 | COPY install_dir_domino $LocalInstallDir 38 | 39 | # Run install script and cleanup. Linux packages installed in separate layer first. 40 | RUN $LocalInstallDir/install_linux.sh 41 | 42 | # Create final Domino image from prepared Linux image 43 | FROM linux_image AS domino_image 44 | 45 | # Install Domino in a layer separate from Linux packages and updates 46 | RUN $LocalInstallDir/install_domino.sh && \ 47 | rm -rf $LocalInstallDir 48 | 49 | HEALTHCHECK --interval=60s --timeout=10s CMD /healthcheck.sh 50 | 51 | # Expose Ports NRPC SMTP HTTP POP3 IMAP LDAP HTTPS LDAPS IMAPS POP3S DOMINO-REMOTE-SETUP DIIOP DIIOPS 52 | EXPOSE 1352 25 80 110 143 389 443 636 993 995 2050 8585 63148 63149 53 | 54 | ENTRYPOINT ["/entrypoint.sh"] 55 | 56 | USER 1000 57 | 58 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/custom/README.md: -------------------------------------------------------------------------------- 1 | 2 | # Custom resources for Linux 3 | 4 | 5 | This directory contains 6 | 7 | ## Custom repository mirror configuration 8 | 9 | 10 | To customize the mirror list for current Ubuntu and Debian, you can specify a custom repository file. 11 | 12 | 13 | ### Ubuntu 24.04 (Noble) 14 | 15 | ``` 16 | ubuntu_noble.sources 17 | ``` 18 | 19 | ### Debian 12 (Bookworm) 20 | 21 | ``` 22 | debian_bookworm.sources 23 | ``` 24 | 25 | 26 | ## Custom Linux tusted root certificate 27 | 28 | Linux comes with a pre-defined list of trusted root certificates. 29 | To allow to use corporate trusted root, add a PEM formatted certificate file with the following name. 30 | The container image built adds the root certificate to the container images trusted roots. 31 | The root is used for example for OpenSSL and curl. 32 | 33 | ``` 34 | trusted_root.pem 35 | ``` 36 | 37 | 38 | # Custom Domino tusted root certificate 39 | 40 | Domino uses multiple trust stores: 41 | 42 | - **/local/notesdata/cacert.pem** used for HTTP Requests in Lotus Script and other backend code using curl 43 | - **Domino JVM trust store** used by Java 44 | - Domino Directory Trusted roots 45 | - certstore.nsf Trusted roots 46 | 47 | 48 | names.nsf and certstore.nsf can be managed in Domino and is replicated within the domain. 49 | The PEM file and JVM trusted roots can be updated by providing a PEM file with the following name: 50 | 51 | ``` 52 | trusted_domino_root.pem 53 | ``` 54 | 55 | 56 | # Append entries to java.policy 57 | 58 | 59 | If the file java.policy is present, append the entries to the existing java.policy in the existing Java policy file 60 | 61 | ``` 62 | java.policy 63 | ``` 64 | 65 | 66 | 67 | # Custom Domino Setup Logo 68 | 69 | To replace the Domino Setup logo place a SVG file into the custom directory. 70 | The standard Domino logo is placed into the domsetup web root. 71 | 72 | ``` 73 | domsetup-logo.svg 74 | ``` 75 | 76 | 77 | -------------------------------------------------------------------------------- /docs/plantuml/repository-setup.plantuml: -------------------------------------------------------------------------------- 1 | @startuml 2 | state "Community submission" as ComSubmit 3 | state "HCL submission" as HclSubmit 4 | state "Nash!Com Start Script" as StartScript 5 | 6 | state "**Community repository**" as ComRepo { 7 | state "**Develop**" as ComDevRepo 8 | state "**Main**" as ComMainRepo 9 | 10 | ComDevRepo: Active develop branch 11 | ComMainRepo: Stable main branch 12 | } 13 | 14 | state "**Customer environment**" as CustomerEnv { 15 | state "**Local Repo**" as LocalRepo 16 | state "HCL WebKit" as HclWebKit 17 | HclWebKit: MHS download 18 | state "**Community image**" as ComImage 19 | state "**Main**" as ComMainRepo 20 | } 21 | 22 | state "**HCL environment**" as HCLEnv { 23 | 24 | state "**HCL repository**" as HclRepo { 25 | state "**community-main**" as HclDevRepo 26 | state "**Main**" as HclMainRepo 27 | HclMainRepo: + hcl-local / jenkins files 28 | } 29 | 30 | state "**HCL pull request**" as HclPull { 31 | HclPull: e.g hcl-local change 32 | } 33 | 34 | state "**HCL official HCL image**" as HclImage 35 | state "HCL WebKit daily" as HclDailyWebKit 36 | state "**HCL daily image**" as HCLDailyImage 37 | state "HCL WebKit(Gold)" as HclWebKitGold 38 | } 39 | 40 | StartScript --> ComDevRepo : Nash!Com contribution 41 | 42 | ComSubmit --> ComDevRepo : Approved by community team 43 | ComDevRepo --> ComMainRepo : Merged by community team 44 | 45 | ComMainRepo --> HclDevRepo : Synced by HCL 46 | HclDevRepo --> HclMainRepo : Merged by CFIUS approver 47 | HclSubmit --> ComDevRepo : HCL contribution 48 | HclMainRepo --> HclImage : Build by build room 49 | HclWebKit --> ComImage : Used to build image 50 | 51 | HclMainRepo -> HCLDailyImage : Build by build room 52 | HclDailyWebKit --> HCLDailyImage : Used to build image 53 | HclWebKitGold -> HclImage : Used to build image 54 | 55 | ComMainRepo --> LocalRepo : Cloned/forked by customer 56 | LocalRepo --> ComImage 57 | HclPull ---> HclMainRepo 58 | @enduml 59 | 60 | -------------------------------------------------------------------------------- /examples/safelinx/docker-compose_mysql.yml: -------------------------------------------------------------------------------- 1 | version: '3.6' 2 | services: 3 | 4 | safelinx: 5 | 6 | image: ${CONTAINER_IMAGE} 7 | container_name: ${CONTAINER_NAME} 8 | hostname: ${CONTAINER_HOSTNAME} 9 | stop_grace_period: 60s 10 | 11 | environment: 12 | DOMINO_ORG: ${DOMINO_ORG} 13 | LDAP_HOST: ${LDAP_HOST} 14 | LDAP_PORT: ${LDAP_PORT} 15 | LDAP_SSL: ${LDAP_SSL} 16 | LDAP_USER: ${LDAP_USER} 17 | LDAP_PASSWORD: ${LDAP_PASSWORD} 18 | LDAP_UNTRUSTED: ${LDAP_UNTRUSTED} 19 | MYSQL_HOST: mysql-sl 20 | MYSQL_DATABASE: wgdata 21 | MYSQL_USER: wgdb 22 | MYSQL_PASSWORD: ${MYSQL_PASSWORD} 23 | CERTMGR_HOST: ${CERTMGR_HOST} 24 | CERTMGR_CHECK_INTERVAL: ${CERTMGR_CHECK_INTERVAL} 25 | 26 | cap_add: 27 | - SYS_PTRACE 28 | 29 | networks: 30 | safelinx_net: 31 | ipv4_address: 172.30.0.2 32 | 33 | ports: 34 | - ${CONTAINER_HTTPS_PORT}:443 35 | 36 | volumes: 37 | - safelinx_vol:/opt/hcl/SafeLinx/datastore 38 | - ./cert-mount:/cert-mount 39 | 40 | 41 | mysql: 42 | 43 | image: mysql 44 | container_name: mysql-sl 45 | hostname: mysql-sl.local 46 | stop_grace_period: 60s 47 | 48 | environment: 49 | MYSQL_DATABASE: wgdata 50 | MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD} 51 | MYSQL_USER: wgdb 52 | MYSQL_PASSWORD: ${MYSQL_PASSWORD} 53 | 54 | networks: 55 | safelinx_net: 56 | ipv4_address: 172.30.0.3 57 | 58 | volumes: 59 | - mysql_vol:/var/lib/mysql 60 | 61 | volumes: 62 | 63 | safelinx_vol: 64 | name: ${CONTAINER_VOLUME} 65 | external: false 66 | 67 | mysql_vol: 68 | name: mysql_safelinx 69 | external: false 70 | 71 | networks: 72 | 73 | safelinx_net: 74 | driver: bridge 75 | ipam: 76 | driver: default 77 | config: 78 | - subnet: 172.30.0.0/24 79 | 80 | -------------------------------------------------------------------------------- /compile.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ############################################################################ 3 | # Copyright Nash!Com, Daniel Nashed 2025 - APACHE 2.0 see LICENSE 4 | # Copyright IBM Corporation 2015, 2020 - APACHE 2.0 see LICENSE 5 | ############################################################################ 6 | 7 | SCRIPT_NAME=$(readlink -f $0) 8 | SCRIPT_DIR=$(dirname $SCRIPT_NAME) 9 | 10 | log_error_exit() 11 | { 12 | echo 13 | echo "ERROR: $@" 14 | echo 15 | exit 1 16 | } 17 | 18 | 19 | usage () 20 | { 21 | 22 | echo 23 | echo 24 | echo "Alpine based compile for C/C++ applications" 25 | echo "-------------------------------------------" 26 | echo 27 | echo "Builds statically linked binaries in Alpine Linux which run glibc version independent." 28 | echo "Supports: OpenSSL, LibCurl and RapidJSON." 29 | echo 30 | echo "Usage: $(basename $SCRIPT_NAME) source-dir [Options]" 31 | echo 32 | echo Options: 33 | echo 34 | echo "clean clean binaries and objects" 35 | echo "-clean run clean before building" 36 | echo 37 | 38 | return 0 39 | } 40 | 41 | 42 | for a in "$@"; do 43 | 44 | p=$(echo "$a" | awk '{print tolower($0)}') 45 | 46 | case "$p" in 47 | clean) 48 | BUILD_ACTION_CLEAN=1 49 | ;; 50 | 51 | -clean) 52 | BUILD_ACTION_CLEAN=2 53 | ;; 54 | 55 | -h|/h|-?|/?|-help|--help|help|usage) 56 | usage 57 | exit 0 58 | ;; 59 | 60 | -*) 61 | log_error_exit "Invalid parameter [$a]" 62 | ;; 63 | 64 | *) 65 | SRC_DIR=$a 66 | 67 | esac 68 | done 69 | 70 | 71 | if [ -z "$SRC_DIR" ]; then 72 | log_error_exit "No source directory specified" 73 | fi 74 | 75 | if [ -n "$BUILD_ACTION_CLEAN" ]; then 76 | 77 | CURRENT_DIR=$(pwd) 78 | cd "$SRC_DIR" 79 | make clean 80 | cd "$CURRENT_DIR" 81 | 82 | if [ "$BUILD_ACTION_CLEAN" = "1" ]; then 83 | exit 0 84 | fi 85 | 86 | fi 87 | 88 | 89 | docker run --rm -v $SRC_DIR:/src -w /src -u 0 nashcom/alpine_build_environment:latest sh -c 'SPECIAL_LINK_OPTIONS=-static make' 90 | -------------------------------------------------------------------------------- /dockerfiles/dockerfile_init: -------------------------------------------------------------------------------- 1 | ############################################################################ 2 | # Copyright Nash!Com, Daniel Nashed 2019, 2024 - APACHE 2.0 see LICENSE 3 | ############################################################################ 4 | 5 | FROM registry.access.redhat.com/ubi9-init:latest 6 | 7 | # External arguments with a default value 8 | ARG LinuxYumUpdate= 9 | ARG DownloadFrom= 10 | ARG SOFTWARE_REPO_IP= 11 | ARG PROD_NAME= 12 | ARG PROD_VER= 13 | ARG PROD_FP= 14 | ARG PROD_HF= 15 | ARG DOMLP_VER= 16 | ARG DOMRESTAPI_VER= 17 | ARG PROD_DOWNLOAD_FILE= 18 | ARG PROD_FP_DOWNLOAD_FILE= 19 | ARG PROD_HF_DOWNLOAD_FILE= 20 | ARG DominoResponseFile= 21 | ARG LocalInstallDir=/tmp/install 22 | ARG DominoUserID= 23 | ARG DOMINO_LANG= 24 | ARG LINUX_LANG= 25 | ARG DOCKER_TZ= 26 | ARG OPENSSL_INSTALL= 27 | ARG BORG_VERSION= 28 | ARG DOMBORG_VERSION= 29 | ARG TIKA_VERSION= 30 | ARG IQSUITE_VERSION= 31 | ARG SPECIAL_CURL_ARGS= 32 | ARG BUILD_SCRIPT_OPTIONS= 33 | ARG VERSE_VERSION= 34 | ARG NOMAD_VERSION= 35 | ARG TRAVELER_VERSION= 36 | ARG LEAP_VERSION= 37 | ARG CAPI_VERSION= 38 | ARG DOMIQ_VERSION= 39 | ARG NSHMAILX_VERSION= 40 | ARG MYSQL_INSTALL= 41 | ARG MSSQL_INSTALL= 42 | ARG LINUX_PKG_ADD= 43 | ARG LINUX_PKG_REMOVE= 44 | ARG LINUX_PKG_SKIP= 45 | ARG STARTSCRIPT_VER= 46 | ARG CUSTOM_ADD_ONS= 47 | ARG K8S_RUNAS_USER_SUPPORT= 48 | ARG EXPOSED_PORTS="1352 25 80 110 143 389 443 636 993 995 2050 63148 63149" 49 | 50 | USER root 51 | 52 | # Copy install files to container 53 | COPY install_dir_common $LocalInstallDir 54 | COPY install_dir_domino $LocalInstallDir 55 | 56 | # Enforce using Systemd 57 | ENV CONTAINER_USE_SYSTEMD=yes 58 | 59 | # Run install script and cleanup. Linux packages installed in separate layer first. 60 | RUN $LocalInstallDir/install_linux.sh 61 | 62 | # Install Domino in a layer separate from Linux packages and updates 63 | RUN $LocalInstallDir/install_domino.sh && \ 64 | rm -rf $LocalInstallDir 65 | 66 | HEALTHCHECK --interval=60s --timeout=10s CMD /healthcheck.sh 67 | 68 | # Expose Ports NRPC SMTP HTTP POP3 IMAP LDAP HTTPS LDAPS IMAPS POP3S DIIOP DIIOPS 69 | EXPOSE $EXPOSED_PORTS 70 | 71 | -------------------------------------------------------------------------------- /docs/howto_docker-linux.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Docker on Linux" 4 | nav_order: 3 5 | description: "Docker on Linux" 6 | parent: "Howto" 7 | has_children: false 8 | --- 9 | 10 | # Install Docker on Linux 11 | 12 | Docker installations depend on the platform your are running. 13 | 14 | Some platforms like Redhat have moved to [Podman](https://podman.io/) as their primary container build and run-time environment. 15 | The Domino Container project works with both platforms and auto detects, which container run-time is installed. 16 | 17 | ## Ensure only one container environment is installed. 18 | 19 | Even the container project could handle both container environments to be installed, it is highly recommended to have only one run-time installed. 20 | If Podman is installed, it is used by default. There is a switch to use Docker instead. 21 | Either `export USE_DOCKER=yes` or configure it via `./build.sh cfg`. 22 | 23 | ## Official Docker installation 24 | 25 | To install Docker use the official Docker documentation to ensure to get a recent version. 26 | Docker provides repositories for most distributions. 27 | Follow the steps for [Install Docker Engine](https://docs.docker.com/engine/install/). 28 | 29 | An alternate way to install is to use the Docker convenience script provided by Docker. 30 | It can be automatically downloaded and executed. 31 | 32 | ``` 33 | curl -fsSL https://get.docker.com | bash - 34 | ``` 35 | 36 | ## Nash!Com Convenience script to install the complete environment 37 | 38 | The Domino Start Script project provides a 39 | [Container build environment convenicence script](https://nashcom.github.io/domino-startscript/install_container_env/) 40 | to install the whole environment including GitHub repositories and leverages the Docker install convenience script as part of the installation. 41 | 42 | 43 | ## Check the Docker Client and Server Version 44 | 45 | Once installed, check the server and client version running. 46 | 47 | ``` 48 | docker version 49 | ``` 50 | 51 | ## Next Steps 52 | 53 | This completes the setup for your Docker environment. 54 | 55 | Continue with [Quickstart](quickstart.md) to build and run your first container. 56 | -------------------------------------------------------------------------------- /docs/howto_download-software.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Download Software" 4 | nav_order: 2 5 | description: "Howto Download Software from My HCLSoftware Portal" 6 | parent: "Howto" 7 | has_children: false 8 | --- 9 | 10 | 11 | # Automatic download from My HCLSoftware Portal (MHS) 12 | 13 | The container image build supports automatic downloads leveraging the [Domino Download Script](https://nashcom.github.io/domino-startscript/domdownload/) which is part of the OpenSource Nash!Com Start Script project. 14 | 15 | Once installed the build.sh script automatically detects the `domdownload` script to download missing software before starting the build process. 16 | This new option leverages the download API provided by MHS. 17 | 18 | 19 | # Manual download from My HCLSoftware Portal 20 | 21 | 1. Log into the [My HCLSoftware Portal](https://my.hcltechsw.com/) with your account 22 | 2. Copy the download URL with a right click action in your browser 23 | 3. If not direct download is possible, transfer the manually downloaded file to the software folder 24 | 4. In case the build machine has direct access to the internet, [Curl](https://curl.se/) can be used to directly from this pre-authenticated temporary download link. 25 | 26 | 27 | ## Additional notes 28 | 29 | - Specify the exact file name via `-o` option 30 | - Add single quotes around the download URL, because it contains bash specific special chars 31 | - The download URL will be valid for 60 minutes 32 | - Running the `build.sh domino` once the software is downloaded, will start the build process launching a NGINX software container to provide a build process web-kit download 33 | - You can use the `-checkonly` option to only check the software 34 | - The build process verifies the SHA256 download hash. There is no need to verify it manually 35 | - But there is also a `-verifyonly` option available to verify the software download 36 | 37 | 38 | # Direct download from remote server 39 | 40 | In case you have all the install packages located on a central server, you can point build process directly to the download location. 41 | The option `DOWNLOAD_FROM=https://mylocalsoftware.com` can be configured in build configuration. 42 | -------------------------------------------------------------------------------- /docs/reference_environment-vars.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Runtime Variables" 4 | nav_order: 2 5 | parent: "Reference" 6 | description: "Container environment variables" 7 | has_children: false 8 | --- 9 | 10 | # Introduction 11 | 12 | Starting with Domino 12 the Community image uses Domino One-Touch variables instead of the legacy PDS file configuration. 13 | The variables used have been aligned with Domino One-Touch setup. 14 | 15 | For details refer to the [HCL product documentation](https://help.hcltechsw.com/domino/12.0.0/admin/inst_onetouch.html) 16 | 17 | 18 | ## One-Touch parameters with additional functionality 19 | 20 | ### Download files 21 | 22 | The following variables download files from remote files with http:// and https:// syntax. 23 | Files are downloaded and the name of the file will be used as the file name. 24 | The variable is replaced with the download file location on disk. 25 | After download the variable is replaced with the password downloaded or read from file. 26 | 27 | ``` 28 | - SERVERSETUP_ORG_CERTIFIERIDFILEPATH 29 | - SERVERSETUP_ORG_ORGUNITIDFILEPATH 30 | - SERVERSETUP_SERVER_IDFILEPATH 31 | - SERVERSETUP_ADMIN_IDFILEPATH 32 | - SERVERSETUP_SECURITY_TLSSETUP_IMPORTFILEPATH 33 | ``` 34 | 35 | ### Remote password download 36 | 37 | The following variables retrieve passwords from files or from remote http:// and https:// locations. 38 | After download the variable is replaced with the password downloaded or read from file. 39 | 40 | ``` 41 | - SERVERSETUP_ADMIN_PASSWORD 42 | - SERVERSETUP_SERVER_PASSWORD 43 | - SERVERSETUP_ORG_CERTIFIERPASSWORD 44 | - SERVERSETUP_ORG_ORGUNITPASSWORD 45 | - SERVERSETUP_SECURITY_TLSSETUP_IMPORTFILEPASSWORD 46 | - SERVERSETUP_SECURITY_TLSSETUP_EXPORTPASSWORD 47 | ``` 48 | 49 | ## Additional parameters 50 | 51 | The following variables are complementing the One-Touch functionality 52 | 53 | ### SetupAutoConfigureParams 54 | 55 | Download a JSON One-Touch file 56 | 57 | ### CustomNotesdataZip 58 | 59 | Path and filename of a zip file containing files that will be extracted into the Domino Data directory. 60 | Values starting with 'http' will be handled as URL. The file will be downloaded from this URL. 61 | 62 | -------------------------------------------------------------------------------- /docs/reference_custom_roots.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Custom Trusted Roots" 4 | nav_order: 5 5 | parent: "Reference" 6 | description: "Custom Trusted Roots" 7 | has_children: false 8 | --- 9 | 10 | # Custom Linux trusted root certificate 11 | 12 | Depending on the required configuration, the might be a need for adding custom trusted roots to Linux and/or Domino. 13 | Specially on Linux level root certificates might be needed to verify corporate certificates, which are not trusted out of the box. 14 | 15 | It is important to add a trusted root to the Linux trust store early in the build process to ensure all Linux based build functionality can leverage it. 16 | The build script understands the logic to include for the most common Linux base images (Redhat, SUSE, Debian, Debian). 17 | 18 | 19 | ## How to add a trusted root 20 | 21 | Linux comes with a pre-defined list of trusted root certificates. 22 | To allow to use corporate trusted root, add a PEM formatted certificate file with the following name. 23 | The container image built adds the root certificate to the container images trusted roots. 24 | The root is used for example for OpenSSL and curl. 25 | 26 | The Linux trusted root can by providing a PEM file with the following name to [dockerfiles/install_dir_domino/custom](https://github.com/HCL-TECH-SOFTWARE/domino-container/tree/main/dockerfiles/install_dir_domino/custom): 27 | 28 | ``` 29 | trusted_root.pem 30 | ``` 31 | 32 | 33 | # Custom Domino trusted root certificate 34 | 35 | A second root certficate (or the same) can also be imported into Domino trust stores later in the image build logic when Domino is installed. 36 | 37 | Domino uses multiple trust stores: 38 | 39 | - **/local/notesdata/cacert.pem** used for HTTP Requests in Lotus Script and other backend code using curl 40 | - **Domino JVM trust store** used by Java 41 | - Domino Directory Trusted roots 42 | - certstore.nsf Trusted roots 43 | 44 | names.nsf and certstore.nsf can by managed in Domino and is replicated within the domain. 45 | 46 | 47 | ## How to add a trusted root 48 | 49 | The PEM file and JVM trusted roots can be updated by providing a PEM file with the following name to `dockerfiles/install_dir_domino/custom`: 50 | 51 | ``` 52 | trusted_domino_root.pem 53 | ``` 54 | 55 | -------------------------------------------------------------------------------- /docs/howto_github.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Get GitHub project" 4 | nav_order: 1 5 | description: "How to Get Domino Container GitHub Project" 6 | parent: "Howto" 7 | has_children: false 8 | --- 9 | 10 | ## How to download the Domino Container GitHub Project 11 | 12 | If you are directly connected to the GitHub server the recommended method to download this project is to use a git client, which is part of any Linux distribution. 13 | 14 | Example: Install for Redhat/CentOS based platforms via yum 15 | 16 | ``` 17 | yum install git -y 18 | ``` 19 | 20 | Example: Install for Ubuntu/Debian based platforms via apt 21 | 22 | ``` 23 | apt install git -y 24 | ``` 25 | 26 | Create a directory where to download Git projects and switch to it. 27 | 28 | Example: 29 | 30 | ``` 31 | mkdir -p /local/github 32 | cd /local/github 33 | ``` 34 | 35 | Clone the repository and switch to the directory 36 | 37 | ``` 38 | git clone https://github.com/HCL-TECH-SOFTWARE/domino-container.git 39 | cd domino-container 40 | ``` 41 | 42 | ### Download as a tar file 43 | 44 | When downloading the GitHub repository avoid the ZIP download link. 45 | because the ZIP format does not preserve file permissions. 46 | 47 | A better way is to download the GitHub repository as a so called **tarball**. 48 | The resulting tar file can be extracted preserving file system permissions. 49 | 50 | When downloading via browser, Git generates a file name for you. The URL would look like this: 51 | 52 | https://github.com/HCL-TECH-SOFTWARE/domino-container/tarball/main 53 | 54 | For a command-line download curl is the recommended way as listed below. 55 | 56 | ``` 57 | curl -sL https://github.com/HCL-TECH-SOFTWARE/domino-container/tarball/main -o domino-container.tar.gz 58 | ``` 59 | 60 | 61 | ### Downloading behind a proxy 62 | 63 | In a corporate environment a direct connection to the internet might not be an option. 64 | The Git client uses the standard Linux proxy settings when connecting to the internet. 65 | 66 | 67 | Note: 68 | Leveraging Git repositories directly allows to update the repository via `git pull`. 69 | Git also allows to switch between different branches of the project. 70 | The project uses a main and a develop branch. The develop branch should be only used by experienced administrators. 71 | -------------------------------------------------------------------------------- /examples/safelinx/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.6' 2 | services: 3 | 4 | safelinx: 5 | 6 | image: ${CONTAINER_IMAGE} 7 | container_name: ${CONTAINER_NAME} 8 | hostname: ${CONTAINER_HOSTNAME} 9 | stop_grace_period: 60s 10 | privileged: true 11 | 12 | environment: 13 | DOMINO_ORG: ${DOMINO_ORG} 14 | LDAP_HOST: ${LDAP_HOST} 15 | LDAP_PORT: ${LDAP_PORT} 16 | LDAP_SSL: ${LDAP_SSL} 17 | LDAP_USER: ${LDAP_USER} 18 | LDAP_PASSWORD: ${LDAP_PASSWORD} 19 | 20 | ENABLE_NOMAD: ${ENABLE_NOMAD} 21 | ENABLE_VERSEHA: ${ENABLE_VERSEHA} 22 | ENABLE_VPN: ${ENABLE_VPN} 23 | ENABLE_TRAVELER: ${ENABLE_TRAVELER} 24 | 25 | VERSE_DOMINO_HOST: ${VERSE_DOMINO_HOST} 26 | 27 | VPN_HOST_ADDRESS: ${VPN_HOST_ADDRESS} 28 | VPN_SUBNET_MASK: ${VPN_SUBNET_MASK} 29 | VPN_ENABLE_ROUTING: ${VPN_ENABLE_ROUTING} 30 | VPN_ROUTE: ${VPN_ROUTE} 31 | VPN_TARGET_ADAPTER: ${VPN_TARGET_ADAPTER} 32 | VPN_MULTI_SIGNON: ${VPN_MULTI_SIGNON} 33 | VPN_ENABLE_DNS: ${VPN_ENABLE_DNS} 34 | VPN_PRIMARY_DNS_SERVER: ${VPN_PRIMARY_DNS_SERVER} 35 | VPN_SECONDARY_DNS_SERVER: ${VPN_SECONDARY_DNS_SERVER} 36 | 37 | TRAVELER_DOMINO_HOST: ${TRAVELER_DOMINO_HOST} 38 | TRAVELER_PATH: ${TRAVELER_PATH} 39 | TRAVELER_HEARTBEAT: ${TRAVELER_HEARTBEAT} 40 | TRAVELER_SCHEDULE: ${TRAVELER_SCHEDULE} 41 | 42 | CERTMGR_HOST: ${CERTMGR_HOST} 43 | CERTMGR_CHECK_INTERVAL: ${CERTMGR_CHECK_INTERVAL} 44 | 45 | cap_add: 46 | - SYS_PTRACE 47 | 48 | networks: 49 | safelinx_net: 50 | ipv4_address: 172.30.0.2 51 | 52 | ports: 53 | - ${CONTAINER_HTTPS_PORT}:443 54 | 55 | volumes: 56 | - safelinx_vol:/opt/hcl/SafeLinx/datastore 57 | - ./cert-mount:/cert-mount 58 | 59 | devices: 60 | - /dev/net/tun 61 | 62 | volumes: 63 | 64 | safelinx_vol: 65 | name: ${CONTAINER_VOLUME} 66 | external: false 67 | 68 | 69 | networks: 70 | 71 | safelinx_net: 72 | driver: bridge 73 | ipam: 74 | driver: default 75 | config: 76 | - subnet: 172.30.0.0/24 77 | 78 | -------------------------------------------------------------------------------- /dockerfiles/dockerfile: -------------------------------------------------------------------------------- 1 | ############################################################################ 2 | # Copyright Nash!Com, Daniel Nashed 2019, 2024 - APACHE 2.0 see LICENSE 3 | # Copyright IBM Corporation 2015, 2019 - APACHE 2.0 see LICENSE 4 | ############################################################################ 5 | 6 | ARG BASE_IMAGE=registry.access.redhat.com/ubi9/ubi-minimal:latest 7 | FROM $BASE_IMAGE 8 | 9 | # External arguments with a default value 10 | ARG LinuxYumUpdate= 11 | ARG DownloadFrom= 12 | ARG SOFTWARE_REPO_IP= 13 | ARG PROD_NAME= 14 | ARG PROD_VER= 15 | ARG PROD_FP= 16 | ARG PROD_HF= 17 | ARG DOMLP_VER= 18 | ARG DOMRESTAPI_VER= 19 | ARG PROD_DOWNLOAD_FILE= 20 | ARG PROD_FP_DOWNLOAD_FILE= 21 | ARG PROD_HF_DOWNLOAD_FILE= 22 | ARG TRAVELER_DOWNLOAD_FILE= 23 | ARG RESTAPI_DOWNLOAD_FILE= 24 | ARG DominoResponseFile= 25 | ARG LocalInstallDir=/tmp/install 26 | ARG DominoUserID= 27 | ARG DOMINO_LANG= 28 | ARG LINUX_LANG= 29 | ARG DOCKER_TZ= 30 | ARG OPENSSL_INSTALL= 31 | ARG SSH_INSTALL= 32 | ARG BORG_VERSION= 33 | ARG DOMBORG_VERSION= 34 | ARG TIKA_VERSION= 35 | ARG IQSUITE_VERSION= 36 | ARG NODE_EXPORTER_VERSION= 37 | ARG DOMPROM_VERSION= 38 | ARG SPECIAL_CURL_ARGS= 39 | ARG BUILD_SCRIPT_OPTIONS= 40 | ARG VERSE_VERSION= 41 | ARG NOMAD_VERSION= 42 | ARG TRAVELER_VERSION= 43 | ARG LEAP_VERSION= 44 | ARG CAPI_VERSION= 45 | ARG DOMIQ_VERSION= 46 | ARG NSHMAILX_VERSION= 47 | ARG MYSQL_INSTALL= 48 | ARG MSSQL_INSTALL= 49 | ARG MYSQL_JDBC_VERSION= 50 | ARG POSTGRESQL_JDBC_VERSION= 51 | ARG LINUX_PKG_ADD= 52 | ARG LINUX_PKG_REMOVE= 53 | ARG LINUX_PKG_SKIP= 54 | ARG LINUX_HOMEDIR= 55 | ARG STARTSCRIPT_VER= 56 | ARG CUSTOM_ADD_ONS= 57 | ARG K8S_RUNAS_USER_SUPPORT= 58 | ARG EXPOSED_PORTS="1352 25 80 110 143 389 443 636 993 995 2050 63148 63149" 59 | 60 | USER root 61 | 62 | # Copy install files to container 63 | COPY install_dir_common $LocalInstallDir 64 | COPY install_dir_domino $LocalInstallDir 65 | 66 | # Run install script and cleanup. Linux packages installed in separate layer first. 67 | RUN $LocalInstallDir/install_linux.sh 68 | 69 | # Install Domino in a layer separate from Linux packages and updates 70 | RUN $LocalInstallDir/install_domino.sh && \ 71 | rm -rf $LocalInstallDir 72 | 73 | HEALTHCHECK --interval=60s --timeout=10s CMD /healthcheck.sh 74 | 75 | # Expose Ports NRPC SMTP HTTP POP3 IMAP LDAP HTTPS LDAPS IMAPS POP3S DIIOP DIIOPS 76 | EXPOSE $EXPOSED_PORTS 77 | 78 | ENTRYPOINT ["/entrypoint.sh"] 79 | 80 | USER 1000 81 | -------------------------------------------------------------------------------- /docs/reference_custom_mirror.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Custom Repositories" 4 | nav_order: 4 5 | parent: "Reference" 6 | description: "Custom Repositories" 7 | has_children: false 8 | --- 9 | 10 | # Custom Linux repository mirror configuration 11 | 12 | Specially in corporate enviroments source/mirror repositories might need to be customized to update and install Linux packages from a locally trusted location instead downloading them from public sources. 13 | In larger deployments a corporate image with the right adjusted repositories would make sense. 14 | The Domino Container would then just be derived from the company container base image and inherit Linux packet sources, custom trusted roots and for example proxy configurations. 15 | 16 | But for smaller environments or if Domino is the only impage the following functionality allows image customization at build time. 17 | 18 | 19 | ## Custom repository mirror configuration for Ubuntu/Debian 20 | 21 | The following description expects custom files in [dockerfiles/install_dir_domino/custom](https://github.com/HCL-TECH-SOFTWARE/domino-container/tree/main/dockerfiles/install_dir_domino/custom). 22 | 23 | To customize the mirror list for current Ubuntu and Debian, you can specify a custom repository file. 24 | The following configuration has been only tested for Ubuntu 24.04 and Debian 12 and is only available for those two platforms today. 25 | 26 | Hetzner for example provides a mirror for all their customers. 27 | The project contains the source repository files, which can be copied into `dockerfiles/install_dir_domino/custom`. 28 | 29 | Files need to have the following. You just need to copy the files into the right location. 30 | The build process picks up the repository before starting to install Linux packages. 31 | 32 | The directory [dockerfiles/install_dir_domino/linux_repositories](https://github.com/HCL-TECH-SOFTWARE/domino-container/tree/main/dockerfiles/install_dir_domino/linux_repositories) contains example reposity files for Hetzner, which are a good example and are ready to use on Hetzner servers. 33 | 34 | 35 | ### Ubuntu 24.04 (Noble) 36 | 37 | ``` 38 | ubuntu_noble.sources 39 | ``` 40 | 41 | ### Debian 12 (Bookworm) 42 | 43 | ``` 44 | debian_bookworm.sources 45 | ``` 46 | 47 | For Hetzner servers just copy the corresponding file to `dockerfiles/install_dir_domino/custom` with the corresponding name (`ubuntu_noble.sources`, `debian_bookworm.sources`) 48 | 49 | 50 | -------------------------------------------------------------------------------- /lab/kubernetes/domino/domino12_auto_config.yml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | 4 | metadata: 5 | name: domino12 6 | namespace: default 7 | 8 | labels: 9 | app: hcl-domino 10 | 11 | spec: 12 | imagePullSecrets: 13 | - name: regcred 14 | 15 | securityContext: 16 | runAsNonRoot: true 17 | runAsUser: 1000 18 | fsGroup: 1000 19 | fsGroupChangePolicy: "OnRootMismatch" 20 | 21 | containers: 22 | 23 | - env: 24 | - name: LANG 25 | value: "en_US.UTF-8" 26 | 27 | - name: SetupAutoConfigure 28 | value: "1" 29 | 30 | - name: SetupAutoConfigureParams 31 | value: "/etc/domino-cfg/auto_config.json" 32 | 33 | - name: DominoConfigRestartWaitTime 34 | value: "30" 35 | 36 | - name: DominoConfigRestartWaitString 37 | value: "Server started on physical node" 38 | 39 | name: domino12 40 | image: registry.domino.lab/hclcom/domino:latest 41 | 42 | securityContext: 43 | capabilities: 44 | add: ["SYS_PTRACE"] 45 | runAsNonRoot: true 46 | runAsUser: 1000 47 | 48 | volumeMounts: 49 | - name: domino-data 50 | mountPath: /local 51 | 52 | - name: domino-cfg 53 | mountPath: /etc/domino-cfg 54 | 55 | ports: 56 | - containerPort: 1352 57 | protocol: TCP 58 | - containerPort: 80 59 | protocol: TCP 60 | - containerPort: 443 61 | protocol: TCP 62 | 63 | livenessProbe: 64 | exec: 65 | command: 66 | - /healthcheck.sh 67 | 68 | initialDelaySeconds: 60 69 | periodSeconds: 20 70 | 71 | readinessProbe: 72 | exec: 73 | command: 74 | - /healthcheck.sh 75 | - ready 76 | 77 | initialDelaySeconds: 60 78 | periodSeconds: 20 79 | 80 | 81 | # this init container is a work-around to change file-system permissions for some local storage providers 82 | initContainers: 83 | - name: domino-startup 84 | image: busybox:latest 85 | 86 | command: [ 'sh', '-c', 'chmod 777 /local' ] 87 | 88 | securityContext: 89 | runAsNonRoot: false 90 | runAsUser: 0 91 | 92 | volumeMounts: 93 | - name: domino-data 94 | mountPath: /local 95 | 96 | volumes: 97 | - name: domino-data 98 | persistentVolumeClaim: 99 | claimName: local-path-pvc 100 | 101 | - name: domino-cfg 102 | configMap: 103 | name: domino12-cfg 104 | 105 | -------------------------------------------------------------------------------- /docs/run_dominoctl.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Run via dominoctl" 4 | nav_order: 2 5 | description: "Howto run a container via dominoctl" 6 | parent: "Run Image" 7 | has_children: false 8 | --- 9 | 10 | ## About dominoctl 11 | 12 | [Dominoctl](https://nashcom.github.io/domino-startscript/dominoctl/) is not part of the Domino Container project. 13 | It is part of the Nash!Com start script project, which is used for the HCL Domino container project. 14 | 15 | Similar to the Domino Start Script the **dominoctl** is intended to simplify configuration, start, stop and all other container operations. 16 | If you are running a Domino container on Docker or Podman this script is a very good choice. 17 | Please refer to the Nash!Com start script project for detailed information. 18 | 19 | ## How to configure and start a container 20 | 21 | First install **dominoctl** as documented [here]([Dominoctl](https://nashcom.github.io/domino-startscript/dominoctl/)). 22 | 23 | Once installed all container operations can be performed using **dominoctl**. 24 | 25 | ### Configure the container 26 | 27 | The default container configuration should work for most first setups. 28 | But opening the configuration might help understanding the settings. 29 | 30 | By default the configuration scripts use `vi`. 31 | The editor can be changed in the configuration via `EDIT_COMMAND` variable or exporting `export EDIT_COMMAND=nano` for example. 32 | 33 | ``` 34 | dominoctl cfg 35 | ``` 36 | 37 | ### Configure the Domino server 38 | 39 | The Container image supports Domino OTS in multiple ways. 40 | You can mount a OTS JSON file, download the file from remote. 41 | The file can be a so called OTS template with placeholders for OTS setup variables. 42 | 43 | **dominoctl** supports to interactively replace the variables. 44 | Each variable is prompted with a default value. 45 | 46 | ``` 47 | dominoctl setup 48 | ``` 49 | 50 | To edit the generated OTS JSON file, invoke the command again. 51 | 52 | 53 | ### Start the Domino server 54 | 55 | Now the server can be started using the start command. 56 | The command issues a `docker run` command to create and start a new container and waits for the container to be started to issue a`docker cp` command to inject the OTS JSON file. 57 | The container image is prepared to wait a couple of seconds for OTS files to be available before switching to listening mode for remote setup if no configuration is provided. 58 | 59 | 60 | ``` 61 | dominoctl start 62 | ``` 63 | 64 | ### Jump into the running container 65 | 66 | ``` 67 | dominoctl bash 68 | ``` 69 | 70 | -------------------------------------------------------------------------------- /examples/safelinx/.env: -------------------------------------------------------------------------------- 1 | 2 | # SafeLinx & Nomad Web Container 3 | 4 | # -------------------- 5 | 6 | # Mandatory configuration 7 | 8 | CONTAINER_HOSTNAME=nomad.acme.com 9 | DOMINO_ORG=acme 10 | LDAP_HOST=ldap.acme.com 11 | 12 | # -------------------- 13 | 14 | LDAP_USER= 15 | LDAP_PASSWORD= 16 | LDAP_PORT=389 17 | LDAP_SSL=auto 18 | LDAP_UNTRUSTED=FALSE 19 | 20 | # Important: For anonymous LDAP add following fields for anonymous queries in default config doc 21 | 22 | # - dominoPerson / MailServer 23 | # - dominoServer / SMTPFullHostDomain 24 | 25 | # -------------------- 26 | 27 | # Domino CertMgr Host for automatic certificate updates 28 | 29 | CERTMGR_HOST= 30 | #CERTMGR_HOST=certmgr.acme.com 31 | CERTMGR_CHECK_INTERVAL=300 32 | 33 | # -------------------- 34 | 35 | # Only overwrite if required 36 | 37 | CONTAINER_HTTPS_PORT=443 38 | CONTAINER_IMAGE=hclcom/safelinx:latest 39 | CONTAINER_NAME=safelinx 40 | CONTAINER_VOLUME=safelinx_data 41 | 42 | # MySQL 43 | 44 | # Only available if container is build with 'mysql' option and includes the client driver. 45 | # All addtitional parameters are defined in docker-compose-mysql.yml. 46 | # If you intended to use a different MySQL target, modify docker-compose-mysql.yml directly. 47 | # This deployment option would just launch a MySQL server automatically for your SafeLinx container. 48 | # Specifying the password triggers MySQL mode. 49 | 50 | #MYSQL_PASSWORD=my-secure-mysql-password 51 | 52 | 53 | #HCL Safelinx VPN configuration 54 | 55 | ENABLE_VPN=1 56 | VPN_HOST_ADDRESS=172.20.0.1 57 | VPN_SUBNET_MASK=255.255.0.0 58 | VPN_ENABLE_ROUTING=1 59 | VPN_ROUTE=10.0.0.0+255.255.0.0,172.17.0.0+255.255.0.0 60 | VPN_MULTI_SIGNON=TRUE 61 | VPN_TARGET_ADAPTER=eth0 62 | VPN_ENABLE_DNS=0 63 | VPN_PRIMARY_DNS_SERVER= 64 | VPN_SECONDARY_DNS_SERVER= 65 | 66 | 67 | # HCL Nomad configuration 68 | ENABLE_NOMAD=1 69 | # To connect to domino server nomad content, enable below lines appropriately. 70 | # NOMAD_DOMINO_CFG="NOMAD CN=domino-acme-01 nrpc://domino-acme-01.acme.com" 71 | 72 | 73 | # HCL Verse HA configuration 74 | ENABLE_VERSEHA=0 75 | # We can have comma separated list to mention multiple traveler hosts 76 | VERSE_DOMINO_HOST=https://linus.lab.dnug.eu 77 | 78 | 79 | # HCL Traveler configuration 80 | ENABLE_TRAVELER=0 81 | # We can have comma separated list to mention multiple traveler hosts 82 | TRAVELER_DOMINO_HOST=https://linus.lab.dnug.eu 83 | TRAVELER_PATH="/servlet/traveler /traveler /Microsoft-Server-ActiveSync /api/traveler /api/mail /api/freebusy" 84 | TRAVELER_HEARTBEAT=0 85 | # Supported SCHEDULEs are "BALANCED", "RROBIN", "STANDBY" 86 | TRAVELER_SCHEDULE="BALANCED" 87 | -------------------------------------------------------------------------------- /docs/howto_docker-run.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Run Image on Docker" 4 | nav_order: 3 5 | description: "Howto run Domino Container Images on Docker" 6 | parent: "Howto" 7 | has_children: false 8 | --- 9 | 10 | ## How to use this image 11 | 12 | When a new container is created from the HCL Domino Docker image, it takes [environment variables](reference_environment-vars.md) into account for auto-configuring the Domino server. 13 | Details on how to use those variables can be found [here](reference_environment-vars.md) 14 | 15 | The Domino data directory needs to be a persistent volume. On Docker it will be automatically created. 16 | You can also use an existing volume. All volume types your container infrastructure supports can be used. 17 | 18 | ### Creating a new container from an image manually 19 | 20 | Run a new Domino server with the configuration details of your choice. 21 | Make sure to specify the base image name at the very end of this command. 22 | 23 | Note: For values containing blanks use quotes around the whole env parameter! 24 | 25 | ```bash 26 | docker run -it -d \ 27 | -e SetupAutoConfigure=1 \ 28 | -e SERVERSETUP_SERVER_TYPE=first \ 29 | -e SERVERSETUP_ADMIN_FIRSTNAME=John \ 30 | -e SERVERSETUP_ADMIN_LASTNAME=Doe \ 31 | -e SERVERSETUP_ADMIN_PASSWORD=domino4ever \ 32 | -e SERVERSETUP_ADMIN_IDFILEPATH=admin.id \ 33 | -e SERVERSETUP_ORG_CERTIFIERPASSWORD=domino4ever \ 34 | -e SERVERSETUP_SERVER_DOMAINNAME=DominoDemo \ 35 | -e SERVERSETUP_ORG_ORGNAME=Domino-Demo \ 36 | -e SERVERSETUP_SERVER_NAME=domino-demo-v12 \ 37 | -e SERVERSETUP_NETWORK_HOSTNAME=domino.acme.com \ 38 | -h domino.acme.com \ 39 | -p 80:80 \ 40 | -p 1352:1352 \ 41 | -v dominodata_demo:/local/notesdata \ 42 | --stop-timeout=60 \ 43 | --cap-add=SYS_PTRACE \ 44 | --cap-add=NET_BIND_SERVICE \ 45 | --name domino12 \ 46 | hclcom/domino:latest 47 | ``` 48 | 49 | ## Runtime configuration 50 | 51 | During ```docker run``` you can setup a volume that mounts property files into `/local/notesdata` 52 | 53 | ### Stopping the Application Server gracefully 54 | 55 | Stopping a Domino server takes longer than the time a Docker server would expect by default (**10 seconds**), the recommended way is to add the parameter `--stop-timeout` already when starting the container. 56 | If the container was started with the parameter ```--stop-timeout=``` then you may stop the container using the following command: 57 | 58 | ```docker stop ``` 59 | 60 | If the container was started without specifying the parameter `--stop-timeout=` then use the following command to stop the container gracefully 61 | 62 | ```docker stop --time= ``` 63 | 64 | Example: 65 | 66 | ```docker stop --time=60 test``` 67 | -------------------------------------------------------------------------------- /docs/run_docker.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Run on Docker" 4 | nav_order: 1 5 | description: "Howto run Domino Container Images on Docker" 6 | parent: "Run Image" 7 | has_children: false 8 | --- 9 | 10 | ## How run this image on Docker 11 | 12 | When a new container is created from the HCL Domino Container image, it takes [environment variables](reference_environment-vars.md) into account for auto-configuring the Domino server. 13 | Details on how to use those variables can be found [here](reference_environment-vars.md) 14 | 15 | The Domino data directory needs to be a persistent volume. On Docker it will be automatically created. 16 | You can also use an existing volume. All volume types your container infrastructure supports can be used. 17 | 18 | ### Creating a new container from an image manually 19 | 20 | Run a new Domino server with the configuration details of your choice. 21 | Make sure to specify the base image name at the very end of this command. 22 | 23 | Note: For values containing blanks use quotes around the whole env parameter! 24 | 25 | ```bash 26 | docker run -it -d \ 27 | -e SetupAutoConfigure=1 \ 28 | -e SERVERSETUP_SERVER_TYPE=first \ 29 | -e SERVERSETUP_ADMIN_FIRSTNAME=John \ 30 | -e SERVERSETUP_ADMIN_LASTNAME=Doe \ 31 | -e SERVERSETUP_ADMIN_PASSWORD=domino4ever \ 32 | -e SERVERSETUP_ADMIN_IDFILEPATH=admin.id \ 33 | -e SERVERSETUP_ORG_CERTIFIERPASSWORD=domino4ever \ 34 | -e SERVERSETUP_SERVER_DOMAINNAME=DominoDemo \ 35 | -e SERVERSETUP_ORG_ORGNAME=Domino-Demo \ 36 | -e SERVERSETUP_SERVER_NAME=domino-demo-v12 \ 37 | -e SERVERSETUP_NETWORK_HOSTNAME=domino.acme.com \ 38 | -h domino.acme.com \ 39 | -p 80:80 \ 40 | -p 1352:1352 \ 41 | -v dominodata_demo:/local/notesdata \ 42 | --stop-timeout=60 \ 43 | --cap-add=SYS_PTRACE \ 44 | --cap-add=NET_BIND_SERVICE \ 45 | --name domino12 \ 46 | hclcom/domino:latest 47 | ``` 48 | 49 | ## Runtime configuration 50 | 51 | During ```docker run``` you can setup a volume that mounts property files into `/local/notesdata` 52 | 53 | ### Stopping the Application Server gracefully 54 | 55 | Stopping a Domino server takes longer than the time a Docker server would expect by default (**10 seconds**), the recommended way is to add the parameter `--stop-timeout` already when starting the container. 56 | If the container was started with the parameter ```--stop-timeout=``` then you may stop the container using the following command: 57 | 58 | ```docker stop ``` 59 | 60 | If the container was started without specifying the parameter `--stop-timeout=` then use the following command to stop the container gracefully 61 | 62 | ```docker stop --time= ``` 63 | 64 | Example: 65 | 66 | ```docker stop --time=60 test``` 67 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/startscript/domino.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | 3 | ########################################################################### 4 | # systemd Service - Start/Stop Script for Domino on xLinux/zLinux/AIX # 5 | # Version 3.8.0 20.12.2023 # 6 | # # 7 | # (C) Copyright Daniel Nashed/NashCom 2005-2023 # 8 | # Feedback domino_unix@nashcom.de # 9 | # # 10 | # Licensed under the Apache License, Version 2.0 (the "License"); # 11 | # you may not use this file except in compliance with the License. # 12 | # You may obtain a copy of the License at # 13 | # # 14 | # http://www.apache.org/licenses/LICENSE-2.0 # 15 | # # 16 | # Unless required by applicable law or agreed to in writing, software # 17 | # distributed under the License is distributed on an "AS IS" BASIS, # 18 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# 19 | # See the License for the specific language governing permissions and # 20 | # limitations under the License. # 21 | ########################################################################### 22 | 23 | Description=HCL Domino Server (notes) 24 | After=syslog.target network.target 25 | 26 | [Service] 27 | User=notes 28 | RuntimeDirectory=notes 29 | RuntimeDirectoryPreserve=yes 30 | PIDFile=/tmp/domino.pid 31 | ExecStart=/opt/nashcom/startscript/rc_domino_script start 32 | ExecStop=/opt/nashcom/startscript/rc_domino_script stop 33 | Type=forking 34 | LimitNOFILE=80000 35 | LimitNPROC=8000 36 | TasksMax=8000 37 | 38 | # to make sure startup compact operations can finish 39 | TimeoutSec=600 40 | TimeoutStopSec=300 41 | RemainAfterExit=no 42 | 43 | #Environment=LANG=en_US.UTF-8 44 | #Environment=LANG=de_DE.UTF-8 45 | 46 | # !! Note for environment variables and security limits !! 47 | 48 | # Environment variables from a user profile are not set for systemd services, because no "su" is used to swich to the user. 49 | # You either have to define them in the service, define them in the Domino config file or define them via the new DOMINO_ENV_FILE option 50 | 51 | # The systemd service also defines security limits for the Domino server. You should still apply the same settins in /etc/security/limits.conf. 52 | # This ensures that Domino processes started from a shell have the same security limtis specified. 53 | 54 | [Install] 55 | WantedBy=multi-user.target 56 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/nuid2pw.c: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | ############################################################################ 4 | # Copyright Nash!Com, Daniel Nashed 2020-2022 - APACHE 2.0 see LICENSE 5 | ############################################################################ 6 | 7 | Helper tool to patch a /etc/passwd file for specifying specific uids for the 'notes' user. 8 | OpenShift has an own mechanism adding the uid to the /etc/passwd file. 9 | An alternate solution would be an init container adding the right user to the container. 10 | */ 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | #define MAX_TEXT_LINE 1000 18 | #define MAX_LINES 1000 19 | 20 | void strdncpy (char *s, const char *ct, size_t n) 21 | { 22 | // copies string with a maximum of size_t chars from a null terminated string. 23 | // the result is always null terminated 24 | 25 | if (n>0) 26 | { 27 | strncpy (s, ct, n-1); 28 | s[n-1] = '\0'; 29 | } 30 | else 31 | { 32 | s[0] = '\0'; 33 | } 34 | } 35 | 36 | int strbegins (const char *str, const char *prefix) 37 | { 38 | while(*prefix) 39 | { 40 | if(*prefix++ != *str++) return 0; 41 | } 42 | 43 | return 1; 44 | } 45 | 46 | int update_passwd_notes (const char *passwd_file, const char *uid_str, const char *homedir) 47 | { 48 | FILE *fp = NULL; 49 | int count = 0; 50 | int i = 0; 51 | char line[MAX_LINES+1][MAX_TEXT_LINE+1] = {0}; 52 | 53 | fp = fopen (passwd_file, "r"); 54 | if (NULL == fp) 55 | { 56 | printf ("error -- canot open [%s] for reading\n", passwd_file); 57 | return 1; 58 | } 59 | 60 | while (fgets(line[count], MAX_TEXT_LINE, fp)) 61 | { 62 | if (count >= MAX_LINES) 63 | break; 64 | count++; 65 | } 66 | 67 | fclose (fp); 68 | fp = NULL; 69 | 70 | fp = fopen (passwd_file, "w"); 71 | if (NULL == fp) 72 | { 73 | printf ("error -- canot open [%s] for writing\n", passwd_file); 74 | return 1; 75 | } 76 | 77 | for (i=0; i 1) 98 | { 99 | strdncpy (uid_str, argv[1], sizeof (uid_str)); 100 | } 101 | else 102 | { 103 | return ret; 104 | } 105 | 106 | ret = update_passwd_notes ("/etc/passwd", uid_str, "/home/notes"); 107 | 108 | return ret; 109 | } 110 | -------------------------------------------------------------------------------- /docs/resources.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Learning Resources" 4 | nav_order: 7 5 | description: "Learning Resources" 6 | has_children: false 7 | --- 8 | 9 | # Learning Resources 10 | 11 | The Domino container project provides a lot of useful information to get the container image built and run containerized Domino servers. 12 | It is still very important to understand the basic concepts of the underlaying container technology. 13 | The referenced material is a good starting point to look at the underlaying technology. 14 | 15 | Because containers are a fast moving technology, please make sure to look into up to date information and avoid older documentation and older blog posts. 16 | 17 | 18 | # Recommended Docker YouTube Videos 19 | 20 | There are a lot of learning resources around Docker and Containers available on YouTube. 21 | A good starting point are the videos from [Techworld with Nana](https://www.youtube.com/@TechWorldwithNana). 22 | 23 | If you never worked with containers, there is a one hour video [Docker in 1 Hour](https://youtu.be/pg19Z8LL06w) for a quick jump start. 24 | This video should be a good starting point. But there are longer videos about Docker, Kubernetes(K8s) and related topics available. 25 | 26 | This one hour video is really recommended if you never worked with Docker. 27 | 28 | 29 | # Docker documentation and learning resources 30 | 31 | The official [Docker documentation](https://docs.docker.com/) is also a very good starting point. 32 | Beside the [manuals](https://docs.docker.com/manuals/) and the [Docker command-line reference](https://docs.docker.com/reference/cli/docker/) there are [Get started tutorials](https://docs.docker.com/get-started/) and more. 33 | 34 | 35 | # Domino One Touch Setup (OTS) GitHub project 36 | 37 | Domino One Touch Setup(OTS) plays an important role setting up Domino in a container. 38 | There is a separate HCL Open Source project [Domino One Touch Setup (OTS)](https://github.com/HCL-TECH-SOFTWARE/domino-one-touch-setup) providing additional documentation, howto information and full examples. 39 | 40 | 41 | # OpenNTF Webinars 42 | 43 | OpenNTF Webinars are monthly 90 minute online webinars about current Domino topics. 44 | They are are a great resource presented by HCL Ambassadors and other experts from the community. 45 | 46 | - **Domino Containers - The Next Step**, 19. September 2024 by Martijn de Jong 47 | [Presentation](https://www.openntf.org/Public/presentations.nsf/0/32AB753020CE35EC86258B9E004CFE61/$FILE/Domino_Containers_The_Next_Step_OpenNTF.pdf), 48 | [Video](https://youtu.be/6tCRHbWhOfA) 49 | 50 | - **Unleash the Power of OTS (One Touch Setup)**, 26. September 2024 by Daniel Nashed 51 | [Presentation](https://www.openntf.org/Public/presentations.nsf/0/B89491D386C4039B86258BA500584079/$FILE/openntf2024_domino_one_touch_setup.pdf), 52 | [Video](https://youtu.be/VD09FwfsyiM) 53 | 54 | 55 | -------------------------------------------------------------------------------- /lab/kubernetes/domino/domino12.yml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | 4 | metadata: 5 | name: domino12 6 | namespace: default 7 | 8 | labels: 9 | app: hcl-domino 10 | 11 | spec: 12 | imagePullSecrets: 13 | - name: regcred 14 | 15 | securityContext: 16 | runAsNonRoot: true 17 | runAsUser: 1000 18 | fsGroup: 1000 19 | fsGroupChangePolicy: "OnRootMismatch" 20 | 21 | containers: 22 | 23 | - env: 24 | - name: LANG 25 | value: "en_US.UTF-8" 26 | 27 | - name: SetupAutoConfigure 28 | value: "1" 29 | 30 | - name: SERVERSETUP_SERVER_TYPE 31 | value: first 32 | 33 | - name: SERVERSETUP_ADMIN_FIRSTNAME 34 | value: "Martin" 35 | 36 | - name: SERVERSETUP_ADMIN_LASTNAME 37 | value: "Bishop" 38 | 39 | - name: SERVERSETUP_ADMIN_PASSWORD 40 | value: "2manysecrets" 41 | 42 | - name: SERVERSETUP_ADMIN_IDFILEPATH 43 | value: "/local/notesdata/domino/html/admin.id" 44 | 45 | - name: SERVERSETUP_NETWORK_HOSTNAME 46 | value: "main.domino.lab" 47 | 48 | - name: SERVERSETUP_ORG_CERTIFIERPASSWORD 49 | value: "2manysecrets" 50 | 51 | - name: SERVERSETUP_SERVER_DOMAINNAME 52 | value: "DominoLab" 53 | 54 | - name: SERVERSETUP_ORG_ORGNAME 55 | value: "DominoLab" 56 | 57 | - name: SERVERSETUP_SERVER_NAME 58 | value: "main.domino.lab" 59 | 60 | - name: SERVERSETUP_SERVER_SERVERTASKS 61 | value: "replica,router,update,amgr,adminp,http" 62 | 63 | - name: SERVERSETUP_SECURITY_ACL_PROHIBITANONYMOUSACCESS 64 | value: "true" 65 | 66 | - name: SERVERSETUP_SECURITY_ACL_ADDLOCALDOMAINADMINS 67 | value: "true" 68 | 69 | name: domino12 70 | image: registry.domino.lab/hclcom/domino:latest 71 | 72 | securityContext: 73 | capabilities: 74 | add: ["SYS_PTRACE"] 75 | runAsNonRoot: true 76 | runAsUser: 1000 77 | 78 | volumeMounts: 79 | - name: domino-data 80 | mountPath: /local 81 | 82 | ports: 83 | - containerPort: 1352 84 | protocol: TCP 85 | - containerPort: 80 86 | protocol: TCP 87 | - containerPort: 443 88 | protocol: TCP 89 | 90 | livenessProbe: 91 | exec: 92 | command: 93 | - /healthcheck.sh 94 | 95 | initialDelaySeconds: 60 96 | periodSeconds: 20 97 | 98 | readinessProbe: 99 | exec: 100 | command: 101 | - /healthcheck.sh 102 | - ready 103 | 104 | initialDelaySeconds: 60 105 | periodSeconds: 20 106 | 107 | 108 | # this init container is a work-around to change file-system permissions for some local storage providers 109 | initContainers: 110 | - name: domino-startup 111 | image: busybox:latest 112 | 113 | command: [ 'sh', '-c', 'chmod 777 /local' ] 114 | 115 | securityContext: 116 | runAsNonRoot: false 117 | runAsUser: 0 118 | 119 | volumeMounts: 120 | - name: domino-data 121 | mountPath: /local 122 | 123 | 124 | volumes: 125 | - name: domino-data 126 | persistentVolumeClaim: 127 | claimName: local-path-pvc 128 | 129 | -------------------------------------------------------------------------------- /docs/architecture_concept.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Conceptual details" 4 | nav_order: 3 5 | description: "Conceptual details" 6 | parent: "Architecture" 7 | has_children: false 8 | --- 9 | 10 | # Conceptual details 11 | 12 | ## Installation-Time 13 | 14 | - When the image is build, all install data is contained in the installation image. 15 | - All software installers (web-kits) write to the `/local/notesdata` which is part of the image. 16 | 17 | All installers (FP, HF, add-on installer e.g. Traveler) can create and update files. 18 | 19 | Those files are stored in compressed tar file, to be expanded on first setup or update. 20 | 21 | ## Run-Time - Create notesdata 22 | 23 | Containers are designed to 24 | 25 | - have static data in the image 26 | - have changing data in separate data [volumes](https://docs.docker.com/storage/volumes/) which are assigned at run-time. 27 | 28 | 29 | When a new volume is assigned, existing data in the image where the volume is mounted, is usually copied to the volume. 30 | This ensures that install data like templates, iNotes directory or Traveler directory are available on the `/local/notesdata` volume at first container start. 31 | 32 | This works great until a server is updated. A new image will start installation from scratch and all updated install data will be again up to date in the image. 33 | But when you create a new container for updating your server instance, the `/local/notesdata` volume already contains data and will not be updated! 34 | 35 | ## Updating Install Data 36 | 37 | This makes updating a server more complex because even a FP/IF/HF could bring update templates or more often a new iNotes/forms update. 38 | 39 | The `/entrypoint.sh` script takes care of those updates automatically at next start-up using `/domino-container/domino_install_data_copy.sh` script. 40 | The logic checks which files have been changed and updates this files by copying them from the image to the data volume. 41 | 42 | For Domino FP/IF/HF updates the binary directory contains a directory `opt/hcl/domino/notes/latest/linux/data1_bck` with updated install-data for each version/FP/IF/HF. 43 | 44 | During install the current installed version is written to two separate version status files 45 | in `/domino-container` and `/local/notesdata` (e.g. `/domino-container/domino_fp.txt` and `/local/notesdata/domio_fp.txt` ). 46 | At first install those files are equal. But if a server is updated and the data volume cannot be changed at install time. 47 | The update routine ensures that FP updates are applied before HF updates (there are separate files for FPs, HFs and for add-on software). 48 | 49 | A similar logic is used for add-on applications like Traveler. 50 | For Traveler the `/local/notesdata/traveler directory` is stored in a tar during install and stored in the container image. 51 | If the versions don't match at start-up, the data copy script will extract the tar into the server's data directory, before launching the server. 52 | After updating the data the version file in the notesdata volume is updated to reflect the updates data. 53 | This ensures install data patches will update the data directory of already deployed data volumes. 54 | 55 | All updates are logged into `/tmp/domino-container/data_update.log`. 56 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_safelinx/install_linux.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ############################################################################ 3 | # Copyright Nash!Com, Daniel Nashed 2022 - APACHE 2.0 see LICENSE 4 | ############################################################################ 5 | 6 | # Installer for Linux layer 7 | # ------------------------- 8 | # - Updates Linux to latest packages if requrested 9 | # - Adds packages needed for Domino at run-time 10 | # - Remporay required packages for installation are installed in Domino install layer 11 | 12 | INSTALL_DIR=$(dirname $0) 13 | export LANG=C 14 | 15 | # Include helper functions & defines 16 | . $INSTALL_DIR/script_lib.sh 17 | 18 | 19 | install_linux_packages() 20 | { 21 | header "Installing required and useful Linux packages" 22 | 23 | # Common packages for all distributions 24 | install_packages curl lsof ncurses which file net-tools diffutils file findutils gettext gzip tar unzip openssl ncurses-compat-libs 25 | 26 | # SUSE 27 | if [ -x /usr/bin/zypper ]; then 28 | install_packages glibc-locale libcap-progs vim 29 | 30 | else 31 | 32 | # SUSE does not require those packages 33 | install_package procps-ng 34 | 35 | # Installing the English local should always work 36 | install_package glibc-langpack-en 37 | 38 | # SafeLinx currenlty requires an older crypt lib 39 | install_package libxcrypt-compat 40 | 41 | fi 42 | 43 | # On Debian, Ubuntu and Astra Linux install setcap (required to set capability for gdb) 44 | if [ -x /usr/bin/apt-get ]; then 45 | install_package libcap2-bin 46 | fi 47 | 48 | # PhotonOS 49 | if [ -e /etc/photon-release ]; then 50 | install_packages shadow gawk rpm coreutils-selinux util-linux vim tzdata 51 | return 0 52 | fi 53 | 54 | # On some platforms certain programs are in their own package not installed by default.. 55 | install_if_missing hostname 56 | install_if_missing xargs 57 | } 58 | 59 | yum_glibc_lang_update() 60 | { 61 | 62 | local INSTALL_LOCALE=$(echo $DOMINO_LANG|cut -f1 -d"_") 63 | 64 | if [ -z "$INSTALL_LOCALE" ]; then 65 | return 0 66 | fi 67 | 68 | if [ -e /etc/photon-release ]; then 69 | 70 | echo "Installing locale [$DOMINO_LANG] on Photon OS" 71 | install_package glibc-i18n 72 | echo "$DOMINO_LANG UTF-8" > /etc/locale-gen.conf 73 | locale-gen.sh 74 | remove_package glibc-i18n 75 | return 0 76 | fi 77 | 78 | # Only needed for CentOS like platforms -> check if yum is installed 79 | 80 | if [ ! -x /usr/bin/yum ]; then 81 | return 0 82 | fi 83 | 84 | install_package glibc-langpack-$INSTALL_LOCALE 85 | 86 | return 0 87 | } 88 | 89 | 90 | # Main logic to update Linux and install Linux packages 91 | 92 | # Check for Linux updates if requested first 93 | 94 | check_linux_update 95 | install_linux_packages 96 | yum_glibc_lang_update 97 | 98 | # Install database client if requested 99 | 100 | if [ "$MYSQL_INSTALL" = "yes" ]; then 101 | install_mysql_client 102 | fi 103 | 104 | if [ "$MSSQL_INSTALL" = "yes" ]; then 105 | install_mssql_client 106 | fi 107 | 108 | 109 | # Cleanup repository cache to save space 110 | clean_linux_repo_cache 111 | 112 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_safelinx/install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ############################################################################ 4 | # Copyright Nash!Com, Daniel Nashed 2022 - APACHE 2.0 see LICENSE 5 | ############################################################################ 6 | 7 | INSTALL_DIR=$(dirname $0) 8 | export LANG=C 9 | 10 | # Include helper functions 11 | 12 | . $INSTALL_DIR/script_lib.sh 13 | 14 | INSTALL_ADDON_DATA_TAR=$DOMDOCK_DIR/install_data_addon_${PROD_NAME}.taz 15 | 16 | # --- Main Install Logic --- 17 | 18 | header "Environment Setup" 19 | 20 | echo "INSTALL_DIR = [$INSTALL_DIR]" 21 | echo "DownloadFrom = [$DownloadFrom]" 22 | echo "Product = [$PROD_NAME]" 23 | echo "Version = [$PROD_VER]" 24 | echo "DominoUserID = [$DominoUserID]" 25 | 26 | cd "$INSTALL_DIR" 27 | 28 | # Download updated software.txt file if available 29 | download_file_ifpresent "$DownloadFrom" software.txt "$INSTALL_DIR" 30 | 31 | install_nomadweb() 32 | { 33 | local ADDON_NAME=nomadweb 34 | local ADDON_VER=$1 35 | 36 | echo "NomadWeb Version: [$ADDON_VER]" 37 | 38 | if [ -z "$ADDON_VER" ]; then 39 | return 0 40 | fi 41 | 42 | header "$ADDON_NAME Installation" 43 | 44 | get_download_name $ADDON_NAME $ADDON_VER 45 | download_and_check_hash "$DownloadFrom" "$DOWNLOAD_NAME" "$ADDON_NAME" 46 | 47 | log_space Unzipping Nomad Web data 48 | 49 | mkdir -p /usr/local/nomad-src/nomad 50 | 51 | NOMADWEB_ZIP=$(find "$ADDON_NAME" -name "*.zip") 52 | 53 | if [ -z "$NOMADWEB_ZIP" ]; then 54 | log_error "No Nomad Web ZIP found" 55 | fi 56 | 57 | echo "NomadWebZip: [$NOMADWEB_ZIP]" 58 | 59 | time unzip -q $NOMADWEB_ZIP -d /usr/local/nomad-src/nomad 60 | 61 | remove_directory $ADDON_NAME 62 | 63 | log_space Installed $ADDON_NAME 64 | } 65 | 66 | 67 | # Installing SafeLinx 68 | 69 | header "$PROD_NAME Installation" 70 | 71 | INST_VER=$PROD_VER 72 | 73 | if [ -n "$INST_VER" ]; then 74 | get_download_name $PROD_NAME $INST_VER 75 | download_and_check_hash "$DownloadFrom" "$DOWNLOAD_NAME" $PROD_NAME 76 | else 77 | log_error "No Target Version specified" 78 | exit 1 79 | fi 80 | 81 | CURRENT_DIR=$(pwd) 82 | cd $PROD_NAME 83 | 84 | # If MS SQL client exists ensure it is in the part for installtion - even it is set in the profile 85 | if [ -e /opt/mssql-tools18/bin ]; then 86 | echo "current path: $PATH" 87 | export PATH="$PATH:/opt/mssql-tools18/bin" 88 | fi 89 | 90 | cd inst.images 91 | export SILENT_INSTALL=y 92 | 93 | ./install_wg --silent 94 | 95 | setcap 'cap_net_bind_service=+ep' /opt/hcl/SafeLinx/bin/wgated 96 | 97 | cd $CURRENT_DIR 98 | remove_directory $PROD_NAME 99 | 100 | mkdir /cert-mount 101 | 102 | echo "Installed SafeLinx" 103 | 104 | # Install Nomad Web if requested 105 | install_nomadweb "$NOMADWEB_VERSION" 106 | 107 | header "Final Steps & Configuration" 108 | 109 | install_file "$INSTALL_DIR/entrypoint.sh" "/entrypoint.sh" root root 755 110 | 111 | # Install health check script 112 | install_file "$INSTALL_DIR/healthcheck.sh" "/healthcheck.sh" root root 755 113 | 114 | # Cleanup repository cache to save space 115 | clean_linux_repo_cache 116 | 117 | header "Successfully completed installation!" 118 | -------------------------------------------------------------------------------- /docs/run_ots.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "OTS integration" 4 | nav_order: 3 5 | description: "Domino Container OTS integration" 6 | parent: "Run Image" 7 | has_children: false 8 | --- 9 | 10 | # Domino Container OTS integration 11 | 12 | Since Domino 12.0 One Touch Setup (OTS) is the preferred and fully automated way to deploy Domino. 13 | The container project fully supports OTS in a couple of ways. 14 | 15 | ## Pass environment variables to the container at first startup 16 | 17 | This is the most simple approach but would end up with sensitive information inside the container environment variables. 18 | Environment variable setup is a very simple and basic configuration option without providing the full potential of OTS available with JSON files 19 | 20 | ## Use a OTS JSON file to configure the container at first startup 21 | 22 | Tthe container image also supports passing a OTS JSON file to the container in multiple ways. 23 | 24 | The JSON OTS file can be either a full JSON file. Or a file containing Domino OTS environment variable definitions replaced on the fly when the container is started. 25 | Still the same security concern remain when passing environment variables to be replaced in the JSON file. 26 | 27 | The recommended way is to pass a complete JSON file without place-holder variables to the container. 28 | For an additional server configuration which does not need to provide sensitive data like certifier or admin passwords, passing environment variables is still a valid approach. 29 | 30 | The OTS file and also the OTS template file can be passed in different ways to the container at startup. 31 | 32 | ### 1. Mount a file into the container 33 | 34 | - On Docker this would be a volume mount 35 | - On Kubernetes it would be config map or secret mounted into the container 36 | 37 | Be aware that the file remains in place for the complete run-time. 38 | 39 | 40 | ### 2. Get the file copied into the container at startup and have OTS remove the file when it is processed 41 | 42 | - Domino Container control for example uses this approach copying the file into the container at startup 43 | - A One Touch template can be downloaded from a remote HTTPS location specified in an environment variable. 44 | 45 | 46 | ## Location of OTS files in the running container at first startup 47 | 48 | 1. The container image first checks if a OTS file is present at the following location: 49 | 50 | **/local/notesdata/DominoAutoConfig.json** 51 | 52 | 53 | Customization via environment variable: `DOMINO_AUTO_CONFIG_JSON_FILE` 54 | 55 | 2. If no OTS file is found the container checks for an OTS template file 56 | 57 | 58 | **/local/notesdata/DominoAutoConfigTemplate.json** 59 | 60 | Customization via environment variable: `DOMINO_AUTO_CONFIG_TEMPLATE_JSON_FILE` 61 | 62 | 63 | 3. The OTS template can be also downloaded from remote by specifying the following environment variable like in the following example: 64 | 65 | ``` 66 | SetupAutoConfigureTemplateDownload=https://myserver./ots-template.json 67 | ``` 68 | 69 | ## Note 70 | 71 | One Touch Setup by default tries to delete configuration files after they are processed to ensure no sensitive data is left on the server. 72 | But this only works if the file is added in a way that the container can delete it. 73 | Mounts on Docker and Secrets/ConfigMaps on Kubernetes are usually read-only 74 | 75 | -------------------------------------------------------------------------------- /software/software-repo.sh: -------------------------------------------------------------------------------- 1 | #/bin/bash 2 | 3 | ############################################################################ 4 | # Copyright Nash!Com, Daniel Nashed 2019, 2022 - APACHE 2.0 see LICENSE 5 | # Copyright IBM Corporation 2015, 2019 - APACHE 2.0 see LICENSE 6 | ############################################################################ 7 | 8 | SCRIPT_NAME=$0 9 | PARAM1=$1 10 | SOFTWARE_CONTAINER=hclsoftware 11 | 12 | usage () 13 | { 14 | echo 15 | echo "Usage: $(basename $SCRIPT_NAME) { start | stop | ip | rm | stopremove }" 16 | 17 | return 0 18 | } 19 | 20 | get_container_environment() 21 | { 22 | # If specified use specified command. Else find out the platform. 23 | 24 | if [ -n "$CONTAINER_CMD" ]; then 25 | return 0 26 | fi 27 | 28 | if [ -n "$USE_DOCKER" ]; then 29 | CONTAINER_CMD=docker 30 | return 0 31 | fi 32 | 33 | if [ -x /usr/bin/podman ]; then 34 | CONTAINER_CMD=podman 35 | return 0 36 | fi 37 | 38 | if [ -n "$(which nerdctl 2> /dev/null)" ]; then 39 | CONTAINER_CMD=nerdctl 40 | return 0 41 | fi 42 | 43 | CONTAINER_CMD=docker 44 | 45 | return 0 46 | } 47 | 48 | repo_start () 49 | { 50 | # Check if we already have this container in status exited 51 | STATUS="$($CONTAINER_CMD inspect --format '{{ .State.Status }}' $SOFTWARE_CONTAINER 2>/dev/null)" 52 | if [[ -z "$STATUS" ]] ; then 53 | echo "Creating Docker container: $SOFTWARE_CONTAINER" 54 | $CONTAINER_CMD run --name $SOFTWARE_CONTAINER -p 7777:80 -v $PWD:/usr/share/nginx/html:Z -d nginx 55 | elif [ "$STATUS" = "exited" ] ; then 56 | echo "Starting existing Docker container: $SOFTWARE_CONTAINER" 57 | $CONTAINER_CMD start $SOFTWARE_CONTAINER 58 | fi 59 | return 0 60 | } 61 | 62 | repo_stopremove () 63 | { 64 | # Stop and remove SW repository 65 | $CONTAINER_CMD stop $SOFTWARE_CONTAINER 66 | $CONTAINER_CMD container rm $SOFTWARE_CONTAINER 67 | return 0 68 | } 69 | 70 | repo_bash () 71 | { 72 | # Stop and remove SW repository 73 | $CONTAINER_CMD exec -it $SOFTWARE_CONTAINER /bin/bash 74 | return 0 75 | } 76 | 77 | repo_stop () 78 | { 79 | # Stop SW repository 80 | $CONTAINER_CMD stop $SOFTWARE_CONTAINER 81 | return 0 82 | } 83 | 84 | repo_rm () 85 | { 86 | # Remove SW repository 87 | $CONTAINER_CMD rm $SOFTWARE_CONTAINER 88 | return 0 89 | } 90 | 91 | repo_getIP () 92 | { 93 | # get IP address of repository 94 | IP="$($CONTAINER_CMD inspect --format '{{ .NetworkSettings.IPAddress }}' $SOFTWARE_CONTAINER 2>/dev/null)" 95 | if [ -z "$IP" ] ; then 96 | echo "Unable to locate software repository." 97 | else 98 | echo "Hosting Software repository on" HTTP://$IP 99 | fi 100 | 101 | return 0 102 | } 103 | 104 | get_container_environment 105 | 106 | echo 107 | 108 | case "$PARAM1" in 109 | 110 | start) 111 | repo_start 112 | ;; 113 | 114 | stop) 115 | repo_stop 116 | ;; 117 | 118 | rm) 119 | repo_rm 120 | ;; 121 | 122 | bash) 123 | repo_bash 124 | ;; 125 | 126 | stopremove) 127 | repo_stopremove 128 | ;; 129 | 130 | ip) 131 | repo_getIP 132 | ;; 133 | 134 | *) 135 | 136 | if [ -z "$PARAM1" ]; then 137 | usage 138 | else 139 | echo "Invalid command:" [$PARAM1] 140 | usage 141 | fi 142 | ;; 143 | 144 | esac 145 | 146 | echo 147 | exit 0 148 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_leap/install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ############################################################################ 4 | # Copyright Nash!Com, Daniel Nashed 2019, 2022 - APACHE 2.0 see LICENSE 5 | ############################################################################ 6 | 7 | INSTALL_DIR=$(dirname $0) 8 | export LANG=C 9 | 10 | # Include helper functions 11 | 12 | . $INSTALL_DIR/script_lib.sh 13 | 14 | INSTALL_ADDON_DATA_TAR=$DOMDOCK_DIR/install_data_addon_${PROD_NAME}.taz 15 | 16 | # --- Main Install Logic --- 17 | 18 | header "Environment Setup" 19 | 20 | echo "INSTALL_DIR = [$INSTALL_DIR]" 21 | echo "DownloadFrom = [$DownloadFrom]" 22 | echo "Product = [$PROD_NAME]" 23 | echo "Version = [$PROD_VER]" 24 | echo "DominoUserID = [$DominoUserID]" 25 | 26 | # Check for Linux updates if requested 27 | check_linux_update 28 | 29 | cd "$INSTALL_DIR" 30 | 31 | # Download updated software.txt file if available 32 | download_file_ifpresent "$DownloadFrom" software.txt "$INSTALL_DIR" 33 | 34 | # Installing Add-On Product 35 | 36 | header "$PROD_NAME Installation" 37 | 38 | INST_VER=$PROD_VER 39 | 40 | if [ -n "$INST_VER" ]; then 41 | 42 | # If explicitly specified just download and skip calculating hash 43 | if [ -n "$PROD_DOWNLOAD_FILE" ]; then 44 | echo "Info: Not checking download hash for [$PROD_DOWNLOAD_FILE]" 45 | DOWNLOAD_NAME="$PROD_DOWNLOAD_FILE" 46 | download_and_check_hash "$DownloadFrom" "$DOWNLOAD_NAME" $PROD_NAME . nohash 47 | else 48 | get_download_name $PROD_NAME $INST_VER 49 | download_and_check_hash "$DownloadFrom" "$DOWNLOAD_NAME" $PROD_NAME 50 | fi 51 | 52 | else 53 | log_error "No Target Version specified" 54 | exit 1 55 | fi 56 | 57 | header "Installing $PROD_NAME $INST_VER" 58 | 59 | OSGI_FOLDER="$Notes_ExecDirectory/osgi" 60 | OSGI_VOLT_FOLDER=$OSGI_FOLDER"/volt" 61 | PLUGINS_FOLDER=$OSGI_VOLT_FOLDER"/eclipse/plugins" 62 | VOLT_DATA_DIR=$DOMINO_DATA_PATH"/volt" 63 | LINKS_FOLDER=$OSGI_FOLDER"/rcp/eclipse/links" 64 | LINK_PATH=$OSGI_FOLDER"/volt" 65 | LINK_FILE=$LINKS_FOLDER"/volt.link" 66 | 67 | create_directory "$VOLT_DATA_DIR" $DOMINO_USER $DOMINO_GROUP $DIR_PERM 68 | create_directory "$OSGI_VOLT_FOLDER" root root 755 69 | create_directory "$LINKS_FOLDER" root root 755 70 | create_directory "$PLUGINS_FOLDER" root root 755 71 | 72 | echo 'path='$LINK_PATH > $LINK_FILE 73 | 74 | pwd 75 | cd $PROD_NAME 76 | echo "Unzipping files .." 77 | unzip -q *.zip 78 | 79 | echo "Copying files .." 80 | cp -f "templates/"* "$VOLT_DATA_DIR" 81 | cp -f "bundles/"* "$PLUGINS_FOLDER" 82 | 83 | cd .. 84 | remove_directory $PROD_NAME 85 | 86 | header "Final Steps & Configuration" 87 | 88 | # Ensure permissons are set correctly for data directory 89 | chown -R $DOMINO_USER:$DOMINO_GROUP $DOMINO_DATA_PATH 90 | 91 | # Take a backup copy of Product Data Files 92 | 93 | # Set Installed Version 94 | set_version 95 | 96 | # Copy demopack.zip if present in install dir 97 | if [ -e "$INSTALL_DIR/demopack.zip" ]; then 98 | cp "$INSTALL_DIR/demopack.zip" "$DOMDOCK_DIR/demopack.zip" 99 | fi 100 | 101 | cd $DOMINO_DATA_PATH 102 | tar -czf "$INSTALL_ADDON_DATA_TAR" volt ${PROD_NAME}_ver.txt 103 | 104 | remove_directory "$DOMINO_DATA_PATH" 105 | create_directory "$DOMINO_DATA_PATH" "$DOMINO_USER" $DOMINO_GROUP $DIR_PERM 106 | 107 | # Cleanup repository cache to save space 108 | clean_linux_repo_cache 109 | 110 | header "Successfully completed installation!" 111 | -------------------------------------------------------------------------------- /docs/howto_use_externally.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Export or push image to registries" 4 | nav_order: 6 5 | description: "How to export or push image to registries" 6 | parent: "Howto" 7 | has_children: false 8 | has_toc: false 9 | --- 10 | 11 | # Introduction 12 | 13 | Docker and Podman are both build and run-time platforms, which can be used for test or production to run images. 14 | The image is stored in the local image registry and can be used from there to create a container from the image right away. 15 | 16 | To use images outside our local build environment it needs to either exported or pushed to another registry. 17 | 18 | 19 | ## How to export a container image 20 | 21 | Exporting container images is for example required to run on your favorite NAS with Intel/AMD x64 based container support. 22 | But you might also want to export container images from one Docker environment to a different container environment if there is no direct way to push an image to a registry. 23 | 24 | The container build script provides an easy to use save option, which can also used as part of the build process. 25 | 26 | 27 | ### Container project export options 28 | 29 | To save the image as part of the build process used the following option 30 | 31 | ``` 32 | -save= exports the image after build. e.g. -save=domino-container.tgz 33 | ``` 34 | 35 | To export an image which is already built run the following command. 36 | 37 | ``` 38 | save exports the specified image to tgz format 39 | ``` 40 | 41 | Example: 42 | 43 | ``` 44 | save hclcom/domino:latest domino.tgz 45 | ``` 46 | 47 | 48 | ### Manual export 49 | 50 | ``` 51 | docker save hclcom/domino:latest | gzip > domino.tgz 52 | ``` 53 | 54 | 55 | ### Importing container images 56 | 57 | Importing container images leverages the `load` command. 58 | 59 | ``` 60 | docker load --input Domino_14.5_Container_Image.tgz 61 | ``` 62 | 63 | 64 | ## How to push container images to a remote registry 65 | 66 | To share container images you can push images from a local Docker/Podman environment to remote registry. 67 | The official Docker registry is one of the most well known and used registries. 68 | 69 | **Important:** Because Domino is licensed software images should not be pushed to public registries. 70 | 71 | You can also run a private registry for example the [Harbor registry](https://goharbor.io/) which is an enterprise grade free to use registry which can be installed on prem. 72 | 73 | 74 | ### Tagging and pushing images 75 | 76 | 1. First make sure you have write access to the target registry. You might need to log into the registry. 77 | 78 | 2. Then tag the image with the remote image name 79 | 80 | 3. Finally push the image to the remote registry 81 | 82 | 83 | ``` 84 | docker tag hclcom/domino:latest registry.example.loc/domino:latest 85 | docker push registry.example.loc/domino:latest 86 | ``` 87 | 88 | 89 | ### Pulling images from remote 90 | 91 | Once you have pushed images, it can be pulled from remote on another machine. 92 | 93 | ``` 94 | docker pull registry.example.loc/domino:latest 95 | ``` 96 | 97 | Or you might just reference the image and the container run-time tries to pull it automatically. 98 | 99 | 100 | ### Leveraging a registry based image on Kubernetes(K8s) 101 | 102 | K8s leverage container registries to pull images as well. 103 | Usually you have to create a container pull secret for authentication and specify the container image in your deployment configuration. 104 | 105 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/domsetup/domsetup-webroot/completed.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Waiting for HCL Domino Server start 8 | 38 | 39 | 101 | 102 | 103 | 104 |
105 |
106 |
107 | HCL Domino Server 108 |
109 |
110 | HCL Domino Setup completed – Waiting for server to start 111 |
112 |
113 |
114 |
115 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_volt/install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ############################################################################ 4 | # Copyright Nash!Com, Daniel Nashed 2019, 2022 - APACHE 2.0 see LICENSE 5 | ############################################################################ 6 | 7 | INSTALL_DIR=$(dirname $0) 8 | export LANG=C 9 | 10 | # Include helper functions 11 | 12 | . $INSTALL_DIR/script_lib.sh 13 | 14 | INSTALL_ADDON_DATA_TAR=$DOMDOCK_DIR/install_data_addon_${PROD_NAME}.taz 15 | 16 | # --- Main Install Logic --- 17 | 18 | header "Environment Setup" 19 | 20 | echo "INSTALL_DIR = [$INSTALL_DIR]" 21 | echo "DownloadFrom = [$DownloadFrom]" 22 | echo "Product = [$PROD_NAME]" 23 | echo "Version = [$PROD_VER]" 24 | echo "DominoUserID = [$DominoUserID]" 25 | 26 | # Check for Linux updates if requested 27 | check_linux_update 28 | 29 | cd "$INSTALL_DIR" 30 | 31 | # Download updated software.txt file if available 32 | download_file_ifpresent "$DownloadFrom" software.txt "$INSTALL_DIR" 33 | 34 | # Installing Add-On Product 35 | 36 | header "$PROD_NAME Installation" 37 | 38 | INST_VER=$PROD_VER 39 | 40 | if [ -n "$INST_VER" ]; then 41 | 42 | # If explicitly specified just download and skip calculating hash 43 | if [ -n "$PROD_DOWNLOAD_FILE" ]; then 44 | echo "Info: Not checking download hash for [$PROD_DOWNLOAD_FILE]" 45 | DOWNLOAD_NAME="$PROD_DOWNLOAD_FILE" 46 | download_and_check_hash "$DownloadFrom" "$DOWNLOAD_NAME" $PROD_NAME . nohash 47 | else 48 | get_download_name $PROD_NAME $INST_VER 49 | download_and_check_hash "$DownloadFrom" "$DOWNLOAD_NAME" $PROD_NAME 50 | fi 51 | 52 | else 53 | log_error "No Target Version specified" 54 | exit 1 55 | fi 56 | 57 | header "Installing $PROD_NAME $INST_VER" 58 | 59 | create_directory $DOMINO_USER $DOMINO_GROUP $DIR_PERM 60 | 61 | OSGI_FOLDER="$Notes_ExecDirectory/osgi" 62 | OSGI_VOLT_FOLDER=$OSGI_FOLDER"/volt" 63 | PLUGINS_FOLDER=$OSGI_VOLT_FOLDER"/eclipse/plugins" 64 | VOLT_DATA_DIR=$DOMINO_DATA_PATH"/volt" 65 | LINKS_FOLDER=$OSGI_FOLDER"/rcp/eclipse/links" 66 | LINK_PATH=$OSGI_FOLDER"/volt" 67 | LINK_FILE=$LINKS_FOLDER"/volt.link" 68 | 69 | create_directory "$VOLT_DATA_DIR" $DOMINO_USER $DOMINO_GROUP $DIR_PERM 70 | create_directory "$OSGI_VOLT_FOLDER" root root 755 71 | create_directory "$LINKS_FOLDER" root root 755 72 | create_directory "$PLUGINS_FOLDER" root root 755 73 | 74 | echo 'path='$LINK_PATH > $LINK_FILE 75 | 76 | cd $PROD_NAME 77 | echo "Unzipping files .." 78 | unzip -q *.zip 79 | 80 | echo "Copying files .." 81 | cp -f "templates/"* "$VOLT_DATA_DIR" 82 | cp -f "bundles/"* "$PLUGINS_FOLDER" 83 | 84 | cd .. 85 | remove_directory $PROD_NAME 86 | 87 | header "Final Steps & Configuration" 88 | 89 | # Ensure permissons are set correctly for data directory 90 | chown -R $DOMINO_USER:$DOMINO_GROUP $DOMINO_DATA_PATH 91 | 92 | # Take a backup copy of Product Data Files 93 | 94 | # Set Installed Version 95 | set_version 96 | 97 | # Copy demopack.zip if present in install dir 98 | if [ -e "$INSTALL_DIR/demopack.zip" ]; then 99 | cp "$INSTALL_DIR/demopack.zip" "$DOMDOCK_DIR/demopack.zip" 100 | fi 101 | 102 | cd $DOMINO_DATA_PATH 103 | tar -czf "$INSTALL_ADDON_DATA_TAR" volt ${PROD_NAME}_ver.txt 104 | 105 | remove_directory "$DOMINO_DATA_PATH" 106 | create_directory "$DOMINO_DATA_PATH" "$DOMINO_USER" $DOMINO_GROUP $DIR_PERM 107 | 108 | # Cleanup repository cache to save space 109 | clean_linux_repo_cache 110 | 111 | header "Successfully completed installation!" 112 | -------------------------------------------------------------------------------- /docs/concept_benefits.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Community image benefits" 4 | nav_order: 5 5 | parent: "Concept & Overview" 6 | description: "Community image benefits vs. HCL pre-build image" 7 | has_children: false 8 | --- 9 | 10 | 11 | The ready to use container image is built by HCL based on the Domino and Traveler web-kits using the same community build script. 12 | But there are a couple of benefits using the open source container image build script on your own. 13 | 14 | The build script in the project is easy to use and provides [MHS software download](https://my.hcltechsw.com/) automation and comes with a build menu. 15 | 16 | Below are some differences and benefits when building the container image on your own. 17 | A standard vendor build image can't provide the same flexibility and has to focus on the functionality of the product itself. 18 | 19 | When running the open source container image you are running the same HCL provided software with the same level of support. 20 | It's just built on your own in your own environment with software packages downloaded from the MHS instead of using the pre-cooked standard image. 21 | 22 | Specially container environments require flexibility building and enhancing images. 23 | 24 | 25 | ## Differences and benefits using the community image 26 | 27 | - Building the image on your own ensures you have the latest Redhat UBI image 9.x version included. HCL only updates the image at release time. 28 | 29 | - The container image supports Domino add-on packages like the Domino Leap, the REST API and the language pack. 30 | 31 | - It allows to install the latest version of all add-on products of HCL Verse, Nomad Server, Traveler, REST API, Domino Leap as soon they are available. 32 | 33 | - You can build an all in one image or separate images for different server types. 34 | 35 | - The HCL container image only supports the English locale. The community image allows to build with any locale support and adds your build machines locale as the default. 36 | 37 | - The community image comes with full timezone support. The HCL Container image is intended to run in UTC locale. 38 | 39 | - A shipping container image can only include the bare minimum software needed to run the application. To install additional software you would need to create your own container build environment and build a derived image. 40 | 41 | - The community project supports to define your own add-on packages, which can be installed during the build process. 42 | 43 | - By default the community image is built on the latest Redhat UBI 9.x minimum only selecting the packages needed for Domino and adds a couple of additional useful packages. 44 | 45 | - The HCL image is built on the bigger Redhat UBI 9.1 standard image. See details in Redhat blog post [Introducing the Red Hat Universal Base Image ](https://www.redhat.com/en/blog/introducing-red-hat-universal-base-image). 46 | 47 | - The community image also supports to build on other Domino supported base images. This allows full flexibility and also helps you on software testing if you want to run Domino on a different Linux flavor. See [Supported base images](https://opensource.hcltechsw.com/domino-container/concept_environments/#supported-base-images) for details. 48 | 49 | - If you are a C-API developer you can create a build container which allows you to build for different Domino versions using different versions of the C-API SDK. When selecting the C-API option the container provides a ready to use build environment. 50 | 51 | - In case you need additional Linux packages, the container build script allows to specify those packages when building the image. 52 | -------------------------------------------------------------------------------- /examples/safelinx/nginx.conf: -------------------------------------------------------------------------------- 1 | # NGINX configuration 2 | # ------------------- 3 | 4 | # DNUG Lab configuration example 5 | # June 2022, Daniel Nashed 6 | # Copyright Nash!Com, Daniel Nashed 2022 - APACHE 2.0 see LICENSE 7 | 8 | # - Domino HTTPS 9 | # - SafeLinx + Nomad Web 10 | # - Redirect port HTTP to HTTPS 11 | # - Redirec to ACME HTTP-01 challenges to dedicated Domino CertMgr server 12 | 13 | worker_processes auto; 14 | 15 | events { 16 | worker_connections 1024; 17 | use epoll; 18 | } 19 | 20 | http { 21 | 22 | include mime.types; 23 | default_type application/octet-stream; 24 | sendfile on; 25 | keepalive_timeout 65; 26 | 27 | server { 28 | 29 | # Port 80 is redirected to 443 30 | # Only ACME challenges are redirected to CertMgr server 31 | 32 | listen 80 default_server; 33 | listen [::]:80 default_server; 34 | server_name _; 35 | 36 | # Redirect all ACME request to a fixed Domino CertMgr server 37 | 38 | location /.well-known/acme-challenge/ { 39 | return 301 https://linus.lab.dnug.eu$request_uri; 40 | } 41 | 42 | # Redirect to HTTPS on requesting host 43 | 44 | location / { 45 | return 301 https://$host$request_uri; 46 | } 47 | } 48 | 49 | server { 50 | 51 | # Domino HTTPS 52 | 53 | listen 443 ssl http2; 54 | server_name ray.lab.dnug.eu; 55 | add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; 56 | 57 | ssl_certificate /local/nginx/wild-lab-dnug.pem; 58 | ssl_certificate_key /local/nginx/wild-lab-dnug.key; 59 | 60 | ssl_protocols TLSv1.2 TLSv1.3; 61 | 62 | ssl_session_cache shared:SSL:5m; 63 | ssl_session_timeout 5m; 64 | 65 | #ssl_ciphers HIGH:!aNULL:!MD5:!SHA1; 66 | ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; 67 | ssl_prefer_server_ciphers on; 68 | 69 | access_log off; 70 | 71 | location / { 72 | proxy_set_header Host $host; 73 | proxy_set_header X-Real-IP $remote_addr; 74 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 75 | 76 | # Local IP and Domino container port for HTTPS Domino 77 | proxy_pass https://127.0.0.1:444; 78 | } 79 | } 80 | 81 | server { 82 | 83 | # SafeLinx Nomad Web config with Web Sockets 84 | 85 | listen 443 ssl http2; 86 | server_name nomad.lab.dnug.eu; 87 | add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; 88 | 89 | ssl_certificate /local/nginx/wild-lab-dnug.pem; 90 | ssl_certificate_key /local/nginx/wild-lab-dnug.key; 91 | 92 | ssl_protocols TLSv1.2 TLSv1.3; 93 | 94 | ssl_session_cache shared:SSL:5m; 95 | ssl_session_timeout 5m; 96 | 97 | #ssl_ciphers HIGH:!aNULL:!MD5:!SHA1; 98 | ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; 99 | ssl_prefer_server_ciphers on; 100 | 101 | access_log off; 102 | 103 | 104 | # Redirect base URL to Nomad URL 105 | location = / { 106 | return 301 https://$host/nomad; 107 | } 108 | 109 | location / { 110 | 111 | proxy_set_header Upgrade $http_upgrade; 112 | proxy_set_header Connection "Upgrade"; 113 | proxy_set_header Host $host; 114 | proxy_set_header X-Real-IP $remote_addr; 115 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 116 | proxy_http_version 1.1; 117 | 118 | # Local IP port for HTTPS SafeLinx 119 | proxy_pass https://127.0.0.1:445; 120 | } 121 | } 122 | 123 | } 124 | 125 | -------------------------------------------------------------------------------- /docs/concept_autotesting.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Automation Testing" 4 | nav_order: 7 5 | parent: "Concept & Overview" 6 | description: "Automation Testing" 7 | has_children: false 8 | --- 9 | 10 | 11 | # Introduction 12 | 13 | Automation testing plays and important role in software development. 14 | The community image itself can be part of your automation test infrastructure. 15 | 16 | On the other side also the container image itself needs to be automation tested. 17 | The `testing` directory contains an automation test script, which invokes a Domino server configured via Domino One Touch Setup (OTS) and performs automation tests to ensure the container image is functional. 18 | 19 | The automation test can be added to the build process (`-autotest`) and is performed before the image is tagged latest or with another specific label and before the image is optionally pushed to a registry. The automation test script `AutomationTest.sh` can be also started manually on any Domino container image by specifying the image via `-image=xyz`. 20 | 21 | 22 | # Container label for add-on software 23 | 24 | The main labels are reflecting the Domino version. 25 | Additional software components are added to a combined label `DominoContainer.addons` specifying all additional Domino software added. 26 | 27 | Example: ```"DominoContainer.addons": "ontime=11.1.1,languagepack=DE,verse=3.2.0,nomad=1.0.9-14.0,traveler=14.0,domrestapi=1.0.8,capi=14.0,leap=1.1.3"``` 28 | 29 | The add-on software listed in this label is end to end validated by starting the application and querying the corresponding end points. For example for Traveler using the authenticated status query. 30 | 31 | # Example output with add-ons installed 32 | 33 | ``` 34 | -------------------------------------------------------------------------------- 35 | Test Results 36 | -------------------------------------------------------------------------------- 37 | 38 | { 39 | "testResults": { 40 | "harness": "DominoCommunityImage", 41 | "suite": "Regression", 42 | "testClient": "testing.notes.lab", 43 | "testServer": "testing.notes.lab", 44 | "platform": "CentOS Stream 9", 45 | "platformVersion": "9 CentOS Stream", 46 | "hostVersion": "9 CentOS Stream", 47 | "hostPlatform": "CentOS Stream 9", 48 | "testBuild": "14.0", 49 | "containerPlatform": "docker", 50 | "containerPlatformVersion": "24.0.7", 51 | "kernelVersion": "5.14.0-390.el9.x86_64", 52 | "kernelBuildTime": "#1 SMP PREEMPT_DYNAMIC Fri Nov 24 10:44:56 UTC 2023", 53 | "glibcVersion": "2.34", 54 | "timezone": "Etc/UTC", 55 | "javaVersion": "17.0.8.1 2023-08-24", 56 | "dominoAddons": "ontime=11.1.1,languagepack=DE,verse=3.2.0,nomad=1.0.9-14.0,traveler=14.0,domrestapi=1.0.8,capi=14.0,leap=1.1.3", 57 | "testcase": [ 58 | { 59 | 60 | ... 61 | 62 | [ SUCCESS ] addon.installed.ontime 63 | [ SUCCESS ] addon.installed.languagepack 64 | [ SUCCESS ] addon.installed.verse 65 | [ SUCCESS ] addon.installed.nomad 66 | [ SUCCESS ] addon.installed.traveler 67 | [ SUCCESS ] addon.installed.domrestapi 68 | [ SUCCESS ] addon.installed.capi 69 | [ SUCCESS ] addon.installed.leap 70 | [ SUCCESS ] domino.jvm.available 71 | [ SUCCESS ] domino.server.running 72 | [ SUCCESS ] domino.http.running 73 | [ SUCCESS ] domino.certificate.available 74 | [ SUCCESS ] domino.server.onetouch.microca-cert 75 | [ SUCCESS ] capi.compile&run 76 | [ SUCCESS ] traveler.server.available 77 | [ SUCCESS ] nomad.server.available 78 | [ SUCCESS ] verse.server.available 79 | [ SUCCESS ] restapi.server.available 80 | [ SUCCESS ] domino-leap.server.available 81 | [ SUCCESS ] domino-leap.server.version 82 | [ SUCCESS ] domino.server.onetouch.createdb 83 | [ SUCCESS ] domino.idvault.create 84 | [ SUCCESS ] domino.backup.create 85 | [ SUCCESS ] startscript.archivelog 86 | [ SUCCESS ] container.health 87 | [ SUCCESS ] startscript.server.restart 88 | [ SUCCESS ] domino.translog.create 89 | 90 | -------------------------------------------------------------------------------- 91 | 92 | Success : 27 93 | Error : 0 94 | Total : 27 95 | ``` 96 | 97 | -------------------------------------------------------------------------------- /docs/_config.yml: -------------------------------------------------------------------------------- 1 | 2 | # Site settings 3 | theme: jekyll-theme-minimal 4 | remote_theme: pmarsceill/just-the-docs 5 | title: Domino for Docker Containers 6 | description: Scripts to build HCL Domino container images 7 | version: 1.0 8 | logo: "/assets/images/svg/Domino.svg" 9 | git_url: "https://github.com/HCL-TECH-SOFTWARE/domino-container" 10 | baseurl: "/domino-container" 11 | permalink: pretty 12 | exclude: 13 | [ 14 | "*.gemspec", 15 | "*.gem", 16 | "Gemfile", 17 | "Gemfile.lock", 18 | "lib/", 19 | "bin/", 20 | "README.md", 21 | "Rakefile", 22 | ] 23 | 24 | # Set a path/url to a logo that will be displayed instead of the title 25 | #logo: "/assets/images/just-the-docs.png" 26 | 27 | # Enable or disable the site search 28 | # Supports true (default) or false 29 | search_enabled: true 30 | search: 31 | # Split pages into sections that can be searched individually 32 | # Supports 1 - 6, default: 2 33 | heading_level: 2 34 | # Maximum amount of previews per search result 35 | # Default: 3 36 | previews: 5 37 | # Maximum amount of words to display before a matched word in the preview 38 | # Default: 5 39 | preview_words_before: 10 40 | # Maximum amount of words to display after a matched word in the preview 41 | # Default: 10 42 | preview_words_after: 10 43 | # Set the search token separator 44 | # Default: /[\s\-/]+/ 45 | # Example: enable support for hyphenated search words 46 | tokenizer_separator: /[\s/]+/ 47 | # Display the relative url in search results 48 | # Supports true (default) or false 49 | rel_url: true 50 | # Enable or disable the search button that appears in the bottom right corner of every page 51 | # Supports true or false (default) 52 | button: false 53 | 54 | # Enable or disable heading anchors 55 | heading_anchors: true 56 | 57 | # Aux links for the upper right navigation 58 | aux_links: 59 | "View it on GitHub": 60 | - "https://github.com/HCL-TECH-SOFTWARE/domino-container" 61 | 62 | 63 | # Makes Aux links open in a new tab. Default is false 64 | aux_links_new_tab: true 65 | 66 | # Sort order for navigation links 67 | # nav_sort: case_insensitive # default, equivalent to nil 68 | nav_sort: case_insensitive # Capital letters sorted before lowercase 69 | 70 | # Footer content 71 | # appears at the bottom of every page's main content 72 | 73 | # Back to top link 74 | back_to_top: true 75 | back_to_top_text: "Back to top" 76 | 77 | next_page: true 78 | 79 | footer_content: "HCL Domino Container" 80 | 81 | # Footer last edited timestamp 82 | # last_edit_timestamp: true # show or hide edit time - page must have `last_modified_date` defined in the frontmatter 83 | # last_edit_time_format: "%b %e %Y at %I:%M %p" # uses ruby's time format: https://ruby-doc.org/stdlib-2.7.0/libdoc/time/rdoc/Time.html 84 | 85 | # Footer "Edit this page on GitHub" link text 86 | gh_edit_link: true # show or hide edit this page link 87 | gh_edit_link_text: "Edit this page on GitHub" 88 | # the github URL for your repo 89 | gh_edit_repository: "https://github.com/HCL-TECH-SOFTWARE/domino-container" 90 | gh_edit_branch: "master" # the branch that your docs is served from 91 | gh_edit_source: docs # the source that your files originate from 92 | gh_edit_view_mode: "tree" # "tree" or "edit" if you want the user to jump into the editor immediately 93 | 94 | # Color scheme currently only supports "dark", "light"/nil (default), or a custom scheme that you define 95 | color_scheme: nil 96 | 97 | # Google Analytics Tracking (optional) 98 | # e.g, UA-1234567-89 99 | #ga_tracking: UA-2709176-10 100 | ga_tracking_anonymize_ip: true # Use GDPR compliant Google Analytics settings (true/nil by default) 101 | 102 | plugins: 103 | - jekyll-seo-tag 104 | 105 | highlighter: rouge 106 | 107 | kramdown: 108 | input: GFM 109 | syntax_highlighter: rouge 110 | # syntax_highlighter_opts: 111 | # block: 112 | # line_numbers: true 113 | # compress_html: 114 | # clippings: all 115 | # comments: all 116 | # endings: all 117 | # startings: [] 118 | # blanklines: false 119 | # profile: false 120 | # # ignore: 121 | # # envs: all 122 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Code of Conduct 4 | parent: Understanding Open Source Obligations 5 | grand_parent: Resources 6 | nav_order: 6 7 | --- 8 | 9 | # Contributor Covenant Code of Conduct 10 | 11 | Projects should foster a positive environment, to ensure active and pleasant participation for all. This is wording for a contributor covenant, amended from [Contributor Covenant 2.0](https://www.contributor-covenant.org/version/2/0/code_of_conduct/). 12 | 13 | ## Our Pledge 14 | 15 | We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. 16 | 17 | We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. 18 | 19 | ## Our Standards 20 | 21 | Examples of behavior that contributes to a positive environment for our community include: 22 | 23 | -> Demonstrating empathy and kindness toward other people 24 | - Being respectful of differing opinions, viewpoints, and experiences 25 | - Giving and gracefully accepting constructive feedback 26 | - Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience 27 | - Focusing on what is best not just for us as individuals, but for the overall community 28 | 29 | Examples of unacceptable behavior include: 30 | 31 | - The use of sexualized language or imagery, and sexual attention or advances of any kind 32 | - Trolling, insulting or derogatory comments, and personal or political attacks 33 | - Public or private harassment 34 | - Publishing others’ private information, such as a physical or email address, without their explicit permission 35 | - Other conduct which could reasonably be considered inappropriate in a professional setting 36 | 37 | ## Enforcement Responsibilities 38 | 39 | Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. 40 | 41 | Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. 42 | 43 | ## Scope 44 | 45 | This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. 46 | 47 | ## Enforcement 48 | 49 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the HCL Open Source Project Officer, who is responsible for enforcement, at [ospo.hclsoftware@hcl.com](mailto:ospo.hclsoftware@hcl.com). All complaints will be reviewed and investigated promptly and fairly. The HCL Open Source Project Office is obligated to respect the privacy and security of the reporter of any incident. Details of enforcement policies may be posted separately. 50 | 51 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by the HCL Open Source Project Office. 52 | 53 | ## Attribution 54 | 55 | This Code of Conduct is adapted from the Contributor Covenant, version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 56 | 57 | Community Impact Guidelines were inspired by Mozilla’s code of conduct enforcement ladder. 58 | 59 | For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. 60 | -------------------------------------------------------------------------------- /docs/architecture_startup-cfg-flow.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Startup & Config Flow" 4 | nav_order: 2 5 | description: "Startup and Configuration Flow" 6 | parent: "Architecture" 7 | has_children: false 8 | --- 9 | 10 | # Domino Docker Startup and Configuration Flow 11 | 12 | This document describes the general setup and update flow used. 13 | The main entry point is called by the container platform and will remain active while the server is running. 14 | It is controlling all setup and update operations if a new server is started or a server is running for the first time with a new/updated image. 15 | The following abstract is mainly intended for understanding the general flow. Please refer to other sections for details about environment variables in detail. 16 | 17 | ## /entrypoint.sh 18 | 19 | Main entry point to run the Domino server. 20 | The logic also takes care of server setup and updates the server without separate parameters specified. 21 | This logic is performed automatically based on the version variables in the container and the image. 22 | 23 | This project leverages the Nash!Com Domino on Linux/Unix start script, from which also the `entrypoint-sh` logic is derived. 24 | The start script is not only useful for start/stop operations, but also provides additional functionality like 25 | generating NSDs, managing logs, creating NSDs, accessing the remote console and many more. 26 | Refer to the Nash!Com start script [documentation](https://nashcom.github.io/domino-startscript/) for details. 27 | 28 | You can customize the start script configuration either by overwriting `/etc/sysconfig/rc_domino_config` 29 | or passing all not explicitly configured parameters via environment variables 30 | (all variables start with `DOMINO_`. Leveraging the start script offers admins the same functionality they already know from Domino on Linux and AIX. 31 | 32 | The following steps are performed by the entry-point script and helper scripts: 33 | 34 | - Setup environment (path, umask, user, etc.) 35 | 36 | - Check if we have a LOGONNAME else we need to patch `/etc/passwd` via `nuid2pw` (only required for K8s deployments with special user-id requirements) 37 | 38 | Note: Important if specifying a UID or running on a platform that needs a separate user per Pod and doesn't take care about it on it's own (K8s). 39 | 40 | - Run `/domino-container/scripts/domino_install_data_copy.sh` (setup & update data directory see below) 41 | 42 | 43 | - Check if server is configured (notes.ini `ServerSetup=` is empty) 44 | 45 | - if not configured run -> `/domino-container/scripts/domino_prestart.sh` 46 | 47 | - If still not configured start setup via listening mode 48 | 49 | 50 | - Start domino running the start script `rc_domino_script` 51 | 52 | 53 | ## domino_install_data_copy.sh 54 | 55 | This script is intended for first data directory deployment or update 56 | 57 | Checks if `/local/notesdata/notes.ini` already exists. if not executes the following logic: 58 | 59 | - Creates directories depending on how the container volumes are mounted 60 | (Directories are recreated if empty and not a mount point) 61 | 62 | - Extracts install `/domino-container/install_data_domino.taz` to `/local/notesdata` 63 | this is the first deployment for a new container. 64 | 65 | 66 | - Checks if version has been updated and copies new templates etc. 67 | - The check is performed via version files in the data directory and in the container to compare if "image file version = version in the data volume" 68 | 69 | 70 | ## domino_prestart.sh 71 | 72 | Automatic configuration in Domino 12 leverages OneTouch Setup. 73 | Earlier versions used a special PDS file automation configuration. 74 | Domino OneTouch Setup is the recommended way since Domino 12 to automatically setup a Domino server. 75 | Older servers will always run into the standard remote configuration mode via `server -listen 1352`. 76 | 77 | This script is used for additional operations before a OneTouch Setup is invoked. 78 | 79 | - If specified downloads and extracts `$CustomNotesdataZip` into `/local/notesdata` 80 | 81 | - Download files and get password variables 82 | 83 | - ( e.g. `server.id`, organization password, trial license file etc) 84 | 85 | 86 | ## Default configuration if no OneTouch Setup is specified 87 | 88 | If no configuration is found and no OneTouch Setup is specified the server will launch the remote setup listening on port 1352. 89 | 90 | The server will be automatically started with `server -listen 1352` as a fall-back. 91 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_common/healthcheck.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ############################################################################ 4 | # Copyright Nash!Com, Daniel Nashed 2019, 2025 - APACHE 2.0 see LICENSE 5 | ############################################################################ 6 | # 7 | # This script defines the health check script 8 | # The "ready" option can be used for a readiness check 9 | # 10 | # The following checks can be configured 11 | # 12 | # 1. Check health check status file if present 13 | # File checked: /tmp/domino_check.txt 14 | # 15 | # 2. Check if port is responding when configured 16 | # Defined in: /local/notesdata/health_port.cfg 17 | # 18 | # 3. Fallback if nothing else is configured 19 | # Check if server process is running 20 | # 21 | # Takes into account service status 22 | # 23 | ############################################################################ 24 | 25 | 26 | log() 27 | { 28 | if [ -n "$HEALTH_CHECK_LOG" ]; then 29 | echo "$@" >> "$HEALTH_CHECK_LOG" 30 | fi 31 | } 32 | 33 | 34 | # Health check defines 35 | DOMINO_PID=/tmp/domino.pid 36 | DOMINO_REQEST_FILE=/tmp/domino_request 37 | DOMINO_STATUS_FILE=/tmp/domino_status 38 | 39 | HEALTH_CHECK_PORT_FILE=/local/notesdata/health_port.cfg 40 | HEALTH_CHECK_FILE=/tmp/domino_check.txt 41 | HEALTHY_STRING="OK" 42 | 43 | LOTUS=/opt/hcl/domino 44 | 45 | # We support "ready" checks and by default health checks 46 | if [ "$1" = "ready" ]; then 47 | CHECK_READY=1 48 | fi 49 | 50 | 51 | return_ready() 52 | { 53 | if [ -z "$CHECK_READY" ]; then 54 | return 0 55 | fi 56 | 57 | log "result: $1" 58 | exit $1 59 | } 60 | 61 | 62 | return_health() 63 | { 64 | log "result: $1" 65 | exit $1 66 | } 67 | 68 | 69 | # -- Main logic -- 70 | 71 | log "" 72 | log "[$(date -Iseconds)]" 73 | 74 | 75 | # If server is shutdown, report server is running but not ready 76 | 77 | if [ ! -e "$DOMINO_PID" ]; then 78 | log "Server is shutdown" 79 | return_ready 1 80 | return_health 0 81 | fi 82 | 83 | if [ -e "$DOMINO_STATUS_FILE" ]; then 84 | DOMINO_STATUS=$(cat "$DOMINO_STATUS_FILE") 85 | log "Domino status file: [$DOMINO_STATUS_FILE] -> [$DOMINO_STATUS]" 86 | else 87 | DOMINO_STATUS= 88 | fi 89 | 90 | 91 | if [ "$DOMINO_STATUS" = "0" ]; then 92 | return_ready 1 93 | return_health 0 94 | fi 95 | 96 | if [ "$DOMINO_STATUS" = "c" ]; then 97 | return_ready 1 98 | return_health 0 99 | fi 100 | 101 | 102 | # Domino shutdown requested? -> healthy but not ready 103 | 104 | if [ -e "$DOMINO_REQUEST_FILE" ]; then 105 | DOMINO_REQUEST=$(cat $DOMINO_REQUEST_FILE) 106 | log "Request file [$DOMINO_REQUEST_FILE] -> [$DOMINO_REQUEST]" 107 | else 108 | DOMINO_REQUEST= 109 | fi 110 | 111 | if [ "$DOMINO_REQUEST" = "0" ]; then 112 | return_ready 1 113 | return_health 0 114 | fi 115 | 116 | 117 | # 1. Check a health check file 118 | 119 | if [ -n "$HEALTH_CHECK_FILE" ] && [ -e "$HEALTH_CHECK_FILE" ]; then 120 | 121 | if [ -z "$HEALTHY_STRING" ]; then 122 | $HEALTHY_STRING="OK" 123 | fi 124 | 125 | FOUND=$(grep -e "$HEALTHY_STRING" "$HEALTH_CHECK_FILE" | wc -l) 126 | 127 | log "Checking [$HEALTH_CHECK_FILE] for [$HEALTHY_STRING] -> [$FOUND]" 128 | 129 | if [ "$FOUND" = "0" ]; then 130 | return_ready 1 131 | return_health 1 132 | fi 133 | 134 | return_ready 0 135 | return_health 0 136 | fi 137 | 138 | 139 | # 2. Check if configured port is responding (health check can be configured in a file or env variable) 140 | 141 | if [ -n "$HEALTH_CHECK_PORT_FILE" ]; then 142 | if [ -e "$HEALTH_CHECK_PORT_FILE" ]; then 143 | HEALTH_CHECK_PORT=$(cat $HEALTH_CHECK_PORT_FILE) 144 | fi 145 | fi 146 | 147 | if [ -n "$HEALTH_CHECK_PORT" ]; then 148 | 149 | log "Checking ports: [$HEALTH_CHECK_PORT]" 150 | 151 | for port in $HEALTH_CHECK_PORT; do 152 | 153 | timeout 10 bash -c " /dev/null 154 | if [ "$?" != "0" ]; then 155 | log "Port [$port] is down" 156 | return_ready 1 157 | return_health 1 158 | fi 159 | 160 | done 161 | 162 | return_ready 0 163 | return_health 0 164 | 165 | fi 166 | 167 | 168 | # 3. Fallback option: Check if server process is running 169 | 170 | DOMINO_RUNNING=$(ps -ef | grep "$LOTUS/notes" | grep "server" | grep -v " -jc") 171 | 172 | log "Domino Server process line: $DOMINO_RUNNING" 173 | 174 | if [ -z "$DOMINO_RUNNING" ]; then 175 | return_ready 1 176 | return_health 1 177 | else 178 | return_ready 0 179 | return_health 0 180 | fi 181 | 182 | exit 0 183 | 184 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_safelinx/healthcheck.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ############################################################################ 4 | # Copyright Nash!Com, Daniel Nashed 2019, 2025 - APACHE 2.0 see LICENSE 5 | ############################################################################ 6 | # 7 | # This script defines the health check script 8 | # The "ready" option can be used for a readiness check 9 | # 10 | # The following checks can be configured 11 | # 12 | # 1. Check health check status file if present 13 | # File checked: /tmp/domino_check.txt 14 | # 15 | # 2. Check if port is responding when configured 16 | # Defined in: /local/notesdata/health_port.cfg 17 | # 18 | # 3. Fallback if nothing else is configured 19 | # Check if server process is running 20 | # 21 | # Takes into account service status 22 | # 23 | ############################################################################ 24 | 25 | 26 | log() 27 | { 28 | if [ -n "$HEALTH_CHECK_LOG" ]; then 29 | echo "$@" >> "$HEALTH_CHECK_LOG" 30 | fi 31 | } 32 | 33 | 34 | # Health check defines 35 | DOMINO_PID=/tmp/domino.pid 36 | DOMINO_REQEST_FILE=/tmp/domino_request 37 | DOMINO_STATUS_FILE=/tmp/domino_status 38 | 39 | HEALTH_CHECK_PORT_FILE=/local/notesdata/health_port.cfg 40 | HEALTH_CHECK_FILE=/tmp/domino_check.txt 41 | HEALTHY_STRING="OK" 42 | 43 | LOTUS=/opt/hcl/domino 44 | 45 | # We support "ready" checks and by default health checks 46 | if [ "$1" = "ready" ]; then 47 | CHECK_READY=1 48 | fi 49 | 50 | 51 | return_ready() 52 | { 53 | if [ -z "$CHECK_READY" ]; then 54 | return 0 55 | fi 56 | 57 | log "result: $1" 58 | exit $1 59 | } 60 | 61 | 62 | return_health() 63 | { 64 | log "result: $1" 65 | exit $1 66 | } 67 | 68 | 69 | # -- Main logic -- 70 | 71 | log "" 72 | log "[$(date -Iseconds)]" 73 | 74 | 75 | # If server is shutdown, report server is running but not ready 76 | 77 | if [ ! -e "$DOMINO_PID" ]; then 78 | log "Server is shutdown" 79 | return_ready 1 80 | return_health 0 81 | fi 82 | 83 | if [ -e "$DOMINO_STATUS_FILE" ]; then 84 | DOMINO_STATUS=$(cat "$DOMINO_STATUS_FILE") 85 | log "Domino status file: [$DOMINO_STATUS_FILE] -> [$DOMINO_STATUS]" 86 | else 87 | DOMINO_STATUS= 88 | fi 89 | 90 | 91 | if [ "$DOMINO_STATUS" = "0" ]; then 92 | return_ready 1 93 | return_health 0 94 | fi 95 | 96 | if [ "$DOMINO_STATUS" = "c" ]; then 97 | return_ready 1 98 | return_health 0 99 | fi 100 | 101 | 102 | # Domino shutdown requested? -> healthy but not ready 103 | 104 | if [ -e "$DOMINO_REQUEST_FILE" ]; then 105 | DOMINO_REQUEST=$(cat $DOMINO_REQUEST_FILE) 106 | log "Request file [$DOMINO_REQUEST_FILE] -> [$DOMINO_REQUEST]" 107 | else 108 | DOMINO_REQUEST= 109 | fi 110 | 111 | if [ "$DOMINO_REQUEST" = "0" ]; then 112 | return_ready 1 113 | return_health 0 114 | fi 115 | 116 | 117 | # 1. Check a health check file 118 | 119 | if [ -n "$HEALTH_CHECK_FILE" ] && [ -e "$HEALTH_CHECK_FILE" ]; then 120 | 121 | if [ -z "$HEALTHY_STRING" ]; then 122 | $HEALTHY_STRING="OK" 123 | fi 124 | 125 | FOUND=$(grep -e "$HEALTHY_STRING" "$HEALTH_CHECK_FILE" | wc -l) 126 | 127 | log "Checking [$HEALTH_CHECK_FILE] for [$HEALTHY_STRING] -> [$FOUND]" 128 | 129 | if [ "$FOUND" = "0" ]; then 130 | return_ready 1 131 | return_health 1 132 | fi 133 | 134 | return_ready 0 135 | return_health 0 136 | fi 137 | 138 | 139 | # 2. Check if configured port is responding (health check can be configured in a file or env variable) 140 | 141 | if [ -n "$HEALTH_CHECK_PORT_FILE" ]; then 142 | if [ -e "$HEALTH_CHECK_PORT_FILE" ]; then 143 | HEALTH_CHECK_PORT=$(cat $HEALTH_CHECK_PORT_FILE) 144 | fi 145 | fi 146 | 147 | if [ -n "$HEALTH_CHECK_PORT" ]; then 148 | 149 | log "Checking ports: [$HEALTH_CHECK_PORT]" 150 | 151 | for port in $HEALTH_CHECK_PORT; do 152 | 153 | timeout 10 bash -c " /dev/null 154 | if [ "$?" != "0" ]; then 155 | log "Port [$port] is down" 156 | return_ready 1 157 | return_health 1 158 | fi 159 | 160 | done 161 | 162 | return_ready 0 163 | return_health 0 164 | 165 | fi 166 | 167 | 168 | # 3. Fallback option: Check if server process is running 169 | 170 | DOMINO_RUNNING=$(ps -ef | grep "$LOTUS/notes" | grep "server" | grep -v " -jc") 171 | 172 | log "Domino Server process line: $DOMINO_RUNNING" 173 | 174 | if [ -z "$DOMINO_RUNNING" ]; then 175 | return_ready 1 176 | return_health 1 177 | else 178 | return_ready 0 179 | return_health 0 180 | fi 181 | 182 | exit 0 183 | 184 | -------------------------------------------------------------------------------- /docs/howto_docker-wsl.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Docker on WSL2" 4 | nav_order: 5 5 | description: "Docker on WSL2" 6 | parent: "Howto" 7 | has_children: false 8 | --- 9 | 10 | # Introduction 11 | 12 | Microsoft offers [WSL2](https://docs.microsoft.com/en-us/windows/wsl/) a very interesting Linux integration platform, 13 | which is very convenient and flexible for local build and run-time environments. 14 | It can be used as build and run-time environment for Domino on Docker. 15 | 16 | The most flexible setup is to run one of the standard Linux distributions and install a Docker Linux host on the WSL2 instance. 17 | WSL2 is also used in current Docker Desktop installations. Important for a build environment is any Docker or Podman installation with Bash support. 18 | 19 | # Requirements 20 | 21 | Ensure you run at least 22 | 23 | - Windows 10 version 2004 or higher 24 | - Windows 11 25 | - Windows 2022 26 | - Windows 2025 27 | 28 | # Install WSL2 29 | 30 | Today WSL2 should be the default for each new installation. 31 | In case you are running the older WSL version, you have to switch to WSL2. 32 | Refer to details in the reference link below. 33 | 34 | ``` 35 | wsl --install 36 | ``` 37 | 38 | # Install Linux Distribution 39 | 40 | Once WSL2 is installed, WSL can list all available Linux distributions. 41 | 42 | 43 | ## List available images 44 | 45 | ``` 46 | wsl --list --online 47 | ``` 48 | 49 | 50 | ## Example installing Ubuntu 51 | 52 | The default distribution is Ubuntu. Make sure you select a LTS version to ensure long term support. 53 | 54 | ``` 55 | wsl --install -d Ubuntu-24.04 56 | ``` 57 | 58 | Once Ubuntu is installed, it can be launched in multiple ways: 59 | 60 | - Desktop/taskbar icon 61 | - `wsl` command line 62 | - Software like [MobaXterm](https://mobaxterm.mobatek.net/) with WSL integration 63 | 64 | 65 | ## Create a new user 66 | 67 | When the container is launched for the first time, it asks to create a new user. 68 | For a Domino on Docker environment the best first user is `notes`. 69 | 70 | On Ubuntu the `root` user can be switched to via `sudo su -` specifying your `notes` user password. 71 | 72 | ``` 73 | sudo su - 74 | ``` 75 | 76 | ## Update Ubuntu 77 | 78 | The installed WSL Linux instance is not up to date after installation. 79 | 80 | ``` 81 | apt update 82 | apt upgrade 83 | ``` 84 | 85 | 86 | ## Install Docker Server 87 | 88 | Ubuntu does not provide the latest Docker versions. 89 | 90 | It is recommended to use the official Docker documentation to ensure to get a recent version. 91 | Follow the steps for [Install Docker Engine](https://docs.docker.com/engine/install/). 92 | 93 | An alternate way to install is to use the Docker convenience script provided by Docker. 94 | It can be automatically downloaded and executed. 95 | 96 | ``` 97 | curl -fsSL https://get.docker.com | bash - 98 | ``` 99 | 100 | The latest Ubuntu WSL images support systemd. Earlier versions did not support systemd and required work-arounds to start the Docker daemon. 101 | In current Ubuntu versions The Docker server is installed as a systemd services automatically. 102 | 103 | 104 | ## Install JQ 105 | 106 | JQ is the standard tool for working with JSON files. 107 | The domino_container scripts leverage JQ, which is included in all major distributions including Ubuntu. 108 | 109 | ``` 110 | apt install jq 111 | ``` 112 | 113 | 114 | ## Clone Docker Container Project 115 | 116 | ``` 117 | mkdir -p /local/github 118 | cd /local/github 119 | git clone https://github.com/HCL-TECH-SOFTWARE/domino-container.git 120 | ``` 121 | 122 | ## Clone Start Script project & Install Nash!Com Domino Container Control Script 123 | 124 | **dominoctl** provides an easy way to configure, run and manage Domino containers. 125 | Check [Domino container control (dominoctl)](https://nashcom.github.io/domino-startscript/dominoctl/) documentation for details. 126 | 127 | 128 | To clone the GitHub project invoke the following command: 129 | 130 | ``` 131 | cd /local/github 132 | git clone https://github.com/nashcom/domino-startscript.git 133 | ``` 134 | 135 | To install or update dominoctl run the following command 136 | 137 | ``` 138 | /local/github/domino-startscript/install_dominoctl 139 | ``` 140 | 141 | 142 | ## Check the Docker Client and Server Version 143 | 144 | ``` 145 | docker version 146 | ``` 147 | 148 | 149 | ## Next Steps 150 | 151 | This completes the setup for your Docker environment. 152 | 153 | Contine with [Quickstart](quickstart.md) to build and run your first container. 154 | 155 | 156 | ## Reference 157 | 158 | [Microsoft WSL2 install documentation](https://docs.microsoft.com/en-us/windows/wsl/install). 159 | 160 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Domino Docker Containers 2 | 3 | [![HCL Domino](https://img.shields.io/badge/HCL-Domino-ffde21?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgNzE0LjMzIDcxNC4zMyI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiM5M2EyYWQ7fS5jbHMtMntmaWxsOnVybCgjbGluZWFyLWdyYWRpZW50KTt9PC9zdHlsZT48bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhci1ncmFkaWVudCIgeDE9Ii0xMjA3LjIiIHkxPSItMTQzIiB4Mj0iLTEwMzguNjYiIHkyPSItMTQzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDYsIDAuMTMsIC0wLjExLCAwLjk5LCAxMzUzLjcsIDYwMC42MikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmRmNDEiLz48c3RvcCBvZmZzZXQ9IjAuMjYiIHN0b3AtY29sb3I9IiNmZWRjM2QiLz48c3RvcCBvZmZzZXQ9IjAuNSIgc3RvcC1jb2xvcj0iI2ZiZDIzMiIvPjxzdG9wIG9mZnNldD0iMC43NCIgc3RvcC1jb2xvcj0iI2Y2YzExZiIvPjxzdG9wIG9mZnNldD0iMC45NyIgc3RvcC1jb2xvcj0iI2VmYWEwNCIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2VlYTYwMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxnIGlkPSJMYXllcl8zIiBkYXRhLW5hbWU9IkxheWVyIDMiPjxwb2x5Z29uIGNsYXNzPSJjbHMtMSIgcG9pbnRzPSI0MzcuNDYgMjgzLjI4IDMzNi40NiA1MDYuNjkgMjExLjY4IDUwNy40NSAzNjYuOTIgMTYyLjYxIDQzNy40NiAyODMuMjgiLz48cG9seWdvbiBjbGFzcz0iY2xzLTEiIHBvaW50cz0iNjQwLjU5IDMwNC4xIDUyOS4wMiA1NTEuOTYgMzUzLjYzIDU2Ni42MiA1NDIuMzIgMTQ3LjcxIDY0MC41OSAzMDQuMSIvPjxwb2x5Z29uIGNsYXNzPSJjbHMtMiIgcG9pbnRzPSIyNzMuMTkgMjY1LjM3IDE5MC4xMSA0NTAuMDYgNzMuNzQgNDM5LjI4IDE5NC4zMiAxNzEuMzMgMjczLjE5IDI2NS4zNyIvPjwvZz48L3N2Zz4K 4 | )](https://www.hcl-software.com/domino) 5 | [![License: Apache 2.0](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/nashcom/buil-test/blob/main/LICENSE) 6 | 7 | 8 | This project contains build scripts for HCL Domino Docker/Container images via [dockerfiles](https://docs.docker.com/engine/reference/builder/). 9 | The repository provides the utilities to build HCL Domino Server with the latest software or specific version in a Docker/Container image. 10 | There are separate folders within this repository for Domino add-on HCL products like Traveler and HCL Domino Leap as well. 11 | 12 | ## You are looking to (just) configure & control Domino container instances - not to build containers? 13 | 14 | You are in luck, just at the wrong place. Head over to [Nash!Com's Domino start script](https://github.com/nashcom/domino-startscript) and follow the instructions there. There is no need to use this repository. 15 | 16 | ## Where to get HCL Domino software 17 | 18 | The project uses the official HCL web-kit installers to build container images download from the new official [My HCLSoftware Portal](https://my.hcltechsw.com/). 19 | 20 | - All HCL customers with active maintenance should have a download account 21 | - The [Partner Pack](https://www.hcltechsw.com/resources/partner-connect/resources/partner-pack) provides the same access for HCL Business Partners 22 | 23 | See how to [download software](docs/howto_download-software.md) for details. 24 | 25 | ## Supported environments 26 | 27 | The project is supported on Docker Desktop, Docker Server, Podman, Rancher Desktop, Kubernetes (K8s) and OpenShift. 28 | See detailed information about [supported run-time and build environments](docs/concept_environments.md). 29 | 30 | ## Documentation & Quickstart 31 | 32 | See the [documentation](docs/index.md) and the [Quickstart](docs/quickstart.md) for details 33 | 34 | ## Issues 35 | For issues relating specifically to the Dockerfiles and scripts, please use the [GitHub issue tracker](https://github.com/HCL-TECH-SOFTWARE/domino-container/issues) 36 | 37 | ## Contributing 38 | We welcome contributions following [our guidelines](CONTRIBUTING.md). 39 | 40 | ## Community Support 41 | Special Thanks go to the following people for having provided valuable input to this project 42 | 43 | * [Ulrich Krause](https://www.eknori.de/2017-08-20/domino-on-docker/) for his very early contibutions in this space. 44 | * Matteo Bisi for his [Presentation](https://www.slideshare.net/mbisi/connect2016-1172-shipping-domino). 45 | * [Egor Margineanu](https://www.egmar.ro/) who also can be found on [Github](https://github.com/egmar) 46 | * Thomas Hampel for initiating the original IBM Domino 9.0.1 Docker project 47 | * Daniel Nashed for donating his [startscript](https://github.com/nashcom/domino-startscript) under the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0.html). 48 | 49 | ## License 50 | The Dockerfiles and associated scripts are licensed under the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0.html). 51 | 52 | HCL Domino and add-on products are commercial software - The software licenses agreement does not permit further distribution of the docker image that was built using this script! 53 | Refer to the [HCL license home page](https://www.hcl-software.com/resources/license-agreements) for detailed information about the HCL Domino and add-on product license terms. 54 | 55 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Concept & Overview" 4 | nav_order: 2 5 | description: "HCL Domino Container" 6 | has_children: true 7 | --- 8 | 9 | [Quickstart](quickstart.md){: .btn } 10 | [View it on GitHub](https://github.com/HCL-TECH-SOFTWARE/domino-container){: .btn } 11 | 12 | --- 13 | 14 | # Domino Container 15 | 16 | This project contains build scripts for HCL Domino Docker/Container images via [dockerfiles](https://docs.docker.com/engine/reference/builder/). 17 | The repository provides the utilities to build HCL Domino Server with the latest software or specific version in a Docker/Container image. 18 | Additional software ( like HCL Traveler, Verse, Nomad Server) can be added as build options to a Domino container image. 19 | 20 | All required HCL web-kits and fixes are downloaded from a software repository server instead of adding the source installation files to the image directly. 21 | If no remote server is referenced a temporary local [NGINX container](https://hub.docker.com/_/nginx) is started at build time to act as a **software repository server**. 22 | 23 | ## Supported environments 24 | 25 | The project is supported on Docker Desktop, Docker Server, Podman, Rancher Desktop, Kubernetes (K8s) and OpenShift. 26 | See detailed information about [supported run-time and build environments](concept_environments.md) 27 | 28 | ## Where to get HCL Domino software 29 | 30 | The project uses the official HCL web-kit installers to build container images from [My HCLSoftware Portal](https://my.hcltechsw.com/). 31 | 32 | - All HCL customers with active maintenance should have a download account 33 | - The [Partner Pack](https://www.hcltechsw.com/resources/partner-connect/resources/partner-pack) provides the same access for HCL Business Partners 34 | 35 | See how to [download software](howto_download-software.md) for details. 36 | 37 | ## How to download this project 38 | 39 | The recommended method is to clone the download the GitHub project directly via git. 40 | An alternate way is to download the project via as a tar file from the repository page. 41 | 42 | See Howto [Get Domino Container GitHub Repo](howto_github.md) for details. 43 | 44 | ## Building the image(s) 45 | 46 | To build the latest available image 47 | 48 | 1. Download the required software packages to the 'software' directory 49 | 2. From the root folder of this repository issue the following command 50 | 51 | ```bash 52 | ./build.sh domino 53 | ``` 54 | 55 | The process will perform all required actions to create the image in the version requested. Usually it takes ~5 to ~8 minutes to build the image (depending on your CPU & disk performance). 56 | 57 | 58 | ## Building an image with additional add-ons 59 | 60 | The community image offers building an image with additional add-on, which can be simply added to the build step. In previous versions HCL Traveler and Domino Leap have been implemented as add-on images on top of the Domino image in a layered approach. 61 | All add-on software can be directly added in a single build step. 62 | 63 | ``` 64 | -verse 65 | -nomad 66 | -traveler 67 | -ontime 68 | -leap 69 | -capi 70 | ``` 71 | 72 | By default the latest version is selected. But different versions can be optionally specified for each component. Example: `-verse=3.1`` 73 | 74 | 75 | ## New build menu 76 | 77 | The project now offers a simple to use build menu, which offers the most common build options. 78 | Invoking `build.sh` without any parameter opens the build menu. 79 | 80 | The build menu can be also invoked via `menu` specifying additional options. 81 | 82 | The versions of the add-ons are automatically selected from current software list. 83 | Just select all desired components and start the build process via pressing a `b`. 84 | 85 | 86 | ``` 87 | HCL Domino Container Community Image 88 | ------------------------------------ 89 | 90 | (D) HCL Domino [X] 14.5 91 | (O) OnTime [ ] 92 | (V) Verse [X] 3.2.5 93 | (T) Traveler [X] 14.5 94 | (N) Nomad Server [X] 1.0.16 95 | (L) Language Pack [ ] 96 | (R) REST-API [X] 1.1.4 97 | (A) C-API SDK [ ] 98 | (P) Domino Leap [ ] 99 | (J) Domino IQ [ ] 100 | 101 | (M) Prometheus [X] domprom 0.9.2 & Node Exporter 1.9.1 102 | (G) Borg Backup [X] 1.2.8 103 | (X) nshmailx [X] 1.1.0 104 | 105 | (I) Test created image [ ] 106 | 107 | (W) Write selection 108 | (E) Edit selection 109 | (C) Configuration 110 | (H) Help 111 | 112 | 113 | Base Image : RedHat UBI 10 114 | 115 | Select software & Options, [B] to build, [Q] to cancel? 116 | 117 | ``` 118 | 119 | Refer to Howto [Run Domino Container GitHub Repo](run_docker.md) how to run a Domino Container on Docker. 120 | -------------------------------------------------------------------------------- /docs/architecture_components.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Components" 4 | nav_order: 1 5 | description: "Components involved" 6 | parent: "Architecture" 7 | has_children: false 8 | --- 9 | 10 | # Domino Container Components 11 | 12 | ## build.sh 13 | 14 | Main start point for building docker images. 15 | You can specify the image to build including additional build options and add-on software. 16 | 17 | 18 | ``` 19 | ./build.sh domino 20 | ``` 21 | 22 | Refer to the command line documentation invoking the script with -h to get the full list of options. 23 | Invoking the build script without parameters brings up a new menu to select which add-ons to install. 24 | 25 | 26 | The file `software.txt` contains an up to date list of current HCL Domino related software. 27 | Unless you specify a distinct version the current version will be installed and tagged as "latest". 28 | 29 | Inside this script you can configure a remote download HTTP(S) target if you are hosting the downloaded software on a different machine. 30 | You can also specify a download directory on your Docker host which will be served by a temporary Docker container running a [NGINX container](https://hub.docker.com/_/nginx) to provide the software. 31 | 32 | The following three options are available 33 | 1. Remote Download specified with example: `DOWNLOAD_FROM=http://192.168.1.1` 34 | 2. Local directory specified with example: `SOFTWARE_DIR=/local/software` hosted via NGINX container 35 | 3. Standard location in the software sub-directory hosted via NGINX server in temporary container 36 | 37 | Before you start you have to download the required software packages. 38 | 39 | ## Directory "software" 40 | 41 | This directory is the default directory to provide Domino software, which are downloaded by the Docker installation script. 42 | The build script checks if your selected software is available on the defined software location and will prompt you which package to download if missing. 43 | 44 | ## software.txt 45 | 46 | This file contains information about the download you have to download depending on what you install. 47 | This file is used to find the right file to download by product and version. And is also used to verify the downloaded image via SHA256 hash. 48 | 49 | The format of the file is as follows: 50 | 51 | 52 | ``` 53 | product|version|filename|product-code|sha256-hash 54 | ``` 55 | 56 | 57 | Example: 58 | ``` 59 | domino|12.0.1|Domino_12.0.1_Linux_English.tar|-|a9d561b05f7b6850ed1230efa68ea1931cfdbb44685aad159613c29fa15e5eea 60 | ``` 61 | 62 | ## current_version.txt 63 | 64 | Contains one line per product to define the latest software verison 65 | 66 | 67 | ## Directory "dockerfiles" 68 | 69 | Contains a sub-directory for each product that can be installed. 70 | - `install_dir_domino` contains all files needed to install a HCL Domino server. 71 | - `install_dir_common` contains common components used by other container images like Traveler. 72 | 73 | Those files are copied to /tmp/install_dir during install process and are invoked by the build process. 74 | 75 | # dockerfile 76 | 77 | Main `dockerfile` used to build Domino. All customization and logic is either in the build.sh script or in the installer script. 78 | Each add-on product has it's own file. Example: `dockerfile_traveler`. 79 | 80 | # install_domino.sh 81 | 82 | Contains the install logic and performs the actual install of all components after downloading the software. 83 | 84 | 85 | ## entrypoint.sh 86 | 87 | - Located in `/` owned by root 88 | - Main entry point started when the container is started 89 | - Contains the logic to start and stop the server. 90 | - Contains the logic triggered at first server start to invoke the configuration of the server. 91 | 92 | ## domino_prestart.sh 93 | 94 | - Located in `/domino-container/scripts` owned by root 95 | - Invoked by `entrypoint.sh script` to check which additional configuration is needed before the server is started for the first time 96 | 97 | ## domino_install_data_copy.sh 98 | 99 | - Located in `/domino-container/scripts` owned by root 100 | - Invoked by `entrypoint.sh script` to check if templates and other files have been updated by an image update 101 | 102 | ## healthcheck.sh 103 | 104 | - Located in / owned by root 105 | - Used to check the server health to update the status of the running container 106 | - Current implementation just checks if the server process is running ( for Traveler if the traveler process is running) 107 | - Can be customized for individual requirements. But usually server availability can be checked outside the server. 108 | 109 | ## domino-startscript.taz 110 | 111 | Nash!Com Domino start and management script which supports Docker and contains an installation routine which is Docker aware 112 | 113 | 114 | ## Digram of all directories and components 115 | 116 | ![domino_container script diagram](assets/images/svg/projectstructure.svg) 117 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/domsetup/domsetup-webroot/domino-ots-setup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | HCL Domino Server Configuration 8 | 30 | 31 | 32 | 33 |
34 |
35 | HCL Domino Server 36 |
37 |
38 |

Domino First / Additional Server Setup

39 |
40 | 41 | 42 |
Drag & drop JSON file or click to select
43 |
44 |

Upload a Domino server OTS JSON configuration file.

45 |

Or perform a form based first server Domino setup.

46 |
47 | 48 | 49 | 50 | 51 | 52 | 53 |   54 | First server setup 55 |   56 | Upload Server.ID 57 | 58 |
59 |
60 |

61 |
62 | 63 | 140 | 141 | 142 | 143 | -------------------------------------------------------------------------------- /docs/assets/images/svg/Domino.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dockerfiles/install_dir_domino/domsetup/domsetup-webroot/assets/domsetup-logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/quickstart.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: "Quickstart" 4 | nav_order: 1 5 | description: "HCL Domino Quickstart" 6 | has_children: false 7 | --- 8 | 9 | ## Ensure you have a supported build environment 10 | 11 | The project supports most Linux base environments including [Windows Subsystem for Linux 2 (WSL2)](https://docs.microsoft.com/en-us/windows/wsl/) 12 | 13 | For details check [supported run-time and build environments](concept_environments.md) 14 | 15 | ## Install container environment 16 | 17 | In case you never worked with container on your machine, make sure Docker or Podman is installed. 18 | This project works with Docker and Podman, still our recommendation would be to use Docker, because it takes care about starting containers without creating a separate service per container. 19 | In addition Docker Compose and other functionality works better on Docker. 20 | 21 | For details about installing Docker see howto [Docker on Linux](howto_docker-linux.md) 22 | 23 | If you have no container environment there is a easy to use convenience script to install Docker and perform the following scripts automatically. 24 | 25 | See the [Domino Start Script GitHub page](https://nashcom.github.io/domino-startscript/install_container_env/) for details. 26 | 27 | 28 | ## Clone this project via Git 29 | 30 | ### Install Git software 31 | 32 | Git is a very simple and convenient way to download from GitHub. 33 | The install command depends on the platform (SUSE: zypper, Ubuntu: apt). 34 | "yum" works for any Redhat/CentOS based distribution. 35 | 36 | ``` 37 | yum install git -y 38 | ``` 39 | 40 | On Ubuntu/Debian use 41 | 42 | ``` 43 | apt install git -y 44 | ``` 45 | 46 | ### Create new main directory for the project 47 | 48 | Create a directory where to download Git projects and switch to it. 49 | 50 | Example: 51 | 52 | ``` 53 | mkdir -p /local/github 54 | cd /local/github 55 | ``` 56 | 57 | ### Clone the repository and switch to the directory 58 | 59 | ``` 60 | git clone https://github.com/HCL-TECH-SOFTWARE/domino-container.git 61 | cd domino-container 62 | ``` 63 | 64 | ## Download software from My HCLSoftware Portal 65 | 66 | Before starting the build process, the required HCL web-kits have to be available on the build machine or a remote download location - if configured. 67 | 68 | See howto [download software](howto_download-software.md) for details downloading software from [My HCLSoftware Portal](https://my.hcltechsw.com/). 69 | 70 | ## Build the image 71 | 72 | ``` 73 | ./build domino 74 | ``` 75 | 76 | ## Run container Domino Container Script 77 | 78 | The Nash!Com Domino container script allows you to operate your server. It supports Docker and Podman run-time environments. 79 | 80 | ### Install Domino Container script 81 | 82 | Clone the [start script repository](https://github.com/nashcom/domino-startscript) 83 | 84 | ``` 85 | cd .. 86 | git clone https://github.com/nashcom/domino-startscript.git 87 | cd domino-startscript 88 | ./install_dominoctl 89 | ``` 90 | 91 | ### Configure your container 92 | 93 | The project provides a default configuration. 94 | Usually the default configuration should work for your environment. 95 | You might want to change the container name and other detailed settings. 96 | 97 | 98 | ``` 99 | dominoctl cfg 100 | ``` 101 | 102 | **Note:** The container script by default uses `vi` for editing. 103 | If you prefer a different editor like `nano` or `mcedit` export an environment variable specifying an installed editor of your choice. 104 | Tip: You can also add the variable to your bash profile. 105 | 106 | ``` 107 | export EDIT_COMMAND=nano 108 | ``` 109 | 110 | ### Configure container setup 111 | 112 | Usually environment variables are used for setup. 113 | The following commands opens the environment file, configured for your container. 114 | 115 | ``` 116 | dominoctl env 117 | ``` 118 | 119 | ## Start Domino container 120 | 121 | After specifying the configuration and setup correctly, start the container with the Domino container script. 122 | 123 | ``` 124 | dominoctl start 125 | ``` 126 | 127 | ### Domino live console 128 | 129 | To start a Domino live console, run the console command. 130 | The dominoctl script leverages and `exec` command into the container. 131 | The long version of this command would be `dominoctl domino console`. 132 | 133 | All console commands can be executed via `domino`. 134 | This command passes command line parameters to the `domino` start script. 135 | 136 | ``` 137 | dominoctl console 138 | 139 | ``` 140 | 141 | ## Export container image for external use 142 | 143 | To use the container image on run-time only platforms like a QNAP NAS Docker and Podman can export images to a tar file, which can be imported into any container registry. 144 | 145 | See howto [Export or push image to registries](howto_use_externally.md) for details. 146 | 147 | For running on QNAP and similar environments check [How to run Domino on a QNAP NAS](howto_qnap.md). 148 | 149 | 150 | ## Domino Container Script Diagram 151 | 152 | ![domino_container script diagram](assets/images/svg/containerstartscript.svg) 153 | -------------------------------------------------------------------------------- /testing/README.md: -------------------------------------------------------------------------------- 1 | # Domino Community Container Image Automation Testing 2 | 3 | The automation test script is intended to test any image build with the Domino container community project. 4 | The main purpose is to ensure quality of the project. The automation test is intended to be run before any submission into the develop branch. 5 | 6 | By default the automation test uses the standard image name **hclcom/domino:latest**. 7 | Using the **-image=my-image** option any community image can be tested. 8 | 9 | The test script requires an image containing the Domino start script. Therefore other images cannot be tested. 10 | 11 | ## Running the automation test script 12 | 13 | ``` 14 | cd testing 15 | ./AutomationTest.sh 16 | ``` 17 | 18 | ## How it works 19 | 20 | - The script brings up a new Domino container **domino-autotesting** with the specified or default image. 21 | - The pre-defined One Touch Setup JSON file **DominoContainerAutoConfig.json** is copied into the started container to configure the Domino server 22 | - Once the server is started, container commands are exectured into the running container 23 | - The data directory is defined as a native volume, where the script can interact with `IBM_TECHNICAL_SUPPORT/console.log` to check for console output. 24 | - Test results are written into a JSON and CSV file in parallel 25 | - After container shutdown the JSON and CSV file information are displayed on the console 26 | 27 | 28 | ## Domino One Touch Setup 29 | 30 | The following main configuration options are currently used to bring up the server 31 | 32 | - Create a first server with standard server tasks + POP3 33 | - Set standard notes.ini best practices 34 | - Create ID vault via One Touch Setup 35 | - CertMgr TLS setup with a MicroCA used to create a server certificate with ECDSA NIST-P 384 36 | - Enable circular transaction log 37 | - Configure basic TLS settings in server document and enable internet sites 38 | - Create a configuration document with a best practices configuration 39 | - Create internet sites for HTTP, LDAP, IMAP, POP3 with TLS enabled 40 | - Create Global Domain document 41 | - Create **domcfg.nsf** 42 | - Create and configure **iwaredir.nsf** 43 | - Configure Traveler if the image has Traveler support 44 | 45 | 46 | ## Additional AutomationTest.sh options 47 | 48 | - `logs` 49 | Show container logs 50 | 51 | - `bash` 52 | Run a container bash 53 | 54 | - `root` 55 | Run bash with root permissions inside container 56 | 57 | - `exec` 58 | Execute a command inside the container 59 | 60 | - `console` 61 | Run live Domino server console 62 | 63 | - `domino` 64 | Run Domino start script command 65 | 66 | - `stop` 67 | Stop container 68 | 69 | - `rm` 70 | Remove container 71 | 72 | - `cleanup` 73 | Cleanup Domino server 74 | 75 | - `-image=image-name` 76 | Specify image to test 77 | 78 | - `-nostop` 79 | Don't stop container after testing (debugging/testing) 80 | 81 | ### Examples 82 | 83 | Bring up the specified Traveler server image and keeps the server running after performing all tests 84 | 85 | ``` 86 | ./AutomationTest.sh -image=hclcom/traveler:12.0.1 -nostop 87 | ``` 88 | 89 | Jump into the running container 90 | 91 | ``` 92 | ./AutomationTest.sh bash 93 | ``` 94 | 95 | 96 | ## Test performed 97 | 98 | - **domino.jvm.available** 99 | Checks if the JVM returns a proper version 100 | 101 | - **domino.server.running** 102 | Checks console, if server process started 103 | 104 | - **domino.http.running** 105 | Checks if HTTL task is running 106 | 107 | - **domino.certificate.available** 108 | Checks if HTTPS responds and the certificate is trusted 109 | 110 | - **domino.server.onetouch.microca-cert** 111 | Checks if the right certificate has been created via One Touch MicroCA configuration 112 | 113 | - **domino.server.onetouch.createdb** 114 | Checks if OneTouch setup created **iwaredir.nsf** 115 | 116 | - **domino.idvault.create** 117 | Checks if ID Vault has been created by One Touch setup 118 | 119 | - **domino.backup.create** 120 | Runs a backup of log.nsf and checks if the backup is available 121 | 122 | - **startscript.archivelog** 123 | Tests the Domino start script `archivelog` command by invoking it remotely and checking the resulting giz file 124 | 125 | - **container.health** 126 | Test if the container health script configured, returns the server is healthy 127 | 128 | - **startscript.server.restart** 129 | Restarts the Domino server inside the container via Domino start script and checks if the server comes up again 130 | 131 | - **domino.translog.create** 132 | Verifies if translog configured via One Touch setup, created transaction log extends after restarting the server 133 | 134 | - **domino.smtp_pop3.mail** 135 | Sends a SMTP mail via STARTTLS and retrieves the message via secure POP3 136 | 137 | ## Traveler image additional tests 138 | 139 | If a Traveler image is detected, automatically perform additional testing 140 | 141 | - **traveler.server.available** 142 | Check the Traveler status URL with the admin user via Traveler status URL 143 | 144 | --------------------------------------------------------------------------------