Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add kind selfhost example #111

Merged
merged 2 commits into from
Dec 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 89 additions & 0 deletions .github/workflows/main.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
name: ci

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

on:
pull_request:

jobs:
kind-selfhost:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: "Checkout repository"
uses: actions/checkout@v4
with:
path: ${{ github.workspace }}/src/github.com/${{ github.repository }}

- name: "Install kind"
run: |
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.26.0/kind-linux-amd64
# For ARM64
[ $(uname -m) = aarch64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.26.0/kind-linux-arm64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

- name: "Setup k8s cluster"
run: |
cat <<EOF | kind create cluster --wait=3m --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
EOF

- name: "Print cluster details"
run: |
kubectl cluster-info
kubectl version
kubectl get pods -n kube-system
echo "current-context:" $(kubectl config current-context)
echo "environment-kubeconfig:" ${KUBECONFIG}


- name: "Install nginx ingress controller"
run: |
kubectl apply -f https://kind.sigs.k8s.io/examples/ingress/deploy-ingress-nginx.yaml
kubectl wait --namespace ingress-nginx \
--for=condition=ready pod \
--selector=app.kubernetes.io/component=controller \
--timeout=90s

- name: "Huly deploy"
working-directory: ${{ github.workspace }}/src/github.com/${{ github.repository }}/kube
run: |
echo 127.0.0.1 huly.example | sudo tee -a /etc/hosts
echo 127.0.0.1 account.huly.example | sudo tee -a /etc/hosts
kubectl apply -R -f .
kubectl wait --for=condition=Available deployment/mongodb --timeout 3m
kubectl wait --for=condition=Available deployment/transactor --timeout 3m
kubectl delete pod -l app=account
kubectl wait --for=condition=Available deployment/account --timeout 3m
- name: "Check login"
run: |
token=$(curl -v -H 'Content-Type: application/json' \
-d '{"method":"createAccount","params":["user1","1234","user","1"]}' \
-X POST \
http://account.huly.example/ | jq -r '.result.token')

curl -v http://account.huly.example/ \
-X POST \
-d '{"method":"getUserWorkspaces","params":[]}' \
-H 'Content-Type: application/json' \
-H 'Accept: */*' \
-H "Authorization: Bearer $token"

- name: Cleanup resources
if: ${{ success() || failure() || cancelled() }}
run: |
kubectl describe pods
kind delete cluster
97 changes: 97 additions & 0 deletions kube/QUICKSTART.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# Quick Start with Kind
> [!NOTE]
> kind does not require kubectl, but you will not be able to perform some of the examples in our docs without it. To install kubectl see the upstream kubectl installation docs.

## Install

**macOS:**
```bash
# For Intel Macs
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.26.0/kind-darwin-amd64
# For M1 / ARM Macs
[ $(uname -m) = arm64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.26.0/kind-darwin-arm64
chmod +x ./kind
mv ./kind /some-dir-in-your-PATH/kind
```

**Linux:**
```bash
# For AMD64 / x86_64
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.26.0/kind-linux-amd64
# For ARM64
[ $(uname -m) = aarch64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.26.0/kind-linux-arm64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
```

## Setup cluster with port forwarding

> [!NOTE]
> On the host computer, `localhost:80` should be accessible.

```bash
cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
EOF
```

Deploy the ingress nginx controller:
```bash
kubectl apply -f https://kind.sigs.k8s.io/examples/ingress/deploy-ingress-nginx.yaml
```

Wait the nginx controller to be ready:
```bash
kubectl wait --namespace ingress-nginx \
--for=condition=ready pod \
--selector=app.kubernetes.io/component=controller \
--timeout=90s
```

Add host entries to be able to work with ingresses from the host machine:
```bash
sudo cp -p /etc/hosts /tmp/hosts
echo "127.0.0.1 huly.example" | sudo tee -a /etc/hosts
echo "127.0.0.1 account.huly.example" | sudo tee -a /etc/hosts
```

Deploy Huly with `kubectl`:

```bash
kubectl apply -R -f .
```

Wait until the front app is coming up:
```bash
kubectl wait --for=condition=Avaiable deployment/front --timeout 3m
```

Now, launch your web and and (enjoy Huly!)[http://huly.example]!


## Cleanup

Restore hosts file:
```bash
sudo mv /tmp/hosts /etc/hosts
```

Cleanup Huly:
```bash
kubectl delete -R -f .
```

Delete kind cluster:
```bash
kind delete cluster
```
6 changes: 6 additions & 0 deletions kube/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

This folder contains a sample configuration for Huly Kubernetes deployment.

## Requires

Requires a working kubernetes cluster with min one node. Each node should have min 2 vCPUs and 4GB of RAM.

If you don't have any k8s cluster, consider using the [kind setup](QUICKSTART.md).

## Check and update configuration

Huly deployment configuration is located in [config.yaml](config/config.yaml) and [secret.yaml](config/secret.yaml) files.
Expand Down
5 changes: 5 additions & 0 deletions kube/account/account-deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ spec:
configMapKeyRef:
name: huly-config
key: MONGO_URL
- name: MONGO_URL
valueFrom:
configMapKeyRef:
name: huly-config
key: MONGO_URL
- name: SERVER_SECRET
valueFrom:
secretKeyRef:
Expand Down
1 change: 0 additions & 1 deletion kube/mongodb/mongodb-deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ spec:
name: mongodb
ports:
- containerPort: 27017
hostPort: 27017
protocol: TCP
volumeMounts:
- mountPath: /data/db
Expand Down
4 changes: 2 additions & 2 deletions kube/mongodb/mongodb-service.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ metadata:
name: mongodb
spec:
ports:
- name: "27017"
port: 27017
- port: 27017
targetPort: 27017
protocol: TCP
selector:
app: mongodb
Loading