Skip to content

Database Setup

Capyshop requires PostgreSQL 17+ with the pgvector extension installed.

Prerequisites

  • PostgreSQL 17+ server with pgvector installed
  • Access to the postgres superuser (or equivalent) for initial setup

1. Create the Database and User

Connect to your PostgreSQL server as a superuser (e.g. postgres) and run:

sql
CREATE DATABASE your_database;
CREATE USER your_user WITH PASSWORD 'your_secure_password';

2. Configure Database Permissions

Connect to the newly created database and grant the required permissions:

sql
-- Connect to the database
\c your_database

-- Grant privileges to the user
GRANT ALL PRIVILEGES ON DATABASE your_database TO your_user;
GRANT ALL ON SCHEMA public TO your_user;

-- Create the pgvector extension (requires superuser)
CREATE EXTENSION IF NOT EXISTS vector;

The vector extension must be created by a superuser. Once created, the application user can use it without superuser privileges.

3. Set the Connection URL

Set the DATABASE_URL environment variable with your connection details:

DATABASE_URL=postgresql://your_user:your_secure_password@localhost:5432/your_database

Docker Compose Example

If using the custom PostgreSQL image with pgvector, you can automate the setup with an init script.

Create init-db.sql:

sql
GRANT ALL PRIVILEGES ON DATABASE your_database TO your_user;
GRANT ALL ON SCHEMA public TO your_user;
CREATE EXTENSION IF NOT EXISTS vector;

Mount it in your docker-compose.yml:

yaml
postgres:
  image: your-pgvector-image:latest
  environment:
    - POSTGRES_USER=postgres
    - POSTGRES_PASSWORD=postgres_password
    - POSTGRES_DB=your_database
  volumes:
    - ./init-db.sql:/docker-entrypoint-initdb.d/init-db.sql
    - postgres_data:/var/lib/postgresql/data

Then create the application user manually or via another init script:

sql
-- In a second init script (e.g. 00-create-user.sql, runs before init-db.sql)
CREATE USER your_user WITH PASSWORD 'your_secure_password';

Note: Scripts in /docker-entrypoint-initdb.d/ only run when the PostgreSQL data directory is empty (first start). If the database already exists, run the SQL commands manually.

Troubleshooting

ErrorCauseFix
permission denied for schema publicUser lacks schema permissionsGRANT ALL ON SCHEMA public TO your_user;
permission denied to create extension "vector"Extension must be created by superuserRun CREATE EXTENSION IF NOT EXISTS vector; as superuser
type "vector" does not existpgvector extension not installed or not createdInstall pgvector in PostgreSQL and run CREATE EXTENSION IF NOT EXISTS vector;
P3009 - failed migrationsA previous migration failed and left dirty stateDROP TABLE IF EXISTS _prisma_migrations CASCADE; then re-run migrations
Connection url is emptyDATABASE_URL not setEnsure the env variable is set in your deployment environment