Skip to main content

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:

  1. JSON Configuration Files (appsettings.json) - Recommended for development
  2. Environment Variables - Recommended for production
  3. Docker Environment Files (.env) - For Docker deployments

Configuration is loaded in this order (later values override earlier ones):

  1. appsettings.json
  2. appsettings.{Environment}.json (e.g., appsettings.Production.json)
  3. 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,
"Username": "[email protected]",
"Password": "your-app-password",
"From": "[email protected]",
"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 hostname
  • Port: PostgreSQL port (default: 5432)
  • Database: Database name
  • Username: Database username
  • Password: Database password
  • Pooling: 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:

  1. Create S3 bucket in AWS Console
  2. Configure bucket policy for public read access (if needed)
  3. Create IAM user with S3 access
  4. Generate access key and secret key
  5. 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,
"Username": "[email protected]",
"Password": "your-app-password",
"From": "[email protected]",
"EnableSsl": true
}
}

Gmail Setup:

  1. Enable 2-Factor Authentication
  2. Generate App Password: https://myaccount.google.com/apppasswords
  3. 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 logs
  • Debug: Debug information
  • Information: General information
  • Warning: Warning messages
  • Error: Error messages
  • Fatal: 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

  1. Never commit secrets to version control
  2. Use environment variables for sensitive data
  3. Rotate keys regularly (every 90 days)
  4. Use strong passwords (minimum 16 characters)
  5. Enable SSL/TLS for all connections
  6. Restrict CORS to specific domains
  7. Use connection pooling for databases
  8. Enable logging for security events
  9. Regular backups of configuration
  10. 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

Next Steps