Configuration
Complete configuration guide for Bellamy Book. Configure all aspects of the application including databases, security, storage, and more.
Configuration Methods
Bellamy Book supports multiple configuration methods:
- JSON Configuration Files (
appsettings.json) - Recommended for development - Environment Variables - Recommended for production
- Docker Environment Files (
.env) - For Docker deployments
Configuration is loaded in this order (later values override earlier ones):
appsettings.jsonappsettings.{Environment}.json(e.g.,appsettings.Production.json)- Environment variables
Backend Configuration
Complete appsettings.json Example
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning",
"Microsoft.EntityFrameworkCore": "Warning"
}
},
"AllowedHosts": "*",
"AppSettings": {
"BaseUrl": "http://localhost:5173"
},
"ConnectionStrings": {
"PrimaryConnectionString": "Host=localhost;Port=5432;Database=FacebookDb;Username=postgres;Password=password",
"ReadOnlyConnectionString": "Host=localhost;Port=5433;Database=FacebookDb;Username=postgres;Password=password",
"MigrationDbConnectionString": "Host=localhost;Port=5432;Database=MigrationDb;Username=postgres;Password=password"
},
"JwtSettings": {
"SecretKey": "your-very-secure-secret-key-minimum-32-characters",
"Issuer": "BellamyBook",
"Audience": "BellamyBook",
"ExpirationMinutes": 60,
"RefreshTokenExpirationDays": 7
},
"CorsSettings": {
"AllowedOrigins": [
"http://localhost:3000",
"http://localhost:3001",
"http://localhost:5173"
]
},
"Storage": {
"Provider": "Local",
"LocalPath": "/uploads",
"S3Bucket": "",
"S3Region": "",
"S3AccessKey": "",
"S3SecretKey": ""
},
"Smtp": {
"Server": "smtp.gmail.com",
"Port": 587,
"Password": "your-app-password",
"EnableSsl": true
},
"Serilog": {
"Using": ["Serilog.Sinks.Console", "Serilog.Sinks.Elasticsearch"],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "Console"
},
{
"Name": "Elasticsearch",
"Args": {
"nodeUris": "http://localhost:9200",
"indexFormat": "applogs-{0:yyyy.MM.dd}",
"autoRegisterTemplate": true,
"numberOfShards": 1,
"numberOfReplicas": 1
}
}
]
}
}
Database Configuration
PostgreSQL Connection Strings
Primary Database (Read/Write):
Host=localhost;Port=5432;Database=FacebookDb;Username=postgres;Password=password;Pooling=true;MinPoolSize=10;MaxPoolSize=100
Read-Only Database (Replica):
Host=localhost;Port=5433;Database=FacebookDb;Username=postgres;Password=password;Pooling=true;MinPoolSize=10;MaxPoolSize=100
Migration Database:
Host=localhost;Port=5432;Database=MigrationDb;Username=postgres;Password=password;Pooling=true;MinPoolSize=5;MaxPoolSize=20
Connection String Parameters:
Host: PostgreSQL server hostnamePort: PostgreSQL port (default: 5432)Database: Database nameUsername: Database usernamePassword: Database passwordPooling: Enable connection pooling (recommended: true)MinPoolSize: Minimum pool size (recommended: 10)MaxPoolSize: Maximum pool size (recommended: 100)ConnectionIdleLifetime: Idle connection lifetime in seconds (recommended: 300)ConnectionPruningInterval: Pruning interval in seconds (recommended: 10)CommandTimeout: Command timeout in seconds (recommended: 30)Timeout: Connection timeout in seconds (recommended: 15)
MongoDB Configuration
Connection String Format:
mongodb://[username:password@]host[:port][/database][?options]
Examples:
{
"ConnectionStrings": {
"MongoDB": "mongodb://localhost:27017/bellamybook"
}
}
With Authentication:
mongodb://username:password@localhost:27017/bellamybook?authSource=admin
Replica Set:
mongodb://username:password@localhost:27017/bellamybook?replicaSet=rs0&authSource=admin
Redis Configuration
Connection String:
localhost:6379
With Password:
password@localhost:6379
With Database:
localhost:6379,defaultDatabase=0
Security Configuration
JWT Settings
{
"JwtSettings": {
"SecretKey": "your-very-secure-secret-key-minimum-32-characters",
"Issuer": "BellamyBook",
"Audience": "BellamyBook",
"ExpirationMinutes": 60,
"RefreshTokenExpirationDays": 7
}
}
Generate Secure Secret Key:
# Linux/macOS
openssl rand -base64 32
# Or use online generator
# https://www.grc.com/passwords.htm
Important Security Notes:
- ⚠️ Never commit secret keys to version control
- ⚠️ Use environment variables in production
- ⚠️ Use different keys for development and production
- ⚠️ Rotate keys periodically
CORS Configuration
{
"CorsSettings": {
"AllowedOrigins": [
"http://localhost:3000",
"http://localhost:3001",
"http://localhost:5173",
"https://your-domain.com"
]
}
}
Production CORS Settings:
{
"CorsSettings": {
"AllowedOrigins": [
"https://app.your-domain.com",
"https://admin.your-domain.com"
]
}
}
Storage Configuration
Local Storage
{
"Storage": {
"Provider": "Local",
"LocalPath": "/var/www/uploads"
}
}
Directory Permissions:
# Create upload directory
sudo mkdir -p /var/www/uploads
# Set permissions
sudo chown -R www-data:www-data /var/www/uploads
sudo chmod -R 755 /var/www/uploads
AWS S3 Storage
{
"Storage": {
"Provider": "S3",
"S3Bucket": "your-bucket-name",
"S3Region": "us-east-1",
"S3AccessKey": "your-access-key",
"S3SecretKey": "your-secret-key"
}
}
S3 Bucket Setup:
- Create S3 bucket in AWS Console
- Configure bucket policy for public read access (if needed)
- Create IAM user with S3 access
- Generate access key and secret key
- Update configuration with credentials
S3 Bucket Policy Example:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/*"
}
]
}
Email Configuration (SMTP)
{
"Smtp": {
"Server": "smtp.gmail.com",
"Port": 587,
"Password": "your-app-password",
"EnableSsl": true
}
}
Gmail Setup:
- Enable 2-Factor Authentication
- Generate App Password: https://myaccount.google.com/apppasswords
- Use App Password (not regular password) in configuration
Other SMTP Providers:
- SendGrid:
smtp.sendgrid.net:587 - Mailgun:
smtp.mailgun.org:587 - AWS SES:
email-smtp.us-east-1.amazonaws.com:587
Logging Configuration
Serilog Configuration
{
"Serilog": {
"Using": ["Serilog.Sinks.Console", "Serilog.Sinks.Elasticsearch"],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "Console"
},
{
"Name": "Elasticsearch",
"Args": {
"nodeUris": "http://localhost:9200",
"indexFormat": "applogs-{0:yyyy.MM.dd}",
"autoRegisterTemplate": true,
"numberOfShards": 1,
"numberOfReplicas": 1
}
}
],
"Enrich": ["FromLogContext", "WithMachineName", "WithThreadId"],
"Properties": {
"Application": "FaceBookCloneAPI"
}
}
}
Log Levels:
Verbose: Very detailed logsDebug: Debug informationInformation: General informationWarning: Warning messagesError: Error messagesFatal: Critical errors
Frontend Configuration
Environment Variables
Create .env.local in Src/frontend/:
# API Configuration
VITE_API_URL=http://localhost:5000
VITE_WS_URL=ws://localhost:5000
# Application Settings
VITE_APP_NAME=Bellamy Book
VITE_ENABLE_ADS=false
VITE_ENABLE_ANALYTICS=false
# Feature Flags
VITE_ENABLE_STORIES=true
VITE_ENABLE_MESSAGING=true
VITE_ENABLE_NOTIFICATIONS=true
Production Environment
Create .env.production:
VITE_API_URL=https://api.your-domain.com
VITE_WS_URL=wss://api.your-domain.com
VITE_APP_NAME=Bellamy Book
VITE_ENABLE_ADS=true
VITE_ENABLE_ANALYTICS=true
Admin Panel Configuration
Create .env.local in Src/admin/:
VITE_API_URL=http://localhost:5000
VITE_ADMIN_SECRET=your-admin-secret
VITE_APP_NAME=Bellamy Book Admin
Docker Environment Configuration
Create .env in dockerLocalENV/:
# Database Configuration
POSTGRES_USER=postgres
POSTGRES_PASSWORD=your-secure-password
POSTGRES_DB=bellamybook
# MongoDB Configuration
MONGO_INITDB_ROOT_USERNAME=root
MONGO_INITDB_ROOT_PASSWORD=example
# Redis Configuration
REDIS_PASSWORD=
# Application Configuration
JWT_SECRET_KEY=your-jwt-secret-key-here
STORAGE_PROVIDER=Local
STORAGE_LOCAL_PATH=/uploads
# SMTP Configuration
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
SMTP_PASSWORD=your-app-password
# CORS
ALLOWED_ORIGINS=http://localhost:3000,http://localhost:3001
Environment-Specific Configuration
Development
Create appsettings.Development.json:
{
"Logging": {
"LogLevel": {
"Default": "Debug"
}
},
"ConnectionStrings": {
"PrimaryConnectionString": "Host=localhost;Database=FacebookDb_Dev;..."
}
}
Production
Create appsettings.Production.json:
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"ConnectionStrings": {
"PrimaryConnectionString": "Host=prod-db;Database=FacebookDb;..."
},
"JwtSettings": {
"SecretKey": "${JWT_SECRET_KEY}"
}
}
Configuration Validation
Test Configuration
After configuration, verify settings:
# Test PostgreSQL connection
psql -h localhost -U postgres -d FacebookDb -c "SELECT version();"
# Test MongoDB connection
mongosh "mongodb://localhost:27017/bellamybook" --eval "db.version()"
# Test Redis connection
redis-cli ping
Health Check Endpoint
Check application health:
curl http://localhost:5000/api/health
Expected response:
{
"status": "healthy",
"database": "connected",
"cache": "connected"
}
Security Best Practices
- Never commit secrets to version control
- Use environment variables for sensitive data
- Rotate keys regularly (every 90 days)
- Use strong passwords (minimum 16 characters)
- Enable SSL/TLS for all connections
- Restrict CORS to specific domains
- Use connection pooling for databases
- Enable logging for security events
- Regular backups of configuration
- Review logs regularly
Configuration Checklist
Before deploying to production:
- All secret keys are in environment variables
- Database passwords are strong and unique
- CORS is restricted to production domains
- SSL/TLS is enabled
- Logging is configured
- Storage is configured (S3 or local)
- Email is configured and tested
- Health checks are working
- Connection pooling is configured
- Backup strategy is in place