feat(#2): Implement PostgreSQL 17 + pgvector database schema

Establishes multi-tenant database layer with vector similarity search for AI-powered memory features. Includes Docker infrastructure, Prisma ORM integration, NestJS services, and shared types across the monorepo.

Key changes:
- Docker: PostgreSQL 17 + pgvector v0.7.4, Valkey cache
- Schema: 8 models (User, Workspace, Task, Event, Project, ActivityLog, MemoryEmbedding) with RLS preparation
- NestJS: PrismaModule, DatabaseModule, EmbeddingsService
- Shared: Type-safe enums, constants, and database types

Fixes #2

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Jason Woltje
2026-01-28 16:06:34 -06:00
parent 355cf2124b
commit 99afde4f99
26 changed files with 1844 additions and 64 deletions

View File

@@ -0,0 +1,22 @@
# Development overrides for docker-compose.yml
# Usage: docker compose -f docker-compose.yml -f docker-compose.dev.yml up
services:
postgres:
environment:
POSTGRES_USER: mosaic
POSTGRES_PASSWORD: mosaic_dev_password
POSTGRES_DB: mosaic
ports:
- "5432:5432"
# Enable query logging for development
command:
- "postgres"
- "-c"
- "log_statement=all"
- "-c"
- "log_duration=on"
valkey:
ports:
- "6379:6379"

51
docker/docker-compose.yml Normal file
View File

@@ -0,0 +1,51 @@
services:
postgres:
build:
context: ./postgres
dockerfile: Dockerfile
container_name: mosaic-postgres
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER:-mosaic}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-mosaic_dev_password}
POSTGRES_DB: ${POSTGRES_DB:-mosaic}
ports:
- "${POSTGRES_PORT:-5432}:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-mosaic} -d ${POSTGRES_DB:-mosaic}"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
networks:
- mosaic-network
valkey:
image: valkey/valkey:8-alpine
container_name: mosaic-valkey
restart: unless-stopped
ports:
- "${VALKEY_PORT:-6379}:6379"
volumes:
- valkey_data:/data
healthcheck:
test: ["CMD", "valkey-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
networks:
- mosaic-network
volumes:
postgres_data:
name: mosaic-postgres-data
valkey_data:
name: mosaic-valkey-data
networks:
mosaic-network:
name: mosaic-network
driver: bridge

View File

@@ -0,0 +1,25 @@
FROM postgres:17-alpine
LABEL maintainer="Mosaic Stack <dev@mosaic.local>"
LABEL description="PostgreSQL 17 with pgvector extension"
# Install build dependencies for pgvector
RUN apk add --no-cache --virtual .build-deps \
git \
build-base
# Clone and build pgvector v0.7.4 (without LLVM bitcode compilation)
RUN git clone --branch v0.7.4 https://github.com/pgvector/pgvector.git /tmp/pgvector \
&& cd /tmp/pgvector \
&& make OPTFLAGS="" with_llvm=no \
&& make install with_llvm=no \
&& rm -rf /tmp/pgvector
# Clean up build dependencies to reduce image size
RUN apk del .build-deps
# Copy initialization scripts
COPY init-scripts/ /docker-entrypoint-initdb.d/
# Expose PostgreSQL port
EXPOSE 5432

View File

@@ -0,0 +1,18 @@
-- Mosaic Stack Database Initialization Script
-- This script runs automatically when the PostgreSQL container is first created
-- Enable UUID extension for UUID generation
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- Enable pgvector extension for vector similarity search
CREATE EXTENSION IF NOT EXISTS "vector";
-- Set default timezone to UTC
SET timezone = 'UTC';
-- Log successful initialization
DO $$
BEGIN
RAISE NOTICE 'Mosaic Stack database initialized successfully';
RAISE NOTICE 'Extensions enabled: uuid-ossp, vector';
END $$;