From 006762fc663ca0e777dc8dfee026ef0c4ec24a14 Mon Sep 17 00:00:00 2001 From: Alexey Zinoviev Date: Thu, 28 Aug 2025 21:16:17 +0700 Subject: [PATCH] SELFH-182: v7 support (#192) Signed-off-by: Alexey Zinoviev --- .env | 2 +- .github/workflows/main.yaml | 7 +- .gitignore | 3 + .huly.nginx | 10 ++ .template.huly.conf | 18 ++- MIGRATION.md | 35 +++++- README.md | 33 ++++-- compose.yml | 109 +++++++++++++----- example-huly.conf | 13 ++- kube/QUICKSTART.md | 7 +- kube/README.md | 4 +- kube/account/account-deployment.yaml | 10 +- kube/cockroach/cockroach-deployment.yaml | 52 +++++++++ .../cockroach-persistentvolumeclaim.yaml | 21 ++++ kube/cockroach/cockroach-service.yaml | 17 +++ .../collaborator/collaborator-deployment.yaml | 2 +- kube/config/config.yaml | 3 + kube/config/secret.yaml | 6 +- kube/datalake/datalake-deployment.yaml | 49 ++++++++ kube/datalake/datalake-ingress.yaml | 21 ++++ kube/datalake/datalake-service.yaml | 12 ++ kube/front/front-deployment.yaml | 19 ++- kube/fulltext/fulltext-deployment.yaml | 10 +- kube/mongodb/mongodb-deployment.yaml | 37 ------ kube/mongodb/mongodb-service.yaml | 13 --- kube/redpanda/redpanda-deployment.yaml | 58 ++++++++++ .../redpanda-persistentvolumeclaim.yaml} | 6 +- kube/redpanda/redpanda-service.yaml | 16 +++ kube/rekoni/rekoni-deployment.yaml | 2 +- kube/stats/stats-deployment.yaml | 2 +- kube/transactor/transactor-deployment.yaml | 10 +- kube/workspace/workspace-deployment.yaml | 10 +- setup.sh | 87 ++++++++++---- 33 files changed, 566 insertions(+), 138 deletions(-) create mode 100644 kube/cockroach/cockroach-deployment.yaml create mode 100644 kube/cockroach/cockroach-persistentvolumeclaim.yaml create mode 100644 kube/cockroach/cockroach-service.yaml create mode 100644 kube/datalake/datalake-deployment.yaml create mode 100644 kube/datalake/datalake-ingress.yaml create mode 100644 kube/datalake/datalake-service.yaml delete mode 100644 kube/mongodb/mongodb-deployment.yaml delete mode 100644 kube/mongodb/mongodb-service.yaml create mode 100644 kube/redpanda/redpanda-deployment.yaml rename kube/{mongodb/mongodb-persistentvolumeclaim.yml => redpanda/redpanda-persistentvolumeclaim.yaml} (64%) create mode 100644 kube/redpanda/redpanda-service.yaml diff --git a/.env b/.env index de4ffb4..502bf17 120000 --- a/.env +++ b/.env @@ -1 +1 @@ -huly.conf \ No newline at end of file +huly_v7.conf \ No newline at end of file diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 63c93b3..28d8afe 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -63,15 +63,18 @@ jobs: run: | echo 127.0.0.1 huly.example | sudo tee -a /etc/hosts echo 127.0.0.1 account.huly.example | sudo tee -a /etc/hosts + echo 127.0.0.1 transactor.huly.example | sudo tee -a /etc/hosts + echo 127.0.0.1 collaborator.huly.example | sudo tee -a /etc/hosts + echo 127.0.0.1 datalake.huly.example | sudo tee -a /etc/hosts kubectl apply -R -f . - kubectl wait --for=condition=Available deployment/mongodb --timeout 3m + kubectl wait --for=condition=Available deployment/cockroachdb-single-node --timeout 3m kubectl wait --for=condition=Available deployment/transactor --timeout 3m kubectl delete pod -l app=account kubectl wait --for=condition=Available deployment/account --timeout 3m - name: "Check login" run: | token=$(curl -v -H 'Content-Type: application/json' \ - -d '{"method":"createAccount","params":["user1","1234","user","1"]}' \ + -d '{"method": "signUp","params": {"email": "user3","password": "1234","firstName": "Test","lastName": "User"}}' \ -X POST \ http://account.huly.example/ | jq -r '.result.token') diff --git a/.gitignore b/.gitignore index 8fb5138..baf53f3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,8 @@ traefik/docker-compose.yaml nginx.conf nginx.conf.bak huly.conf +huly_v7.conf .huly.secret +.cr.secret +.rp.secret .idea diff --git a/.huly.nginx b/.huly.nginx index 9e03bbf..2786b41 100644 --- a/.huly.nginx +++ b/.huly.nginx @@ -91,4 +91,14 @@ server { rewrite ^/_stats(/.*)$ $1 break; proxy_pass http://stats:4900/; } + + location /_datalake { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + rewrite ^/_datalake(/.*)$ $1 break; + proxy_pass http://datalake:4030/; + } } \ No newline at end of file diff --git a/.template.huly.conf b/.template.huly.conf index 96eddc9..91ca169 100644 --- a/.template.huly.conf +++ b/.template.huly.conf @@ -1,5 +1,5 @@ -HULY_VERSION=v0.6.502 -DOCKER_NAME=huly +HULY_VERSION=s0.7.204 +DOCKER_NAME=huly_v7 # The address of the host or server from which you will access your Huly instance. # This can be a domain name (e.g., huly.example.com) or an IP address (e.g., 192.168.1.1). @@ -19,11 +19,23 @@ TITLE=${TITLE} DEFAULT_LANGUAGE=${DEFAULT_LANGUAGE} LAST_NAME_FIRST=${LAST_NAME_FIRST} +# CockroachDB variables +CR_DATABASE=${CR_DATABASE} +CR_USERNAME=${CR_USERNAME} +CR_USER_PASSWORD=${COCKROACH_SECRET} +CR_DB_URL=postgres://${CR_USERNAME}:${COCKROACH_SECRET}@cockroach:26257/${CR_DATABASE} + +# Redpanda variables +REDPANDA_ADMIN_USER=${REDPANDA_ADMIN_USER} +REDPANDA_ADMIN_PWD=${REDPANDA_SECRET} + # Docker volume paths - specify custom paths for persistent data storage # Leave empty to use default Docker named volumes -VOLUME_DB_PATH=${VOLUME_DB_PATH} VOLUME_ELASTIC_PATH=${VOLUME_ELASTIC_PATH} VOLUME_FILES_PATH=${VOLUME_FILES_PATH} +VOLUME_CR_DATA_PATH=${VOLUME_CR_DATA_PATH} +VOLUME_CR_CERTS_PATH=${VOLUME_CR_CERTS_PATH} +VOLUME_REDPANDA_PATH=${VOLUME_REDPANDA_PATH} # The following configs are auto-generated by the setup script. # Please do not manually overwrite. diff --git a/MIGRATION.md b/MIGRATION.md index d289b87..8282baa 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -3,14 +3,21 @@ This document describes the changes required to update Huly from one version to another. Most of updates require updating Docker containers versions. Though, some updates may require updating other configuration options. In this case, you should review the updated configuration options and update them accordingly. -## v7 preparation +# v7 + +## v0.7.204 + +> [!CAUTION] +> Do not upgrade directly from v6 to v7. Direct upgrades will lock your deployment with MongoDB-specific data, making the future migration significantly more complex. Follow the migration instructions below instead. > [!WARNING] > Use of MongoDB has been deprecated in v7 in favor of CockroachDB and will be completely removed in v8. Migration to v7 involves backing up your v6 deployment data and restoring it to a fresh v7 installation with CockroachDB. -To make a full backup of your v6 deployment run the following command adjusting the variables to the actual values of your deployment in case they differ from the ones in the sample deployment. +Migration Steps (command examples shown for Docker on macOS): + +1. Make a full backup of your v6 deployment. Run the following command on **v6** tag of the `huly-selfhost` repository adjusting the variables to the actual values of your deployment in case they differ from the ones in the sample deployment. ``` source .env && docker run \ @@ -31,6 +38,30 @@ To make a full backup of your v6 deployment run the following command adjusting > [!NOTE] > This command will write the necessary backup files to the mounted volume. Make sure this volume will be available to your new v7 deployment to restore the data from it. Consider using an absolute path instead of "./backup-all". +2. Set up a fresh v7 deployment by following the standard [deployment instructions](https://github.com/hcengineering/huly-selfhost/blob/main/README.md). + +3. Restore the data from the backup created in step 1. Make sure the deployment is new and doesn't contain any data as it might result in conflicts during the restore procedure. Run the following command on the main branch of the `huly-selfhost` repository adjusting variables to the actual values of your deployment in case they differ from the ones in the sample deployment. Make sure that the mounted volume is referencing the same path as was used in the backup command. + +``` + source .env && docker run \ + --network "${DOCKER_NAME}_default" \ + -e SERVER_SECRET="$SECRET" \ + -e TRANSACTOR_URL="ws://transactor:3333" \ + -e STORAGE_CONFIG="datalake|http://datalake:4030" \ + -e ACCOUNT_DB_URL="${CR_DB_URL}" \ + -e ACCOUNTS_URL="http://account:3000" \ + -e DB_URL="${CR_DB_URL}" \ + -e QUEUE_CONFIG="redpanda:9092" \ + -v ./backup-all:/backup \ + -it hardcoreeng/tool:s0.7.213 \ + -- bundle.js restore-from-v6-all /backup +``` + +> [!TIP] +> This procedure doesn't affect the data in the v6 deployment and can be repeated as many times as needed. + +# v6 + ## v0.6.502
diff --git a/README.md b/README.md index 02e0b11..abc02fc 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ cd huly-selfhost ./setup.sh ``` -This will generate a [huly.conf](./huly.conf) file with your chosen values and create your nginx config. +This will generate a [huly_v7.conf](./huly_v7.conf) file with your chosen values and create your nginx config. To add the generated configuration to your Nginx setup, run the following: @@ -61,6 +61,9 @@ sudo docker compose up -d Now, launch your web browser and enjoy Huly! +> [!IMPORTANT] +> Provided configrations include deployments of CockroachDB and Redpanda which might not be production-ready. Please inspect them carefully before using in production. For more information on the recommended deployment configurations, please refer to the [CockroachDB](https://www.cockroachlabs.com/docs/stable/recommended-production-settings) and [Redpanda](https://docs.redpanda.com/24.3/deploy/) documentation. + ## Volume Configuration By default, Huly uses Docker named volumes to store persistent data (database, Elasticsearch indices, and uploaded files). You can optionally configure custom host paths for these volumes during the setup process. @@ -69,9 +72,11 @@ By default, Huly uses Docker named volumes to store persistent data (database, E When running `./setup.sh`, you'll be prompted to specify custom paths for: -- **Database volume**: MongoDB data storage - **Elasticsearch volume**: Search index data storage - **Files volume**: User-uploaded files and attachments +- **CockroachDB data volume**: Data storage for workspaces and accounts +- **CockroachDB certs volume**: Certificates for CockroachDB +- **Redpanda data volume**: Data storage for Kafka You can either: - Press Enter to use the default Docker named volumes @@ -88,22 +93,26 @@ To quickly reset all volumes back to default Docker named volumes without prompt ### Manual Configuration -You can also manually configure volume paths by editing the `huly.conf` file: +You can also manually configure volume paths by editing the `huly_v7.conf` file: ```bash # Docker volume paths - specify custom paths for persistent data storage # Leave empty to use default Docker named volumes -VOLUME_DB_PATH=/path/to/database VOLUME_ELASTIC_PATH=/path/to/elasticsearch VOLUME_FILES_PATH=/path/to/files +VOLUME_CR_DATA_PATH=/path/to/cockroachdb/data +VOLUME_CR_CERTS_PATH=/path/to/cockroachdb/certs +VOLUME_REDPANDA_PATH=/path/to/redpanda/data ``` To revert to default volumes, simply leave the paths empty: ```bash -VOLUME_DB_PATH= VOLUME_ELASTIC_PATH= VOLUME_FILES_PATH= +VOLUME_CR_DATA_PATH= +VOLUME_CR_CERTS_PATH= +VOLUME_REDPANDA_PATH= ``` After modifying the configuration, restart the services: @@ -116,6 +125,16 @@ docker compose up -d > [!WARNING] > When changing from named volumes to host paths (or vice versa), make sure to migrate your data appropriately to avoid data loss. +## Redpanda Configuration + +When using a production deployment of Redpanda with topics auto-creation turned off, you'll need to manually create the following topics: + +- fulltext +- process +- tx +- users +- workspace + ## Generating Public and Private VAPID keys for front-end You'll need `Node.js` installed on your machine. Installing `npm` on Debian based distro: @@ -321,7 +340,7 @@ self-hosted Huly, perform the following steps: - STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin - SECRET=secret - ACCOUNTS_URL=http://account:3000 - - DB_URL=mongodb://mongodb:27017 + - DB_URL=${CR_DB_URL} - MONGO_URL=mongodb://mongodb:27017 - STORAGE_PROVIDER_NAME=minio - PORT=8096 @@ -362,7 +381,7 @@ Huly provides AI-powered chatbot that provides several services: - STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin - SERVER_SECRET=secret - ACCOUNTS_URL=http://account:3000 - - DB_URL=mongodb://mongodb:27017 + - DB_URL=${CR_DB_URL} - MONGO_URL=mongodb://mongodb:27017 - STATS_URL=http://stats:4900 - FIRST_NAME=Bot diff --git a/compose.yml b/compose.yml index e2182b0..866de42 100644 --- a/compose.yml +++ b/compose.yml @@ -8,20 +8,54 @@ services: - ./.huly.nginx:/etc/nginx/conf.d/default.conf restart: unless-stopped - mongodb: - image: "mongo:7-jammy" + cockroach: + image: cockroachdb/cockroach:latest-v24.2 + command: start-single-node --accept-sql-without-tls environment: - - PUID=1000 - - PGID=1000 + - COCKROACH_DATABASE=${CR_DATABASE} + - COCKROACH_USER=${CR_USERNAME} + - COCKROACH_PASSWORD=${CR_USER_PASSWORD} volumes: - - ${VOLUME_DB_PATH:-db}:/data/db + - ${VOLUME_CR_DATA_PATH:-cr_data}:/cockroach/cockroach-data + - ${VOLUME_CR_CERTS_PATH:-cr_certs}:/cockroach/certs restart: unless-stopped + redpanda: + image: docker.redpanda.com/redpandadata/redpanda:v24.3.6 + command: + - redpanda + - start + - --kafka-addr internal://0.0.0.0:9092,external://0.0.0.0:19092 + - --advertise-kafka-addr internal://redpanda:9092,external://localhost:19092 + - --pandaproxy-addr internal://0.0.0.0:8082,external://0.0.0.0:18082 + - --advertise-pandaproxy-addr internal://redpanda:8082,external://localhost:18082 + - --schema-registry-addr internal://0.0.0.0:8081,external://0.0.0.0:18081 + - --rpc-addr redpanda:33145 + - --advertise-rpc-addr redpanda:33145 + - --mode dev-container + - --smp 1 + - --default-log-level=info + container_name: redpanda + volumes: + - ${VOLUME_REDPANDA_PATH:-redpanda}:/var/lib/redpanda/data + environment: + - REDPANDA_SUPERUSER_USERNAME=${REDPANDA_ADMIN_USER} + - REDPANDA_SUPERUSER_PASSWORD=${REDPANDA_ADMIN_PWD} + healthcheck: + test: ['CMD', 'rpk', 'cluster', 'info', '-X', 'user=${REDPANDA_ADMIN_USER}', '-X', 'pass=${REDPANDA_ADMIN_PWD}'] + interval: 10s + timeout: 5s + retries: 10 + minio: image: "minio/minio" command: server /data --address ":9000" --console-address ":9001" volumes: - ${VOLUME_FILES_PATH:-files}:/data + healthcheck: + test: ['CMD', 'mc', 'ready', 'local'] + interval: 5s + retries: 10 restart: unless-stopped elastic: @@ -59,15 +93,14 @@ services: environment: - SERVER_PORT=3333 - SERVER_SECRET=${SECRET} - - SERVER_CURSOR_MAXTIMEMS=30000 - - DB_URL=mongodb://mongodb:27017 - - MONGO_URL=mongodb://mongodb:27017 - - STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin + - DB_URL=${CR_DB_URL} + - STORAGE_CONFIG=datalake|http://datalake:4030 - FRONT_URL=http://localhost:8087 - ACCOUNTS_URL=http://account:3000 - FULLTEXT_URL=http://fulltext:4700 - STATS_URL=http://stats:4900 - LAST_NAME_FIRST=${LAST_NAME_FIRST:-true} + - QUEUE_CONFIG=redpanda:9092 restart: unless-stopped collaborator: @@ -76,9 +109,8 @@ services: - COLLABORATOR_PORT=3078 - SECRET=${SECRET} - ACCOUNTS_URL=http://account:3000 - - DB_URL=mongodb://mongodb:27017 - STATS_URL=http://stats:4900 - - STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin + - STORAGE_CONFIG=datalake|http://datalake:4030 restart: unless-stopped account: @@ -86,28 +118,28 @@ services: environment: - SERVER_PORT=3000 - SERVER_SECRET=${SECRET} - - DB_URL=mongodb://mongodb:27017 - - MONGO_URL=mongodb://mongodb:27017 + - DB_URL=${CR_DB_URL} - TRANSACTOR_URL=ws://transactor:3333;ws${SECURE:+s}://${HOST_ADDRESS}/_transactor - - STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin + - STORAGE_CONFIG=datalake|http://datalake:4030 - FRONT_URL=http${SECURE:+s}://${HOST_ADDRESS} - STATS_URL=http${SECURE:+s}://${HOST_ADDRESS}/stats - MODEL_ENABLED=* - ACCOUNTS_URL=http${SECURE:+s}://${HOST_ADDRESS} - ACCOUNT_PORT=3000 + - QUEUE_CONFIG=redpanda:9092 restart: unless-stopped workspace: image: hardcoreeng/workspace:${HULY_VERSION} environment: - SERVER_SECRET=${SECRET} - - DB_URL=mongodb://mongodb:27017 - - MONGO_URL=mongodb://mongodb:27017 + - DB_URL=${CR_DB_URL} - TRANSACTOR_URL=ws://transactor:3333;ws${SECURE:+s}://${HOST_ADDRESS}/_transactor - - STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin + - STORAGE_CONFIG=datalake|http://datalake:4030 - MODEL_ENABLED=* - ACCOUNTS_URL=http://account:3000 - STATS_URL=http://stats:4900 + - QUEUE_CONFIG=redpanda:9092 restart: unless-stopped front: @@ -117,34 +149,36 @@ services: - SERVER_SECRET=${SECRET} - LOVE_ENDPOINT=http${SECURE:+s}://${HOST_ADDRESS}/_love - ACCOUNTS_URL=http${SECURE:+s}://${HOST_ADDRESS}/_accounts + - ACCOUNTS_URL_INTERNAL=http://account:3000 - REKONI_URL=http${SECURE:+s}://${HOST_ADDRESS}/_rekoni - CALENDAR_URL=http${SECURE:+s}://${HOST_ADDRESS}/_calendar - GMAIL_URL=http${SECURE:+s}://${HOST_ADDRESS}/_gmail - TELEGRAM_URL=http${SECURE:+s}://${HOST_ADDRESS}/_telegram - STATS_URL=http${SECURE:+s}://${HOST_ADDRESS}/_stats - - UPLOAD_URL=/files + - FILES_URL=http${SECURE:+s}://${HOST_ADDRESS}/_datalake/blob/:workspace/:blobId/:filename + - UPLOAD_URL=http${SECURE:+s}://${HOST_ADDRESS}/_datalake/upload/form-data/:workspace + - PREVIEW_CONFIG=image|http${SECURE:+s}://${HOST_ADDRESS}/_datalake/image/fit=cover,width=:width,height=:height,dpr=:dpr/:workspace/:blobId;video|http${SECURE:+s}://${HOST_ADDRESS}/_datalake/meta/:workspace/:blobId - ELASTIC_URL=http://elastic:9200 - COLLABORATOR_URL=ws${SECURE:+s}://${HOST_ADDRESS}/_collaborator - - STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin - - DB_URL=mongodb://mongodb:27017 - - MONGO_URL=mongodb://mongodb:27017 + - STORAGE_CONFIG=datalake|http://datalake:4030 - TITLE=${TITLE:-Huly Self Host} - DEFAULT_LANGUAGE=${DEFAULT_LANGUAGE:-en} - LAST_NAME_FIRST=${LAST_NAME_FIRST:-true} - - DESKTOP_UPDATES_CHANNEL=selfhost + - DESKTOP_UPDATES_CHANNEL=${HULY_VERSION} restart: unless-stopped fulltext: image: hardcoreeng/fulltext:${HULY_VERSION} environment: - SERVER_SECRET=${SECRET} - - DB_URL=mongodb://mongodb:27017 + - DB_URL=${CR_DB_URL} - FULLTEXT_DB_URL=http://elastic:9200 - ELASTIC_INDEX_NAME=huly_storage_index - - STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin + - STORAGE_CONFIG=datalake|http://datalake:4030 - REKONI_URL=http://rekoni:4004 - ACCOUNTS_URL=http://account:3000 - STATS_URL=http://stats:4900 + - QUEUE_CONFIG=redpanda:9092 restart: unless-stopped stats: @@ -153,9 +187,32 @@ services: - PORT=4900 - SERVER_SECRET=${SECRET} restart: unless-stopped + + datalake: + image: hardcoreeng/datalake:${HULY_VERSION} + depends_on: + minio: + condition: service_healthy + cockroach: + condition: service_started + stats: + condition: service_started + account: + condition: service_started + environment: + - PORT=4030 + - SECRET=${SECRET} + - ACCOUNTS_URL=http://account:3000 + - STATS_URL=http://stats:4900 + - DB_URL=${CR_DB_URL} + - BUCKETS=huly,eu|http://minio:9000?accessKey=minioadmin&secretKey=minioadmin + - QUEUE_CONFIG=redpanda:9092 + restart: unless-stopped volumes: # These named volumes are used when custom volume paths are not specified # If VOLUME_*_PATH variables are set, these volumes will be ignored - db: elastic: - files: \ No newline at end of file + files: + cr_data: + cr_certs: + redpanda: \ No newline at end of file diff --git a/example-huly.conf b/example-huly.conf index 6418412..1e261e1 100644 --- a/example-huly.conf +++ b/example-huly.conf @@ -19,11 +19,22 @@ TITLE=Huly Self Host DEFAULT_LANGUAGE=en LAST_NAME_FIRST=true +# Redpanda variables +REDPANDA_ADMIN_USER=superadmin +REDPANDA_ADMIN_PWD=panda_secret + +# CockroachDB variables +CR_DATABASE=defaultdb +CR_USERNAME=selfhost +CR_USER_PASSWORD=cr_secret + # Docker volume paths - specify custom paths for persistent data storage # Leave empty to use default Docker named volumes -VOLUME_DB_PATH= VOLUME_ELASTIC_PATH= VOLUME_FILES_PATH= +VOLUME_CR_DATA_PATH= +VOLUME_CR_CERTS_PATH= +VOLUME_REDPANDA_PATH= # The following configs are auto-generated by the setup script. # Please do not manually overwrite. diff --git a/kube/QUICKSTART.md b/kube/QUICKSTART.md index 4a5c769..a901a6f 100644 --- a/kube/QUICKSTART.md +++ b/kube/QUICKSTART.md @@ -63,12 +63,17 @@ Add host entries to be able to work with ingresses from the host machine: sudo cp -p /etc/hosts /tmp/hosts echo "127.0.0.1 huly.example" | sudo tee -a /etc/hosts echo "127.0.0.1 account.huly.example" | sudo tee -a /etc/hosts +echo "127.0.0.1 transactor.huly.example" | sudo tee -a /etc/hosts +echo "127.0.0.1 collaborator.huly.example" | sudo tee -a /etc/hosts +echo "127.0.0.1 datalake.huly.example" | sudo tee -a /etc/hosts ``` Deploy Huly with `kubectl`: ```bash -kubectl apply -R -f . +kubectl create namespace huly-v7 + +kubectl apply -R -f . --namespace huly-v7 ``` Wait until the front app is coming up: diff --git a/kube/README.md b/kube/README.md index 364ac02..a2f65ac 100644 --- a/kube/README.md +++ b/kube/README.md @@ -18,7 +18,9 @@ The sample configuration assume that Huly is available on huly.example hostname Deploy Huly with `kubectl`. ```bash -kubectl apply -R -f . +kubectl create namespace huly-v7 + +kubectl apply -R -f . --namespace huly-v7 ``` Now, launch your web browser and enjoy Huly! diff --git a/kube/account/account-deployment.yaml b/kube/account/account-deployment.yaml index e515180..d5918e2 100644 --- a/kube/account/account-deployment.yaml +++ b/kube/account/account-deployment.yaml @@ -39,9 +39,9 @@ spec: value: '*' - name: DB_URL valueFrom: - configMapKeyRef: - name: huly-config - key: MONGO_URL + secretKeyRef: + name: huly-secret + key: CR_DB_URL - name: MONGO_URL valueFrom: configMapKeyRef: @@ -57,7 +57,9 @@ spec: configMapKeyRef: name: huly-config key: TRANSACTOR_URL - image: hardcoreeng/account:v0.6.502 + - name: QUEUE_CONFIG + value: redpanda:9092 + image: hardcoreeng/account:s0.7.204 name: account ports: - containerPort: 3000 diff --git a/kube/cockroach/cockroach-deployment.yaml b/kube/cockroach/cockroach-deployment.yaml new file mode 100644 index 0000000..b761991 --- /dev/null +++ b/kube/cockroach/cockroach-deployment.yaml @@ -0,0 +1,52 @@ + apiVersion: apps/v1 + kind: Deployment + metadata: + name: cockroachdb-single-node + spec: + replicas: 1 + selector: + matchLabels: + app: cockroach + template: + metadata: + labels: + app: cockroach + spec: + # initContainers: + # - name: init-certs-dir + # image: busybox + # command: ['sh', '-c', 'mkdir -p /cockroach/cockroach-certs && chmod -R 700 /cockroach'] + # volumeMounts: + # - name: certs + # mountPath: /cockroach/certs + containers: + - name: cockroachdb + image: cockroachdb/cockroach:latest-v24.2 + args: + - start-single-node + - --accept-sql-without-tls + env: + - name: COCKROACH_DATABASE + value: "defaultdb" + - name: COCKROACH_USER + value: "selfhost" + - name: COCKROACH_PASSWORD + valueFrom: + secretKeyRef: + name: huly-secret + key: COCKROACH_PASSWORD + ports: + - containerPort: 26257 + - containerPort: 8080 + volumeMounts: + - name: cockroachdb-data + mountPath: /cockroach/cockroach-data + - name: cockroachdb-certs + mountPath: /cockroach/certs + volumes: + - name: cockroachdb-data + persistentVolumeClaim: + claimName: cockroachdb-data + - name: cockroachdb-certs + persistentVolumeClaim: + claimName: cockroachdb-certs \ No newline at end of file diff --git a/kube/cockroach/cockroach-persistentvolumeclaim.yaml b/kube/cockroach/cockroach-persistentvolumeclaim.yaml new file mode 100644 index 0000000..1f02264 --- /dev/null +++ b/kube/cockroach/cockroach-persistentvolumeclaim.yaml @@ -0,0 +1,21 @@ + apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: cockroachdb-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 2Gi +--- + apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: cockroachdb-certs + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 100Mi \ No newline at end of file diff --git a/kube/cockroach/cockroach-service.yaml b/kube/cockroach/cockroach-service.yaml new file mode 100644 index 0000000..51edf28 --- /dev/null +++ b/kube/cockroach/cockroach-service.yaml @@ -0,0 +1,17 @@ + apiVersion: v1 + kind: Service + metadata: + labels: + app: cockroach + name: cockroach + spec: + selector: + app: cockroach + ports: + - name: grpc + port: 26257 + targetPort: 26257 + - name: http + port: 8080 + targetPort: 8080 + clusterIP: None \ No newline at end of file diff --git a/kube/collaborator/collaborator-deployment.yaml b/kube/collaborator/collaborator-deployment.yaml index 724e3a8..e53e1cd 100644 --- a/kube/collaborator/collaborator-deployment.yaml +++ b/kube/collaborator/collaborator-deployment.yaml @@ -32,7 +32,7 @@ spec: secretKeyRef: name: huly-secret key: SERVER_SECRET - image: hardcoreeng/collaborator:v0.6.502 + image: hardcoreeng/collaborator:s0.7.204 name: collaborator ports: - containerPort: 3078 diff --git a/kube/config/config.yaml b/kube/config/config.yaml index 257e28d..43ff0fa 100644 --- a/kube/config/config.yaml +++ b/kube/config/config.yaml @@ -13,3 +13,6 @@ data: MONGO_URL: 'mongodb://mongodb:27017' ELASTIC_URL: 'http://elastic:9200' ELASTIC_INDEX_NAME: 'huly_storage_index' + filesUrl: 'http://datalake.huly.example/blob/:workspace/:blobId/:filename' + uploadUrl: 'http://datalake.huly.example/upload/form-data/:workspace' + previewConfig: 'image|http://datalake.huly.example/image/fit=cover,width=:width,height=:height,dpr=:dpr/:workspace/:blobId;video|http://datalake.huly.example/meta/:workspace/:blobId' diff --git a/kube/config/secret.yaml b/kube/config/secret.yaml index 596017c..6cc1456 100644 --- a/kube/config/secret.yaml +++ b/kube/config/secret.yaml @@ -5,4 +5,8 @@ metadata: type: Opaque stringData: SERVER_SECRET: secret - STORAGE_CONFIG: minio|minio?accessKey=minioadmin&secretKey=minioadmin + STORAGE_CONFIG: datalake|http://datalake + COCKROACH_PASSWORD: cockroach_user_secret + REDPANDA_SUPERUSER_PASSWORD: superpassword + CR_DB_URL: postgres://selfhost:cockroach_user_secret@cockroach:26257/defaultdb + datalakeStorageConfig: huly,eu|http://minio:9000?accessKey=minioadmin&secretKey=minioadmin \ No newline at end of file diff --git a/kube/datalake/datalake-deployment.yaml b/kube/datalake/datalake-deployment.yaml new file mode 100644 index 0000000..fe33b2c --- /dev/null +++ b/kube/datalake/datalake-deployment.yaml @@ -0,0 +1,49 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: datalake + name: datalake +spec: + replicas: 1 + selector: + matchLabels: + app: datalake + template: + metadata: + labels: + app: datalake + spec: + containers: + - image: hardcoreeng/datalake:s0.7.204 + name: datalake + ports: + - containerPort: 3000 + env: + - name: PORT + value: '4030' + - name: SECRET + valueFrom: + secretKeyRef: + name: huly-secret + key: SERVER_SECRET + - name: ACCOUNTS_URL + value: http://account + - name: STATS_URL + value: http://stats + - name: DB_URL + valueFrom: + secretKeyRef: + name: huly-secret + key: CR_DB_URL + - name: BUCKETS + valueFrom: + secretKeyRef: + name: huly-secret + key: datalakeStorageConfig + - name: QUEUE_CONFIG + value: redpanda:9092 + resources: + limits: + memory: "512M" + restartPolicy: Always diff --git a/kube/datalake/datalake-ingress.yaml b/kube/datalake/datalake-ingress.yaml new file mode 100644 index 0000000..1a745cf --- /dev/null +++ b/kube/datalake/datalake-ingress.yaml @@ -0,0 +1,21 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + kubernetes.io/ingress.class: nginx + labels: + app: datalake + name: datalake +spec: + ingressClassName: nginx + rules: + - host: datalake.huly.example + http: + paths: + - backend: + service: + name: datalake + port: + number: 80 + path: / + pathType: Prefix diff --git a/kube/datalake/datalake-service.yaml b/kube/datalake/datalake-service.yaml new file mode 100644 index 0000000..8430adc --- /dev/null +++ b/kube/datalake/datalake-service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: datalake + name: datalake +spec: + ports: + - port: 80 + targetPort: 4030 + selector: + app: datalake diff --git a/kube/front/front-deployment.yaml b/kube/front/front-deployment.yaml index 4f2d672..f951dcb 100644 --- a/kube/front/front-deployment.yaml +++ b/kube/front/front-deployment.yaml @@ -21,6 +21,8 @@ spec: configMapKeyRef: name: huly-config key: ACCOUNTS_URL + - name: ACCOUNTS_URL_INTERNAL + value: http://account - name: CALENDAR_URL value: http://calendar - name: COLLABORATOR_URL @@ -63,13 +65,26 @@ spec: value: http://telegram:8086 - name: TITLE value: Huly Self Hosted + - name: FILES_URL + valueFrom: + configMapKeyRef: + name: huly-config + key: filesUrl - name: UPLOAD_URL - value: /files + valueFrom: + configMapKeyRef: + name: huly-config + key: uploadUrl + - name: PREVIEW_CONFIG + valueFrom: + configMapKeyRef: + name: huly-config + key: previewConfig - name: STATS_URL value: http://stats - name: DESKTOP_UPDATES_CHANNEL value: selfhost - image: hardcoreeng/front:v0.6.502 + image: hardcoreeng/front:s0.7.204 name: front ports: - containerPort: 8080 diff --git a/kube/fulltext/fulltext-deployment.yaml b/kube/fulltext/fulltext-deployment.yaml index 748672e..32539bc 100644 --- a/kube/fulltext/fulltext-deployment.yaml +++ b/kube/fulltext/fulltext-deployment.yaml @@ -23,9 +23,9 @@ spec: key: SERVER_SECRET - name: DB_URL valueFrom: - configMapKeyRef: - name: huly-config - key: MONGO_URL + secretKeyRef: + name: huly-secret + key: CR_DB_URL - name: FULLTEXT_DB_URL valueFrom: configMapKeyRef: @@ -47,7 +47,9 @@ spec: value: http://account - name: STATS_URL value: http://stats - image: hardcoreeng/fulltext:v0.6.502 + - name: QUEUE_CONFIG + value: redpanda:9092 + image: hardcoreeng/fulltext:s0.7.204 name: fulltext ports: - containerPort: 4700 diff --git a/kube/mongodb/mongodb-deployment.yaml b/kube/mongodb/mongodb-deployment.yaml deleted file mode 100644 index b019034..0000000 --- a/kube/mongodb/mongodb-deployment.yaml +++ /dev/null @@ -1,37 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: mongodb - name: mongodb -spec: - replicas: 1 - selector: - matchLabels: - app: mongodb - strategy: - type: Recreate - template: - metadata: - labels: - app: mongodb - spec: - containers: - - env: - - name: PGID - value: "1000" - - name: PUID - value: "1000" - image: mongo:7-jammy - name: mongodb - ports: - - containerPort: 27017 - protocol: TCP - volumeMounts: - - mountPath: /data/db - name: db - restartPolicy: Always - volumes: - - name: db - persistentVolumeClaim: - claimName: db diff --git a/kube/mongodb/mongodb-service.yaml b/kube/mongodb/mongodb-service.yaml deleted file mode 100644 index 17b090e..0000000 --- a/kube/mongodb/mongodb-service.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - labels: - app: mongodb - name: mongodb -spec: - ports: - - port: 27017 - targetPort: 27017 - protocol: TCP - selector: - app: mongodb diff --git a/kube/redpanda/redpanda-deployment.yaml b/kube/redpanda/redpanda-deployment.yaml new file mode 100644 index 0000000..3d58ef8 --- /dev/null +++ b/kube/redpanda/redpanda-deployment.yaml @@ -0,0 +1,58 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: redpanda + name: redpanda +spec: + replicas: 1 + selector: + matchLabels: + app: redpanda + template: + metadata: + labels: + app: redpanda + spec: + containers: + - env: + - name: REDPANDA_SUPERUSER_USERNAME + value: superuser + - name: REDPANDA_SUPERUSER_PASSWORD + valueFrom: + secretKeyRef: + name: huly-secret + key: REDPANDA_SUPERUSER_PASSWORD + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + image: docker.redpanda.com/redpandadata/redpanda:v24.3.6 + args: + - redpanda + - start + - --kafka-addr internal://0.0.0.0:9092,external://0.0.0.0:19092 + - --advertise-kafka-addr internal://redpanda:9092,external://localhost:19092 + - --pandaproxy-addr internal://0.0.0.0:8082,external://0.0.0.0:18082 + - --advertise-pandaproxy-addr internal://redpanda:8082,external://localhost:18082 + - --schema-registry-addr internal://0.0.0.0:8081,external://0.0.0.0:18081 + - --rpc-addr 0.0.0.0:33145 + - --advertise-rpc-addr redpanda:33145 + - --mode dev-container + - --smp 1 + - --default-log-level=info + name: redpanda + ports: + - containerPort: 9092 + - containerPort: 33145 + volumeMounts: + - mountPath: /var/lib/redpanda/data + name: redpanda + resources: + limits: + memory: "512M" + restartPolicy: Always + volumes: + - name: redpanda + persistentVolumeClaim: + claimName: redpanda diff --git a/kube/mongodb/mongodb-persistentvolumeclaim.yml b/kube/redpanda/redpanda-persistentvolumeclaim.yaml similarity index 64% rename from kube/mongodb/mongodb-persistentvolumeclaim.yml rename to kube/redpanda/redpanda-persistentvolumeclaim.yaml index 8aa617a..fa24440 100644 --- a/kube/mongodb/mongodb-persistentvolumeclaim.yml +++ b/kube/redpanda/redpanda-persistentvolumeclaim.yaml @@ -1,10 +1,12 @@ apiVersion: v1 kind: PersistentVolumeClaim metadata: - name: db + labels: + app: redpanda + name: redpanda spec: accessModes: - ReadWriteOnce resources: requests: - storage: 100Mi \ No newline at end of file + storage: 100Mi diff --git a/kube/redpanda/redpanda-service.yaml b/kube/redpanda/redpanda-service.yaml new file mode 100644 index 0000000..c548fef --- /dev/null +++ b/kube/redpanda/redpanda-service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: redpanda + name: redpanda +spec: + ports: + - port: 9092 + targetPort: 9092 + name: kafka + - port: 33145 + targetPort: 33145 + name: rpc + selector: + app: redpanda diff --git a/kube/rekoni/rekoni-deployment.yaml b/kube/rekoni/rekoni-deployment.yaml index 4d398a4..dc0d2dc 100644 --- a/kube/rekoni/rekoni-deployment.yaml +++ b/kube/rekoni/rekoni-deployment.yaml @@ -15,7 +15,7 @@ spec: app: rekoni spec: containers: - - image: hardcoreeng/rekoni-service:v0.6.502 + - image: hardcoreeng/rekoni-service:s0.7.204 name: rekoni env: - name: SECRET diff --git a/kube/stats/stats-deployment.yaml b/kube/stats/stats-deployment.yaml index 416d631..9cba8b7 100644 --- a/kube/stats/stats-deployment.yaml +++ b/kube/stats/stats-deployment.yaml @@ -15,7 +15,7 @@ spec: app: stats spec: containers: - - image: hardcoreeng/stats:v0.6.502 + - image: hardcoreeng/stats:s0.7.204 name: stats env: - name: PORT diff --git a/kube/transactor/transactor-deployment.yaml b/kube/transactor/transactor-deployment.yaml index e662484..0b063e0 100644 --- a/kube/transactor/transactor-deployment.yaml +++ b/kube/transactor/transactor-deployment.yaml @@ -39,9 +39,9 @@ spec: key: MONGO_URL - name: DB_URL valueFrom: - configMapKeyRef: - name: huly-config - key: MONGO_URL + secretKeyRef: + name: huly-secret + key: CR_DB_URL - name: SERVER_CURSOR_MAXTIMEMS value: "30000" - name: SERVER_PORT @@ -51,7 +51,9 @@ spec: secretKeyRef: name: huly-secret key: SERVER_SECRET - image: hardcoreeng/transactor:v0.6.502 + - name: QUEUE_CONFIG + value: redpanda:9092 + image: hardcoreeng/transactor:s0.7.204 name: transactor ports: - containerPort: 3333 diff --git a/kube/workspace/workspace-deployment.yaml b/kube/workspace/workspace-deployment.yaml index 1968f27..704369f 100644 --- a/kube/workspace/workspace-deployment.yaml +++ b/kube/workspace/workspace-deployment.yaml @@ -34,9 +34,9 @@ spec: value: '*' - name: DB_URL valueFrom: - configMapKeyRef: - name: huly-config - key: MONGO_URL + secretKeyRef: + name: huly-secret + key: CR_DB_URL - name: MONGO_URL valueFrom: configMapKeyRef: @@ -47,7 +47,9 @@ spec: secretKeyRef: name: huly-secret key: SERVER_SECRET - image: hardcoreeng/workspace:v0.6.502 + - name: QUEUE_CONFIG + value: redpanda:9092 + image: hardcoreeng/workspace:s0.7.204 name: workspace resources: limits: diff --git a/setup.sh b/setup.sh index 3080635..4219ef7 100755 --- a/setup.sh +++ b/setup.sh @@ -1,8 +1,5 @@ #!/usr/bin/env bash - -HULY_VERSION="v0.6.502" -DOCKER_NAME="huly" -CONFIG_FILE="huly.conf" +CONFIG_FILE="huly_v7.conf" # Parse command line arguments RESET_VOLUMES=false @@ -35,9 +32,11 @@ done if [ "$RESET_VOLUMES" == true ]; then echo -e "\033[33m--reset-volumes flag detected: Resetting all volume paths to default Docker named volumes.\033[0m" sed -i \ - -e '/^VOLUME_DB_PATH=/s|=.*|=|' \ -e '/^VOLUME_ELASTIC_PATH=/s|=.*|=|' \ -e '/^VOLUME_FILES_PATH=/s|=.*|=|' \ + -e '/^VOLUME_CR_DATA_PATH=/s|=.*|=|' \ + -e '/^VOLUME_CR_CERTS_PATH=/s|=.*|=|' \ + -e '/^VOLUME_REDPANDA_PATH=/s|=.*|=|' \ "$CONFIG_FILE" exit 0 fi @@ -110,19 +109,6 @@ echo -e "\n\033[1;34mDocker Volume Configuration:\033[0m" echo "You can specify custom paths for persistent data storage, or leave empty to use default Docker named volumes." echo -e "\033[33mTip: To revert from custom paths to default volumes, enter 'default' or just press Enter when prompted.\033[0m" - # Database volume configuration - if [[ -n "$VOLUME_DB_PATH" ]]; then - current_db="custom: $VOLUME_DB_PATH" - else - current_db="default Docker volume" - fi - read -p "Enter custom path for database volume [current: ${current_db}]: " input - if [[ "$input" == "default" ]]; then - _VOLUME_DB_PATH="" - else - _VOLUME_DB_PATH="${input:-${VOLUME_DB_PATH}}" - fi - # Elasticsearch volume configuration if [[ -n "$VOLUME_ELASTIC_PATH" ]]; then current_elastic="custom: $VOLUME_ELASTIC_PATH" @@ -149,6 +135,45 @@ echo -e "\n\033[1;34mDocker Volume Configuration:\033[0m" _VOLUME_FILES_PATH="${input:-${VOLUME_FILES_PATH}}" fi + # Cockroach data volume configuration + if [[ -n "$VOLUME_CR_DATA_PATH" ]]; then + current_cr_data="custom: $VOLUME_CR_DATA_PATH" + else + current_cr_data="default Docker volume" + fi + read -p "Enter custom path for CR data volume [current: ${current_cr_data}]: " input + if [[ "$input" == "default" ]]; then + _VOLUME_CR_DATA_PATH="" + else + _VOLUME_CR_DATA_PATH="${input:-${VOLUME_CR_DATA_PATH}}" + fi + + # Cockroach certs volume configuration + if [[ -n "$VOLUME_CR_CERTS_PATH" ]]; then + current_cr_certs="custom: $VOLUME_CR_CERTS_PATH" + else + current_cr_certs="default Docker volume" + fi + read -p "Enter custom path for CR certs volume [current: ${current_cr_certs}]: " input + if [[ "$input" == "default" ]]; then + _VOLUME_CR_CERTS_PATH="" + else + _VOLUME_CR_CERTS_PATH="${input:-${VOLUME_CR_CERTS_PATH}}" + fi + + # Redpanda volume configuration + if [[ -n "$VOLUME_REDPANDA_PATH" ]]; then + current_redpanda="custom: $VOLUME_REDPANDA_PATH" + else + current_redpanda="default Docker volume" + fi + read -p "Enter custom path for Redpanda volume [current: ${current_redpanda}]: " input + if [[ "$input" == "default" ]]; then + _VOLUME_REDPANDA_PATH="" + else + _VOLUME_REDPANDA_PATH="${input:-${VOLUME_REDPANDA_PATH}}" + fi + if [ ! -f .huly.secret ] || [ "$SECRET" == true ]; then openssl rand -hex 32 > .huly.secret echo "Secret generated and stored in .huly.secret" @@ -157,6 +182,16 @@ else echo "Run this script with --secret to generate a new secret." fi +if [ ! -f .cr.secret ]; then + openssl rand -hex 32 > .cr.secret + echo "Secret generated and stored in .cr.secret" +fi + +if [ ! -f .rp.secret ]; then + openssl rand -hex 32 > .rp.secret + echo "Secret generated and stored in .rp.secret" +fi + export HOST_ADDRESS=$_HOST_ADDRESS export SECURE=$_SECURE export HTTP_PORT=$_HTTP_PORT @@ -164,13 +199,23 @@ export HTTP_BIND=$HTTP_BIND export TITLE=${TITLE:-Huly} export DEFAULT_LANGUAGE=${DEFAULT_LANGUAGE:-en} export LAST_NAME_FIRST=${LAST_NAME_FIRST:-true} -export VOLUME_DB_PATH=$_VOLUME_DB_PATH +export CR_DATABASE=${CR_DATABASE:-defaultdb} +export CR_USERNAME=${CR_USERNAME:-selfhost} +export REDPANDA_ADMIN_USER=${REDPANDA_ADMIN_USER:-superadmin} export VOLUME_ELASTIC_PATH=$_VOLUME_ELASTIC_PATH export VOLUME_FILES_PATH=$_VOLUME_FILES_PATH +export VOLUME_CR_DATA_PATH=$_VOLUME_CR_DATA_PATH +export VOLUME_CR_CERTS_PATH=$_VOLUME_CR_CERTS_PATH +export VOLUME_REDPANDA_PATH=$_VOLUME_REDPANDA_PATH export HULY_SECRET=$(cat .huly.secret) +export COCKROACH_SECRET=$(cat .cr.secret) +export REDPANDA_SECRET=$(cat .rp.secret) envsubst < .template.huly.conf > $CONFIG_FILE +source "$CONFIG_FILE" +export CR_DB_URL=$CR_DB_URL + echo -e "\n\033[1;34mConfiguration Summary:\033[0m" echo -e "Host Address: \033[1;32m$_HOST_ADDRESS\033[0m" echo -e "HTTP Port: \033[1;32m$_HTTP_PORT\033[0m" @@ -179,9 +224,11 @@ if [[ -n "$SECURE" ]]; then else echo -e "SSL Enabled: \033[1;31mNo\033[0m" fi -echo -e "Database Volume: \033[1;32m${_VOLUME_DB_PATH:-Docker named volume}\033[0m" echo -e "Elasticsearch Volume: \033[1;32m${_VOLUME_ELASTIC_PATH:-Docker named volume}\033[0m" echo -e "Files Volume: \033[1;32m${_VOLUME_FILES_PATH:-Docker named volume}\033[0m" +echo -e "CockroachDB Volume: \033[1;32m${_VOLUME_CR_DATA_PATH:-Docker named volume}\033[0m" +echo -e "CockroachDB Certs Volume: \033[1;32m${_VOLUME_CR_CERTS_PATH:-Docker named volume}\033[0m" +echo -e "Redpanda Volume: \033[1;32m${_VOLUME_REDPANDA_PATH:-Docker named volume}\033[0m" read -p "Do you want to run 'docker compose up -d' now to start Huly? (Y/n): " RUN_DOCKER case "${RUN_DOCKER:-Y}" in