@@ -42,6 +42,31 @@ if [ -z "$STT_SERVICE" ]; then
4242 echo " ✅ Using default STT_SERVICE: local/base"
4343fi
4444
45+ # ================================================
46+ # Set Electric SQL configuration
47+ # ================================================
48+ export ELECTRIC_DB_USER=" ${ELECTRIC_DB_USER:- electric} "
49+ export ELECTRIC_DB_PASSWORD=" ${ELECTRIC_DB_PASSWORD:- electric_password} "
50+ if [ -z " $ELECTRIC_DATABASE_URL " ]; then
51+ export ELECTRIC_DATABASE_URL=" postgresql://${ELECTRIC_DB_USER} :${ELECTRIC_DB_PASSWORD} @localhost:5432/${POSTGRES_DB:- surfsense} ?sslmode=disable"
52+ echo " ✅ Electric SQL URL configured dynamically"
53+ else
54+ # Ensure sslmode=disable is in the URL if not already present
55+ if [[ " $ELECTRIC_DATABASE_URL " != * " sslmode=" * ]]; then
56+ # Add sslmode=disable (handle both cases: with or without existing query params)
57+ if [[ " $ELECTRIC_DATABASE_URL " == * " ?" * ]]; then
58+ export ELECTRIC_DATABASE_URL=" ${ELECTRIC_DATABASE_URL} &sslmode=disable"
59+ else
60+ export ELECTRIC_DATABASE_URL=" ${ELECTRIC_DATABASE_URL} ?sslmode=disable"
61+ fi
62+ fi
63+ echo " ✅ Electric SQL URL configured from environment"
64+ fi
65+
66+ # Set Electric SQL port
67+ export ELECTRIC_PORT=" ${ELECTRIC_PORT:- 5133} "
68+ export PORT=" ${ELECTRIC_PORT} "
69+
4570# ================================================
4671# Initialize PostgreSQL if needed
4772# ================================================
@@ -60,6 +85,11 @@ if [ ! -f /data/postgres/PG_VERSION ]; then
6085 echo " local all all trust" >> /data/postgres/pg_hba.conf
6186 echo " listen_addresses='*'" >> /data/postgres/postgresql.conf
6287
88+ # Enable logical replication for Electric SQL
89+ echo " wal_level = logical" >> /data/postgres/postgresql.conf
90+ echo " max_replication_slots = 10" >> /data/postgres/postgresql.conf
91+ echo " max_wal_senders = 10" >> /data/postgres/postgresql.conf
92+
6393 # Start PostgreSQL temporarily to create database and user
6494 su - postgres -c " /usr/lib/postgresql/14/bin/pg_ctl -D /data/postgres -l /tmp/postgres_init.log start"
6595
@@ -73,6 +103,35 @@ if [ ! -f /data/postgres/PG_VERSION ]; then
73103 # Enable pgvector extension
74104 su - postgres -c " psql -d ${POSTGRES_DB:- surfsense} -c 'CREATE EXTENSION IF NOT EXISTS vector;'"
75105
106+ # Create Electric SQL replication user (idempotent - uses IF NOT EXISTS)
107+ echo " 📡 Creating Electric SQL replication user..."
108+ su - postgres -c " psql -d ${POSTGRES_DB:- surfsense} <<-EOSQL
109+ DO \\\$\\\$
110+ BEGIN
111+ IF NOT EXISTS (SELECT FROM pg_user WHERE usename = '${ELECTRIC_DB_USER} ') THEN
112+ CREATE USER ${ELECTRIC_DB_USER} WITH REPLICATION PASSWORD '${ELECTRIC_DB_PASSWORD} ';
113+ END IF;
114+ END
115+ \\\$\\\$ ;
116+
117+ GRANT CONNECT ON DATABASE ${POSTGRES_DB:- surfsense} TO ${ELECTRIC_DB_USER} ;
118+ GRANT USAGE ON SCHEMA public TO ${ELECTRIC_DB_USER} ;
119+ GRANT SELECT ON ALL TABLES IN SCHEMA public TO ${ELECTRIC_DB_USER} ;
120+ GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO ${ELECTRIC_DB_USER} ;
121+ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO ${ELECTRIC_DB_USER} ;
122+ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON SEQUENCES TO ${ELECTRIC_DB_USER} ;
123+
124+ -- Create the publication for Electric SQL (if not exists)
125+ DO \\\$\\\$
126+ BEGIN
127+ IF NOT EXISTS (SELECT FROM pg_publication WHERE pubname = 'electric_publication_default') THEN
128+ CREATE PUBLICATION electric_publication_default;
129+ END IF;
130+ END
131+ \\\$\\\$ ;
132+ EOSQL"
133+ echo " ✅ Electric SQL user '${ELECTRIC_DB_USER} ' created"
134+
76135 # Stop temporary PostgreSQL
77136 su - postgres -c " /usr/lib/postgresql/14/bin/pg_ctl -D /data/postgres stop"
78137
@@ -107,18 +166,23 @@ echo "🔧 Applying runtime environment configuration..."
107166NEXT_PUBLIC_FASTAPI_BACKEND_URL=" ${NEXT_PUBLIC_FASTAPI_BACKEND_URL:- http:// localhost: 8000} "
108167NEXT_PUBLIC_FASTAPI_BACKEND_AUTH_TYPE=" ${NEXT_PUBLIC_FASTAPI_BACKEND_AUTH_TYPE:- LOCAL} "
109168NEXT_PUBLIC_ETL_SERVICE=" ${NEXT_PUBLIC_ETL_SERVICE:- DOCLING} "
169+ NEXT_PUBLIC_ELECTRIC_URL=" ${NEXT_PUBLIC_ELECTRIC_URL:- http:// localhost: 5133} "
170+ NEXT_PUBLIC_ELECTRIC_AUTH_MODE=" ${NEXT_PUBLIC_ELECTRIC_AUTH_MODE:- insecure} "
110171
111172# Replace placeholders in all JS files
112173find /app/frontend -type f \( -name " *.js" -o -name " *.json" \) -exec sed -i \
113174 -e " s|__NEXT_PUBLIC_FASTAPI_BACKEND_URL__|${NEXT_PUBLIC_FASTAPI_BACKEND_URL} |g" \
114175 -e " s|__NEXT_PUBLIC_FASTAPI_BACKEND_AUTH_TYPE__|${NEXT_PUBLIC_FASTAPI_BACKEND_AUTH_TYPE} |g" \
115176 -e " s|__NEXT_PUBLIC_ETL_SERVICE__|${NEXT_PUBLIC_ETL_SERVICE} |g" \
177+ -e " s|__NEXT_PUBLIC_ELECTRIC_URL__|${NEXT_PUBLIC_ELECTRIC_URL} |g" \
178+ -e " s|__NEXT_PUBLIC_ELECTRIC_AUTH_MODE__|${NEXT_PUBLIC_ELECTRIC_AUTH_MODE} |g" \
116179 {} +
117180
118181echo " ✅ Environment configuration applied"
119- echo " Backend URL: ${NEXT_PUBLIC_FASTAPI_BACKEND_URL} "
120- echo " Auth Type: ${NEXT_PUBLIC_FASTAPI_BACKEND_AUTH_TYPE} "
121- echo " ETL Service: ${NEXT_PUBLIC_ETL_SERVICE} "
182+ echo " Backend URL: ${NEXT_PUBLIC_FASTAPI_BACKEND_URL} "
183+ echo " Auth Type: ${NEXT_PUBLIC_FASTAPI_BACKEND_AUTH_TYPE} "
184+ echo " ETL Service: ${NEXT_PUBLIC_ETL_SERVICE} "
185+ echo " Electric URL: ${NEXT_PUBLIC_ELECTRIC_URL} "
122186
123187# ================================================
124188# Run database migrations
@@ -161,6 +225,7 @@ echo "==========================================="
161225echo " Frontend URL: http://localhost:3000"
162226echo " Backend API: ${NEXT_PUBLIC_FASTAPI_BACKEND_URL} "
163227echo " API Docs: ${NEXT_PUBLIC_FASTAPI_BACKEND_URL} /docs"
228+ echo " Electric URL: ${NEXT_PUBLIC_ELECTRIC_URL:- http:// localhost: 5133} "
164229echo " Auth Type: ${NEXT_PUBLIC_FASTAPI_BACKEND_AUTH_TYPE} "
165230echo " ETL Service: ${NEXT_PUBLIC_ETL_SERVICE} "
166231echo " TTS Service: ${TTS_SERVICE} "
0 commit comments