From a55a9b18e3b41a94bd4bb1dadc295d0b8e0afb0a Mon Sep 17 00:00:00 2001 From: Hamish Fagg Date: Wed, 26 Nov 2025 07:57:18 +1300 Subject: [PATCH 1/3] add pgvector --- Dockerfile | 1 + docker-compose.yaml | 20 ++++++++++-- init-dbs.sh | 74 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 3 deletions(-) create mode 100755 init-dbs.sh diff --git a/Dockerfile b/Dockerfile index 2836c197..12edd589 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,6 +24,7 @@ LABEL org.opencontainers.image.title="MindsDB" \ com.docker.extension.changelog="https://raw.githubusercontent.com/mindsdb/mindsdb-docker-extension/main/CHANGELOG.md" COPY docker-compose.yaml . +COPY init-dbs.sh . COPY metadata.json . COPY assets/mindsdb.svg . COPY --from=client-builder /ui/build ui \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index 5bc87185..8e4ca98b 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,18 +1,32 @@ services: mindsdb: image: mindsdb/mindsdb:v25.10.1 + depends_on: + pgvector: + condition: service_healthy ports: - "47334:47334" - "47335:47335" - - "47336:47336" - - "47337:47337" - - "47338:47338" volumes: - data:/opt/mindsdb/data - config:/opt/mindsdb/config container_name: mindsdb_service pull_policy: always + environment: + MINDSDB_DB_CON: "postgresql://mindsdb:mindsdb@pgvector/mindsdb" + KB_PGVECTOR_URL: "postgresql://mindsdb:mindsdb@pgvector/kb" + + pgvector: + image: pgvector/pgvector:pg17 + container_name: pgvector_service + volumes: + - pg_data:/var/lib/postgresql/data + - ./init-dbs.sh:/docker-entrypoint-initdb.d/init-dbs.sh + environment: + POSTGRES_USER: "postgres" + POSTGRES_PASSWORD: "postgres" volumes: data: config: + pg_data: diff --git a/init-dbs.sh b/init-dbs.sh new file mode 100755 index 00000000..c906642e --- /dev/null +++ b/init-dbs.sh @@ -0,0 +1,74 @@ +#!/bin/bash +set -e + +echo "Initializing databases..." + +# Check required environment variables +if [[ -z "${POSTGRES_USER:-}" || -z "${POSTGRES_DB:-}" ]]; then + echo "Error: POSTGRES_USER and POSTGRES_DB environment variables must be set." >&2 + exit 1 +fi + +# Log message for clarity +echo "Creating additional databases..." + +# Function to create a database +create_database() { + local db_name=$1 + echo "Creating database: $db_name" + psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL + SELECT 'CREATE DATABASE $db_name' + WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '$db_name')\gexec +EOSQL + psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL + SELECT 'CREATE DATABASE kb' + WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'kb')\gexec +EOSQL +} + +# Function to create a user with permissions +create_user() { + local username=$1 + local userpassword=$2 + local db_name=$3 + echo "Creating user: $username with access to database: $db_name" + psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$db_name" <<-EOSQL + DO \$\$ + BEGIN + IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = '$username') THEN + CREATE USER $username WITH PASSWORD '$userpassword'; + ELSE + RAISE NOTICE 'User $username already exists. Skipping.'; + END IF; + END + \$\$; + GRANT ALL PRIVILEGES ON DATABASE $db_name TO $username; + GRANT ALL PRIVILEGES ON SCHEMA public TO $username; + GRANT ALL ON SCHEMA public TO $username; +EOSQL + + # Do the same for the kb db + psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "kb" <<-EOSQL + DO \$\$ + BEGIN + IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = '$username') THEN + CREATE USER $username WITH PASSWORD '$userpassword'; + ELSE + RAISE NOTICE 'User $username already exists. Skipping.'; + END IF; + END + \$\$; + GRANT ALL PRIVILEGES ON DATABASE kb TO $username; + GRANT ALL PRIVILEGES ON SCHEMA public TO $username; + GRANT ALL ON SCHEMA public TO $username; + CREATE EXTENSION IF NOT EXISTS vector; +EOSQL +} + +# Create databases +create_database "mindsdb" + +# Create user with permissions in a database +create_user "mindsdb" "mindsdb" "mindsdb" + +echo "Database and user creation completed successfully." From 701e3302d25c4f32bf0465536050d83e1544443f Mon Sep 17 00:00:00 2001 From: Hamish Fagg Date: Wed, 26 Nov 2025 11:29:59 +1300 Subject: [PATCH 2/3] add pgvector image --- Dockerfile | 1 - Dockerfile.pgvector | 5 +++++ Makefile | 11 +++++++++-- docker-compose.yaml | 9 +++++++-- 4 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 Dockerfile.pgvector diff --git a/Dockerfile b/Dockerfile index 12edd589..2836c197 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,7 +24,6 @@ LABEL org.opencontainers.image.title="MindsDB" \ com.docker.extension.changelog="https://raw.githubusercontent.com/mindsdb/mindsdb-docker-extension/main/CHANGELOG.md" COPY docker-compose.yaml . -COPY init-dbs.sh . COPY metadata.json . COPY assets/mindsdb.svg . COPY --from=client-builder /ui/build ui \ No newline at end of file diff --git a/Dockerfile.pgvector b/Dockerfile.pgvector new file mode 100644 index 00000000..d71b6c12 --- /dev/null +++ b/Dockerfile.pgvector @@ -0,0 +1,5 @@ +FROM pgvector/pgvector:pg17 + +COPY init-dbs.sh /docker-entrypoint-initdb.d/init-dbs.sh +RUN chmod +x /docker-entrypoint-initdb.d/init-dbs.sh + diff --git a/Makefile b/Makefile index 5a062095..c98ee868 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,15 @@ IMAGE?=mindsdb/mindsdb-docker-extension +PGVECTOR_IMAGE?=mindsdb/mindsdb-docker-extension-pgvector BUILDER=buildx-multi-arch INFO_COLOR = \033[0;36m NO_COLOR = \033[m -build-extension: ## Build service image to be deployed as a desktop extension +build-pgvector: ## Build the pgvector image with init scripts + docker build --tag=$(PGVECTOR_IMAGE):latest -f Dockerfile.pgvector . + +build-extension: build-pgvector ## Build service image to be deployed as a desktop extension docker build --tag=$(IMAGE):$(TAG) . install-extension: build-extension ## Install the extension @@ -20,7 +24,10 @@ prepare-buildx: ## Create buildx builder for multi-arch build, if not exists validate-extension: ## Validate extension is ready to be published docker extension validate mindsdb/mindsdb-docker-extension:1.0.0 -push-extension: prepare-buildx ## Build & Upload extension image to hub. Do not push if tag already exists: make push-extension tag=0.1 +push-pgvector: prepare-buildx ## Build & Upload pgvector image to hub + docker buildx build --push --builder=$(BUILDER) --platform=linux/amd64,linux/arm64 --tag=$(PGVECTOR_IMAGE):latest -f Dockerfile.pgvector . + +push-extension: prepare-buildx push-pgvector ## Build & Upload extension image to hub. Do not push if tag already exists: make push-extension tag=0.1 docker pull $(IMAGE):$(TAG) && echo "Failure: Tag already exists" || docker buildx build --push --builder=$(BUILDER) --platform=linux/amd64,linux/arm64 --build-arg TAG=$(TAG) --tag=$(IMAGE):$(TAG) . help: ## Show this help diff --git a/docker-compose.yaml b/docker-compose.yaml index 8e4ca98b..40c3d019 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -17,14 +17,19 @@ services: KB_PGVECTOR_URL: "postgresql://mindsdb:mindsdb@pgvector/kb" pgvector: - image: pgvector/pgvector:pg17 + image: mindsdb/mindsdb-docker-extension-pgvector:latest container_name: pgvector_service volumes: - pg_data:/var/lib/postgresql/data - - ./init-dbs.sh:/docker-entrypoint-initdb.d/init-dbs.sh environment: POSTGRES_USER: "postgres" POSTGRES_PASSWORD: "postgres" + POSTGRES_DB: "postgres" + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 5s + timeout: 5s + retries: 10 volumes: data: From 12492c432eab2d98c664dcfa86339b2bac8d848a Mon Sep 17 00:00:00 2001 From: Hamish Fagg Date: Fri, 28 Nov 2025 15:39:31 +1300 Subject: [PATCH 3/3] rename volume --- docker-compose.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 40c3d019..46482def 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -20,7 +20,7 @@ services: image: mindsdb/mindsdb-docker-extension-pgvector:latest container_name: pgvector_service volumes: - - pg_data:/var/lib/postgresql/data + - data_pg:/var/lib/postgresql/data environment: POSTGRES_USER: "postgres" POSTGRES_PASSWORD: "postgres" @@ -34,4 +34,4 @@ services: volumes: data: config: - pg_data: + data_pg: