Getting Started
Quick start guide to get up and running with MSR Firebase.
Table of contents
- Prerequisites
- Installation
- Quick Start
- Verify Installation
- Configuration Options
- TypeScript Setup
- Troubleshooting
- Next Steps
Prerequisites
- Node.js 16.x or higher
- Firebase project with Realtime Database enabled
- Firebase Admin SDK service account credentials
Installation
Install MSR Firebase via npm:
npm install @migration-script-runner/firebase
Or with Yarn:
yarn add @migration-script-runner/firebase
Quick Start
1. Get Service Account Key
- Go to Firebase Console
- Select your project
- Go to Project Settings → Service Accounts
- Click Generate New Private Key
- Save the JSON file as
serviceAccountKey.json
Never commit your service account key to version control. Add it to
.gitignore:echo "serviceAccountKey.json" >> .gitignore echo ".env" >> .gitignore
2. Create Migrations Directory
mkdir migrations
3. Create Your First Migration
// migrations/V202501010001_create_users.ts
import { IRunnableScript, IMigrationInfo } from '@migration-script-runner/core';
import { IFirebaseDB, FirebaseHandler } from '@migration-script-runner/firebase';
export default class CreateUsers implements IRunnableScript<IFirebaseDB> {
async up(
db: IFirebaseDB,
info: IMigrationInfo,
handler: FirebaseHandler
): Promise<string> {
const usersRef = db.database.ref(handler.cfg.buildPath('users'));
await usersRef.set({
user1: { name: 'Alice', email: 'alice@example.com', role: 'admin' }
});
return 'Created users node';
}
async down(
db: IFirebaseDB,
info: IMigrationInfo,
handler: FirebaseHandler
): Promise<string> {
await db.database.ref(handler.cfg.buildPath('users')).remove();
return 'Removed users node';
}
}
4. Run Migrations
Using CLI (recommended for getting started):
npx msr-firebase migrate \
--database-url https://your-project.firebaseio.com \
--credentials ./serviceAccountKey.json
Or set environment variables:
# Create .env file
echo "DATABASE_URL=https://your-project.firebaseio.com" >> .env
echo "GOOGLE_APPLICATION_CREDENTIALS=./serviceAccountKey.json" >> .env
# Run migrations
npx msr-firebase migrate
Or programmatically:
import { FirebaseRunner, FirebaseConfig } from '@migration-script-runner/firebase';
const config = new FirebaseConfig();
config.databaseUrl = process.env.DATABASE_URL;
config.applicationCredentials = process.env.GOOGLE_APPLICATION_CREDENTIALS;
config.folder = './migrations';
const runner = await FirebaseRunner.getInstance({ config });
await runner.migrate();
Verify Installation
Test CLI
# Check version
npx msr-firebase --version
# Show help
npx msr-firebase --help
# Test connection
npx msr-firebase firebase:test-connection \
--database-url https://your-project.firebaseio.com \
--credentials ./serviceAccountKey.json
Test Programmatically
// test-setup.ts
import { FirebaseRunner, FirebaseConfig } from '@migration-script-runner/firebase';
async function testSetup() {
const config = new FirebaseConfig();
config.databaseUrl = process.env.DATABASE_URL;
config.applicationCredentials = process.env.GOOGLE_APPLICATION_CREDENTIALS;
config.folder = './migrations';
const runner = await FirebaseRunner.getInstance({ config });
const migrations = await runner.list();
console.log('✓ MSR Firebase is ready!');
console.log(`Found ${migrations.length} migrations`);
}
testSetup().catch(console.error);
Configuration Options
Environment Variables
# .env
DATABASE_URL=https://your-project.firebaseio.com
GOOGLE_APPLICATION_CREDENTIALS=./serviceAccountKey.json
MSR_FOLDER=./migrations
MSR_TABLE_NAME=schema_version
Config File
Create msr.config.js:
module.exports = {
databaseUrl: process.env.DATABASE_URL,
applicationCredentials: process.env.GOOGLE_APPLICATION_CREDENTIALS,
folder: './migrations',
tableName: 'schema_version',
shift: 'production', // Optional: for multi-environment databases
backupMode: 'full', // Automatic backup before migrations
locking: {
enabled: true, // For distributed environments
timeout: 600000 // 10 minutes
}
};
Use with CLI:
npx msr-firebase migrate --config-file ./msr.config.js
TypeScript Setup
Recommended tsconfig.json for migrations:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"lib": ["ES2020"],
"esModuleInterop": true,
"skipLibCheck": true,
"strict": true,
"resolveJsonModule": true,
"outDir": "./dist",
"rootDir": "./",
"declaration": true
},
"include": ["migrations/**/*", "src/**/*"],
"exclude": ["node_modules", "dist"]
}
Troubleshooting
Cannot find module ‘@migration-script-runner/firebase’
Ensure the package is installed:
npm list @migration-script-runner/firebase
If not found:
npm install @migration-script-runner/firebase
Firebase authentication failed
Error: Error: Failed to parse private key
Solution: Check your service account key file:
- Path is correct
- File is valid JSON
- Has proper read permissions
Error: PERMISSION_DENIED
Solution: Verify your service account has “Firebase Realtime Database Admin” role:
- Go to Firebase Console → IAM & Admin
- Find your service account
- Ensure it has the correct role
Environment variables not loading
Install dotenv:
npm install dotenv
Use in your code:
import 'dotenv/config';
// ... rest of your code
CLI command not found
Use npx instead of global install:
npx msr-firebase migrate
Or add to package.json scripts:
{
"scripts": {
"migrate": "msr-firebase migrate",
"migrate:down": "msr-firebase down",
"migrate:list": "msr-firebase list"
}
}
Next Steps
For CLI Users
- CLI Commands - Learn all available CLI commands
- CI/CD Integration - Integrate migrations into your pipeline
- CLI Examples - Real-world CLI usage patterns
For Library Users
- Quick Start - Programmatic usage examples
- Configuration - Configure programmatically
- API Reference - Complete API documentation
Writing Migrations
- Migration Scripts - Learn to write migrations
- Testing - Test with Firebase Emulator
- Best Practices - Firebase-specific patterns