Files
explorer-monorepo/docs/BLOCKSCOUT_MIGRATIONS_STATUS_FIX.md

152 lines
4.3 KiB
Markdown

# Fix Blockscout migrations_status Table Missing Error
## Problem
Blockscout container crashes with errors like:
```
ERROR 42P01 (undefined_table) relation "migrations_status" does not exist
```
Even though we verified tables exist, Blockscout can't find `migrations_status` when it starts, causing all migrator GenServers to crash.
## Root Cause
The `migrations_status` table may exist, but Blockscout's migration system hasn't properly initialized it, OR migrations need to be run again to ensure all tables are in the correct state.
## Solution
Run migrations BEFORE starting Blockscout, or ensure migrations run on startup.
### Quick Fix Commands (From VMID 5000)
```bash
# Step 1: Start container temporarily
BLOCKSCOUT_CONTAINER=$(docker ps -a | grep blockscout | grep -v postgres | awk '{print $1}' | head -1)
docker start $BLOCKSCOUT_CONTAINER
sleep 10
# Step 2: Run migrations
docker exec -it $BLOCKSCOUT_CONTAINER bin/blockscout eval "Explorer.Release.migrate()"
# Step 3: Verify migrations_status table
docker exec blockscout-postgres psql -U blockscout -d blockscout -c "
SELECT CASE WHEN EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'migrations_status')
THEN '✅ migrations_status exists'
ELSE '❌ migrations_status MISSING' END;
"
# Step 4: Restart Blockscout
docker restart $BLOCKSCOUT_CONTAINER
sleep 30
# Step 5: Check status
docker ps | grep blockscout
docker logs blockscout 2>&1 | tail -30
```
### Alternative: Run Migrations in One-Off Container
If the main container won't start, run migrations in a temporary container:
```bash
# Get network from existing container
BLOCKSCOUT_CONTAINER=$(docker ps -a | grep blockscout | grep -v postgres | awk '{print $1}' | head -1)
# Run migrations in one-off container
docker run --rm \
--network container:$BLOCKSCOUT_CONTAINER \
-e DATABASE_URL=postgresql://blockscout:blockscout@postgres:5432/blockscout \
blockscout/blockscout:latest \
bin/blockscout eval "Explorer.Release.migrate()"
```
### Update Docker Compose to Run Migrations on Startup
Modify `/opt/blockscout/docker-compose.yml` to run migrations before starting:
```yaml
blockscout:
image: blockscout/blockscout:latest
container_name: blockscout
command: sh -c "bin/blockscout eval 'Explorer.Release.migrate()' && bin/blockscout start"
# ... rest of config
```
Or use an init container pattern:
```yaml
blockscout-migrate:
image: blockscout/blockscout:latest
command: bin/blockscout eval "Explorer.Release.migrate()"
environment:
- DATABASE_URL=postgresql://blockscout:blockscout@postgres:5432/blockscout
depends_on:
postgres:
condition: service_healthy
blockscout:
image: blockscout/blockscout:latest
command: bin/blockscout start
depends_on:
blockscout-migrate:
condition: service_completed_successfully
postgres:
condition: service_healthy
```
## Automated Fix Script
Run the automated fix script:
```bash
# From Proxmox host
cd /home/intlc/projects/proxmox/explorer-monorepo
./scripts/fix-blockscout-migrations.sh
```
## Verification
After running migrations, verify:
```bash
# 1. Check migrations_status table exists
docker exec blockscout-postgres psql -U blockscout -d blockscout -c "
SELECT table_name
FROM information_schema.tables
WHERE table_name = 'migrations_status';
"
# 2. Check if Blockscout starts without errors
docker restart blockscout
sleep 30
docker logs blockscout 2>&1 | grep -i "migrations_status\|error" | tail -10
# 3. Verify container stays running
docker ps | grep blockscout
```
## Why This Happens
1. **Migrations not run**: If Blockscout was started before migrations completed
2. **Schema mismatch**: Tables exist but migrations_status wasn't created properly
3. **Database connection issue**: Blockscout connects to different database than expected
4. **Migration order**: Some migrations depend on migrations_status existing first
## Prevention
Always ensure migrations run before Blockscout starts:
1. **Use init container** (recommended)
2. **Run migrations in command** (simple but slower startup)
3. **Manual migration step** in deployment process
## Next Steps
After fixing migrations:
1. ✅ Verify `migrations_status` table exists
2. ✅ Build static assets: `docker exec -it blockscout mix phx.digest`
3. ✅ Verify Blockscout starts and stays running
4. ✅ Test API: `curl http://localhost:4000/api/v2/stats`