container-superposition 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -15
- package/dist/scripts/init.js +1 -1537
- package/dist/scripts/init.js.map +1 -1
- package/dist/tool/cli/args.d.ts +20 -0
- package/dist/tool/cli/args.d.ts.map +1 -0
- package/dist/tool/cli/args.js +325 -0
- package/dist/tool/cli/args.js.map +1 -0
- package/dist/tool/cli/run.d.ts +2 -0
- package/dist/tool/cli/run.d.ts.map +1 -0
- package/dist/tool/cli/run.js +318 -0
- package/dist/tool/cli/run.js.map +1 -0
- package/dist/tool/commands/adopt.js +1 -1
- package/dist/tool/commands/adopt.js.map +1 -1
- package/dist/tool/commands/doctor.d.ts +1 -0
- package/dist/tool/commands/doctor.d.ts.map +1 -1
- package/dist/tool/commands/doctor.js +1510 -78
- package/dist/tool/commands/doctor.js.map +1 -1
- package/dist/tool/commands/explain.d.ts.map +1 -1
- package/dist/tool/commands/explain.js +9 -0
- package/dist/tool/commands/explain.js.map +1 -1
- package/dist/tool/commands/migrate.d.ts +7 -0
- package/dist/tool/commands/migrate.d.ts.map +1 -0
- package/dist/tool/commands/migrate.js +52 -0
- package/dist/tool/commands/migrate.js.map +1 -0
- package/dist/tool/questionnaire/answers.d.ts +16 -0
- package/dist/tool/questionnaire/answers.d.ts.map +1 -0
- package/dist/tool/questionnaire/answers.js +102 -0
- package/dist/tool/questionnaire/answers.js.map +1 -0
- package/dist/tool/questionnaire/composer.d.ts +6 -4
- package/dist/tool/questionnaire/composer.d.ts.map +1 -1
- package/dist/tool/questionnaire/composer.js +778 -45
- package/dist/tool/questionnaire/composer.js.map +1 -1
- package/dist/tool/questionnaire/presets.d.ts +60 -0
- package/dist/tool/questionnaire/presets.d.ts.map +1 -0
- package/dist/tool/questionnaire/presets.js +165 -0
- package/dist/tool/questionnaire/presets.js.map +1 -0
- package/dist/tool/questionnaire/questionnaire.d.ts +10 -0
- package/dist/tool/questionnaire/questionnaire.d.ts.map +1 -0
- package/dist/tool/questionnaire/questionnaire.js +582 -0
- package/dist/tool/questionnaire/questionnaire.js.map +1 -0
- package/dist/tool/schema/manifest-migrations.d.ts +5 -0
- package/dist/tool/schema/manifest-migrations.d.ts.map +1 -1
- package/dist/tool/schema/manifest-migrations.js +45 -0
- package/dist/tool/schema/manifest-migrations.js.map +1 -1
- package/dist/tool/schema/overlay-loader.d.ts.map +1 -1
- package/dist/tool/schema/overlay-loader.js +24 -0
- package/dist/tool/schema/overlay-loader.js.map +1 -1
- package/dist/tool/schema/project-config.d.ts +13 -1
- package/dist/tool/schema/project-config.d.ts.map +1 -1
- package/dist/tool/schema/project-config.js +188 -10
- package/dist/tool/schema/project-config.js.map +1 -1
- package/dist/tool/schema/target-rules.d.ts +78 -0
- package/dist/tool/schema/target-rules.d.ts.map +1 -0
- package/dist/tool/schema/target-rules.js +367 -0
- package/dist/tool/schema/target-rules.js.map +1 -0
- package/dist/tool/schema/types.d.ts +42 -3
- package/dist/tool/schema/types.d.ts.map +1 -1
- package/dist/tool/utils/parameters.d.ts +76 -0
- package/dist/tool/utils/parameters.d.ts.map +1 -0
- package/dist/tool/utils/parameters.js +125 -0
- package/dist/tool/utils/parameters.js.map +1 -0
- package/dist/tool/utils/paths.d.ts +2 -0
- package/dist/tool/utils/paths.d.ts.map +1 -0
- package/dist/tool/utils/paths.js +31 -0
- package/dist/tool/utils/paths.js.map +1 -0
- package/docs/deployment-targets.md +88 -56
- package/docs/examples.md +20 -17
- package/docs/filesystem-contract.md +5 -0
- package/docs/minimal-and-editor.md +65 -5
- package/docs/overlay-imports.md +92 -14
- package/docs/overlays.md +231 -135
- package/docs/specs/001-verbose-plan-graph/spec.md +5 -12
- package/docs/specs/002-superposition-config-file/spec.md +5 -12
- package/docs/specs/003-mkdocs2-overlay/spec.md +2 -9
- package/docs/specs/004-doctor-fix/spec.md +1 -8
- package/docs/specs/005-cuda-overlay/spec.md +2 -9
- package/docs/specs/006-rocm-overlay/spec.md +3 -10
- package/docs/specs/007-target-aware-generation/spec.md +119 -0
- package/docs/specs/008-project-file-canonical/spec.md +82 -0
- package/docs/specs/009-project-env/spec.md +140 -0
- package/docs/specs/010-compose-env-materialization/spec.md +123 -0
- package/docs/specs/011-overlay-parameters/spec.md +228 -0
- package/docs/specs/012-ollama-cli-overlay/spec.md +47 -0
- package/docs/specs/013-doctor-dependency-check/spec.md +250 -0
- package/docs/specs/014-doctor-compose-port-cross-validation/spec.md +276 -0
- package/docs/specs/015-doctor-env-example-drift/spec.md +248 -0
- package/docs/specs/016-doctor-reproducibility-check/spec.md +276 -0
- package/docs/specs/017-doctor-dry-run/spec.md +276 -0
- package/docs/specs/018-init-project-file/spec.md +59 -0
- package/docs/specs/taxonomy.md +186 -0
- package/overlays/.presets/full-observability.yml +113 -0
- package/overlays/.presets/k8s-dev.yml +174 -0
- package/overlays/.presets/local-llm.yml +105 -0
- package/overlays/.presets/vector-ai.yml +150 -0
- package/overlays/.shared/README.md +27 -2
- package/overlays/.shared/compose/nvidia-gpu-devcontainer.yml +22 -0
- package/overlays/.shared/vscode/js-ts-settings.json +19 -0
- package/overlays/.shared/vscode/markdown-extensions.json +8 -0
- package/overlays/alertmanager/devcontainer.patch.json +0 -1
- package/overlays/alertmanager/docker-compose.yml +8 -0
- package/overlays/alertmanager/overlay.yml +1 -0
- package/overlays/amp/devcontainer.patch.json +4 -1
- package/overlays/bun/devcontainer.patch.json +1 -10
- package/overlays/bun/overlay.yml +8 -1
- package/overlays/claude-code/devcontainer.patch.json +6 -1
- package/overlays/codex/devcontainer.patch.json +5 -0
- package/overlays/comfyui/.env.example +34 -0
- package/overlays/comfyui/README.md +342 -0
- package/overlays/comfyui/devcontainer.patch.json +15 -0
- package/overlays/comfyui/docker-compose.yml +40 -0
- package/overlays/comfyui/overlay.yml +24 -0
- package/overlays/comfyui/setup.sh +36 -0
- package/overlays/comfyui/verify.sh +103 -0
- package/overlays/commitlint/devcontainer.patch.json +1 -6
- package/overlays/docker-sock/overlay.yml +1 -0
- package/overlays/dotnet/overlay.yml +4 -1
- package/overlays/fuseki/.env.example +5 -0
- package/overlays/fuseki/README.md +173 -0
- package/overlays/fuseki/devcontainer.patch.json +18 -0
- package/overlays/fuseki/docker-compose.yml +29 -0
- package/overlays/fuseki/overlay.yml +42 -0
- package/overlays/fuseki/verify.sh +58 -0
- package/overlays/gemini-cli/devcontainer.patch.json +4 -1
- package/overlays/go/overlay.yml +6 -1
- package/overlays/grafana/devcontainer.patch.json +0 -1
- package/overlays/grafana/docker-compose.yml +8 -2
- package/overlays/grafana/overlay.yml +6 -1
- package/overlays/jaeger/.env.example +11 -0
- package/overlays/jaeger/README.md +33 -4
- package/overlays/jaeger/devcontainer.patch.json +9 -1
- package/overlays/jaeger/docker-compose.yml +17 -0
- package/overlays/jaeger/overlay.yml +1 -12
- package/overlays/java/overlay.yml +6 -1
- package/overlays/jupyter/docker-compose.yml +1 -0
- package/overlays/jupyter/overlay.yml +1 -0
- package/overlays/k3d/README.md +201 -0
- package/overlays/k3d/devcontainer.patch.json +9 -0
- package/overlays/k3d/overlay.yml +19 -0
- package/overlays/k3d/setup.sh +34 -0
- package/overlays/k3d/verify.sh +38 -0
- package/overlays/keycloak/devcontainer.patch.json +0 -1
- package/overlays/keycloak/docker-compose.yml +1 -0
- package/overlays/keycloak/overlay.yml +15 -0
- package/overlays/localstack/docker-compose.yml +1 -0
- package/overlays/localstack/overlay.yml +19 -1
- package/overlays/loki/devcontainer.patch.json +0 -1
- package/overlays/loki/docker-compose.yml +8 -0
- package/overlays/loki/overlay.yml +1 -0
- package/overlays/mailpit/docker-compose.yml +1 -0
- package/overlays/mailpit/overlay.yml +1 -0
- package/overlays/minio/devcontainer.patch.json +1 -1
- package/overlays/minio/docker-compose.yml +1 -0
- package/overlays/minio/overlay.yml +23 -2
- package/overlays/mkdocs/devcontainer.patch.json +1 -5
- package/overlays/mkdocs/overlay.yml +3 -1
- package/overlays/mkdocs2/devcontainer.patch.json +1 -5
- package/overlays/mkdocs2/overlay.yml +2 -0
- package/overlays/mongodb/docker-compose.yml +2 -0
- package/overlays/mongodb/overlay.yml +26 -2
- package/overlays/mysql/docker-compose.yml +2 -0
- package/overlays/mysql/overlay.yml +36 -2
- package/overlays/nats/docker-compose.yml +1 -0
- package/overlays/nats/overlay.yml +18 -2
- package/overlays/nodejs/devcontainer.patch.json +1 -12
- package/overlays/nodejs/overlay.yml +8 -1
- package/overlays/ollama/.env.example +14 -0
- package/overlays/ollama/README.md +326 -0
- package/overlays/ollama/devcontainer.patch.json +14 -0
- package/overlays/ollama/docker-compose.yml +25 -0
- package/overlays/ollama/overlay.yml +27 -0
- package/overlays/ollama/verify.sh +76 -0
- package/overlays/ollama-cli/README.md +90 -0
- package/overlays/ollama-cli/devcontainer.patch.json +3 -0
- package/overlays/ollama-cli/overlay.yml +19 -0
- package/overlays/ollama-cli/setup.sh +103 -0
- package/overlays/ollama-cli/verify.sh +49 -0
- package/overlays/open-webui/.env.example +5 -0
- package/overlays/open-webui/README.md +162 -0
- package/overlays/open-webui/devcontainer.patch.json +14 -0
- package/overlays/open-webui/docker-compose.yml +24 -0
- package/overlays/open-webui/overlay.yml +45 -0
- package/overlays/opencode/devcontainer.patch.json +4 -1
- package/overlays/otel-collector/README.md +4 -0
- package/overlays/otel-collector/devcontainer.patch.json +4 -1
- package/overlays/otel-collector/docker-compose.yml +8 -4
- package/overlays/otel-collector/overlay.yml +1 -0
- package/overlays/otel-demo-nodejs/devcontainer.patch.json +0 -1
- package/overlays/otel-demo-nodejs/docker-compose.yml +1 -0
- package/overlays/otel-demo-nodejs/overlay.yml +9 -1
- package/overlays/otel-demo-python/devcontainer.patch.json +0 -1
- package/overlays/otel-demo-python/docker-compose.yml +1 -0
- package/overlays/otel-demo-python/overlay.yml +6 -1
- package/overlays/pandoc/README.md +10 -0
- package/overlays/pandoc/devcontainer.patch.json +0 -5
- package/overlays/pandoc/overlay.yml +2 -0
- package/overlays/pandoc/setup.sh +10 -0
- package/overlays/pgvector/.env.example +6 -0
- package/overlays/pgvector/README.md +215 -0
- package/overlays/pgvector/devcontainer.patch.json +29 -0
- package/overlays/pgvector/docker-compose.yml +33 -0
- package/overlays/pgvector/overlay.yml +47 -0
- package/overlays/playwright/devcontainer.patch.json +0 -5
- package/overlays/playwright/overlay.yml +2 -1
- package/overlays/postgres/.env.example +5 -5
- package/overlays/postgres/devcontainer.patch.json +4 -4
- package/overlays/postgres/docker-compose.yml +11 -6
- package/overlays/postgres/overlay.yml +23 -2
- package/overlays/pre-commit/devcontainer.patch.json +1 -7
- package/overlays/prometheus/devcontainer.patch.json +0 -1
- package/overlays/prometheus/docker-compose.yml +8 -0
- package/overlays/prometheus/overlay.yml +1 -0
- package/overlays/promtail/devcontainer.patch.json +1 -2
- package/overlays/promtail/docker-compose.yml +8 -0
- package/overlays/promtail/overlay.yml +1 -0
- package/overlays/qdrant/.env.example +4 -0
- package/overlays/qdrant/README.md +216 -0
- package/overlays/qdrant/devcontainer.patch.json +20 -0
- package/overlays/qdrant/docker-compose.yml +26 -0
- package/overlays/qdrant/overlay.yml +44 -0
- package/overlays/rabbitmq/docker-compose.yml +1 -0
- package/overlays/rabbitmq/overlay.yml +25 -2
- package/overlays/redis/docker-compose.yml +7 -0
- package/overlays/redis/overlay.yml +15 -1
- package/overlays/redpanda/docker-compose.yml +1 -0
- package/overlays/redpanda/overlay.yml +15 -3
- package/overlays/rocm/overlay.yml +2 -1
- package/overlays/rust/overlay.yml +3 -1
- package/overlays/skaffold/README.md +256 -0
- package/overlays/skaffold/devcontainer.patch.json +9 -0
- package/overlays/skaffold/overlay.yml +20 -0
- package/overlays/skaffold/setup.sh +33 -0
- package/overlays/skaffold/verify.sh +24 -0
- package/overlays/sqlserver/docker-compose.yml +1 -0
- package/overlays/sqlserver/overlay.yml +17 -0
- package/overlays/tempo/devcontainer.patch.json +0 -1
- package/overlays/tempo/docker-compose.yml +8 -0
- package/overlays/tempo/overlay.yml +1 -0
- package/overlays/windsurf-cli/devcontainer.patch.json +4 -1
- package/package.json +3 -2
- package/tool/schema/config.schema.json +31 -1
- package/tool/schema/overlay-manifest.schema.json +33 -0
- package/overlays/.shared/otel/otel-base-config.yaml +0 -30
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# pgvector Overlay
|
|
2
|
+
|
|
3
|
+
Adds a PostgreSQL 16 database pre-loaded with the [pgvector](https://github.com/pgvector/pgvector) extension, enabling vector similarity search directly within a familiar SQL environment.
|
|
4
|
+
|
|
5
|
+
> **Note:** This overlay conflicts with the `postgres` overlay because both provide a PostgreSQL service on port 5432. Choose `pgvector` when you need vector search, or `postgres` for a plain database.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **pgvector extension** — `CREATE EXTENSION vector;` is available immediately; no manual installation required
|
|
10
|
+
- **Full PostgreSQL 16** — All standard SQL features alongside vector operations
|
|
11
|
+
- **`psql` client in devcontainer** — `postgresql-client` package installed for interactive SQL sessions
|
|
12
|
+
- **Pre-configured environment** — `PGHOST`, `PGPORT`, `PGDATABASE`, and `PGUSER` set automatically
|
|
13
|
+
- **Persistent storage** — Named Docker volume preserves data across container rebuilds
|
|
14
|
+
- **Health check** — Compose readiness check using `pg_isready` before dependent services start
|
|
15
|
+
|
|
16
|
+
## How It Works
|
|
17
|
+
|
|
18
|
+
pgvector runs as a Docker Compose service (`pgvector`) alongside your devcontainer, using the official `pgvector/pgvector:pg16` image, which bundles PostgreSQL 16 with the pgvector extension pre-compiled and ready to use.
|
|
19
|
+
|
|
20
|
+
**Service configuration:**
|
|
21
|
+
|
|
22
|
+
- Image: `pgvector/pgvector:pg16`
|
|
23
|
+
- Network: `devnet` (shared with the dev container)
|
|
24
|
+
- Port: `5432` (customisable via `PGVECTOR_PORT`)
|
|
25
|
+
- Volume: `pgvector-data` for persistent data
|
|
26
|
+
|
|
27
|
+
The following environment variables are pre-set in the devcontainer for seamless `psql` usage:
|
|
28
|
+
|
|
29
|
+
| Variable | Value |
|
|
30
|
+
| ------------ | ---------- |
|
|
31
|
+
| `PGHOST` | `pgvector` |
|
|
32
|
+
| `PGPORT` | `5432` |
|
|
33
|
+
| `PGDATABASE` | `devdb` |
|
|
34
|
+
| `PGUSER` | `postgres` |
|
|
35
|
+
|
|
36
|
+
## Getting Started
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# Connect to the database
|
|
40
|
+
psql -h pgvector -U postgres -d devdb
|
|
41
|
+
|
|
42
|
+
# Enable the vector extension (run once per database)
|
|
43
|
+
psql -h pgvector -U postgres -d devdb -c "CREATE EXTENSION IF NOT EXISTS vector;"
|
|
44
|
+
|
|
45
|
+
# Verify the extension is installed
|
|
46
|
+
psql -h pgvector -U postgres -d devdb -c "SELECT * FROM pg_extension WHERE extname = 'vector';"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Common Commands
|
|
50
|
+
|
|
51
|
+
### Vector Operations in SQL
|
|
52
|
+
|
|
53
|
+
```sql
|
|
54
|
+
-- Enable the extension in your database
|
|
55
|
+
CREATE EXTENSION IF NOT EXISTS vector;
|
|
56
|
+
|
|
57
|
+
-- Create a table with a vector column (1536 dimensions for OpenAI embeddings)
|
|
58
|
+
CREATE TABLE documents (
|
|
59
|
+
id SERIAL PRIMARY KEY,
|
|
60
|
+
content TEXT,
|
|
61
|
+
embedding vector(1536)
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
-- Insert a record with an embedding
|
|
65
|
+
INSERT INTO documents (content, embedding)
|
|
66
|
+
VALUES ('Hello, world!', '[0.1, 0.2, 0.3, ...]');
|
|
67
|
+
|
|
68
|
+
-- Cosine similarity search (find closest neighbours)
|
|
69
|
+
SELECT id, content, 1 - (embedding <=> '[0.1, 0.2, 0.3, ...]') AS similarity
|
|
70
|
+
FROM documents
|
|
71
|
+
ORDER BY embedding <=> '[0.1, 0.2, 0.3, ...]'
|
|
72
|
+
LIMIT 5;
|
|
73
|
+
|
|
74
|
+
-- Create an HNSW index for faster approximate search
|
|
75
|
+
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);
|
|
76
|
+
|
|
77
|
+
-- Create an IVFFlat index for large datasets
|
|
78
|
+
CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Database Management
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# Connect interactively
|
|
85
|
+
psql
|
|
86
|
+
|
|
87
|
+
# Run a SQL file
|
|
88
|
+
psql -f schema.sql
|
|
89
|
+
|
|
90
|
+
# Dump the database
|
|
91
|
+
pg_dump -h pgvector -U postgres devdb > backup.sql
|
|
92
|
+
|
|
93
|
+
# Restore from dump
|
|
94
|
+
psql -h pgvector -U postgres devdb < backup.sql
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Python Integration
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
pip install psycopg2-binary pgvector
|
|
101
|
+
|
|
102
|
+
python - <<'EOF'
|
|
103
|
+
import psycopg2
|
|
104
|
+
from pgvector.psycopg2 import register_vector
|
|
105
|
+
import numpy as np
|
|
106
|
+
|
|
107
|
+
conn = psycopg2.connect(
|
|
108
|
+
host="pgvector", port=5432,
|
|
109
|
+
dbname="devdb", user="postgres", password="postgres"
|
|
110
|
+
)
|
|
111
|
+
register_vector(conn)
|
|
112
|
+
cur = conn.cursor()
|
|
113
|
+
|
|
114
|
+
cur.execute("CREATE EXTENSION IF NOT EXISTS vector")
|
|
115
|
+
cur.execute("CREATE TABLE IF NOT EXISTS items (id serial PRIMARY KEY, embedding vector(3))")
|
|
116
|
+
cur.execute("INSERT INTO items (embedding) VALUES (%s)", (np.array([1, 2, 3]),))
|
|
117
|
+
conn.commit()
|
|
118
|
+
|
|
119
|
+
cur.execute("SELECT * FROM items ORDER BY embedding <-> %s LIMIT 5", (np.array([1, 2, 4]),))
|
|
120
|
+
print(cur.fetchall())
|
|
121
|
+
conn.close()
|
|
122
|
+
EOF
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Configuration
|
|
126
|
+
|
|
127
|
+
### Environment Variables
|
|
128
|
+
|
|
129
|
+
| Variable | Default | Description |
|
|
130
|
+
| ------------------- | ---------- | ------------------------------------------ |
|
|
131
|
+
| `PGVECTOR_VERSION` | `pg16` | pgvector image tag (e.g. `pg16`, `pg17`) |
|
|
132
|
+
| `PGVECTOR_DB` | `devdb` | Name of the database to create |
|
|
133
|
+
| `PGVECTOR_USER` | `postgres` | PostgreSQL superuser name |
|
|
134
|
+
| `PGVECTOR_PASSWORD` | `postgres` | PostgreSQL superuser password |
|
|
135
|
+
| `PGVECTOR_PORT` | `5432` | Host port mapped to the PostgreSQL service |
|
|
136
|
+
|
|
137
|
+
Copy `.devcontainer/.env.example` to `.devcontainer/.env` and customize.
|
|
138
|
+
|
|
139
|
+
## pgvector vs Qdrant
|
|
140
|
+
|
|
141
|
+
| Feature | pgvector (this overlay) | Qdrant |
|
|
142
|
+
| -------------------- | ------------------------------- | ------------------------ |
|
|
143
|
+
| **Storage model** | ✅ Relational + vector | Vector-only |
|
|
144
|
+
| **SQL support** | ✅ Full PostgreSQL SQL | ❌ REST/gRPC API only |
|
|
145
|
+
| **Familiar tooling** | ✅ psql, ORMs, existing schema | New client SDKs required |
|
|
146
|
+
| **Query language** | ✅ SQL with `<->`, `<=>`, `<#>` | ⚠️ JSON query DSL |
|
|
147
|
+
| **Filtering** | ✅ SQL WHERE clause | ✅ Payload-based filters |
|
|
148
|
+
| **Scale** | ⚠️ Vertical scaling preferred | ✅ Distributed by design |
|
|
149
|
+
| **Index types** | IVFFlat, HNSW | HNSW |
|
|
150
|
+
|
|
151
|
+
**Choose pgvector when:**
|
|
152
|
+
|
|
153
|
+
- You already use PostgreSQL and want to add vectors to existing tables
|
|
154
|
+
- You need to join vector results with relational data
|
|
155
|
+
- Your team is comfortable with SQL
|
|
156
|
+
|
|
157
|
+
**Choose Qdrant when:**
|
|
158
|
+
|
|
159
|
+
- Vectors are your primary data model
|
|
160
|
+
- You need purpose-built vector search performance at scale
|
|
161
|
+
- You want advanced filtering and payload storage
|
|
162
|
+
|
|
163
|
+
## Use Cases
|
|
164
|
+
|
|
165
|
+
- **RAG pipelines** — Store document embeddings alongside metadata; retrieve context with SQL joins
|
|
166
|
+
- **Semantic search** — Add vector search to an existing PostgreSQL application without a second database
|
|
167
|
+
- **Hybrid search** — Combine full-text search (`tsvector`) with vector similarity in a single query
|
|
168
|
+
- **Recommendation systems** — Store and query user or item embeddings with familiar SQL tooling
|
|
169
|
+
|
|
170
|
+
**Integrates well with:**
|
|
171
|
+
|
|
172
|
+
- `ollama` — Generate embeddings locally with `nomic-embed-text` or similar models
|
|
173
|
+
- `python` — `psycopg2` + `pgvector` Python package for seamless integration
|
|
174
|
+
- `nodejs` — `pg` driver with raw SQL for vector operations
|
|
175
|
+
|
|
176
|
+
## Troubleshooting
|
|
177
|
+
|
|
178
|
+
### Extension Not Found
|
|
179
|
+
|
|
180
|
+
If `CREATE EXTENSION vector` fails:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
# Confirm pgvector image (not plain postgres) is in use
|
|
184
|
+
docker compose ps pgvector
|
|
185
|
+
|
|
186
|
+
# Check available extensions
|
|
187
|
+
psql -h pgvector -U postgres -c "SELECT name FROM pg_available_extensions WHERE name = 'vector';"
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Port Conflict with postgres Overlay
|
|
191
|
+
|
|
192
|
+
The `pgvector` and `postgres` overlays both bind port 5432 and conflict with each other. Select only one.
|
|
193
|
+
|
|
194
|
+
### Connection Refused
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
# Check service health
|
|
198
|
+
docker compose ps pgvector
|
|
199
|
+
docker compose logs pgvector
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## References
|
|
203
|
+
|
|
204
|
+
- [pgvector GitHub](https://github.com/pgvector/pgvector)
|
|
205
|
+
- [pgvector Docker Image](https://hub.docker.com/r/pgvector/pgvector)
|
|
206
|
+
- [PostgreSQL Documentation](https://www.postgresql.org/docs/16/)
|
|
207
|
+
- [pgvector Python package](https://github.com/pgvector/pgvector-python)
|
|
208
|
+
- [pgvector Node.js package](https://github.com/pgvector/pgvector-node)
|
|
209
|
+
|
|
210
|
+
**Related Overlays:**
|
|
211
|
+
|
|
212
|
+
- [`postgres`](../postgres/README.md) — Plain PostgreSQL without pgvector (conflicts)
|
|
213
|
+
- [`qdrant`](../qdrant/README.md) — Purpose-built vector database (alternative)
|
|
214
|
+
- [`ollama`](../ollama/README.md) — Local embedding generation
|
|
215
|
+
- [`python`](../python/README.md) — Python development environment
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
|
|
3
|
+
"runServices": ["pgvector"],
|
|
4
|
+
"forwardPorts": [5432],
|
|
5
|
+
"portsAttributes": {
|
|
6
|
+
"5432": {
|
|
7
|
+
"label": "pgvector database",
|
|
8
|
+
"onAutoForward": "notify"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"features": {
|
|
12
|
+
"./features/cross-distro-packages": {
|
|
13
|
+
"apt": "postgresql-client",
|
|
14
|
+
"apk": "postgresql-client"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"remoteEnv": {
|
|
18
|
+
"PGVECTOR_HOST": "pgvector",
|
|
19
|
+
"PGVECTOR_PORT": "5432",
|
|
20
|
+
"PGVECTOR_DB": "{{cs.PGVECTOR_DB}}",
|
|
21
|
+
"PGVECTOR_USER": "{{cs.PGVECTOR_USER}}",
|
|
22
|
+
"PGVECTOR_PASSWORD": "{{cs.PGVECTOR_PASSWORD}}",
|
|
23
|
+
"POSTGRES_HOST": "pgvector",
|
|
24
|
+
"POSTGRES_PORT": "5432",
|
|
25
|
+
"POSTGRES_DB": "{{cs.PGVECTOR_DB}}",
|
|
26
|
+
"POSTGRES_USER": "{{cs.PGVECTOR_USER}}",
|
|
27
|
+
"POSTGRES_PASSWORD": "{{cs.PGVECTOR_PASSWORD}}"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
pgvector:
|
|
5
|
+
image: pgvector/pgvector:${PGVECTOR_VERSION:-{{cs.PGVECTOR_VERSION}}}
|
|
6
|
+
restart: unless-stopped
|
|
7
|
+
volumes:
|
|
8
|
+
- pgvector-data:/var/lib/postgresql/data
|
|
9
|
+
environment:
|
|
10
|
+
POSTGRES_DB: ${PGVECTOR_DB:-{{cs.PGVECTOR_DB}}}
|
|
11
|
+
POSTGRES_USER: ${PGVECTOR_USER:-{{cs.PGVECTOR_USER}}}
|
|
12
|
+
POSTGRES_PASSWORD: ${PGVECTOR_PASSWORD:-{{cs.PGVECTOR_PASSWORD}}}
|
|
13
|
+
ports:
|
|
14
|
+
- '${PGVECTOR_PORT:-{{cs.PGVECTOR_PORT}}}:5432'
|
|
15
|
+
networks:
|
|
16
|
+
- devnet
|
|
17
|
+
healthcheck:
|
|
18
|
+
test:
|
|
19
|
+
[
|
|
20
|
+
'CMD-SHELL',
|
|
21
|
+
'pg_isready -U ${PGVECTOR_USER:-{{cs.PGVECTOR_USER}}} -d ${PGVECTOR_DB:-{{cs.PGVECTOR_DB}}}',
|
|
22
|
+
]
|
|
23
|
+
interval: 10s
|
|
24
|
+
timeout: 5s
|
|
25
|
+
retries: 5
|
|
26
|
+
start_period: 10s
|
|
27
|
+
|
|
28
|
+
volumes:
|
|
29
|
+
pgvector-data:
|
|
30
|
+
|
|
31
|
+
networks:
|
|
32
|
+
devnet:
|
|
33
|
+
name: devnet
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
id: pgvector
|
|
2
|
+
name: pgvector (PostgreSQL + vector)
|
|
3
|
+
description: PostgreSQL 16 with the pgvector extension for vector similarity search
|
|
4
|
+
category: database
|
|
5
|
+
supports:
|
|
6
|
+
- compose
|
|
7
|
+
requires: []
|
|
8
|
+
suggests:
|
|
9
|
+
- ollama
|
|
10
|
+
- python
|
|
11
|
+
- nodejs
|
|
12
|
+
- prometheus
|
|
13
|
+
- grafana
|
|
14
|
+
conflicts:
|
|
15
|
+
- postgres
|
|
16
|
+
serviceOrder: 0
|
|
17
|
+
tags:
|
|
18
|
+
- database
|
|
19
|
+
- sql
|
|
20
|
+
- vector
|
|
21
|
+
- embeddings
|
|
22
|
+
- postgres
|
|
23
|
+
- pgvector
|
|
24
|
+
ports:
|
|
25
|
+
- port: 5432
|
|
26
|
+
service: pgvector
|
|
27
|
+
protocol: tcp
|
|
28
|
+
description: pgvector database connection
|
|
29
|
+
onAutoForward: notify
|
|
30
|
+
connectionStringTemplate: 'postgresql://{pgvector_user}:{pgvector_password}@{host}:{port}/{pgvector_db}'
|
|
31
|
+
parameters:
|
|
32
|
+
PGVECTOR_DB:
|
|
33
|
+
description: Name of the database to create
|
|
34
|
+
default: devdb
|
|
35
|
+
PGVECTOR_USER:
|
|
36
|
+
description: PostgreSQL superuser name
|
|
37
|
+
default: postgres
|
|
38
|
+
PGVECTOR_PASSWORD:
|
|
39
|
+
description: PostgreSQL superuser password
|
|
40
|
+
default: postgres
|
|
41
|
+
sensitive: true
|
|
42
|
+
PGVECTOR_PORT:
|
|
43
|
+
description: Host port mapped to pgvector (5432 inside container)
|
|
44
|
+
default: '5432'
|
|
45
|
+
PGVECTOR_VERSION:
|
|
46
|
+
description: pgvector/pgvector image tag (e.g. pg16, pg17)
|
|
47
|
+
default: pg16
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
|
|
3
|
-
"features": {
|
|
4
|
-
"ghcr.io/devcontainers/features/node:1": {
|
|
5
|
-
"version": "lts"
|
|
6
|
-
}
|
|
7
|
-
},
|
|
8
3
|
"postCreateCommand": {
|
|
9
4
|
"setup-playwright": "bash .devcontainer/scripts/setup-playwright.sh"
|
|
10
5
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# PostgreSQL Configuration
|
|
2
|
-
POSTGRES_VERSION=
|
|
3
|
-
POSTGRES_DB=
|
|
4
|
-
POSTGRES_USER=
|
|
5
|
-
POSTGRES_PASSWORD=
|
|
6
|
-
POSTGRES_PORT=
|
|
2
|
+
POSTGRES_VERSION={{cs.POSTGRES_VERSION}}
|
|
3
|
+
POSTGRES_DB={{cs.POSTGRES_DB}}
|
|
4
|
+
POSTGRES_USER={{cs.POSTGRES_USER}}
|
|
5
|
+
POSTGRES_PASSWORD={{cs.POSTGRES_PASSWORD}}
|
|
6
|
+
POSTGRES_PORT={{cs.POSTGRES_PORT}}
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
},
|
|
14
14
|
"remoteEnv": {
|
|
15
15
|
"POSTGRES_HOST": "postgres",
|
|
16
|
-
"POSTGRES_PORT": "
|
|
17
|
-
"POSTGRES_DB": "
|
|
18
|
-
"POSTGRES_USER": "
|
|
19
|
-
"POSTGRES_PASSWORD": "
|
|
16
|
+
"POSTGRES_PORT": "{{cs.POSTGRES_PORT}}",
|
|
17
|
+
"POSTGRES_DB": "{{cs.POSTGRES_DB}}",
|
|
18
|
+
"POSTGRES_USER": "{{cs.POSTGRES_USER}}",
|
|
19
|
+
"POSTGRES_PASSWORD": "{{cs.POSTGRES_PASSWORD}}"
|
|
20
20
|
}
|
|
21
21
|
}
|
|
@@ -2,20 +2,24 @@ version: '3.8'
|
|
|
2
2
|
|
|
3
3
|
services:
|
|
4
4
|
postgres:
|
|
5
|
-
image: postgres:${POSTGRES_VERSION:-
|
|
5
|
+
image: postgres:${POSTGRES_VERSION:-{{cs.POSTGRES_VERSION}}}-alpine
|
|
6
6
|
restart: unless-stopped
|
|
7
7
|
volumes:
|
|
8
8
|
- postgres-data:/var/lib/postgresql/data
|
|
9
9
|
environment:
|
|
10
|
-
POSTGRES_DB: ${POSTGRES_DB:-
|
|
11
|
-
POSTGRES_USER: ${POSTGRES_USER:-
|
|
12
|
-
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-
|
|
10
|
+
POSTGRES_DB: ${POSTGRES_DB:-{{cs.POSTGRES_DB}}}
|
|
11
|
+
POSTGRES_USER: ${POSTGRES_USER:-{{cs.POSTGRES_USER}}}
|
|
12
|
+
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-{{cs.POSTGRES_PASSWORD}}}
|
|
13
13
|
ports:
|
|
14
|
-
- '${POSTGRES_PORT:-
|
|
14
|
+
- '${POSTGRES_PORT:-{{cs.POSTGRES_PORT}}}:5432'
|
|
15
15
|
networks:
|
|
16
16
|
- devnet
|
|
17
17
|
healthcheck:
|
|
18
|
-
test:
|
|
18
|
+
test:
|
|
19
|
+
[
|
|
20
|
+
'CMD-SHELL',
|
|
21
|
+
'pg_isready -U ${POSTGRES_USER:-{{cs.POSTGRES_USER}}} -d ${POSTGRES_DB:-{{cs.POSTGRES_DB}}}',
|
|
22
|
+
]
|
|
19
23
|
interval: 10s
|
|
20
24
|
timeout: 5s
|
|
21
25
|
retries: 5
|
|
@@ -26,3 +30,4 @@ volumes:
|
|
|
26
30
|
|
|
27
31
|
networks:
|
|
28
32
|
devnet:
|
|
33
|
+
name: devnet
|
|
@@ -5,8 +5,12 @@ category: database
|
|
|
5
5
|
supports:
|
|
6
6
|
- compose
|
|
7
7
|
requires: []
|
|
8
|
-
suggests:
|
|
9
|
-
|
|
8
|
+
suggests:
|
|
9
|
+
- prometheus
|
|
10
|
+
- grafana
|
|
11
|
+
conflicts:
|
|
12
|
+
- pgvector
|
|
13
|
+
serviceOrder: 0
|
|
10
14
|
tags:
|
|
11
15
|
- database
|
|
12
16
|
- sql
|
|
@@ -18,3 +22,20 @@ ports:
|
|
|
18
22
|
description: PostgreSQL database connection
|
|
19
23
|
onAutoForward: notify
|
|
20
24
|
connectionStringTemplate: 'postgresql://{postgres_user}:{postgres_password}@{host}:{port}/{postgres_db}'
|
|
25
|
+
parameters:
|
|
26
|
+
POSTGRES_DB:
|
|
27
|
+
description: Name of the database to create
|
|
28
|
+
default: devdb
|
|
29
|
+
POSTGRES_USER:
|
|
30
|
+
description: PostgreSQL superuser name
|
|
31
|
+
default: postgres
|
|
32
|
+
POSTGRES_PASSWORD:
|
|
33
|
+
description: PostgreSQL superuser password
|
|
34
|
+
default: postgres
|
|
35
|
+
sensitive: true
|
|
36
|
+
POSTGRES_PORT:
|
|
37
|
+
description: Host port mapped to PostgreSQL (5432 inside container)
|
|
38
|
+
default: '5432'
|
|
39
|
+
POSTGRES_VERSION:
|
|
40
|
+
description: PostgreSQL major version
|
|
41
|
+
default: '16'
|
|
@@ -1,9 +1,3 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json"
|
|
3
|
-
"features": {
|
|
4
|
-
"ghcr.io/devcontainers/features/python:1": {
|
|
5
|
-
"version": "3.12",
|
|
6
|
-
"installTools": true
|
|
7
|
-
}
|
|
8
|
-
}
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json"
|
|
9
3
|
}
|
|
@@ -2,6 +2,7 @@ version: '3.8'
|
|
|
2
2
|
services:
|
|
3
3
|
prometheus:
|
|
4
4
|
image: prom/prometheus:${PROMETHEUS_VERSION:-latest}
|
|
5
|
+
restart: unless-stopped
|
|
5
6
|
command:
|
|
6
7
|
- '--config.file=/etc/prometheus/prometheus.yml'
|
|
7
8
|
- '--storage.tsdb.path=/prometheus'
|
|
@@ -14,9 +15,16 @@ services:
|
|
|
14
15
|
- '${PROMETHEUS_PORT:-9090}:9090'
|
|
15
16
|
networks:
|
|
16
17
|
- devnet
|
|
18
|
+
healthcheck:
|
|
19
|
+
test: ['CMD', 'wget', '-qO-', 'http://localhost:9090/-/ready']
|
|
20
|
+
interval: 10s
|
|
21
|
+
timeout: 5s
|
|
22
|
+
retries: 5
|
|
23
|
+
start_period: 15s
|
|
17
24
|
|
|
18
25
|
volumes:
|
|
19
26
|
prometheus_data:
|
|
20
27
|
|
|
21
28
|
networks:
|
|
22
29
|
devnet:
|
|
30
|
+
name: devnet
|
|
@@ -2,6 +2,7 @@ version: '3.8'
|
|
|
2
2
|
services:
|
|
3
3
|
promtail:
|
|
4
4
|
image: grafana/promtail:${PROMTAIL_VERSION:-latest}
|
|
5
|
+
restart: unless-stopped
|
|
5
6
|
command: -config.file=/etc/promtail/promtail-config.yaml
|
|
6
7
|
volumes:
|
|
7
8
|
- ./promtail-config-promtail.yaml:/etc/promtail/promtail-config.yaml
|
|
@@ -11,6 +12,13 @@ services:
|
|
|
11
12
|
- loki
|
|
12
13
|
networks:
|
|
13
14
|
- devnet
|
|
15
|
+
healthcheck:
|
|
16
|
+
test: ['CMD', 'wget', '-qO-', 'http://localhost:9080/ready']
|
|
17
|
+
interval: 10s
|
|
18
|
+
timeout: 5s
|
|
19
|
+
retries: 5
|
|
20
|
+
start_period: 10s
|
|
14
21
|
|
|
15
22
|
networks:
|
|
16
23
|
devnet:
|
|
24
|
+
name: devnet
|