From 159e7a07e817282720b0a08115c40bbdf2b4cd7c Mon Sep 17 00:00:00 2001 From: Jay Boyd Date: Sat, 29 Nov 2025 20:24:00 -0600 Subject: [PATCH 1/3] k3s-simplifications (#458) * k3s-simplifications * missed some key updates (replace hostnames) and more * rework and final run through * remove service name, it's not used anymore, it's set directly in ingress.yaml * restore original Chart.yaml & Chart.lock * remove DO specific annotations from base chart, fix global so they override * add certificateDomain * add dependency to base metrics-api * adjust/indent values for metrics-api dependency * missing Chart.lock * fix indentation * moved postgres and auth values from secret to deployment.yaml --------- Co-authored-by: Dario A Lencina-Talarico --- helm/K3S_DEPLOYMENT_GUIDE.md | 491 ++++++++++++++++++ .../cloudflare-issuer.yaml | 18 + ...manager-issuer.yaml => digital-ocean.yaml} | 2 +- helm/cert-manager-issuer/route53-issuer.yaml | 21 + ...nal-dns-values.yaml => digital-ocean.yaml} | 0 helm/external-dns/route53.yaml | 20 + .../global/singapore/webtransport/values.yaml | 3 +- helm/global/us-east/metrics-api/Chart.lock | 6 + helm/global/us-east/metrics-api/Chart.yaml | 7 +- helm/global/us-east/metrics-api/values.yaml | 261 +++++----- helm/global/us-east/websocket/values.yaml | 16 - helm/global/us-east/webtransport/values.yaml | 25 +- helm/grafana/Chart.lock | 6 + helm/grafana/Chart.yaml | 11 + helm/grafana/certificate.yaml | 12 + .../server-connections-analytics.json | 0 ...connections-analytics.json:Zone.Identifier | Bin 0 -> 25 bytes .../grafana/dashboards/videocall-health.json | 0 .../videocall-health.json:Zone.Identifier | Bin 0 -> 25 bytes helm/grafana/deploy.sh | 35 ++ helm/grafana/external-secret.yaml | 20 + helm/grafana/values.yaml | 90 ++++ helm/metrics-api/Chart.yaml | 17 + .../metrics-api/templates/_helpers.tpl | 0 .../metrics-api/templates/deployment.yaml | 0 .../templates/server-stats-deployment.yaml | 0 .../templates/server-stats-service.yaml | 0 .../metrics-api/templates/service.yaml | 0 helm/metrics-api/values.yaml | 132 +++++ helm/nats/Chart.lock | 6 + helm/nats/Chart.yaml | 9 + helm/nats/values.yaml | 34 ++ helm/postgres/Chart.lock | 6 +- helm/postgres/Chart.yaml | 8 +- helm/postgres/README.md | 142 +++++ helm/postgres/values.yaml | 3 - helm/prometheus/Chart.lock | 6 + helm/prometheus/Chart.yaml | 11 + helm/prometheus/values.yaml | 280 ++++++++++ helm/rustlemania-ui/values.yaml | 33 +- .../templates/deployment.yaml | 19 + .../templates/ingress.yaml | 4 +- helm/rustlemania-websocket/values.yaml | 60 ++- .../templates/certificate.yaml | 20 + helm/rustlemania-webtransport/values.yaml | 43 +- 45 files changed, 1655 insertions(+), 222 deletions(-) create mode 100644 helm/K3S_DEPLOYMENT_GUIDE.md create mode 100644 helm/cert-manager-issuer/cloudflare-issuer.yaml rename helm/cert-manager-issuer/{cert-manager-issuer.yaml => digital-ocean.yaml} (93%) create mode 100644 helm/cert-manager-issuer/route53-issuer.yaml rename helm/external-dns/{external-dns-values.yaml => digital-ocean.yaml} (100%) create mode 100644 helm/external-dns/route53.yaml create mode 100644 helm/global/us-east/metrics-api/Chart.lock create mode 100644 helm/grafana/Chart.lock create mode 100644 helm/grafana/Chart.yaml create mode 100644 helm/grafana/certificate.yaml rename helm/{global/us-east => }/grafana/dashboards/server-connections-analytics.json (100%) create mode 100644 helm/grafana/dashboards/server-connections-analytics.json:Zone.Identifier rename helm/{global/us-east => }/grafana/dashboards/videocall-health.json (100%) create mode 100644 helm/grafana/dashboards/videocall-health.json:Zone.Identifier create mode 100755 helm/grafana/deploy.sh create mode 100644 helm/grafana/external-secret.yaml create mode 100644 helm/grafana/values.yaml create mode 100644 helm/metrics-api/Chart.yaml rename helm/{global/us-east => }/metrics-api/templates/_helpers.tpl (100%) rename helm/{global/us-east => }/metrics-api/templates/deployment.yaml (100%) rename helm/{global/us-east => }/metrics-api/templates/server-stats-deployment.yaml (100%) rename helm/{global/us-east => }/metrics-api/templates/server-stats-service.yaml (100%) rename helm/{global/us-east => }/metrics-api/templates/service.yaml (100%) create mode 100644 helm/metrics-api/values.yaml create mode 100644 helm/nats/Chart.lock create mode 100644 helm/nats/Chart.yaml create mode 100644 helm/nats/values.yaml create mode 100644 helm/postgres/README.md delete mode 100644 helm/postgres/values.yaml create mode 100644 helm/prometheus/Chart.lock create mode 100644 helm/prometheus/Chart.yaml create mode 100644 helm/prometheus/values.yaml create mode 100644 helm/rustlemania-webtransport/templates/certificate.yaml diff --git a/helm/K3S_DEPLOYMENT_GUIDE.md b/helm/K3S_DEPLOYMENT_GUIDE.md new file mode 100644 index 000000000..d9dc9206e --- /dev/null +++ b/helm/K3S_DEPLOYMENT_GUIDE.md @@ -0,0 +1,491 @@ +# K3s Deployment Guide for VideoCall-RS + +This guide outlines how to deploy a simple Kubernetes cluster with VideoCall-RS application on a bare K3s cluster. It includes both the infrastructure components and application-specific services with a simplified configuration. We encourage you to read through this doc in its entirety first, ensure you understand what values need to be customized (and customize them!) before you go crazy deploying with cut and paste! + +## Prerequisites + +- A server with sufficient resources (recommended: 4+ CPU cores, 8GB+ RAM). This guide was done on an AWS EC2 instance using t3a.xlarge instance type. +- A domain name that you can modify DNS A records. This guide assumes you can establish programmatic interaction with DNS so that Cert Manager can obtain SSL certs via ACME & Lets Encrypt. You will also need to add A records, either dynamically with External DNS or manually prior to your install. +- Ability to open necessary ports (80, 443, 443/UDP for WebTransport) +- Clone the github repo https://github.com/security-union/videocall-rs locally and ensure you do your work from the root of the cloned repo (within the `videocall-rs` directory) + +**Before proceeding, find all occurrences of `YOUR_DOMAIN_NAME` within the files located in the `videocall-rs/helm` directory tree. Every occurrence should be replaced with your domain name where you will be deploying. You must have a valid domain name, the procedure below requires you to use cert-manager and optionally external dns to set DNS entries for use with obtaining valid SSL certificates and resolving DNS names. For example:** +```bash +find helm -type f -name "*.yaml" -exec sed -i 's/YOUR_DOMAIN_NAME/yourdomainname/g' {} + +``` +but use your actual domain name in the place of "yourdomainname" (e.g., `example.com`). + +## 1. K3s Base Installation + +Install K3s with the following command as a normal user with sudo privileges: + +```bash +curl -sfL https://get.k3s.io | sh -s - --disable traefik --write-kubeconfig-mode=644 +``` + +We disable the default Traefik ingress as we'll be using NGINX Ingress Controller instead. + +After installation, ensure you can access the cluster: + +```bash +kubectl get nodes +``` +Install Helm: + +```bash +curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 +chmod +x get_helm.sh +./get_helm.sh +``` + +The version of `kubectl` installed with K3s will locate and use the k3s config file, but Helm will not, and by default it is readonly. Copy the k32 kubeconfig file so it's standard location so Helm can access the cluster: + +```bash +mkdir ~/.kube +cp /etc/rancher/k3s/k3s.yaml ~/.kube/config +``` + +Update your shell startup (e.g. `~/.bashrc`) and export `KUBECONFIG=~/.kube/config` +```bash +# update your shell startup script: +echo "export KUBECONFIG=~/.kube/config" >> ~/.bashrc +# Set it for this interactive shell sessions +export KUBECONFIG=~/.kube/config +``` + +We're going to install the application components into the `videocall` namespace. Let's create that now and set it as the default context: +```bash +kubectl create namespace videocall +kubectl config set-context --current --namespace=videocall +``` + +## 2. Core Infrastructure Components + +### 2.1 NGINX Ingress Controller + +Install the NGINX Ingress Controller. + +Setup the required Helm repository: +```bash +helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +helm repo update +``` +You need to specify the Ingress external IP address: +```bash +IPADDR=`hostname -i` +echo "Ingress IP Address: $IPADDR" +``` +Ensure you validate this IP address before proceeding, reset the environment variable if necessary. Then install NGINX: +```bash +# Install NGINX Ingress Controller +helm install ingress-nginx helm/ingress-nginx \ + --create-namespace \ + --namespace ingress-nginx \ + --version 4.13.0 \ + --set controller.service.type=NodePort \ + --set controller.service.externalIPs={$IPADDR} +``` + +This configuration exposes the NGINX Ingress Controller on the specified IP address, making it accessible from outside the cluster. The NodePort service type allows the controller to be reached on specific ports on all nodes in the cluster (in our example here, single node). + +### 2.2 Cert Manager + +Install cert-manager for TLS certificate management. + +Add the necessary Helm repo: +```bash +helm repo add jetstack https://charts.jetstack.io +helm repo update +``` +Install Cert Manager: +```bash +helm install cert-manager helm/cert-manager \ + --namespace cert-manager \ + --create-namespace \ +``` + +You only need to install one Issuer. Below are examples of a AWS Route 53 Issuer and a CloudFlare Issuer. If you are using different DNS management, consult the Cert Manager documentation: https://cert-manager.io/docs/configuration/acme/dns01 + +#### 2.2.1 AWS Route 53 +##### AWS IAM Permissions for Route 53 DNS01 Challenge + +The AWS identity (user or role) whose credentials are used for DNS01 challenge must have permissions to manage Route 53 records for your domain. At minimum, the following IAM policy should be attached: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "route53:ListHostedZones", + "route53:GetChange", + "route53:ChangeResourceRecordSets" + ], + "Resource": "*" + } + ] +} +``` + +This allows cert-manager to list hosted zones, submit DNS record changes, and check their status. For production, you may wish to restrict the `Resource` to only the hosted zone(s) you use. + +For more details, see the cert-manager documentation: https://cert-manager.io/docs/configuration/acme/dns01/route53/ + +Configure the LetsEncrypt Issuer in the videocall namespace using AWS Route 53 for DNS01 challenge. We'll create a namespaced Issuer (vs a cluster issuer). + +Refer to [Configuring DNS01 Challenge Provider](https://cert-manager.io/docs/configuration/acme/dns01/). + + +In the steps below, you must use your own AWS Access Key details. Additionally, locate and edit the `helm/cluster-manager-issuer/route53-issuer.yaml` and update the `email` attribute with your own email. Do that now before continuing. +```bash +# Create a secret for AWS Route53 API credentials +kubectl create secret generic route53-creds -n videocall \ + --from-literal=aws_access_key_id=YOUR_AWS_ACCESS_KEY_ID \ + --from-literal=aws_secret_access_key=YOUR_AWS_SECRET_ACCESS_KEY + +# Create the namespace-scoped Issuer with DNS01 challenge using Route53 +kubectl apply -f helm/cert-manager-issuer/route53-issuer.yaml +``` + +> **Note**: This configuration uses DNS01 challenge with AWS Route53, which is required for validating wildcard certificates and is generally more reliable than HTTP01 validation. This deployment will use this method for certificate validation. You can use other DNS providers supported by cert-manager, or switch to HTTP01 validation (which doesn't work for wildcard certificates) if your deployment is available on the internet. + +#### 2.2.2 Cloudflare + +Alternatively, you can use Cloudflare for DNS01 challenge. The process is similar, but uses Cloudflare API credentials. See [cert-manager Cloudflare DNS01 documentation](https://cert-manager.io/docs/configuration/acme/dns01/cloudflare/). + +1. Create a Cloudflare API token with permissions for "Zone:DNS:Edit" and "Zone:Read" for your domain. +2. Store the token in a Kubernetes secret: + +```bash +kubectl create secret generic cloudflare-api-token-secret -n videocall \ + --from-literal=api-token=YOUR_CLOUDFLARE_API_TOKEN +``` + +3. Edit the `helm/cluster-manager-issuer/cloudflare-issuer.yaml` and update the two `email` attributes with your own email. Do that now before continuing. + +4. Create the Issuer: +```bash +kubectl apply -f helm/cert-manager-issuer/cloudflare-issuer.yaml +``` +> **Note**: This configuration uses DNS01 challenge with Cloudflare. You must use an API token (not your global API key) with the correct permissions. For more details, see [cert-manager Cloudflare DNS01 documentation](https://cert-manager.io/docs/configuration/acme/dns01/cloudflare/). + +### 2.3 DNS A Records + +A DNS A record, or Address record, maps a domain name (like www.example.com) to a specific IPv4 address (e.g., 192.0.2.1). You can manually create these or you can use External DNS to do it for you. Follow one of these steps below. + +#### 2.3.1 External DNS +The Videocall charts are setup to utilize External DNS (https://github.com/kubernetes-sigs/external-dns) to automatically create the necessary DNS records. The procedure below installs and configured External DNS. + +Add the necessary Helm repo: +```bash +helm repo add external-dns https://kubernetes-sigs.github.io/external-dns/ +helm repo update +``` + +Create a new namespace for External DNS: +```bash +# Create a secret for AWS Route53 API credentials +kubectl create namespace externaldns +``` + +In this example we're using AWS Route 53 for DNS management. You could use Digital Ocean, Cloudflare, or any other supported DNS provider. + +Setup your AWS Credentials. **Use your own values for the access key and secret access key.** Create your aws credentials file (~/.aws/credentials): +```bash +[default] +aws_access_key_id = AKIAEXAMPLEKEY123456 +aws_secret_access_key = AbCdEfGhIjKlMnOpQrStUvWxYz1234567890+EXAMPLE +``` +Create a secret from these credentials: +```bash +kubectl create secret generic external-dns -n externaldns \ + --from-file=dns-creds=~/.aws/credentials +``` + +Install External DNS with AWS Route53 configuration +```bash +helm install external-dns external-dns/external-dns \ + --namespace externaldns \ + --values ./helm/external-dns/route53.yaml +``` + + +#### 2.3.2 Manual DNS Configuration + +External DNS can be skipped if you prefer to manage DNS records manually. In this case, you would need to create the following A/CNAME records pointing to your cluster's public IP address: + +| DNS Name | Purpose | Service Type | +|---------|---------|-------------| +| webtransport.yourdomain.com | WebTransport server | LoadBalancer | +| app.yourdomain.com | UI application | Ingress | +| api.yourdomain.com | API application | Ingress | +| websocket.yourdomain.com | WebSocket server | Ingress | +| grafana.yourdomain.com | Grafana dashboard | Ingress | + +In this simple K3s configuration, use the IP address of the K3s node which can usually be reviewed with the command `hostname -i`. If you are using a cloud based VM, there may be multiple IPs that point to this host, often times one internal (private) and one external. If your audience is coming from the internet, ensure you are using the correct IP address here. + +For each DNS name in the table above, create an A record in your DNS provider for the appropriate hostname pointing to this IP. + +Manual DNS configuration requires updating records whenever your service IPs change (such as after cluster redeployment), whereas External DNS handles this automatically. + +## 3. Monitoring Stack (Optional) + +### 3.1 Prometheus + +Install Prometheus for metrics collection: + +```bash +helm repo add prometheus-community https://prometheus-community.github.io/helm-charts +helm dependency build helm/prometheus +helm install prometheus helm/prometheus --namespace videocall +``` + +Key configurations to review: +- Retention period +- Storage size and class +- Scrape configurations (especially for service endpoints) + +revise `./helm/prometheus/values.yaml` as necessary prior to install. + + +### 3.2 Grafana + +Install Grafana for metrics visualization. + +Setup the required Helm repository: + +```bash +helm repo add grafana https://grafana.github.io/helm-charts +helm dependency build helm/grafana +``` +Use a custom value for the Grafana Admin Password: +```bash +export GRAFANA_ADMIN_USER=admin +export GRAFANA_ADMIN_PASSWORD=videocall-monitoring-2024 +``` +Install: +```bash +helm upgrade --install grafana helm/grafana \ + --namespace videocall \ + --set grafana.adminUser=$GRAFANA_ADMIN_USER \ + --set grafana.adminPassword=$GRAFANA_ADMIN_PASSWORD \ + --set grafana.grafana.ini.security.admin_user=$GRAFANA_ADMIN_USER \ + --set grafana.grafana.ini.security.admin_password=$GRAFANA_ADMIN_PASSWORD +``` + + + +## 4. Video Call Application Components + +### 4.1 NATS Message Broker + +Before installing NATS, add the NATS Helm repository and build chart dependencies: + +```bash +helm repo add nats https://nats-io.github.io/k8s/helm/charts/ +helm dependency build helm/nats +``` + +Install NATS for application messaging: + +```bash +helm install nats helm/nats --namespace videocall +``` + +This uses a very simple, non persisted NATS configuration. + +### 4.2 Metrics API Services + +Install the metrics API services: + +```bash +helm install metrics-api ./helm/metrics-api --namespace videocall +``` + +### 4.3 WebSocket Server + +Install the WebSocket server: + +```bash +helm install websocket ./helm/rustlemania-websocket --namespace videocall +``` + + +### 4.4 WebTransport Server + +Install the WebTransport server: + +```bash +helm install webtransport ./helm/rustlemania-webtransport --namespace videocall +``` + +> **Important**: Unlike other services, the WebTransport server does not use the NGINX Ingress Controller. Instead, it's exposed directly using a Kubernetes LoadBalancer Service that handles UDP traffic required for HTTP3/WebTransport protocol. The WebTransport server handles its own TLS termination using mounted certificates, and clients connect directly to this service rather than through NGINX. This is necessary because WebTransport requires direct UDP connectivity for the QUIC protocol. + +> Note: The webtransport server may restart several times before success. Generally this is because it tries to start before cert-manager has obtained and setup the necessary SSL cert. You can view the pod logs to confirm if your webtranport pod is failing to start. + + +### 4.5 UI Application + +Install the UI application: + +```bash +helm install ui ./helm/rustlemania-ui --namespace videocall +``` + + +## 5. Post-Installation Verification + +### 5.1 Verify Services + +Check that all services are running: + +```bash +$ kubectl get pods,services,ingress +NAME READY STATUS RESTARTS AGE +pod/client-metrics-api-68889cbdb6-k7sh4 1/1 Running 0 149m +pod/grafana-c44db467f-xkztd 1/1 Running 0 5h25m +pod/nats-0 3/3 Running 0 5d1h +pod/nats-box-69b79775f4-5fxgn 1/1 Running 0 5d1h +pod/prometheus-kube-state-metrics-686d9fd46c-jx6b9 1/1 Running 0 4h18m +pod/prometheus-prometheus-node-exporter-4zrz4 1/1 Running 0 4h18m +pod/prometheus-prometheus-pushgateway-6bf748ccc9-zlhb6 1/1 Running 0 4h18m +pod/prometheus-server-58cc4bc869-m6pnk 2/2 Running 0 4h18m +pod/rustlemania-ui-cb7f7f5b-j8s5j 1/1 Running 0 29h +pod/rustlemania-websocket-7d5685bf44-vs7sf 1/1 Running 0 29h +pod/rustlemania-webtransport-6db5b5678f-pthjk 1/1 Running 0 29h +pod/server-metrics-api-75447fcc86-nc4pq 1/1 Running 0 4h44m + +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +service/client-metrics-api ClusterIP 10.43.112.83 9091/TCP 4h45m +service/grafana ClusterIP 10.43.157.225 80/TCP 5h25m +service/nats ClusterIP None 4222/TCP,6222/TCP,8222/TCP,7777/TCP,7422/TCP,7522/TCP 5d1h +service/prometheus-kube-state-metrics ClusterIP 10.43.243.0 8080/TCP 5h31m +service/prometheus-prometheus-node-exporter ClusterIP 10.43.143.191 9100/TCP 5h31m +service/prometheus-prometheus-pushgateway ClusterIP 10.43.20.225 9091/TCP 5h31m +service/prometheus-server ClusterIP 10.43.32.88 80/TCP 5h31m +service/rustlemania-ui ClusterIP 10.43.115.124 80/TCP 47h +service/rustlemania-websocket ClusterIP 10.43.136.127 8080/TCP 29h +service/rustlemania-webtransport-lb LoadBalancer 10.43.74.88 10.190.252.181 5321:32767/TCP,443:32463/UDP 47h +service/server-metrics-api ClusterIP 10.43.18.91 9092/TCP 4h45m + +NAME CLASS HOSTS ADDRESS PORTS AGE +ingress.networking.k8s.io/grafana grafana.yourdomain.com 10.190.252.181 80, 443 5h25m +ingress.networking.k8s.io/prometheus-server prometheus.yourdomain.com 10.190.252.181 80, 443 4h18m +ingress.networking.k8s.io/rustlemania-ui nginx app.yourdomain.com 10.190.252.181 80, 443 47h +ingress.networking.k8s.io/rustlemania-websocket nginx websocket.yourdomain.com 10.190.252.181 80, 443 29h +``` + +### 5.2 Verify TLS Certificates + +Ensure certificates are properly issued, they should be ready: + +```bash +$ kubectl get certificates -n videocall +NAME READY SECRET AGE +grafana-tls True grafana-tls 5h18m +prometheus-tls True prometheus-tls 4h16m +rustlemania-webtransport-tls True webtransport-tls 47h +ui-tls True ui-tls 47h +websocket-tls True websocket-tls 29h +``` + + +### 5.3 Test Connectivity + +Test connectivity to the various services: +- UI: https://app.yourdomain.com **<-- this is the main url, open it in your browser!!** +- WebSocket: wss://websocket.yourdomain.com +- WebTransport: https://webtransport.yourdomain.com +- Grafana: https://grafana.yourdomain.com + +## 6. Custom Values Files to Review + +The following custom values files should be reviewed and updated for your deployment: + +1. **WebSocket Server**: `./helm/rustlemania-websocket/values.yaml` + - Update image repository and tag + - Configure resource limits (min 384Mi memory request, 768Mi limit) + - Set appropriate ingress hostname + - Configure environment variables + +2. **WebTransport Server**: `./helm/rustlemania-webtransport/values.yaml` + - Update image repository and tag + - Configure resource limits (min 384Mi memory request, 768Mi limit) + - Set TLS certificate name + - Configure service type and ports + - Configure environment variables + +3. **UI Application**: `./helm/rustlemania-ui/values.yaml` + - Update image repository and tag + - Configure ingress hostname + - Set environment variables + +4. **NATS**: `./helm/nats/values.yaml` + - Configure authentication if needed + - Adjust resource limits + +5. **Prometheus**: `./helm/prometheus/values.yaml` + - Adjust retention and storage + +6. **Grafana**: `./helm/grafana/values.yaml` + - Configure admin credentials + - Set up dashboards and data sources + + +## 7. Monitoring + +Grafana is used for monitoring and visualizing metrics in this deployment. Two dashboards are provided for quick insights: + +- **Server Connections Analytics**: `./helm/global/us-east/grafana/dashboards/server-connections-analytics.json` +- **Videocall Health**: `./helm/global/us-east/grafana/dashboards/videocall-health.json` + +### Importing Dashboards into Grafana + +1. Log in to your Grafana instance (https://grafana.yourdomain.com). The admin username and password was specified in `helm/global/us-east/grafana/values.yaml` (see `adminUser` and `adminPassword`). +2. In the left sidebar, click the **Dashboards** (four squares) icon, then select **Import**. +3. Click **Upload JSON file** and select either `server-connections-analytics.json` or `videocall-health.json` from `./helm/global/us-east/grafana/dashboards/`. +4. Choose the Prometheus data source if prompted, then click **Import**. +5. Repeat for the second dashboard. + +You should now see both dashboards available in your Grafana instance for monitoring system health and analytics. + +--- +## 8. Troubleshooting + +### 7.1 Pod Status Issues + +If pods are not reaching the Running state: + +```bash +kubectl describe pod -n videocall +kubectl logs -n videocall +``` + +### 7.2 Certificate Issues + +If certificates are not being issued: + +```bash +kubectl describe certificate -n videocall +kubectl describe challenges -n cert-manager +``` + +### 7.3 Ingress Problems + +For ingress troubleshooting: + +```bash +kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx +``` + + +### 7.5 Common OOM Issues + +If services are experiencing OOM errors: +- Check the resource limits in the values.yaml files +- Ensure you've applied the changes with helm upgrade +- Verify the actual resource settings: + ```bash + kubectl get deployment -n videocall -o yaml | grep -A10 resources + ``` diff --git a/helm/cert-manager-issuer/cloudflare-issuer.yaml b/helm/cert-manager-issuer/cloudflare-issuer.yaml new file mode 100644 index 000000000..088ce2834 --- /dev/null +++ b/helm/cert-manager-issuer/cloudflare-issuer.yaml @@ -0,0 +1,18 @@ +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: letsencrypt-prod + namespace: videocall +spec: + acme: + server: https://acme-v02.api.letsencrypt.org/directory + email: your-email@yourdomain.com + privateKeySecretRef: + name: letsencrypt-prod + solvers: + - dns01: + cloudflare: + email: your-email@yourdomain.com + apiTokenSecretRef: + name: cloudflare-api-token-secret + key: api-token \ No newline at end of file diff --git a/helm/cert-manager-issuer/cert-manager-issuer.yaml b/helm/cert-manager-issuer/digital-ocean.yaml similarity index 93% rename from helm/cert-manager-issuer/cert-manager-issuer.yaml rename to helm/cert-manager-issuer/digital-ocean.yaml index 5835d4f97..839e9ceb4 100644 --- a/helm/cert-manager-issuer/cert-manager-issuer.yaml +++ b/helm/cert-manager-issuer/digital-ocean.yaml @@ -7,7 +7,7 @@ spec: # The ACME server URL server: https://acme-v02.api.letsencrypt.org/directory # Email address used for ACME registration - email: social@securityunion.dev + email: your-email@yourdomain.com # Name of a secret used to store the ACME account private key privateKeySecretRef: name: letsencrypt-prod diff --git a/helm/cert-manager-issuer/route53-issuer.yaml b/helm/cert-manager-issuer/route53-issuer.yaml new file mode 100644 index 000000000..8269b6e18 --- /dev/null +++ b/helm/cert-manager-issuer/route53-issuer.yaml @@ -0,0 +1,21 @@ +piVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: letsencrypt-prod + namespace: videocall +spec: + acme: + server: https://acme-v02.api.letsencrypt.org/directory + email: your-email@yourdomain.com + privateKeySecretRef: + name: letsencrypt-prod + solvers: + - dns01: + route53: + region: us-east-1 + accessKeyIDSecretRef: + name: route53-creds + key: aws_access_key_id + secretAccessKeySecretRef: + name: route53-creds + key: aws_secret_access_key \ No newline at end of file diff --git a/helm/external-dns/external-dns-values.yaml b/helm/external-dns/digital-ocean.yaml similarity index 100% rename from helm/external-dns/external-dns-values.yaml rename to helm/external-dns/digital-ocean.yaml diff --git a/helm/external-dns/route53.yaml b/helm/external-dns/route53.yaml new file mode 100644 index 000000000..3c5c9bcd8 --- /dev/null +++ b/helm/external-dns/route53.yaml @@ -0,0 +1,20 @@ +# AWS Route53 Provider Configuration +provider: + name: aws + +# AWS Credentials Configuration +env: + - name: AWS_SHARED_CREDENTIALS_FILE + value: /etc/aws/credentials/dns-creds + - name: AWS_DEFAULT_REGION + value: us-east-1 + +# Mount AWS credentials from secret +extraVolumeMounts: + - mountPath: /etc/aws/credentials + name: aws-credentials + readOnly: true +extraVolumes: + - name: aws-credentials + secret: + secretName: external-dns \ No newline at end of file diff --git a/helm/global/singapore/webtransport/values.yaml b/helm/global/singapore/webtransport/values.yaml index b91ef1170..5f81ef852 100644 --- a/helm/global/singapore/webtransport/values.yaml +++ b/helm/global/singapore/webtransport/values.yaml @@ -57,7 +57,8 @@ rustlemania-webtransport: type: LoadBalancer # LoadBalancer for UDP traffic port: 443 healthPort: 444 - annotations: + + loadBalancerAnnotations: service.beta.kubernetes.io/do-loadbalancer-name: "webtransport-singapore" service.beta.kubernetes.io/do-loadbalancer-size-unit: "1" service.beta.kubernetes.io/do-loadbalancer-healthcheck-protocol: "http" diff --git a/helm/global/us-east/metrics-api/Chart.lock b/helm/global/us-east/metrics-api/Chart.lock new file mode 100644 index 000000000..b4d621e20 --- /dev/null +++ b/helm/global/us-east/metrics-api/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: metrics-api + repository: file://../../../metrics-api + version: 0.1.0 +digest: sha256:29e0657f2530c414e018c5f70b0c02458361919d548095e92b74d24b04731858 +generated: "2025-11-14T11:37:27.808905037-05:00" diff --git a/helm/global/us-east/metrics-api/Chart.yaml b/helm/global/us-east/metrics-api/Chart.yaml index 5e30075bf..78dea445e 100644 --- a/helm/global/us-east/metrics-api/Chart.yaml +++ b/helm/global/us-east/metrics-api/Chart.yaml @@ -14,4 +14,9 @@ sources: - https://github.com/your-org/videocall-rs maintainers: - name: Your Name - email: your-email@example.com \ No newline at end of file + email: your-email@example.com + +dependencies: + - name: metrics-api + version: 0.1.0 + repository: file://../../../metrics-api \ No newline at end of file diff --git a/helm/global/us-east/metrics-api/values.yaml b/helm/global/us-east/metrics-api/values.yaml index 7b887e581..55f315fb1 100644 --- a/helm/global/us-east/metrics-api/values.yaml +++ b/helm/global/us-east/metrics-api/values.yaml @@ -1,134 +1,133 @@ # Metrics API values for videocall monitoring (minimal resources) -metricsApi: - # Image configuration - image: - repository: securityunion/rustlemania-api - pullPolicy: Always - tag: latest - - # Minimal resources for cost optimization - resources: - limits: - cpu: 50m - memory: 128Mi - requests: - cpu: 25m - memory: 64Mi - - # Single replica - replicas: 1 - - # Service configuration - service: - type: ClusterIP - port: 9091 - targetPort: 9091 - - # Environment variables - env: - METRICS_PORT: "9091" - NATS_URL: "nats://nats-us-east:4222" - REGION: "us-east" - SERVICE_TYPE: "metrics" - RUST_LOG: "warn,async_nats=warn" - TOKIO_WORKER_THREADS: "1" # Optimal for 50m CPU (metrics collection is I/O bound) - - # Health check configuration - livenessProbe: - httpGet: - path: /health +metrics-api: + metricsApi: + # Image configuration + image: + repository: securityunion/rustlemania-api + pullPolicy: Always + tag: latest + + # Minimal resources for cost optimization + resources: + limits: + cpu: 50m + memory: 128Mi + requests: + cpu: 25m + memory: 64Mi + + # Single replica + replicas: 1 + + # Service configuration + service: + type: ClusterIP port: 9091 - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 3 - - readinessProbe: - httpGet: - path: /health - port: 9091 - initialDelaySeconds: 5 - periodSeconds: 5 - timeoutSeconds: 3 - failureThreshold: 3 - - # Security context - securityContext: - runAsUser: 1000 - runAsGroup: 1000 - fsGroup: 1000 - - # Pod security context - podSecurityContext: - runAsUser: 1000 - runAsGroup: 1000 - fsGroup: 1000 - -# Separate Server Stats pod for connection tracking (stateless snapshot approach) -serverStats: - # Image configuration (same as metrics-api but different binary) - image: - repository: securityunion/rustlemania-api - pullPolicy: Always - tag: latest - - # Minimal resources for server connection tracking - resources: - limits: - cpu: 100m - memory: 128Mi - requests: - cpu: 50m - memory: 64Mi - - # Single replica - replicas: 1 - - # Service configuration - different port from client metrics - service: - type: ClusterIP - port: 9092 - targetPort: 9092 - - # Environment variables for server stats - env: - METRICS_PORT: "9092" - NATS_URL: "nats://nats-us-east:4222" - REGION: "us-east" - SERVICE_TYPE: "server-stats" - RUST_LOG: "debug,async_nats=info" - TOKIO_WORKER_THREADS: "1" # Optimal for 100m CPU (server stats aggregation is I/O bound) - - # Binary to run - command: ["/usr/bin/metrics_server_snapshot"] - - # Health check configuration - livenessProbe: - httpGet: - path: /health - port: 9092 - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 3 - - readinessProbe: - httpGet: - path: /health + targetPort: 9091 + + # Environment variables + env: + METRICS_PORT: "9091" + NATS_URL: "nats://nats-us-east:4222" + REGION: "us-east" + SERVICE_TYPE: "metrics" + RUST_LOG: "warn,async_nats=warn" + TOKIO_WORKER_THREADS: "1" # Optimal for 50m CPU (metrics collection is I/O bound) + + # Health check configuration + livenessProbe: + httpGet: + path: /health + port: 9091 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 + + readinessProbe: + httpGet: + path: /health + port: 9091 + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 3 + + # Security context + securityContext: + runAsUser: 1000 + runAsGroup: 1000 + + # Pod security context + podSecurityContext: + runAsUser: 1000 + runAsGroup: 1000 + fsGroup: 1000 + + # Separate Server Stats pod for connection tracking (stateless snapshot approach) + serverStats: + # Image configuration (same as metrics-api but different binary) + image: + repository: securityunion/rustlemania-api + pullPolicy: Always + tag: latest + + # Minimal resources for server connection tracking + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 50m + memory: 64Mi + + # Single replica + replicas: 1 + + # Service configuration - different port from client metrics + service: + type: ClusterIP port: 9092 - initialDelaySeconds: 5 - periodSeconds: 5 - timeoutSeconds: 3 - failureThreshold: 3 - - # Security context - securityContext: - runAsUser: 1000 - runAsGroup: 1000 - fsGroup: 1000 - - # Pod security context - podSecurityContext: - runAsUser: 1000 - runAsGroup: 1000 - fsGroup: 1000 \ No newline at end of file + targetPort: 9092 + + # Environment variables for server stats + env: + METRICS_PORT: "9092" + NATS_URL: "nats://nats-us-east:4222" + REGION: "us-east" + SERVICE_TYPE: "server-stats" + RUST_LOG: "debug,async_nats=info" + TOKIO_WORKER_THREADS: "1" # Optimal for 100m CPU (server stats aggregation is I/O bound) + + # Binary to run + command: ["/usr/bin/metrics_server_snapshot"] + + # Health check configuration + livenessProbe: + httpGet: + path: /health + port: 9092 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 + + readinessProbe: + httpGet: + path: /health + port: 9092 + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 3 + + # Security context + securityContext: + runAsUser: 1000 + runAsGroup: 1000 + + # Pod security context + podSecurityContext: + runAsUser: 1000 + runAsGroup: 1000 + fsGroup: 1000 \ No newline at end of file diff --git a/helm/global/us-east/websocket/values.yaml b/helm/global/us-east/websocket/values.yaml index a2e018276..a7afb6f4f 100644 --- a/helm/global/us-east/websocket/values.yaml +++ b/helm/global/us-east/websocket/values.yaml @@ -19,11 +19,6 @@ rustlemania-websocket: value: nats-us-east:4222 # Connect to US East NATS cluster - name: DATABASE_ENABLED value: "true" - - name: PG_PASSWORD - valueFrom: - secretKeyRef: - name: postgres-credentials - key: password - name: DATABASE_URL value: postgres://postgres:$(PG_PASSWORD)@postgres-postgresql:5432/actix-api-db?sslmode=disable - name: REGION @@ -42,17 +37,6 @@ rustlemania-websocket: value: "5" - name: TOKIO_WORKER_THREADS value: "2" # Optimal for 2400m CPU (I/O bound WebSocket operations) - # OAuth Configuration (from secret) - - name: OAUTH_CLIENT_ID - valueFrom: - secretKeyRef: - name: google-oauth-credentials - key: client-id - - name: OAUTH_CLIENT_SECRET - valueFrom: - secretKeyRef: - name: google-oauth-credentials - key: client-secret - name: OAUTH_AUTH_URL value: "https://accounts.google.com/o/oauth2/v2/auth" - name: OAUTH_TOKEN_URL diff --git a/helm/global/us-east/webtransport/values.yaml b/helm/global/us-east/webtransport/values.yaml index e60d88078..d52512bf7 100644 --- a/helm/global/us-east/webtransport/values.yaml +++ b/helm/global/us-east/webtransport/values.yaml @@ -45,6 +45,8 @@ rustlemania-webtransport: - name: TOKIO_BLOCKING_THREADS value: "2" # Small pool for blocking crypto operations + certificateDomain: "webtransport-us-east.webtransport.video" + resources: limits: cpu: "3500m" @@ -57,17 +59,18 @@ rustlemania-webtransport: type: LoadBalancer # LoadBalancer for UDP traffic port: 443 healthPort: 444 - annotations: - service.beta.kubernetes.io/do-loadbalancer-name: "webtransport-us-east" - service.beta.kubernetes.io/do-loadbalancer-size-unit: "1" - service.beta.kubernetes.io/do-loadbalancer-healthcheck-protocol: "http" - service.beta.kubernetes.io/do-loadbalancer-healthcheck-check-interval-seconds: "10" - service.beta.kubernetes.io/do-loadbalancer-healthcheck-response-timeout-seconds: "5" - service.beta.kubernetes.io/do-loadbalancer-healthcheck-unhealthy-threshold: "3" - service.beta.kubernetes.io/do-loadbalancer-healthcheck-healthy-threshold: "2" - service.beta.kubernetes.io/do-loadbalancer-healthcheck-port: "444" - service.beta.kubernetes.io/do-loadbalancer-healthcheck-path: "/healthz" - external-dns.alpha.kubernetes.io/hostname: "webtransport-us-east.webtransport.video" + + loadBalancerAnnotations: + external-dns.alpha.kubernetes.io/hostname: "webtransport-us-east.webtransport.video" + service.beta.kubernetes.io/do-loadbalancer-name: "webtransport-us-east" + service.beta.kubernetes.io/do-loadbalancer-size-unit: "1" + service.beta.kubernetes.io/do-loadbalancer-healthcheck-protocol: "http" + service.beta.kubernetes.io/do-loadbalancer-healthcheck-check-interval-seconds: "10" + service.beta.kubernetes.io/do-loadbalancer-healthcheck-response-timeout-seconds: "5" + service.beta.kubernetes.io/do-loadbalancer-healthcheck-unhealthy-threshold: "3" + service.beta.kubernetes.io/do-loadbalancer-healthcheck-healthy-threshold: "2" + service.beta.kubernetes.io/do-loadbalancer-healthcheck-port: "444" + service.beta.kubernetes.io/do-loadbalancer-healthcheck-path: "/healthz" autoscaling: enabled: false diff --git a/helm/grafana/Chart.lock b/helm/grafana/Chart.lock new file mode 100644 index 000000000..c32b5877d --- /dev/null +++ b/helm/grafana/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: grafana + repository: https://grafana.github.io/helm-charts + version: 7.0.0 +digest: sha256:9fb57a692b37aae8415581f943defc5a76f4f189ed89744d69b020166a0a1185 +generated: "2025-08-05T23:33:20.996318-04:00" diff --git a/helm/grafana/Chart.yaml b/helm/grafana/Chart.yaml new file mode 100644 index 000000000..bd4a394f0 --- /dev/null +++ b/helm/grafana/Chart.yaml @@ -0,0 +1,11 @@ +apiVersion: v2 +name: grafana +description: Grafana monitoring for videocall infrastructure +type: application +version: 0.1.0 +appVersion: "10.0.0" + +dependencies: + - name: grafana + version: "7.0.0" + repository: "https://grafana.github.io/helm-charts" \ No newline at end of file diff --git a/helm/grafana/certificate.yaml b/helm/grafana/certificate.yaml new file mode 100644 index 000000000..2102dd92a --- /dev/null +++ b/helm/grafana/certificate.yaml @@ -0,0 +1,12 @@ +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: grafana-tls + namespace: videocall +spec: + secretName: grafana-tls + issuerRef: + name: letsencrypt-prod + kind: Issuer + dnsNames: + - grafana.YOUR_DOMAIN_NAME \ No newline at end of file diff --git a/helm/global/us-east/grafana/dashboards/server-connections-analytics.json b/helm/grafana/dashboards/server-connections-analytics.json similarity index 100% rename from helm/global/us-east/grafana/dashboards/server-connections-analytics.json rename to helm/grafana/dashboards/server-connections-analytics.json diff --git a/helm/grafana/dashboards/server-connections-analytics.json:Zone.Identifier b/helm/grafana/dashboards/server-connections-analytics.json:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..d6c1ec682968c796b9f5e9e080cc6f674b57c766 GIT binary patch literal 25 dcma!!%Fjy;DN4*MPD?F{<>dl#JyUFr831@K2xdl#JyUFr831@K2x +``` + +### Connection string for actix-api: + +``` +DATABASE_URL=postgres://postgres:@postgres-us-east-postgresql:5432/actix-api-db?sslmode=disable +``` + +## Persistent Volume + +- **Storage Class**: `do-block-storage` (DigitalOcean Block Storage) +- **Size**: 10Gi +- **Retention**: Volume persists after `helm uninstall` due to `helm.sh/resource-policy: keep` annotation + +## Managing the Database + +### Access PostgreSQL shell: + +```bash +kubectl exec -it postgres-us-east-postgresql-0 -- psql -U postgres -d actix-api-db +``` + +### View logs: + +```bash +kubectl logs postgres-us-east-postgresql-0 +``` + +### Check PVC status: + +```bash +kubectl get pvc | grep postgres +``` + +## Backup and Restore + +### Manual backup: + +```bash +kubectl exec postgres-us-east-postgresql-0 -- pg_dump -U postgres actix-api-db > backup.sql +``` + +### Restore from backup: + +```bash +kubectl exec -i postgres-us-east-postgresql-0 -- psql -U postgres actix-api-db < backup.sql +``` + +## Uninstalling + +```bash +helm uninstall postgres -n default +``` + +**Note**: The Persistent Volume Claim (PVC) will **NOT** be deleted and your data will be preserved. To completely remove everything including data: + +```bash +kubectl delete pvc data-postgres-us-east-postgresql-0 +``` + +## Monitoring + +PostgreSQL metrics are enabled and can be scraped by Prometheus. The metrics endpoint is available at: + +``` +http://postgres-us-east-postgresql-metrics:9187/metrics +``` + +## Security Recommendations + +1. **Change default passwords** in production +2. Use **Kubernetes Secrets** instead of plain text passwords in values.yaml +3. Enable **SSL/TLS** for database connections +4. Set up **regular backups** +5. Consider enabling **read replicas** for high availability + +## Troubleshooting + +### Pod not starting: + +```bash +kubectl describe pod postgres-us-east-postgresql-0 +kubectl logs postgres-us-east-postgresql-0 +``` + +### Storage issues: + +```bash +kubectl get pvc +kubectl describe pvc data-postgres-us-east-postgresql-0 +``` + +### Connection issues: + +```bash +kubectl get svc postgres-us-east-postgresql +kubectl exec -it postgres-us-east-postgresql-0 -- psql -U postgres -c "SELECT version();" +``` + diff --git a/helm/postgres/values.yaml b/helm/postgres/values.yaml deleted file mode 100644 index 92c1bd217..000000000 --- a/helm/postgres/values.yaml +++ /dev/null @@ -1,3 +0,0 @@ -postgresql: - auth: - existingSecret: rustlemania diff --git a/helm/prometheus/Chart.lock b/helm/prometheus/Chart.lock new file mode 100644 index 000000000..b03aa621d --- /dev/null +++ b/helm/prometheus/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: prometheus + repository: https://prometheus-community.github.io/helm-charts + version: 25.0.0 +digest: sha256:c36fca4c53a92945499bff5961e2fbf19c1b29c13bde6666a8c57c1ae3bc3b02 +generated: "2025-08-05T23:33:13.937811-04:00" diff --git a/helm/prometheus/Chart.yaml b/helm/prometheus/Chart.yaml new file mode 100644 index 000000000..ee25f7953 --- /dev/null +++ b/helm/prometheus/Chart.yaml @@ -0,0 +1,11 @@ +apiVersion: v2 +name: prometheus +description: Prometheus monitoring for videocall infrastructure +type: application +version: 0.1.0 +appVersion: "2.45.0" + +dependencies: + - name: prometheus + version: "25.0.0" + repository: "https://prometheus-community.github.io/helm-charts" \ No newline at end of file diff --git a/helm/prometheus/values.yaml b/helm/prometheus/values.yaml new file mode 100644 index 000000000..11dee0251 --- /dev/null +++ b/helm/prometheus/values.yaml @@ -0,0 +1,280 @@ +# Prometheus values for videocall monitoring (minimal resources) +prometheus: + # Prometheus server configuration + server: + # Resources (adjusted to avoid OOM errors) + resources: + limits: + cpu: 200m + memory: 800Mi + requests: + cpu: 100m + memory: 256Mi + + # Single replica + replicaCount: 1 + + # Persistence (minimal) + persistentVolume: + enabled: true + size: 8Gi + storageClass: "local-path" + + # Retention + retention: "7d" + + # Service configuration + service: + type: ClusterIP + servicePort: 80 + + # Security context + securityContext: + runAsUser: 65534 + runAsGroup: 65534 + fsGroup: 65534 + + # Global scrape configuration + global: + scrape_interval: 15s + evaluation_interval: 15s + + # Alertmanager (disabled for minimal setup) + alertmanager: + enabled: false + + # Node exporter (disabled for minimal setup) + nodeExporter: + enabled: false + + # Pushgateway (disabled for minimal setup) + pushgateway: + enabled: false + + # Kube-state-metrics (minimal) + kubeStateMetrics: + enabled: true + resources: + limits: + cpu: 25m + memory: 32Mi + requests: + cpu: 10m + memory: 16Mi + + # Server configuration files + serverFiles: + prometheus.yml: + rule_files: + - "alert_rules.yml" + + scrape_configs: + - job_name: 'prometheus' + static_configs: + - targets: ['localhost:9090'] + + # Client health metrics (sessions, NetEQ, video quality, etc.) + - job_name: 'videocall-client-metrics' + static_configs: + - targets: ['client-metrics-api:9091'] + metrics_path: '/metrics' + scrape_interval: 5s + scrape_timeout: 4s + + # Server connection tracking (with session_id, stale cleanup, etc.) + - job_name: 'videocall-server-stats' + static_configs: + - targets: ['server-metrics-api:9092'] + metrics_path: '/metrics' + scrape_interval: 5s + scrape_timeout: 4s + + # Kubernetes API server + - job_name: 'kubernetes-apiservers' + kubernetes_sd_configs: + - role: endpoints + scheme: https + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + relabel_configs: + - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] + action: keep + regex: default;kubernetes;https + + # Kubernetes nodes + - job_name: 'kubernetes-nodes' + kubernetes_sd_configs: + - role: node + scheme: https + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + relabel_configs: + - action: labelmap + regex: __meta_kubernetes_node_label_(.+) + - target_label: __address__ + replacement: kubernetes.default.svc:443 + - source_labels: [__meta_kubernetes_node_name] + regex: (.+) + target_label: __metrics_path__ + replacement: /api/v1/nodes/${1}/proxy/metrics + + # Kubernetes service endpoints + - job_name: 'kubernetes-service-endpoints' + honor_labels: true + kubernetes_sd_configs: + - role: endpoints + relabel_configs: + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] + action: keep + regex: "true" + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape_slow] + action: drop + regex: "true" + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] + action: replace + regex: (https?) + target_label: __scheme__ + replacement: $1 + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] + action: replace + regex: (.+) + target_label: __metrics_path__ + replacement: $1 + - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] + action: replace + regex: (.+?)(?::\d+)?;(\d+) + target_label: __address__ + replacement: $1:$2 + - action: labelmap + regex: __meta_kubernetes_service_annotation_prometheus_io_param_(.+) + replacement: __param_$1 + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - source_labels: [__meta_kubernetes_namespace] + action: replace + target_label: namespace + - source_labels: [__meta_kubernetes_service_name] + action: replace + target_label: service + - source_labels: [__meta_kubernetes_pod_node_name] + action: replace + target_label: node + + # Kubernetes pods + - job_name: 'kubernetes-pods' + honor_labels: true + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] + action: keep + regex: "true" + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape_slow] + action: drop + regex: "true" + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scheme] + action: replace + regex: (https?) + target_label: __scheme__ + replacement: $1 + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] + action: replace + regex: (.+) + target_label: __metrics_path__ + replacement: $1 + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port, __meta_kubernetes_pod_ip] + action: replace + regex: (\d+);(([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}) + target_label: __address__ + replacement: '[$2]:$1' + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port, __meta_kubernetes_pod_ip] + action: replace + regex: (\d+);((([0-9]+?)(\.|$)){4}) + target_label: __address__ + replacement: $2:$1 + - action: labelmap + regex: __meta_kubernetes_pod_annotation_prometheus_io_param_(.+) + replacement: __param_$1 + - action: labelmap + regex: __meta_kubernetes_pod_label_(.+) + - source_labels: [__meta_kubernetes_namespace] + action: replace + target_label: namespace + - source_labels: [__meta_kubernetes_pod_name] + action: replace + target_label: pod + - source_labels: [__meta_kubernetes_pod_phase] + action: drop + regex: Pending|Succeeded|Failed|Completed + - source_labels: [__meta_kubernetes_pod_node_name] + action: replace + target_label: node + + alert_rules.yml: + groups: + - name: videocall_alerts + rules: + - alert: HighAudioReceptionFailures + expr: rate(videocall_audio_reception_failures_total[5m]) > 0.1 + for: 2m + labels: + severity: warning + annotations: + summary: "High audio reception failures detected" + description: "Audio reception failure rate is {{ $value }} failures/sec" + + - alert: HighVideoReceptionFailures + expr: rate(videocall_video_reception_failures_total[5m]) > 0.1 + for: 2m + labels: + severity: warning + annotations: + summary: "High video reception failures detected" + description: "Video reception failure rate is {{ $value }} failures/sec" + + - alert: LowAudioConnectivity + expr: videocall_peer_can_listen < 0.5 + for: 1m + labels: + severity: critical + annotations: + summary: "Low audio connectivity detected" + description: "Audio connectivity is {{ $value }}%" + + - alert: LowVideoConnectivity + expr: videocall_peer_can_see < 0.5 + for: 1m + labels: + severity: critical + annotations: + summary: "Low video connectivity detected" + description: "Video connectivity is {{ $value }}%" + + - alert: HighNetEQBuffer + expr: videocall_neteq_audio_buffer_ms > 200 + for: 2m + labels: + severity: warning + annotations: + summary: "High NetEQ audio buffer detected" + description: "NetEQ audio buffer is {{ $value }}ms" + + - alert: HighPacketDecodeQueue + expr: videocall_neteq_packets_awaiting_decode > 20 + for: 2m + labels: + severity: warning + annotations: + summary: "High packet decode queue detected" + description: "{{ $value }} packets awaiting decode" + + - alert: HighDecodeOperations + expr: rate(videocall_neteq_normal_ops_per_sec[5m]) + rate(videocall_neteq_expand_ops_per_sec[5m]) + rate(videocall_neteq_accelerate_ops_per_sec[5m]) > 50 + for: 2m + labels: + severity: warning + annotations: + summary: "High decode operations detected" + description: "{{ $value }} decode operations per second" \ No newline at end of file diff --git a/helm/rustlemania-ui/values.yaml b/helm/rustlemania-ui/values.yaml index 24e84d39f..ec897a183 100644 --- a/helm/rustlemania-ui/values.yaml +++ b/helm/rustlemania-ui/values.yaml @@ -2,7 +2,7 @@ # This is a YAML-formatted file. # Declare variables to be passed into your templates. nameOverride: "" -fullnameOverride: "" +fullnameOverride: "rustlemania-ui" replicaCount: 1 image: @@ -11,11 +11,11 @@ image: tag: latest resources: limits: - cpu: "50m" # 50% of a single CPU - memory: "10Mi" # 512 MiB of memory + cpu: "100m" # 100% of a single CPU + memory: "128Mi" # 128 * 1024 *1024 bytes requests: - cpu: "20m" # 25% of a single CPU - memory: "10Mi" # 256 MiB of memory + cpu: "50m" # 50% of a single CPU + memory: "64Mi"# 64 * 1024 *1024 bytes podAnnotations: {} podSecurityContext: {} securityContext: {} @@ -33,29 +33,28 @@ tolerations: [] affinity: {} runtimeConfig: - # Using values aligned with docker/Dockerfile.yew - apiBaseUrl: "https://app.videocall.rs" - wsUrl: "wss://websocket-singapore.webtransport.video,wss://websocket-us-east.webtransport.video" - webTransportHost: "https://webtransport-singapore.webtransport.video,https://webtransport-us-east.webtransport.video" + apiBaseUrl: "https://api.YOUR_DOMAIN_NAME" + wsUrl: "wss://websocket.YOUR_DOMAIN_NAME" + webTransportHost: "https://webtransport.YOUR_DOMAIN_NAME:443" oauthEnabled: "false" e2eeEnabled: "false" webTransportEnabled: "true" usersAllowedToStream: "" serverElectionPeriodMs: 2000 - audioBitrateKbps: 65 - videoBitrateKbps: 1000 - screenBitrateKbps: 1000 + audioBitrateKbps: 16 + videoBitrateKbps: 160 + screenBitrateKbps: 160 ingress: enabled: true - redirect: true + redirect: false className: nginx annotations: cert-manager.io/issuer: letsencrypt-prod nginx.ingress.kubernetes.io/ssl-redirect: "true" kubernetes.io/tls-acme: "true" hosts: - - host: app.videocall.rs + - host: app.YOUR_DOMAIN_NAME paths: - path: / pathType: Prefix @@ -63,11 +62,7 @@ ingress: name: rustlemania-ui port: number: 80 - # setup redirect from rustlemania.com to app.videocall.rs - # NOTE: rustlemania.com is now handled by a separate redirect Ingress defined in templates/redirect-ingress.yaml tls: - secretName: rustlemania-ui-tls hosts: - - app.videocall.rs - - transport.rustlemania.com - # rustlemania.com cert is still referenced by redirect Ingress + - app.YOUR_DOMAIN_NAME \ No newline at end of file diff --git a/helm/rustlemania-websocket/templates/deployment.yaml b/helm/rustlemania-websocket/templates/deployment.yaml index c4b7fba9f..0e5740859 100644 --- a/helm/rustlemania-websocket/templates/deployment.yaml +++ b/helm/rustlemania-websocket/templates/deployment.yaml @@ -34,6 +34,25 @@ spec: imagePullPolicy: {{ .Values.image.pullPolicy }} env: {{- toYaml .Values.env | nindent 12 }} + {{- if (lookup "v1" "Secret" .Release.Namespace "postgres-credentials") }} + - name: PG_PASSWORD + valueFrom: + secretKeyRef: + name: postgres-credentials + key: password + {{- end }} + {{- if (lookup "v1" "Secret" .Release.Namespace "google-oauth-credentials") }} + - name: OAUTH_CLIENT_ID + valueFrom: + secretKeyRef: + name: google-oauth-credentials + key: client-id + - name: OAUTH_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: google-oauth-credentials + key: client-secret + {{- end }} ports: - name: ws-api containerPort: {{ .Values.service.port }} diff --git a/helm/rustlemania-websocket/templates/ingress.yaml b/helm/rustlemania-websocket/templates/ingress.yaml index dbe4a1e64..940acf08d 100644 --- a/helm/rustlemania-websocket/templates/ingress.yaml +++ b/helm/rustlemania-websocket/templates/ingress.yaml @@ -48,11 +48,11 @@ spec: backend: {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} service: - name: {{ .service.name }} + name: {{ $fullName }} port: number: {{ .service.port.number }} {{- else }} - serviceName: {{ .service.name }} + serviceName: {{ $fullName }} servicePort: {{ .service.port.number }} {{- end }} {{- end }} diff --git a/helm/rustlemania-websocket/values.yaml b/helm/rustlemania-websocket/values.yaml index d16040107..bd46e2a15 100644 --- a/helm/rustlemania-websocket/values.yaml +++ b/helm/rustlemania-websocket/values.yaml @@ -2,36 +2,59 @@ # This is a YAML-formatted file. # Declare variables to be passed into your templates. nameOverride: "" -fullnameOverride: "" +fullnameOverride: "rustlemania-websocket" replicaCount: 1 image: repository: securityunion/rustlemania-api pullPolicy: Always - tag: high-availability-cf63fcce + tag: latest env: - name: RUST_LOG - value: info + value: warn - name: ACTIX_PORT value: "8080" - - name: UI_ENDPOINT - value: https://rustlemania.com - name: NATS_URL value: nats:4222 - name: DATABASE_ENABLED value: "false" - name: DATABASE_URL - value: abc + value: "postgres://postgres:$(PG_PASSWORD)@postgres-postgresql:5432/actix-api-db?sslmode=disable" - name: TOKIO_WORKER_THREADS value: "1" # Default for WebSocket services - adjust per region as needed + - name: REGION + value: "us-east" + - name: HOSTNAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: SERVER_ID + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: SERVICE_TYPE + value: websocket + - name: SERVER_STATS_INTERVAL_SECS + value: "5" + - name: OAUTH_AUTH_URL + value: "https://accounts.google.com/o/oauth2/v2/auth" + - name: OAUTH_TOKEN_URL + value: "https://oauth2.googleapis.com/token" + - name: OAUTH_REDIRECT_URL + value: "https://api.YOUR_DOMAIN_NAME/login/callback" + - name: UI_ENDPOINT + value: "https://app.YOUR_DOMAIN_NAME" + - name: COOKIE_DOMAIN + value: ".YOUR_DOMAIN_NAME" + resources: limits: - cpu: "50m" - memory: "10Mi" + cpu: "500m" + memory: "384Mi" requests: - cpu: "20m" - memory: "10Mi" + cpu: "200m" + memory: "192Mi" podAnnotations: {} podSecurityContext: {} securityContext: {} @@ -56,15 +79,24 @@ ingress: nginx.ingress.kubernetes.io/ssl-redirect: "true" kubernetes.io/tls-acme: "true" hosts: - - host: api.rustlemania.com + - host: websocket.YOUR_DOMAIN_NAME + paths: + - path: / + pathType: Prefix + service: + port: + number: 8080 + - host: api.YOUR_DOMAIN_NAME paths: - path: / pathType: Prefix service: - name: rustlemania-websocket port: number: 8080 tls: - - secretName: rustlemania-websocket-tls + - secretName: websocket-tls + hosts: + - websocket.YOUR_DOMAIN_NAME + - secretName: api-tls hosts: - - api.rustlemania.com + - api.YOUR_DOMAIN_NAME \ No newline at end of file diff --git a/helm/rustlemania-webtransport/templates/certificate.yaml b/helm/rustlemania-webtransport/templates/certificate.yaml new file mode 100644 index 000000000..cdca324a9 --- /dev/null +++ b/helm/rustlemania-webtransport/templates/certificate.yaml @@ -0,0 +1,20 @@ +# This template creates a TLS certificate for the WebTransport service. +# The certificate is issued by the namespace-scoped Issuer and stored in a secret +# that will be mounted by the WebTransport pod. +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: {{ include "rustlemania.fullname" . }}-tls + labels: + {{- include "rustlemania.labels" . | nindent 4 }} +spec: + dnsNames: + - {{ .Values.certificateDomain }} + issuerRef: + group: cert-manager.io + kind: Issuer + name: {{ .Values.certificate.issuerName | default "letsencrypt-prod" }} + secretName: {{ .Values.tlsSecret | default (printf "%s-tls" (include "rustlemania.fullname" .)) }} + usages: + - digital signature + - key encipherment diff --git a/helm/rustlemania-webtransport/values.yaml b/helm/rustlemania-webtransport/values.yaml index 48d80073e..edb7ff2d1 100644 --- a/helm/rustlemania-webtransport/values.yaml +++ b/helm/rustlemania-webtransport/values.yaml @@ -2,19 +2,22 @@ # This is a YAML-formatted file. # Declare variables to be passed into your templates. nameOverride: "" -fullnameOverride: "" +fullnameOverride: "rustlemania-webtransport" replicaCount: 1 image: repository: securityunion/rustlemania-api pullPolicy: Always - tag: high-availability-cf63fcce + tag: latest command: ['webtransport_server'] args: [] -tlsSecret: rustlemania-ui-tls +tlsSecret: webtransport-tls +certificateDomain: "webtransport.YOUR_DOMAIN_NAME" +certificate: + issuerName: "letsencrypt-prod" env: - name: RUST_LOG - value: debug,quinn=warn + value: warn,quinn=warn,web-transport-quinn=warn,async_nats=warn - name: NATS_URL value: nats:4222 - name: LISTEN_URL @@ -29,13 +32,27 @@ env: value: "1" # Default for WebTransport services - adjust per region as needed - name: TOKIO_BLOCKING_THREADS value: "2" # Small pool for blocking crypto operations + - name: REGION + value: "us-east" + - name: HOSTNAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: SERVER_ID + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: SERVICE_TYPE + value: webtransport + - name: SERVER_STATS_INTERVAL_SECS + value: "5" resources: limits: - cpu: "300m" - memory: "300Mi" + cpu: "500m" + memory: "768Mi" requests: - cpu: "300m" - memory: "300Mi" + cpu: "500m" + memory: "384Mi" podAnnotations: {} podSecurityContext: {} securityContext: {} @@ -54,12 +71,4 @@ tolerations: [] affinity: {} # Used to configure cloud provider specific LB service type loadBalancerAnnotations: - external-dns.alpha.kubernetes.io/hostname: "transport.rustlemania.com" - service.beta.kubernetes.io/do-loadbalancer-healthcheck-protocol: "http" - service.beta.kubernetes.io/do-loadbalancer-healthcheck-check-interval-seconds: "3" - service.beta.kubernetes.io/do-loadbalancer-healthcheck-response-timeout-seconds: "4" - service.beta.kubernetes.io/do-loadbalancer-healthcheck-unhealthy-threshold: "3" - service.beta.kubernetes.io/do-loadbalancer-healthcheck-healthy-threshold: "5" - service.beta.kubernetes.io/do-loadbalancer-healthcheck-port: "444" - service.beta.kubernetes.io/do-loadbalancer-size-unit: "1" - service.beta.kubernetes.io/do-loadbalancer-healthcheck-path: "/healthz" + external-dns.alpha.kubernetes.io/hostname: "webtransport.YOUR_DOMAIN_NAME" \ No newline at end of file From 658412fafb71e889e9cc8659eba98bea1b804a8c Mon Sep 17 00:00:00 2001 From: Dario Lencina Date: Sat, 29 Nov 2025 22:23:26 -0500 Subject: [PATCH 2/3] Cleanup: reorganize helm charts and remove secrets --- helm-videocall-deployment/.gitignore | 1 + helm-videocall-deployment/README.md | 38 + .../apps}/engineering-vlog/Chart.yaml | 0 .../engineering-vlog/templates/_helpers.tpl | 0 .../templates/deployment.yaml | 0 .../engineering-vlog/templates/ingress.yaml | 0 .../engineering-vlog/templates/service.yaml | 0 .../apps}/engineering-vlog/values.yaml | 0 .../cloudflare-issuer.yaml | 0 .../cert-manager-issuer/digital-ocean.yaml | 0 .../cert-manager-issuer/route53-issuer.yaml | 0 .../infrastructure}/cert-manager/Chart.lock | 0 .../infrastructure}/cert-manager/Chart.yaml | 0 .../charts/cert-manager-v1.12.2.tgz | Bin 0 -> 68114 bytes .../infrastructure}/cert-manager/values.yaml | 0 .../digital-ocean-service-account/README.md | 0 .../cluster-role-binding.yaml | 0 .../service-account.yaml | 0 .../infrastructure}/external-dns/README.md | 0 .../external-dns/digital-ocean.yaml | 0 .../infrastructure}/external-dns/install.sh | 0 .../infrastructure}/external-dns/route53.yaml | 0 .../infrastructure}/grafana/Chart.lock | 0 .../infrastructure}/grafana/Chart.yaml | 0 .../infrastructure}/grafana/certificate.yaml | 0 .../server-connections-analytics.json | 0 ...connections-analytics.json:Zone.Identifier | Bin .../grafana/dashboards/videocall-health.json | 0 .../videocall-health.json:Zone.Identifier | Bin .../infrastructure}/grafana/deploy.sh | 0 .../grafana/external-secret.yaml | 0 .../infrastructure}/grafana/values.yaml | 0 .../infrastructure}/ingress-nginx/Chart.lock | 0 .../infrastructure}/ingress-nginx/Chart.yaml | 0 .../charts/ingress-nginx-4.7.0.tgz | Bin 0 -> 45516 bytes .../infrastructure}/nats/Chart.lock | 0 .../infrastructure}/nats/Chart.yaml | 0 .../infrastructure}/nats/values.yaml | 0 .../infrastructure}/postgres/Chart.lock | 0 .../infrastructure}/postgres/Chart.yaml | 0 .../infrastructure}/postgres/README.md | 0 .../infrastructure}/prometheus/Chart.lock | 0 .../infrastructure}/prometheus/Chart.yaml | 0 .../infrastructure}/prometheus/values.yaml | 0 .../singapore/ingress-nginx/Chart.lock | 0 .../singapore/ingress-nginx/Chart.yaml | 0 .../charts/ingress-nginx-4.7.0.tgz | Bin 0 -> 45516 bytes .../singapore/ingress-nginx/values.yaml | 0 .../singapore/nats/Chart.lock | 0 .../singapore/nats/Chart.yaml | 0 .../singapore/nats/charts/nats-0.19.15.tgz | Bin 0 -> 24440 bytes .../singapore/nats/values.yaml | 0 .../singapore/websocket/Chart.lock | 0 .../singapore/websocket/Chart.yaml | 0 .../singapore/websocket/certificate.yaml | 0 .../charts/rustlemania-websocket-0.1.0.tgz | Bin 0 -> 3395 bytes .../singapore/websocket/values.yaml | 0 .../singapore/webtransport/Chart.lock | 0 .../singapore/webtransport/Chart.yaml | 0 .../singapore/webtransport/certificate.yaml | 0 .../charts/rustlemania-webtransport-0.1.0.tgz | Bin 0 -> 2687 bytes .../singapore/webtransport/values.yaml | 0 .../us-east/engineering-vlog/Chart.lock | 0 .../us-east/engineering-vlog/Chart.yaml | 0 .../us-east/engineering-vlog/certificate.yaml | 0 .../charts/engineering-vlog-0.1.0.tgz | Bin 0 -> 2035 bytes .../us-east/engineering-vlog/values.yaml | 0 .../us-east}/grafana/Chart.lock | 0 .../us-east}/grafana/Chart.yaml | 0 .../us-east/grafana/certificate.yaml | 0 .../us-east/grafana/charts/grafana-7.0.0.tgz | Bin 0 -> 40215 bytes .../us-east/grafana/deploy.sh | 0 .../us-east}/grafana/external-secret.yaml | 0 .../us-east/grafana/secret.yaml | 9 + .../us-east/grafana/values.yaml | 0 .../us-east/ingress-nginx/Chart.lock | 0 .../us-east/ingress-nginx/Chart.yaml | 0 .../charts/ingress-nginx-4.7.0.tgz | Bin 0 -> 45516 bytes .../us-east/ingress-nginx/values.yaml | 0 .../us-east/matomo/Chart.lock | 0 .../us-east/matomo/Chart.yaml | 0 .../us-east/matomo/certificate.yaml | 0 .../us-east/matomo/charts/matomo-10.0.25.tgz | Bin 0 -> 131994 bytes .../us-east/matomo/values.yaml | 0 .../us-east/metrics-api/Chart.lock | 0 .../us-east/metrics-api/Chart.yaml | 0 .../us-east/metrics-api/values.yaml | 0 .../us-east}/nats/Chart.lock | 0 .../us-east}/nats/Chart.yaml | 0 .../us-east/nats/charts/nats-0.19.15.tgz | Bin 0 -> 24440 bytes .../us-east/nats/values.yaml | 0 .../us-east}/postgres/Chart.lock | 0 .../us-east/postgres/Chart.yaml | 0 .../us-east}/postgres/README.md | 0 .../postgres/charts/postgresql-18.1.3.tgz | Bin 0 -> 88905 bytes .../us-east/postgres/values.yaml | 0 .../us-east}/prometheus/Chart.lock | 0 .../us-east}/prometheus/Chart.yaml | 0 .../prometheus/charts/prometheus-25.0.0.tgz | Bin 0 -> 71764 bytes .../us-east/prometheus/values.yaml | 0 .../us-east/rustlemania-ui-staging/Chart.lock | 0 .../us-east/rustlemania-ui-staging/Chart.yaml | 0 .../rustlemania-ui-staging/certificate.yaml | 0 .../charts/rustlemania-ui-0.1.0.tgz | Bin 0 -> 4170 bytes .../rustlemania-ui-staging/values.yaml | 0 .../us-east/rustlemania-ui/Chart.lock | 0 .../us-east/rustlemania-ui/Chart.yaml | 0 .../us-east/rustlemania-ui/certificate.yaml | 0 .../charts/rustlemania-ui-0.1.0.tgz | Bin 0 -> 4151 bytes .../us-east/rustlemania-ui/values.yaml | 0 .../us-east/videocall-website/Chart.lock | 0 .../us-east/videocall-website/Chart.yaml | 0 .../videocall-website/certificate.yaml | 0 .../charts/videocall-website-0.1.0.tgz | Bin 0 -> 3120 bytes .../us-east/videocall-website/values.yaml | 0 .../us-east/websocket/Chart.lock | 0 .../us-east/websocket/Chart.yaml | 0 .../us-east/websocket/certificate.yaml | 0 .../charts/rustlemania-websocket-0.1.0.tgz | Bin 0 -> 3397 bytes .../us-east/websocket/values.yaml | 0 .../us-east/webtransport/Chart.lock | 0 .../us-east/webtransport/Chart.yaml | 0 .../us-east/webtransport/certificate.yaml | 0 .../charts/rustlemania-webtransport-0.1.0.tgz | Bin 0 -> 2689 bytes .../us-east/webtransport/values.yaml | 0 helm/K3S_DEPLOYMENT_GUIDE.md | 244 +++-- helm/README.md | 72 +- helm/metrics-api/Chart.yaml | 17 - helm/metrics-api/templates/_helpers.tpl | 62 -- helm/metrics-api/templates/deployment.yaml | 55 - .../templates/server-stats-deployment.yaml | 62 -- .../templates/server-stats-service.yaml | 17 - helm/metrics-api/templates/service.yaml | 15 - helm/metrics-api/values.yaml | 132 --- helm/rustlemania-ui/Chart.yaml | 5 - helm/rustlemania-ui/templates/NOTES.txt | 22 - helm/rustlemania-ui/templates/_helpers.tpl | 62 -- .../templates/configmap-configjs.yaml | 11 - helm/rustlemania-ui/templates/deployment.yaml | 64 -- helm/rustlemania-ui/templates/hpa.yaml | 32 - helm/rustlemania-ui/templates/ingress.yaml | 60 -- .../templates/redirect-ingress.yaml | 48 - helm/rustlemania-ui/templates/service.yaml | 15 - helm/rustlemania-ui/values.yaml | 68 -- helm/rustlemania-websocket/.helmignore | 23 - helm/rustlemania-websocket/Chart.yaml | 5 - .../rustlemania-websocket/templates/NOTES.txt | 22 - .../templates/_helpers.tpl | 62 -- .../templates/deployment.yaml | 73 -- helm/rustlemania-websocket/templates/hpa.yaml | 32 - .../templates/ingress.yaml | 60 -- .../templates/service.yaml | 15 - helm/rustlemania-websocket/values.yaml | 102 -- helm/rustlemania-webtransport/.helmignore | 23 - helm/rustlemania-webtransport/Chart.yaml | 5 - .../templates/_helpers.tpl | 62 -- .../templates/certificate.yaml | 20 - .../templates/deployment.yaml | 68 -- .../templates/hpa.yaml | 32 - .../templates/loadbalancer.yaml | 25 - helm/rustlemania-webtransport/values.yaml | 74 -- helm/videocall-website/.helmignore | 23 - helm/videocall-website/Chart.yaml | 5 - helm/videocall-website/templates/NOTES.txt | 22 - helm/videocall-website/templates/_helpers.tpl | 62 -- .../templates/deployment.yaml | 55 - helm/videocall-website/templates/ingress.yaml | 60 -- helm/videocall-website/templates/service.yaml | 15 - helm/videocall-website/values.yaml | 71 -- .../{rustlemania-ui => videocall}/.helmignore | 1 + helm/videocall/CHART_SUMMARY.md | 388 +++++++ helm/videocall/Chart.yaml | 18 + helm/videocall/METRICS_COMPONENTS.md | 262 +++++ helm/videocall/MIGRATION.md | 305 ++++++ helm/videocall/QUICKSTART.md | 340 ++++++ helm/videocall/README.md | 128 +++ helm/videocall/templates/NOTES.txt | 101 ++ helm/videocall/templates/_helpers.tpl | 108 ++ .../templates/metrics-client-deployment.yaml | 57 ++ .../templates/metrics-client-service.yaml | 18 + .../templates/metrics-server-deployment.yaml | 57 ++ .../templates/metrics-server-service.yaml | 18 + helm/videocall/templates/ui-configmap.yaml | 12 + helm/videocall/templates/ui-deployment.yaml | 65 ++ helm/videocall/templates/ui-hpa.yaml | 33 + helm/videocall/templates/ui-ingress.yaml | 42 + helm/videocall/templates/ui-service.yaml | 18 + .../templates/website-deployment.yaml | 57 ++ helm/videocall/templates/website-hpa.yaml | 33 + helm/videocall/templates/website-ingress.yaml | 42 + helm/videocall/templates/website-service.yaml | 18 + .../templates/websocket-deployment.yaml | 76 ++ helm/videocall/templates/websocket-hpa.yaml | 33 + .../templates/websocket-ingress.yaml | 42 + .../templates/websocket-service.yaml | 18 + .../templates/webtransport-certificate.yaml | 16 + .../templates/webtransport-deployment.yaml | 71 ++ .../videocall/templates/webtransport-hpa.yaml | 33 + .../templates/webtransport-service.yaml | 28 + helm/videocall/values.yaml | 966 ++++++++++++++++++ helm/website/.helmignore | 0 helm/website/Chart.yaml | 5 - helm/website/templates/_helpers.yaml | 62 -- helm/website/templates/deployment.yaml | 69 -- helm/website/templates/ingress.yaml | 60 -- helm/website/templates/service.yaml | 15 - helm/website/values.yaml | 72 -- 207 files changed, 3643 insertions(+), 2171 deletions(-) create mode 100644 helm-videocall-deployment/.gitignore create mode 100644 helm-videocall-deployment/README.md rename {helm => helm-videocall-deployment/apps}/engineering-vlog/Chart.yaml (100%) rename {helm => helm-videocall-deployment/apps}/engineering-vlog/templates/_helpers.tpl (100%) rename {helm => helm-videocall-deployment/apps}/engineering-vlog/templates/deployment.yaml (100%) rename {helm => helm-videocall-deployment/apps}/engineering-vlog/templates/ingress.yaml (100%) rename {helm => helm-videocall-deployment/apps}/engineering-vlog/templates/service.yaml (100%) rename {helm => helm-videocall-deployment/apps}/engineering-vlog/values.yaml (100%) rename {helm => helm-videocall-deployment/infrastructure}/cert-manager-issuer/cloudflare-issuer.yaml (100%) rename {helm => helm-videocall-deployment/infrastructure}/cert-manager-issuer/digital-ocean.yaml (100%) rename {helm => helm-videocall-deployment/infrastructure}/cert-manager-issuer/route53-issuer.yaml (100%) rename {helm => helm-videocall-deployment/infrastructure}/cert-manager/Chart.lock (100%) rename {helm => helm-videocall-deployment/infrastructure}/cert-manager/Chart.yaml (100%) create mode 100644 helm-videocall-deployment/infrastructure/cert-manager/charts/cert-manager-v1.12.2.tgz rename {helm => helm-videocall-deployment/infrastructure}/cert-manager/values.yaml (100%) rename {helm => helm-videocall-deployment/infrastructure}/digital-ocean-service-account/README.md (100%) rename {helm => helm-videocall-deployment/infrastructure}/digital-ocean-service-account/cluster-role-binding.yaml (100%) rename {helm => helm-videocall-deployment/infrastructure}/digital-ocean-service-account/service-account.yaml (100%) rename {helm => helm-videocall-deployment/infrastructure}/external-dns/README.md (100%) rename {helm => helm-videocall-deployment/infrastructure}/external-dns/digital-ocean.yaml (100%) rename {helm => helm-videocall-deployment/infrastructure}/external-dns/install.sh (100%) rename {helm => helm-videocall-deployment/infrastructure}/external-dns/route53.yaml (100%) rename {helm/global/us-east => helm-videocall-deployment/infrastructure}/grafana/Chart.lock (100%) rename {helm/global/us-east => helm-videocall-deployment/infrastructure}/grafana/Chart.yaml (100%) rename {helm => helm-videocall-deployment/infrastructure}/grafana/certificate.yaml (100%) rename {helm => helm-videocall-deployment/infrastructure}/grafana/dashboards/server-connections-analytics.json (100%) rename {helm => helm-videocall-deployment/infrastructure}/grafana/dashboards/server-connections-analytics.json:Zone.Identifier (100%) rename {helm => helm-videocall-deployment/infrastructure}/grafana/dashboards/videocall-health.json (100%) rename {helm => helm-videocall-deployment/infrastructure}/grafana/dashboards/videocall-health.json:Zone.Identifier (100%) rename {helm => helm-videocall-deployment/infrastructure}/grafana/deploy.sh (100%) rename {helm/global/us-east => helm-videocall-deployment/infrastructure}/grafana/external-secret.yaml (100%) rename {helm => helm-videocall-deployment/infrastructure}/grafana/values.yaml (100%) rename {helm => helm-videocall-deployment/infrastructure}/ingress-nginx/Chart.lock (100%) rename {helm => helm-videocall-deployment/infrastructure}/ingress-nginx/Chart.yaml (100%) create mode 100644 helm-videocall-deployment/infrastructure/ingress-nginx/charts/ingress-nginx-4.7.0.tgz rename {helm/global/us-east => helm-videocall-deployment/infrastructure}/nats/Chart.lock (100%) rename {helm/global/us-east => helm-videocall-deployment/infrastructure}/nats/Chart.yaml (100%) rename {helm => helm-videocall-deployment/infrastructure}/nats/values.yaml (100%) rename {helm/global/us-east => helm-videocall-deployment/infrastructure}/postgres/Chart.lock (100%) rename {helm => helm-videocall-deployment/infrastructure}/postgres/Chart.yaml (100%) rename {helm/global/us-east => helm-videocall-deployment/infrastructure}/postgres/README.md (100%) rename {helm/global/us-east => helm-videocall-deployment/infrastructure}/prometheus/Chart.lock (100%) rename {helm/global/us-east => helm-videocall-deployment/infrastructure}/prometheus/Chart.yaml (100%) rename {helm => helm-videocall-deployment/infrastructure}/prometheus/values.yaml (100%) rename {helm/global => helm-videocall-deployment}/singapore/ingress-nginx/Chart.lock (100%) rename {helm/global => helm-videocall-deployment}/singapore/ingress-nginx/Chart.yaml (100%) create mode 100644 helm-videocall-deployment/singapore/ingress-nginx/charts/ingress-nginx-4.7.0.tgz rename {helm/global => helm-videocall-deployment}/singapore/ingress-nginx/values.yaml (100%) rename {helm/global => helm-videocall-deployment}/singapore/nats/Chart.lock (100%) rename {helm/global => helm-videocall-deployment}/singapore/nats/Chart.yaml (100%) create mode 100644 helm-videocall-deployment/singapore/nats/charts/nats-0.19.15.tgz rename {helm/global => helm-videocall-deployment}/singapore/nats/values.yaml (100%) rename {helm/global => helm-videocall-deployment}/singapore/websocket/Chart.lock (100%) rename {helm/global => helm-videocall-deployment}/singapore/websocket/Chart.yaml (100%) rename {helm/global => helm-videocall-deployment}/singapore/websocket/certificate.yaml (100%) create mode 100644 helm-videocall-deployment/singapore/websocket/charts/rustlemania-websocket-0.1.0.tgz rename {helm/global => helm-videocall-deployment}/singapore/websocket/values.yaml (100%) rename {helm/global => helm-videocall-deployment}/singapore/webtransport/Chart.lock (100%) rename {helm/global => helm-videocall-deployment}/singapore/webtransport/Chart.yaml (100%) rename {helm/global => helm-videocall-deployment}/singapore/webtransport/certificate.yaml (100%) create mode 100644 helm-videocall-deployment/singapore/webtransport/charts/rustlemania-webtransport-0.1.0.tgz rename {helm/global => helm-videocall-deployment}/singapore/webtransport/values.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/engineering-vlog/Chart.lock (100%) rename {helm/global => helm-videocall-deployment}/us-east/engineering-vlog/Chart.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/engineering-vlog/certificate.yaml (100%) create mode 100644 helm-videocall-deployment/us-east/engineering-vlog/charts/engineering-vlog-0.1.0.tgz rename {helm/global => helm-videocall-deployment}/us-east/engineering-vlog/values.yaml (100%) rename {helm => helm-videocall-deployment/us-east}/grafana/Chart.lock (100%) rename {helm => helm-videocall-deployment/us-east}/grafana/Chart.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/grafana/certificate.yaml (100%) create mode 100644 helm-videocall-deployment/us-east/grafana/charts/grafana-7.0.0.tgz rename {helm/global => helm-videocall-deployment}/us-east/grafana/deploy.sh (100%) rename {helm => helm-videocall-deployment/us-east}/grafana/external-secret.yaml (100%) create mode 100644 helm-videocall-deployment/us-east/grafana/secret.yaml rename {helm/global => helm-videocall-deployment}/us-east/grafana/values.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/ingress-nginx/Chart.lock (100%) rename {helm/global => helm-videocall-deployment}/us-east/ingress-nginx/Chart.yaml (100%) create mode 100644 helm-videocall-deployment/us-east/ingress-nginx/charts/ingress-nginx-4.7.0.tgz rename {helm/global => helm-videocall-deployment}/us-east/ingress-nginx/values.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/matomo/Chart.lock (100%) rename {helm/global => helm-videocall-deployment}/us-east/matomo/Chart.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/matomo/certificate.yaml (100%) create mode 100644 helm-videocall-deployment/us-east/matomo/charts/matomo-10.0.25.tgz rename {helm/global => helm-videocall-deployment}/us-east/matomo/values.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/metrics-api/Chart.lock (100%) rename {helm/global => helm-videocall-deployment}/us-east/metrics-api/Chart.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/metrics-api/values.yaml (100%) rename {helm => helm-videocall-deployment/us-east}/nats/Chart.lock (100%) rename {helm => helm-videocall-deployment/us-east}/nats/Chart.yaml (100%) create mode 100644 helm-videocall-deployment/us-east/nats/charts/nats-0.19.15.tgz rename {helm/global => helm-videocall-deployment}/us-east/nats/values.yaml (100%) rename {helm => helm-videocall-deployment/us-east}/postgres/Chart.lock (100%) rename {helm/global => helm-videocall-deployment}/us-east/postgres/Chart.yaml (100%) rename {helm => helm-videocall-deployment/us-east}/postgres/README.md (100%) create mode 100644 helm-videocall-deployment/us-east/postgres/charts/postgresql-18.1.3.tgz rename {helm/global => helm-videocall-deployment}/us-east/postgres/values.yaml (100%) rename {helm => helm-videocall-deployment/us-east}/prometheus/Chart.lock (100%) rename {helm => helm-videocall-deployment/us-east}/prometheus/Chart.yaml (100%) create mode 100644 helm-videocall-deployment/us-east/prometheus/charts/prometheus-25.0.0.tgz rename {helm/global => helm-videocall-deployment}/us-east/prometheus/values.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/rustlemania-ui-staging/Chart.lock (100%) rename {helm/global => helm-videocall-deployment}/us-east/rustlemania-ui-staging/Chart.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/rustlemania-ui-staging/certificate.yaml (100%) create mode 100644 helm-videocall-deployment/us-east/rustlemania-ui-staging/charts/rustlemania-ui-0.1.0.tgz rename {helm/global => helm-videocall-deployment}/us-east/rustlemania-ui-staging/values.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/rustlemania-ui/Chart.lock (100%) rename {helm/global => helm-videocall-deployment}/us-east/rustlemania-ui/Chart.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/rustlemania-ui/certificate.yaml (100%) create mode 100644 helm-videocall-deployment/us-east/rustlemania-ui/charts/rustlemania-ui-0.1.0.tgz rename {helm/global => helm-videocall-deployment}/us-east/rustlemania-ui/values.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/videocall-website/Chart.lock (100%) rename {helm/global => helm-videocall-deployment}/us-east/videocall-website/Chart.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/videocall-website/certificate.yaml (100%) create mode 100644 helm-videocall-deployment/us-east/videocall-website/charts/videocall-website-0.1.0.tgz rename {helm/global => helm-videocall-deployment}/us-east/videocall-website/values.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/websocket/Chart.lock (100%) rename {helm/global => helm-videocall-deployment}/us-east/websocket/Chart.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/websocket/certificate.yaml (100%) create mode 100644 helm-videocall-deployment/us-east/websocket/charts/rustlemania-websocket-0.1.0.tgz rename {helm/global => helm-videocall-deployment}/us-east/websocket/values.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/webtransport/Chart.lock (100%) rename {helm/global => helm-videocall-deployment}/us-east/webtransport/Chart.yaml (100%) rename {helm/global => helm-videocall-deployment}/us-east/webtransport/certificate.yaml (100%) create mode 100644 helm-videocall-deployment/us-east/webtransport/charts/rustlemania-webtransport-0.1.0.tgz rename {helm/global => helm-videocall-deployment}/us-east/webtransport/values.yaml (100%) delete mode 100644 helm/metrics-api/Chart.yaml delete mode 100644 helm/metrics-api/templates/_helpers.tpl delete mode 100644 helm/metrics-api/templates/deployment.yaml delete mode 100644 helm/metrics-api/templates/server-stats-deployment.yaml delete mode 100644 helm/metrics-api/templates/server-stats-service.yaml delete mode 100644 helm/metrics-api/templates/service.yaml delete mode 100644 helm/metrics-api/values.yaml delete mode 100644 helm/rustlemania-ui/Chart.yaml delete mode 100644 helm/rustlemania-ui/templates/NOTES.txt delete mode 100644 helm/rustlemania-ui/templates/_helpers.tpl delete mode 100644 helm/rustlemania-ui/templates/configmap-configjs.yaml delete mode 100644 helm/rustlemania-ui/templates/deployment.yaml delete mode 100644 helm/rustlemania-ui/templates/hpa.yaml delete mode 100644 helm/rustlemania-ui/templates/ingress.yaml delete mode 100644 helm/rustlemania-ui/templates/redirect-ingress.yaml delete mode 100644 helm/rustlemania-ui/templates/service.yaml delete mode 100644 helm/rustlemania-ui/values.yaml delete mode 100644 helm/rustlemania-websocket/.helmignore delete mode 100644 helm/rustlemania-websocket/Chart.yaml delete mode 100644 helm/rustlemania-websocket/templates/NOTES.txt delete mode 100644 helm/rustlemania-websocket/templates/_helpers.tpl delete mode 100644 helm/rustlemania-websocket/templates/deployment.yaml delete mode 100644 helm/rustlemania-websocket/templates/hpa.yaml delete mode 100644 helm/rustlemania-websocket/templates/ingress.yaml delete mode 100644 helm/rustlemania-websocket/templates/service.yaml delete mode 100644 helm/rustlemania-websocket/values.yaml delete mode 100644 helm/rustlemania-webtransport/.helmignore delete mode 100644 helm/rustlemania-webtransport/Chart.yaml delete mode 100644 helm/rustlemania-webtransport/templates/_helpers.tpl delete mode 100644 helm/rustlemania-webtransport/templates/certificate.yaml delete mode 100644 helm/rustlemania-webtransport/templates/deployment.yaml delete mode 100644 helm/rustlemania-webtransport/templates/hpa.yaml delete mode 100644 helm/rustlemania-webtransport/templates/loadbalancer.yaml delete mode 100644 helm/rustlemania-webtransport/values.yaml delete mode 100644 helm/videocall-website/.helmignore delete mode 100644 helm/videocall-website/Chart.yaml delete mode 100644 helm/videocall-website/templates/NOTES.txt delete mode 100644 helm/videocall-website/templates/_helpers.tpl delete mode 100644 helm/videocall-website/templates/deployment.yaml delete mode 100644 helm/videocall-website/templates/ingress.yaml delete mode 100644 helm/videocall-website/templates/service.yaml delete mode 100644 helm/videocall-website/values.yaml rename helm/{rustlemania-ui => videocall}/.helmignore (99%) create mode 100644 helm/videocall/CHART_SUMMARY.md create mode 100644 helm/videocall/Chart.yaml create mode 100644 helm/videocall/METRICS_COMPONENTS.md create mode 100644 helm/videocall/MIGRATION.md create mode 100644 helm/videocall/QUICKSTART.md create mode 100644 helm/videocall/README.md create mode 100644 helm/videocall/templates/NOTES.txt create mode 100644 helm/videocall/templates/_helpers.tpl create mode 100644 helm/videocall/templates/metrics-client-deployment.yaml create mode 100644 helm/videocall/templates/metrics-client-service.yaml create mode 100644 helm/videocall/templates/metrics-server-deployment.yaml create mode 100644 helm/videocall/templates/metrics-server-service.yaml create mode 100644 helm/videocall/templates/ui-configmap.yaml create mode 100644 helm/videocall/templates/ui-deployment.yaml create mode 100644 helm/videocall/templates/ui-hpa.yaml create mode 100644 helm/videocall/templates/ui-ingress.yaml create mode 100644 helm/videocall/templates/ui-service.yaml create mode 100644 helm/videocall/templates/website-deployment.yaml create mode 100644 helm/videocall/templates/website-hpa.yaml create mode 100644 helm/videocall/templates/website-ingress.yaml create mode 100644 helm/videocall/templates/website-service.yaml create mode 100644 helm/videocall/templates/websocket-deployment.yaml create mode 100644 helm/videocall/templates/websocket-hpa.yaml create mode 100644 helm/videocall/templates/websocket-ingress.yaml create mode 100644 helm/videocall/templates/websocket-service.yaml create mode 100644 helm/videocall/templates/webtransport-certificate.yaml create mode 100644 helm/videocall/templates/webtransport-deployment.yaml create mode 100644 helm/videocall/templates/webtransport-hpa.yaml create mode 100644 helm/videocall/templates/webtransport-service.yaml create mode 100644 helm/videocall/values.yaml delete mode 100644 helm/website/.helmignore delete mode 100644 helm/website/Chart.yaml delete mode 100644 helm/website/templates/_helpers.yaml delete mode 100644 helm/website/templates/deployment.yaml delete mode 100644 helm/website/templates/ingress.yaml delete mode 100644 helm/website/templates/service.yaml delete mode 100644 helm/website/values.yaml diff --git a/helm-videocall-deployment/.gitignore b/helm-videocall-deployment/.gitignore new file mode 100644 index 000000000..2c096649a --- /dev/null +++ b/helm-videocall-deployment/.gitignore @@ -0,0 +1 @@ +digital-ocean-secret diff --git a/helm-videocall-deployment/README.md b/helm-videocall-deployment/README.md new file mode 100644 index 000000000..7f3d76163 --- /dev/null +++ b/helm-videocall-deployment/README.md @@ -0,0 +1,38 @@ +# Videocall Deployment Configurations + +This directory contains deployment-specific configurations and infrastructure charts for Videocall.rs. + +## Structure + +``` +helm-videocall-deployment/ +├── infrastructure/ # Infrastructure charts (NATS, Prometheus, Postgres, etc.) +├── apps/ # Other applications (engineering-vlog, website) +├── us-east/ # US East region deployment values +└── singapore/ # Singapore region deployment values +``` + +## Infrastructure Charts + +Shared infrastructure components: +- **nats/** - NATS messaging server +- **postgres/** - PostgreSQL database +- **prometheus/** - Metrics collection +- **grafana/** - Metrics visualization +- **cert-manager/** - TLS certificate management +- **ingress-nginx/** - Ingress controller +- **external-dns/** - DNS automation +- And more... + +## Region-Specific Deployments + +Each region directory contains Helm value overrides for deploying the videocall chart and infrastructure to that region. + +## Usage + +The public Videocall application chart is at `../helm/videocall/` + +This directory is for: +1. Infrastructure dependencies +2. Region-specific configuration values +3. Other applications deployed alongside Videocall diff --git a/helm/engineering-vlog/Chart.yaml b/helm-videocall-deployment/apps/engineering-vlog/Chart.yaml similarity index 100% rename from helm/engineering-vlog/Chart.yaml rename to helm-videocall-deployment/apps/engineering-vlog/Chart.yaml diff --git a/helm/engineering-vlog/templates/_helpers.tpl b/helm-videocall-deployment/apps/engineering-vlog/templates/_helpers.tpl similarity index 100% rename from helm/engineering-vlog/templates/_helpers.tpl rename to helm-videocall-deployment/apps/engineering-vlog/templates/_helpers.tpl diff --git a/helm/engineering-vlog/templates/deployment.yaml b/helm-videocall-deployment/apps/engineering-vlog/templates/deployment.yaml similarity index 100% rename from helm/engineering-vlog/templates/deployment.yaml rename to helm-videocall-deployment/apps/engineering-vlog/templates/deployment.yaml diff --git a/helm/engineering-vlog/templates/ingress.yaml b/helm-videocall-deployment/apps/engineering-vlog/templates/ingress.yaml similarity index 100% rename from helm/engineering-vlog/templates/ingress.yaml rename to helm-videocall-deployment/apps/engineering-vlog/templates/ingress.yaml diff --git a/helm/engineering-vlog/templates/service.yaml b/helm-videocall-deployment/apps/engineering-vlog/templates/service.yaml similarity index 100% rename from helm/engineering-vlog/templates/service.yaml rename to helm-videocall-deployment/apps/engineering-vlog/templates/service.yaml diff --git a/helm/engineering-vlog/values.yaml b/helm-videocall-deployment/apps/engineering-vlog/values.yaml similarity index 100% rename from helm/engineering-vlog/values.yaml rename to helm-videocall-deployment/apps/engineering-vlog/values.yaml diff --git a/helm/cert-manager-issuer/cloudflare-issuer.yaml b/helm-videocall-deployment/infrastructure/cert-manager-issuer/cloudflare-issuer.yaml similarity index 100% rename from helm/cert-manager-issuer/cloudflare-issuer.yaml rename to helm-videocall-deployment/infrastructure/cert-manager-issuer/cloudflare-issuer.yaml diff --git a/helm/cert-manager-issuer/digital-ocean.yaml b/helm-videocall-deployment/infrastructure/cert-manager-issuer/digital-ocean.yaml similarity index 100% rename from helm/cert-manager-issuer/digital-ocean.yaml rename to helm-videocall-deployment/infrastructure/cert-manager-issuer/digital-ocean.yaml diff --git a/helm/cert-manager-issuer/route53-issuer.yaml b/helm-videocall-deployment/infrastructure/cert-manager-issuer/route53-issuer.yaml similarity index 100% rename from helm/cert-manager-issuer/route53-issuer.yaml rename to helm-videocall-deployment/infrastructure/cert-manager-issuer/route53-issuer.yaml diff --git a/helm/cert-manager/Chart.lock b/helm-videocall-deployment/infrastructure/cert-manager/Chart.lock similarity index 100% rename from helm/cert-manager/Chart.lock rename to helm-videocall-deployment/infrastructure/cert-manager/Chart.lock diff --git a/helm/cert-manager/Chart.yaml b/helm-videocall-deployment/infrastructure/cert-manager/Chart.yaml similarity index 100% rename from helm/cert-manager/Chart.yaml rename to helm-videocall-deployment/infrastructure/cert-manager/Chart.yaml diff --git a/helm-videocall-deployment/infrastructure/cert-manager/charts/cert-manager-v1.12.2.tgz b/helm-videocall-deployment/infrastructure/cert-manager/charts/cert-manager-v1.12.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..13d233c26dbad7c5725fb5d5897d0be259a88382 GIT binary patch literal 68114 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

Eh79GL>5j)t+xr4H?oxsoO1 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 literal 0 HcmV?d00001 diff --git a/helm/cert-manager/values.yaml b/helm-videocall-deployment/infrastructure/cert-manager/values.yaml similarity index 100% rename from helm/cert-manager/values.yaml rename to helm-videocall-deployment/infrastructure/cert-manager/values.yaml diff --git a/helm/digital-ocean-service-account/README.md b/helm-videocall-deployment/infrastructure/digital-ocean-service-account/README.md similarity index 100% rename from helm/digital-ocean-service-account/README.md rename to helm-videocall-deployment/infrastructure/digital-ocean-service-account/README.md diff --git a/helm/digital-ocean-service-account/cluster-role-binding.yaml b/helm-videocall-deployment/infrastructure/digital-ocean-service-account/cluster-role-binding.yaml similarity index 100% rename from helm/digital-ocean-service-account/cluster-role-binding.yaml rename to helm-videocall-deployment/infrastructure/digital-ocean-service-account/cluster-role-binding.yaml diff --git a/helm/digital-ocean-service-account/service-account.yaml b/helm-videocall-deployment/infrastructure/digital-ocean-service-account/service-account.yaml similarity index 100% rename from helm/digital-ocean-service-account/service-account.yaml rename to helm-videocall-deployment/infrastructure/digital-ocean-service-account/service-account.yaml diff --git a/helm/external-dns/README.md b/helm-videocall-deployment/infrastructure/external-dns/README.md similarity index 100% rename from helm/external-dns/README.md rename to helm-videocall-deployment/infrastructure/external-dns/README.md diff --git a/helm/external-dns/digital-ocean.yaml b/helm-videocall-deployment/infrastructure/external-dns/digital-ocean.yaml similarity index 100% rename from helm/external-dns/digital-ocean.yaml rename to helm-videocall-deployment/infrastructure/external-dns/digital-ocean.yaml diff --git a/helm/external-dns/install.sh b/helm-videocall-deployment/infrastructure/external-dns/install.sh similarity index 100% rename from helm/external-dns/install.sh rename to helm-videocall-deployment/infrastructure/external-dns/install.sh diff --git a/helm/external-dns/route53.yaml b/helm-videocall-deployment/infrastructure/external-dns/route53.yaml similarity index 100% rename from helm/external-dns/route53.yaml rename to helm-videocall-deployment/infrastructure/external-dns/route53.yaml diff --git a/helm/global/us-east/grafana/Chart.lock b/helm-videocall-deployment/infrastructure/grafana/Chart.lock similarity index 100% rename from helm/global/us-east/grafana/Chart.lock rename to helm-videocall-deployment/infrastructure/grafana/Chart.lock diff --git a/helm/global/us-east/grafana/Chart.yaml b/helm-videocall-deployment/infrastructure/grafana/Chart.yaml similarity index 100% rename from helm/global/us-east/grafana/Chart.yaml rename to helm-videocall-deployment/infrastructure/grafana/Chart.yaml diff --git a/helm/grafana/certificate.yaml b/helm-videocall-deployment/infrastructure/grafana/certificate.yaml similarity index 100% rename from helm/grafana/certificate.yaml rename to helm-videocall-deployment/infrastructure/grafana/certificate.yaml diff --git a/helm/grafana/dashboards/server-connections-analytics.json b/helm-videocall-deployment/infrastructure/grafana/dashboards/server-connections-analytics.json similarity index 100% rename from helm/grafana/dashboards/server-connections-analytics.json rename to helm-videocall-deployment/infrastructure/grafana/dashboards/server-connections-analytics.json diff --git a/helm/grafana/dashboards/server-connections-analytics.json:Zone.Identifier b/helm-videocall-deployment/infrastructure/grafana/dashboards/server-connections-analytics.json:Zone.Identifier similarity index 100% rename from helm/grafana/dashboards/server-connections-analytics.json:Zone.Identifier rename to helm-videocall-deployment/infrastructure/grafana/dashboards/server-connections-analytics.json:Zone.Identifier diff --git a/helm/grafana/dashboards/videocall-health.json b/helm-videocall-deployment/infrastructure/grafana/dashboards/videocall-health.json similarity index 100% rename from helm/grafana/dashboards/videocall-health.json rename to helm-videocall-deployment/infrastructure/grafana/dashboards/videocall-health.json diff --git a/helm/grafana/dashboards/videocall-health.json:Zone.Identifier b/helm-videocall-deployment/infrastructure/grafana/dashboards/videocall-health.json:Zone.Identifier similarity index 100% rename from helm/grafana/dashboards/videocall-health.json:Zone.Identifier rename to helm-videocall-deployment/infrastructure/grafana/dashboards/videocall-health.json:Zone.Identifier diff --git a/helm/grafana/deploy.sh b/helm-videocall-deployment/infrastructure/grafana/deploy.sh similarity index 100% rename from helm/grafana/deploy.sh rename to helm-videocall-deployment/infrastructure/grafana/deploy.sh diff --git a/helm/global/us-east/grafana/external-secret.yaml b/helm-videocall-deployment/infrastructure/grafana/external-secret.yaml similarity index 100% rename from helm/global/us-east/grafana/external-secret.yaml rename to helm-videocall-deployment/infrastructure/grafana/external-secret.yaml diff --git a/helm/grafana/values.yaml b/helm-videocall-deployment/infrastructure/grafana/values.yaml similarity index 100% rename from helm/grafana/values.yaml rename to helm-videocall-deployment/infrastructure/grafana/values.yaml diff --git a/helm/ingress-nginx/Chart.lock b/helm-videocall-deployment/infrastructure/ingress-nginx/Chart.lock similarity index 100% rename from helm/ingress-nginx/Chart.lock rename to helm-videocall-deployment/infrastructure/ingress-nginx/Chart.lock diff --git a/helm/ingress-nginx/Chart.yaml b/helm-videocall-deployment/infrastructure/ingress-nginx/Chart.yaml similarity index 100% rename from helm/ingress-nginx/Chart.yaml rename to helm-videocall-deployment/infrastructure/ingress-nginx/Chart.yaml diff --git a/helm-videocall-deployment/infrastructure/ingress-nginx/charts/ingress-nginx-4.7.0.tgz b/helm-videocall-deployment/infrastructure/ingress-nginx/charts/ingress-nginx-4.7.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..5372ca87798b8097c1df2e1d03db58607ca13500 GIT binary patch literal 45516 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⩔(vv2sq6HMF{o2Uz>*>aIKp_G0m^p~Clp$Wb zvjKA4l(4bT{E~as;A^}@5t2sZK#mTUzhX)z#v$+F6dmFz@>hO{x(C*@?8zqVh#njO z#v$cNd?nsnbx^eU4dV8fg;N zVsjD(dX0)tQ;5TaBIlC;7wT!UgOeGV4Tq&-Oo{_iG8z>_(O0LJxq;Ac^TVLr7R$$= zY5**0{v}7ip7aX*jnPaY4t&usfTAEKIN}{}E?oqENf47en~(5P9=2OAOYIa9fQb^3 zQdqxw^1D44lPq&e=pCeibmdVT*(ko4$w8DZX4xUmuQqL)k*5OI_+HrsS>sYF6%)j{ zvY<1>Rg{@Shwp`) zW1xJt!IK4!&J6&0uJ9ylW_a=pL`W#46QU;6t>9tgs2W1t03C2S6`!Bwkr3jN zlC~AbMZ1S$iMl5aNn4|k+3?kFr94DHkjS%;i>vQI!f|LU%{T&+gsog1n{FBzp?y$B zC&Qxy`L|CNV(<2jj{1Y%=&YyxN-hH=R>?E%iKp4p1c6AO(d5m-NWe!(C>1pfUmEsW@W3%a~7FcrI%W2QW=ezjh zV>776=D3%g+jly;$Lb^(${&PK$Nj^t02YW->?{6F*9e^I@Si4;2V+S9QVgCGihmV5 ze<+P$1~}>-Xzw9!N~ot@&fVs6y;egLIJ%1}?CLU(ThM#WDBhXY+YE=RE-YnR_V&aXbPAk}QU0kUoJy2Iw(Wgmv| z9QNCWJEWzwt2lEOcE58EmJAF!_on!ua}S<_JT&vQpMKSDMVS&MjG*D7kCkOyx(+X4 zD2QC25Rxz;cac)jQrf48aYE5M@-4+P9KrB9v;U^;OY#Z6m7d0i8J008hrpfBQt7*K zK)CL1dL`vzx7Az6w?b);sGt)fCw)4`NZLNXV9yQ+f4Czt?->eEKCpVy|Gy;wgn3JuLzBA+U!i&)bWY zm;P-3{=;DLr1f{AnoqG9bfqhCC znewgyY6M%geBbD|sTXqUX0OBNP2gt>Xomp1R}_!+?TNm9o1Sem*L|qU({gIvGO_f( zR=!^V#_<&;ocJU(N<}W<-}*_NXG>fEs1W)Jn4 z0d~ME9kBsZ+qS53{_mTy#bSau%-PQ19rHp01J5KJ@HA-8fL0Tzak=EmVVnVfPSS9Y z*!GK1WzRGSYNsU?#vzK94335^!+GaOyEh8Z-(dbKnJBSb5f`Bd1c*Z%G5{we;o3Wk z#)Pd+lTh>pAN2;Kk#1fFh6yD=sTBE{)QJKZAYq`KVI$D*4D`}F(7U0XVTXjuSbgSj zS+uSl4KJ@GS*E1-8Z$1`_0)Y1F(Bw;j{SN5Jlr_INUhr{LT2OKz%pn6bq~hy>S*6V<;ShfpgLNZC7~qdpI#Ffe5I*R*dIag9BOJ}lyY7J?dz)rMPKtwwo{0SG8@cgb>s%Fo$5IPM^GHli1TJSs*H>nsN{&iwUBK_Nc)1r*#ZPZ%KfzM0w1j|M!3XFHhO≫|Cwn(X0LNd$1r7yOz$i%h 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⩔(vv2sq6HMF{o2Uz>*>aIKp_G0m^p~Clp$Wb zvjKA4l(4bT{E~as;A^}@5t2sZK#mTUzhX)z#v$+F6dmFz@>hO{x(C*@?8zqVh#njO z#v$cNd?nsnbx^eU4dV8fg;N zVsjD(dX0)tQ;5TaBIlC;7wT!UgOeGV4Tq&-Oo{_iG8z>_(O0LJxq;Ac^TVLr7R$$= zY5**0{v}7ip7aX*jnPaY4t&usfTAEKIN}{}E?oqENf47en~(5P9=2OAOYIa9fQb^3 zQdqxw^1D44lPq&e=pCeibmdVT*(ko4$w8DZX4xUmuQqL)k*5OI_+HrsS>sYF6%)j{ zvY<1>Rg{@Shwp`) zW1xJt!IK4!&J6&0uJ9ylW_a=pL`W#46QU;6t>9tgs2W1t03C2S6`!Bwkr3jN zlC~AbMZ1S$iMl5aNn4|k+3?kFr94DHkjS%;i>vQI!f|LU%{T&+gsog1n{FBzp?y$B zC&Qxy`L|CNV(<2jj{1Y%=&YyxN-hH=R>?E%iKp4p1c6AO(d5m-NWe!(C>1pfUmEsW@W3%a~7FcrI%W2QW=ezjh zV>776=D3%g+jly;$Lb^(${&PK$Nj^t02YW->?{6F*9e^I@Si4;2V+S9QVgCGihmV5 ze<+P$1~}>-Xzw9!N~ot@&fVs6y;egLIJ%1}?CLU(ThM#WDBhXY+YE=RE-YnR_V&aXbPAk}QU0kUoJy2Iw(Wgmv| z9QNCWJEWzwt2lEOcE58EmJAF!_on!ua}S<_JT&vQpMKSDMVS&MjG*D7kCkOyx(+X4 zD2QC25Rxz;cac)jQrf48aYE5M@-4+P9KrB9v;U^;OY#Z6m7d0i8J008hrpfBQt7*K zK)CL1dL`vzx7Az6w?b);sGt)fCw)4`NZLNXV9yQ+f4Czt?->eEKCpVy|Gy;wgn3JuLzBA+U!i&)bWY zm;P-3{=;DLr1f{AnoqG9bfqhCC znewgyY6M%geBbD|sTXqUX0OBNP2gt>Xomp1R}_!+?TNm9o1Sem*L|qU({gIvGO_f( zR=!^V#_<&;ocJU(N<}W<-}*_NXG>fEs1W)Jn4 z0d~ME9kBsZ+qS53{_mTy#bSau%-PQ19rHp01J5KJ@HA-8fL0Tzak=EmVVnVfPSS9Y z*!GK1WzRGSYNsU?#vzK94335^!+GaOyEh8Z-(dbKnJBSb5f`Bd1c*Z%G5{we;o3Wk z#)Pd+lTh>pAN2;Kk#1fFh6yD=sTBE{)QJKZAYq`KVI$D*4D`}F(7U0XVTXjuSbgSj zS+uSl4KJ@GS*E1-8Z$1`_0)Y1F(Bw;j{SN5Jlr_INUhr{LT2OKz%pn6bq~hy>S*6V<;ShfpgLNZC7~qdpI#Ffe5I*R*dIag9BOJ}lyY7J?dz)rMPKtwwo{0SG8@cgb>s%Fo$5IPM^GHli1TJSs*H>nsN{&iwUBK_Nc)1r*#ZPZ%KfzM0w1j|M!3XFHhO≫|Cwn(X0LNd$1r7yOz$i%h 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 P00960!e!L_0NeopeDc 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 Zr|~qN#?x3I{}%uN|NlJPbantp0006iwetV~ literal 0 HcmV?d00001 diff --git a/helm/global/singapore/websocket/values.yaml b/helm-videocall-deployment/singapore/websocket/values.yaml similarity index 100% rename from helm/global/singapore/websocket/values.yaml rename to helm-videocall-deployment/singapore/websocket/values.yaml diff --git a/helm/global/singapore/webtransport/Chart.lock b/helm-videocall-deployment/singapore/webtransport/Chart.lock similarity index 100% rename from helm/global/singapore/webtransport/Chart.lock rename to helm-videocall-deployment/singapore/webtransport/Chart.lock diff --git a/helm/global/singapore/webtransport/Chart.yaml b/helm-videocall-deployment/singapore/webtransport/Chart.yaml similarity index 100% rename from helm/global/singapore/webtransport/Chart.yaml rename to helm-videocall-deployment/singapore/webtransport/Chart.yaml diff --git a/helm/global/singapore/webtransport/certificate.yaml b/helm-videocall-deployment/singapore/webtransport/certificate.yaml similarity index 100% rename from helm/global/singapore/webtransport/certificate.yaml rename to helm-videocall-deployment/singapore/webtransport/certificate.yaml diff --git a/helm-videocall-deployment/singapore/webtransport/charts/rustlemania-webtransport-0.1.0.tgz b/helm-videocall-deployment/singapore/webtransport/charts/rustlemania-webtransport-0.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..429fc6c305269ee40e80a862ad89145a6483c388 GIT binary patch literal 2687 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 Re*pjh|Nqu(s{#Np003;X6D|M% literal 0 HcmV?d00001 diff --git a/helm/global/us-east/engineering-vlog/values.yaml b/helm-videocall-deployment/us-east/engineering-vlog/values.yaml similarity index 100% rename from helm/global/us-east/engineering-vlog/values.yaml rename to helm-videocall-deployment/us-east/engineering-vlog/values.yaml diff --git a/helm/grafana/Chart.lock b/helm-videocall-deployment/us-east/grafana/Chart.lock similarity index 100% rename from helm/grafana/Chart.lock rename to helm-videocall-deployment/us-east/grafana/Chart.lock diff --git a/helm/grafana/Chart.yaml b/helm-videocall-deployment/us-east/grafana/Chart.yaml similarity index 100% rename from helm/grafana/Chart.yaml rename to helm-videocall-deployment/us-east/grafana/Chart.yaml diff --git a/helm/global/us-east/grafana/certificate.yaml b/helm-videocall-deployment/us-east/grafana/certificate.yaml similarity index 100% rename from helm/global/us-east/grafana/certificate.yaml rename to helm-videocall-deployment/us-east/grafana/certificate.yaml diff --git a/helm-videocall-deployment/us-east/grafana/charts/grafana-7.0.0.tgz b/helm-videocall-deployment/us-east/grafana/charts/grafana-7.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..1ec95bb75e66422245db9c1570e6c42604a411e3 GIT binary patch literal 40215 zcmV)TK(W6ciwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0POw!R~$F8FplTv`73k>-)qQ2&x^q%JNJ6e62K16V$1{BxqI^6 zFVS>sX0-IQI+7YZaroaqN2Qlmzs(DbiM^q7PRw*mrBX>MRh3FrV~$5S!QF!i=CU)x z)A*aUKfPYBx3{|s|Mq&l^1uDP7kl6IcVG6u+u8Z9*W3N3*MG6s>wklK>qn*fWI|&8 zP4B^Nl{@#9JUB_1#FDZ^3|a_bF6jt|a*_=@lyzeol0=XJ+JAF)66|z(0ZZapUAg31 z4AAc_gb)f)f~RDFU`nA2mhq6l2ZS;n570!)R1CV^F@@?On|AFioRD}LgsPq>fO?+_ z$qAmKGtT}+Lb)V3^KT2M^aJ67vSfg6UbJwUx}W`Cr{8(miiij~O(nd$oDdWf9MNQq zBx5leF^+!C2%o7pIEl~=6&a4{Z%~3x2@-@;BH-JUNKQl1X-$|y-Jz#(=_Ew9XsDX8 zUpT()Xyh|Nc*qh-5?R-e?i342csI?4F%7$PI_}17%&sKIiAXUgiM-nF^*(meWZb$Y zvs=a^F=z#7$`UFWr^#6T0Q_3l*^oFY{Qvu%?>oJq*P3FQNK6yLp(2@L8V}HKIGG4a zCVv~N-wL%BG9zO@<%M~ih1Zn)EuWPos*#x#Vr*SfJI@m;6a>9rnj{af^IaGVkGc{YH#{J;NVXRlZ0|2w_i z7f<~EF`jYEhB#KNe**;pdUr!Orx6iIP6#?=;WgoilQ9*N&yX%0&wwG~I7W1e$3(Ge z_~YD^8=xeM;}*cYWN1R-6oqV>Vo8TIrgDaEshl7tCxj!tB+%`Ih7*(tVjAfH#Ir1p zFG$FV6deG!AIIz#5eijtf-vWJhS&&w(hE0r74Fa!rvhzWe=h1Mj`A#2~;{VPYS-}vPPd|`Yg@O6NT zAS-pz&;M+-_z;H*O2`S8iV5;eam0-c^j;7}B=V68skXO+I8&R>Ig3eG{SR$MBqa%K zjx0e6P)Bt|q&OrI8sS)wt^&6O2xWpC8BnVB0JL$bOpc^C{!``y9di9r-9ZRqm}s)VB0xB$Z#c`+{2fA^*sUOc zcSHEl{sv$k<`0J{2*05r*$+dOC9-C$VE&kYFNuI68yo1NP!Gj;NMcw#`mX`{bl1v@ zA#BQda$v`w@-c=fzkyIeQdGDiaxFS|ihpAXz7??9sqqXjPX2EBNI6h<1ekPd+aZEU3LnUJZ%p4w4n|5oX zg-tn{j1|R6c?wQxa_*sx&=h~nU%YG~BrzWod2sfAfZBV#wtMrIOqpVyZS`tMCisS` zIsECar3Z|lUzE@m${3N4X^d%tQWiy2@C*dkVHS;v?1+?vzX0-zt*NSMVxj0tEUrbDXG!3RB;AlDBRbAF3DRiTZKW(abWQyLP3gIWkS|`h+v?4fCi^#- z#)>wI3L8L%_X+l2HufqfI&`KZB*&7BXRGxpWJyR;DZ00eU&jnb@JezP$ApV+-bi=D zHqgpnUYJ*EjJ3FS&SEv_@6!lNn43yLAVQpRHiU(!aCt*u9U_!sIT@fXPHA^Sa4aYK zE#q>4c6z;Ds}<85@__mX(S%Bh<3keT*#!w%5{UuYQ(u%y!ZPVz?x>d|Oyi7`%Lyl9 z!s1BjJ}?G`nNyN%pF8Q8ap^zZgIgkJ0Uf3B`Z_Wkhu`kZw?}aKd6An>8*b*!-oo>@ybA za5g~4qf;i&I1!48X`cQL79B`lYC+J^tRTnKib`s2!7nt;gjDQ&ijxdr=#3;oGyxpl z=4k3IH^d%$U{Rn}7O0I~)s+A+3Q|sQuq1&Uj;@AZ-CfjcLj_+-u>#F>W+cnMlbQam z=0~d~iIA^3o)Wdf3(VMTk#4Tcoh?oCr8p&qScCfcKU5!%BmejgaipQ zPUY-CY4;yB=WLZ5YIoQdf{qh}(HW-p?67Kl%boBD`K4d9l_iP?xv#n z%P>_O!D|Y5geCV|ZK5|y{P74#zKyUYf%%RO&JUGrX+=0N#Hr?|L{3O15K9Tik{SBd z*rP+n2@~DCN>Hd$r_vf-#2jqsOmCtRcrKxzu`(t-}d`q{-NBnYs(-mG^p*S{C#3 zKkc>)yga?1L|9?m z@|;`~eJ-?g;}!M<0GbX^yWe@y+3D=I4d+!Qf#x}*4p4hKgZ9)UP-;{%=0u2E6UGL5 z%{cnIV;ShLuTa0!{~pa)hQx$rapd$6g|mSb;W0y!apZ4;+7ph=Je2o$E>4TGN&h*a@VH65@~fD>C4 zkSJp|K*^XUAK{x3Cc_fDspU4Re6bS-atB(@!Bz{(SOho(eOImdc7=E8)u+wr>c^$x z{8S*87)$*1_jZV0nevywsLwbV(T}R48hBwPcvyb{`G}`!Ogb?Oajdz8mb6uUSiUI- zL$CUi+z>tkD9Gx4SaUgGj8v$#KFVTrJ0S^hN5u^^dv~-#L#&v--E2D6Y^r2ae@dGU ze`_Z15Qo>V4aEM#RFj?6!rHDgSBq5v3H3Ml_*vR)YfC zBuYGntsD!-W40cEng$L=8AX%s1~$zDx;T+Eux}K?_HU17DT~>7hAvX2i=qRT2+37{ z#XYUAYWGtA3#0)Z2mr123k%v1Pk+}fdkyELj3TNPYOsDHXXp@Xp=1eX)kJRD(l`Rg zI!>r`l4_2fF?8SrU6|d`RaV=3QNR^B@0=2xfcOpqCc;sq{Y((fp6^Rzyl3~m8 zZ8yBRdIJ;T1Bcp9@&hP5G^xy6D055W7$r=bX<3#?5Q_cNClCRPV`^G~>9>)i zc>}KlrCb^+X?*qHwo`?jME|WsD`?z@My9Ep1rgxf%O;|6~3duMg6HnHQoFPOjqY8KOQU3VtP@}0Q+jVU z47Ak1IGFgAEPeLDnLg{4;EmiC3DzgI>*6U<_5Bn5vkwPN^@%%!$8W>(2-(V2+!i+1A=%u2gHIuACT01dvkfpdp$BTBcAXjY6P+j~Jg~ zJwTwm(!?C2!Vpwu0YJW-5H!Uf=`@?7Oep9qF%k=!l89zgWDTz97POtAtE&cLN)xCH zmMt_S@|F;-yg|TjQSvK zBVcDy;+5hl2NQOi9Ab%c69RO48%0=R#BLSD2~7*Uh7&;~!V(FIxy;g*p^rB%xlS5@ zb%`4@7|#+b;3Le3RC3H`ipy2)2-=bjpbMD#+oRfs+!(I$*e0e!g;;l(iP?~S^bT+O zot?fuyz%Y73(w+;J+Lyg6Nh1l^?>T~=SwrWkWJGJj?0W(-n9fNn~^%MMZo zto1;F`mhc<8vLNhiM3f#RjFsf7H;7jL4o@_nHektv&t-1-WLzi4RlCGG|`T2SnKga zg2+b_W*{ZIRgZ=<|3J=aq=6c zVa&1!?2cg6p~=5UXr(|A&_pt&sfYjocef1I_5{7nv!o*?Z6(o1(3!|P^m{H0S5VWd zwPE`?06DiUCT;yk*8l;Mcqi!^Ac(W7hn7m(mJ!ujl)Cm5BWjIm092E>A3sDllh;f28p&ZuxqGJK7HNX|ef^Dn)C&nQ`N}IVj+dnvhO`*o(9u#Qq zpYB+*OI=wu;{KwVhyT2cuUcEj(IU1nu4d#ktbqzD=R-G)1 zqtun`nj{{2M{kbboeq$j6{Zs}J19#OlOtNlR?Ap%EU+wC>xABPtd{|7lB(`rxvpo_ z^+0$N*t)GEJY+Y}?1oSwgzB*t?q#+7>R&NIt*mXV~T2{-+jWeT6-}Azm zV#R7riETt=*wN=er3p}V_R!v}iJ)qdEwMBE^iIgF?XC7bUIo9FIWKl{r6qx(h(PU6 zpV~^>CbQ>C^&`Z}f+<(rJf0yULY$Ha38s-$WkFU^k~AE}rkubwI72^@cv@Ki6B185 zVxp)1gxyNk)fYRiBu&K?PNFNxX?QKV8?f!dp`1+PV3Z}=972*CJ>e})tv%WvAj6Ff zBWixGIdP=6FOo<;v*(-^1lAMtn#{IglTZW0s&1LL69QLLywR}kmsWtaO0%u4V8S5Q z@R`CiGnT&GifhbvMk+wafppGuCGv$Vp(E`?_f=5Pv5p53ac#`{#ZGs_p+u6K63aG& zbzu2nWxPt9uztwUG3ZGC@w+`SRji_xvvgYXj?;^092QuR5NQr-)yG8XWuE)L2uwlP zpKOzXYqF)SJH|WZMBo2)v(7uG@tvr^8%i$<5HVU-M-_1BVQT1adWg+}@7%|kxkjQX z`AwPyr1ZxoZ%M1u8DCG&Xr5ceDnLq3oFzX|ZJUL+ilG~o3T=X}e5+*Ntr|fW%oa+& zP->0jSuVIK=?BEDtwQJUtq7C=rRBqF?^YEw=k+bs*RqLsCT`Tt7HZ+ZkISksDlG9-(3slzt&y1#fpxsp3`1&SrGdm5fOA$&~M9#8dOvOYmDX?qS zKO0CP0`^9#Bpk5GX>Hr;w<)JdNK;tt5vll1SPT?4At#YoMHTBNMzUCYY0`TWG4t z{pz@9-qs82{4QvrnaG}2pj9S%!%Uwy)f?uz?E^_}^jwF#flk#rp(7H`!kC~R8M_u8 zbfitEN;T1^J0TikF>$6t#l%;VpPy_iBx06~jg?I65jQxd5&Dg$2=>Ws z4OJ1%cO*$3E6@3LN_u6y?DhJ$33hP+>7$3Vka>j3`a2;c# z2&m=#w9Z=ID~Q@)4)*=KnA+>XFKG(dMSSMWde$qz9HCd8~-7?T}GR=lXerW5U6byjk`(-FnzOvVg(W%lz#a5YJ*ac{JB4 z&K~`4tnaORuEdOwkE6UmzHLAM^a*uzBq`9t?(VLpvn$oi6+n6J)flljQtW;@yBbk0 z&q!$6P!baq9ftA0t&lT@k+;2Ki(OGT8FNcEkY{nDr6CY3kH z$w(2QT)ep8-Ycx02mM~}c}+PbmBdxp1%yQXcZGp*cr%v8e(VBzE8v*FzR(nZRJ`kqX-CW5ofi!S=S+CpsVRng z>c!<_Zp*zl3)H=+Xk!V9fvvnK&&Gr)3@;=^zu31NtypHnc$rVArxf0-h`3-=ussj- zUtr@Z6*8Xqm8z29=>Q2%uGC+K<$$Ftlqrz1z*nvBodr|JXOXRMhN7S!*RWh?Ur$RM zkCTunQM!V*;gXsQX0*B%&F+uKgh!dIPH;h_gj+K;b3jeDvEGBgAK`!h_kU|j335X? zxEqI@N@}hilnR+E6RFw|P1J(AQf!*Cgd}ocFXPt~8tYrpI86f~ad=&aQZ}7pKGV_b zsx$l3C-lpwPlzUAoJGXNB+}!EamboCD;3R>2 zksB@7iWLjp3tuSAOBLl3?O|)b7UeGZR*)6<$SEvCyAvxs0YAe3giWlPkdI%DnrVz1$G8sV|pZd3|q^*$qQ-r~VI? z-R%WobM*R4isj@NXSxK-TTF-UCU#z-`#%;3pw?ft>~FqW_0>}W%om6F0!_e`E6s!F zW&oah!*%Qrr4`nmKQB%a<9P#5M1_*H4;9(H+shR}+#h3Y{q~1A&5e@{B#K;Qf%&7U z{X`juV~Nvumq!D1sdd*J80gS2E}+m}m z7G9XUwcvvx7G!UC^;Ux6-tPRC5E}07nt+}KYgHMAF_keM-U9_)v519!ce$w7R1UN7 z+Lua}@3^g7YcxypsI_f+L(W?&sCKrC&b0G~o+}vl>hUVsKf=i^sWb zPT|pz$w?mjjDy814dTdO7Y;U_1U1rrB!j4sARg-Z&S` zlv5=>74L=SEY}YN`!mfR3-Zn@BeB5>oE3-?`P=`02)%WvP=qBMc?6S&E0 zBG@RJRJRrQ7PGOi-`LoT`GkD_M4gHq}h-=o`)* zdsW#u>{s5yebOy-clYU2{WtWxRw{H65(|Rv?w&taeP4xE=M@+NH&cTRh$pbK46D} z@m62miBBoO%0_jty)T;KU1>qBz-C;FCFTsIsBq>>Yg|@akV4&Bo7M8TnvghEs)S7A zg5<1m^)Cb|3c1bA3C-3y$M)5-m4`6*4FxSw&{l(@YFM8gO8`s%nj3<@6fa-=qQ(#B z9;0ySt$OprI5^qRW(t0Z=E!&!xS)Xv!XQulq6!CU;C^Ym`>}z3(a?TzK?Su$iP%U3 zfRX>D=w1k?r_L+JI?0&(pmr*`7VOX812ffb2p=**u3|PGtB$?OFL5D+e*RgrUh&U= zdMC!{6>3jsFiPe$$a)Vzc%oNmZ)eZE$OO3(BDP?SQlnPWm5c>?<&6nKLc~|%nxt3PzqlfvS-czap1I7;(6p`~3n9#P z3;F%Ue&@x@PQP?}aZwn`O3065%#U&ukNiR)+%w%km9QVW#>+~Dm%Zi-gnwYXyA7lm z$z?1)XjTG2)fg}#*w3$NiWCC^PGe;Uh!m3ziIQpHo{FeKa{IJq0`C+0YertvnCLi6 zu4kpF!6sB$Ari1P`JAvZipdR$-AytZb>GZ|JQNyB2x6lFIz0N}{hMuceERy`Hu`D* z{B#=~ou9uu-$n=L$Ct+k`zIZHy$*bNRY7PgX5$mp)WE(1v$JTvMD06L)jPYp`;Y($ z`SUlAnW!KgGSF{1NjZZ{XE;_=nj!O>L?}zb2~Nf&$|tZA)ULl5X#eaOabg@;I|d{j zCybMQ4d={)abpBM2EJpR-75?Vum;bSDdyLP&1-E@RdoJOS5VNv)Dj>YEe~A4{LA5j za^-F!dvoAELv4Fn9$WSDc$D+tZM{qA0n!45Aee^}GvO4nx(k7E9XHqNs3^t`R)F6r zc6v)Ik>6-yJj(sHs6aeR5*;f_%Pop6TUf{PxzL8$lnH&YLM>9`FtmSiqC*}6s!F7a z6-lTLKdPioYD+P^&bu}Z3lA#A=` z-ngxY`Qqg0=nPRKlf@LQ%)Y4y2%jJk6Osb0_j-z*u_O|j1mMb|@f_$jYzP3?X*ajF z-3<~Bh9a|_SR<=@wV|P2fPm%#<{8xexQ9wb#sUI)QTPzX1Sjzfg|Q8gX_lR0lGaZP zyG7_n0^I8f68<-uX5j=)=veKzM&F9*H98algNq z(-8$qfA$LH_7l@`* z0*I&so_KI#Ry-)P{zzR7!ScNQp<4=SK4Z2%9RtN(&FfTm#v-_)hcRq~A0@{H z-(duS5v4GE<~O1RH0u;u1Zbo17|6Pld2kTeVWUE{;)ibLo>BYD+R!f!tf0QiF7I_` ziLKuETv=tiFSYWA?fF_;vL=C4?R^Smb4_c);>e&6dK>W-9JHAwkZ{Eol6>X$7{}}O0^Uha1AWu zm_ZJ49gySdSc&>2l4)_Ze zRlSwQsyp_a(*y-7icR@>apa#|7B0RxCn2*lEA9{WBvag6H`J`jiaib#<6{aJfjk>^ z9y7@lgF@P!v@9FsyOA&KIZU)mRUJ&vN6bQnKtQE#6%2IXKW0n&4rJQ29ZE(q<)sivz2u23mlUG@7iS7@m8Z5gS-`ctk!Vz9U1 zzcO*bqP>Kupo^|3Ciw8b0ujO7@_!N!p2UME@!&~3u;PL5U4L)Uzy|+#pjcp7)YmQ& z*o|SKIB;g~JS-^+82YRt26%TeA1(+uU|*Re;P75X7I1fTSCa;cZF~jtfJOL8B6yMr zo+N@NiNHw&epd4b$OL{Mg$GLpj#;fmHgM1$TQbNuiG{MkX&!E3N$H@{tHtsGs~`Ws+zQdmFr)d#KrHsVyjRZVD&?Cogj$6{zvd`FJ1YcdDRTPy-nKmzT7< zA}X1KC!r7Xa3+}uaZHnOqi8jy$$6m?!~n`)y@XdfgYm)H`vGe2_1fM$lV8h<4dyhC z+q}&W%-yt6Cd9EJxV;x)YUkG^>>W58yRcY)9#DzLreEU$G8qo%6c-bWHf_9S&E5RG zQT4U*%NS6|PcF3|-{P6ROF)|QxwK4_e^vX(%geK?AKzVE4p7@jO6edfN*Ehihv_M9>K+PMdK zcYd3D`y&$)nRM_b!FM@1d~@ZLQ>Lh(BW<;id*S8A1UC*ZvGx4zD&L{1mzryEaS@ss z*L%8Vj*OcL^IR?K=S$RuTYSSAXd8L*q$Kis>p(*){=T=9ofTigmapX)oT}L%S;%6O z!rtg9^|*A3DHF|gLy*C#kQ8!kX<#mAbq5`NG{S3JX;5t$rka;~ZJU*2T6xP7YQikq z43Aov!|0+=0v((mDu!uq{esV;7qZ7iY_yPSuJq`~8Tj*fq5Y|m!Y4${Ce=MX?6C=L z;_8Ty^feo+-^>Sj;1rzEDmD# zrvJB_UZ>yh^fuIn6X-dsbF6xk*d|>ySc2H)f9lu2)}fe=N4h_Xyf!uhO{`;+$INDXO@=H>A|yE;jcBMofPb8S;or*>t|tvtJ=Vcn z3LJV-Yb=xZZSKglRxt0nROiOX>yn&+;~!XQOJv<7qox0h5^Bo^1gMU^Bx zFltvGiZGaFv7~8C0@qTWA9y2g-U!@gU(E}*TdfL{+1NmTgIfnh{^R068I}Nxo3cc4 zx*~IM3#X%#ahUbxSOgVlL}O4NjZO8o(<*0&cELOvumP#+$OcL~WXW@Bvwm31r9K5Q zH*<`2(xhL$oDgKNg>c(0gLw!21h#M;0l=in28O1XR~{kA>~9)cp*_%C!6s`hvU%22 zj}vlf?P_K+K)YIU8~ag(bnH663)*oQCo|++MmILlW*IjW5g}=!2T3)!<)}*lmCEajkkj%)G zuf;)3Ly{j{Hd4!8J%Cd=NMG#+9Rxr((;+LeiGv8gnn%@{T!8i`d5CWluarT)2o6z} zqC(jt7k1sN5TH+BGtp^oT{L`joNSvzrvdueg8S#4V}Q;08Dq!By#Eosu&oMLzqE>R z{a|sMAKMT(sBRToi=2gQWjkymrFk>R@Tx*kO$bS8kI-QzdHDs+zSe0x_up8iLyE@< zFwoN^qBk_kaE$azGp+RsxADz%HD?I$bUJP3cUAMks;W8oRecVO1>t|R#R4S%zgiGS zo&W9FzcqZTb8Wba-}kETc6WCc40FrL{0g?uE3gnHadMT z>Ua7(C}KpYebX_LYW6-8i`nG$Q+)Ra)8v8Qq8+SE5D3UW%Hj(m^I*>h_6Bb>OYoG2 zXo?d$QnE3+q1dhmojdCt zn73nI(keB~123j*cukT>r-B)WsYyKe7H)I#LIC4ph<@M!E^%2g8$YTkHZ4CXwUkeGkddvIIj&V40Mzk}Wosr>++d+}Xie!drkqr1E35C_hMep9T` zc+m`$Is_ajlrb6;X?;S1Am73L>$Z*V?(W*?ccepvqacV#s5JNgMkJiDR;%@* z0~*GgVlF`wZBz?aBm&L{8;6I6H66qIyE|)e$^()fo?d7xl@?{GoY2JjYrrO|iC;%u zk0R*quCv4dbi_^Av70lvQnYlS;HDVCcVIs?jwwT$M7~(?eQz73F~Nf9o0r531MLO2 z*4g%niH8WA<}bhe(n1Y!i>}RxhaoMgcEVz7Z(IX#Wot?frJi0o2cYgWm*{096R%KTu z7NaBxEtLM;`)4OHDBZPlqvqmOx>ZH=_^gDcf-D}2ER|#mcnXPSrud;rs-oVRA9rnw zPB>w9yq_7Q2G1NB?U2B57slm;;phh(<0K?}?%3#ftH(+ao*@b8Gtr3LqA5)>>ACs( z0MYT874&Z~jTJ}gw5)t(18acanVv(?Q6(#T)9ra-*SZN;C+qDJqx!rssuxG+AC3=d z2KGMfFK)ar^3Oln0gpXO+7+(Go~C!tw+bu#S&s0aY3mB~FxJn41I>1h&)R6I^?CO0 z5L_8bofrplg^(mgePfOSZ)mO+lm=O_ z)iNwNVbT>ymChz4NkZZa2pj8u3`B&$2mSc;%>bR{O~VSJ1TlG_jVAsFKd{_je?DmV{_;2mYkfi)=KaA5lAKmw6mumm8jJ zfVnJ=XXw`q$2!tDPIbnfPU|P4VMBSTT2OruXh=ew2?CaL|KveyVU)xsf*+g?Ti*jJ z(55jn8jTGiv8N>5>a>nWi0j=#193Z}c4~olR2J@{=p5dV#zbS=NZ5R{x5V}IHT%)g z(-dj^z6`yMP_O=e2DlGiEkB?+j*bc%NO?omcotr+h+N8PB1fqGpCb5A(JsN#jV?dE z8a7sc(s`q)R){sgV&VML+(OZ(H*-c6O65aZ?ut)k{kJigqTj*qL`f6v|IsnF*@$}8^|N+r7K?REfVvWYSYYO9fR%VN$e$3-zGMEVXe6}&>IQw8USAR+ zAJB6c@XeiN~r!Rrk5E2Qr^NLH?6- zGA3|c1czilj!&p09LK2rH!;DTZ`(Cs+ilOpTE*jc^lQdsnW|MpbU?i*7|yhIV#mdt zV%hqj=vXA+oJmu}&`q*`;Axywr)dz~A@-tSEYm%xMcye@a}>{-YF6sP0m!wGB{vjuy6wW9C zQJ5j!r9}4Dj%X$1HaA9v8AoIsxJkhjWMtpYtk(z4lq>z`G99**`lrr9|gPEKpn5HJJtB zIHPm@y)Y;F1$lkRvK2Xhe!U@)xIagvUxiHeG-S>SH6f~*@4m?cio$Q z_pA!HJT$KGya92ARvHUBaxT48AR+aM+Cnx*#RU}2=}UgC*(d9`qEcb!v!VHDiY(P$ zd*+3^xwr({w(fDMYTgaT(dOK)Ss>YN++krpKTkXNI8L}kAQh&0{YaFv7jw=vR<&7`Qs&SFCl)M`O<)=9PSx8Qk z@jv0hsTC>gKeqTIkFs&!xW$UM6y zvu*TD-}6_4X9mZQ*$T(vhW-;Q{!V7LLR*+7&B=MCRh?4T0jMY0d`$9yFn=r_HbGbc zjZMX4>T%g>`0$#>q^(!>{ZaL6cwd9haVYzUPtEyn%A)n1{eH9P{I|c;@9)(3|Gs=W z|9y<7L74VgniOhLLO8j$Q2S5Y^ZakCclwtoa6-2?xmN|lY~jM9T4UuKjK;gL?XSbS z*dq0&@ajR7Hn3)rL9UF8LWxUuO_D*4cdk7MQS~6FMy-*#rlJ4$F0 zkwl^wHN2((-3#rZzWb3r9ssox@k5oW2?JuCJWH??BL@5J91oy;V{>^{3TF9ZKeCz7 zQlKNLjuz%`iWRtZWlHhPx9Xv~4XzPpUZN28Om8BEkZfX5OB=u0dBg!&6Ly;@tld|$ zS6OLD6$(OCDo~xxcQG49%ilG9A@AIN_blDD4QsQw0~dH(Wx)x&T1QN<-B@+(FIc)c zW_Nd8Z(Y^5YJ+*9ySu@H!umkqZ(@R9yxdzV;GujOAa-Ypi452$He(1!@gr;kd%>cyHZs~ z?J*CbgP7!GKuFlQCRL5e2U#!EdQ015(goHNvD+kOI0{NR%pS^qEZjo}_IN24)KqUZ zHq_jD!|HCT(8!MF<9TnEv}VLtW=&1ts_e^OB>AcG`*rDCT;Z3dd5)g$ojd1i`(d5t!Y&M zs|blCsHsud zLeD&^_IpK?y*?~6nxA$5TLuA=+^B9}xT9b*C45>0#th|RH0r0x2Dai3r0rex8_*I< zr@F_~7yJtLz4F8_=plN9Gzn{`w(|5}^Fe)?r>Y)4(h{;HkQ)m`~Bs6xeUeUU?m zQaD5yl+$!Qbl10dE~jo3ORu)Wms@Js9*e~qck?<-?!AXU0JW9(>jIFo$|k+i4pl!9 zKid{nGZ6~YyEXww6&Vw-c>m=5X#emZS7+z%4vsD^jt(n`!C_PrLKfQFqst%PRqLJ{ zUtG3JMNjsBI6A58{=8o4$Wleh6m3mSl|C4n)?sn=VgKa)Q5ly{pUiIEY20YtNO-0m zi-FDbF&{NssEXLTH&-V|AF3q!^r?|;+_TBX(R}^x^4WfsC~dQAZ>|FVcl0kt6V%>rZ!Jc>mUiNrrkAn!KsX)Es_0(){rK$a^5o*` z!_oQi>wm0Bvc^`|u2(eo?{mt$b8Q_3Q6cbBJD_=jXY<-xP9(aw9rs?sP%#C`lPL5g z3Kb^cV+umvwElv`ASDIeR|v{`w6q9Rs`BLsKptX`BmT^5aDBp$YvsYBPmb>wD)=mz zZ|e|z3gV2lU3@JfO-ye{LWDTuZ0NdQc)4!TM)5aVX|nis{cZjk1UEOW?wu=G-~HVC!Lh}8zz(lWJQ{>u@lEmn^sO*gi-K2h3wHa}RBHn@IGVzfc| z{xUSQoJ-HuL+90Td5{pj^sJwYg3dBqZTsN-`0Vl_3k@#U6y=GV&YRa)7e@#0&yO$v zakYQ=_W1Pb{l(Gw*8GBp#~1rQoE%*ppB`Tx@1K~82j@rom&fl;x2njWAN@aotA?`J zg|b6{J_h%*723y182S#0L9I4OaA#|kIKhQhAb58rNN^?yuMH5aKD5_H`m_Cui=W<| zA1)w&vG5hF&CfAnwuP^8#Fh^0ykO*fqSi1AlTNvQ!k^deLXC{uB(koDRWCH0y>oW9 z6-A$F0`qFm8#ftWB56Z%_;%UdVuWdI0vL@@`v513j+vMbvWU+-Ch24FpPq)*Tx@HJ z-5a`cb#Zk5;pqJ8^7!r1yZ04_J4d#vrRhCI(`v5tFJOF%`211hb8vEebb5K;@hQ{v z$>8{?dp4%~yS>6PCvi)G2iR(nA2c_7})R^uQ%nQNZR zH8qp!aXr3V!(X`B#=~?yrW+673SMEwI$w?n$H(lke8T3mxT+~<{`ibo9KkiFWd_D{ zXt7Pjbq-95wVD+gB31PW0I@b+7hMPv2dFe*bw! zWhFz^vTlZT`nKO_jn4gK-g+``J(;&wG;ghLs4DCuk7KMVivY+#H@{LV8>|{+v4oFtfm`ILuFK^0bQ2Oi-Guyl zY*p*M3%R#^}X1$uZ2^e}H>tkbHqBUB_qrk7Ly-Nh&Mbbm}FYhuQ?@Vzpp% zS!55WE%`ZZISWX9|GndWcAQ5Uu_bIck2Yef+iw<-_{nBGHRV31#bqvG?<>IG&)V|YM`;O5%cG3a>Qq>~s&cjx3o6`aYST7o<;iCI$~F-M{@b{Xn?TF%Rl8 zKd&X%^Lo%*J=gP`?9Lv=O*U2gwUB@LQzflosWdWqn9H~MY8FuGr-uRNW4BZxg=<6G ze!2TMTv*61I{C#PwUU?3r0GJ&C$uJgruVgepN=D(7Hy6aa=~)3^o!_idis zP?I6^0J=ZL>6|2)AdRbE)kK`dOQ%pUPnlUMUC!*e>C%6CBDbfByNWAh+${0wFFIps zG0$u%O?Pq7p27AJ5x$L{c_r00P+PoYWqsBJosQ5Z<7jh&g;IS?jrP9;OWIqN*CQH} z_EwGhmxB)!C$`8oOqB}h{e;k^`rX{*+X1YqRBtyFsipZnUNj7oUOI1aT03By*JLJu zI|;_+ewHG*ADo3IIx}1=wAljieGb)^8ij^%8I``S^IpeFDAsxkpwFRHuY^{^ z)f4o&JSv)z`(hHh8pD@W5*&JHPGZ)Zxar;Jy% zRgXiaEIMOco|f8i8nyaZWT`qySVv+$CQ^O&>!qAY7P5GNE)UL{TOBhYXzDc_$S`ec z{4c$~>^{7KELydJ_lLRx&jH1@boTD>>iEpnsXd_@Q4&X$(W@D& zt#4(1PruBwxIf?NX>)sDg?qGo8!}q`Q!?%#y*!~ z^C(bD0N;mki4(i2Ov^)1J0ad)o~>sIFV%AWfI^j;^;lYoWwh5edmoB=!&JP-Bs9k> zNkll|&7$I)*H`C9r-w)9$ER=XnQ+ay{zS@j(CsdsZ2`0!aNBT`M=kh3=_-}O4TrUr z08+j8cQw>`Jvi7uIr(A#;O`536N=3kyw1#itWa8}tE={{+?z%CT$ByBjaK6~udmMb zFMqtaI^4h9uj%&Ym^kL|C6i5Pd#jUTIngGyIdD(jy{UM_Ed@7b<9a@*;ns4&B|*>Q zvIhG3yAQ_~$L~&$Pv6|H2~QkE*nPjQhS(~- z?yb>9rvlxcEZ3%k?-UqqU6Sz8WicDiE>bmN4p<^2$JCgL8b3ayHf9e4vX(K zFp6&nwE*wYxAHDh@3sH~=?O{A^_TQ2m_HAml_$>99jp54RQz=GM&2L+>G}=Is;+rj zR&eLm`BZXxt3X-KWKj_dO7lL@IIjIFsMcl1(sGmhTKiqjQi9s) zP1r8Yc;9`;Rgn55;ULD;$)KV7aq18MW-TIyz)*K-tJhXxX{d2nrmqt$nmhYUC`sD@ z?S6|ACMQZM`nFqasF50F6PeclP2Q3z}=Rp?qH*!L! z)SuV(l{xsHE8=-`*@wrFhWkM`Ea9_E%MG<%9O=Ho?`l3_yrTgcn z;rdK{T^rI0|^^!B_}wuFVp?2C`sR~Qv95bqx}_2%B{uRo_>x_|CE)F0Hh z1+gZZ4*QqxpBHZDF?zU^*MKEOE;m$!?ZSz5QNAh5EM+L_F%89^Cs$FiZNAG!18| zwF>w-hM2;1S=P=`vGkZfTi-lAU-n}i(IlCsF_uJh!#ER?aL!@^E{6|qqu1;8_I7vS z-(Ig*{`W<%zxPdl_htXPot^J`z1?qm{k`6IJKvz*Iy$)M$%MrGo8E)lDtGQHd1{n$ zKEz=s1UYg$g)0uq?ln!K0rK9q za7xV$y8(jQIFl2`>2F}X>|B2@I+S&9`mHIESTTCVtszj1cT24z`RfAhg6Oc@z#_3r zyKESv_abkiMi$wv;qS{UBl${fRnPF|D1eK{WGS6xk-WcH$L6Z7L96ZvatZW5FK%l0 z#3_BlS(b_c`nlcyC)z;mHlj&HL&XY_oDdW;PSF0@F&e9arDG8Eb33%=Y0=(BZ7uYQ z_CKNE4dFv5G$vAgh3nz!kC+MxWj=WxzSZ-W=HbhC=LUObhYb-&I1K3k}n z%wMo*AhO}VNGQ$Os;1b5_Fvl%L#6h$<{L9bq3~((XvYm&bHq*0hpweaW;{Ep5?RG; zHbOf+A4{iB!WqdYbI9|Rh09bAtBxJduo>s9o>{>vx+ z|0s`|@6R-|Kkx<~4PGJgYt50Tn6NC44k{JE@m~irg{Uz#`-R7tsm zSE%!v8hIDqgYgOC8K_45z2m0evK&)Es@X2u%b)*fF}~eenQIm|moIC3(bV{~&@Z)k zH{1+lImm;i&}#_wkQX#Aw!S7(L2}cKZs!fL-m9G)8rnj?qv75zNkYFf`5`zKh>gHC zUJSb335lm2G3iDu6y0!wxxBKR>}s6Rh;(rn5+P_ZzJgY}NKU9gw=|9sOX3;2W&B!o zaK&C?h#Zo=72;0Dy2rc3_kAIJZj_WvnPYfjhiCl4&z z|98K8S=|3$^k3}tpZ5R9cxv|Pl`L}&UK+JKv-9Blw=>k%c#W(mI9O^FR@wml9strl zIs5itT8E7&-(7w_KR$+oZ;lI}yVG>W$H&p4@EWc<<74VM2|78UK52BdzK+u&UUN1D z3GYJkER-29+|1F1mhY1Z{^9qk;?9VWoTW{vsH-5s5zng}QK6Q?A&H5E;aC!mU#|cV z$1%HoPv57J;=W76D^~LXX7K7bk%Zsi_=1EiiI#_3TibJj-0Ask>AM@Ea4)`TV3$T= zsi|STO_z!Wb9c9lcbn}RqVenU-q8# z|3`UBcD%BVz6O1~e%D{&UdV$~@GnWCuzjzzQMgrWen4k!-ig|47vAOBT%R(^5Q)ij zTmSO`$7+NWRv+tc-jN2I~3Qk>Q6*Zh}J`B(2mDF)?QyU>LF8qi+KayVMfX1Ks&II_0FvWYOC+;t&q z9l7S&Gq-YUqc#){30$io5u%9_9F4Ct8k2-@EJ=ihGt{meoV05%>U=@dtSLn1TBlJt zC!lwWQJ0O_Z4xsaUHLanCbqGS|LA6dcZW3TlH>-7iE%xbC?MIW?wZqbfj?KJNu|D? zhiSRg^g5y(1*vzpT|i`uGMIVsJxinNMP|;iT5=p0Muu*>-=4TPnzKw?(K#wk!ohv+bT>s z9EK#7KN9TS91VU%?R|JZKsZff8iLfM#faecv$Jy+4=E@ z{mY}^^4;H$PW^EzmY>srSc^C?{I>-AoA7w%h$p8?ZPxIE%s+o3Kty) zuTZ;PNV{QIV5GinYPqwH9kiPw%5GJ8l%o;(RY5kl=d1D9eav1#$$EyiSe(npL#=UF zF;B;7-diG-*Azl+d*o+j?T}5oIHl#N@MaW&f>SGD`MyM+*@PvQ78m= zcYWKX;O?$#_p1V~P2J7K(F*Y^!gq6x-;p2@dfp8J)cF<#LH9q9=(h8c?Lp_;?cxic zwgr&w?e6$_(_E|~7gMEK&%v!`Q>-u6(2ZxGKD9r!VGyiQTASUhzT>02;?`N=I5peB z?`Vhx+1o`yR6n49RixBV%vvy0#{4Qyl@+oU_>-zJJHaxF(F3fLRr{Y8PeEZ4Jlr0* z@czfk^7&uy<;#~(_P@t?nuT+HUfyK+yPsIOW&>eOe3H^Gw!H1|*^0KqXH}&Kq3Vgb z7A?wKtK}!lUgpHg=VJeCVr z!l7q^Tu3a*D2p$M+^XILsflN_wM_6P&A@$00H>+wI&t98&A+eWz_8{xPnWLY@Qu}* zFXylGdPz#cK`{8NzKshH4r;zeHW5rNyaAahcLft2`)KA37dD0VwtPy zfj6twQ}h_WM|Zw2E91q(Wfq+jCghw+Q-M^_v@26jJ>i6e*CLx5zmdX{vmuH*mxchH zAFv>xG`CBBChaYqgbT8}ifrm5;+m*eO_y(SzG}M^3bjF}Rz_r@kL^5M{PnAta&;ls zByd=N{)$q5j4h2wZFs~2oSGnpYEM{Ct_**qbabMn$3%DscMGUrZ*X21U%G-^K$4qP z5ma^VgXDEKB%zEu>R+A^N#I_k@p%he%ABUe(oL*ozq~))o4?rYsgVVyEUIDSPwL5o zo~ry0cX)#-PUwgTDb}C_ERg?u{p$U{z1=7OzejmKeX5H!^-f_^5hAduQy$C!7OemNiLU3!D7|9ijf_E7hu(@CG2-~H9Cm&=hWtlJu z$7cg{$`VphvsYF^O;h@E&4Gp9@={c;lqfRIQ#U?Ic%Sj9;r}UK+szOCEa3k;yDxer z{=d8PbpPXVo`>=OIi|xhORi&^YO3XB4DZy8`$xvUXp3>yJ&OGhUQm>4ugg-8>l$SA; zh~zXBgE}{4zoO2jtn(r`|3R}?o||Zb#`Ix>3+5J9-SerRfWdd*tHx-lEUPWl_OR*R zyciOR`-QC68pHh?!tt2Amo#=>m<_b3>r&m==D_`1qPpu|JKi_ECL|X5gf#;^ID3E3 zQ3})SOB*7uGk?(d)L}5ksjXpXhGc?oC^J4Z_Se9V7e24nJfZkcEMZpVzhW-gU=8j7 z3-15+cX}@>{(s-Sc#{7fAvFPMXDWCFL}HI?KNlyKIgJ z{dru@zFN+q>ac6Z);Sy$QcLCr;(`Z4RU+`)dB(|@3dv{wy@PSghB&q~FyHeqM)PRo zzy*cNOC{B$uBMn^RHy^5%~dQ1)?9Czi$Tf+m0GDCEGR7T7~S3dO>?tFg*ArlQn$+b z;A0|Q!KLW7;?2%87SnJxM;^$hxGsv8AHR@Ir?}j*dFkuLg(a~(BsI5-%XdzP%WDTA z?-0d@SUFCq<>s9O7FGH$mcUMDv(#DU%8O>I z-k$08DW_?PB${$1`;nZcBe8tvU2dHsQhCaqwe)iV5($gQg;9y}O8(o=DHY<;h$d8e z+n0S)YIS~Mz6W3+Sxk6Y#qnM~sP}q))rfryCQc!z;h)%IyWVG^{dW!S0E^E5U+%mt z=l|(H<^Ow}=TkNQbG;FGX;a}Bbnw4sOY;5v0P2+2e>b;)+5`Oik5bbCe)HU0`Z#|M zh*b{vo5B2>9QCi(LG&00%lAZSSvP=1;J;$0fEBv-MU3SA9R`{qFYi9E1dM+lXM%(qvl;?r+pP3!n-r9-jl*;2|%!zP!hkTL2 zlvYbA&+DjVhf^QWI)uG|YCP^E^i>WYLpD`n%>d~$=3-08w1gyAih77foK0uk-Vf@v|x z2fb>tX`sG+N>a9&ik6vNPJJ!u#&h_qF;%4^p z^40E_xeq-(f6TM&{y#NNN}s|0x6|M0RqTIzPxik@dG6_;R#u43^iT?M$T(pF(leB| ze*_ZKFq5@@wYU0QnIpGQsDBBFQeFQ-CI<#VgpH{l+nb7`M9U6 z=4wb&lcLtvw!e!zY0c5m@=b`4D7!ZS7nX{5&fn zoRDSYq#S)!{(fDTvCv`pZFTozu%xNwL6qkN<|IwVZd!V;?uEj?*bv6T+*&DlJ(Rdh z`?2njp(fi3w5O2s5_~VuR8|;hkY#-`A?hY*BAq6f&BNf_p%cI z{YCG)C;9I&p0W^S2H%Q$HrCHG^I<=w$Kpb&k7)3!-i^h=pr)X9WPzIr6?hj}3YGwK zCX`=X5o0Ht9R)Y7;zzdgVxi7R_02(R3Ey}HPtA5J!qRpeBbP`KJ zP$>thoqv^{XR#Ks8W`b(32776)?EE7lycsI>ZgA@Hn;0dq)hX(E43C2M_I0~{-Ug0 zWvM%N>Q#$XZuSJZ@=;(br4uVdiAJtjDsCA{1#Vs8TD%Y%;_#Z3Z(3F`@i(8!DVyP* z)!SuF?4|gC&RThkP?AlDHj9_fx9d;&D)(qT%ubiU!)syLCL0si7gEwLns~v}5IlSc zim&xLp0mz!OTdz=5J#FQpO(K6uR9W{Wvx3A!`fwxw| zl+1HT_B4}PNKhR8jwJiPf+Y>|)^Z~-&og>O-@Q+HhR^zj!DsR4qa-}Rp4&m$Q~G}X zb_>tz!kB`qX(=W}WrdVIgwvRY6b^=9k&Eg@{3Toxo7AL2V1ODi>%P=jlIPU92XYpZ z0pbKlb-o{;+qz!e|5Fx4RPYQk{SUKfOdgsDbiw}Lf3dSuzW=@V;>rK-QJxa#N?CO1 z2LA^b{PON!xAbeOHCX`9szv{Fa)NJlD?1!l=s2ax{tc#au5;dj4pcu3bsbRIHJ248?l)-4-6g z3F%Y!#H zJn#cl2LHTHfwLp|UXcAX-RIL>ipFV*)$hDzH5N>lQD?~ zXoO=y)OaZj&+LaI5#rc{8?Yrf`8A`QM2DQE{yer9yADl6P(h@=xO)h6-PW7u;r_wZ zyAMa_=f{Ufut*MmeD~9-)7SP-PFkgiRsnjhqYb~s>2v$W#;$TNQqKNGLP;X`CKS~D ztuwv4pAoxFZZVJc&yI5dHtUM~0Ifr^H1&1Dgfv!|oCxaW@!3J~#o6(pN2V;<7w-iz z`#I0l*8lumz1>e{&tbzqp-J|!`Fob8F`1G?;`j|`St<%e-)2HWaoq(tM{}~m271l- zkVXhc5lzNOP6&csKJm)a?H^;p682deM7Pw*T(#yy!pe|Bvz1?Eeo+)<}MBP7KvfZ^HIg z(-pC^I*#_Ws)j`pNsiBM!jm-i{LhDZ>g0c)6D&!7--i#0ASY(eKW8D?DOrU=DxAm}<0kf7>6BPy z{6p;QpYk~OL+J|blH#Q_DrxHiwC!XRG$20aUVz1H%rFl`$!$MNBC**FYtzJGGNn=Z zJ3s(#Mh)P35)yOucF~CP(`%E|wvS_K)a@b~1=LrY0m#HY;{+X@ooczb z*st%p>E%kIyNkM7cOkmDPJP#%5~;r4DDFi45mF($m3@?3ZxvH6OIfkZ_H)b3GBw5~ zP)}3z?$^#E*JGdR{eP@xKs3E4HlXeN_h~Wy%iwTt|MC9s2YISA#%AwdZ(sjjPo4kx z?OiP+6F1w^*oHpr*cjTt8dWRu3!GQhUpc|GKIw;&v-*-_;)?Cb_&4G!(Yc3muKng- zxW5?J2IW z0xa$UPCyU!dA&d$Bw9Qyq1REZ-o*Id3F&CKRo->3_hUsrRQlU(L&iHK*@fgZnrer$ z@!;FDAKyCV;{k`J(&$GS3qy685Jed|^yL2lw4(2pUPk8i7*vThR zyTp$_TwRS2?HEgA7SY)`IeQ;RPKY?{h3(W3ObroYiu%dU&74O-J`1R zCBk?d<`BIVgjbUH62lJ3&#(|Tj0bMPv3XZ6JWX9+LB_pT6jnCMHD9a4O;zcpT2_de zodJ$}lFh?X>@3KlwLvx8;NyAIm-bZc{~HJVEj%sz|I??>pO@pmJo5h!@)YP+MLgdR zaK$!bGL1cP?-72#0E3NB5w>^5K)r6@3b(Qy_j>gjF9JG&!voj+CUqSH)0;G=Z+8c6 zgE?Yl!X2{b`0;oy55;>ahw>td>Mj!XU7>xb1T&LYjfTiza{ zs>};G4mk(=!gA^E*R>3CvWCrzBvL_|J}Iw-(ZBSIuh{K%k1Q;e2aWdSsIA*yWDQ^~SZ0wI5p$=GqR& zb|>#+CLn9^nvSK&U8$xeVqrf~<^QnO(%%Og*rxw|UW)&B`0O$M!^1q){GU0Z zaZUmYTwu}Yr^p7{;~H+?FCyZ5S*x~gQ1>q?jQd(t?!iK}FCCoylZ0dcECJY83%R~pko5--tN!T& zskc|EFHS!%S6%w>2_m_#AG-aE2-g14;n^$pe~BfTB%!#sL*SPE|KQo66#s3o_jv!y zgFL|33kjj0LnK5juzvwwwVmg2o6FWWzG_+ zq1{o^!BkIJh|je$z|u{_?H7X9^nBf&#YXp696$B=GvZ&1WZu_@sJX7$jya7a`pUaB z9pHVB1%bG--F|9<4-~t*13<(K?>{>f$=n5!R+0G?^nMd8>aAL3b^etg2)~z>(u+A; z(17rjfut2z6xNExwO;sgY+yDsW7*7vrh25H=;g=6u_0^g{Xzh~>tsxP8CC}lQFB9L z8d=+n;~D1CE5>oITD3<-`nmSfwdAvwy2LD~q(3aw?hX-5UXcKGD<|j$BqWmbw5Mrzh`M7kVVv~fBOG~9 z7VW|>D1-zg=x)T(+pghB!J^a+9W*uwhOm5^!x37 z*~c;M&vX$TQ-aR|^6gjKH&Y@}5AJa#yvK=%StN*h6Dt-8^?K4M*uL3QKR6{q(Y>!e zBs~0x_P_hv0No*cbB&(#{|`bxU0$B`KbXyb|KpP#Q`Qdm*@D8e7r)c48x%H#XLy`I$yq zv;_!i{?bC~fB5dyNdNCC6i^%e-`_9!{~zu>p8r3{^99oXPZ>byKS<_CgYr~G%F#GJ zf0P^;k6-`8Y4GQKTIv5igo0_K|4*M4=>PuS;Na2z^Ff|JF8$vm(9D0*Hn33~n$i9otpSCtC_uC5+S>ph1X-8n0tO2>Hj^s0<_Toy~BeN{XaZ>jQ{W;&xdkU!e-)K z>ml%v?f`33kUt2)e>l3;wEiC`{?pU_y^{a;;iLc0!#vBL|1IeSe#U~07_xi4yXS#; zvlVHI)#R2b)mjv-WEPPhLMz4}vq+Nn(wg7pUasZtn-5(~=XgrII0-{-g_PNAPD3`v zp-yn-e20RHZyN@_n6!(w1L{lERgSpSxC5R2j#q2xdo{;R)u4B!7AUbZ}q@P7~}nlNpeo6R7ie{?vOG2 zs+rn)M7d4=@nhd9u{vqY1eFXD4_gvTJT=|~DP}dVtebkbIeV5gE5m2=IaWmSUANC- z*&kym`ePcwAKhKl?LmlSvjJ;U0TV{q9)rA6BtW>A_s-RuGjM6q86BG@JsQQg_R6C4 z#Het>QqGm0xnvcuO4m72+pM&`_nIsSf0WL?fXDKGp4tlOG-90GdmU}^-?OJh|L>=J zkMVyV=Gj7LSW3bpfh0qE0-&22iO@KqA>4}=WB(dYiSRmG=yFB{ob5tD2QedIh!pYG zW|cIW?t*`rqzeL$cFubo1)VJvktyspXglU)Lf?}>Z&3f=j)xRgLM(!u3KEJ5MHHm?Mnd8+)HgufkTFV~D-=o4*BqjEChxD?#!%5R0gO-kJDtwf z7W$D$bWUQ1PNNCybVj3*&mzG>(oq`@QY;z5L4Zt7qzV#FNmD9k$=IW;uhRE?g-C?Yp#j(=kuEwt95(>XFPbOq+M`V~zH z+79V8L5qR6?>$Am@6cl3+w=Bza(A0xsi1Izs6aUC&`7leOF9k-8gqiL6$(>cL2hB!wcQ)AV9s|gmE8!-m-)v7_bC7EE^rHJJo~-U=yd~p)B2qAgk<9SJsU1sW)%| zKG%7Efb|j?--}y4&`fot&ZyVuElG?A|_GH$wF<(;VlwG!hETzY!^k$j8}(>^g>|7BHNAm(pM=NGSM*XsObS5 zR3s$90bD0s(-fHT+H^kAqIairhtAR-X?yO_3nF|@;UfRm)H=PEqgQ?II(NP0pHc)m}9DUsfsMn?-w zLp%=2D68j;1t>_nY&MQdO6}8Ln)@ypSAAGQF)SO06%O6bX~IsdO~@fV%QFCfyhv@0v z-X8jhx-_Da;_w9t@$CiiSrmxw5FPIAqONf*$=*IyZzq_B2`85`PQ;9bL3ap_b|YjK zwqgaAXyF|?w@H_3;kpg{I09S+t$97L{Dded;A?PoQ#9wV5+SsmizwQGsV)1DC|pwp@4U&4O@F1H(mI;SCBv5>L_1i~+Z= zcYG>b7CeqEz1$wXN`ypXqS!oOJV!gK5$o-HZX?93wduBV#SEiu2DBW9J5A~D0au)A zkXeH^Lrvj_LVj*IKvuWR*~ zp>w$y;7xQ+TkxgAyUAIfek6I)xMwYcOYNMEW!$;Ksl^1bVrp@vk*-$*m&2ttjpcDc z{NWprJ}pEl5P@*HL5l0^z0JqbhH`6|_jX%Qv;u&!2>z}f(5&oL!R2r{;g74!xkE=m zpb3~8KY2n)2(nfY;f8dg9N4**;X93V>}q%DpxAbfwm>b5iV&12bn=5f` zvb|S?x33#VV+Q7$XfzNo#Sb;|!OP*&%8*93<2VtL&8^y`weTwWol4BVqgJAb)Z1SRQI>*43S6shlllEI3z%Ow@9nVJq)rD`s3Goa->wR*Kg!i(bef8Q zT28S#QvbSRX9IR!wCxjj=vZ5jVr26)vJrP^1n#M;cN5?$#-wkcrAI+PHEWsz(x;vi z#*w*J+cAMzd+>CBF(HpaiUn!WXWgm!Bfw2o*gY_2!4rY{MEZSIj>xCqXim{+swV65 zyr4j*I!jyWn~kHzwZz_I@#OZN1z7GN%!~WahBV&d`qK6uiz~)**21Hv{pI^4mL$;U z_zk%F8z@U%T$fFJeTEAdc{XW=rEr~rfx*h)a=2hUH7nUl{iX7N(Ps^=cU=(2d*nTy z$D!Kad>nS~W05N2c82Aw4siw+l0p{(6^S{CNd!zaSrC2;Z7_CU=8VEaZv~kop*9Y& zpJ+5i?|eOz&5@Ws4?6ng0v)~lKCSSWMUt~HBs@Eo&0@Uu1f2@!tQX&i9uCJn(=v$r zrgQhF2@Oc!eCTJ3y1!-W-|^77J;*AKqh$Ixj70=7j^>OL-Bc1m+#Bz{=%s92{JEjH ze0h=Y>6-NSg3J8BUQ?Li(wae)$V0D={-s#;^yo}&fsU+U4iE+U?prkQ245?*-EIq7 zqw6)U$L%_!{--h(kwd`%7m#_3A<0KO zfD1mY{*-VD`g;?u3;KH=SK4QOi0QnPel*zok>1NVx>3=K1?q8ht*6d@J_goKm!QY7 zLg%*fJS+ECAr9;)kE=9}ZT+>8F+p{7+j4n#=**c{Mol!Yw+>OX>zv@=7fvO46ZvFm zLRQArB(plW$Q;E6Y?&KYE9{`6$lu!tceLNdk;| z7gcv*#k^Ny&BCuF|99vFL>WWw)y^2l;jOkAJp1|BE4Aa^`b#9^vs!Wb4uP)@!bl`z z6i}WXuauU-hKsUe?pXJNtHJK#4ymL)U#0Bx18;Q`!dhIF zCKc_t^5zvA3Iu=Y-|s$g&w!pVyy zjz|E012yS4qF^LiEV-?ijg>?T%9)nR7noD6sLhnvgZRRksN*@V#PB35eIhhcywxRx%M1-r| z*;QNOnD!R~Z}7aoMWV$5b6st3G3fb>6YX09+oD7Pk(h?UL&t^f-gces2h|1IB4{~* z66cToRYtTuH|Aa1T_LsK|oSXgEJSZo1rL7 zxf#vpATQ0?ZK)CBbG72#ulZJ_VeT6&v?^MWW&08ua!#Uv@V0q%hb~AYzyW5dg^!~^ z>j}UG#a#P>wr#2zXUTMi-pM$u^TuK~lJ&LA$d#nAxWZ9zB{}u4MSm+1G@AD0jPzt2 z_9jULlEcoC@UO_h}(JyIq-E=(i8}Vg@8I4fQtLzbP9kaGfr=#gWwz*GSddVEyJ4u$XOVmMIjH{dlm|kk)q~FLc z(dtZfsSRD$)L&_gg+kBOoK&}TrDN-0qG30UWD_nMO}hYV&7su7U6@R1+xdmYb*7UV z;ukWks2>hlG}Wh!*8JI~-)Md*rf{j#sJqmAE1OkL<`Vgnak#S{f27Y=Lc-N7UgB(} zjLT-eM^M=rnWPiiczRKfE6rS)ej`>g^;AAHx4_lY`>Js?nUTFiPTV`Lwhp^PFVdt& z#Zqfqdat-z7@a$prAawsa{#0n7Lj$}1`?FUl}3JwTGZ!vmJU1-DCTsI`EBEg`lh(5 zygF-eK~h)lP1P&*U<$qo&)|xZa4FfY1mvvAji3rhy&r*xj>3@L2t+7o0&#>e=lE8! zw;y!ipUi3DBboz)d;PWO33(fmon6H8d4%L}%)1Td7QPO;0p9#NgSRo|b}vY56&`^z zc=_V!4B@Ad$PU9X*%4n9b_$Lstz=&(vSX~;M?W{j!Fo%UZiCR&0eH;Xmm|)=#lX5i^eFNhoO?64; z@j<(x0YQRb?$3<$qDp`r2M2-Z>rh;x??ic;BO0Z9=UpCQ6&hdz%BD@gNu+Y-gif{4 z0V*JaLd;ka25I1=R8^jB%U6(cDUERzDma}Ql~I9yZf$H!kh3a8dKA*}9~ng1gaD5? zJ#%B?(+MTPZh6|42U9np2TedUQmIuo;T%o~54}-x;SCj9&Pczg!M>SMf0nC>3dEBL zL>H)ZOi&_7;Gt9bL?9drhGHi4nS*2o?=3od`4WC=h%^FWIm*xYB@RNXdhZ5HfA)&V z8FS|S9nx=9rHKwY77$5%nJrG^HYYsviyGZujxLXXDtBtY5H{cJq4KVt4i_&^PR$w#!SwjKJ~{s9n49{aPap0Wu6%SptjM3hl;7r^rZ!XQs;%^S`q~@qmkUzfwdOw znjkz;qzF3`)jBh()nvjDg5A%I2|0Yax3>qeU2rg`Q6F@Af-*H5`&KpD*Hw0_J62rN z_#6`C7C#V3Esj%x7+4GdGi*il^OOI+dVBs7$fNrE)yd^gZ(h`#s%6x>3IdI&d{I_ zbTm>D!lzh|dLoG*IGZbhNL)ys_%h)xSlxs6aK*?*bwu#Xir_; zyfuw~>)Kbzu>D~7?@DsI;}K97u-XXh|pbyh2rXohTv|Q{+Ri=2eXY z>pHwr4r>v_%Jj2I7)w*HCjS&M7NxR0&?ebzIk>CJXAZs`t#_dPkP>^VLkPI;s(9Y~ILej|2Z|Ep6p`?aO-oPbpxh_i^W8GwT{vsTDc zm)GynSg0B*t1$svNmd*Z9_c~MnKs#7M7d}~(TCip6a?2?pS7`TU*vNH%Z za<<#$RkHTd!uG|<`Rk)sC%f?L?C9d+mpA7xcJDxAoY zRg2~=yIO{4i9O9GUTFyy0G8$QWp=csV6M8KWyq=}qs{iS46?hMZ8PhcBX<6LJ6qPH z)rz@4?9P@oteVSz_?^u~R3+{eb~c;*v+ZjdfL2h}?QG71td#d2YG=!EsNLvw*_)+l zXG?qf;r6wR)GWQL&E==DKfic&d4_yW0uo7zL*XrbFqPp-1mXWA%@N}?u4{5@)ukye zKu`@%6&zvH9bNTn31Atn7z=U3c+iAxEnK!>jm!RO!KRJk)k0flAXgnnDA*myN_UVY z$JT+m#Mst%p$4_g*h0!)+Xy?jmKfXhaOKBV<7yjWJ>_z@`+GQ%3{*K4XBtO|WLZca z8;|_jB1simTSgAPw$slD4@R+^r6%0hd<9S0AF8z~aS@sw@3o`>Wnv zq|{$6t`GNf>43!*)%ra+moyk)Kt?nNx2vQ6f-`W+ej1xt8_B?Cqm$ZE(&tf#gqkND znKPCVf}1<)@Lm#8ZF5|YSI2@PLOuX+;GO|HA7j5^M!MK-(EBI=xaZ#=9XHr?Z#Xvr zSIYA@265N81UhG-MyLK5(+I9UwFgwjmd2itnY(k+Ec&h%;?&ZO1+(*y;o70bdoTztfliJv2@f|D@#%y+^{}lIPofGK`i2v_K^8z7M!u*!r0B5YZtab#>q{nUDbJ!gz5!~37=D; zgDzu%Zb+!TxvMQNa=6|Kauml$d|nsXSh3&w%2}HZX(j5Q6$wj1F_PAYhSbVySf24y8JI0-SDii^>P^kdzhDpCs z#4EK8{J`;?+%SIK9JBA2EcT%};a8b^oal%;1p>VxRnFsTjM)cidlQ>@RPb!`3aQtO z*w=unGG1RTDx129YmBAntAFkZS53UW8e9@jtBlv~&}cF64%Us=SAnbAv#b`E<6P$D z({JKamdDlL!Bv5)(TQu*U=!>n3KVo`fGc1PC|kO@v;N0hC6goK_T#pMQZ*w z@IyMHyh%RS$+b0j%-LKqN{K)$CLF5|o7jC<;fjiM!=XLub}d(XGC| zbTsPEiR9E@kx#3{CHxtwRyp0F3;5=$Y)rixsoE3sxMor|g#B9ymkdp`tBUzmzL9Ah zGXFZ&V%RgZ6xTf{=q#=##o^2BN)tx|Z0CK(5;+s^O}0L@?sXZg)#Iq<&ZWN2zrabD zx8@wtIl9*KjSAIc_EKX6x8bfjwQ6xG*=$Tg8kK}k#o@p=JN0R#j_5ok;%jFWV} zc^2W)(Wt60=~;YUfea4Dvu{fvqtTQIegE3(xH!=#vp-Rxc$H%Ce7CP&C-X6ZOA1&R zpmXgKq@yP=#ED`9bLmHe4Q{43q0^#(aMH8|W#%?Iu)oUI<0hZGQ~s^(>hVIMtvgi( z%%;FIcSUTcONE|kh3T-i4T!4Z(9|MojzrUn$Y_lE=KsBXEe$ZM!_(BjYzt7+3R6i& zRi_4Nk~)~x(Q0a7w#BPyh1tgV*21g|yX{DLw5aV*b<%e*M1<@3p zs2S!mp^Bp$M~0+1~&&t_V3;>P`2S@rDaP+F-T`Ni8tTRImUO;KAX{_|}~P zE5iJG@9RdDdjm{~`IN}B9N6aGv~X7({`FwuI6mV{GM`nsP#*<>wjFnpp$R2ns_k8Q zj)L_>OOi57!@*rt-C~voeTCc0tfQlq(yb2E^t6w|aE$$HFhXsHxyDLw3fOs<3pG+T zPb))pwsh56OQ=cIxxM7V(W0ph#k{nMa)Yohei$ZM@Yfn0y`)I|Qbh85Hi9xvpOqR$zPRUwO zt|<~W1#Hv?D(U@F=2EE&-qBv5wB(?#!Fn`ZX8pkTSLcB>-Dds37g!fac*Awp4}61l zekm-aD{;d@<(Ei0VcWyFtcJ95`BdPCfIcVhK~O60j(6yVxhWCMiI5-CG=?_xu+O4M z-yOOdC%hE?3My6A|L+yOrZV#w$`;lgI&x2hL0fCT>bL+pZ>T1YdhPh(Xi{oar-o|z zX%H&aX{2cftDa*O_^BoKm4!Hbvpa{tuL1HQQ(D!TncIg|JqHCeyNXxUOj;|>&A$4Y z6+cjF_#HZOZYqEzppAtXNvXbHL#Xa|Lv)~C-8eM|zQ_Lc4d%fyo5xtvF%9$7ByI87 zBt*WOQh~`NeG^7DX2BEV`vLv4AY8!V1W{lI-ry+;7!hg-rFQ_7@4iA>UsYVQcb(4G z))q1m!_)BwJ4D6*bvoduWp~X(@2Pfe9J2-KbVj4mEuM!R=gN*@2bnvB)L#e%Y>sI( zMCQ1HMpKXI$~>RVAqi(pUL`ynqV8X}W5XNoh+)6~*KM7BM_9#U7ji%aS8DBCiDZ1G zfDXZPrehkQ>NZo(d_YJ^;zEP!p>8!ERlF{(o7FfPjq<(3Ca82-R;Tl`x!u}mT5e=l0!`_HMB4og zYNsN-#>vaZs#nIYI;Drq6(9QQCFmybIyi&w=r1tuhjeUvrSGOQHzE(s>6xfZlxxE< z{n@h`Ww;ew&j*5oH&J*y)Hmrm;4&kXR(yq|w!?;~p9tO;Gt5a)m$(SPOaOGMFXVAj zcP?RxV)Y-IkQ+1y2T1q&o*;LpkCCrD^gXOzl~J%cL1qqW$6>W&;K=w=V8}OPH>sU7 z_GhM^VK%H;HEJ}Cjkcccs)EeEN54bpH^HJIy6afd^r4fHsjlP9(H(Z2FP`T)zqXJf zbRm%hii3DfU>jY?;TA2a3`uv0x)-Y5srg2C*G-hrKqbLrKN##kJ;;AF1h6|qgY@-B z_{&d(Wb<-cw^Fw|oJzG=qs_c@-H{3?hyDB3{SLPkW}i&isuXu-_KP4q)isbfGoa`R zi7hcw@XpC(h^$K3Qd6JJ-7q@)CiOHT@-!GC``e13*_+H0e&`$u!^e*bq&o)*);WY^RH z_i-QFz>mtFGTA6=Xr9^{t% z3pcouVb#oCm@Go+4SL|}t~O?%@0`elN9eyU-n=$5D7=NW?l@Oan@mm9@3A0<2Z%&I z3rL{n>NfGF9{Q1RPUTML2u0)u#hBwck%Xfe7HCXJl(!*FcnDO($3l@BL?`H$C8?h{ zM&rW+(^JMrpZq()`bvH9f7Pe^wkQ%wew)Dyh|jc-h=8MPN`mxk-SQ#;T{09#bVVrq@ z)2JbSrw6XAdNw;5unNxWTfyi6=|~6B{M)I-MiLiO=S95(Qcaq{6a0EOKg69CbFzyWo9~I0+Kp zijL_m8M#o4s;@fvlGKUZ-Q3|174OF3aJ;a7=&J zyvYzP2Ayjf1;Z>fMQ2VVR@fJk1gV*$>)P$u*h$us zzzq~+c|_aa5owfjnZ=+5FV6#>8xN_3b3?;UD%3Sf>9Z< zXk>yM{g#NDEKcka$@KBcu;2fOSopB}eCPcm)r5WLiG}Z(@$`V%TRw)?NOguYEY4Jc zFtaYD(#jpZ?*UIVCO%el#_ce>+nTA0Vh&N!VZou0US|Ob^v-Kt{=xJk!=btuF2BUF zA}*X_na$bsh(Izl#}Sx6sR`zgn#?l<2Z0h@n2=MhCS?|13n<`q(II8nOp`Ro3WAhT zqKrJ`X;C=>;t)MijN%itmAVG&{eQyv5Y?`-j=mrCg{eQD_JXmeARF3+kPBT)dQKrl zspHixil-B|@F5DuJx*}IqVN`? zPNbi~mW2G5V3BQxee8@Fq9+$`W5O>^RF9wGuf9@mpQI^&tH`TbFvfx?aJrved0L2Y z&H~lzCVD?~y#BLqbm)Bu7=GLHvHfe3grQT&9KU}PljxX5kr<*qw3QNw#WU~V|Iep9 z4MJj4?l+|LSrom(?_bghQ3Pg)1_uXwO-0*&&jxu9(toq}^xJQ|r@QEzy@PMR@eb4< z&%XV}d#3(4{Pr8~a2Jw(JJ@qdQ*{a-ha?zhiX;7Op?{1S3%@h^T{VQTsz^X(ZrwZg z2V`mvl}dGPP8(FWMBSAc;8-frO%?jibb>bg8ur1`%bvx1j88SCqeAMVuRO`yGU_2` zUG_}WCbe_yc!~AyP84t7=X}T473l8uF@TP|OGPt|5;Jhn~xmlB-T(wP}X2Z)g)5V?lkmeAy&~ z7e|SlRn(XzPPf`(uD8`#ot(B8iaF29y;F%8xJNfi(v0AMaJz%3&&S!v>)`_W=%!8$bS&+~&V6@{Gl1dqm|9Q4qM&C~i&SRz(=nKbf#q z3~2gUMJ+dKAxJxwwiN;xcZ!2?BcC{;ZW%Ti|L z--k>Ccc;}fvmoPijEsXa83$t8J&2%Fip<=^Je7_}n4g_EY6p;JW(sCuu;V@0Ef=*j>5&;MA_2;$le z(UbS={n)-sVkPZ^b4zZ=$sGd00Dx^lN9!4{RvpNSfpf>Iu>?DqcF(sN2kEA8X6K^m zCWsugtCyiK5qOx2-F)wX^$Rs?FyF7np(A$`EpM265FO`hRP-?K=9=k;?*ClcR;l`4 z5zRvMR--JcE>(GNmA?SiR7NT2yxLNWXF76S^=9%RW85e#`>s*)&dy zGO4srkv7<83;jaIGsdpb+w+$uQp$uHPya$%ZAjFuC;?*b0#7G=91|3<1k5HA9^Rrc z*Y3UZ%yE-A)*8 zP*wD=qgOfC7sX*J;%;e6x+Zi#*aqoE6xar5 zt`3q(Y}jmbJK8AS1V;A6AMD~4M}4Ap4d{AkK8XU9#9FJJ>l`bDFwTjHnGVh9j+PY) z(kPWiH2Sd+d(s^tBv8Dt-2ON9B28&9^N=#GiyfdrG>49tD5Ot#| zjoxd*41ZdyWG|nM6PW)!?d~;1{jUbCc@jZ-oJ`64A?hk{-A-!AnbM>Gwe9_Vr)URy z{k2H#KLfJpG?}tycB<8}@vYRjrG>GX9(s@<)08P2m`(&g;Uv68snc&NUplAHG@^?9 zQ;`zwL=cfqgLfI}3J4c#i%B{9(BI0)aX|Qv;r$`pnPYSUaoE73R11XmLb3v_3Gozd zJMl7YUm0U5Q?9<2YzHJoC*rl0hfi}oGOV>feuon|^T2tU`d3W-`Zb%r=vzB~wWq-q zRjD`^&?nOGn=1P%=T)wpewycFR)9gjav?g!M|+}>3)#Ml7|%i#hYarjkTWzR z;oNC?uh(1gh))6N88|(F)6+F}G*|W}#{W)8;dCx-^$`672LHQa>$4Bgn$yS+lYm&V zz1$2LmaLTB9Io_M+lU^_8zX3{7q43y4YILjyI#Su+TOu|*0{UY#m(cXsY7Zs46`dW z8ZWgYWnZ!jBQ7N4cuLS|Bnh8jpP=pIi_@KSNmng?jE*l(QNR^*jleLF6UixAWOK+? z_3r5RgcI~na*KWjsnlLv?NACZn*>4uiEV3ppil1kg7$P(DM9FAm2PM0AY1e(Vj1;r^q^GsfM9c2r|sYk(8W{6GpAFXHawgab+GLo#lmA<=oFY zo$qh6!?G%m-9TvW5Byhf(dkFCRp7}9%6XBxspK3|tGqld)2BiHM5i-!w7@jP#@|Nm zX-Nb}b*ZEc3i?}?pc@SLD`2uFTv<*$>!|I;>vWC;QsNa7lEhG{y)jD=xD`f`TxV0PDNVQL2H$o- zYOuE|&9OFcv8;3ny<~`u!7v7gAtX6H6DD=X+VG%%vBUD*ib5J7*Q1sL#Zw|VW0V21C?RWy}ZRfJ~vDkg-BA<8iHY}1C{?0s`!lZD{2bA^Kd z7+>_&hqE^?u1?QB=2GEcp(+%lHlgB>t3hSQM1T2Ak0la5?ORQaGc)d|j=jCTy~Be8 z`2XJCUh)5XgJ*kx85}$tJb(K1`QF~aU(}0(r+-0v_fviIlL(3VU-mYxtJt_d$g_oB z5^bPQg%*YNT^T^PM8eHgeaEMY`Ux~nXc!2Dr&v+c+%*s-RdP;@{M_w)e5xO3{VOWm zv!3twNd;Qg|6s89w6OjU_xJW5*Z)I2cD%v#k_AVRq({yx1Ue$-&6yvwhyXcQ+>bcg8Oue+O!=epE8mEm z^Lzn!R|%J;wv}6lP*?HX@)X?Mi_j42W+qb#U$2*HD0;n8OAzX6(X*@N;fn7w8Z>;R zK8uc7$hfMDPsezBZx`(k2D@ng*|S|V*r}@0_V1B%G34LSk&=i-ReC#~=~OD7;eX8i z{?+;QG1vdr9J8W5UG3c79ik`+!~7SHwli1uM%NXSIK~kPE8c5A z;-9nV1>fX9%iGX&0Kd*hJdk)=QJy)WrO~v0n$`D`q%b^%d=t**3PZ$hdWW;ZFm)v} z-@1*(#?-$iyj(aZ6HdhJ%3h`bZR$P~-DZ@E;ZpS$`ozYOc#+KKw=IDrP6Pj6|IOGh z*ULtds12gHf3F{r@4J4fg*uK8R{>dc8KNhtnJJukPH33gl7dhAsi9C8 z#Ai_;RAX(sv>ojW5)zQ$+%u)j55Re;<8C>^Tih0~sPDAnQ_-8^`iG;t)TCUW!*5Co z+SdQG!-D>2fA8?wpy=a`ylfF-m}B9{C{}xxc(pFiCK^- z6?Me2mul-e8loeNF>X8fSHBl}Pdh(({o>^O^!1NdN9R9Y3{kIV_Q>8ePIh~}8yW@d zrYGp{Q57GDI@p#-pC>QTjCv-zwJKL}m zN;-X;+8sMN({0+16V2hw&5JpiGk&Yzy`rhEmxw~1XXPxwj;*xc?9K n9_>FKDc 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⩔(vv2sq6HMF{o2Uz>*>aIKp_G0m^p~Clp$Wb zvjKA4l(4bT{E~as;A^}@5t2sZK#mTUzhX)z#v$+F6dmFz@>hO{x(C*@?8zqVh#njO z#v$cNd?nsnbx^eU4dV8fg;N zVsjD(dX0)tQ;5TaBIlC;7wT!UgOeGV4Tq&-Oo{_iG8z>_(O0LJxq;Ac^TVLr7R$$= zY5**0{v}7ip7aX*jnPaY4t&usfTAEKIN}{}E?oqENf47en~(5P9=2OAOYIa9fQb^3 zQdqxw^1D44lPq&e=pCeibmdVT*(ko4$w8DZX4xUmuQqL)k*5OI_+HrsS>sYF6%)j{ zvY<1>Rg{@Shwp`) zW1xJt!IK4!&J6&0uJ9ylW_a=pL`W#46QU;6t>9tgs2W1t03C2S6`!Bwkr3jN zlC~AbMZ1S$iMl5aNn4|k+3?kFr94DHkjS%;i>vQI!f|LU%{T&+gsog1n{FBzp?y$B zC&Qxy`L|CNV(<2jj{1Y%=&YyxN-hH=R>?E%iKp4p1c6AO(d5m-NWe!(C>1pfUmEsW@W3%a~7FcrI%W2QW=ezjh zV>776=D3%g+jly;$Lb^(${&PK$Nj^t02YW->?{6F*9e^I@Si4;2V+S9QVgCGihmV5 ze<+P$1~}>-Xzw9!N~ot@&fVs6y;egLIJ%1}?CLU(ThM#WDBhXY+YE=RE-YnR_V&aXbPAk}QU0kUoJy2Iw(Wgmv| z9QNCWJEWzwt2lEOcE58EmJAF!_on!ua}S<_JT&vQpMKSDMVS&MjG*D7kCkOyx(+X4 zD2QC25Rxz;cac)jQrf48aYE5M@-4+P9KrB9v;U^;OY#Z6m7d0i8J008hrpfBQt7*K zK)CL1dL`vzx7Az6w?b);sGt)fCw)4`NZLNXV9yQ+f4Czt?->eEKCpVy|Gy;wgn3JuLzBA+U!i&)bWY zm;P-3{=;DLr1f{AnoqG9bfqhCC znewgyY6M%geBbD|sTXqUX0OBNP2gt>Xomp1R}_!+?TNm9o1Sem*L|qU({gIvGO_f( zR=!^V#_<&;ocJU(N<}W<-}*_NXG>fEs1W)Jn4 z0d~ME9kBsZ+qS53{_mTy#bSau%-PQ19rHp01J5KJ@HA-8fL0Tzak=EmVVnVfPSS9Y z*!GK1WzRGSYNsU?#vzK94335^!+GaOyEh8Z-(dbKnJBSb5f`Bd1c*Z%G5{we;o3Wk z#)Pd+lTh>pAN2;Kk#1fFh6yD=sTBE{)QJKZAYq`KVI$D*4D`}F(7U0XVTXjuSbgSj zS+uSl4KJ@GS*E1-8Z$1`_0)Y1F(Bw;j{SN5Jlr_INUhr{LT2OKz%pn6bq~hy>S*6V<;ShfpgLNZC7~qdpI#Ffe5I*R*dIag9BOJ}lyY7J?dz)rMPKtwwo{0SG8@cgb>s%Fo$5IPM^GHli1TJSs*H>nsN{&iwUBK_Nc)1r*#ZPZ%KfzM0w1j|M!3XFHhO≫|Cwn(X0LNd$1r7yOz$i%h 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 Wf9{|A=l)sQ^Zx;NBpoIIqz(XMN-F69 literal 0 HcmV?d00001 diff --git a/helm/global/us-east/matomo/values.yaml b/helm-videocall-deployment/us-east/matomo/values.yaml similarity index 100% rename from helm/global/us-east/matomo/values.yaml rename to helm-videocall-deployment/us-east/matomo/values.yaml diff --git a/helm/global/us-east/metrics-api/Chart.lock b/helm-videocall-deployment/us-east/metrics-api/Chart.lock similarity index 100% rename from helm/global/us-east/metrics-api/Chart.lock rename to helm-videocall-deployment/us-east/metrics-api/Chart.lock diff --git a/helm/global/us-east/metrics-api/Chart.yaml b/helm-videocall-deployment/us-east/metrics-api/Chart.yaml similarity index 100% rename from helm/global/us-east/metrics-api/Chart.yaml rename to helm-videocall-deployment/us-east/metrics-api/Chart.yaml diff --git a/helm/global/us-east/metrics-api/values.yaml b/helm-videocall-deployment/us-east/metrics-api/values.yaml similarity index 100% rename from helm/global/us-east/metrics-api/values.yaml rename to helm-videocall-deployment/us-east/metrics-api/values.yaml diff --git a/helm/nats/Chart.lock b/helm-videocall-deployment/us-east/nats/Chart.lock similarity index 100% rename from helm/nats/Chart.lock rename to helm-videocall-deployment/us-east/nats/Chart.lock diff --git a/helm/nats/Chart.yaml b/helm-videocall-deployment/us-east/nats/Chart.yaml similarity index 100% rename from helm/nats/Chart.yaml rename to helm-videocall-deployment/us-east/nats/Chart.yaml diff --git a/helm-videocall-deployment/us-east/nats/charts/nats-0.19.15.tgz b/helm-videocall-deployment/us-east/nats/charts/nats-0.19.15.tgz new file mode 100644 index 0000000000000000000000000000000000000000..4d2b0c2d6eb11d216b92a43b0b5cc6e84ef9d31f GIT binary patch literal 24440 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

Xw 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 Cf*4)^ literal 0 HcmV?d00001 diff --git a/helm/global/us-east/postgres/values.yaml b/helm-videocall-deployment/us-east/postgres/values.yaml similarity index 100% rename from helm/global/us-east/postgres/values.yaml rename to helm-videocall-deployment/us-east/postgres/values.yaml diff --git a/helm/prometheus/Chart.lock b/helm-videocall-deployment/us-east/prometheus/Chart.lock similarity index 100% rename from helm/prometheus/Chart.lock rename to helm-videocall-deployment/us-east/prometheus/Chart.lock diff --git a/helm/prometheus/Chart.yaml b/helm-videocall-deployment/us-east/prometheus/Chart.yaml similarity index 100% rename from helm/prometheus/Chart.yaml rename to helm-videocall-deployment/us-east/prometheus/Chart.yaml diff --git a/helm-videocall-deployment/us-east/prometheus/charts/prometheus-25.0.0.tgz b/helm-videocall-deployment/us-east/prometheus/charts/prometheus-25.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..e82764bcc1d861e56310fcfc3cf8e44b6c8affc6 GIT binary patch literal 71764 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 literal 0 HcmV?d00001 diff --git a/helm/global/us-east/prometheus/values.yaml b/helm-videocall-deployment/us-east/prometheus/values.yaml similarity index 100% rename from helm/global/us-east/prometheus/values.yaml rename to helm-videocall-deployment/us-east/prometheus/values.yaml diff --git a/helm/global/us-east/rustlemania-ui-staging/Chart.lock b/helm-videocall-deployment/us-east/rustlemania-ui-staging/Chart.lock similarity index 100% rename from helm/global/us-east/rustlemania-ui-staging/Chart.lock rename to helm-videocall-deployment/us-east/rustlemania-ui-staging/Chart.lock diff --git a/helm/global/us-east/rustlemania-ui-staging/Chart.yaml b/helm-videocall-deployment/us-east/rustlemania-ui-staging/Chart.yaml similarity index 100% rename from helm/global/us-east/rustlemania-ui-staging/Chart.yaml rename to helm-videocall-deployment/us-east/rustlemania-ui-staging/Chart.yaml diff --git a/helm/global/us-east/rustlemania-ui-staging/certificate.yaml b/helm-videocall-deployment/us-east/rustlemania-ui-staging/certificate.yaml similarity index 100% rename from helm/global/us-east/rustlemania-ui-staging/certificate.yaml rename to helm-videocall-deployment/us-east/rustlemania-ui-staging/certificate.yaml diff --git a/helm-videocall-deployment/us-east/rustlemania-ui-staging/charts/rustlemania-ui-0.1.0.tgz b/helm-videocall-deployment/us-east/rustlemania-ui-staging/charts/rustlemania-ui-0.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..c8d61ed18705d1e80a833491355a8422fbcb8bdb GIT binary patch literal 4170 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 UQ>mB#3jhHB{}Mu=`2bu10LQ&Fp8x;= literal 0 HcmV?d00001 diff --git a/helm/global/us-east/rustlemania-ui-staging/values.yaml b/helm-videocall-deployment/us-east/rustlemania-ui-staging/values.yaml similarity index 100% rename from helm/global/us-east/rustlemania-ui-staging/values.yaml rename to helm-videocall-deployment/us-east/rustlemania-ui-staging/values.yaml diff --git a/helm/global/us-east/rustlemania-ui/Chart.lock b/helm-videocall-deployment/us-east/rustlemania-ui/Chart.lock similarity index 100% rename from helm/global/us-east/rustlemania-ui/Chart.lock rename to helm-videocall-deployment/us-east/rustlemania-ui/Chart.lock diff --git a/helm/global/us-east/rustlemania-ui/Chart.yaml b/helm-videocall-deployment/us-east/rustlemania-ui/Chart.yaml similarity index 100% rename from helm/global/us-east/rustlemania-ui/Chart.yaml rename to helm-videocall-deployment/us-east/rustlemania-ui/Chart.yaml diff --git a/helm/global/us-east/rustlemania-ui/certificate.yaml b/helm-videocall-deployment/us-east/rustlemania-ui/certificate.yaml similarity index 100% rename from helm/global/us-east/rustlemania-ui/certificate.yaml rename to helm-videocall-deployment/us-east/rustlemania-ui/certificate.yaml diff --git a/helm-videocall-deployment/us-east/rustlemania-ui/charts/rustlemania-ui-0.1.0.tgz b/helm-videocall-deployment/us-east/rustlemania-ui/charts/rustlemania-ui-0.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..49161960df0b53bdf184b76dc2f7122977033718 GIT binary patch literal 4151 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 literal 0 HcmV?d00001 diff --git a/helm/global/us-east/rustlemania-ui/values.yaml b/helm-videocall-deployment/us-east/rustlemania-ui/values.yaml similarity index 100% rename from helm/global/us-east/rustlemania-ui/values.yaml rename to helm-videocall-deployment/us-east/rustlemania-ui/values.yaml diff --git a/helm/global/us-east/videocall-website/Chart.lock b/helm-videocall-deployment/us-east/videocall-website/Chart.lock similarity index 100% rename from helm/global/us-east/videocall-website/Chart.lock rename to helm-videocall-deployment/us-east/videocall-website/Chart.lock diff --git a/helm/global/us-east/videocall-website/Chart.yaml b/helm-videocall-deployment/us-east/videocall-website/Chart.yaml similarity index 100% rename from helm/global/us-east/videocall-website/Chart.yaml rename to helm-videocall-deployment/us-east/videocall-website/Chart.yaml diff --git a/helm/global/us-east/videocall-website/certificate.yaml b/helm-videocall-deployment/us-east/videocall-website/certificate.yaml similarity index 100% rename from helm/global/us-east/videocall-website/certificate.yaml rename to helm-videocall-deployment/us-east/videocall-website/certificate.yaml diff --git a/helm-videocall-deployment/us-east/videocall-website/charts/videocall-website-0.1.0.tgz b/helm-videocall-deployment/us-east/videocall-website/charts/videocall-website-0.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..ccff6f94dd7db5e8e87d499fcb39a7d5a7bdf51c GIT binary patch literal 3120 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 K9q6wBLI4184*}@_ literal 0 HcmV?d00001 diff --git a/helm/global/us-east/videocall-website/values.yaml b/helm-videocall-deployment/us-east/videocall-website/values.yaml similarity index 100% rename from helm/global/us-east/videocall-website/values.yaml rename to helm-videocall-deployment/us-east/videocall-website/values.yaml diff --git a/helm/global/us-east/websocket/Chart.lock b/helm-videocall-deployment/us-east/websocket/Chart.lock similarity index 100% rename from helm/global/us-east/websocket/Chart.lock rename to helm-videocall-deployment/us-east/websocket/Chart.lock diff --git a/helm/global/us-east/websocket/Chart.yaml b/helm-videocall-deployment/us-east/websocket/Chart.yaml similarity index 100% rename from helm/global/us-east/websocket/Chart.yaml rename to helm-videocall-deployment/us-east/websocket/Chart.yaml diff --git a/helm/global/us-east/websocket/certificate.yaml b/helm-videocall-deployment/us-east/websocket/certificate.yaml similarity index 100% rename from helm/global/us-east/websocket/certificate.yaml rename to helm-videocall-deployment/us-east/websocket/certificate.yaml diff --git a/helm-videocall-deployment/us-east/websocket/charts/rustlemania-websocket-0.1.0.tgz b/helm-videocall-deployment/us-east/websocket/charts/rustlemania-websocket-0.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..cc74ece83496e6b8625c474dddd63267a92033a4 GIT binary patch literal 3397 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 literal 0 HcmV?d00001 diff --git a/helm/global/us-east/webtransport/values.yaml b/helm-videocall-deployment/us-east/webtransport/values.yaml similarity index 100% rename from helm/global/us-east/webtransport/values.yaml rename to helm-videocall-deployment/us-east/webtransport/values.yaml diff --git a/helm/K3S_DEPLOYMENT_GUIDE.md b/helm/K3S_DEPLOYMENT_GUIDE.md index d9dc9206e..d62cfb1e4 100644 --- a/helm/K3S_DEPLOYMENT_GUIDE.md +++ b/helm/K3S_DEPLOYMENT_GUIDE.md @@ -1,6 +1,10 @@ # K3s Deployment Guide for VideoCall-RS -This guide outlines how to deploy a simple Kubernetes cluster with VideoCall-RS application on a bare K3s cluster. It includes both the infrastructure components and application-specific services with a simplified configuration. We encourage you to read through this doc in its entirety first, ensure you understand what values need to be customized (and customize them!) before you go crazy deploying with cut and paste! +This guide outlines how to deploy a simple Kubernetes cluster with VideoCall-RS application on a bare K3s cluster. It includes both the infrastructure components and application-specific services with a simplified configuration. + +**Updated for Unified Chart**: This guide now uses the unified `videocall` Helm chart which deploys all application components (UI, WebSocket, WebTransport, Website, Metrics) in a single install. Infrastructure components (NATS, Prometheus, etc.) are installed separately from `helm-videocall-deployment/infrastructure/`. + +We encourage you to read through this doc in its entirety first, ensure you understand what values need to be customized (and customize them!) before you go crazy deploying with cut and paste! ## Prerequisites @@ -9,11 +13,46 @@ This guide outlines how to deploy a simple Kubernetes cluster with VideoCall-RS - Ability to open necessary ports (80, 443, 443/UDP for WebTransport) - Clone the github repo https://github.com/security-union/videocall-rs locally and ensure you do your work from the root of the cloned repo (within the `videocall-rs` directory) -**Before proceeding, find all occurrences of `YOUR_DOMAIN_NAME` within the files located in the `videocall-rs/helm` directory tree. Every occurrence should be replaced with your domain name where you will be deploying. You must have a valid domain name, the procedure below requires you to use cert-manager and optionally external dns to set DNS entries for use with obtaining valid SSL certificates and resolving DNS names. For example:** +**Before proceeding, you'll need to create a values file for your domain.** You must have a valid domain name - the procedure below requires cert-manager and optionally external-dns to set DNS entries for use with obtaining valid SSL certificates and resolving DNS names. + +Create a custom values file for your deployment: ```bash -find helm -type f -name "*.yaml" -exec sed -i 's/YOUR_DOMAIN_NAME/yourdomainname/g' {} + +cat > my-values.yaml < **Note**: This configuration uses DNS01 challenge with AWS Route53, which is required for validating wildcard certificates and is generally more reliable than HTTP01 validation. This deployment will use this method for certificate validation. You can use other DNS providers supported by cert-manager, or switch to HTTP01 validation (which doesn't work for wildcard certificates) if your deployment is available on the internet. @@ -162,11 +201,11 @@ kubectl create secret generic cloudflare-api-token-secret -n videocall \ --from-literal=api-token=YOUR_CLOUDFLARE_API_TOKEN ``` -3. Edit the `helm/cluster-manager-issuer/cloudflare-issuer.yaml` and update the two `email` attributes with your own email. Do that now before continuing. +3. Edit `helm-videocall-deployment/infrastructure/cert-manager-issuer/cloudflare-issuer.yaml` and update the two `email` attributes with your own email. Do that now before continuing. 4. Create the Issuer: ```bash -kubectl apply -f helm/cert-manager-issuer/cloudflare-issuer.yaml +kubectl apply -f helm-videocall-deployment/infrastructure/cert-manager-issuer/cloudflare-issuer.yaml ``` > **Note**: This configuration uses DNS01 challenge with Cloudflare. You must use an API token (not your global API key) with the correct permissions. For more details, see [cert-manager Cloudflare DNS01 documentation](https://cert-manager.io/docs/configuration/acme/dns01/cloudflare/). @@ -207,7 +246,7 @@ Install External DNS with AWS Route53 configuration ```bash helm install external-dns external-dns/external-dns \ --namespace externaldns \ - --values ./helm/external-dns/route53.yaml + --values ./helm-videocall-deployment/infrastructure/external-dns/route53.yaml ``` @@ -237,8 +276,8 @@ Install Prometheus for metrics collection: ```bash helm repo add prometheus-community https://prometheus-community.github.io/helm-charts -helm dependency build helm/prometheus -helm install prometheus helm/prometheus --namespace videocall +helm dependency build helm-videocall-deployment/infrastructure/prometheus +helm install prometheus helm-videocall-deployment/infrastructure/prometheus --namespace videocall ``` Key configurations to review: @@ -246,7 +285,7 @@ Key configurations to review: - Storage size and class - Scrape configurations (especially for service endpoints) -revise `./helm/prometheus/values.yaml` as necessary prior to install. +revise `./helm-videocall-deployment/infrastructure/prometheus/values.yaml` as necessary prior to install. ### 3.2 Grafana @@ -257,7 +296,7 @@ Setup the required Helm repository: ```bash helm repo add grafana https://grafana.github.io/helm-charts -helm dependency build helm/grafana +helm dependency build helm-videocall-deployment/infrastructure/grafana ``` Use a custom value for the Grafana Admin Password: ```bash @@ -266,7 +305,7 @@ export GRAFANA_ADMIN_PASSWORD=videocall-monitoring-2024 ``` Install: ```bash -helm upgrade --install grafana helm/grafana \ +helm upgrade --install grafana helm-videocall-deployment/infrastructure/grafana \ --namespace videocall \ --set grafana.adminUser=$GRAFANA_ADMIN_USER \ --set grafana.adminPassword=$GRAFANA_ADMIN_PASSWORD \ @@ -276,7 +315,7 @@ helm upgrade --install grafana helm/grafana \ -## 4. Video Call Application Components +## 4. Video Call Application ### 4.1 NATS Message Broker @@ -284,54 +323,48 @@ Before installing NATS, add the NATS Helm repository and build chart dependencie ```bash helm repo add nats https://nats-io.github.io/k8s/helm/charts/ -helm dependency build helm/nats +helm dependency build helm-videocall-deployment/infrastructure/nats ``` Install NATS for application messaging: ```bash -helm install nats helm/nats --namespace videocall +helm install nats helm-videocall-deployment/infrastructure/nats --namespace videocall ``` -This uses a very simple, non persisted NATS configuration. +This uses a very simple, non-persisted NATS configuration. -### 4.2 Metrics API Services +### 4.2 Videocall Application (Unified Chart) -Install the metrics API services: +Install the complete Videocall application using the unified chart and your custom values file: ```bash -helm install metrics-api ./helm/metrics-api --namespace videocall +helm install videocall ./helm/videocall \ + --namespace videocall \ + -f my-values.yaml ``` -### 4.3 WebSocket Server +This single command deploys all six application components: +- **UI** - Web application frontend (port 80) +- **WebSocket** - Real-time signaling server (port 8080) +- **WebTransport** - High-performance media transport (port 443 UDP) +- **Website** - Marketing site (port 80, optional) +- **Metrics Client** - Client metrics collection (port 9091) +- **Metrics Server** - Server stats tracking (port 9092) -Install the WebSocket server: +> **Important**: The WebTransport server does not use the NGINX Ingress Controller. Instead, it's exposed directly using a Kubernetes LoadBalancer Service that handles UDP traffic required for HTTP3/WebTransport protocol. The WebTransport server handles its own TLS termination using mounted certificates, and clients connect directly to this service rather than through NGINX. This is necessary because WebTransport requires direct UDP connectivity for the QUIC protocol. +> **Note**: The WebTransport pod may restart several times before success, typically because it tries to start before cert-manager has obtained the SSL certificate. You can view the pod logs to confirm: ```bash -helm install websocket ./helm/rustlemania-websocket --namespace videocall +kubectl logs -l app.kubernetes.io/component=webtransport ``` - -### 4.4 WebTransport Server - -Install the WebTransport server: - +To verify all components are deployed: ```bash -helm install webtransport ./helm/rustlemania-webtransport --namespace videocall +kubectl get pods -l app.kubernetes.io/instance=videocall ``` -> **Important**: Unlike other services, the WebTransport server does not use the NGINX Ingress Controller. Instead, it's exposed directly using a Kubernetes LoadBalancer Service that handles UDP traffic required for HTTP3/WebTransport protocol. The WebTransport server handles its own TLS termination using mounted certificates, and clients connect directly to this service rather than through NGINX. This is necessary because WebTransport requires direct UDP connectivity for the QUIC protocol. - -> Note: The webtransport server may restart several times before success. Generally this is because it tries to start before cert-manager has obtained and setup the necessary SSL cert. You can view the pod logs to confirm if your webtranport pod is failing to start. - - -### 4.5 UI Application - -Install the UI application: - -```bash -helm install ui ./helm/rustlemania-ui --namespace videocall -``` +You should see pods for each enabled component with unique `app.kubernetes.io/component` labels. ## 5. Post-Installation Verification @@ -343,7 +376,6 @@ Check that all services are running: ```bash $ kubectl get pods,services,ingress NAME READY STATUS RESTARTS AGE -pod/client-metrics-api-68889cbdb6-k7sh4 1/1 Running 0 149m pod/grafana-c44db467f-xkztd 1/1 Running 0 5h25m pod/nats-0 3/3 Running 0 5d1h pod/nats-box-69b79775f4-5fxgn 1/1 Running 0 5d1h @@ -351,43 +383,48 @@ pod/prometheus-kube-state-metrics-686d9fd46c-jx6b9 1/1 Running 0 pod/prometheus-prometheus-node-exporter-4zrz4 1/1 Running 0 4h18m pod/prometheus-prometheus-pushgateway-6bf748ccc9-zlhb6 1/1 Running 0 4h18m pod/prometheus-server-58cc4bc869-m6pnk 2/2 Running 0 4h18m -pod/rustlemania-ui-cb7f7f5b-j8s5j 1/1 Running 0 29h -pod/rustlemania-websocket-7d5685bf44-vs7sf 1/1 Running 0 29h -pod/rustlemania-webtransport-6db5b5678f-pthjk 1/1 Running 0 29h -pod/server-metrics-api-75447fcc86-nc4pq 1/1 Running 0 4h44m +pod/videocall-metrics-client-68889cbdb6-k7sh4 1/1 Running 0 149m +pod/videocall-metrics-server-75447fcc86-nc4pq 1/1 Running 0 4h44m +pod/videocall-ui-cb7f7f5b-j8s5j 1/1 Running 0 29h +pod/videocall-websocket-7d5685bf44-vs7sf 1/1 Running 0 29h +pod/videocall-webtransport-6db5b5678f-pthjk 1/1 Running 0 29h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -service/client-metrics-api ClusterIP 10.43.112.83 9091/TCP 4h45m service/grafana ClusterIP 10.43.157.225 80/TCP 5h25m service/nats ClusterIP None 4222/TCP,6222/TCP,8222/TCP,7777/TCP,7422/TCP,7522/TCP 5d1h service/prometheus-kube-state-metrics ClusterIP 10.43.243.0 8080/TCP 5h31m service/prometheus-prometheus-node-exporter ClusterIP 10.43.143.191 9100/TCP 5h31m service/prometheus-prometheus-pushgateway ClusterIP 10.43.20.225 9091/TCP 5h31m service/prometheus-server ClusterIP 10.43.32.88 80/TCP 5h31m -service/rustlemania-ui ClusterIP 10.43.115.124 80/TCP 47h -service/rustlemania-websocket ClusterIP 10.43.136.127 8080/TCP 29h -service/rustlemania-webtransport-lb LoadBalancer 10.43.74.88 10.190.252.181 5321:32767/TCP,443:32463/UDP 47h -service/server-metrics-api ClusterIP 10.43.18.91 9092/TCP 4h45m +service/videocall-metrics-client ClusterIP 10.43.112.83 9091/TCP 4h45m +service/videocall-metrics-server ClusterIP 10.43.18.91 9092/TCP 4h45m +service/videocall-ui ClusterIP 10.43.115.124 80/TCP 47h +service/videocall-websocket ClusterIP 10.43.136.127 8080/TCP 29h +service/videocall-webtransport-lb LoadBalancer 10.43.74.88 10.190.252.181 444:32767/TCP,443:32463/UDP 47h -NAME CLASS HOSTS ADDRESS PORTS AGE -ingress.networking.k8s.io/grafana grafana.yourdomain.com 10.190.252.181 80, 443 5h25m -ingress.networking.k8s.io/prometheus-server prometheus.yourdomain.com 10.190.252.181 80, 443 4h18m -ingress.networking.k8s.io/rustlemania-ui nginx app.yourdomain.com 10.190.252.181 80, 443 47h -ingress.networking.k8s.io/rustlemania-websocket nginx websocket.yourdomain.com 10.190.252.181 80, 443 29h +NAME CLASS HOSTS ADDRESS PORTS AGE +ingress.networking.k8s.io/grafana grafana.yourdomain.com 10.190.252.181 80, 443 5h25m +ingress.networking.k8s.io/prometheus-server prometheus.yourdomain.com 10.190.252.181 80, 443 4h18m +ingress.networking.k8s.io/videocall-ui nginx app.yourdomain.com 10.190.252.181 80, 443 47h +ingress.networking.k8s.io/videocall-websocket nginx websocket.yourdomain.com 10.190.252.181 80, 443 29h + api.yourdomain.com ``` +Note the naming: All videocall components now have the `videocall-` prefix and use the `app.kubernetes.io/component` label for differentiation. + ### 5.2 Verify TLS Certificates Ensure certificates are properly issued, they should be ready: ```bash $ kubectl get certificates -n videocall -NAME READY SECRET AGE -grafana-tls True grafana-tls 5h18m -prometheus-tls True prometheus-tls 4h16m -rustlemania-webtransport-tls True webtransport-tls 47h -ui-tls True ui-tls 47h -websocket-tls True websocket-tls 29h +NAME READY SECRET AGE +grafana-tls True grafana-tls 5h18m +prometheus-tls True prometheus-tls 4h16m +videocall-ui-tls True videocall-ui-tls 47h +videocall-webtransport-cert True webtransport-tls 47h +websocket-tls True websocket-tls 29h +api-tls True api-tls 29h ``` @@ -399,56 +436,71 @@ Test connectivity to the various services: - WebTransport: https://webtransport.yourdomain.com - Grafana: https://grafana.yourdomain.com -## 6. Custom Values Files to Review +## 6. Configuration Files to Review + +The following configuration files should be reviewed and customized for your deployment: -The following custom values files should be reviewed and updated for your deployment: +### 6.1 Videocall Application -1. **WebSocket Server**: `./helm/rustlemania-websocket/values.yaml` - - Update image repository and tag - - Configure resource limits (min 384Mi memory request, 768Mi limit) - - Set appropriate ingress hostname - - Configure environment variables +**Your custom values file** (`my-values.yaml`): +- Domain settings in `global.domain` +- Component enablement flags (`ui.enabled`, `websocket.enabled`, etc.) +- Resource limits for each component +- Ingress hostnames +- Image tags and repositories -2. **WebTransport Server**: `./helm/rustlemania-webtransport/values.yaml` - - Update image repository and tag - - Configure resource limits (min 384Mi memory request, 768Mi limit) - - Set TLS certificate name - - Configure service type and ports - - Configure environment variables +**Reference template**: `./helm/videocall/values.yaml` (967 lines, fully documented) +- Contains all available configuration options +- Every parameter is explained with comments +- Use this as a reference when creating your `my-values.yaml` -3. **UI Application**: `./helm/rustlemania-ui/values.yaml` - - Update image repository and tag - - Configure ingress hostname - - Set environment variables +### 6.2 Infrastructure Components -4. **NATS**: `./helm/nats/values.yaml` +1. **NATS**: `./helm-videocall-deployment/infrastructure/nats/values.yaml` - Configure authentication if needed - Adjust resource limits -5. **Prometheus**: `./helm/prometheus/values.yaml` +2. **Prometheus**: `./helm-videocall-deployment/infrastructure/prometheus/values.yaml` - Adjust retention and storage -6. **Grafana**: `./helm/grafana/values.yaml` +3. **Grafana**: `./helm-videocall-deployment/infrastructure/grafana/values.yaml` - Configure admin credentials - Set up dashboards and data sources +### Quick Configuration Example -## 7. Monitoring +To customize component resources in your `my-values.yaml`: -Grafana is used for monitoring and visualizing metrics in this deployment. Two dashboards are provided for quick insights: +```yaml +websocket: + replicaCount: 2 + resources: + limits: + cpu: "2000m" + memory: "4Gi" + requests: + cpu: "1000m" + memory: "2Gi" +``` + + +## 7. Monitoring -- **Server Connections Analytics**: `./helm/global/us-east/grafana/dashboards/server-connections-analytics.json` -- **Videocall Health**: `./helm/global/us-east/grafana/dashboards/videocall-health.json` +Grafana is used for monitoring and visualizing metrics in this deployment. -### Importing Dashboards into Grafana +### Accessing Grafana -1. Log in to your Grafana instance (https://grafana.yourdomain.com). The admin username and password was specified in `helm/global/us-east/grafana/values.yaml` (see `adminUser` and `adminPassword`). -2. In the left sidebar, click the **Dashboards** (four squares) icon, then select **Import**. -3. Click **Upload JSON file** and select either `server-connections-analytics.json` or `videocall-health.json` from `./helm/global/us-east/grafana/dashboards/`. -4. Choose the Prometheus data source if prompted, then click **Import**. -5. Repeat for the second dashboard. +1. Log in to your Grafana instance (https://grafana.yourdomain.com). The admin username and password were specified when you installed Grafana (see the `$GRAFANA_ADMIN_USER` and `$GRAFANA_ADMIN_PASSWORD` environment variables). +2. Configure Prometheus as a data source if not already configured +3. Access metrics from the Videocall components: + - Client metrics: `videocall-metrics-client:9091/metrics` + - Server stats: `videocall-metrics-server:9092/metrics` -You should now see both dashboards available in your Grafana instance for monitoring system health and analytics. +Create dashboards to visualize: +- Active connections per server +- Client engagement metrics +- Media quality statistics +- Server health and resource usage --- ## 8. Troubleshooting diff --git a/helm/README.md b/helm/README.md index 15fa53719..98d27d436 100644 --- a/helm/README.md +++ b/helm/README.md @@ -1,29 +1,43 @@ -# Deploying with helm to kubernetes - -1. Create a cluster -1. Label the nodes in the node pool - ``` - kubectl label nodes node-role=worker - ``` -1. Deploy ingress-nginx -1. Install external-DNS - ``` - helm repo add bitnami https://charts.bitnami.com/bitnami - helm install external-dns bitnami/external-dns \ - --set provider=digitalocean \ - --set digitalocean.apiToken=YOUR_DIGITALOCEAN_API_TOKEN - ``` -1. Deploy internal nats -1. Create an opaque secret named "rusltemania" with the key postgres-password filled in with a random password -1. Deploy rustlemania without SSL -1. Deploy cert-manager -1. Create a cert-manager issuer -1. Upgrade rustlemania to include SSL -1. Install kubernetes dashboard through the digital ocean marketplace -1. Start the kubernetes dashboard locally -```kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 8443:443``` - -## Updating the website - -1. Update the tag in the videocall-website/values.yaml file -1. Run ```helm dependency update && helm upgrade videocall-website . -f values.yaml``` +# Videocall Helm Charts + +This directory contains public Helm charts for Videocall.rs. + +## Charts + +### videocall/ + +The unified Helm chart for deploying the complete Videocall.rs application stack. + +Includes 6 components: +- UI +- WebSocket API +- WebTransport +- Website +- Metrics Client +- Metrics Server + +See [videocall/README.md](videocall/README.md) for installation and configuration. + +## Deployment-Specific Charts + +Infrastructure and deployment-specific charts are in `helm-videocall-deployment/`: + +- **infrastructure/** - NATS, PostgreSQL, Prometheus, Grafana, cert-manager, ingress, etc. +- **apps/** - Other applications (engineering-vlog, etc.) +- **us-east/** - US East region deployment values +- **singapore/** - Singapore region deployment values + +## Quick Start + +```bash +# Install Videocall application +cd videocall +helm install videocall . -f my-values.yaml +``` + +## Documentation + +- **K3S_DEPLOYMENT_GUIDE.md** - Guide for deploying to K3s clusters +- **videocall/README.md** - Videocall chart documentation +- **videocall/QUICKSTART.md** - 5-minute getting started +- **videocall/MIGRATION.md** - Migrating from separate charts diff --git a/helm/metrics-api/Chart.yaml b/helm/metrics-api/Chart.yaml deleted file mode 100644 index 5e30075bf..000000000 --- a/helm/metrics-api/Chart.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: v2 -name: metrics-api -description: Metrics API service for videocall monitoring -type: application -version: 0.1.0 -appVersion: "1.0.0" -keywords: - - metrics - - monitoring - - nats - - videocall -home: https://github.com/your-org/videocall-rs -sources: - - https://github.com/your-org/videocall-rs -maintainers: - - name: Your Name - email: your-email@example.com \ No newline at end of file diff --git a/helm/metrics-api/templates/_helpers.tpl b/helm/metrics-api/templates/_helpers.tpl deleted file mode 100644 index 087686c1c..000000000 --- a/helm/metrics-api/templates/_helpers.tpl +++ /dev/null @@ -1,62 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "metrics-api.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "metrics-api.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "metrics-api.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "metrics-api.labels" -}} -helm.sh/chart: {{ include "metrics-api.chart" . }} -{{ include "metrics-api.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "metrics-api.selectorLabels" -}} -app.kubernetes.io/name: {{ include "metrics-api.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "metrics-api.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "metrics-api.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/helm/metrics-api/templates/deployment.yaml b/helm/metrics-api/templates/deployment.yaml deleted file mode 100644 index e42994d57..000000000 --- a/helm/metrics-api/templates/deployment.yaml +++ /dev/null @@ -1,55 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: client-{{ include "metrics-api.fullname" . }} - labels: - {{- include "metrics-api.labels" . | nindent 4 }} -spec: - replicas: {{ .Values.metricsApi.replicas }} - selector: - matchLabels: - {{- include "metrics-api.selectorLabels" . | nindent 6 }} - template: - metadata: - labels: - {{- include "metrics-api.selectorLabels" . | nindent 8 }} - spec: - securityContext: - {{- toYaml .Values.metricsApi.podSecurityContext | nindent 8 }} - containers: - - name: {{ .Chart.Name }} - image: "{{ .Values.metricsApi.image.repository }}:{{ .Values.metricsApi.image.tag }}" - imagePullPolicy: {{ .Values.metricsApi.image.pullPolicy }} - command: ["/usr/bin/metrics_server"] - workingDir: /app/actix-api - ports: - - name: http - containerPort: {{ .Values.metricsApi.service.targetPort }} - protocol: TCP - env: - - name: METRICS_PORT - value: {{ .Values.metricsApi.env.METRICS_PORT | quote }} - - name: NATS_URL - value: {{ .Values.metricsApi.env.NATS_URL | quote }} - - name: REGION - value: {{ .Values.metricsApi.env.REGION | quote }} - - name: HOSTNAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: SERVER_ID - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: SERVICE_TYPE - value: {{ .Values.metricsApi.env.SERVICE_TYPE | quote }} - - name: RUST_LOG - value: {{ .Values.metricsApi.env.RUST_LOG | quote }} - resources: - {{- toYaml .Values.metricsApi.resources | nindent 12 }} - livenessProbe: - {{- toYaml .Values.metricsApi.livenessProbe | nindent 12 }} - readinessProbe: - {{- toYaml .Values.metricsApi.readinessProbe | nindent 12 }} - securityContext: - {{- toYaml .Values.metricsApi.securityContext | nindent 12 }} \ No newline at end of file diff --git a/helm/metrics-api/templates/server-stats-deployment.yaml b/helm/metrics-api/templates/server-stats-deployment.yaml deleted file mode 100644 index 3d1dd5c71..000000000 --- a/helm/metrics-api/templates/server-stats-deployment.yaml +++ /dev/null @@ -1,62 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: server-{{ include "metrics-api.fullname" . }} - labels: - {{- include "metrics-api.labels" . | nindent 4 }} - app.kubernetes.io/component: server-stats -spec: - replicas: {{ .Values.serverStats.replicas }} - selector: - matchLabels: - {{- include "metrics-api.selectorLabels" . | nindent 6 }} - app.kubernetes.io/component: server-stats - template: - metadata: - labels: - {{- include "metrics-api.selectorLabels" . | nindent 8 }} - app.kubernetes.io/component: server-stats - spec: - securityContext: - {{- toYaml .Values.serverStats.podSecurityContext | nindent 8 }} - containers: - - name: {{ .Chart.Name }}-server-stats - image: "{{ .Values.serverStats.image.repository }}:{{ .Values.serverStats.image.tag }}" - imagePullPolicy: {{ .Values.serverStats.image.pullPolicy }} - command: {{ .Values.serverStats.command }} - workingDir: /app/actix-api - ports: - - name: http - containerPort: {{ .Values.serverStats.service.targetPort }} - protocol: TCP - env: - - name: METRICS_PORT - value: "{{ .Values.serverStats.env.METRICS_PORT }}" - - name: NATS_URL - value: "{{ .Values.serverStats.env.NATS_URL }}" - - name: REGION - value: "{{ .Values.serverStats.env.REGION }}" - - name: SERVICE_TYPE - value: "{{ .Values.serverStats.env.SERVICE_TYPE }}" - - name: RUST_LOG - value: "{{ .Values.serverStats.env.RUST_LOG }}" - livenessProbe: - httpGet: - path: {{ .Values.serverStats.livenessProbe.httpGet.path }} - port: {{ .Values.serverStats.livenessProbe.httpGet.port }} - initialDelaySeconds: {{ .Values.serverStats.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.serverStats.livenessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.serverStats.livenessProbe.timeoutSeconds }} - failureThreshold: {{ .Values.serverStats.livenessProbe.failureThreshold }} - readinessProbe: - httpGet: - path: {{ .Values.serverStats.readinessProbe.httpGet.path }} - port: {{ .Values.serverStats.readinessProbe.httpGet.port }} - initialDelaySeconds: {{ .Values.serverStats.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.serverStats.readinessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.serverStats.readinessProbe.timeoutSeconds }} - failureThreshold: {{ .Values.serverStats.readinessProbe.failureThreshold }} - resources: - {{- toYaml .Values.serverStats.resources | nindent 12 }} - securityContext: - {{- toYaml .Values.serverStats.securityContext | nindent 12 }} diff --git a/helm/metrics-api/templates/server-stats-service.yaml b/helm/metrics-api/templates/server-stats-service.yaml deleted file mode 100644 index 3dd256a45..000000000 --- a/helm/metrics-api/templates/server-stats-service.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: server-{{ include "metrics-api.fullname" . }} - labels: - {{- include "metrics-api.labels" . | nindent 4 }} - app.kubernetes.io/component: server-stats -spec: - type: {{ .Values.serverStats.service.type }} - ports: - - port: {{ .Values.serverStats.service.port }} - targetPort: {{ .Values.serverStats.service.targetPort }} - protocol: TCP - name: http - selector: - {{- include "metrics-api.selectorLabels" . | nindent 4 }} - app.kubernetes.io/component: server-stats diff --git a/helm/metrics-api/templates/service.yaml b/helm/metrics-api/templates/service.yaml deleted file mode 100644 index 41680f912..000000000 --- a/helm/metrics-api/templates/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: client-{{ include "metrics-api.fullname" . }} - labels: - {{- include "metrics-api.labels" . | nindent 4 }} -spec: - type: {{ .Values.metricsApi.service.type }} - ports: - - port: {{ .Values.metricsApi.service.port }} - targetPort: {{ .Values.metricsApi.service.targetPort }} - protocol: TCP - name: http - selector: - {{- include "metrics-api.selectorLabels" . | nindent 4 }} \ No newline at end of file diff --git a/helm/metrics-api/values.yaml b/helm/metrics-api/values.yaml deleted file mode 100644 index 7bdd27031..000000000 --- a/helm/metrics-api/values.yaml +++ /dev/null @@ -1,132 +0,0 @@ -# Metrics API values for videocall monitoring (minimal resources) -metricsApi: - # Image configuration - image: - repository: securityunion/rustlemania-api - pullPolicy: Always - tag: latest - - # Minimal resources for cost optimization - resources: - limits: - cpu: 50m - memory: 128Mi - requests: - cpu: 25m - memory: 64Mi - - # Single replica - replicas: 1 - - # Service configuration - service: - type: ClusterIP - port: 9091 - targetPort: 9091 - - # Environment variables - env: - METRICS_PORT: "9091" - NATS_URL: "nats://nats:4222" - REGION: "us-east" - SERVICE_TYPE: "metrics" - RUST_LOG: "warn,async_nats=warn" - TOKIO_WORKER_THREADS: "1" # Optimal for 50m CPU (metrics collection is I/O bound) - - # Health check configuration - livenessProbe: - httpGet: - path: /health - port: 9091 - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 3 - - readinessProbe: - httpGet: - path: /health - port: 9091 - initialDelaySeconds: 5 - periodSeconds: 5 - timeoutSeconds: 3 - failureThreshold: 3 - - # Security context - securityContext: - runAsUser: 1000 - runAsGroup: 1000 - - # Pod security context - podSecurityContext: - runAsUser: 1000 - runAsGroup: 1000 - fsGroup: 1000 - -# Separate Server Stats pod for connection tracking (stateless snapshot approach) -serverStats: - # Image configuration (same as metrics-api but different binary) - image: - repository: securityunion/rustlemania-api - pullPolicy: Always - tag: latest - - # Minimal resources for server connection tracking - resources: - limits: - cpu: 100m - memory: 128Mi - requests: - cpu: 50m - memory: 64Mi - - # Single replica - replicas: 1 - - # Service configuration - different port from client metrics - service: - type: ClusterIP - port: 9092 - targetPort: 9092 - - # Environment variables for server stats - env: - METRICS_PORT: "9092" - NATS_URL: "nats://nats:4222" - REGION: "us-east" - SERVICE_TYPE: "server-stats" - RUST_LOG: "debug,async_nats=info" - TOKIO_WORKER_THREADS: "1" # Optimal for 100m CPU (server stats aggregation is I/O bound) - - # Binary to run - command: ["/usr/bin/metrics_server_snapshot"] - - # Health check configuration - livenessProbe: - httpGet: - path: /health - port: 9092 - initialDelaySeconds: 30 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 3 - - readinessProbe: - httpGet: - path: /health - port: 9092 - initialDelaySeconds: 5 - periodSeconds: 5 - timeoutSeconds: 3 - failureThreshold: 3 - - # Security context - securityContext: - runAsUser: 1000 - runAsGroup: 1000 - - # Pod security context - podSecurityContext: - runAsUser: 1000 - runAsGroup: 1000 - fsGroup: 1000 \ No newline at end of file diff --git a/helm/rustlemania-ui/Chart.yaml b/helm/rustlemania-ui/Chart.yaml deleted file mode 100644 index 516575f1b..000000000 --- a/helm/rustlemania-ui/Chart.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: v2 -name: rustlemania-ui -description: A Helm chart for rustlemania-ui -type: application -version: 0.1.0 diff --git a/helm/rustlemania-ui/templates/NOTES.txt b/helm/rustlemania-ui/templates/NOTES.txt deleted file mode 100644 index 63317124b..000000000 --- a/helm/rustlemania-ui/templates/NOTES.txt +++ /dev/null @@ -1,22 +0,0 @@ -1. Get the application URL by running these commands: -{{- if .Values.ingress.enabled }} -{{- range $host := .Values.ingress.hosts }} - {{- range .paths }} - http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} - {{- end }} -{{- end }} -{{- else if contains "NodePort" .Values.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "rustlemania.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "rustlemania.fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "rustlemania.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") - echo http://$SERVICE_IP:{{ .Values.service.port }} -{{- else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "rustlemania.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") - echo "Visit http://127.0.0.1:8080 to use your application" - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT -{{- end }} diff --git a/helm/rustlemania-ui/templates/_helpers.tpl b/helm/rustlemania-ui/templates/_helpers.tpl deleted file mode 100644 index ed4b53c15..000000000 --- a/helm/rustlemania-ui/templates/_helpers.tpl +++ /dev/null @@ -1,62 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "rustlemania.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "rustlemania.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "rustlemania.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "rustlemania.labels" -}} -helm.sh/chart: {{ include "rustlemania.chart" . }} -{{ include "rustlemania.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "rustlemania.selectorLabels" -}} -app.kubernetes.io/name: {{ include "rustlemania.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "rustlemania.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "rustlemania.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} diff --git a/helm/rustlemania-ui/templates/configmap-configjs.yaml b/helm/rustlemania-ui/templates/configmap-configjs.yaml deleted file mode 100644 index b314a8315..000000000 --- a/helm/rustlemania-ui/templates/configmap-configjs.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "rustlemania.fullname" . }}-config - labels: - {{- include "rustlemania.labels" . | nindent 4 }} -data: - config.js: |- - {{ $cfg := default dict .Values.runtimeConfig }} - window.__APP_CONFIG = Object.freeze({{ $cfg | toJson }}); - diff --git a/helm/rustlemania-ui/templates/deployment.yaml b/helm/rustlemania-ui/templates/deployment.yaml deleted file mode 100644 index e2e2e2443..000000000 --- a/helm/rustlemania-ui/templates/deployment.yaml +++ /dev/null @@ -1,64 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "rustlemania.fullname" . }} - labels: - {{- include "rustlemania.labels" . | nindent 4 }} -spec: - {{- if not .Values.autoscaling.enabled }} - replicas: {{ .Values.replicaCount }} - {{- end }} - selector: - matchLabels: - {{- include "rustlemania.selectorLabels" . | nindent 6 }} - template: - metadata: - annotations: - checksum/config: {{ include (print $.Template.BasePath "/configmap-configjs.yaml") . | sha256sum }} - {{- with .Values.podAnnotations }} - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "rustlemania.selectorLabels" . | nindent 8 }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - containers: - - name: {{ include "rustlemania.fullname" . }} - securityContext: - {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - env: - {{- toYaml .Values.env | nindent 12 }} - ports: - - name: http - containerPort: {{ .Values.service.port }} - protocol: TCP - resources: - {{- toYaml .Values.resources | nindent 12 }} - volumeMounts: - - name: app-config - mountPath: /usr/share/nginx/html/config.js - subPath: config.js - readOnly: true - volumes: - - name: app-config - configMap: - name: {{ include "rustlemania.fullname" . }}-config - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} diff --git a/helm/rustlemania-ui/templates/hpa.yaml b/helm/rustlemania-ui/templates/hpa.yaml deleted file mode 100644 index 8e45acf14..000000000 --- a/helm/rustlemania-ui/templates/hpa.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if .Values.autoscaling.enabled }} -uiVersion: autoscaling/v2 -kind: HorizontalPodAutoscaler -metadata: - name: {{ include "rustlemania.fullname" . }} - labels: - {{- include "rustlemania.labels" . | nindent 4 }} -spec: - scaleTargetRef: - uiVersion: apps/v1 - kind: Deployment - name: {{ include "rustlemania.fullname" . }} - minReplicas: {{ .Values.autoscaling.minReplicas }} - maxReplicas: {{ .Values.autoscaling.maxReplicas }} - metrics: - {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} - - type: Resource - resource: - name: cpu - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} - {{- end }} - {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} - - type: Resource - resource: - name: memory - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} - {{- end }} -{{- end }} diff --git a/helm/rustlemania-ui/templates/ingress.yaml b/helm/rustlemania-ui/templates/ingress.yaml deleted file mode 100644 index dbe4a1e64..000000000 --- a/helm/rustlemania-ui/templates/ingress.yaml +++ /dev/null @@ -1,60 +0,0 @@ -{{- if .Values.ingress.enabled -}} -{{- $fullName := include "rustlemania.fullname" . -}} -{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} - {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} - {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} - {{- end }} -{{- end }} -{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1 -{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1beta1 -{{- else -}} -apiVersion: extensions/v1beta1 -{{- end }} -kind: Ingress -metadata: - name: {{ $fullName }} - labels: - {{- include "rustlemania.labels" . | nindent 4 }} - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} - ingressClassName: {{ .Values.ingress.className }} - {{- end }} - {{- if .Values.ingress.tls }} - tls: - {{- range .Values.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} - {{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ .host | quote }} - http: - paths: - {{- range .paths }} - - path: {{ .path }} - {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} - pathType: {{ .pathType }} - {{- end }} - backend: - {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} - service: - name: {{ .service.name }} - port: - number: {{ .service.port.number }} - {{- else }} - serviceName: {{ .service.name }} - servicePort: {{ .service.port.number }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} diff --git a/helm/rustlemania-ui/templates/redirect-ingress.yaml b/helm/rustlemania-ui/templates/redirect-ingress.yaml deleted file mode 100644 index 71ed16656..000000000 --- a/helm/rustlemania-ui/templates/redirect-ingress.yaml +++ /dev/null @@ -1,48 +0,0 @@ -{{- if .Values.ingress.enabled }} -{{- if and .Values.ingress.enabled .Values.ingress.redirect }} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ include "rustlemania.fullname" . }}-redirect - annotations: - cert-manager.io/issuer: letsencrypt-prod - nginx.ingress.kubernetes.io/ssl-redirect: "true" - kubernetes.io/tls-acme: "true" - # Some ingress-nginx versions reject the `$` character in this annotation (see - # https://github.com/kubernetes/ingress-nginx/issues/11175). Dropping `$request_uri` - # prevents the webhook from denying the ingress and fixes the 404 you were seeing - # on rustlemania.com. - nginx.ingress.kubernetes.io/permanent-redirect: "https://videocall.rs" - nginx.ingress.kubernetes.io/permanent-redirect-code: "308" -spec: - ingressClassName: {{ .Values.ingress.className }} - tls: - - secretName: rustlemania-ui-tls - hosts: - - rustlemania.com - - www.rustlemania.com - rules: - - host: rustlemania.com - http: - paths: - - path: / - pathType: Prefix - backend: - service: - # A backend must be specified, but will never be reached because of the redirect. - name: {{ include "rustlemania.fullname" . }} - port: - number: 80 - - host: www.rustlemania.com - http: - paths: - - path: / - pathType: Prefix - backend: - service: - # Same dummy backend; request will never reach it thanks to the redirect. - name: {{ include "rustlemania.fullname" . }} - port: - number: 80 -{{- end }} -{{- end }} \ No newline at end of file diff --git a/helm/rustlemania-ui/templates/service.yaml b/helm/rustlemania-ui/templates/service.yaml deleted file mode 100644 index ef779dc6f..000000000 --- a/helm/rustlemania-ui/templates/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "rustlemania.fullname" . }} - labels: - {{- include "rustlemania.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: http - protocol: TCP - name: http - selector: - {{- include "rustlemania.selectorLabels" . | nindent 4 }} diff --git a/helm/rustlemania-ui/values.yaml b/helm/rustlemania-ui/values.yaml deleted file mode 100644 index ec897a183..000000000 --- a/helm/rustlemania-ui/values.yaml +++ /dev/null @@ -1,68 +0,0 @@ -# Default values for rustlemania. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. -nameOverride: "" -fullnameOverride: "rustlemania-ui" - -replicaCount: 1 -image: - repository: securityunion/rustlemania-ui - pullPolicy: Always - tag: latest -resources: - limits: - cpu: "100m" # 100% of a single CPU - memory: "128Mi" # 128 * 1024 *1024 bytes - requests: - cpu: "50m" # 50% of a single CPU - memory: "64Mi"# 64 * 1024 *1024 bytes -podAnnotations: {} -podSecurityContext: {} -securityContext: {} -service: - type: ClusterIP - port: 80 -autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 100 - targetCPUUtilizationPercentage: 80 - targetMemoryUtilizationPercentage: 80 -nodeSelector: {} -tolerations: [] -affinity: {} - -runtimeConfig: - apiBaseUrl: "https://api.YOUR_DOMAIN_NAME" - wsUrl: "wss://websocket.YOUR_DOMAIN_NAME" - webTransportHost: "https://webtransport.YOUR_DOMAIN_NAME:443" - oauthEnabled: "false" - e2eeEnabled: "false" - webTransportEnabled: "true" - usersAllowedToStream: "" - serverElectionPeriodMs: 2000 - audioBitrateKbps: 16 - videoBitrateKbps: 160 - screenBitrateKbps: 160 - -ingress: - enabled: true - redirect: false - className: nginx - annotations: - cert-manager.io/issuer: letsencrypt-prod - nginx.ingress.kubernetes.io/ssl-redirect: "true" - kubernetes.io/tls-acme: "true" - hosts: - - host: app.YOUR_DOMAIN_NAME - paths: - - path: / - pathType: Prefix - service: - name: rustlemania-ui - port: - number: 80 - tls: - - secretName: rustlemania-ui-tls - hosts: - - app.YOUR_DOMAIN_NAME \ No newline at end of file diff --git a/helm/rustlemania-websocket/.helmignore b/helm/rustlemania-websocket/.helmignore deleted file mode 100644 index 0e8a0eb36..000000000 --- a/helm/rustlemania-websocket/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/helm/rustlemania-websocket/Chart.yaml b/helm/rustlemania-websocket/Chart.yaml deleted file mode 100644 index f0ecd6273..000000000 --- a/helm/rustlemania-websocket/Chart.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: v2 -name: rustlemania-websocket -description: A Helm chart for rustlemania -type: application -version: 0.1.0 diff --git a/helm/rustlemania-websocket/templates/NOTES.txt b/helm/rustlemania-websocket/templates/NOTES.txt deleted file mode 100644 index 63317124b..000000000 --- a/helm/rustlemania-websocket/templates/NOTES.txt +++ /dev/null @@ -1,22 +0,0 @@ -1. Get the application URL by running these commands: -{{- if .Values.ingress.enabled }} -{{- range $host := .Values.ingress.hosts }} - {{- range .paths }} - http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} - {{- end }} -{{- end }} -{{- else if contains "NodePort" .Values.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "rustlemania.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "rustlemania.fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "rustlemania.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") - echo http://$SERVICE_IP:{{ .Values.service.port }} -{{- else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "rustlemania.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") - echo "Visit http://127.0.0.1:8080 to use your application" - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT -{{- end }} diff --git a/helm/rustlemania-websocket/templates/_helpers.tpl b/helm/rustlemania-websocket/templates/_helpers.tpl deleted file mode 100644 index ed4b53c15..000000000 --- a/helm/rustlemania-websocket/templates/_helpers.tpl +++ /dev/null @@ -1,62 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "rustlemania.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "rustlemania.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "rustlemania.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "rustlemania.labels" -}} -helm.sh/chart: {{ include "rustlemania.chart" . }} -{{ include "rustlemania.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "rustlemania.selectorLabels" -}} -app.kubernetes.io/name: {{ include "rustlemania.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "rustlemania.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "rustlemania.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} diff --git a/helm/rustlemania-websocket/templates/deployment.yaml b/helm/rustlemania-websocket/templates/deployment.yaml deleted file mode 100644 index 0e5740859..000000000 --- a/helm/rustlemania-websocket/templates/deployment.yaml +++ /dev/null @@ -1,73 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "rustlemania.fullname" . }} - labels: - {{- include "rustlemania.labels" . | nindent 4 }} -spec: - {{- if not .Values.autoscaling.enabled }} - replicas: {{ .Values.replicaCount }} - {{- end }} - selector: - matchLabels: - {{- include "rustlemania.selectorLabels" . | nindent 6 }} - template: - metadata: - {{- with .Values.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "rustlemania.selectorLabels" . | nindent 8 }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - containers: - - name: {{ include "rustlemania.fullname" . }} - securityContext: - {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - env: - {{- toYaml .Values.env | nindent 12 }} - {{- if (lookup "v1" "Secret" .Release.Namespace "postgres-credentials") }} - - name: PG_PASSWORD - valueFrom: - secretKeyRef: - name: postgres-credentials - key: password - {{- end }} - {{- if (lookup "v1" "Secret" .Release.Namespace "google-oauth-credentials") }} - - name: OAUTH_CLIENT_ID - valueFrom: - secretKeyRef: - name: google-oauth-credentials - key: client-id - - name: OAUTH_CLIENT_SECRET - valueFrom: - secretKeyRef: - name: google-oauth-credentials - key: client-secret - {{- end }} - ports: - - name: ws-api - containerPort: {{ .Values.service.port }} - protocol: TCP - resources: - {{- toYaml .Values.resources | nindent 12 }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} diff --git a/helm/rustlemania-websocket/templates/hpa.yaml b/helm/rustlemania-websocket/templates/hpa.yaml deleted file mode 100644 index 80379e564..000000000 --- a/helm/rustlemania-websocket/templates/hpa.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if .Values.autoscaling.enabled }} -apiVersion: autoscaling/v2 -kind: HorizontalPodAutoscaler -metadata: - name: {{ include "rustlemania.fullname" . }} - labels: - {{- include "rustlemania.labels" . | nindent 4 }} -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: {{ include "rustlemania.fullname" . }} - minReplicas: {{ .Values.autoscaling.minReplicas }} - maxReplicas: {{ .Values.autoscaling.maxReplicas }} - metrics: - {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} - - type: Resource - resource: - name: cpu - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} - {{- end }} - {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} - - type: Resource - resource: - name: memory - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} - {{- end }} -{{- end }} diff --git a/helm/rustlemania-websocket/templates/ingress.yaml b/helm/rustlemania-websocket/templates/ingress.yaml deleted file mode 100644 index 940acf08d..000000000 --- a/helm/rustlemania-websocket/templates/ingress.yaml +++ /dev/null @@ -1,60 +0,0 @@ -{{- if .Values.ingress.enabled -}} -{{- $fullName := include "rustlemania.fullname" . -}} -{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} - {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} - {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} - {{- end }} -{{- end }} -{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1 -{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1beta1 -{{- else -}} -apiVersion: extensions/v1beta1 -{{- end }} -kind: Ingress -metadata: - name: {{ $fullName }} - labels: - {{- include "rustlemania.labels" . | nindent 4 }} - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} - ingressClassName: {{ .Values.ingress.className }} - {{- end }} - {{- if .Values.ingress.tls }} - tls: - {{- range .Values.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} - {{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ .host | quote }} - http: - paths: - {{- range .paths }} - - path: {{ .path }} - {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} - pathType: {{ .pathType }} - {{- end }} - backend: - {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} - service: - name: {{ $fullName }} - port: - number: {{ .service.port.number }} - {{- else }} - serviceName: {{ $fullName }} - servicePort: {{ .service.port.number }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} diff --git a/helm/rustlemania-websocket/templates/service.yaml b/helm/rustlemania-websocket/templates/service.yaml deleted file mode 100644 index 0672e4e8e..000000000 --- a/helm/rustlemania-websocket/templates/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "rustlemania.fullname" . }} - labels: - {{- include "rustlemania.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: 8080 - protocol: TCP - name: ws-api - selector: - {{- include "rustlemania.selectorLabels" . | nindent 4 }} diff --git a/helm/rustlemania-websocket/values.yaml b/helm/rustlemania-websocket/values.yaml deleted file mode 100644 index bd46e2a15..000000000 --- a/helm/rustlemania-websocket/values.yaml +++ /dev/null @@ -1,102 +0,0 @@ -# Default values for rustlemania. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. -nameOverride: "" -fullnameOverride: "rustlemania-websocket" - - -replicaCount: 1 -image: - repository: securityunion/rustlemania-api - pullPolicy: Always - tag: latest -env: - - name: RUST_LOG - value: warn - - name: ACTIX_PORT - value: "8080" - - name: NATS_URL - value: nats:4222 - - name: DATABASE_ENABLED - value: "false" - - name: DATABASE_URL - value: "postgres://postgres:$(PG_PASSWORD)@postgres-postgresql:5432/actix-api-db?sslmode=disable" - - name: TOKIO_WORKER_THREADS - value: "1" # Default for WebSocket services - adjust per region as needed - - name: REGION - value: "us-east" - - name: HOSTNAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: SERVER_ID - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: SERVICE_TYPE - value: websocket - - name: SERVER_STATS_INTERVAL_SECS - value: "5" - - name: OAUTH_AUTH_URL - value: "https://accounts.google.com/o/oauth2/v2/auth" - - name: OAUTH_TOKEN_URL - value: "https://oauth2.googleapis.com/token" - - name: OAUTH_REDIRECT_URL - value: "https://api.YOUR_DOMAIN_NAME/login/callback" - - name: UI_ENDPOINT - value: "https://app.YOUR_DOMAIN_NAME" - - name: COOKIE_DOMAIN - value: ".YOUR_DOMAIN_NAME" - -resources: - limits: - cpu: "500m" - memory: "384Mi" - requests: - cpu: "200m" - memory: "192Mi" -podAnnotations: {} -podSecurityContext: {} -securityContext: {} -service: - type: ClusterIP - port: 8080 -autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 100 - targetCPUUtilizationPercentage: 80 - targetMemoryUtilizationPercentage: 80 -nodeSelector: {} -tolerations: [] -affinity: {} - -ingress: - enabled: true - className: nginx - annotations: - cert-manager.io/issuer: letsencrypt-prod - nginx.ingress.kubernetes.io/ssl-redirect: "true" - kubernetes.io/tls-acme: "true" - hosts: - - host: websocket.YOUR_DOMAIN_NAME - paths: - - path: / - pathType: Prefix - service: - port: - number: 8080 - - host: api.YOUR_DOMAIN_NAME - paths: - - path: / - pathType: Prefix - service: - port: - number: 8080 - tls: - - secretName: websocket-tls - hosts: - - websocket.YOUR_DOMAIN_NAME - - secretName: api-tls - hosts: - - api.YOUR_DOMAIN_NAME \ No newline at end of file diff --git a/helm/rustlemania-webtransport/.helmignore b/helm/rustlemania-webtransport/.helmignore deleted file mode 100644 index 0e8a0eb36..000000000 --- a/helm/rustlemania-webtransport/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/helm/rustlemania-webtransport/Chart.yaml b/helm/rustlemania-webtransport/Chart.yaml deleted file mode 100644 index eec44911e..000000000 --- a/helm/rustlemania-webtransport/Chart.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: v2 -name: rustlemania-webtransport -description: A Helm chart for rustlemania -type: application -version: 0.1.0 diff --git a/helm/rustlemania-webtransport/templates/_helpers.tpl b/helm/rustlemania-webtransport/templates/_helpers.tpl deleted file mode 100644 index ed4b53c15..000000000 --- a/helm/rustlemania-webtransport/templates/_helpers.tpl +++ /dev/null @@ -1,62 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "rustlemania.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "rustlemania.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "rustlemania.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "rustlemania.labels" -}} -helm.sh/chart: {{ include "rustlemania.chart" . }} -{{ include "rustlemania.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "rustlemania.selectorLabels" -}} -app.kubernetes.io/name: {{ include "rustlemania.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "rustlemania.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "rustlemania.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} diff --git a/helm/rustlemania-webtransport/templates/certificate.yaml b/helm/rustlemania-webtransport/templates/certificate.yaml deleted file mode 100644 index cdca324a9..000000000 --- a/helm/rustlemania-webtransport/templates/certificate.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# This template creates a TLS certificate for the WebTransport service. -# The certificate is issued by the namespace-scoped Issuer and stored in a secret -# that will be mounted by the WebTransport pod. -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: {{ include "rustlemania.fullname" . }}-tls - labels: - {{- include "rustlemania.labels" . | nindent 4 }} -spec: - dnsNames: - - {{ .Values.certificateDomain }} - issuerRef: - group: cert-manager.io - kind: Issuer - name: {{ .Values.certificate.issuerName | default "letsencrypt-prod" }} - secretName: {{ .Values.tlsSecret | default (printf "%s-tls" (include "rustlemania.fullname" .)) }} - usages: - - digital signature - - key encipherment diff --git a/helm/rustlemania-webtransport/templates/deployment.yaml b/helm/rustlemania-webtransport/templates/deployment.yaml deleted file mode 100644 index cf445a688..000000000 --- a/helm/rustlemania-webtransport/templates/deployment.yaml +++ /dev/null @@ -1,68 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "rustlemania.fullname" . }} - labels: - {{- include "rustlemania.labels" . | nindent 4 }} -spec: - {{- if not .Values.autoscaling.enabled }} - replicas: {{ .Values.replicaCount }} - {{- end }} - selector: - matchLabels: - {{- include "rustlemania.selectorLabels" . | nindent 6 }} - template: - metadata: - {{- with .Values.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "rustlemania.selectorLabels" . | nindent 8 }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - containers: - - name: {{ include "rustlemania.fullname" . }} - securityContext: - {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - command: {{ .Values.command }} - args: {{ .Values.args }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - env: - {{- toYaml .Values.env | nindent 12 }} - ports: - - name: wt-api - containerPort: {{ .Values.service.port }} - protocol: UDP - - name: wt-api-health - containerPort: {{ .Values.service.healthPort }} - protocol: TCP - resources: - {{- toYaml .Values.resources | nindent 12 }} - volumeMounts: - - name: tls - mountPath: "/certs" - readOnly: true - volumes: - - name: tls - secret: - secretName: {{ .Values.tlsSecret }} - optional: true - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} diff --git a/helm/rustlemania-webtransport/templates/hpa.yaml b/helm/rustlemania-webtransport/templates/hpa.yaml deleted file mode 100644 index 80379e564..000000000 --- a/helm/rustlemania-webtransport/templates/hpa.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if .Values.autoscaling.enabled }} -apiVersion: autoscaling/v2 -kind: HorizontalPodAutoscaler -metadata: - name: {{ include "rustlemania.fullname" . }} - labels: - {{- include "rustlemania.labels" . | nindent 4 }} -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: {{ include "rustlemania.fullname" . }} - minReplicas: {{ .Values.autoscaling.minReplicas }} - maxReplicas: {{ .Values.autoscaling.maxReplicas }} - metrics: - {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} - - type: Resource - resource: - name: cpu - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} - {{- end }} - {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} - - type: Resource - resource: - name: memory - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} - {{- end }} -{{- end }} diff --git a/helm/rustlemania-webtransport/templates/loadbalancer.yaml b/helm/rustlemania-webtransport/templates/loadbalancer.yaml deleted file mode 100644 index 01f381389..000000000 --- a/helm/rustlemania-webtransport/templates/loadbalancer.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "rustlemania.fullname" . }}-lb - labels: - {{- include "rustlemania.labels" . | nindent 4 }} - {{- if .Values.loadBalancerAnnotations}} - annotations: - {{- range $key, $value := .Values.loadBalancerAnnotations }} - {{ $key }}: {{ $value | quote }} - {{- end }} - {{- end }} -spec: - type: LoadBalancer - selector: - {{- include "rustlemania.selectorLabels" . | nindent 4 }} - ports: - - protocol: TCP - port: {{ .Values.service.healthPort }} - targetPort: {{ .Values.service.healthPort }} - name: wt-api-health - - protocol: UDP - port: {{ .Values.service.port }} - targetPort: {{ .Values.service.port }} - name: wt-api diff --git a/helm/rustlemania-webtransport/values.yaml b/helm/rustlemania-webtransport/values.yaml deleted file mode 100644 index edb7ff2d1..000000000 --- a/helm/rustlemania-webtransport/values.yaml +++ /dev/null @@ -1,74 +0,0 @@ -# Default values for rustlemania. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. -nameOverride: "" -fullnameOverride: "rustlemania-webtransport" - -replicaCount: 1 -image: - repository: securityunion/rustlemania-api - pullPolicy: Always - tag: latest -command: ['webtransport_server'] -args: [] -tlsSecret: webtransport-tls -certificateDomain: "webtransport.YOUR_DOMAIN_NAME" -certificate: - issuerName: "letsencrypt-prod" -env: - - name: RUST_LOG - value: warn,quinn=warn,web-transport-quinn=warn,async_nats=warn - - name: NATS_URL - value: nats:4222 - - name: LISTEN_URL - value: 0.0.0.0:443 - - name: HEALTH_LISTEN_URL - value: 0.0.0.0:444 - - name: CERT_PATH - value: /certs/tls.crt - - name: KEY_PATH - value: /certs/tls.key - - name: TOKIO_WORKER_THREADS - value: "1" # Default for WebTransport services - adjust per region as needed - - name: TOKIO_BLOCKING_THREADS - value: "2" # Small pool for blocking crypto operations - - name: REGION - value: "us-east" - - name: HOSTNAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: SERVER_ID - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: SERVICE_TYPE - value: webtransport - - name: SERVER_STATS_INTERVAL_SECS - value: "5" -resources: - limits: - cpu: "500m" - memory: "768Mi" - requests: - cpu: "500m" - memory: "384Mi" -podAnnotations: {} -podSecurityContext: {} -securityContext: {} -service: - type: NodePort - port: 443 - healthPort: 444 -autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 100 - targetCPUUtilizationPercentage: 80 - targetMemoryUtilizationPercentage: 80 -nodeSelector: {} -tolerations: [] -affinity: {} -# Used to configure cloud provider specific LB service type -loadBalancerAnnotations: - external-dns.alpha.kubernetes.io/hostname: "webtransport.YOUR_DOMAIN_NAME" \ No newline at end of file diff --git a/helm/videocall-website/.helmignore b/helm/videocall-website/.helmignore deleted file mode 100644 index 0e8a0eb36..000000000 --- a/helm/videocall-website/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/helm/videocall-website/Chart.yaml b/helm/videocall-website/Chart.yaml deleted file mode 100644 index e0a11b63c..000000000 --- a/helm/videocall-website/Chart.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: v2 -name: videocall-website -description: A Helm chart for videocall-website -type: application -version: 0.1.0 diff --git a/helm/videocall-website/templates/NOTES.txt b/helm/videocall-website/templates/NOTES.txt deleted file mode 100644 index 67c60bffd..000000000 --- a/helm/videocall-website/templates/NOTES.txt +++ /dev/null @@ -1,22 +0,0 @@ -1. Get the application URL by running these commands: -{{- if .Values.ingress.enabled }} -{{- range $host := .Values.ingress.hosts }} - {{- range .paths }} - http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} - {{- end }} -{{- end }} -{{- else if contains "NodePort" .Values.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "videocall-website.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "videocall-website.fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "videocall-website.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") - echo http://$SERVICE_IP:{{ .Values.service.port }} -{{- else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "videocall-website.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") - echo "Visit http://127.0.0.1:8080 to use your application" - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT -{{- end }} diff --git a/helm/videocall-website/templates/_helpers.tpl b/helm/videocall-website/templates/_helpers.tpl deleted file mode 100644 index 2c720034d..000000000 --- a/helm/videocall-website/templates/_helpers.tpl +++ /dev/null @@ -1,62 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "videocall-website.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "videocall-website.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "videocall-website.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "videocall-website.labels" -}} -helm.sh/chart: {{ include "videocall-website.chart" . }} -{{ include "videocall-website.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "videocall-website.selectorLabels" -}} -app.kubernetes.io/name: {{ include "videocall-website.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "videocall-website.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "videocall-website.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} diff --git a/helm/videocall-website/templates/deployment.yaml b/helm/videocall-website/templates/deployment.yaml deleted file mode 100644 index c86dd986c..000000000 --- a/helm/videocall-website/templates/deployment.yaml +++ /dev/null @@ -1,55 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "videocall-website.fullname" . }} - labels: - {{- include "videocall-website.labels" . | nindent 4 }} -spec: - {{- if not .Values.autoscaling.enabled }} - replicas: {{ .Values.replicaCount }} - {{- end }} - selector: - matchLabels: - {{- include "videocall-website.selectorLabels" . | nindent 6 }} - template: - metadata: - {{- with .Values.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - app: videocall-website - {{- include "videocall-website.selectorLabels" . | nindent 8 }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - containers: - - name: {{ include "videocall-website.fullname" . }} - securityContext: - {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - env: - {{- toYaml .Values.env | nindent 12 }} - ports: - - name: website - containerPort: {{ .Values.service.port }} - protocol: TCP - resources: - {{- toYaml .Values.resources | nindent 12 }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} diff --git a/helm/videocall-website/templates/ingress.yaml b/helm/videocall-website/templates/ingress.yaml deleted file mode 100644 index 7287693d6..000000000 --- a/helm/videocall-website/templates/ingress.yaml +++ /dev/null @@ -1,60 +0,0 @@ -{{- if .Values.ingress.enabled -}} -{{- $fullName := include "videocall-website.fullname" . -}} -{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} - {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} - {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} - {{- end }} -{{- end }} -{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1 -{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1beta1 -{{- else -}} -apiVersion: extensions/v1beta1 -{{- end }} -kind: Ingress -metadata: - name: {{ $fullName }} - labels: - {{- include "videocall-website.labels" . | nindent 4 }} - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} - ingressClassName: {{ .Values.ingress.className }} - {{- end }} - {{- if .Values.ingress.tls }} - tls: - {{- range .Values.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} - {{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ .host | quote }} - http: - paths: - {{- range .paths }} - - path: {{ .path }} - {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} - pathType: {{ .pathType }} - {{- end }} - backend: - {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} - service: - name: {{ .service.name }} - port: - number: {{ .service.port.number }} - {{- else }} - serviceName: {{ .service.name }} - servicePort: {{ .service.port.number }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} diff --git a/helm/videocall-website/templates/service.yaml b/helm/videocall-website/templates/service.yaml deleted file mode 100644 index bf83124a7..000000000 --- a/helm/videocall-website/templates/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ .Values.service.name }} - labels: - {{- include "videocall-website.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: 80 - protocol: TCP - name: website - selector: - app: videocall-website \ No newline at end of file diff --git a/helm/videocall-website/values.yaml b/helm/videocall-website/values.yaml deleted file mode 100644 index ca1702663..000000000 --- a/helm/videocall-website/values.yaml +++ /dev/null @@ -1,71 +0,0 @@ -# Default values for videocall-website. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. -nameOverride: "" -fullnameOverride: "" - -replicaCount: 1 -image: - repository: securityunion/video-call-rs-website - pullPolicy: Always - tag: latest -env: - - name: RUST_LOG - value: info - - name: LISTEN_URL - value: "0.0.0.0:80" - - name: LEPTOS_SITE_ADDR - value: "0.0.0.0:80" -resources: - limits: - cpu: "50m" - memory: "10Mi" - requests: - cpu: "20m" - memory: "10Mi" -podAnnotations: {} -podSecurityContext: {} -securityContext: {} -service: - name: videocall-website - type: ClusterIP - port: 80 -autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 100 - targetCPUUtilizationPercentage: 80 - targetMemoryUtilizationPercentage: 80 -nodeSelector: {} -tolerations: [] -affinity: {} - -ingress: - enabled: true - className: nginx - annotations: - cert-manager.io/issuer: letsencrypt-prod - nginx.ingress.kubernetes.io/ssl-redirect: "true" - kubernetes.io/tls-acme: "true" - hosts: - - host: www.videocall.rs - paths: - - path: / - pathType: Prefix - service: - name: videocall-website - port: - number: 80 - - host: videocall.rs - paths: - - path: / - pathType: Prefix - service: - name: videocall-website - port: - number: 80 - tls: - - secretName: videocall-website-tls - hosts: - - videocall.rs - - www.videocall.rs diff --git a/helm/rustlemania-ui/.helmignore b/helm/videocall/.helmignore similarity index 99% rename from helm/rustlemania-ui/.helmignore rename to helm/videocall/.helmignore index 0e8a0eb36..898df4886 100644 --- a/helm/rustlemania-ui/.helmignore +++ b/helm/videocall/.helmignore @@ -21,3 +21,4 @@ .idea/ *.tmproj .vscode/ + diff --git a/helm/videocall/CHART_SUMMARY.md b/helm/videocall/CHART_SUMMARY.md new file mode 100644 index 000000000..f631cabdb --- /dev/null +++ b/helm/videocall/CHART_SUMMARY.md @@ -0,0 +1,388 @@ +# Videocall Unified Helm Chart - Summary + +## What Was Created + +A unified, production-ready Helm chart that combines all six videocall components into a single, well-architected deployment. + +### Chart Structure + +``` +helm/videocall/ +├── Chart.yaml # Chart metadata +├── values.yaml # Beautifully commented default values +├── .helmignore # Files to exclude from packaging +├── README.md # Comprehensive documentation +├── QUICKSTART.md # 5-minute getting started guide +├── MIGRATION.md # Migration guide from separate charts +├── CHART_SUMMARY.md # This file +└── templates/ + ├── _helpers.tpl # Component-aware helper functions + ├── NOTES.txt # Post-install instructions + ├── ui-deployment.yaml # UI component deployment + ├── ui-service.yaml # UI service with component selector + ├── ui-configmap.yaml # UI runtime configuration + ├── ui-ingress.yaml # UI ingress for HTTPS + ├── ui-hpa.yaml # UI horizontal pod autoscaler + ├── websocket-deployment.yaml # WebSocket deployment + ├── websocket-service.yaml # WebSocket service with component selector + ├── websocket-ingress.yaml # WebSocket ingress (supports multiple hosts) + ├── websocket-hpa.yaml # WebSocket autoscaler + ├── webtransport-deployment.yaml # WebTransport deployment + ├── webtransport-service.yaml # WebTransport LoadBalancer with component selector + ├── webtransport-certificate.yaml # WebTransport TLS certificate + ├── webtransport-hpa.yaml # WebTransport autoscaler + ├── website-deployment.yaml # Website deployment + ├── website-service.yaml # Website service with component selector + ├── website-ingress.yaml # Website ingress (apex + www) + ├── website-hpa.yaml # Website autoscaler + ├── metrics-client-deployment.yaml # Metrics client deployment (port 9091) + ├── metrics-client-service.yaml # Metrics client service with component selector + ├── metrics-server-deployment.yaml # Metrics server deployment (port 9092) + └── metrics-server-service.yaml # Metrics server service with component selector +``` + +## The Critical Fix: Component-Based Label Strategy + +### The Problem You Experienced + +When deploying all four charts with the same release pattern, services shared these labels: + +```yaml +# All components had the same labels +app.kubernetes.io/name: rustlemania (or videocall) +app.kubernetes.io/instance: my-release +``` + +This caused **selector collisions**: +- ❌ UI service would route to WebSocket pods +- ❌ WebSocket service would route to WebTransport pods +- ❌ WebTransport load balancer would route to Website pods +- ❌ Complete routing chaos! + +### The Solution: Component Differentiation + +Every resource now includes a **component label**: + +```yaml +app.kubernetes.io/component: ui|websocket|webtransport|website +``` + +#### Example: UI Component + +**Service Selector (templates/ui-service.yaml):** +```yaml +selector: + app.kubernetes.io/name: videocall + app.kubernetes.io/instance: my-release + app.kubernetes.io/component: ui # ← Only matches UI pods +``` + +**Pod Labels (templates/ui-deployment.yaml):** +```yaml +labels: + app.kubernetes.io/name: videocall + app.kubernetes.io/instance: my-release + app.kubernetes.io/component: ui # ← Matches service selector +``` + +#### Verification + +Run `helm template` and check selectors: + +```bash +$ helm template test . | grep -A 3 "selector:" + +# UI Service +selector: + app.kubernetes.io/component: ui + +# WebSocket Service +selector: + app.kubernetes.io/component: websocket + +# WebTransport LoadBalancer +selector: + app.kubernetes.io/component: webtransport + +# Website Service +selector: + app.kubernetes.io/component: website + +# Metrics Client Service +selector: + app.kubernetes.io/component: metrics-client + +# Metrics Server Service +selector: + app.kubernetes.io/component: metrics-server +``` + +✅ **Each service now routes ONLY to its own component's pods!** + +## Key Features + +### 1. Beautiful, Comprehensive Documentation + +Every value in `values.yaml` has detailed comments: + +```yaml +# Audio bitrate in kilobits per second +# Typical range: 8-32 kbps for voice +audioBitrateKbps: 16 +``` + +**Total documentation:** +- 700+ lines of commented values.yaml +- Comprehensive README.md with architecture details +- QUICKSTART.md for new users +- MIGRATION.md for existing deployments +- CHART_SUMMARY.md (this file) + +### 2. Component Enable/Disable Flags + +Deploy any combination of components: + +```yaml +ui: + enabled: true # ✓ Deploy UI +websocket: + enabled: true # ✓ Deploy WebSocket +webtransport: + enabled: false # ✗ Skip WebTransport (dev mode) +website: + enabled: false # ✗ Skip Website +metricsClient: + enabled: true # ✓ Deploy metrics client +metricsServer: + enabled: true # ✓ Deploy metrics server +``` + +### 3. Global Configuration + +Share common settings across components: + +```yaml +global: + domain: "videocall.rs" # Used by all ingress/cert configs + region: "us-east" # Injected into env vars + natsUrl: "nats:4222" # Shared NATS connection +``` + +### 4. Per-Component Customization + +Each component has full configuration: + +```yaml +websocket: + replicaCount: 5 + resources: + limits: + cpu: "2000m" + memory: "4Gi" + autoscaling: + enabled: true + minReplicas: 3 + maxReplicas: 20 + nodeSelector: + topology.kubernetes.io/region: "us-east-1" +``` + +### 5. Multi-Region Support + +UI supports comma-separated server lists: + +```yaml +ui: + runtimeConfig: + wsUrl: "wss://ws-us.videocall.rs,wss://ws-eu.videocall.rs" + webTransportHost: "https://wt-us.videocall.rs:443,https://wt-eu.videocall.rs:443" +``` + +Client automatically selects best server based on latency. + +### 6. Secret Integration + +Automatically uses secrets if available: + +```yaml +# In deployment template +{{- if (lookup "v1" "Secret" .Release.Namespace "postgres-credentials") }} +- name: PG_PASSWORD + valueFrom: + secretKeyRef: + name: postgres-credentials + key: password +{{- end }} +``` + +### 7. Production-Ready Defaults + +- ✅ Resource limits and requests defined +- ✅ Health check ports configured (WebTransport) +- ✅ TLS/SSL enabled by default +- ✅ cert-manager integration +- ✅ Horizontal Pod Autoscaler templates +- ✅ Pod anti-affinity options +- ✅ Node selector support + +## Usage Patterns + +### Pattern 1: Public Template (This Chart) + +Located at `helm/videocall/` - this is what users download and use: + +```bash +git clone https://github.com/security-union/videocall-rs +cd videocall-rs/helm/videocall +helm install my-app . -f my-values.yaml +``` + +### Pattern 2: Production Deployment (Your Use Case) + +In `helm-videocall-deployment/us-east/`, wrap the public chart: + +**Chart.yaml:** +```yaml +apiVersion: v2 +name: videocall-us-east +version: 0.1.0 +dependencies: + - name: videocall + version: 0.1.0 + repository: "file://../../../../helm/videocall" +``` + +**values.yaml:** +```yaml +videocall: # Namespace all values under chart name + global: + domain: "videocall.rs" + region: "us-east" + + ui: + fullnameOverride: "videocall-ui-us-east" + replicaCount: 3 + # ... production config + + websocket: + fullnameOverride: "websocket-us-east" + replicaCount: 5 + # ... production config +``` + +This pattern: +- ✅ Separates public template from production config +- ✅ Makes updates easy: `helm dependency update` +- ✅ Keeps your deployment values clean and focused +- ✅ Follows Helm best practices + +## Validation Results + +### Helm Lint + +```bash +$ helm lint . +==> Linting . +[INFO] Chart.yaml: icon is recommended +1 chart(s) linted, 0 chart(s) failed +``` + +✅ **Passes all validations** + +### Selector Verification + +```bash +$ helm template test . | grep -A 3 "selector:" + +# Results show each service has unique component label ✓ +``` + +### Template Rendering + +```bash +$ helm template test . --debug +# Successfully renders all 20 templates ✓ +``` + +## Installation Commands + +### Quick Install (All Components) + +```bash +helm install videocall ./helm/videocall \ + --set global.domain=yourdomain.com +``` + +### Custom Install (Select Components) + +```bash +helm install videocall ./helm/videocall \ + --set ui.enabled=true \ + --set websocket.enabled=true \ + --set webtransport.enabled=false \ + --set website.enabled=false \ + -f my-values.yaml +``` + +### Production Install (From Wrapper Chart) + +```bash +cd helm-videocall-deployment/us-east/videocall +helm dependency update +helm install videocall-us-east . -f values.yaml +``` + +## Benefits Over Separate Charts + +| Aspect | Before (4 Charts) | After (Unified) | +|--------|------------------|-----------------| +| **Selector Collision** | ❌ Services route to wrong pods | ✅ Component labels prevent collisions | +| **Deployment Complexity** | ❌ 4 helm install commands | ✅ 1 helm install command | +| **Configuration** | ❌ Duplicated across 4 files | ✅ Shared global config | +| **Maintenance** | ❌ Update 4 charts separately | ✅ Update 1 chart | +| **Documentation** | ❌ Scattered across charts | ✅ Centralized, comprehensive | +| **Version Control** | ❌ 4 chart versions to track | ✅ 1 unified version | +| **Partial Deployment** | ❌ Install/uninstall individual charts | ✅ Enable/disable flags | + +## Next Steps + +1. **Test the Chart:** + ```bash + cd helm/videocall + helm template test . > /tmp/test-output.yaml + kubectl apply --dry-run=client -f /tmp/test-output.yaml + ``` + +2. **Create Production Values:** + ```bash + cp values.yaml my-production-values.yaml + # Edit with your production settings + ``` + +3. **Deploy to Staging:** + ```bash + helm install videocall-staging . -f my-production-values.yaml -n staging + ``` + +4. **Verify Selectors:** + ```bash + kubectl get svc -n staging + kubectl get endpoints -n staging + # Ensure each service has correct endpoints + ``` + +5. **Update Deployment Repos:** + - Update `helm-videocall-deployment/us-east/` to use wrapper pattern + - Update `helm-videocall-deployment/singapore/` to use wrapper pattern + +## Support + +- **Chart Location**: `helm/videocall/` +- **Documentation**: See README.md, QUICKSTART.md, MIGRATION.md +- **Issues**: https://github.com/security-union/videocall-rs/issues +- **Discussions**: https://github.com/security-union/videocall-rs/discussions + +--- + +**Chart created with ❤️ to solve the selector collision problem!** + diff --git a/helm/videocall/Chart.yaml b/helm/videocall/Chart.yaml new file mode 100644 index 000000000..47b684b19 --- /dev/null +++ b/helm/videocall/Chart.yaml @@ -0,0 +1,18 @@ +apiVersion: v2 +name: videocall +description: A unified Helm chart for deploying the complete Videocall.rs application stack +type: application +version: 0.1.0 +appVersion: "1.0.0" +keywords: + - videocall + - webrtc + - rust + - real-time-communication +maintainers: + - name: Security Union + url: https://github.com/security-union +home: https://videocall.rs +sources: + - https://github.com/security-union/videocall-rs + diff --git a/helm/videocall/METRICS_COMPONENTS.md b/helm/videocall/METRICS_COMPONENTS.md new file mode 100644 index 000000000..9fc307e6a --- /dev/null +++ b/helm/videocall/METRICS_COMPONENTS.md @@ -0,0 +1,262 @@ +# Metrics Components + +The unified Videocall chart includes two dedicated metrics collection pods: + +## Component Overview + +### 1. Metrics Client (`metricsClient`) +- **Purpose**: Collects client-side metrics from NATS events +- **Port**: 9091 +- **Binary**: `/usr/bin/metrics_server` +- **Service Type**: ClusterIP +- **Resources**: Minimal (50m CPU, 128Mi memory) +- **Component Label**: `app.kubernetes.io/component: metrics-client` + +**What it collects**: +- Client connection events +- Media quality metrics +- User engagement statistics +- Client-side performance data + +### 2. Metrics Server (`metricsServer`) +- **Purpose**: Tracks server connection statistics and aggregates server stats +- **Port**: 9092 +- **Binary**: `/usr/bin/metrics_server_snapshot` +- **Service Type**: ClusterIP +- **Resources**: Minimal (100m CPU, 128Mi memory) +- **Component Label**: `app.kubernetes.io/component: metrics-server` + +**What it collects**: +- Active server connections per WebSocket/WebTransport server +- Server load distribution +- Connection state snapshots +- Server health metrics + +## Configuration + +### Enable/Disable Metrics + +```yaml +# Both metrics components enabled by default +metricsClient: + enabled: true + +metricsServer: + enabled: true +``` + +### Prometheus Annotations + +Both components include automatic Prometheus scraping annotations: + +```yaml +metricsClient: + podAnnotations: + prometheus.io/scrape: "true" + prometheus.io/port: "9091" + prometheus.io/path: "/metrics" + +metricsServer: + podAnnotations: + prometheus.io/scrape: "true" + prometheus.io/port: "9092" + prometheus.io/path: "/metrics" +``` + +### Resource Optimization + +Both components use minimal resources for cost optimization: + +```yaml +metricsClient: + resources: + limits: + cpu: "50m" # 0.05 CPU cores + memory: "128Mi" + requests: + cpu: "25m" + memory: "64Mi" + +metricsServer: + resources: + limits: + cpu: "100m" # Slightly higher for aggregation + memory: "128Mi" + requests: + cpu: "50m" + memory: "64Mi" +``` + +## Accessing Metrics + +### Via Port-Forward + +```bash +# Client metrics +kubectl port-forward svc/videocall-metrics-client 9091:9091 +curl http://localhost:9091/metrics + +# Server stats +kubectl port-forward svc/videocall-metrics-server 9092:9092 +curl http://localhost:9092/metrics +``` + +### Via Service Discovery + +```yaml +# Prometheus scrape config +scrape_configs: + - job_name: 'videocall-metrics' + kubernetes_sd_configs: + - role: service + relabel_configs: + - source_labels: [__meta_kubernetes_service_label_app_kubernetes_io_component] + regex: metrics-(client|server) + action: keep +``` + +## Health Checks + +Both components include health endpoints: + +- **Liveness Probe**: `/health` (checks if pod is alive) +- **Readiness Probe**: `/health` (checks if ready to serve traffic) + +## Security Context + +Both run as non-root user 1000 for security: + +```yaml +podSecurityContext: + runAsUser: 1000 + runAsGroup: 1000 + fsGroup: 1000 + +securityContext: + runAsUser: 1000 + runAsGroup: 1000 +``` + +## Service Selectors + +Each component has unique selectors to prevent routing collisions: + +```yaml +# Metrics Client Service +selector: + app.kubernetes.io/name: videocall + app.kubernetes.io/instance: my-release + app.kubernetes.io/component: metrics-client + +# Metrics Server Service +selector: + app.kubernetes.io/name: videocall + app.kubernetes.io/instance: my-release + app.kubernetes.io/component: metrics-server +``` + +## Deployment Example + +```yaml +# values.yaml +global: + domain: "videocall.rs" + region: "us-east" + natsUrl: "nats:4222" + +metricsClient: + enabled: true + replicaCount: 1 + env: + - name: METRICS_PORT + value: "9091" + - name: NATS_URL + value: nats:4222 + - name: REGION + value: "us-east" + +metricsServer: + enabled: true + replicaCount: 1 + env: + - name: METRICS_PORT + value: "9092" + - name: NATS_URL + value: nats:4222 + - name: REGION + value: "us-east" +``` + +## Verification + +After deployment, verify both metrics pods are running: + +```bash +# Check pods +kubectl get pods -l app.kubernetes.io/component=metrics-client +kubectl get pods -l app.kubernetes.io/component=metrics-server + +# Check services +kubectl get svc -l app.kubernetes.io/component=metrics-client +kubectl get svc -l app.kubernetes.io/component=metrics-server + +# Check endpoints +kubectl get endpoints | grep metrics +``` + +## Integration with Grafana + +Create a Grafana dashboard to visualize metrics from both endpoints: + +```yaml +# datasource.yaml +apiVersion: 1 +datasources: + - name: Videocall Metrics + type: prometheus + url: http://prometheus:9090 + access: proxy + isDefault: true +``` + +Query examples: +- Client metrics: `{job="videocall-metrics", component="metrics-client"}` +- Server stats: `{job="videocall-metrics", component="metrics-server"}` + +## Troubleshooting + +### Metrics not appearing in Prometheus + +1. Check pod annotations: + ```bash + kubectl get pods -l app.kubernetes.io/component=metrics-client -o jsonpath='{.items[0].metadata.annotations}' + ``` + +2. Verify service is exposing the right port: + ```bash + kubectl get svc videocall-metrics-client -o yaml + ``` + +3. Check Prometheus target status at `/targets` + +### Pod not starting + +1. Check logs: + ```bash + kubectl logs -l app.kubernetes.io/component=metrics-client + kubectl logs -l app.kubernetes.io/component=metrics-server + ``` + +2. Verify NATS connectivity: + ```bash + kubectl exec -it deployment/videocall-metrics-client -- sh + nc -zv nats 4222 + ``` + +### Health check failures + +Check health endpoint directly: +```bash +kubectl port-forward svc/videocall-metrics-client 9091:9091 +curl http://localhost:9091/health +``` diff --git a/helm/videocall/MIGRATION.md b/helm/videocall/MIGRATION.md new file mode 100644 index 000000000..5ae7ada28 --- /dev/null +++ b/helm/videocall/MIGRATION.md @@ -0,0 +1,305 @@ +# Migration Guide: From Separate Charts to Unified Videocall Chart + +This guide helps you migrate from the four separate Helm charts to the unified `videocall` chart. + +## The Problem We Solved + +Previously, deploying all four components from separate charts with similar naming could cause **selector label collisions**, where: + +- ❌ UI service might route to WebSocket pods +- ❌ WebSocket service might route to WebTransport pods +- ❌ WebTransport load balancer might route to Website pods +- ❌ All services shared the same `app.kubernetes.io/name` label + +## The Solution: Component-Based Labeling + +The unified chart uses a **component-specific label** to ensure each service only routes to its own pods: + +```yaml +# Each component gets a unique label +app.kubernetes.io/component: ui|websocket|webtransport|website +``` + +### Label Structure Example + +**UI Component:** +```yaml +# Pod labels (from Deployment) +labels: + app.kubernetes.io/name: videocall + app.kubernetes.io/instance: my-release + app.kubernetes.io/component: ui # <-- Unique identifier + +# Service selector (from Service) +selector: + app.kubernetes.io/name: videocall + app.kubernetes.io/instance: my-release + app.kubernetes.io/component: ui # <-- Matches only UI pods +``` + +**WebSocket Component:** +```yaml +# Pod labels +labels: + app.kubernetes.io/name: videocall + app.kubernetes.io/instance: my-release + app.kubernetes.io/component: websocket # <-- Different from UI + +# Service selector +selector: + app.kubernetes.io/name: videocall + app.kubernetes.io/instance: my-release + app.kubernetes.io/component: websocket # <-- Matches only WebSocket pods +``` + +This pattern is repeated for all four components, preventing any cross-component routing. + +## Migration Steps + +### Option 1: Clean Deployment (Recommended for Non-Production) + +1. **Uninstall old charts:** + ```bash + helm uninstall rustlemania-ui + helm uninstall rustlemania-websocket + helm uninstall rustlemania-webtransport + helm uninstall videocall-website + ``` + +2. **Create unified values file:** + ```bash + cat > my-values.yaml < my-values.yaml <<'EOF' +global: + domain: "example.com" # Replace with your domain + region: "us-east" + natsUrl: "nats:4222" + +ui: + enabled: true + ingress: + hosts: + - host: app.example.com + paths: + - path: / + pathType: Prefix + service: + name: videocall-ui + port: + number: 80 + runtimeConfig: + apiBaseUrl: "https://api.example.com" + wsUrl: "wss://websocket.example.com" + webTransportHost: "https://webtransport.example.com:443" + +websocket: + enabled: true + ingress: + hosts: + - host: websocket.example.com + paths: + - path: / + pathType: Prefix + service: + port: + number: 8080 + - host: api.example.com + paths: + - path: / + pathType: Prefix + service: + port: + number: 8080 + +webtransport: + enabled: true + certificateDomain: "webtransport.example.com" + loadBalancerAnnotations: + external-dns.alpha.kubernetes.io/hostname: "webtransport.example.com" + +website: + enabled: true + ingress: + hosts: + - host: example.com + paths: + - path: / + pathType: Prefix + service: + name: videocall-website + port: + number: 80 + - host: www.example.com + paths: + - path: / + pathType: Prefix + service: + name: videocall-website + port: + number: 80 +EOF +``` + +### 3. Install the Chart + +```bash +# Install with default namespace +helm install videocall . -f my-values.yaml + +# Or install in a specific namespace +kubectl create namespace videocall +helm install videocall . -f my-values.yaml -n videocall +``` + +### 4. Watch Deployment Progress + +```bash +# Watch pods come up +kubectl get pods -l app.kubernetes.io/instance=videocall -w + +# Check all resources +kubectl get all -l app.kubernetes.io/instance=videocall +``` + +## Verification + +### Check Services and Selectors + +```bash +# List all services +kubectl get svc -l app.kubernetes.io/instance=videocall + +# Verify each service has correct endpoints +kubectl get endpoints | grep videocall + +# Check that UI service only routes to UI pods +kubectl get endpoints videocall-ui -o yaml +``` + +You should see **each service routing only to its component's pods** thanks to the `app.kubernetes.io/component` label! + +### Check Ingress + +```bash +# Wait for ingress to be ready +kubectl get ingress -l app.kubernetes.io/instance=videocall + +# Check certificate status +kubectl get certificates +``` + +### Test the Application + +```bash +# Get the UI URL +echo "https://$(kubectl get ingress videocall-ui -o jsonpath='{.spec.rules[0].host}')" + +# Visit the URL in your browser +``` + +## Common Scenarios + +### Development: Run Only UI and WebSocket + +```bash +cat > dev-values.yaml < prod-values.yaml < us-east-values.yaml < +``` + +### Service Not Routing Correctly + +```bash +# Verify service selectors match pod labels +kubectl get svc videocall-ui -o yaml | grep -A 5 selector +kubectl get pods -l app.kubernetes.io/component=ui --show-labels + +# Check endpoints +kubectl get endpoints videocall-ui +``` + +**Expected:** Service selector should include `app.kubernetes.io/component: ui` and match pod labels. + +### Ingress 404 Errors + +```bash +# Check ingress configuration +kubectl describe ingress videocall-ui + +# Verify backend service exists +kubectl get svc videocall-ui + +# Check ingress controller logs +kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controller +``` + +### Certificate Not Issued + +```bash +# Check certificate status +kubectl get certificate +kubectl describe certificate videocall-ui-tls + +# Check cert-manager logs +kubectl logs -n cert-manager deploy/cert-manager + +# Verify issuer exists +kubectl get clusterissuer letsencrypt-prod +``` + +## Upgrading + +```bash +# Upgrade with new values +helm upgrade videocall . -f my-values.yaml + +# Upgrade specific component (disable others) +helm upgrade videocall . \ + --set ui.enabled=true \ + --set ui.replicaCount=5 + +# Rollback if needed +helm rollback videocall +``` + +## Uninstallation + +```bash +# Uninstall the release +helm uninstall videocall + +# Optional: Clean up PVCs and secrets +kubectl delete pvc -l app.kubernetes.io/instance=videocall +kubectl delete secret videocall-ui-tls websocket-tls api-tls webtransport-tls videocall-website-tls +``` + +## Next Steps + +- Read the full [README.md](README.md) for detailed configuration options +- Check [MIGRATION.md](MIGRATION.md) if migrating from separate charts +- Review [values.yaml](values.yaml) for all available configuration parameters +- Visit [videocall.rs](https://videocall.rs) for documentation + +## Getting Help + +- **GitHub Issues**: https://github.com/security-union/videocall-rs/issues +- **Discussions**: https://github.com/security-union/videocall-rs/discussions +- **Documentation**: https://videocall.rs + +--- + +**Happy Video Calling! 🎥** + diff --git a/helm/videocall/README.md b/helm/videocall/README.md new file mode 100644 index 000000000..868d4390a --- /dev/null +++ b/helm/videocall/README.md @@ -0,0 +1,128 @@ +# Videocall Helm Chart + +Unified chart for deploying the complete Videocall.rs stack. + +## Components + +- **UI** (port 80) - Web application +- **WebSocket** (port 8080) - Real-time signaling +- **WebTransport** (port 443 UDP) - High-performance media transport +- **Website** (port 80) - Marketing site +- **Metrics Client** (port 9091) - Client metrics collection +- **Metrics Server** (port 9092) - Server stats tracking + +All components can be independently enabled/disabled. + +## Quick Start + +```bash +# Clone repo +git clone https://github.com/security-union/videocall-rs.git +cd videocall-rs/helm/videocall + +# Install with defaults +helm install videocall . + +# Or with custom values +helm install videocall . -f my-values.yaml +``` + +## Configuration + +See [values.yaml](values.yaml) - every option is documented with comments. + +**Key settings:** + +```yaml +global: + domain: "yourdomain.com" + region: "us-east" + natsUrl: "nats:4222" + +ui: + enabled: true + replicaCount: 1 + +websocket: + enabled: true + +webtransport: + enabled: true + certificateDomain: "webtransport.yourdomain.com" + +website: + enabled: true + +metricsClient: + enabled: true + +metricsServer: + enabled: true +``` + +## Prerequisites + +- Kubernetes 1.19+ +- Helm 3.2.0+ +- NATS server +- cert-manager (for TLS) +- Ingress controller (nginx recommended) + +## Component Labels + +Each component uses unique labels to prevent selector collisions: + +```yaml +app.kubernetes.io/component: ui|websocket|webtransport|website|metrics-client|metrics-server +``` + +Services only route to their own component's pods. + +## Secrets + +**PostgreSQL** (if websocket database enabled): +```bash +kubectl create secret generic postgres-credentials --from-literal=password=YOUR_PASSWORD +``` + +**OAuth** (if enabled): +```bash +kubectl create secret generic google-oauth-credentials \ + --from-literal=client-id=YOUR_CLIENT_ID \ + --from-literal=client-secret=YOUR_CLIENT_SECRET +``` + +## Monitoring + +Metrics exposed on ports 9091 (client) and 9092 (server) with Prometheus annotations. + +```bash +# Access metrics +kubectl port-forward svc/videocall-metrics-client 9091:9091 +curl http://localhost:9091/metrics +``` + +## Troubleshooting + +```bash +# Check pods +kubectl get pods -l app.kubernetes.io/instance=videocall + +# Check logs by component +kubectl logs -l app.kubernetes.io/component=ui +kubectl logs -l app.kubernetes.io/component=websocket + +# Verify service endpoints +kubectl get endpoints +``` + +## More Info + +- **QUICKSTART.md** - 5-minute getting started guide +- **MIGRATION.md** - Migrating from separate charts +- **CHART_SUMMARY.md** - Technical deep-dive +- **METRICS_COMPONENTS.md** - Metrics setup guide + +## License + +Dual-licensed under Apache 2.0 and MIT. diff --git a/helm/videocall/templates/NOTES.txt b/helm/videocall/templates/NOTES.txt new file mode 100644 index 000000000..98a8a43c6 --- /dev/null +++ b/helm/videocall/templates/NOTES.txt @@ -0,0 +1,101 @@ +========================================================================= + ____ ____ _ _ _ _ + | _ \ / ___|| | ___ | |__ ___ _ __ ___ __ _| || |_ _ + | | | | | | |/ _ \| '_ \ / _ \ | '__| / _ \/ _` | || | | | | + | |_| | |___ | | (_) | |_) || __/ | | | __/ (_| | || | |_| | + |____/ \____||_|\___/|_.__/ \___| |_| \___|\__,_|_||_|\__, | + |___/ +========================================================================= + +Thank you for installing {{ .Chart.Name }} version {{ .Chart.Version }}! + +Your videocall application has been deployed with the following components: + +{{- if .Values.ui.enabled }} +✓ UI Application + - Accessible at: {{ range .Values.ui.ingress.hosts }}{{ .host }}{{ end }} + - Service: {{ include "videocall.componentFullname" (dict "root" . "component" "ui") }} + - Replicas: {{ .Values.ui.replicaCount }} +{{- end }} + +{{- if .Values.websocket.enabled }} +✓ WebSocket API Server + - Accessible at: {{ range .Values.websocket.ingress.hosts }}{{ .host }} {{ end }} + - Service: {{ include "videocall.componentFullname" (dict "root" . "component" "websocket") }} + - Replicas: {{ .Values.websocket.replicaCount }} +{{- end }} + +{{- if .Values.webtransport.enabled }} +✓ WebTransport Server + - Domain: {{ .Values.webtransport.certificateDomain }} + - Service: {{ include "videocall.componentFullname" (dict "root" . "component" "webtransport") }}-lb + - Replicas: {{ .Values.webtransport.replicaCount }} +{{- end }} + +{{- if .Values.website.enabled }} +✓ Marketing Website + - Accessible at: {{ range .Values.website.ingress.hosts }}{{ .host }} {{ end }} + - Service: {{ include "videocall.componentFullname" (dict "root" . "component" "website") }} + - Replicas: {{ .Values.website.replicaCount }} +{{- end }} + +{{- if .Values.metricsClient.enabled }} +✓ Metrics Client (Client Metrics Collection) + - Metrics endpoint: http://{{ include "videocall.componentFullname" (dict "root" . "component" "metrics-client") }}:{{ .Values.metricsClient.service.port }}/metrics + - Service: {{ include "videocall.componentFullname" (dict "root" . "component" "metrics-client") }} + - Replicas: {{ .Values.metricsClient.replicaCount }} +{{- end }} + +{{- if .Values.metricsServer.enabled }} +✓ Metrics Server (Server Stats Tracking) + - Metrics endpoint: http://{{ include "videocall.componentFullname" (dict "root" . "component" "metrics-server") }}:{{ .Values.metricsServer.service.port }}/metrics + - Service: {{ include "videocall.componentFullname" (dict "root" . "component" "metrics-server") }} + - Replicas: {{ .Values.metricsServer.replicaCount }} +{{- end }} + +========================================================================= + +To get the status of your deployment: + + kubectl get pods -l app.kubernetes.io/instance={{ .Release.Name }} + +To view logs for a specific component: + +{{- if .Values.ui.enabled }} + kubectl logs -l app.kubernetes.io/component=ui +{{- end }} +{{- if .Values.websocket.enabled }} + kubectl logs -l app.kubernetes.io/component=websocket +{{- end }} +{{- if .Values.webtransport.enabled }} + kubectl logs -l app.kubernetes.io/component=webtransport +{{- end }} +{{- if .Values.website.enabled }} + kubectl logs -l app.kubernetes.io/component=website +{{- end }} +{{- if .Values.metricsClient.enabled }} + kubectl logs -l app.kubernetes.io/component=metrics-client +{{- end }} +{{- if .Values.metricsServer.enabled }} + kubectl logs -l app.kubernetes.io/component=metrics-server +{{- end }} + +To access the application: +{{- if .Values.ui.enabled }} + + 1. Wait for the UI ingress to be ready: + kubectl wait --for=condition=ready ingress/{{ include "videocall.componentFullname" (dict "root" . "component" "ui") }} + + 2. Visit the application: + {{- range .Values.ui.ingress.hosts }} + https://{{ .host }} + {{- end }} +{{- end }} + +For more information about Videocall.rs: + - Documentation: https://videocall.rs + - GitHub: https://github.com/security-union/videocall-rs + - Issues: https://github.com/security-union/videocall-rs/issues + +========================================================================= + diff --git a/helm/videocall/templates/_helpers.tpl b/helm/videocall/templates/_helpers.tpl new file mode 100644 index 000000000..5c2019171 --- /dev/null +++ b/helm/videocall/templates/_helpers.tpl @@ -0,0 +1,108 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "videocall.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "videocall.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "videocall.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a component-specific fullname. +Usage: include "videocall.componentFullname" (dict "root" $ "component" "ui") +This creates names like: videocall-ui, videocall-websocket, etc. +*/}} +{{- define "videocall.componentFullname" -}} +{{- $componentConfig := index .root.Values .component }} +{{- if $componentConfig.fullnameOverride }} +{{- $componentConfig.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else if $componentConfig.nameOverride }} +{{- $componentConfig.nameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" (include "videocall.fullname" .root) .component | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} + +{{/* +Common labels - includes component label for proper resource grouping. +Usage: include "videocall.labels" (dict "root" $ "component" "ui") +*/}} +{{- define "videocall.labels" -}} +helm.sh/chart: {{ include "videocall.chart" .root }} +{{ include "videocall.selectorLabels" . }} +{{- if .root.Chart.AppVersion }} +app.kubernetes.io/version: {{ .root.Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .root.Release.Service }} +{{- end }} + +{{/* +Selector labels - CRITICAL: includes component label to prevent selector collisions. +This ensures each service only routes to its own component's pods. +Usage: include "videocall.selectorLabels" (dict "root" $ "component" "ui") + +Example output: + app.kubernetes.io/name: videocall + app.kubernetes.io/instance: my-release + app.kubernetes.io/component: ui +*/}} +{{- define "videocall.selectorLabels" -}} +app.kubernetes.io/name: {{ include "videocall.name" .root }} +app.kubernetes.io/instance: {{ .root.Release.Name }} +app.kubernetes.io/component: {{ .component }} +{{- end }} + +{{/* +Create the name of the service account to use. +*/}} +{{- define "videocall.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "videocall.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} + +{{/* +Generate the config.js content for the UI component. +This is injected as a ConfigMap and mounted into the UI container. +*/}} +{{- define "videocall.ui.configjs" -}} +window.CONFIG = { + API_BASE_URL: {{ .Values.ui.runtimeConfig.apiBaseUrl | quote }}, + WS_URL: {{ .Values.ui.runtimeConfig.wsUrl | quote }}, + WEB_TRANSPORT_HOST: {{ .Values.ui.runtimeConfig.webTransportHost | quote }}, + OAUTH_ENABLED: {{ .Values.ui.runtimeConfig.oauthEnabled | quote }}, + E2EE_ENABLED: {{ .Values.ui.runtimeConfig.e2eeEnabled | quote }}, + WEB_TRANSPORT_ENABLED: {{ .Values.ui.runtimeConfig.webTransportEnabled | quote }}, + USERS_ALLOWED_TO_STREAM: {{ .Values.ui.runtimeConfig.usersAllowedToStream | quote }}, + SERVER_ELECTION_PERIOD_MS: {{ .Values.ui.runtimeConfig.serverElectionPeriodMs }}, + AUDIO_BITRATE_KBPS: {{ .Values.ui.runtimeConfig.audioBitrateKbps }}, + VIDEO_BITRATE_KBPS: {{ .Values.ui.runtimeConfig.videoBitrateKbps }}, + SCREEN_BITRATE_KBPS: {{ .Values.ui.runtimeConfig.screenBitrateKbps }} +}; +{{- end }} + diff --git a/helm/videocall/templates/metrics-client-deployment.yaml b/helm/videocall/templates/metrics-client-deployment.yaml new file mode 100644 index 000000000..7f2572ff2 --- /dev/null +++ b/helm/videocall/templates/metrics-client-deployment.yaml @@ -0,0 +1,57 @@ +{{- if .Values.metricsClient.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "metrics-client") }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "metrics-client") | nindent 4 }} +spec: + replicas: {{ .Values.metricsClient.replicaCount }} + selector: + matchLabels: + {{- include "videocall.selectorLabels" (dict "root" . "component" "metrics-client") | nindent 6 }} + template: + metadata: + {{- with .Values.metricsClient.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "videocall.selectorLabels" (dict "root" . "component" "metrics-client") | nindent 8 }} + spec: + securityContext: + {{- toYaml .Values.metricsClient.podSecurityContext | nindent 8 }} + containers: + - name: metrics-client + securityContext: + {{- toYaml .Values.metricsClient.securityContext | nindent 12 }} + image: "{{ .Values.metricsClient.image.repository }}:{{ .Values.metricsClient.image.tag }}" + imagePullPolicy: {{ .Values.metricsClient.image.pullPolicy }} + command: {{ .Values.metricsClient.command }} + workingDir: {{ .Values.metricsClient.workingDir }} + env: + {{- toYaml .Values.metricsClient.env | nindent 12 }} + ports: + - name: http + containerPort: {{ .Values.metricsClient.service.targetPort }} + protocol: TCP + livenessProbe: + {{- toYaml .Values.metricsClient.livenessProbe | nindent 12 }} + readinessProbe: + {{- toYaml .Values.metricsClient.readinessProbe | nindent 12 }} + resources: + {{- toYaml .Values.metricsClient.resources | nindent 12 }} + {{- with .Values.metricsClient.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.metricsClient.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.metricsClient.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} + diff --git a/helm/videocall/templates/metrics-client-service.yaml b/helm/videocall/templates/metrics-client-service.yaml new file mode 100644 index 000000000..d33245a1b --- /dev/null +++ b/helm/videocall/templates/metrics-client-service.yaml @@ -0,0 +1,18 @@ +{{- if .Values.metricsClient.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "metrics-client") }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "metrics-client") | nindent 4 }} +spec: + type: {{ .Values.metricsClient.service.type }} + ports: + - port: {{ .Values.metricsClient.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "videocall.selectorLabels" (dict "root" . "component" "metrics-client") | nindent 4 }} +{{- end }} + diff --git a/helm/videocall/templates/metrics-server-deployment.yaml b/helm/videocall/templates/metrics-server-deployment.yaml new file mode 100644 index 000000000..03f5ff072 --- /dev/null +++ b/helm/videocall/templates/metrics-server-deployment.yaml @@ -0,0 +1,57 @@ +{{- if .Values.metricsServer.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "metrics-server") }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "metrics-server") | nindent 4 }} +spec: + replicas: {{ .Values.metricsServer.replicaCount }} + selector: + matchLabels: + {{- include "videocall.selectorLabels" (dict "root" . "component" "metrics-server") | nindent 6 }} + template: + metadata: + {{- with .Values.metricsServer.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "videocall.selectorLabels" (dict "root" . "component" "metrics-server") | nindent 8 }} + spec: + securityContext: + {{- toYaml .Values.metricsServer.podSecurityContext | nindent 8 }} + containers: + - name: metrics-server + securityContext: + {{- toYaml .Values.metricsServer.securityContext | nindent 12 }} + image: "{{ .Values.metricsServer.image.repository }}:{{ .Values.metricsServer.image.tag }}" + imagePullPolicy: {{ .Values.metricsServer.image.pullPolicy }} + command: {{ .Values.metricsServer.command }} + workingDir: {{ .Values.metricsServer.workingDir }} + env: + {{- toYaml .Values.metricsServer.env | nindent 12 }} + ports: + - name: http + containerPort: {{ .Values.metricsServer.service.targetPort }} + protocol: TCP + livenessProbe: + {{- toYaml .Values.metricsServer.livenessProbe | nindent 12 }} + readinessProbe: + {{- toYaml .Values.metricsServer.readinessProbe | nindent 12 }} + resources: + {{- toYaml .Values.metricsServer.resources | nindent 12 }} + {{- with .Values.metricsServer.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.metricsServer.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.metricsServer.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} + diff --git a/helm/videocall/templates/metrics-server-service.yaml b/helm/videocall/templates/metrics-server-service.yaml new file mode 100644 index 000000000..e7eac9f46 --- /dev/null +++ b/helm/videocall/templates/metrics-server-service.yaml @@ -0,0 +1,18 @@ +{{- if .Values.metricsServer.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "metrics-server") }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "metrics-server") | nindent 4 }} +spec: + type: {{ .Values.metricsServer.service.type }} + ports: + - port: {{ .Values.metricsServer.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "videocall.selectorLabels" (dict "root" . "component" "metrics-server") | nindent 4 }} +{{- end }} + diff --git a/helm/videocall/templates/ui-configmap.yaml b/helm/videocall/templates/ui-configmap.yaml new file mode 100644 index 000000000..d6965bd5f --- /dev/null +++ b/helm/videocall/templates/ui-configmap.yaml @@ -0,0 +1,12 @@ +{{- if .Values.ui.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "ui") }}-config + labels: + {{- include "videocall.labels" (dict "root" . "component" "ui") | nindent 4 }} +data: + config.js: | + {{- include "videocall.ui.configjs" . | nindent 4 }} +{{- end }} + diff --git a/helm/videocall/templates/ui-deployment.yaml b/helm/videocall/templates/ui-deployment.yaml new file mode 100644 index 000000000..8a49b4aac --- /dev/null +++ b/helm/videocall/templates/ui-deployment.yaml @@ -0,0 +1,65 @@ +{{- if .Values.ui.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "ui") }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "ui") | nindent 4 }} +spec: + {{- if not .Values.ui.autoscaling.enabled }} + replicas: {{ .Values.ui.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "videocall.selectorLabels" (dict "root" . "component" "ui") | nindent 6 }} + template: + metadata: + annotations: + checksum/config: {{ include (print $.Template.BasePath "/ui-configmap.yaml") . | sha256sum }} + {{- with .Values.ui.podAnnotations }} + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "videocall.selectorLabels" (dict "root" . "component" "ui") | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + securityContext: + {{- toYaml .Values.ui.podSecurityContext | nindent 8 }} + containers: + - name: ui + securityContext: + {{- toYaml .Values.ui.securityContext | nindent 12 }} + image: "{{ .Values.ui.image.repository }}:{{ .Values.ui.image.tag }}" + imagePullPolicy: {{ .Values.ui.image.pullPolicy }} + ports: + - name: http + containerPort: {{ .Values.ui.service.port }} + protocol: TCP + resources: + {{- toYaml .Values.ui.resources | nindent 12 }} + volumeMounts: + - name: app-config + mountPath: /usr/share/nginx/html/config.js + subPath: config.js + readOnly: true + volumes: + - name: app-config + configMap: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "ui") }}-config + {{- with .Values.ui.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.ui.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.ui.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} + diff --git a/helm/videocall/templates/ui-hpa.yaml b/helm/videocall/templates/ui-hpa.yaml new file mode 100644 index 000000000..4acfbcec2 --- /dev/null +++ b/helm/videocall/templates/ui-hpa.yaml @@ -0,0 +1,33 @@ +{{- if and .Values.ui.enabled .Values.ui.autoscaling.enabled }} +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "ui") }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "ui") | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "videocall.componentFullname" (dict "root" . "component" "ui") }} + minReplicas: {{ .Values.ui.autoscaling.minReplicas }} + maxReplicas: {{ .Values.ui.autoscaling.maxReplicas }} + metrics: + {{- if .Values.ui.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.ui.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.ui.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ .Values.ui.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} + diff --git a/helm/videocall/templates/ui-ingress.yaml b/helm/videocall/templates/ui-ingress.yaml new file mode 100644 index 000000000..8d53bde01 --- /dev/null +++ b/helm/videocall/templates/ui-ingress.yaml @@ -0,0 +1,42 @@ +{{- if and .Values.ui.enabled .Values.ui.ingress.enabled }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "ui") }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "ui") | nindent 4 }} + {{- with .Values.ui.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if .Values.ui.ingress.className }} + ingressClassName: {{ .Values.ui.ingress.className }} + {{- end }} + {{- if .Values.ui.ingress.tls }} + tls: + {{- range .Values.ui.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ui.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + pathType: {{ .pathType }} + backend: + service: + name: {{ .service.name | default (include "videocall.componentFullname" (dict "root" $ "component" "ui")) }} + port: + number: {{ .service.port.number }} + {{- end }} + {{- end }} +{{- end }} + diff --git a/helm/videocall/templates/ui-service.yaml b/helm/videocall/templates/ui-service.yaml new file mode 100644 index 000000000..c47aecd70 --- /dev/null +++ b/helm/videocall/templates/ui-service.yaml @@ -0,0 +1,18 @@ +{{- if .Values.ui.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "ui") }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "ui") | nindent 4 }} +spec: + type: {{ .Values.ui.service.type }} + ports: + - port: {{ .Values.ui.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "videocall.selectorLabels" (dict "root" . "component" "ui") | nindent 4 }} +{{- end }} + diff --git a/helm/videocall/templates/website-deployment.yaml b/helm/videocall/templates/website-deployment.yaml new file mode 100644 index 000000000..52408d712 --- /dev/null +++ b/helm/videocall/templates/website-deployment.yaml @@ -0,0 +1,57 @@ +{{- if .Values.website.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "website") }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "website") | nindent 4 }} +spec: + {{- if not .Values.website.autoscaling.enabled }} + replicas: {{ .Values.website.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "videocall.selectorLabels" (dict "root" . "component" "website") | nindent 6 }} + template: + metadata: + {{- with .Values.website.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "videocall.selectorLabels" (dict "root" . "component" "website") | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + securityContext: + {{- toYaml .Values.website.podSecurityContext | nindent 8 }} + containers: + - name: website + securityContext: + {{- toYaml .Values.website.securityContext | nindent 12 }} + image: "{{ .Values.website.image.repository }}:{{ .Values.website.image.tag }}" + imagePullPolicy: {{ .Values.website.image.pullPolicy }} + env: + {{- toYaml .Values.website.env | nindent 12 }} + ports: + - name: http + containerPort: {{ .Values.website.service.port }} + protocol: TCP + resources: + {{- toYaml .Values.website.resources | nindent 12 }} + {{- with .Values.website.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.website.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.website.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} + diff --git a/helm/videocall/templates/website-hpa.yaml b/helm/videocall/templates/website-hpa.yaml new file mode 100644 index 000000000..fe389e097 --- /dev/null +++ b/helm/videocall/templates/website-hpa.yaml @@ -0,0 +1,33 @@ +{{- if and .Values.website.enabled .Values.website.autoscaling.enabled }} +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "website") }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "website") | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "videocall.componentFullname" (dict "root" . "component" "website") }} + minReplicas: {{ .Values.website.autoscaling.minReplicas }} + maxReplicas: {{ .Values.website.autoscaling.maxReplicas }} + metrics: + {{- if .Values.website.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.website.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.website.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ .Values.website.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} + diff --git a/helm/videocall/templates/website-ingress.yaml b/helm/videocall/templates/website-ingress.yaml new file mode 100644 index 000000000..b538a5936 --- /dev/null +++ b/helm/videocall/templates/website-ingress.yaml @@ -0,0 +1,42 @@ +{{- if and .Values.website.enabled .Values.website.ingress.enabled }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "website") }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "website") | nindent 4 }} + {{- with .Values.website.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if .Values.website.ingress.className }} + ingressClassName: {{ .Values.website.ingress.className }} + {{- end }} + {{- if .Values.website.ingress.tls }} + tls: + {{- range .Values.website.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.website.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + pathType: {{ .pathType }} + backend: + service: + name: {{ .service.name }} + port: + number: {{ .service.port.number }} + {{- end }} + {{- end }} +{{- end }} + diff --git a/helm/videocall/templates/website-service.yaml b/helm/videocall/templates/website-service.yaml new file mode 100644 index 000000000..a19c1c7c0 --- /dev/null +++ b/helm/videocall/templates/website-service.yaml @@ -0,0 +1,18 @@ +{{- if .Values.website.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.website.service.name | default (include "videocall.componentFullname" (dict "root" . "component" "website")) }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "website") | nindent 4 }} +spec: + type: {{ .Values.website.service.type }} + ports: + - port: {{ .Values.website.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "videocall.selectorLabels" (dict "root" . "component" "website") | nindent 4 }} +{{- end }} + diff --git a/helm/videocall/templates/websocket-deployment.yaml b/helm/videocall/templates/websocket-deployment.yaml new file mode 100644 index 000000000..47168e9d7 --- /dev/null +++ b/helm/videocall/templates/websocket-deployment.yaml @@ -0,0 +1,76 @@ +{{- if .Values.websocket.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "websocket") }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "websocket") | nindent 4 }} +spec: + {{- if not .Values.websocket.autoscaling.enabled }} + replicas: {{ .Values.websocket.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "videocall.selectorLabels" (dict "root" . "component" "websocket") | nindent 6 }} + template: + metadata: + {{- with .Values.websocket.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "videocall.selectorLabels" (dict "root" . "component" "websocket") | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + securityContext: + {{- toYaml .Values.websocket.podSecurityContext | nindent 8 }} + containers: + - name: websocket + securityContext: + {{- toYaml .Values.websocket.securityContext | nindent 12 }} + image: "{{ .Values.websocket.image.repository }}:{{ .Values.websocket.image.tag }}" + imagePullPolicy: {{ .Values.websocket.image.pullPolicy }} + env: + {{- toYaml .Values.websocket.env | nindent 12 }} + {{- if (lookup "v1" "Secret" .Release.Namespace "postgres-credentials") }} + - name: PG_PASSWORD + valueFrom: + secretKeyRef: + name: postgres-credentials + key: password + {{- end }} + {{- if (lookup "v1" "Secret" .Release.Namespace "google-oauth-credentials") }} + - name: OAUTH_CLIENT_ID + valueFrom: + secretKeyRef: + name: google-oauth-credentials + key: client-id + - name: OAUTH_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: google-oauth-credentials + key: client-secret + {{- end }} + ports: + - name: ws-api + containerPort: {{ .Values.websocket.service.port }} + protocol: TCP + resources: + {{- toYaml .Values.websocket.resources | nindent 12 }} + {{- with .Values.websocket.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.websocket.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.websocket.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} + diff --git a/helm/videocall/templates/websocket-hpa.yaml b/helm/videocall/templates/websocket-hpa.yaml new file mode 100644 index 000000000..a32eacaa8 --- /dev/null +++ b/helm/videocall/templates/websocket-hpa.yaml @@ -0,0 +1,33 @@ +{{- if and .Values.websocket.enabled .Values.websocket.autoscaling.enabled }} +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "websocket") }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "websocket") | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "videocall.componentFullname" (dict "root" . "component" "websocket") }} + minReplicas: {{ .Values.websocket.autoscaling.minReplicas }} + maxReplicas: {{ .Values.websocket.autoscaling.maxReplicas }} + metrics: + {{- if .Values.websocket.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.websocket.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.websocket.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ .Values.websocket.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} + diff --git a/helm/videocall/templates/websocket-ingress.yaml b/helm/videocall/templates/websocket-ingress.yaml new file mode 100644 index 000000000..ef5ecebac --- /dev/null +++ b/helm/videocall/templates/websocket-ingress.yaml @@ -0,0 +1,42 @@ +{{- if and .Values.websocket.enabled .Values.websocket.ingress.enabled }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "websocket") }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "websocket") | nindent 4 }} + {{- with .Values.websocket.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if .Values.websocket.ingress.className }} + ingressClassName: {{ .Values.websocket.ingress.className }} + {{- end }} + {{- if .Values.websocket.ingress.tls }} + tls: + {{- range .Values.websocket.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.websocket.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + pathType: {{ .pathType }} + backend: + service: + name: {{ default (include "videocall.componentFullname" (dict "root" $ "component" "websocket")) .service.name }} + port: + number: {{ .service.port.number }} + {{- end }} + {{- end }} +{{- end }} + diff --git a/helm/videocall/templates/websocket-service.yaml b/helm/videocall/templates/websocket-service.yaml new file mode 100644 index 000000000..d53c13e5e --- /dev/null +++ b/helm/videocall/templates/websocket-service.yaml @@ -0,0 +1,18 @@ +{{- if .Values.websocket.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "websocket") }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "websocket") | nindent 4 }} +spec: + type: {{ .Values.websocket.service.type }} + ports: + - port: {{ .Values.websocket.service.port }} + targetPort: ws-api + protocol: TCP + name: ws-api + selector: + {{- include "videocall.selectorLabels" (dict "root" . "component" "websocket") | nindent 4 }} +{{- end }} + diff --git a/helm/videocall/templates/webtransport-certificate.yaml b/helm/videocall/templates/webtransport-certificate.yaml new file mode 100644 index 000000000..0adfcae7e --- /dev/null +++ b/helm/videocall/templates/webtransport-certificate.yaml @@ -0,0 +1,16 @@ +{{- if .Values.webtransport.enabled }} +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "webtransport") }}-cert + labels: + {{- include "videocall.labels" (dict "root" . "component" "webtransport") | nindent 4 }} +spec: + secretName: {{ .Values.webtransport.tlsSecret }} + issuerRef: + name: {{ .Values.webtransport.certificate.issuerName }} + kind: ClusterIssuer + dnsNames: + - {{ .Values.webtransport.certificateDomain }} +{{- end }} + diff --git a/helm/videocall/templates/webtransport-deployment.yaml b/helm/videocall/templates/webtransport-deployment.yaml new file mode 100644 index 000000000..5a17489ec --- /dev/null +++ b/helm/videocall/templates/webtransport-deployment.yaml @@ -0,0 +1,71 @@ +{{- if .Values.webtransport.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "webtransport") }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "webtransport") | nindent 4 }} +spec: + {{- if not .Values.webtransport.autoscaling.enabled }} + replicas: {{ .Values.webtransport.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "videocall.selectorLabels" (dict "root" . "component" "webtransport") | nindent 6 }} + template: + metadata: + {{- with .Values.webtransport.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "videocall.selectorLabels" (dict "root" . "component" "webtransport") | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + securityContext: + {{- toYaml .Values.webtransport.podSecurityContext | nindent 8 }} + containers: + - name: webtransport + securityContext: + {{- toYaml .Values.webtransport.securityContext | nindent 12 }} + image: "{{ .Values.webtransport.image.repository }}:{{ .Values.webtransport.image.tag }}" + command: {{ .Values.webtransport.command }} + args: {{ .Values.webtransport.args }} + imagePullPolicy: {{ .Values.webtransport.image.pullPolicy }} + env: + {{- toYaml .Values.webtransport.env | nindent 12 }} + ports: + - name: wt-api + containerPort: {{ .Values.webtransport.service.port }} + protocol: UDP + - name: wt-api-health + containerPort: {{ .Values.webtransport.service.healthPort }} + protocol: TCP + resources: + {{- toYaml .Values.webtransport.resources | nindent 12 }} + volumeMounts: + - name: tls + mountPath: "/certs" + readOnly: true + volumes: + - name: tls + secret: + secretName: {{ .Values.webtransport.tlsSecret }} + optional: true + {{- with .Values.webtransport.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.webtransport.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.webtransport.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} + diff --git a/helm/videocall/templates/webtransport-hpa.yaml b/helm/videocall/templates/webtransport-hpa.yaml new file mode 100644 index 000000000..8f609823b --- /dev/null +++ b/helm/videocall/templates/webtransport-hpa.yaml @@ -0,0 +1,33 @@ +{{- if and .Values.webtransport.enabled .Values.webtransport.autoscaling.enabled }} +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "webtransport") }} + labels: + {{- include "videocall.labels" (dict "root" . "component" "webtransport") | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "videocall.componentFullname" (dict "root" . "component" "webtransport") }} + minReplicas: {{ .Values.webtransport.autoscaling.minReplicas }} + maxReplicas: {{ .Values.webtransport.autoscaling.maxReplicas }} + metrics: + {{- if .Values.webtransport.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.webtransport.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.webtransport.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ .Values.webtransport.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} + diff --git a/helm/videocall/templates/webtransport-service.yaml b/helm/videocall/templates/webtransport-service.yaml new file mode 100644 index 000000000..55f1cb399 --- /dev/null +++ b/helm/videocall/templates/webtransport-service.yaml @@ -0,0 +1,28 @@ +{{- if .Values.webtransport.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "videocall.componentFullname" (dict "root" . "component" "webtransport") }}-lb + labels: + {{- include "videocall.labels" (dict "root" . "component" "webtransport") | nindent 4 }} + {{- if .Values.webtransport.loadBalancerAnnotations }} + annotations: + {{- range $key, $value := .Values.webtransport.loadBalancerAnnotations }} + {{ $key }}: {{ $value | quote }} + {{- end }} + {{- end }} +spec: + type: {{ .Values.webtransport.service.type }} + selector: + {{- include "videocall.selectorLabels" (dict "root" . "component" "webtransport") | nindent 4 }} + ports: + - protocol: TCP + port: {{ .Values.webtransport.service.healthPort }} + targetPort: wt-api-health + name: wt-api-health + - protocol: UDP + port: {{ .Values.webtransport.service.port }} + targetPort: wt-api + name: wt-api +{{- end }} + diff --git a/helm/videocall/values.yaml b/helm/videocall/values.yaml new file mode 100644 index 000000000..5fd0690e7 --- /dev/null +++ b/helm/videocall/values.yaml @@ -0,0 +1,966 @@ +# ============================================================================ +# Videocall.rs Helm Chart Values +# ============================================================================ +# This is the default values file for the Videocall.rs unified Helm chart. +# It deploys all four components of the video calling application: +# - UI (Web Application) +# - WebSocket API (Real-time signaling server) +# - WebTransport API (High-performance media transport) +# - Website (Marketing/landing pages) +# +# Each component can be independently enabled/disabled and configured. +# Override these values in your deployment-specific values.yaml file. +# ============================================================================ + +# ---------------------------------------------------------------------------- +# Global Configuration +# ---------------------------------------------------------------------------- +# Settings shared across all components + +global: + # Domain name for your videocall deployment + # This is used to construct default hostnames for all services + # Example: "videocall.rs" or "yourdomain.com" + domain: "YOUR_DOMAIN_NAME" + + # Deployment region identifier + # Used for multi-region deployments and service discovery + # Example: "us-east", "eu-west", "ap-south" + region: "us-east" + + # NATS server connection URL + # NATS is used for pub/sub messaging between components + # Format: "host:port" or comma-separated for cluster: "nats-1:4222,nats-2:4222" + natsUrl: "nats:4222" + + # Docker image pull policy + # Options: "Always", "IfNotPresent", "Never" + imagePullPolicy: Always + +# ---------------------------------------------------------------------------- +# UI Component Configuration +# ---------------------------------------------------------------------------- +# The frontend web application that users interact with +# Serves the React/Yew-based video calling interface + +ui: + # Enable or disable the UI component deployment + enabled: true + + # Override the component name (leave empty to use default: videocall-ui) + nameOverride: "" + + # Override the full resource name (leave empty to use chart-generated name) + fullnameOverride: "" + + # Number of UI pod replicas to run + # Increase for high availability and load distribution + replicaCount: 1 + + # Container image configuration + image: + # Docker image repository for the UI + repository: securityunion/rustlemania-ui + + # Image pull policy (overrides global if set) + pullPolicy: Always + + # Image tag (defaults to chart appVersion if not specified) + # Use "latest" for development, specific versions for production + tag: latest + + # Runtime configuration injected into the UI + # These values are written to config.js and loaded by the frontend + runtimeConfig: + # Base URL for the REST API + # Example: "https://api.videocall.rs" + apiBaseUrl: "https://api.YOUR_DOMAIN_NAME" + + # WebSocket server URL(s) for real-time signaling + # Supports comma-separated list for multi-region fallback + # Example: "wss://websocket.YOUR_DOMAIN_NAME" or "wss://ws-us.domain.com,wss://ws-eu.domain.com" + wsUrl: "wss://websocket.YOUR_DOMAIN_NAME" + + # WebTransport server URL(s) for high-performance media transport + # Supports comma-separated list for multi-region fallback + # Must include port (typically 443) + # Example: "https://webtransport.YOUR_DOMAIN_NAME:443" + webTransportHost: "https://webtransport.YOUR_DOMAIN_NAME:443" + + # Enable OAuth authentication (Google OAuth) + # Set to "true" to require users to sign in, "false" for anonymous access + oauthEnabled: "false" + + # Enable end-to-end encryption for media streams + # Requires client-side key exchange implementation + e2eeEnabled: "false" + + # Enable WebTransport protocol (recommended for best performance) + # Falls back to WebSocket if disabled or unavailable + webTransportEnabled: "true" + + # Comma-separated list of user IDs allowed to stream + # Empty string allows all users (default) + # Example: "user1@example.com,user2@example.com" + usersAllowedToStream: "" + + # Server election period in milliseconds + # How often clients re-evaluate which media server to connect to + # Lower values = faster failover, higher control plane load + serverElectionPeriodMs: 2000 + + # Audio bitrate in kilobits per second + # Typical range: 8-32 kbps for voice + audioBitrateKbps: 16 + + # Video bitrate in kilobits per second + # Typical range: 100-500 kbps for video calls + videoBitrateKbps: 160 + + # Screen sharing bitrate in kilobits per second + # Typical range: 200-1000 kbps depending on content + screenBitrateKbps: 160 + + # Resource limits and requests + resources: + # Maximum resources the container can use (enforced) + limits: + cpu: "100m" # 0.1 CPU cores + memory: "128Mi" # 128 mebibytes + + # Minimum resources guaranteed to the container + requests: + cpu: "50m" # 0.05 CPU cores + memory: "64Mi" # 64 mebibytes + + # Kubernetes service configuration + service: + # Service type: ClusterIP (internal), NodePort, LoadBalancer + type: ClusterIP + + # Port the service listens on + port: 80 + + # Ingress configuration for external access + ingress: + # Enable ingress resource creation + enabled: true + + # Ingress class name (e.g., "nginx", "traefik") + className: nginx + + # Ingress annotations for SSL, redirects, etc. + annotations: + cert-manager.io/issuer: letsencrypt-prod + nginx.ingress.kubernetes.io/ssl-redirect: "true" + kubernetes.io/tls-acme: "true" + + # Hostname and path configuration + hosts: + - host: app.YOUR_DOMAIN_NAME + paths: + - path: / + pathType: Prefix + service: + name: videocall-ui + port: + number: 80 + + # TLS/SSL certificate configuration + tls: + - secretName: videocall-ui-tls + hosts: + - app.YOUR_DOMAIN_NAME + + # Horizontal Pod Autoscaler configuration + autoscaling: + # Enable automatic scaling based on metrics + enabled: false + + # Minimum number of replicas + minReplicas: 1 + + # Maximum number of replicas + maxReplicas: 10 + + # Target CPU utilization percentage to trigger scaling + targetCPUUtilizationPercentage: 80 + + # Target memory utilization percentage to trigger scaling + targetMemoryUtilizationPercentage: 80 + + # Pod annotations (e.g., for Prometheus scraping) + podAnnotations: {} + + # Pod security context (run as non-root, etc.) + podSecurityContext: {} + + # Container security context + securityContext: {} + + # Node selector for pod placement + # Example: {topology.kubernetes.io/region: "us-east"} + nodeSelector: {} + + # Tolerations for node taints + tolerations: [] + + # Pod affinity/anti-affinity rules + affinity: {} + +# ---------------------------------------------------------------------------- +# WebSocket Component Configuration +# ---------------------------------------------------------------------------- +# Real-time signaling server using WebSocket protocol +# Handles user connections, room management, and message routing + +websocket: + # Enable or disable the WebSocket component deployment + enabled: true + + # Override the component name (leave empty to use default: videocall-websocket) + nameOverride: "" + + # Override the full resource name + fullnameOverride: "" + + # Number of WebSocket server pod replicas + # Scale horizontally for high concurrency + replicaCount: 1 + + # Container image configuration + image: + # Docker image repository (same as webtransport, different command) + repository: securityunion/rustlemania-api + + # Image pull policy + pullPolicy: Always + + # Image tag + tag: latest + + # Environment variables for the WebSocket server + env: + - name: RUST_LOG + # Rust logging level: trace, debug, info, warn, error + value: warn + + - name: ACTIX_PORT + # Port the Actix web server binds to inside the container + value: "8080" + + - name: NATS_URL + # NATS server connection (uses global.natsUrl by default in deployment) + value: nats:4222 + + - name: DATABASE_ENABLED + # Enable PostgreSQL database for persistence + value: "false" + + - name: DATABASE_URL + # PostgreSQL connection string (uses secret if DATABASE_ENABLED=true) + value: "postgres://postgres:$(PG_PASSWORD)@postgres-postgresql:5432/actix-api-db?sslmode=disable" + + - name: TOKIO_WORKER_THREADS + # Number of Tokio async runtime worker threads + # Recommended: 1-2 per CPU core for I/O-bound workloads + value: "1" + + - name: REGION + # Deployment region (uses global.region in deployment) + value: "us-east" + + - name: HOSTNAME + # Automatically populated with pod name via downward API + valueFrom: + fieldRef: + fieldPath: metadata.name + + - name: SERVER_ID + # Unique server identifier (uses pod name) + valueFrom: + fieldRef: + fieldPath: metadata.name + + - name: SERVICE_TYPE + # Service type identifier for metrics and logging + value: websocket + + - name: SERVER_STATS_INTERVAL_SECS + # How often to publish server statistics to NATS (seconds) + value: "5" + + - name: OAUTH_AUTH_URL + # Google OAuth authorization endpoint + value: "https://accounts.google.com/o/oauth2/v2/auth" + + - name: OAUTH_TOKEN_URL + # Google OAuth token endpoint + value: "https://oauth2.googleapis.com/token" + + - name: OAUTH_REDIRECT_URL + # OAuth callback URL (must match Google Cloud Console configuration) + value: "https://api.YOUR_DOMAIN_NAME/login/callback" + + - name: UI_ENDPOINT + # Frontend URL for OAuth redirects after login + value: "https://app.YOUR_DOMAIN_NAME" + + - name: COOKIE_DOMAIN + # Domain for session cookies (must include leading dot for subdomains) + value: ".YOUR_DOMAIN_NAME" + + # Resource limits and requests + # WebSocket servers are I/O-bound, tune based on concurrent connections + resources: + limits: + cpu: "500m" # 0.5 CPU cores + memory: "384Mi" # 384 mebibytes + requests: + cpu: "200m" # 0.2 CPU cores + memory: "192Mi" # 192 mebibytes + + # Kubernetes service configuration + service: + # Service type (ClusterIP for ingress-based routing) + type: ClusterIP + + # Service port + port: 8080 + + # Ingress configuration + ingress: + # Enable ingress + enabled: true + + # Ingress class + className: nginx + + # Annotations + annotations: + cert-manager.io/issuer: letsencrypt-prod + nginx.ingress.kubernetes.io/ssl-redirect: "true" + kubernetes.io/tls-acme: "true" + + # Multiple hostnames (WebSocket + API endpoints) + hosts: + - host: websocket.YOUR_DOMAIN_NAME + paths: + - path: / + pathType: Prefix + service: + port: + number: 8080 + - host: api.YOUR_DOMAIN_NAME + paths: + - path: / + pathType: Prefix + service: + port: + number: 8080 + + # TLS configuration for both hostnames + tls: + - secretName: websocket-tls + hosts: + - websocket.YOUR_DOMAIN_NAME + - secretName: api-tls + hosts: + - api.YOUR_DOMAIN_NAME + + # Horizontal Pod Autoscaler + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 10 + targetCPUUtilizationPercentage: 80 + targetMemoryUtilizationPercentage: 80 + + # Pod configuration + podAnnotations: {} + podSecurityContext: {} + securityContext: {} + nodeSelector: {} + tolerations: [] + affinity: {} + +# ---------------------------------------------------------------------------- +# WebTransport Component Configuration +# ---------------------------------------------------------------------------- +# High-performance media transport server using QUIC/WebTransport +# Handles audio/video streams with lower latency than WebSocket + +webtransport: + # Enable or disable the WebTransport component deployment + enabled: true + + # Override the component name + nameOverride: "" + + # Override the full resource name + fullnameOverride: "" + + # Number of WebTransport server replicas + # Scale based on concurrent media streams + replicaCount: 1 + + # Container image configuration + image: + # Same image as websocket, different entrypoint + repository: securityunion/rustlemania-api + + # Image pull policy + pullPolicy: Always + + # Image tag + tag: latest + + # Container command override (runs webtransport_server binary) + command: ['webtransport_server'] + + # Container command arguments + args: [] + + # TLS certificate secret name + # Must contain tls.crt and tls.key + tlsSecret: webtransport-tls + + # Domain name for TLS certificate + # Used by cert-manager to issue certificates + certificateDomain: "webtransport.YOUR_DOMAIN_NAME" + + # Certificate issuer configuration + certificate: + # Name of the cert-manager Issuer or ClusterIssuer + issuerName: "letsencrypt-prod" + + # Environment variables for WebTransport server + env: + - name: RUST_LOG + # Reduce logging for noisy QUIC libraries + value: warn,quinn=warn,web-transport-quinn=warn,async_nats=warn + + - name: NATS_URL + # NATS connection + value: nats:4222 + + - name: LISTEN_URL + # WebTransport listen address (UDP on port 443) + value: 0.0.0.0:443 + + - name: HEALTH_LISTEN_URL + # Health check HTTP server (TCP) + value: 0.0.0.0:444 + + - name: CERT_PATH + # Path to TLS certificate (mounted from secret) + value: /certs/tls.crt + + - name: KEY_PATH + # Path to TLS private key (mounted from secret) + value: /certs/tls.key + + - name: TOKIO_WORKER_THREADS + # Worker threads (WebTransport is compute-intensive due to crypto) + value: "1" + + - name: TOKIO_BLOCKING_THREADS + # Blocking thread pool for synchronous crypto operations + value: "2" + + - name: REGION + # Deployment region + value: "us-east" + + - name: HOSTNAME + # Pod name via downward API + valueFrom: + fieldRef: + fieldPath: metadata.name + + - name: SERVER_ID + # Unique server ID + valueFrom: + fieldRef: + fieldPath: metadata.name + + - name: SERVICE_TYPE + # Service type identifier + value: webtransport + + - name: SERVER_STATS_INTERVAL_SECS + # Statistics publishing interval + value: "5" + + # Resource configuration + # WebTransport is more resource-intensive due to QUIC crypto + resources: + limits: + cpu: "500m" # 0.5 CPU cores + memory: "768Mi" # 768 mebibytes + requests: + cpu: "500m" # 0.5 CPU cores (CPU-bound, request = limit) + memory: "384Mi" # 384 mebibytes + + # Kubernetes service configuration + service: + # NodePort or LoadBalancer required for UDP traffic + type: NodePort + + # WebTransport UDP port + port: 443 + + # Health check HTTP port (TCP) + healthPort: 444 + + # Load balancer annotations (cloud provider specific) + # Used when service.type is LoadBalancer + loadBalancerAnnotations: + # External DNS hostname registration + external-dns.alpha.kubernetes.io/hostname: "webtransport.YOUR_DOMAIN_NAME" + + # Example DigitalOcean annotations (adjust for your cloud provider) + # service.beta.kubernetes.io/do-loadbalancer-name: "webtransport-lb" + # service.beta.kubernetes.io/do-loadbalancer-protocol: "tcp" + # service.beta.kubernetes.io/do-loadbalancer-healthcheck-port: "444" + # service.beta.kubernetes.io/do-loadbalancer-healthcheck-path: "/healthz" + + # Horizontal Pod Autoscaler + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 10 + targetCPUUtilizationPercentage: 80 + targetMemoryUtilizationPercentage: 80 + + # Pod configuration + podAnnotations: {} + podSecurityContext: {} + securityContext: {} + nodeSelector: {} + tolerations: [] + affinity: {} + +# ---------------------------------------------------------------------------- +# Website Component Configuration +# ---------------------------------------------------------------------------- +# Marketing and informational website (built with Leptos) +# Serves landing pages, documentation, and public content + +website: + # Enable or disable the website component deployment + enabled: true + + # Override the component name + nameOverride: "" + + # Override the full resource name + fullnameOverride: "" + + # Number of website pod replicas + replicaCount: 1 + + # Container image configuration + image: + # Website Docker image + repository: securityunion/video-call-rs-website + + # Image pull policy + pullPolicy: Always + + # Image tag + tag: latest + + # Environment variables for the website + env: + - name: RUST_LOG + # Logging level + value: info + + - name: LISTEN_URL + # HTTP listen address + value: "0.0.0.0:80" + + - name: LEPTOS_SITE_ADDR + # Leptos framework listen address + value: "0.0.0.0:80" + + # Resource configuration + # Static website requires minimal resources + resources: + limits: + cpu: "50m" # 0.05 CPU cores + memory: "128Mi" # 128 mebibytes + requests: + cpu: "20m" # 0.02 CPU cores + memory: "64Mi" # 64 mebibytes + + # Kubernetes service configuration + service: + # Service name (defaults to component name if not specified) + name: videocall-website + + # Service type + type: ClusterIP + + # Service port + port: 80 + + # Ingress configuration + ingress: + # Enable ingress + enabled: true + + # Ingress class + className: nginx + + # Annotations + annotations: + cert-manager.io/issuer: letsencrypt-prod + nginx.ingress.kubernetes.io/ssl-redirect: "true" + kubernetes.io/tls-acme: "true" + + # Multiple hostnames (apex and www) + hosts: + - host: www.videocall.rs + paths: + - path: / + pathType: Prefix + service: + name: videocall-website + port: + number: 80 + - host: videocall.rs + paths: + - path: / + pathType: Prefix + service: + name: videocall-website + port: + number: 80 + + # TLS configuration + tls: + - secretName: videocall-website-tls + hosts: + - videocall.rs + - www.videocall.rs + + # Horizontal Pod Autoscaler + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 5 + targetCPUUtilizationPercentage: 80 + targetMemoryUtilizationPercentage: 80 + + # Pod configuration + podAnnotations: {} + podSecurityContext: {} + securityContext: {} + nodeSelector: {} + tolerations: [] + affinity: {} + +# ---------------------------------------------------------------------------- +# Additional Configuration +# ---------------------------------------------------------------------------- + +# Image pull secrets for private Docker registries +# Example: [{"name": "regcred"}] +imagePullSecrets: [] + +# Service account configuration (if needed) +serviceAccount: + # Specifies whether a service account should be created + create: false + + # Annotations to add to the service account + annotations: {} + + # The name of the service account to use + # If not set and create is true, a name is generated using fullname template + name: "" + +# ---------------------------------------------------------------------------- +# Metrics Client Component Configuration +# ---------------------------------------------------------------------------- +# Collects and aggregates client-side metrics from NATS +# Provides metrics endpoint for Prometheus scraping + +metricsClient: + # Enable or disable the metrics client component deployment + enabled: true + + # Override the component name + nameOverride: "" + + # Override the full resource name + fullnameOverride: "" + + # Number of metrics client pod replicas + # Typically one replica is sufficient for metrics collection + replicaCount: 1 + + # Container image configuration + image: + # Docker image repository (same as websocket/webtransport) + repository: securityunion/rustlemania-api + + # Image pull policy + pullPolicy: Always + + # Image tag + tag: latest + + # Container command override (runs metrics_server binary) + command: ["/usr/bin/metrics_server"] + + # Working directory inside container + workingDir: /app/actix-api + + # Environment variables for metrics client + env: + - name: METRICS_PORT + # Port for Prometheus metrics endpoint + value: "9091" + + - name: NATS_URL + # NATS connection for receiving metrics events + value: nats:4222 + + - name: REGION + # Deployment region + value: "us-east" + + - name: HOSTNAME + # Pod name via downward API + valueFrom: + fieldRef: + fieldPath: metadata.name + + - name: SERVER_ID + # Unique server ID + valueFrom: + fieldRef: + fieldPath: metadata.name + + - name: SERVICE_TYPE + # Service type identifier + value: metrics + + - name: RUST_LOG + # Logging level (reduced for metrics collection) + value: "warn,async_nats=warn" + + - name: TOKIO_WORKER_THREADS + # Single thread sufficient for I/O-bound metrics collection + value: "1" + + # Resource configuration (minimal for cost optimization) + resources: + limits: + cpu: "50m" # 0.05 CPU cores + memory: "128Mi" # 128 mebibytes + requests: + cpu: "25m" # 0.025 CPU cores + memory: "64Mi" # 64 mebibytes + + # Kubernetes service configuration + service: + # Service type + type: ClusterIP + + # Service port (Prometheus scrape port) + port: 9091 + + # Target port on pod + targetPort: 9091 + + # Liveness probe configuration + livenessProbe: + httpGet: + path: /health + port: 9091 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 + + # Readiness probe configuration + readinessProbe: + httpGet: + path: /health + port: 9091 + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 3 + + # Pod annotations (e.g., for Prometheus scraping) + podAnnotations: + prometheus.io/scrape: "true" + prometheus.io/port: "9091" + prometheus.io/path: "/metrics" + + # Pod security context + podSecurityContext: + runAsUser: 1000 + runAsGroup: 1000 + fsGroup: 1000 + + # Container security context + securityContext: + runAsUser: 1000 + runAsGroup: 1000 + + # Node selector for pod placement + nodeSelector: {} + + # Tolerations for node taints + tolerations: [] + + # Pod affinity/anti-affinity rules + affinity: {} + +# ---------------------------------------------------------------------------- +# Metrics Server Component Configuration +# ---------------------------------------------------------------------------- +# Tracks server connection statistics and publishes snapshots +# Separate from client metrics for different aggregation logic + +metricsServer: + # Enable or disable the metrics server component deployment + enabled: true + + # Override the component name + nameOverride: "" + + # Override the full resource name + fullnameOverride: "" + + # Number of metrics server pod replicas + # Single replica for stateless snapshot approach + replicaCount: 1 + + # Container image configuration + image: + # Docker image repository (same image, different binary) + repository: securityunion/rustlemania-api + + # Image pull policy + pullPolicy: Always + + # Image tag + tag: latest + + # Container command override (runs metrics_server_snapshot binary) + command: ["/usr/bin/metrics_server_snapshot"] + + # Working directory inside container + workingDir: /app/actix-api + + # Environment variables for metrics server + env: + - name: METRICS_PORT + # Port for Prometheus metrics endpoint (different from client) + value: "9092" + + - name: NATS_URL + # NATS connection for receiving server stats events + value: nats:4222 + + - name: REGION + # Deployment region + value: "us-east" + + - name: HOSTNAME + # Pod name via downward API + valueFrom: + fieldRef: + fieldPath: metadata.name + + - name: SERVER_ID + # Unique server ID + valueFrom: + fieldRef: + fieldPath: metadata.name + + - name: SERVICE_TYPE + # Service type identifier + value: server-stats + + - name: RUST_LOG + # Debug logging for server stats tracking + value: "debug,async_nats=info" + + - name: TOKIO_WORKER_THREADS + # Single thread for I/O-bound aggregation + value: "1" + + # Resource configuration + resources: + limits: + cpu: "100m" # 0.1 CPU cores (higher than client for aggregation) + memory: "128Mi" # 128 mebibytes + requests: + cpu: "50m" # 0.05 CPU cores + memory: "64Mi" # 64 mebibytes + + # Kubernetes service configuration + service: + # Service type + type: ClusterIP + + # Service port (Prometheus scrape port, different from client) + port: 9092 + + # Target port on pod + targetPort: 9092 + + # Liveness probe configuration + livenessProbe: + httpGet: + path: /health + port: 9092 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 + + # Readiness probe configuration + readinessProbe: + httpGet: + path: /health + port: 9092 + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 3 + + # Pod annotations (for Prometheus scraping) + podAnnotations: + prometheus.io/scrape: "true" + prometheus.io/port: "9092" + prometheus.io/path: "/metrics" + + # Pod security context + podSecurityContext: + runAsUser: 1000 + runAsGroup: 1000 + fsGroup: 1000 + + # Container security context + securityContext: + runAsUser: 1000 + runAsGroup: 1000 + + # Node selector for pod placement + nodeSelector: {} + + # Tolerations for node taints + tolerations: [] + + # Pod affinity/anti-affinity rules + affinity: {} + diff --git a/helm/website/.helmignore b/helm/website/.helmignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/helm/website/Chart.yaml b/helm/website/Chart.yaml deleted file mode 100644 index 336106f18..000000000 --- a/helm/website/Chart.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: v2 -name: website -description: A Helm chart for the website -type: application -version: 0.1.0 \ No newline at end of file diff --git a/helm/website/templates/_helpers.yaml b/helm/website/templates/_helpers.yaml deleted file mode 100644 index 904a3a4a7..000000000 --- a/helm/website/templates/_helpers.yaml +++ /dev/null @@ -1,62 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "webtransport-rs.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "webtransport-rs.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "webtransport-rs.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "webtransport-rs.labels" -}} -helm.sh/chart: {{ include "webtransport-rs.chart" . }} -{{ include "webtransport-rs.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "webtransport-rs.selectorLabels" -}} -app.kubernetes.io/name: {{ include "webtransport-rs.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "webtransport-rs.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "webtransport-rs.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/helm/website/templates/deployment.yaml b/helm/website/templates/deployment.yaml deleted file mode 100644 index a6f10f59c..000000000 --- a/helm/website/templates/deployment.yaml +++ /dev/null @@ -1,69 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "webtransport-rs.fullname" . }} - labels: - {{- include "webtransport-rs.labels" . | nindent 4 }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - {{- include "webtransport-rs.selectorLabels" . | nindent 6 }} - template: - metadata: - {{- with .Values.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "webtransport-rs.selectorLabels" . | nindent 8 }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - containers: - - name: {{ include "webtransport-rs.fullname" . }} - securityContext: - {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - command: {{ .Values.command }} - args: {{ .Values.args }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - env: - {{- toYaml .Values.env | nindent 12 }} - ports: - - name: wt-udp - containerPort: {{ .Values.service.port }} - protocol: UDP - - name: http - containerPort: {{ .Values.service.appPort }} - protocol: TCP - - name: health - containerPort: {{ .Values.service.healthPort }} - protocol: TCP - resources: - {{- toYaml .Values.resources | nindent 12 }} - volumeMounts: - - name: tls - mountPath: "/certs" - readOnly: true - volumes: - - name: tls - secret: - secretName: {{ .Values.tlsSecret }} - optional: true - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} \ No newline at end of file diff --git a/helm/website/templates/ingress.yaml b/helm/website/templates/ingress.yaml deleted file mode 100644 index f4afcb6f6..000000000 --- a/helm/website/templates/ingress.yaml +++ /dev/null @@ -1,60 +0,0 @@ -{{- if .Values.ingress.enabled -}} -{{- $fullName := include "webtransport-rs.fullname" . -}} -{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} - {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} - {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} - {{- end }} -{{- end }} -{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1 -{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1beta1 -{{- else -}} -apiVersion: extensions/v1beta1 -{{- end }} -kind: Ingress -metadata: - name: {{ $fullName }} - labels: - {{- include "webtransport-rs.labels" . | nindent 4 }} - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} - ingressClassName: {{ .Values.ingress.className }} - {{- end }} - {{- if .Values.ingress.tls }} - tls: - {{- range .Values.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} - {{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ .host | quote }} - http: - paths: - {{- range .paths }} - - path: {{ .path }} - {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} - pathType: {{ .pathType }} - {{- end }} - backend: - {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} - service: - name: {{ .service.name }} - port: - number: {{ .service.port.number }} - {{- else }} - serviceName: {{ .service.name }} - servicePort: {{ .service.port.number }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} \ No newline at end of file diff --git a/helm/website/templates/service.yaml b/helm/website/templates/service.yaml deleted file mode 100644 index d67385869..000000000 --- a/helm/website/templates/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "webtransport-rs.fullname" . }} - labels: - {{- include "webtransport-rs.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.appPort }} - targetPort: http - protocol: TCP - name: http - selector: - {{- include "webtransport-rs.selectorLabels" . | nindent 4 }} \ No newline at end of file diff --git a/helm/website/values.yaml b/helm/website/values.yaml deleted file mode 100644 index ad5f451c7..000000000 --- a/helm/website/values.yaml +++ /dev/null @@ -1,72 +0,0 @@ -# Default values for webtransport-rs. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. -nameOverride: "" -fullnameOverride: "" -replicaCount: 1 -image: - repository: securityunion/video-call-rs-website - pullPolicy: Always - tag: 260113d -tlsSecret: videocall-rs-tls -env: - - name: RUST_LOG - value: info,quinn=warn - - name: LISTEN_URL - value: 0.0.0.0:443 - - name: LEPTOS_SITE_ADDR - value: 0.0.0.0:80 - - name: CERT_PATH - value: /certs/tls.crt - - name: KEY_PATH - value: /certs/tls.key -resources: {} -podAnnotations: {} -podSecurityContext: {} -securityContext: {} -service: - type: NodePort - appPort: 80 - port: 443 - healthPort: 8080 -nodeSelector: - node-role: worker -tolerations: [] -affinity: - podAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: app - operator: Exists - topologyKey: "kubernetes.io/hostname" -ingress: - enabled: true - className: nginx - annotations: - cert-manager.io/issuer: letsencrypt-prod - nginx.ingress.kubernetes.io/ssl-redirect: "true" - kubernetes.io/tls-acme: "true" - external-dns.alpha.kubernetes.io/hostname: "videocall.rs" - hosts: - - host: www.videocall.rs - paths: - - path: / - pathType: Prefix - service: - name: videocall-rs - port: - number: 80 - - host: videocall.rs - paths: - - path: / - pathType: Prefix - service: - name: videocall-rs - port: - number: 80 - tls: - - secretName: webt-rs-tls - hosts: - - videocall.rs - - 'www.videocall.rs' \ No newline at end of file From 2eba156be536d3beed9b852eb7775f28a0474df4 Mon Sep 17 00:00:00 2001 From: Jay Boyd Date: Thu, 29 Jan 2026 21:38:48 -0600 Subject: [PATCH 3/3] tweaks necessary to make overhauled charts work (#531) * tweaks necessary to make overhauled charts work * fix typo on --- .../cert-manager-issuer/route53-issuer.yaml | 4 ++-- .../us-east/grafana/values.yaml | 2 +- helm/K3S_DEPLOYMENT_GUIDE.md | 2 +- helm/videocall/templates/_helpers.tpl | 24 +++++++++---------- .../templates/webtransport-certificate.yaml | 2 +- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/helm-videocall-deployment/infrastructure/cert-manager-issuer/route53-issuer.yaml b/helm-videocall-deployment/infrastructure/cert-manager-issuer/route53-issuer.yaml index 8269b6e18..14f92afe0 100644 --- a/helm-videocall-deployment/infrastructure/cert-manager-issuer/route53-issuer.yaml +++ b/helm-videocall-deployment/infrastructure/cert-manager-issuer/route53-issuer.yaml @@ -1,4 +1,4 @@ -piVersion: cert-manager.io/v1 +apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: letsencrypt-prod @@ -18,4 +18,4 @@ spec: key: aws_access_key_id secretAccessKeySecretRef: name: route53-creds - key: aws_secret_access_key \ No newline at end of file + key: aws_secret_access_key diff --git a/helm-videocall-deployment/us-east/grafana/values.yaml b/helm-videocall-deployment/us-east/grafana/values.yaml index 1d4bbeb4a..eef43f71a 100644 --- a/helm-videocall-deployment/us-east/grafana/values.yaml +++ b/helm-videocall-deployment/us-east/grafana/values.yaml @@ -36,7 +36,7 @@ grafana: enabled: true ingressClassName: nginx annotations: - cert-manager.io/cluster-issuer: "letsencrypt-prod" + cert-manager.io/issuer: "letsencrypt-prod" nginx.ingress.kubernetes.io/ssl-redirect: "true" hosts: - grafana.videocall.rs diff --git a/helm/K3S_DEPLOYMENT_GUIDE.md b/helm/K3S_DEPLOYMENT_GUIDE.md index d62cfb1e4..3a1ec9ffe 100644 --- a/helm/K3S_DEPLOYMENT_GUIDE.md +++ b/helm/K3S_DEPLOYMENT_GUIDE.md @@ -117,7 +117,7 @@ echo "Ingress IP Address: $IPADDR" Ensure you validate this IP address before proceeding, reset the environment variable if necessary. Then install NGINX: ```bash # Install NGINX Ingress Controller -helm install ingress-nginx helm/ingress-nginx \ +helm install ingress-nginx helm-videocall-deployment/infrastructure/ingress-nginx \ --create-namespace \ --namespace ingress-nginx \ --version 4.13.0 \ diff --git a/helm/videocall/templates/_helpers.tpl b/helm/videocall/templates/_helpers.tpl index 5c2019171..240579310 100644 --- a/helm/videocall/templates/_helpers.tpl +++ b/helm/videocall/templates/_helpers.tpl @@ -91,18 +91,18 @@ Generate the config.js content for the UI component. This is injected as a ConfigMap and mounted into the UI container. */}} {{- define "videocall.ui.configjs" -}} -window.CONFIG = { - API_BASE_URL: {{ .Values.ui.runtimeConfig.apiBaseUrl | quote }}, - WS_URL: {{ .Values.ui.runtimeConfig.wsUrl | quote }}, - WEB_TRANSPORT_HOST: {{ .Values.ui.runtimeConfig.webTransportHost | quote }}, - OAUTH_ENABLED: {{ .Values.ui.runtimeConfig.oauthEnabled | quote }}, - E2EE_ENABLED: {{ .Values.ui.runtimeConfig.e2eeEnabled | quote }}, - WEB_TRANSPORT_ENABLED: {{ .Values.ui.runtimeConfig.webTransportEnabled | quote }}, - USERS_ALLOWED_TO_STREAM: {{ .Values.ui.runtimeConfig.usersAllowedToStream | quote }}, - SERVER_ELECTION_PERIOD_MS: {{ .Values.ui.runtimeConfig.serverElectionPeriodMs }}, - AUDIO_BITRATE_KBPS: {{ .Values.ui.runtimeConfig.audioBitrateKbps }}, - VIDEO_BITRATE_KBPS: {{ .Values.ui.runtimeConfig.videoBitrateKbps }}, - SCREEN_BITRATE_KBPS: {{ .Values.ui.runtimeConfig.screenBitrateKbps }} +window.__APP_CONFIG = { + apiBaseUrl: {{ .Values.ui.runtimeConfig.apiBaseUrl | quote }}, + wsUrl: {{ .Values.ui.runtimeConfig.wsUrl | quote }}, + webTransportHost: {{ .Values.ui.runtimeConfig.webTransportHost | quote }}, + oauthEnabled: {{ .Values.ui.runtimeConfig.oauthEnabled | quote }}, + e2eeEnabled: {{ .Values.ui.runtimeConfig.e2eeEnabled | quote }}, + webTransportEnabled: {{ .Values.ui.runtimeConfig.webTransportEnabled | quote }}, + usersAllowedToStream: {{ .Values.ui.runtimeConfig.usersAllowedToStream | quote }}, + serverElectionPeriodMs: {{ .Values.ui.runtimeConfig.serverElectionPeriodMs }}, + audioBitrateKbps: {{ .Values.ui.runtimeConfig.audioBitrateKbps }}, + videoBitrateKbps: {{ .Values.ui.runtimeConfig.videoBitrateKbps }}, + screenBitrateKbps: {{ .Values.ui.runtimeConfig.screenBitrateKbps }} }; {{- end }} diff --git a/helm/videocall/templates/webtransport-certificate.yaml b/helm/videocall/templates/webtransport-certificate.yaml index 0adfcae7e..19a4e5fc3 100644 --- a/helm/videocall/templates/webtransport-certificate.yaml +++ b/helm/videocall/templates/webtransport-certificate.yaml @@ -9,7 +9,7 @@ spec: secretName: {{ .Values.webtransport.tlsSecret }} issuerRef: name: {{ .Values.webtransport.certificate.issuerName }} - kind: ClusterIssuer + kind: Issuer dnsNames: - {{ .Values.webtransport.certificateDomain }} {{- end }}