Documentation Index
Fetch the complete documentation index at: https://docs.poolside.ai/llms.txt
Use this file to discover all available pages before exploring further.
Overview
This guide describes how to deploy the Poolside platform on a GPU workstation or server host. The installation supports both online and air-gapped environments. Installation time typically takes less than 30 minutes when the installation bundle is cached on the host. The Poolside platform includes:- Agent and chat model: Laguna family
- Code completion model: Point
- Poolside Chat: Browser-based chat interface
- Poolside Console: Browser-based interface for managing models, configuring agents and integrations, controlling access, and monitoring usage
- Built-in authentication: Keycloak identity provider
- S3-compatible object storage: SeaweedFS for models and telemetry
- Database: PostgreSQL for Poolside deployment
- cert-manager: Self-signed certificate provider
Prerequisites
Before you begin, ensure that the host meets the following prerequisites. The installation process installs and configures GPU drivers and Poolside platform services.- A supported operating system: Ubuntu 22.04 LTS, Ubuntu 24.04 LTS, or Red Hat Enterprise Linux (RHEL) 9.6
sudoaccess on the host- Network access for online installations, or the full bundle and artifacts available locally for air-gapped installations
- The
nouveaudriver is not loaded on the host. For instructions, see Disable Nouveau in the NVIDIA documentation.
Prerequisites for RHEL 9.6
RHEL can upgrade the host to a newer minor release when new updates become available throughdnf update or yum update.
Before you install packages, lock the release to RHEL 9.6 to prevent automatic minor version upgrades.
-
Install
iptables-nftusingyum(version1.8.10-11.el9) -
Install
container-selinuxusingyum -
Install
curlusingyum -
Install
jqusingyum(version1.6or later) -
Install
yq(versionv4.49.2or later) from the yq releases page- Download
yq_linux_amd64.tar.gzand install it to/usr/local/bin/yq
- Download
-
Install
unzipusingyum(version6.00or later) -
Install
skopeousingyum(packageskopeo-1.18.1-2.el9_6.x86_64or later) -
Install
kubectlby adding the Kubernetes repository (ensure that thekubectlversion is the same as or newer than the RKE2 Kubernetes version):Then run: -
Install
terraform(version1.8.5) from the Terraform 1.8.5 releases page- Download and install the binary to
/usr/local/bin/terraform unzipis required to extract the Terraform binary
- Download and install the binary to
In RHEL 9.x,
/usr/local/bin is not included in the secure_path setting in /etc/sudoers by default. As a result, sudo terraform can return a command not found error.Run Terraform with the absolute path: /usr/local/bin/terraform.-
Confirm that the
nouveaugraphics driver is not loaded. For instructions, see Disable the nouveau driver in the NVIDIA documentation. Run the following command to check whether thenouveaudriver is loaded. If the command returns output, follow the next steps to turn off the driver and reboot.-
If the
nouveaudriver is loaded:
-
If the
Prerequisites for Ubuntu
These steps apply to both Ubuntu 22.04 LTS and Ubuntu 24.04 LTS.-
Install
kubectlusingsudo snap install kubectl --classic -
Install
curlusingsudo apt install -y curl -
Install
jqusingsudo apt install -y jq -
Install
yq(versionv4.49.2or later) from the yq releases page- Download
yq_linux_amd64.tar.gzand install it to/usr/local/bin/yq
- Download
-
Install
terraform(version1.8.5) from the Terraform 1.8.5 releases page- Download and install the binary to
/usr/local/bin/terraform unzipis required to extract the Terraform binary
- Download and install the binary to
-
Install
skopeo(versionv1.18or later) from the skopeo-binary releases page- Download
skopeo-linux-amd64and install it to/usr/local/bin/skopeo - Ensure the containers trust policy at
/etc/containers/policy.jsonallowsskopeoto access the RKE2 registry with the minimum required permissions to load container images into the registry during installation
- Download
-
Confirm that the
nouveaugraphics driver is not loaded. For instructions, see Disable the nouveau driver in the NVIDIA documentation. Run the following command to check whether thenouveaudriver is loaded. If the command returns output, follow the next steps to turn off the driver and reboot.-
If the
nouveaudriver is loaded:
-
If the
Kernel parameters
Some operating systems require kernel parameter (sysctl) adjustments to support the Poolside platform’s runtime needs.
Ubuntu 22.04 and 24.04
The platform’s file watchers exceed the Ubuntu default for inotify instances. Set the following parameter to 65535 or higher:
/etc/sysctl.d/ and reload:
Install steps
The Poolside installation bundle includes all required Terraform providers for alinux/amd64 host to support fully offline (air-gapped) deployments.
Step 0 (optional): Set up an air-gapped installation
This configuration is required for air-gapped installations. It uses a bundled Terraform CLI configuration file instead of a standard
.terraformrc file so Terraform behaves consistently when commands run as both root and a non-root user. In internet-accessible environments, you can skip this step.terraform.d directory.
-
Locate
poolside-terraform.tfrcin the root of the unpacked installation bundle. -
Replace the
$POOLSIDE_INSTALL_DIRplaceholder with the fully qualified path to the bundle’s root directory. -
For Terraform commands in the installation and post-installation steps, prefix the command with the Terraform CLI configuration file path:
You can configure Terraform using alternative methods, such as a
.terraformrc file, as described in the official HashiCorp documentation. Because the installation process runs as both root and a local user, you must ensure that both accounts are configured to reference the cached providers correctly.Step 1: Install and configure RKE2 on the host
The01-infra-rke2 directory contains the Terraform module that installs RKE2 on the host system.
Using sudo, run the following commands from the 01-infra-rke2 directory.
Air-gapped environment:
Step 2: Generate RKE2 credentials and access files
The02-rke2-credentials directory contains the Terraform module that connects to the RKE2 cluster and extracts the configuration files required for later installation stages.
These files allow Terraform to authenticate to the RKE2 cluster and complete the Poolside platform deployment.
Using sudo, run the following commands from the 02-rke2-credentials directory.
Air-gapped environment:
Step 3: Install supporting infrastructure services
The03-infra-services directory contains the Terraform module that uses the previously generated RKE2 credentials to access the cluster and deploy the supporting infrastructure required by the Poolside platform.
This step installs:
- A local container registry
- A PostgreSQL database
- An S3-compatible object store
- Keycloak for user authentication
cert-manager, which generates a local self-signed certificate authority (CA) on the cluster and uses it to issue TLS certificates for the platform’s ingress and supporting services
sudo, run the following commands from the 03-infra-services directory.
Use custom TLS certificates
The default self-signed CA is suitable for evaluation and development. For production deployments, you are responsible for providing your own CA and server certificate. Configure the bring-your-own (BYO) certificate variables in03-infra-services/terraform.tfvars before you run terraform apply.
The custom_certificates schema accepts a separate certificate and key for each of the platform’s TLS-terminating services (poolside, services.storage, services.storage_s3, and services.identity), so you can use multiple per-service certificates if your Public Key Infrastructure (PKI) requires it. A single certificate that covers every service is the recommended pattern.
Across all certificates you provide, the Subject Alternative Names (SANs) should cover the following ingress hostnames:
<poolside-ingress-host>.<domain-name><keycloak-ingress-host>.<domain-name>seaweedfs.<domain-name>seaweedfs-s3.<domain-name>
<poolside-ingress-host>is the value ofpoolside_ingress_hostin03-infra-services/terraform.tfvars(defaultpoolside).<keycloak-ingress-host>is the value ofkeycloak_ingress_hostin03-infra-services/terraform.tfvars(defaultkeycloak).<domain-name>is the value ofdomain_namein03-infra-services/terraform.tfvars(defaultpoolside.local).
*.<domain-name> as a SAN covers every service.
PostgreSQL is not exposed through an ingress and is not reachable from outside the cluster, so its certificate is not configurable through
custom_certificates. cert-manager continues to issue it for in-cluster mTLS connections.-
Place your CA certificate, server certificate, and private key in a directory accessible to Terraform. The example below uses
<path-to-bundle>/poolside-install/byo-certs/. Thepoolside-install/subdirectory holds the installation’s persistent state and is preserved across cluster resets, so it is the recommended location for BYO certificate files.You must reference these files using fully qualified (absolute) paths in the next step. Relative paths are not supported. -
In
03-infra-services/terraform.tfvars, set the BYO variables:custom_ca_trust_chain.root_ca_pathmust point to the CA that signedserver.crt. The platform mounts the CA bundle into core-api and other workloads so they can verify in-cluster TLS connections, such as the OpenID Connect (OIDC) discovery call from core-api to the identity provider (which is Keycloak by default). When you runterraform apply, the module creates Kubernetes secrets with a-byosuffix from these files. Step 4 reads the certificate paths from step 3’s exported configuration and uses them for the platform’s ingress secrets, so you don’t need to configure certificates in04-poolside-deployment.
Apply the changes
Step 4: Deploy the Poolside platform
The04-poolside-deployment directory contains the Terraform module that deploys the Poolside platform into the RKE2 cluster using the infrastructure services installed in the previous steps.
This deployment includes optional configuration and must align with any modifications you made in earlier phases. Review and update the terraform.tfvars file as needed before running Terraform.
Run the following commands from the 04-poolside-deployment directory.
Step 5: Upload Poolside models
This step uploads Poolside models to the S3-compatible storage used by the deployment. The05-poolside-model-upload directory contains a Terraform module that creates a Kubernetes job to sync model files from a local host directory into the poolside-models S3 bucket.
-
Copy the Poolside model files into the local host directory:
/opt/poolside/poolside-model-uploadsIf you customized host volume paths during the RKE2 installation step (01-infra-rke2), use the corresponding directory instead. -
Run the following commands from the
05-poolside-model-uploaddirectory to trigger the model upload job. - To upload additional or updated models later, repeat these steps. Uploads are additive and do not remove existing models from the deployment.
Step 6: Deploy Poolside models
The final phase06-poolside-inference deploys the Poolside models from S3-compatible storage into the RKE2 cluster.
The directory contains a Terraform module, which wraps the inference Helm chart used to deploy models across all modalities.
-
Verify the model paths for all uploaded Poolside models in S3-compatible storage. The default bucket path is
s3://poolside-models/, followed by the model folder. These paths will be used formodel_s3_uriinterraform.tfvars.Example output:From this example, themodel_s3_urivalues would be:s3://poolside-models/laguna_xs_fp8_fp8kv_04_2026s3://poolside-models/malibu_v2_agent_int4_04_2026s3://poolside-models/point_v2_04_2026
-
In the
06-poolside-inferencedirectory, create or update theterraform.tfvarsfile.deployment_nameshould match the value used for each previous phase.model_s3_urisshould include the S3 URIs for each model listed in the previous step.models_configshould include the configuration for each model, including the number of replicas and GPUs for your deployment’s hardware configuration.
-
Run the following commands to deploy the models.
-
After the models are deployed, run the following command to retrieve the
nameandurlfor the deployed models. -
To deploy additional models or change the GPU or replica counts, modify
terraform.tfvarsand runterraform applyagain.
Next steps: Post-installation configuration
Step 1: Configure local DNS
Add these hostname mappings on the deployment host. This ensures that local service callbacks resolve to the local system instead of external DNS.Step 2: Set up Poolside
The following steps describe how to complete initial setup using the internal Keycloak service as the identity provider. If you are integrating with an external identity provider, see OIDC authentication.-
Open a web browser and navigate to:
https://poolside.poolside.localIf you configured a different hostname, use that value instead. Ensure DNS resolution is working for the selected hostname. -
Retrieve identity configuration values from Terraform output.
-
Change to the
03-infra-servicesdirectory. -
Run the following command:
-
Note the values for
client_api_credentialsandoidc_provider_url.
-
Change to the
-
Create the organization.
-
When prompted in the Poolside Console, create your organization. For Poolside realm settings, enter the following values:
- Provider URL:
oidc_provider_urlfrom the Terraform output - Client ID:
client_api_credentials.idfrom the Terraform output - Client Secret:
client_api_credentials.secretfrom the Terraform output
- Provider URL:
-
When prompted in the Poolside Console, create your organization. For Poolside realm settings, enter the following values:
-
Register the first user.
- Click Login, then Register.
- Create your administrator user account. This user is automatically assigned the
tenant-adminrole.
-
Link the deployed models in the Poolside Console.
- In the Poolside Console, navigate to Agents > Models.
- Click New Model.
- Enter the Model Name and Base URL retrieved from Step 6: Deploy Poolside models, and optionally a Description or Name override.
- Click Connect to Model.
Verification
Your installation is successful when:- All pods are running:
kubectl get pods -A - The web interface is accessible at
https://poolside.poolside.local - Models show a
Healthystatus in the Poolside Console - Chat functionality works in the Poolside Chat
Troubleshooting
Common issues
Model pods stuck inContainerCreating
-
Verify GPU availability on the host using
nvidia-smi -
Scale the affected deployment to zero replicas, then scale it back up:
- Identify the deployment:
kubectl get deploy -n poolside-models - Scale down and back up as needed
- Identify the deployment:
- Trust the cluster CA certificate in the
poolside-installdirectory of your installation bundle, or from the OS trust store under/usr/local/...after installation - Certificate installation steps vary by operating system
-
Verify that services are running:
- Confirm that models were successfully uploaded during the model upload step