feat: fixed migration for electric-sql

This commit is contained in:
Anish Sarkar 2026-01-14 23:23:45 +05:30
parent 5712336feb
commit 7a9a14aa66
4 changed files with 84 additions and 78 deletions

View file

@ -8,7 +8,6 @@ services:
volumes: volumes:
- postgres_data:/var/lib/postgresql/data - postgres_data:/var/lib/postgresql/data
- ./scripts/docker/postgresql.conf:/etc/postgresql/postgresql.conf:ro - ./scripts/docker/postgresql.conf:/etc/postgresql/postgresql.conf:ro
- ./scripts/docker/init-electric-user.sql:/docker-entrypoint-initdb.d/init-electric-user.sql:ro
environment: environment:
- POSTGRES_USER=${POSTGRES_USER:-postgres} - POSTGRES_USER=${POSTGRES_USER:-postgres}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}

View file

@ -1,11 +0,0 @@
-- Electrify tables for Electric SQL sync
-- This tells Electric SQL which tables to sync
-- Run this after running migrations
-- Electrify notifications table
ALTER TABLE notifications ENABLE ELECTRIC;
-- You can electrify other tables as needed:
-- ALTER TABLE documents ENABLE ELECTRIC;
-- ALTER TABLE logs ENABLE ELECTRIC;

View file

@ -1,30 +0,0 @@
-- Create Electric SQL replication user
-- This script is run during PostgreSQL initialization
DO $$
BEGIN
IF NOT EXISTS (SELECT FROM pg_user WHERE usename = 'electric') THEN
CREATE USER electric WITH REPLICATION PASSWORD 'electric_password';
END IF;
END
$$;
-- Grant necessary permissions
GRANT CONNECT ON DATABASE surfsense TO electric;
GRANT USAGE ON SCHEMA public TO electric;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO electric;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO electric;
-- Grant permissions on future tables
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO electric;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON SEQUENCES TO electric;
-- Create the publication that Electric SQL expects
-- Electric will add tables to this publication when shapes are subscribed
DO $$
BEGIN
IF NOT EXISTS (SELECT FROM pg_publication WHERE pubname = 'electric_publication_default') THEN
CREATE PUBLICATION electric_publication_default;
END IF;
END
$$;

View file

@ -4,7 +4,7 @@ Revision ID: 62
Revises: 61 Revises: 61
Creates notifications table and sets up Electric SQL replication Creates notifications table and sets up Electric SQL replication
(REPLICA IDENTITY FULL and publication) for notifications, (user, publication, REPLICA IDENTITY FULL) for notifications,
search_source_connectors, and documents tables. search_source_connectors, and documents tables.
""" """
@ -45,19 +45,68 @@ def upgrade() -> None:
op.create_index("ix_notifications_created_at", "notifications", ["created_at"]) op.create_index("ix_notifications_created_at", "notifications", ["created_at"])
op.create_index("ix_notifications_user_read", "notifications", ["user_id", "read"]) op.create_index("ix_notifications_user_read", "notifications", ["user_id", "read"])
# Set up Electric SQL replication for real-time sync tables # =====================================================
# Set REPLICA IDENTITY FULL (required by Electric SQL for replication) # Electric SQL Setup - User and Publication
# This logs full row data for UPDATE/DELETE operations in the WAL # =====================================================
op.execute("ALTER TABLE notifications REPLICA IDENTITY FULL;")
op.execute("ALTER TABLE search_source_connectors REPLICA IDENTITY FULL;")
op.execute("ALTER TABLE documents REPLICA IDENTITY FULL;")
# Add tables to Electric SQL publication for replication if publication exists # Create Electric SQL replication user if not exists
op.execute(
"""
DO $$
BEGIN
IF NOT EXISTS (SELECT FROM pg_user WHERE usename = 'electric') THEN
CREATE USER electric WITH REPLICATION PASSWORD 'electric_password';
END IF;
END
$$;
"""
)
# Grant necessary permissions to electric user
op.execute(
"""
DO $$
DECLARE
db_name TEXT := current_database();
BEGIN
EXECUTE format('GRANT CONNECT ON DATABASE %I TO electric', db_name);
END
$$;
"""
)
op.execute("GRANT USAGE ON SCHEMA public TO electric;")
op.execute("GRANT SELECT ON ALL TABLES IN SCHEMA public TO electric;")
op.execute("GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO electric;")
op.execute("ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO electric;")
op.execute("ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON SEQUENCES TO electric;")
# Create the publication if not exists
op.execute(
"""
DO $$
BEGIN
IF NOT EXISTS (SELECT FROM pg_publication WHERE pubname = 'electric_publication_default') THEN
CREATE PUBLICATION electric_publication_default;
END IF;
END
$$;
"""
)
# =====================================================
# Electric SQL Setup - Table Configuration
# =====================================================
# Set REPLICA IDENTITY FULL (required by Electric SQL for replication)
op.execute("ALTER TABLE notifications REPLICA IDENTITY FULL;")
op.execute("ALTER TABLE search_source_connectors REPLICA IDENTITY FULL;")
op.execute("ALTER TABLE documents REPLICA IDENTITY FULL;")
# Add tables to Electric SQL publication for replication
op.execute( op.execute(
""" """
DO $$ DO $$
BEGIN BEGIN
IF EXISTS (SELECT 1 FROM pg_publication WHERE pubname = 'electric_publication_default') THEN
-- Add notifications if not already added -- Add notifications if not already added
IF NOT EXISTS ( IF NOT EXISTS (
SELECT 1 FROM pg_publication_tables SELECT 1 FROM pg_publication_tables
@ -84,7 +133,6 @@ def upgrade() -> None:
) THEN ) THEN
ALTER PUBLICATION electric_publication_default ADD TABLE documents; ALTER PUBLICATION electric_publication_default ADD TABLE documents;
END IF; END IF;
END IF;
END END
$$; $$;
""" """