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,45 +45,93 @@ 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( op.execute(
""" """
DO $$ DO $$
BEGIN BEGIN
IF EXISTS (SELECT 1 FROM pg_publication WHERE pubname = 'electric_publication_default') THEN IF NOT EXISTS (SELECT FROM pg_user WHERE usename = 'electric') THEN
-- Add notifications if not already added CREATE USER electric WITH REPLICATION PASSWORD 'electric_password';
IF NOT EXISTS ( END IF;
SELECT 1 FROM pg_publication_tables END
WHERE pubname = 'electric_publication_default' $$;
AND tablename = 'notifications' """
) THEN )
ALTER PUBLICATION electric_publication_default ADD TABLE notifications;
END IF;
-- Add search_source_connectors if not already added # Grant necessary permissions to electric user
IF NOT EXISTS ( op.execute(
SELECT 1 FROM pg_publication_tables """
WHERE pubname = 'electric_publication_default' DO $$
AND tablename = 'search_source_connectors' DECLARE
) THEN db_name TEXT := current_database();
ALTER PUBLICATION electric_publication_default ADD TABLE search_source_connectors; BEGIN
END IF; 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;")
-- Add documents if not already added # Create the publication if not exists
IF NOT EXISTS ( op.execute(
SELECT 1 FROM pg_publication_tables """
WHERE pubname = 'electric_publication_default' DO $$
AND tablename = 'documents' BEGIN
) THEN IF NOT EXISTS (SELECT FROM pg_publication WHERE pubname = 'electric_publication_default') THEN
ALTER PUBLICATION electric_publication_default ADD TABLE documents; CREATE PUBLICATION electric_publication_default;
END IF; 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(
"""
DO $$
BEGIN
-- Add notifications if not already added
IF NOT EXISTS (
SELECT 1 FROM pg_publication_tables
WHERE pubname = 'electric_publication_default'
AND tablename = 'notifications'
) THEN
ALTER PUBLICATION electric_publication_default ADD TABLE notifications;
END IF;
-- Add search_source_connectors if not already added
IF NOT EXISTS (
SELECT 1 FROM pg_publication_tables
WHERE pubname = 'electric_publication_default'
AND tablename = 'search_source_connectors'
) THEN
ALTER PUBLICATION electric_publication_default ADD TABLE search_source_connectors;
END IF;
-- Add documents if not already added
IF NOT EXISTS (
SELECT 1 FROM pg_publication_tables
WHERE pubname = 'electric_publication_default'
AND tablename = 'documents'
) THEN
ALTER PUBLICATION electric_publication_default ADD TABLE documents;
END IF; END IF;
END END
$$; $$;