# On-premise Installation Guide

### Requirements:

* Kubernetes cluster:
  * It must be able to use **OpenEBS Cstor**. Disks have to be attached to Kubernetes nodes and must not be mounted or formatted.
  * If there is no internet access, each node should have a **busybox:latest** image preloaded.
* A linux VM:
  * Must be accessible by the Kubernetes cluster (this VM will host the docker registry along with the **chartmuseum** and **devpi** services, which are needed to run the platform).
  * Must have access to the Kubernetes cluster.
  * The following utilities have to be installed: **docker, kubectl, jq.**

### Archive Structure

**/chartmuseum**

* A directory with all required helm charts. It will be mounted as a volume to the **chartmuseum** container.

**/registry**

* A directory with all required docker images. It will be mounted as a volume to the **registry** container.

**/devpi**

* A directory with the **apolo-cli** python package and all its dependencies. It will be mounted as a volume to the **devpi** container.

**registry.tar**

* Saved **registry:2** image.

**chartmuseum.tar**

* Saved **chartmuseum/chartmuseum:latest** image.

**devpi.tar**

* Saved **devpi** image.

**jq.tar**

* Saved **imega/jq:latest** image, command-line JSON processor.

**yq.tar**

* Saved **mikefarah/yq:latest** image, command-line YAML processor.

**k8s/\*.yaml**

* Kubernetes resources that will be created in the cluster.

**\*.sh**

* Installation scripts.

### Platform Setup

Connect to the Linux VM and ensure that **kubectl** can connect to the Kubernetes cluster:

```
kubectl get nodes
```

Mount the USB (or external storage) device and extract the **apolo.tar** archive:

```
mkdir –p $HOME/apolo
tar -xvf apolo.tar -C $HOME/apolo
```

Prepare the config file (see [example below](#config-file-example)), run the installation script, and wait until all pods are in the Running state:

```
$HOME/apolo/install.sh $CONFIG_FILE_PATH
```

By default, if there is no Ingress certificate specified in the config file, the installation script will generate a self-signed certificate. This self-signed certificate has to be added to the certificate trust store in the platform user's development environment.

#### Configure the DNS Server

Set up A records to the platform domains **\*.neu.ro**, **default.org.neu.ro**, **\*.default.org.neu.ro**, **\*.jobs.default.org.neu.ro** in such a way that they point to all Kubernetes cluster IPv4 addresses.

### Config File Example

```
 server:
  ip: "10.240.0.8"
ui:
  type: minzdrav
ingress_ssl:
  cert_path: "/path/to/ingress.crt" # optional
  cert_key_path: "/path/to/ingress.key" # optional
postgres:
  password: changeme
  size: 10Gi
redis:
  password: changeme
  size: 10Gi
keycloak:
  username: admin
  password: changeme
auth:
  jwt_secret: changeme
registry:
  size: 10Gi
storage:
  size: 10Gi
blob_storage:
  size: 10Gi
metrics:
  size: 10Gi
node_pools:
- name: cpu
  cpu: 8
  memory_gb: 6
  disk_size_gb: 6
  nodes:
  - aks-agentpool-36699122-vmss000002
- name: gpu
  cpu: 8
  memory_gb: 6
  disk_size_gb: 6
  gpu: 1
  gpu_model: nvidia-tesla-k80
  nodes:
  - aks-agentpool-36699122-vmss000002
```

### Development Environment Setup

#### Add the certificate to the trust store (in case a self-signed certificate was generated during setup)

* Download the Ingress certificate:

```
openssl s_client -connect app.neu.ro:443 -showcerts </dev/null > ingress.crt
```

* Add it to your machine's trust store.

#### Install **Apolo** CLI

Run the following command to install Apolo CLI:

```
pip install -i http://$SERVER_IP/root/pypi apolo-cli
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.apolo.us/index/administration/overview-and-installation/on-premise-installation-guide.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
