<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Atolio Documentation – On-Premise</title><link>https://docs.atolio.com/deployment/on-premise/</link><description>Recent content in On-Premise on Atolio Documentation</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://docs.atolio.com/deployment/on-premise/index.xml" rel="self" type="application/rss+xml"/><item><title>Deployment: IBM Fusion Deployment</title><link>https://docs.atolio.com/deployment/on-premise/create-infra-ibm-fusion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.atolio.com/deployment/on-premise/create-infra-ibm-fusion/</guid><description>
&lt;p>This is an opinionated guide for running Atolio on IBM Fusion (IBM Storage Fusion), written for customers deploying Atolio alongside it. IBM Fusion runs on Red Hat OpenShift, so some steps use OpenShift tooling such as &lt;code>oc&lt;/code> and OpenShift Routes. Atolio also supports other on-premises Kubernetes platforms; this guide is the recommended path when IBM Fusion is your foundation. As with every Atolio deployment, your data remains within your cluster at all times.&lt;/p>
&lt;p>Unlike Atolio&amp;rsquo;s public cloud deployments, there is no Terraform step here. The cluster already exists, so you deploy Atolio directly with &lt;code>oc&lt;/code> and Helm. Everything lands in a single &lt;code>atolio&lt;/code> namespace.&lt;/p>
&lt;h2 id="deployment-prerequisites">Deployment Prerequisites&lt;/h2>
&lt;p>Before getting started, your Atolio support team will do the following on your behalf:&lt;/p>
&lt;ol>
&lt;li>Provide credentials (a pull secret or registry login) for the &lt;code>lumen&lt;/code> container images, along with the registry path to use in your Helm values. The &lt;code>vespa&lt;/code> images are public.&lt;/li>
&lt;li>Provide the Atolio deployment bundle, which contains:
&lt;ul>
&lt;li>The &lt;code>vespa&lt;/code>, &lt;code>tika-pipes&lt;/code>, and &lt;code>lumen&lt;/code> Helm charts&lt;/li>
&lt;li>Manifest templates for the namespace, platform secrets, and object storage&lt;/li>
&lt;li>Per-chart values files&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Coordinate identity-provider connector access for login provisioning (see &lt;a href="#provision-the-first-login-user">Provision the first login user&lt;/a>).&lt;/li>
&lt;/ol>
&lt;p>The following deployment prerequisites will help streamline your deployment process.&lt;/p>
&lt;h3 id="determine-deployment-model">Determine Deployment Model&lt;/h3>
&lt;p>We offer both Atolio managed and customer managed deployment models for you to choose from. Please review the comparison and requirements for each approach on our &lt;a href="https://docs.atolio.com/deployment/deployment-model-overview/">Deployment Model Overview&lt;/a> page and inform your Atolio support team which method you&amp;rsquo;d like to use for your deployment. On IBM Fusion, deployments are most commonly customer managed, with your engineers running &lt;code>oc&lt;/code> and Helm with the guidance of an Atolio deployment engineer via screensharing.&lt;/p>
&lt;h3 id="determine-ibm-fusion-cluster">Determine IBM Fusion cluster&lt;/h3>
&lt;p>IBM Fusion presents a Red Hat OpenShift cluster (4.12 or later) that you can reach with &lt;code>oc&lt;/code>. It is available as the IBM Fusion HCI System appliance and as the software-defined IBM Storage Fusion running on an OpenShift cluster you operate; both work for Atolio. The cluster needs:&lt;/p>
&lt;ul>
&lt;li>&lt;code>cluster-admin&lt;/code> access, as the &lt;code>vespa&lt;/code> chart creates a SecurityContextConstraints RoleBinding.&lt;/li>
&lt;li>A default StorageClass for stateful workloads, providing block storage for the Vespa content nodes.&lt;/li>
&lt;li>An apps wildcard domain (&lt;code>*.apps.&amp;lt;cluster&amp;gt;.&amp;lt;base-domain&amp;gt;&lt;/code>) served by the OpenShift router.&lt;/li>
&lt;/ul>
&lt;p>Both the Atolio &lt;code>lumen&lt;/code> images and the public &lt;code>vespa&lt;/code> images can be served from an internal registry or a local pull-through cache if you prefer to keep image pulls within your environment, as is common for disconnected IBM Fusion installations. Point the chart values at that registry.&lt;/p>
&lt;h3 id="determine-atolio-hostname">Determine Atolio hostname&lt;/h3>
&lt;p>Before the deployment call, decide on the hostname for the Atolio web application, for example &lt;code>atolio.apps.example.com&lt;/code>. Because Atolio is exposed through OpenShift Routes, the hostname simply needs to fall under the apps wildcard the router already serves. No separate hosted zone or DNS delegation is required, and External DNS is not used on IBM Fusion.&lt;/p>
&lt;p>For the remainder of this document, we will use &lt;code>https://atolio.apps.example.com&lt;/code> in the examples, but it is expected for you to replace with your own hostname.&lt;/p>
&lt;h3 id="determine-object-storage">Determine object storage&lt;/h3>
&lt;p>Atolio requires two S3-compatible buckets, reached over the S3 protocol. On IBM Fusion this is provided by Red Hat OpenShift Data Foundation (ODF), whose Ceph RADOS Gateway (RGW) exposes the S3 endpoint. ODF is included with the software-defined IBM Storage Fusion data services; on IBM Fusion HCI, confirm ODF is deployed, as the appliance&amp;rsquo;s default data services use IBM Storage Scale, which does not expose S3.&lt;/p>
&lt;p>Use the ODF object service to create the two buckets (or ObjectBucketClaims) and an object user. You provide the endpoint, the two bucket names, the region, and an access key / secret key pair, with &lt;code>s3ForcePathStyle: true&lt;/code> (Ceph RGW serves path-style).&lt;/p>
&lt;h3 id="setup-authentication">Setup authentication&lt;/h3>
&lt;p>Atolio supports single sign-on (SSO) authentication through Okta, Microsoft Entra ID, Google, and Keycloak using the OpenID Connect (OIDC) protocol. Refer to &lt;a href="https://docs.atolio.com/configure-authentication/">Configuring Authentication&lt;/a> for more details on the steps to complete in your desired SSO provider in order to obtain the necessary OIDC configuration values. Set the redirect URI to &lt;code>https://atolio.apps.example.com/*&lt;/code> when you register the client.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Note:&lt;/strong>
The OIDC issuer URL must be the external Route hostname, not an in-cluster Service URL, so that the issuer matches the tokens the browser receives. If your router presents a serving certificate your cluster does not already trust (for example the default self-signed wildcard), Atolio also needs that CA so it can fetch the OIDC discovery document and JWKS. See &lt;a href="#application-helm-value-options">Application Helm value options&lt;/a> for both settings.&lt;/p>
&lt;/blockquote>
&lt;h3 id="setup-local-environment">Setup local environment&lt;/h3>
&lt;p>Finally, if an engineer from your team will be performing the deployment, ensure they have the following utilities installed:&lt;/p>
&lt;ul>
&lt;li>Install the &lt;a href="https://docs.openshift.com/container-platform/latest/cli_reference/openshift_cli/getting-started-cli.html">OpenShift CLI&lt;/a> (&lt;code>oc&lt;/code>)&lt;/li>
&lt;li>Install &lt;a href="https://helm.sh/docs/intro/install/">Helm&lt;/a> (v3.8 or later, required for OCI charts)&lt;/li>
&lt;li>Install &lt;a href="https://docs.atolio.com/configure-sources/#installing-atolioctl">atolioctl&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="provide-deployment-engineer-with-configuration">Provide Deployment Engineer with Configuration&lt;/h2>
&lt;p>At this point if you&amp;rsquo;re proceeding with an Atolio managed deployment you&amp;rsquo;ll need to provide the information from these prerequisite steps to your Atolio deployment support team. Otherwise please ensure the information is provided to the engineer from your organization who will be performing the deployment with Atolio&amp;rsquo;s support.&lt;/p>
&lt;p>To recap, provide these details:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="#determine-atolio-hostname">Atolio hostname&lt;/a>&lt;/li>
&lt;li>&lt;a href="#determine-object-storage">Object storage&lt;/a> endpoint, bucket names, and credentials&lt;/li>
&lt;li>&lt;a href="https://docs.atolio.com/configure-authentication/">OIDC Configuration&lt;/a>&lt;/li>
&lt;li>The StorageClass name and apps wildcard domain for the cluster&lt;/li>
&lt;/ul>
&lt;p>If you&amp;rsquo;re opting to have Atolio manage the deployment you can disregard the remainder of this documentation as these steps will be performed by your Atolio deployment engineer. Otherwise be sure to share this documentation with the engineer from your organization that will be performing the deployment so they can familarize theirself with the steps required.&lt;/p>
&lt;h2 id="deploy-atolio">Deploy Atolio&lt;/h2>
&lt;p>The charts come up in order: database (&lt;code>vespa&lt;/code>) and text extraction (&lt;code>tika-pipes&lt;/code>) before the application services (&lt;code>lumen&lt;/code>), because the &lt;code>lumen&lt;/code> chart runs a Vespa bootstrap hook that communicates to &lt;code>vespa-admin&lt;/code> pods to perform a database migration step.&lt;/p>
&lt;p>Files that need your environment&amp;rsquo;s values or secrets ship in the bundle as &lt;code>*.yaml.example&lt;/code> templates with placeholders. Copy each one, drop the &lt;code>.example&lt;/code> suffix, and fill it in before applying.&lt;/p>
&lt;h3 id="namespace-and-image-pull-secret">Namespace and image pull secret&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>oc login ... &lt;span style="color:#8f5902;font-style:italic"># into your IBM Fusion cluster, as a cluster-admin&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>oc apply -f manifests/00-namespace.yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>oc project atolio
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Pull secret for the lumen images (credentials provided by Atolio).&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>oc -n atolio create secret docker-registry atolio-pull &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --docker-server&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&amp;lt;ATOLIO_REGISTRY&amp;gt; &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --docker-username&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&amp;lt;USERNAME&amp;gt; --docker-password&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&amp;lt;PASSWORD&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="object-storage">Object storage&lt;/h3>
&lt;p>Create the two buckets in the ODF object service and create the &lt;code>atolio-object-store&lt;/code> credentials Secret with &lt;code>AWS_ACCESS_KEY_ID&lt;/code> and &lt;code>AWS_SECRET_ACCESS_KEY&lt;/code>.&lt;/p>
&lt;p>Record the endpoint, bucket names, and region for the &lt;code>lumen&lt;/code> values below. A plain-HTTP endpoint makes the chart set &lt;code>disableSSL=true&lt;/code> automatically; an &lt;code>https://&lt;/code> endpoint is used as TLS.&lt;/p>
&lt;h3 id="platform-secrets">Platform secrets&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cp manifests/lumen-secrets.yaml.example manifests/lumen-secrets.yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Fill in jwtSecretKey, secretSalts, and oidcClientSecret.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>oc apply -n atolio -f manifests/lumen-secrets.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For the &lt;code>jwtSecretKey&lt;/code> and &lt;code>secretSalts&lt;/code> values any 256 bit (32 character) string can be used. These values are used to sign JWT tokens used by the web application and &lt;code>atolioctl&lt;/code> tool and salt document IDs in Atolio&amp;rsquo;s database. They should be well guarded secrets that are unique to the deployment, and can be generated by running &lt;code>openssl rand -base64 32&lt;/code>.&lt;/p>
&lt;p>The &lt;code>jwtSecretKey&lt;/code> must be at least 32 bytes. Atolio signs the session JWT with HS256 and rejects shorter keys, and that failure surfaces only at login, after authentication otherwise succeeds. The same secret is shared by the feeder, the connectors, and &lt;code>atolioctl&lt;/code>.&lt;/p>
&lt;h3 id="application-helm-value-options">Application Helm value options&lt;/h3>
&lt;p>In your copies of &lt;code>helm/values.lumen.yaml&lt;/code> and &lt;code>helm/values.tika-pipes.yaml&lt;/code>, replace the placeholders: the app hostname (&lt;code>domains.lumen&lt;/code>), the image registry, the object-storage endpoint, buckets, and path-style flag, and the OIDC issuer and client ID. Each placeholder carries an inline comment explaining what it expects. &lt;code>helm/values.vespa.yaml&lt;/code> is generic and used as-is; edit it only to change Vespa sizing or the StorageClass (set the cluster&amp;rsquo;s StorageClass here if it is not the default).&lt;/p>
&lt;p>Two OIDC settings are specific to OpenShift:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">oidc&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">endpoint&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;https://&amp;lt;external issuer Route hostname&amp;gt;&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#8f5902;font-style:italic"># never an in-cluster Service URL&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">trustedCAConfigMap&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;oidc-trusted-ca&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#8f5902;font-style:italic"># only if your router cert is not publicly trusted&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If your router serves a certificate your cluster does not already trust, capture the ingress CA into the &lt;code>oidc-trusted-ca&lt;/code> ConfigMap before installing the charts:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>oc get configmap -n openshift-config-managed default-ingress-cert &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -o &lt;span style="color:#000">jsonpath&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;{.data.ca-bundle\.crt}&amp;#39;&lt;/span> &amp;gt; /tmp/router-ca.crt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>oc -n atolio create configmap oidc-trusted-ca &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --from-file&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>ca-bundle.crt&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>/tmp/router-ca.crt --dry-run&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>client -o yaml &lt;span style="color:#000;font-weight:bold">|&lt;/span> oc apply -f -
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If your router already serves a publicly-trusted certificate, drop the &lt;code>trustedCAConfigMap&lt;/code> value.&lt;/p>
&lt;h3 id="install-the-charts">Install the charts&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>helm upgrade --install vespa charts/vespa-*.tgz &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -n atolio -f helm/values.vespa.yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>helm upgrade --install tika-pipes charts/tika-pipes-*.tgz &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -n atolio -f helm/values.tika-pipes.yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>helm upgrade --install lumen charts/lumen-*.tgz &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -n atolio -f helm/values.lumen.yaml --timeout 8m
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="post-deployment-steps">Post-deployment steps&lt;/h2>
&lt;h3 id="deployment-verification">Deployment Verification&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>oc -n atolio get pods &lt;span style="color:#8f5902;font-style:italic"># all Running&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>oc -n atolio get pvc &lt;span style="color:#8f5902;font-style:italic"># vespa admin/content Bound&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>oc -n atolio get routes &lt;span style="color:#8f5902;font-style:italic"># 10 lumen routes (edge)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># The vespa pods run under a scoped nonroot-v2 SCC; everything else runs under restricted-v2.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>oc -n atolio get pod -l &lt;span style="color:#000">app&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>vespa-content &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -o &lt;span style="color:#000">jsonpath&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;{.items[0].metadata.annotations.openshift\.io/scc}{&amp;#34;\n&amp;#34;}&amp;#39;&lt;/span> &lt;span style="color:#8f5902;font-style:italic"># -&amp;gt; nonroot-v2&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Browse to &lt;code>https://atolio.apps.example.com/&lt;/code> and sign in through your IdP. The Route layer terminates TLS at the edge, and your apps wildcard already resolves to the router, so there is no load balancer or DNS record to wait on.&lt;/p>
&lt;h3 id="provision-the-first-login-user">Provision the first login user&lt;/h3>
&lt;p>A user who authenticates at the IdP still needs to resolve to an Atolio user before they get a session. That provisioning runs an identity-provider connector, coordinated with Atolio, who supplies the connector image and the source configuration for your IdP. The connector lists your IdP&amp;rsquo;s users and publishes the records Atolio&amp;rsquo;s resolver turns into Atolio users; a user with no such record can authenticate but will not land a session. Work through this step with your Atolio contact.&lt;/p>
&lt;p>When you have validated that the deployment is available, the next step is to &lt;a href="https://docs.atolio.com/configure-sources/">configure sources&lt;/a>.&lt;/p>
&lt;h2 id="teardown">Teardown&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>helm uninstall lumen tika-pipes vespa -n atolio
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>oc delete project atolio
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item></channel></rss>