8 min readLast updated: 2025-12-31 12:12

Database Initialization Guide

This guide explains how to use database initialization scripts to set up system base data.

Script Overview

The scripts/database/ directory contains the following scripts:

Script FileDescription
init-database.tsDatabase initialization master script, executes all sub-scripts in order
seed-roles.tsInitialize roles and permissions system
seed-settings.tsInitialize system settings
seed-plans.tsInitialize subscription plans
seed-packages.tsInitialize credit packages
set-super-admin.tsSet super admin
init-data-postgres.sqlPostgreSQL database initialization SQL file
init-data-sqlite.sqlSQLite database initialization SQL file

init-database.ts - Database Initialization Master Script

Executes all sub-initialization scripts in logical order:

  1. seed-roles.ts - Initialize roles and permissions
  2. seed-settings.ts - Initialize system settings
  3. seed-plans.ts - Initialize subscription plans
  4. seed-packages.ts - Initialize credit packages

set-super-admin.ts - Set Super Admin Script

Sets a specified user as super admin, supporting:

  • ✅ Set by user ID
  • ✅ Set by email
  • ✅ Set by username
  • ✅ Auto-enable disabled accounts
  • ✅ Auto-create admin records

Initialization Methods

Step 1: Run Database Migration

First ensure database table structure is created:

# Generate migration files (if schema changes)
pnpm drizzle-kit generate

# Push database schema to database (if changes)
pnpm drizzle-kit push

# Apply migration
pnpm drizzle-kit migrate

Step 2: Initialize Base Data

Development Environment:

pnpm tsx scripts/database/init-database.ts

Production Environment:

pnpm tsx --env-file=.env.production.local scripts/database/init-database.ts

Example Output:

🚀 Starting full database initialization...
==================================================

Executing script: seed-roles.ts...
Starting role and permission initialization...
Inserting permissions...
  ✓ Created permission: View Users (users:view)
  ✓ Created permission: Edit Users (users:update)
  ...

Inserting roles...
  ✓ Created role: Super Admin (super_admin) - 58 permissions
  ✓ Created role: Admin (admin) - 42 permissions
  ...

✅ Role and permission initialization complete!
✅ seed-roles.ts executed successfully

Executing script: seed-settings.ts...
Starting system settings initialization...
  ✓ Created setting: dateFormat
  ✓ Created setting: timeFormat
  ...
✅ System settings initialization complete!
✅ seed-settings.ts executed successfully

Executing script: seed-plans.ts...
Starting subscription plan initialization...
  ✓ Created plan: Free (free)
  ✓ Created plan: Basic (basic)
  ✓ Created plan: Pro (pro)
✅ Subscription plan initialization complete!
✅ seed-plans.ts executed successfully

Executing script: seed-packages.ts...
Starting credit package initialization...
  ✓ Created package: Small Pack (500 credits)
  ✓ Created package: Medium Pack (2000 credits)
  ✓ Created package: Large Pack (5000 credits)
✅ Credit package initialization complete!
✅ seed-packages.ts executed successfully

==================================================
🎉 All database initialization tasks completed!
Tip: You can now use scripts/database/set-super-admin.ts to set up admin accounts.

Running Individual Sub-scripts

If you only need to initialize partial data, you can run sub-scripts individually:

# Initialize roles and permissions only
pnpm tsx scripts/database/seed-roles.ts

# Initialize system settings only
pnpm tsx scripts/database/seed-settings.ts

# Initialize subscription plans only
pnpm tsx scripts/database/seed-plans.ts

# Initialize credit packages only
pnpm tsx scripts/database/seed-packages.ts

Method 2: Using SQL Files

If you need to execute SQL directly in the database, you can use pre-generated SQL files:

PostgreSQL:

psql -U your_user -d your_database -f scripts/database/init-data-postgres.sql

SQLite:

sqlite3 your_database.db < scripts/database/init-data-sqlite.sql

Note

SQL files contain complete initialization data, including permissions, roles, role-permission associations, system settings, subscription plans, and credit packages.

Initialized Data Details

Permission List (58 total)

User Management (8)

PermissionDescription
users:viewView users
users:updateEdit users
users:deleteDelete users
users:exportExport users
users:sendEmailSend email
users:disableDisable users
users:enableEnable users
users:setAsAdminSet as admin

Subscription Management (4)

PermissionDescription
subscriptions:viewView subscriptions
subscriptions:updateModify subscriptions
subscriptions:deleteCancel subscriptions
subscriptions:exportExport subscriptions

Subscription Plan Management (4)

PermissionDescription
plans:viewView plans
plans:createCreate plans
plans:updateEdit plans
plans:deleteDelete plans

Order Management (3)

PermissionDescription
orders:viewView orders
orders:refundRefund orders
orders:exportExport orders

Credits Management (3)

PermissionDescription
credits:viewView credits
credits:updateAdjust credits
credits:exportExport credits

Credit Package Management (4)

PermissionDescription
packages:viewView credit packages
packages:createCreate credit packages
packages:updateEdit credit packages
packages:deleteDelete credit packages

Transaction Records (2)

PermissionDescription
transactions:viewView transaction records
transactions:exportExport transaction records

Dashboard (1)

PermissionDescription
dashboard:viewView dashboard

System Management (22)

PermissionDescription
system:admins:viewView admins
system:admins:createAdd admins
system:admins:updateEdit admins
system:admins:deleteDelete admins
system:roles:viewView roles
system:roles:createCreate roles
system:roles:updateEdit roles
system:roles:deleteDelete roles
system:permissions:viewView permissions
system:permissions:createCreate permissions
system:permissions:updateEdit permissions
system:permissions:deleteDelete permissions
system:logs:viewView logs
system:logs:exportExport logs
system:settings:viewView settings
system:settings:updateModify settings
system:notifications:viewView notifications
system:notifications:createCreate notifications
system:notifications:updateEdit notifications
system:notifications:deleteDelete notifications
system:notifications:publishPublish notifications

Newsletter Management (4)

PermissionDescription
newsletter:viewView newsletter content
newsletter:createCreate newsletter content
newsletter:updateEdit newsletter content
newsletter:deleteDelete newsletter content

Contact Message Management (4)

PermissionDescription
contact:viewView contact messages
contact:updateProcess contact messages
contact:deleteDelete contact messages
contact:replyReply to contact messages

Role List (4 total)

RolePermission CountDescription
Super Admin (super_admin)58Has all system permissions
Admin (admin)42Most management permissions, excluding admin and role management
Operator (operator)32Handles daily operations
Viewer (viewer)18Read-only permissions

System Settings

System settings are divided into the following groups:

GroupDescriptionSetting Count
generalGeneral settings (date format, timezone, site info, maintenance mode, etc.)13
businessBusiness settings (login methods, payment gateway, credit configuration, etc.)9
companyCompany information (company name, contact info, etc.)9
seoSEO settings (site URL, OG image, multilingual SEO, etc.)16
securitySecurity settings (login protection, fingerprint protection, etc.)8

Subscription Plans (3 total)

PlanMonthlyYearlyMonthly CreditsFeatures
Free$0$0100Basic features, community support
Basic$9.90$99.001000All free features + priority support + advanced analytics
Pro$29.90$299.005000All basic features + 24/7 support + custom branding + API access

Warning

Payment gateway price IDs (Stripe/Creem) for subscription plans need to be configured manually in the admin dashboard.

Credit Packages (3 total)

NameCreditsPriceBonus Credits
Small Pack500$5.000
Medium Pack2000$15.00200
Large Pack5000$35.001000

Warning

Payment gateway price IDs (Stripe/Creem) for credit packages need to be configured manually in the admin dashboard.

Set Super Admin

Prerequisites

  1. Database initialized (ran init-database.ts)
  2. User registered in system

Usage

Method 1: Set by User ID

pnpm tsx scripts/database/set-super-admin.ts --userId=<USER_ID>

Method 2: Set by Email

pnpm tsx scripts/database/set-super-admin.ts --email=admin@example.com

Method 3: Set by Username

pnpm tsx scripts/database/set-super-admin.ts --username=admin

Production Environment

pnpm tsx --env-file=.env.production.local scripts/database/set-super-admin.ts --email=admin@example.com

Example Output

🔧 Starting super admin setup...
==================================================

🔍 Finding by email: admin@example.com

✓ Found user:
  ID: abc123def456
  Name: Admin User
  Email: admin@example.com
  Username: admin

🔍 Finding super admin role...
✓ Found role: Super Admin

🔍 Checking admin status...
✓ Created admin record

🔍 Checking role assignment...
✓ Assigned super admin role

==================================================
✅ Super admin setup complete!

User Info:
  ID: abc123def456
  Name: Admin User
  Email: admin@example.com
  Username: admin

Assigned Roles:
  - Super Admin (super_admin)

Tips:
  - This user can now access all admin dashboard features
  - Admin dashboard URL: /admin

FAQ

Q1: How to get User ID?

Method 1: Database Query

SELECT id, name, email, username FROM user WHERE email = 'user@example.com';

Method 2: Admin Dashboard

  • Login to admin dashboard
  • Go to user management page
  • View user details

Method 3: Use Email or Username

  • Use --email or --username parameter directly, no need to query ID

Q2: Can I run initialization script multiple times?

Yes. The script checks if data already exists:

  • Existing permissions are skipped
  • Existing roles have permissions updated
  • Existing system settings are skipped
  • Existing subscription plans and credit packages are skipped

Q3: How to modify subscription plans or credit packages?

Method 1: Admin Dashboard

  • Login to admin dashboard
  • Go to corresponding management page to modify

Method 2: Modify Script Directly

  • Edit plans array in seed-plans.ts
  • Edit packages array in seed-packages.ts
  • Re-run the script

Q4: How to add custom permissions?

  1. Edit permissions array in seed-roles.ts
  2. Add new permission definition
  3. Add permission name to corresponding role's permissions array
  4. Re-run the script

Example:

// Add new permission
{ 
  module: 'reports', 
  action: 'view', 
  name: 'reports:view', 
  displayName: 'View Reports', 
  description: 'View system reports' 
}

// Add to role
{
  name: 'admin',
  permissions: [
    // ... other permissions
    'reports:view'
  ]
}

Q5: What if script execution fails?

Common Errors and Solutions:

  1. Database Connection Failed

    • Check database configuration in .env file
    • Ensure database service is running
  2. Table Does Not Exist

    • Run pnpm drizzle-kit migrate to create tables
  3. User Not Found

    • Confirm user is registered
    • Check email/username spelling
  4. Role Not Found

    • Run init-database.ts first to initialize roles

Q6: What's the difference between SQL files and TypeScript scripts?

FeatureTypeScript ScriptsSQL Files
Idempotency✅ Checks if data exists❌ May cause duplicate data
Flexibility✅ Can add business logic❌ Only supports SQL statements
Cross-database✅ Via Drizzle ORM❌ Requires different SQL files
Execution SpeedSlowerFaster
Use CaseDevelopment/ProductionDatabase migration/Backup recovery

Important Notes

  1. Production Environment: Test in staging environment before running in production
  2. Backup Data: Backup database before important operations
  3. Permission Management: Super admin has all permissions, assign carefully
  4. Payment Configuration: Payment gateway price IDs for subscription plans and credit packages need manual configuration
  5. Multilingual: Add corresponding translations in public/locales if multilingual support is needed
  6. Environment Variables: Use --env-file=.env.production.local parameter when executing in production environment
Database Initialization - Hex2077 Starter