diff --git a/sandbox-demo-builder/blocks/rapidpro/Chart.yaml b/sandbox-demo-builder/blocks/rapidpro/Chart.yaml new file mode 100644 index 0000000..eea97a5 --- /dev/null +++ b/sandbox-demo-builder/blocks/rapidpro/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +name: rapidpro +description: RapidPro is an implementation of message building block + +type: application +version: 0.0.1 +appVersion: v4 + +dependencies: + - name: minio + version: 5.2.0 + repository: "https://charts.min.io/" \ No newline at end of file diff --git a/sandbox-demo-builder/blocks/rapidpro/README.md b/sandbox-demo-builder/blocks/rapidpro/README.md new file mode 100644 index 0000000..6e8d3eb --- /dev/null +++ b/sandbox-demo-builder/blocks/rapidpro/README.md @@ -0,0 +1,47 @@ +# RapidPro / Message Building Block +RapidPro is a platform for visually building interactive messaging applications. To learn more, please visit the project site at http://rapidpro.github.io/rapidpro. + +## Deployment + +https://github.com/rapidpro/rapidpro-docker + +https://riseuplabs.com/rapidpro-installation-guide/ + +https://github.com/nyaruka/rapidpro + + + +### Useful commands + +```shell +helm install rapidpro ./rapidpro/ --create-namespace --namespace rapidpro +``` + +```shell +helm upgrade --install rapidpro ./rapidpro/ --create-namespace --namespace rapidpro +``` + +```shell +helm install --debug --dry-run rapidpro ./rapidpro/ --create-namespace --namespace rapidpro +``` + +```shell +helm uninstall rapidpro --namespace rapidpro +``` + +### Installing separetly the MiniO helm Chart (toy-setup) + +Minimal toy setup for testing purposes can be deployed using: + +```bash +helm repo add minio https://charts.min.io/ +``` + +```bash +helm install --set resources.requests.memory=512Mi --set replicas=1 --set persistence.enabled=false --set mode=standalone --set rootUser=rootuser,rootPassword=rootpass123 --generate-name minio/minio --namespace rapidpro +``` + + +## Alternatives repositories + +https://github.com/onaio/helm-chart-rapidpro \ No newline at end of file diff --git a/sandbox-demo-builder/blocks/rapidpro/client/Dockerfile b/sandbox-demo-builder/blocks/rapidpro/client/Dockerfile new file mode 100644 index 0000000..9efc979 --- /dev/null +++ b/sandbox-demo-builder/blocks/rapidpro/client/Dockerfile @@ -0,0 +1,12 @@ +FROM python:3.9 + +ADD connect.py . + +RUN pip install minio + +# Set environment variables +ENV MINIO_HOST=rapidpro-minio +ENV MINIO_ACCESS_KEY=admin +ENV MINIO_SECRET_KEY=admin123 + +CMD ["python", "./connect.py"] \ No newline at end of file diff --git a/sandbox-demo-builder/blocks/rapidpro/client/connect.py b/sandbox-demo-builder/blocks/rapidpro/client/connect.py new file mode 100644 index 0000000..9d1d502 --- /dev/null +++ b/sandbox-demo-builder/blocks/rapidpro/client/connect.py @@ -0,0 +1,23 @@ +import os +import logging +from minio import Minio +logging.basicConfig(level=logging.INFO) + +# Read environment variables +minio_host = os.getenv('MINIO_HOST', 'localhost:9000') # Default to 'localhost:9000' if not set +minio_access_key = os.getenv('MINIO_ACCESS_KEY', 'admin') +minio_secret_key = os.getenv('MINIO_SECRET_KEY', 'admin123') + +client = Minio( + minio_host, + minio_access_key, + minio_secret_key, + secure=False +) + +buckets = client.list_buckets() +logging.info("print buckets names ...") + +for bucket in buckets: + print(bucket.name) + logging.info(bucket.name) diff --git a/sandbox-demo-builder/blocks/rapidpro/templates/mailroom.yaml b/sandbox-demo-builder/blocks/rapidpro/templates/mailroom.yaml new file mode 100644 index 0000000..7489447 --- /dev/null +++ b/sandbox-demo-builder/blocks/rapidpro/templates/mailroom.yaml @@ -0,0 +1,63 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Values.mailroom.name }} + labels: + app: {{ .Values.mailroom.name }} +spec: + replicas: 1 + selector: + matchLabels: + app: {{ .Values.mailroom.name }} + template: + metadata: + labels: + app: {{ .Values.mailroom.name }} + spec: + containers: + - name: {{ .Values.mailroom.name }} + image: {{ .Values.mailroom.containers.image }} + imagePullPolicy: {{ .Values.mailroom.containers.imagePullPolicy }} + + ports: + - containerPort: {{.Values.mailroom.service.port }} + env: + - name: MAILROOM_PORT + value: "{{.Values.mailroom.service.port }}" + - name: MAILROOM_DB + value: "postgres://temba:temba@postgres:5432/temba?sslmode=disable" + - name: MAILROOM_REDIS + value: "redis://redis:6379/15" + - name: MAILROOM_LOG_LEVEL + value: "DEBUG" + - name: MAILROOM_AWS_ACCESS_KEY_ID + value: "admin" + - name: MAILROOM_AWS_SECRET_ACCESS_KEY + value: "admin123" + - name: MAILROOM_SECURE + value: "false" + - name: MAILROOM_S3_ENDPOINT + value: "rapidpro-minio:9000" + - name: MAILROOM_S3_SESSIONS_BUCKET + value: temba-sessions + - name: MAILROOM_S3_ATTACHMENTS_BUCKET + value: temba-attachments + - name: MAILROOM_S3_LOGS_BUCKET + value: temba-logs + + +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.mailroom.service.name }} + labels: + app: {{ .Values.mailroom.name }} +spec: + ports: + - port: {{ .Values.mailroom.service.port }} + targetPort: {{ .Values.mailroom.service.targetPort }} + protocol: TCP + name: http + selector: + app: {{ .Values.mailroom.service.name }} diff --git a/sandbox-demo-builder/blocks/rapidpro/templates/minio-client.yaml b/sandbox-demo-builder/blocks/rapidpro/templates/minio-client.yaml new file mode 100644 index 0000000..f14cfa8 --- /dev/null +++ b/sandbox-demo-builder/blocks/rapidpro/templates/minio-client.yaml @@ -0,0 +1,31 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: minio-client + labels: + app: minio-client +spec: + replicas: 1 + selector: + matchLabels: + app: minio-client + template: + metadata: + labels: + app: minio-client + spec: + containers: + - name: minio-client + image: oleksiidn/minio-client:logs + imagePullPolicy: {{ .Values.mailroom.containers.imagePullPolicy }} + + ports: + - containerPort: 8060 + env: + - name: MINIO_HOST + value: "rapidpro-minio:9000" + - name: MINIO_ACCESS_KEY + value: "admin" + - name: MINIO_SECRET_KEY + value: "admin123" + diff --git a/sandbox-demo-builder/blocks/rapidpro/templates/postgres.yaml b/sandbox-demo-builder/blocks/rapidpro/templates/postgres.yaml new file mode 100644 index 0000000..ff3c125 --- /dev/null +++ b/sandbox-demo-builder/blocks/rapidpro/templates/postgres.yaml @@ -0,0 +1,61 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ .Values.postgresql.service.name }} + namespace: {{ .Release.Namespace }} + labels: + app: {{ .Values.postgresql.service.name }} +spec: + replicas: 1 + serviceName: {{ .Values.postgresql.service.name }} + selector: + matchLabels: + app: {{ .Values.postgresql.service.name }} + template: + metadata: + labels: + app: {{ .Values.postgresql.service.name }} + spec: + containers: + - image: {{ .Values.postgresql.containers.image }} + name: {{ .Values.postgresql.containers.name }} + env: + - name: POSTGRES_DB + value: {{ .Values.postgresql.statefulset.databaseName }} + - name: POSTGRES_PASSWORD + value: {{ .Values.postgresql.statefulset.password }} + - name: POSTGRES_USER + value: {{ .Values.postgresql.statefulset.username }} + + ports: + - containerPort: {{ .Values.postgresql.service.port }} + name: postgres + volumeMounts: + - name: {{ .Values.global.name }} + mountPath: {{ .Values.postgresql.statefulset.spec.mountPath }} + volumeClaimTemplates: + - metadata: + name: {{ .Values.global.name }} + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .Values.postgresql.statefulset.spec.storage }} + +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.postgresql.service.name }} + namespace: {{ .Release.Namespace }} + labels: + app: {{ .Values.postgresql.service.name }} +spec: + ports: + - protocol: TCP + port: {{ .Values.postgresql.service.port }} + targetPort: {{ .Values.postgresql.service.port }} + selector: + app: {{ .Values.postgresql.service.name }} + clusterIP: None \ No newline at end of file diff --git a/sandbox-demo-builder/blocks/rapidpro/templates/rapidpro.yaml b/sandbox-demo-builder/blocks/rapidpro/templates/rapidpro.yaml new file mode 100644 index 0000000..d49ee92 --- /dev/null +++ b/sandbox-demo-builder/blocks/rapidpro/templates/rapidpro.yaml @@ -0,0 +1,102 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Values.rapidpro.name }} + labels: + app: {{ .Values.rapidpro.name }} +spec: + replicas: 1 + selector: + matchLabels: + app: rapidpro + template: + metadata: + labels: + app: {{ .Values.rapidpro.name }} + spec: + containers: + - name: {{ .Values.rapidpro.name }} + image: {{ .Values.rapidpro.containers.image }} + imagePullPolicy: {{ .Values.rapidpro.containers.imagePullPolicy }} + command: [ "/bin/sh", "-c" ] + args: + - | + set -e; + echo "DB_HOST: ${DB_HOST:-Not Set}" + echo "DB_USER: ${DB_USER:-Not Set}" + echo "DB_PORT: ${DB_PORT:-Not Set}" + echo "DB_PASSWORD: ${DB_PASSWORD:-Not Set}" + echo "CSRF_TRUSTED_ORIGINS: ${CSRF_TRUSTED_ORIGINS:-Not Set}" + echo "Running database migrations..."; + poetry run python3 manage.py migrate; + echo "Starting the RapidPro web server..."; + poetry run python3 manage.py runserver 0.0.0.0:8000; + ports: + - containerPort: {{.Values.rapidpro.service.port }} + env: + - name: DOMAIN_NAME + value: "https://rapidpro-bb.playground.sandbox-playground.com" + - name: ALLOWED_HOSTS + value: "https://rapidpro-bb.playground.sandbox-playground.com" + - name: TEMBA_HOST + value: "https://rapidpro-bb.playground.sandbox-playground.com" + - name: CSRF_TRUSTED_ORIGINS + value: "https://rapidpro-bb.playground.sandbox-playground.com" + - name: CORS_ORIGIN_WHITELIST + value: "https://rapidpro-bb.playground.sandbox-playground.com" + - name: CSRF_COOKIE_DOMAIN + value: ".sandbox-playground.com" + - name: DEBUG + value: "True" + - name: DJANGO_LOG_LEVEL + value: "DEBUG" + - name: DJANGO_REQUEST_LOG_LEVEL + value: "DEBUG" + - name: DJANGO_SECURITY_LOG_LEVEL + value: "DEBUG" + - name: DB_HOST + value: {{.Values.postgresql.service.name}} + - name: DB_PORT + value: "5432" + - name: DB_NAME + value: {{.Values.postgresql.statefulset.databaseName}} + - name: DB_USER + value: {{.Values.postgresql.statefulset.username}} + - name: DB_PASSWORD + value: {{.Values.postgresql.statefulset.password}} + - name: REMOTE_CONTAINERS + value: "true" + - name: CSRF_COOKIE_SAMESITE + value: "None" + - name: CSRF_COOKIE_SECURE + value: "False" + - name: SECURE_BROWSER_XSS_FILTER + value: "False" + - name: SECURE_CONTENT_TYPE_NOSNIFF + value: "False" + - name: SECURE_HSTS_INCLUDE_SUBDOMAINS + value: "False" + - name: SECURE_SSL_REDIRECT + value: "True" + - name: SESSION_COOKIE_SECURE + value: "False" + - name: MAILROOM_URL + value: "http://mailroom:8090" + + + +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.rapidpro.service.name }} + labels: + app: {{ .Values.rapidpro.name }} +spec: + ports: + - port: {{ .Values.rapidpro.service.port }} + targetPort: {{ .Values.rapidpro.service.targetPort }} + protocol: TCP + name: http + selector: + app: {{ .Values.rapidpro.service.name }} diff --git a/sandbox-demo-builder/blocks/rapidpro/templates/redis.yaml b/sandbox-demo-builder/blocks/rapidpro/templates/redis.yaml new file mode 100644 index 0000000..f3aa009 --- /dev/null +++ b/sandbox-demo-builder/blocks/rapidpro/templates/redis.yaml @@ -0,0 +1,52 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ .Values.redis.service.name }} + namespace: {{ .Release.Namespace }} + labels: + app: {{ .Values.redis.service.name }} +spec: + replicas: 1 + serviceName: {{ .Values.redis.service.name }} + selector: + matchLabels: + app: {{ .Values.redis.service.name }} + template: + metadata: + labels: + app: {{ .Values.redis.service.name }} + spec: + containers: + - image: {{ .Values.redis.containers.image }} + name: {{ .Values.redis.containers.name }} + ports: + - containerPort: {{ .Values.redis.service.port }} + volumeMounts: + - name: {{ .Values.global.name }} + mountPath: {{ .Values.redis.statefulset.spec.mountPath }} + volumeClaimTemplates: + - metadata: + name: {{ .Values.global.name }} + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .Values.redis.statefulset.spec.storage }} + +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.redis.service.name }} + namespace: {{ .Release.Namespace }} + labels: + app: {{ .Values.redis.service.name }} +spec: + ports: + - port: {{ .Values.redis.service.port }} + targetPort: {{ .Values.redis.service.port }} + protocol: TCP + selector: + app: {{ .Values.redis.service.name }} + clusterIP: None \ No newline at end of file diff --git a/sandbox-demo-builder/blocks/rapidpro/values.yaml b/sandbox-demo-builder/blocks/rapidpro/values.yaml new file mode 100644 index 0000000..eddc0da --- /dev/null +++ b/sandbox-demo-builder/blocks/rapidpro/values.yaml @@ -0,0 +1,123 @@ +### Global Values if any ### +global: + name: rapidpro + +### Sub Charts Specific Values ### +rapidpro: + enabled: true + name: "rapidpro" + template: + labels: + app: "rapidpro" + containers: + name: "rapidpro" + image: oleksiidn/rapidpro:csrf-hard-2 + imagePullPolicy: "IfNotPresent" + databaseUrl: "postgresql://postgres:postgres@postgresql/rapidpro" + redisUrl: "redis://redis:6379/0" + profiles: "container" + service: + name: rapidpro + type: ClusterIP + port: 8000 + targetPort: 8000 + +mailroom: + enabled: true + name: "mailroom" + template: + labels: + app: "mailroom" + containers: + name: "mailroom" + image: oleksiidn/mailroom:1 + imagePullPolicy: "IfNotPresent" + databaseUrl: "postgresql://postgres:postgres@postgresql/rapidpro" + redisUrl: "redis://redis:6379/0" + profiles: "container" + service: + name: mailroom + type: ClusterIP + port: 8090 + targetPort: 8090 +postgresql: + name: "postgres" + replicaCount: 1 + template: + labels: + app: "postgres" + containers: + name: "postgres" + image: ghcr.io/baosystems/postgis:15-3.3 + imagePullPolicy: "IfNotPresent" + statefulset: + name: postgres + username: "temba" + password: "temba" + databaseName: "temba" + postgresPassword: "tembatemba" + spec: + mountPath: /var/lib/pgsql/data + storage: 1Gi + service: + name: postgres + type: ClusterIP + port: 5432 + selector: + app: postgres + +redis: + name: "redis" + replicaCount: 1 + template: + labels: + app: "redis" + containers: + name: "redis" + image: redis:6.2-alpine + imagePullPolicy: "IfNotPresent" + statefulset: + name: redis + spec: + mountPath: /rapidpro/media/ + storage: 1Gi + service: + name: "redis" + type: ClusterIP + port: 6379 + +minio: + clusterDomain: localhost + resources: + requests: + memory: 512Mi + replicas: 1 + mode: standalone + rootUser: rootuser + rootPassword: rootpass123 + environment: + MINIO_DOMAIN: "rapidpro-minio" + + buckets: + - name: temba-sessions + # Policy to be set on the + # bucket [none|download|upload|public] + policy: public + # Purge if bucket exists already + purge: false + # set versioning for + # bucket [true|false] + versioning: false # remove this key if you do not want versioning feature + # set objectlocking for + # bucket [true|false] NOTE: versioning is enabled by default if you use locking + objectlocking: false + - name: temba-attachments + policy: public + purge: false + versioning: false # remove this key if you do not want versioning feature + objectlocking: false + - name: temba-logs + policy: public + purge: false + versioning: false # remove this key if you do not want versioning feature + objectlocking: false \ No newline at end of file