Migration Guides
Comprehensive guides for upgrading Earna AI Console and migrating between platforms.
Version Information
Current Version: Earna AI Console is running on Vercel AI SDK v5 with full TypeScript strict mode support. See AI SDK v5 Implementation for details.
Version Upgrades
From v1.x to v2.x
Breaking Changes: This upgrade includes breaking changes to the database schema and API structure.
Backup Your Data
# Export conversations
pnpm export:conversations
# Backup Supabase database
pg_dump $DATABASE_URL > backup-v1.sql
Update Dependencies
# Update to latest versions
pnpm add next@15 @ai-sdk/openai@latest ai@latest
pnpm add @supabase/supabase-js@latest
Database Migration
-- Add new columns
ALTER TABLE conversations ADD COLUMN model TEXT DEFAULT 'gpt-4o';
ALTER TABLE users ADD COLUMN daily_message_count INT DEFAULT 0;
ALTER TABLE users ADD COLUMN is_pro BOOLEAN DEFAULT false;
-- Update existing data
UPDATE conversations SET model = 'gpt-4o' WHERE model IS NULL;
Environment Variables
# New required variables
ENCRYPTION_KEY=your-32-byte-hex-key
NEXTAUTH_SECRET=your-secret
# Updated variable names
OPENAI_API_KEY=sk-proj-... # Changed format
Code Updates
// Old way (v1.x)
import { OpenAI } from 'openai';
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
// New way (v2.x)
import { openai } from '@ai-sdk/openai';
import { streamText } from 'ai';
Platform Migrations
From Custom Backend to Supabase
Export Existing Data
// Export users
const users = await db.collection('users').find({}).toArray();
const usersCSV = convertToCSV(users);
// Export conversations
const conversations = await db.collection('conversations').find({}).toArray();
const conversationsCSV = convertToCSV(conversations);
Set Up Supabase
# Install Supabase CLI
pnpm add -g @supabase/cli
# Initialize project
supabase init
# Start local development
supabase start
Create Schema
-- Create tables
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email TEXT UNIQUE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE conversations (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
title TEXT,
model TEXT DEFAULT 'gpt-4o',
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
Import Data
# Upload CSVs to Supabase
supabase db import users.csv
supabase db import conversations.csv
From Firebase to Supabase
Export Firebase Data
// firestore-export.js
const admin = require('firebase-admin');
const fs = require('fs');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
});
const db = admin.firestore();
async function exportCollection(collectionName) {
const snapshot = await db.collection(collectionName).get();
const data = snapshot.docs.map(doc => ({
id: doc.id,
...doc.data()
}));
fs.writeFileSync(`${collectionName}.json`, JSON.stringify(data, null, 2));
}
exportCollection('users');
exportCollection('conversations');
Transform Data Format
// transform-data.js
const firebase_users = require('./users.json');
const supabase_users = firebase_users.map(user => ({
id: user.uid,
email: user.email,
created_at: user.createdAt._seconds * 1000
}));
fs.writeFileSync('supabase_users.json', JSON.stringify(supabase_users));
Import to Supabase
-- Use Supabase Dashboard or SQL
INSERT INTO users (id, email, created_at)
SELECT
(data->>'id')::uuid,
data->>'email',
to_timestamp((data->>'created_at')::bigint / 1000)
FROM json_array_elements($1::json) AS data;
AI Provider Migrations
From OpenAI Legacy to OpenAI v4
Update API Key Format
# Old format
OPENAI_API_KEY=sk-...
# New format (if applicable)
OPENAI_API_KEY=sk-proj-...
Update Code
// Old way
import OpenAI from 'openai';
const openai = new OpenAI();
const completion = await openai.chat.completions.create({
model: 'gpt-4',
messages: messages,
stream: true,
});
// New way
import { openai } from '@ai-sdk/openai';
import { streamText } from 'ai';
const result = await streamText({
model: openai('gpt-4o'),
messages: messages,
});
Test Migration
# Run migration test
pnpm test:migration
# Check API connectivity
curl -H "Authorization: Bearer $OPENAI_API_KEY" \
https://api.openai.com/v1/models
Adding New AI Providers
Install Provider SDK
pnpm add @ai-sdk/anthropic # For Claude
pnpm add @ai-sdk/google # For Gemini
Configure Environment
ANTHROPIC_API_KEY=sk-ant-api03-...
GOOGLE_AI_API_KEY=AIzaSy...
Update Model Configuration
// lib/ai/models.ts
import { anthropic } from '@ai-sdk/anthropic';
export const modelConfigs = {
// ... existing models
'claude-3-opus': {
provider: 'anthropic',
model: anthropic('claude-3-opus-20240229'),
name: 'Claude 3 Opus',
contextWindow: 200000,
}
};
Deployment Migrations
From Local to Vercel
Prepare Environment Variables
# Export current environment
env | grep -E '^(OPENAI|SUPABASE|ANTHROPIC)' > .env.production
Install Vercel CLI
pnpm add -g vercel
vercel login
Deploy
# Link project
vercel link
# Set environment variables
vercel env add OPENAI_API_KEY production
vercel env add SUPABASE_URL production
# Deploy
vercel --prod
Configure Custom Domain
vercel domains add console.yourdomain.com
From Vercel to Self-Hosted
Prepare Docker Setup
# Dockerfile
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN pnpm install --prod --frozen-lockfile
COPY . .
RUN pnpm build
EXPOSE 3000
CMD ["pnpm", "start"]
Set Up Environment
# docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- OPENAI_API_KEY=${OPENAI_API_KEY}
- SUPABASE_URL=${SUPABASE_URL}
Deploy
docker-compose up -d
Troubleshooting Migrations
Common Issues
Database Connection Errors
# Test connection
psql $NEW_DATABASE_URL -c "SELECT 1"
# Check firewall
telnet your-db-host 5432
API Key Issues
# Verify key format
echo $OPENAI_API_KEY | cut -c1-10 # Should show sk-proj-
# Test API access
curl -H "Authorization: Bearer $OPENAI_API_KEY" \
https://api.openai.com/v1/models
Environment Variable Problems
# Check all env vars
printenv | grep -E '^(NEXT_|SUPABASE|OPENAI)'
# Validate required vars
node -e "require('./lib/env').validateEnv()"
Rollback Procedures
Database Rollback
-- Restore from backup
psql $DATABASE_URL < backup-v1.sql
-- Or use Supabase backup
supabase db reset
Code Rollback
# Git rollback
git revert HEAD
# Or reset to previous version
git reset --hard v1.0.0
Deployment Rollback
# Vercel rollback
vercel rollback
# Docker rollback
docker-compose down
docker-compose up -d previous-image
Need Help? If you encounter issues during migration, check our Troubleshooting Guide or reach out on Discord .
Last updated on