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 File | Description |
|---|---|
init-database.ts | Database initialization master script, executes all sub-scripts in order |
seed-roles.ts | Initialize roles and permissions system |
seed-settings.ts | Initialize system settings |
seed-plans.ts | Initialize subscription plans |
seed-packages.ts | Initialize credit packages |
set-super-admin.ts | Set super admin |
init-data-postgres.sql | PostgreSQL database initialization SQL file |
init-data-sqlite.sql | SQLite database initialization SQL file |
init-database.ts - Database Initialization Master Script
Executes all sub-initialization scripts in logical order:
seed-roles.ts- Initialize roles and permissionsseed-settings.ts- Initialize system settingsseed-plans.ts- Initialize subscription plansseed-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
Method 1: Using TypeScript Scripts (Recommended)
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)
| Permission | Description |
|---|---|
| users:view | View users |
| users:update | Edit users |
| users:delete | Delete users |
| users:export | Export users |
| users:sendEmail | Send email |
| users:disable | Disable users |
| users:enable | Enable users |
| users:setAsAdmin | Set as admin |
Subscription Management (4)
| Permission | Description |
|---|---|
| subscriptions:view | View subscriptions |
| subscriptions:update | Modify subscriptions |
| subscriptions:delete | Cancel subscriptions |
| subscriptions:export | Export subscriptions |
Subscription Plan Management (4)
| Permission | Description |
|---|---|
| plans:view | View plans |
| plans:create | Create plans |
| plans:update | Edit plans |
| plans:delete | Delete plans |
Order Management (3)
| Permission | Description |
|---|---|
| orders:view | View orders |
| orders:refund | Refund orders |
| orders:export | Export orders |
Credits Management (3)
| Permission | Description |
|---|---|
| credits:view | View credits |
| credits:update | Adjust credits |
| credits:export | Export credits |
Credit Package Management (4)
| Permission | Description |
|---|---|
| packages:view | View credit packages |
| packages:create | Create credit packages |
| packages:update | Edit credit packages |
| packages:delete | Delete credit packages |
Transaction Records (2)
| Permission | Description |
|---|---|
| transactions:view | View transaction records |
| transactions:export | Export transaction records |
Dashboard (1)
| Permission | Description |
|---|---|
| dashboard:view | View dashboard |
System Management (22)
| Permission | Description |
|---|---|
| system:admins:view | View admins |
| system:admins:create | Add admins |
| system:admins:update | Edit admins |
| system:admins:delete | Delete admins |
| system:roles:view | View roles |
| system:roles:create | Create roles |
| system:roles:update | Edit roles |
| system:roles:delete | Delete roles |
| system:permissions:view | View permissions |
| system:permissions:create | Create permissions |
| system:permissions:update | Edit permissions |
| system:permissions:delete | Delete permissions |
| system:logs:view | View logs |
| system:logs:export | Export logs |
| system:settings:view | View settings |
| system:settings:update | Modify settings |
| system:notifications:view | View notifications |
| system:notifications:create | Create notifications |
| system:notifications:update | Edit notifications |
| system:notifications:delete | Delete notifications |
| system:notifications:publish | Publish notifications |
Newsletter Management (4)
| Permission | Description |
|---|---|
| newsletter:view | View newsletter content |
| newsletter:create | Create newsletter content |
| newsletter:update | Edit newsletter content |
| newsletter:delete | Delete newsletter content |
Contact Message Management (4)
| Permission | Description |
|---|---|
| contact:view | View contact messages |
| contact:update | Process contact messages |
| contact:delete | Delete contact messages |
| contact:reply | Reply to contact messages |
Role List (4 total)
| Role | Permission Count | Description |
|---|---|---|
| Super Admin (super_admin) | 58 | Has all system permissions |
| Admin (admin) | 42 | Most management permissions, excluding admin and role management |
| Operator (operator) | 32 | Handles daily operations |
| Viewer (viewer) | 18 | Read-only permissions |
System Settings
System settings are divided into the following groups:
| Group | Description | Setting Count |
|---|---|---|
| general | General settings (date format, timezone, site info, maintenance mode, etc.) | 13 |
| business | Business settings (login methods, payment gateway, credit configuration, etc.) | 9 |
| company | Company information (company name, contact info, etc.) | 9 |
| seo | SEO settings (site URL, OG image, multilingual SEO, etc.) | 16 |
| security | Security settings (login protection, fingerprint protection, etc.) | 8 |
Subscription Plans (3 total)
| Plan | Monthly | Yearly | Monthly Credits | Features |
|---|---|---|---|---|
| Free | $0 | $0 | 100 | Basic features, community support |
| Basic | $9.90 | $99.00 | 1000 | All free features + priority support + advanced analytics |
| Pro | $29.90 | $299.00 | 5000 | All 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)
| Name | Credits | Price | Bonus Credits |
|---|---|---|---|
| Small Pack | 500 | $5.00 | 0 |
| Medium Pack | 2000 | $15.00 | 200 |
| Large Pack | 5000 | $35.00 | 1000 |
Warning
Payment gateway price IDs (Stripe/Creem) for credit packages need to be configured manually in the admin dashboard.
Set Super Admin
Prerequisites
- Database initialized (ran
init-database.ts) - 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
--emailor--usernameparameter 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
plansarray inseed-plans.ts - Edit
packagesarray inseed-packages.ts - Re-run the script
Q4: How to add custom permissions?
- Edit
permissionsarray inseed-roles.ts - Add new permission definition
- Add permission name to corresponding role's
permissionsarray - 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:
-
Database Connection Failed
- Check database configuration in
.envfile - Ensure database service is running
- Check database configuration in
-
Table Does Not Exist
- Run
pnpm drizzle-kit migrateto create tables
- Run
-
User Not Found
- Confirm user is registered
- Check email/username spelling
-
Role Not Found
- Run
init-database.tsfirst to initialize roles
- Run
Q6: What's the difference between SQL files and TypeScript scripts?
| Feature | TypeScript Scripts | SQL 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 Speed | Slower | Faster |
| Use Case | Development/Production | Database migration/Backup recovery |
Important Notes
- Production Environment: Test in staging environment before running in production
- Backup Data: Backup database before important operations
- Permission Management: Super admin has all permissions, assign carefully
- Payment Configuration: Payment gateway price IDs for subscription plans and credit packages need manual configuration
- Multilingual: Add corresponding translations in
public/localesif multilingual support is needed - Environment Variables: Use
--env-file=.env.production.localparameter when executing in production environment