Database Requirements
- MySQL 8.0 or later
- Minimum 512MB RAM allocated to database
- UTF-8 character set support
- InnoDB storage engine
Automatic Setup (Docker)
When using Docker Compose, the database is automatically initialized with all required tables and schema.Database image initialization
The database Docker image (
~/workspace/source/database/Dockerfile:1-11) uses a two-stage build:- Setup stage: Concatenates all Drizzle migrations into a single
init.sqlfile - MySQL stage: Copies the init script to
/docker-entrypoint-initdb.d/
Migration consolidation
The
compose-init-script.sh (~/workspace/source/database/compose-init-script.sh:1-52) script:- Reads all
.sqlfiles fromdrizzle/migrations/directory - Sorts them in lexicographic order (0000_…, 0001_…, etc.)
- Removes statement-breakpoint comments
- Concatenates them into a single initialization file
Manual Database Setup
For non-Docker deployments or custom database configurations:Create database user (optional)
For production, create a dedicated user:Update your environment variables accordingly:
Run migrations manually
Apply all migrations in order from the
database/drizzle/migrations/ directory:Drizzle ORM Configuration
KnowledgeCheckr uses Drizzle Kit for managing database schema and migrations. Configuration is defined indrizzle.config.ts (~/workspace/source/drizzle.config.ts:1-17):
Key Configuration Points
- Migrations directory:
./database/drizzle/migrations- All generated SQL migrations - Schema file:
./database/drizzle/schema.ts- TypeScript schema definitions - Dialect: MySQL-specific SQL generation
- Credentials: Loaded from validated environment variables
Working with Migrations
Generating New Migrations
When you modify the schema indatabase/drizzle/schema.ts, generate a new migration:
database/drizzle/migrations/.
Applying Migrations
For development environments, apply migrations directly:Migration File Structure
Migration files follow this naming pattern:- SQL statements to modify the schema
- Statement breakpoint comments (removed during Docker initialization)
Database Schema Overview
The complete schema is defined indatabase/drizzle/schema.ts and includes:
- User management: User accounts, authentication, profiles
- Course structure: Courses, modules, lessons
- Content: Questions, answers, learning materials
- Progress tracking: User progress, quiz results
- Relations: Foreign keys and table relationships
database/drizzle/relations.ts.
Connection Configuration
Docker Compose Setup
When using Docker Compose (~/workspace/source/docker-compose.yml:4-16):
- Internally (from containers):
db:3306 - Externally (from host):
localhost:3305
Application Connection
The application connects using environment variables:Data Persistence
Volume Management
Database data is persisted in themysql_data directory:
- This directory is created automatically on first run
- Data persists across container restarts
- Deleting this directory will erase all data
Backup Procedures
Testing Database Connection
Verify the application can connect to the database:Migration Script Details
Thecompose-init-script.sh performs the following:
- Statement breakpoints are Drizzle-specific markers
- MySQL doesn’t recognize them
- Removing them ensures clean initialization
Troubleshooting
”Can’t connect to MySQL server”
Check:- Database container is running:
docker-compose ps - Port is not already in use:
lsof -i :3305 DATABASE_HOSTmatches the service name- Firewall allows connections on port 3306/3305
”Access denied for user”
Solutions:- Verify credentials in
.envmatchdocker-compose.yml - Check
MYSQL_ROOT_HOSTallows connections from application host - Ensure user has necessary privileges:
“Table doesn’t exist”
Causes:- Migrations not applied
- Database initialized with wrong schema
- Using wrong database name
“Too many connections”
Increase MySQL max connections:Migration conflicts
If you have manual schema changes conflicting with migrations:-
Export current schema:
-
Compare with migration output:
- Resolve conflicts by updating schema files or creating new migrations
Production Considerations
Security
- Change default passwords: Use strong, unique passwords
- Restrict root access: Create application-specific users with limited privileges
- Disable external port: Remove port mapping if external access not needed
- Enable SSL: Configure MySQL to use SSL/TLS connections
Performance
-
Configure buffer pool: Allocate 70-80% of available RAM to InnoDB buffer pool
- Enable query cache: For read-heavy workloads
- Index optimization: Review and optimize indexes based on query patterns
- Connection pooling: Configure application connection pool settings
Monitoring
-
Enable slow query log:
- Monitor disk usage: Ensure sufficient space for data growth
- Track connection usage: Alert on connection limit approaching
-
Query performance: Use
EXPLAINto analyze slow queries
Next Steps
- Configure environment variables
- Complete Docker deployment
- Review database schema in
database/drizzle/schema.ts