Installation with Kubernetes
Since Txture is offered as a container, it can be operated on Kubernetes easily. The following guide details some steps to install Txture on a Kubernetes cluster.
Prerequisites
This guide has a couple of prerequisites and assumptions:
- The configuration files assume that the PostgreSQL server will be run as a container alongside Txture. This is not strictly necessary as any other deployment of a PostgreSQL server (e.g. DBaaS or central service) works equally well. If that is the case, remove the PostgreSQL section from the following suggested configuration files.
- A working Kubernetes cluster and kubectlset up locally.
- Initial contents for  txture_home(typically provided by Txture)
Configuration files
The first configuration file contains the workloads and service needed for Txture and the PostgreSQL database:
apiVersion: v1
kind: Service
metadata:
  name: txture
spec:
  ports:
    - port: 8080
  selector:
    app: txture
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: txture
spec:
  selector:
    matchLabels:
      app: txture
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: txture
    spec:
      containers:
        - image: postgres:15-bullseye
          name: postgres15
          args: ['-c', 'log_destination=jsonlog']
          env:
            # Use secret in real usage
            - name: POSTGRES_USER
              value: txture
            - name: POSTGRES_PASSWORD
              value: pleaseuseaproperypasswordhere
            - name: POSTGRES_DB
              value: txture
          ports:
            - containerPort: 5432
              name: txture-db
          volumeMounts:
            - name: txture-db-volume
              mountPath: /opt/txture-postgres
        - image: europe-docker.pkg.dev/txture/production/txture:latest
          name: txture
          command: ['/bin/sh', '-c']
          args: ['until [ -f /opt/txture_home/txture.properties ]; do sleep 5; done && catalina.sh run']
          env:
            - name: CATALINA_OPTS
              value: -DtxtureHome=/opt/txture_home -Xmx8000m -Xms8000m -server -Dio.grpc.netty.shaded.io.netty.transport.noNative=true
          resources:
            limits:
              memory: '9000Mi'
          ports:
            - containerPort: 8080
              name: txture
          volumeMounts:
            - name: txture-home
              mountPath: /opt/txture_home
      volumes:
        - name: txture-db-volume
          persistentVolumeClaim:
            claimName: txture-db-claim
        - name: txture-home
          persistentVolumeClaim:
            claimName: txture-home-claim
In addition, two persistent volume claims will need to be created (one for Txture, one for PostgreSQL):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: txture-home-claim
spec:
  storageClassName: standard-rwo
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: txture-db-claim
  namespace: default
spec:
  storageClassName: standard-rwo
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
Please note that the storageClassName will likely need to be adapted to your Kubernetes clusters.
The values provided work for Google Kubernetes Engine (GKE).
Deploying the pods
Put the two .yaml files in a single directory (e.g. txture-kubernetes) of your choice.
The .yaml files will create one service and two persistent volumes (one for the txture_home folder, the other for the postgres database).
You can configure the database password and user in the txture.yaml file.
Once you're happy with the configuration, deploy everything with
kubectl apply -f txture-kubernetes/
Txture will not start until you upload the txture_home to the volume.
Specifically, there is a check before the startup that waits until the file /opt/txture_home/txture.properties is present.
Uploading your txture_home directory
First, make sure the configuration in the txture.properties file is correct.
Most importantly, make sure that the JDBC connection string matches your PostgreSQL configuration.
You can then upload the txture_home folder using kubectl cp.
In order to be able to upload, you'll need to get the pod name first. You can fetch that information with
kubectl get pods
which should show you an output such as this
NAME                                                READY   STATUS    RESTARTS      AGE
txture-5bdb8cd8d5-9zn6z                             1/1     Running   0             32m
You can then copy the folder to the txture container running in the pod with
kubectl cp txture_home/ txture-5bdb8cd8d5-9zn6z:/opt/ -c txture
Once the files required by txture are uploaded, it will start. This might take a few minutes. You can check the logs of your Kubernetes workloads to see the progress.
Accessing your Txture instance
Once Txture has started successfully, you can access it using kubectl port-forwarding.
The port of Txture is set in the txture.yaml Kubernetes file.
You can then forward the port using the pod name once more.
kubectl port-forward txture-5bdb8cd8d5-9zn6z 8080:8080
This will map the service's port to your localhost.
You can then access the Txture instance at localhost:8080 and log in using the password you set.
Production setup
While the above sets up a Txture instance, you might want to add some more configurational details and additions. They have been left out in the above example for simplicity, but production setups might require one or more of these:
- Reverse proxy or ingress to handle TLS
- Security settings such as CAP_DROP