Add full monorepo: virtual-banker, backend, frontend, docs, scripts, deployment
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
156
docs/BLOCKSCOUT_SCHEMA_MISMATCH_FIX.md
Normal file
156
docs/BLOCKSCOUT_SCHEMA_MISMATCH_FIX.md
Normal file
@@ -0,0 +1,156 @@
|
||||
# Fix Blockscout Schema/Connection Mismatch
|
||||
|
||||
## Problem
|
||||
|
||||
The `migrations_status` table exists when checked from postgres, but Blockscout can't see it and crashes with:
|
||||
```
|
||||
ERROR 42P01 (undefined_table) relation "migrations_status" does not exist
|
||||
```
|
||||
|
||||
## Root Cause
|
||||
|
||||
This typically indicates:
|
||||
1. **Schema mismatch**: Table exists in a different schema than Blockscout is searching
|
||||
2. **Database mismatch**: Blockscout connecting to different database
|
||||
3. **Search path issue**: PostgreSQL `search_path` doesn't include the schema
|
||||
4. **Connection string issue**: DATABASE_URL points to wrong database/schema
|
||||
|
||||
## Diagnosis Commands
|
||||
|
||||
Run these to identify the issue:
|
||||
|
||||
```bash
|
||||
# From VMID 5000
|
||||
|
||||
# 1. Check what schema the table is in
|
||||
docker exec blockscout-postgres psql -U blockscout -d blockscout -c "
|
||||
SELECT table_schema, table_name
|
||||
FROM information_schema.tables
|
||||
WHERE table_name = 'migrations_status';
|
||||
"
|
||||
|
||||
# 2. Check current search_path
|
||||
docker exec blockscout-postgres psql -U blockscout -d blockscout -c "SHOW search_path;"
|
||||
|
||||
# 3. Check Blockscout DATABASE_URL
|
||||
BLOCKSCOUT_CONTAINER=$(docker ps -a | grep blockscout | grep -v postgres | awk '{print $1}' | head -1)
|
||||
docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' $BLOCKSCOUT_CONTAINER | grep DATABASE_URL
|
||||
|
||||
# 4. Test table access with explicit schema
|
||||
docker exec blockscout-postgres psql -U blockscout -d blockscout -c "
|
||||
SELECT COUNT(*) FROM public.migrations_status;
|
||||
"
|
||||
```
|
||||
|
||||
## Solutions
|
||||
|
||||
### Solution 1: Fix Search Path
|
||||
|
||||
If table is in `public` schema but search_path doesn't include it:
|
||||
|
||||
```bash
|
||||
docker exec blockscout-postgres psql -U blockscout -d blockscout << 'SQL'
|
||||
ALTER DATABASE blockscout SET search_path = public, "$user";
|
||||
\c blockscout
|
||||
SELECT set_config('search_path', 'public', false);
|
||||
SQL
|
||||
```
|
||||
|
||||
### Solution 2: Verify DATABASE_URL
|
||||
|
||||
Check Blockscout's DATABASE_URL matches the actual database:
|
||||
|
||||
```bash
|
||||
# Check what Blockscout is using
|
||||
BLOCKSCOUT_CONTAINER=$(docker ps -a | grep blockscout | grep -v postgres | awk '{print $1}' | head -1)
|
||||
docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' $BLOCKSCOUT_CONTAINER | grep DATABASE_URL
|
||||
|
||||
# Should be: postgresql://blockscout:blockscout@postgres:5432/blockscout
|
||||
# If different, update docker-compose.yml
|
||||
```
|
||||
|
||||
### Solution 3: Recreate migrations_status in Correct Schema
|
||||
|
||||
If table is in wrong schema, recreate it:
|
||||
|
||||
```bash
|
||||
# Drop and recreate in public schema
|
||||
docker exec blockscout-postgres psql -U blockscout -d blockscout << 'SQL'
|
||||
-- Drop if exists in wrong schema
|
||||
DROP TABLE IF EXISTS migrations_status CASCADE;
|
||||
|
||||
-- Recreate in public schema (migrations will do this)
|
||||
-- Or run migrations again
|
||||
SQL
|
||||
|
||||
# Then run migrations
|
||||
BLOCKSCOUT_CONTAINER=$(docker ps -a | grep blockscout | grep -v postgres | awk '{print $1}' | head -1)
|
||||
docker start $BLOCKSCOUT_CONTAINER
|
||||
sleep 10
|
||||
docker exec -it $BLOCKSCOUT_CONTAINER bin/blockscout eval "Explorer.Release.migrate()"
|
||||
```
|
||||
|
||||
### Solution 4: Check for Multiple Databases
|
||||
|
||||
Verify Blockscout is connecting to the correct database:
|
||||
|
||||
```bash
|
||||
# List all databases
|
||||
docker exec blockscout-postgres psql -U blockscout -d blockscout -c "\l"
|
||||
|
||||
# Check which database has the table
|
||||
docker exec blockscout-postgres psql -U blockscout -d postgres -c "
|
||||
SELECT datname FROM pg_database;
|
||||
"
|
||||
|
||||
# For each database, check if migrations_status exists
|
||||
for db in blockscout postgres; do
|
||||
echo "Checking database: $db"
|
||||
docker exec blockscout-postgres psql -U blockscout -d $db -c "
|
||||
SELECT CASE WHEN EXISTS (
|
||||
SELECT 1 FROM information_schema.tables
|
||||
WHERE table_name = 'migrations_status'
|
||||
) THEN '✅ EXISTS' ELSE '❌ MISSING' END;
|
||||
"
|
||||
done
|
||||
```
|
||||
|
||||
## Most Likely Fix
|
||||
|
||||
The table exists but Blockscout can't see it due to schema search path. Try:
|
||||
|
||||
```bash
|
||||
# From VMID 5000
|
||||
|
||||
# 1. Ensure search_path includes public
|
||||
docker exec blockscout-postgres psql -U blockscout -d blockscout -c "
|
||||
ALTER DATABASE blockscout SET search_path = public;
|
||||
"
|
||||
|
||||
# 2. Verify table is accessible
|
||||
docker exec blockscout-postgres psql -U blockscout -d blockscout -c "
|
||||
SET search_path = public;
|
||||
SELECT COUNT(*) FROM migrations_status;
|
||||
"
|
||||
|
||||
# 3. Restart Blockscout
|
||||
BLOCKSCOUT_CONTAINER=$(docker ps -a | grep blockscout | grep -v postgres | awk '{print $1}' | head -1)
|
||||
docker restart $BLOCKSCOUT_CONTAINER
|
||||
```
|
||||
|
||||
## Automated Diagnosis
|
||||
|
||||
Run the diagnosis script:
|
||||
|
||||
```bash
|
||||
# From Proxmox host
|
||||
cd /home/intlc/projects/proxmox/explorer-monorepo
|
||||
./scripts/diagnose-blockscout-schema-issue.sh
|
||||
```
|
||||
|
||||
This will identify:
|
||||
- What schema the table is in
|
||||
- What search_path is configured
|
||||
- What DATABASE_URL Blockscout is using
|
||||
- Whether Blockscout can actually see the table
|
||||
|
||||
Reference in New Issue
Block a user