312 lines
8.6 KiB
Markdown
312 lines
8.6 KiB
Markdown
# Complete Domain Migration Process for Multi-Tenant Setup
|
|
|
|
## Overview
|
|
This guide walks you through migrating from your current domain to `dev.uggla.uamils.com` with full multi-tenant support and SSL certificates.
|
|
|
|
## Prerequisites
|
|
- Server with Docker and Docker Compose
|
|
- Domain access for DNS configuration
|
|
- Access to your current drone detection system
|
|
|
|
## Phase 1: DNS Configuration (Do this first!)
|
|
|
|
### Step 1: Set up DNS Records
|
|
```bash
|
|
# In your DNS provider (Cloudflare, Route53, etc.), add:
|
|
|
|
# Main domain A record
|
|
dev.uggla.uamils.com A [YOUR_SERVER_IP]
|
|
|
|
# Wildcard CNAME record for all subdomains
|
|
*.dev.uggla.uamils.com CNAME dev.uggla.uamils.com
|
|
|
|
# Wait for DNS propagation (can take up to 48 hours)
|
|
# Test with: dig dev.uggla.uamils.com
|
|
# Test wildcard: dig test.dev.uggla.uamils.com
|
|
```
|
|
|
|
### Step 2: Verify DNS Propagation
|
|
```bash
|
|
# Test main domain
|
|
nslookup dev.uggla.uamils.com
|
|
|
|
# Test subdomain
|
|
nslookup tenant1.dev.uggla.uamils.com
|
|
|
|
# Both should resolve to your server IP
|
|
```
|
|
|
|
## Phase 2: Update Configuration Files
|
|
|
|
### Step 3: Copy and Configure Environment
|
|
```bash
|
|
# On your server, copy the environment template
|
|
cp .env.production .env
|
|
|
|
# Edit the .env file with your specific values:
|
|
nano .env
|
|
|
|
# Update these critical values:
|
|
BASE_URL=https://dev.uggla.uamils.com
|
|
DOMAIN_NAME=dev.uggla.uamils.com
|
|
SSL_EMAIL=your-email@uamils.com
|
|
SESSION_SECRET=generate-a-32-character-random-string
|
|
JWT_SECRET=generate-another-random-string
|
|
```
|
|
|
|
### Step 4: Database Migration
|
|
```bash
|
|
# First, stop current containers
|
|
docker-compose down
|
|
|
|
# Run the database migration to add multi-tenant support
|
|
docker-compose run --rm backend npm run db:migrate
|
|
|
|
# This creates the tenants table and updates user schema
|
|
```
|
|
|
|
## Phase 3: SSL Certificate Setup
|
|
|
|
### Step 5: Generate SSL Certificates
|
|
```bash
|
|
# Make the SSL setup script executable
|
|
chmod +x ./scripts/setup-ssl.sh
|
|
|
|
# Run the SSL setup (this will be interactive)
|
|
./scripts/setup-ssl.sh
|
|
|
|
# IMPORTANT: During this process, you'll need to:
|
|
# 1. Add DNS TXT records when prompted
|
|
# 2. Wait for DNS propagation between records
|
|
# 3. Complete the manual verification process
|
|
```
|
|
|
|
### Step 6: Manual DNS TXT Record Process
|
|
```bash
|
|
# When certbot prompts you, you'll see something like:
|
|
# Please add the following TXT record to your DNS:
|
|
# Name: _acme-challenge.dev.uggla.uamils.com
|
|
# Value: abcd1234...
|
|
|
|
# Add this TXT record in your DNS provider:
|
|
_acme-challenge.dev.uggla.uamils.com TXT "abcd1234efgh5678..."
|
|
|
|
# For wildcard, you'll get a second record:
|
|
_acme-challenge.dev.uggla.uamils.com TXT "ijkl9012mnop3456..."
|
|
|
|
# IMPORTANT: You need BOTH TXT records for wildcard certificates
|
|
# Wait 5-10 minutes for DNS propagation before pressing Enter in certbot
|
|
```
|
|
|
|
## Phase 4: Production Deployment
|
|
|
|
### Step 7: Start Production Environment
|
|
```bash
|
|
# Start the production environment with SSL
|
|
docker-compose -f docker-compose.production.yml up -d
|
|
|
|
# Check logs to ensure everything starts correctly
|
|
docker-compose -f docker-compose.production.yml logs -f
|
|
```
|
|
|
|
### Step 8: Verify SSL and Multi-Tenant Setup
|
|
```bash
|
|
# Test main domain
|
|
curl -I https://dev.uggla.uamils.com
|
|
|
|
# Test API endpoint
|
|
curl -I https://dev.uggla.uamils.com/api/health
|
|
|
|
# Test tenant subdomain
|
|
curl -I https://tenant1.dev.uggla.uamils.com
|
|
|
|
# All should return 200 OK with SSL certificates
|
|
```
|
|
|
|
## Phase 5: Configure Tenants
|
|
|
|
### Step 9: Create Default Tenant
|
|
```bash
|
|
# Access the backend container
|
|
docker-compose -f docker-compose.production.yml exec backend sh
|
|
|
|
# Create default tenant (run this inside container)
|
|
node -e "
|
|
const { Tenant } = require('./models');
|
|
Tenant.create({
|
|
name: 'Default Tenant',
|
|
subdomain: 'app',
|
|
domain: 'dev.uggla.uamils.com',
|
|
is_active: true,
|
|
auth_config: {
|
|
providers: ['local'],
|
|
local: { enabled: true }
|
|
}
|
|
}).then(tenant => {
|
|
console.log('Default tenant created:', tenant.toJSON());
|
|
process.exit(0);
|
|
}).catch(err => {
|
|
console.error('Error:', err);
|
|
process.exit(1);
|
|
});
|
|
"
|
|
```
|
|
|
|
### Step 10: Create Additional Tenants
|
|
```bash
|
|
# Example: Create a tenant for subdomain 'acme'
|
|
# This would be accessible at: https://acme.dev.uggla.uamils.com
|
|
|
|
node -e "
|
|
const { Tenant } = require('./models');
|
|
Tenant.create({
|
|
name: 'ACME Corporation',
|
|
subdomain: 'acme',
|
|
domain: 'dev.uggla.uamils.com',
|
|
is_active: true,
|
|
subscription_tier: 'enterprise',
|
|
auth_config: {
|
|
providers: ['local', 'saml'],
|
|
local: { enabled: true },
|
|
saml: {
|
|
enabled: true,
|
|
entryPoint: 'https://acme.com/saml/sso',
|
|
issuer: 'acme-drone-detection',
|
|
cert: '-----BEGIN CERTIFICATE-----...'
|
|
}
|
|
}
|
|
}).then(tenant => {
|
|
console.log('ACME tenant created:', tenant.toJSON());
|
|
process.exit(0);
|
|
});
|
|
"
|
|
```
|
|
|
|
## Phase 6: Update Frontend Configuration
|
|
|
|
### Step 11: Update React App Configuration
|
|
```bash
|
|
# Update your client environment variables
|
|
# Create client/.env.production
|
|
|
|
REACT_APP_API_URL=https://dev.uggla.uamils.com/api
|
|
REACT_APP_SOCKET_URL=https://dev.uggla.uamils.com
|
|
REACT_APP_MULTI_TENANT=true
|
|
REACT_APP_DEFAULT_TENANT=app
|
|
|
|
# Rebuild frontend with new configuration
|
|
docker-compose -f docker-compose.production.yml build frontend
|
|
```
|
|
|
|
## Phase 7: Set Up Monitoring and Maintenance
|
|
|
|
### Step 12: Configure Certificate Auto-Renewal
|
|
```bash
|
|
# Add to crontab for automatic renewal every 12 hours
|
|
# Edit crontab: crontab -e
|
|
|
|
# Add this line:
|
|
0 0,12 * * * cd /path/to/your/project && ./scripts/renew-certs.sh >/dev/null 2>&1
|
|
```
|
|
|
|
### Step 13: Set Up Monitoring
|
|
```bash
|
|
# Test SSL certificate expiry
|
|
echo | openssl s_client -servername dev.uggla.uamils.com -connect dev.uggla.uamils.com:443 2>/dev/null | openssl x509 -noout -dates
|
|
|
|
# Set up monitoring script
|
|
cat > ./scripts/monitor.sh << 'EOF'
|
|
#!/bin/bash
|
|
# Check if services are running
|
|
docker-compose -f docker-compose.production.yml ps
|
|
|
|
# Check SSL certificate validity
|
|
echo "Checking SSL certificate..."
|
|
echo | openssl s_client -servername dev.uggla.uamils.com -connect dev.uggla.uamils.com:443 2>/dev/null | openssl x509 -noout -dates
|
|
|
|
# Test API health
|
|
curl -f https://dev.uggla.uamils.com/api/health || echo "API health check failed"
|
|
EOF
|
|
|
|
chmod +x ./scripts/monitor.sh
|
|
```
|
|
|
|
## Phase 8: Migration Verification Checklist
|
|
|
|
### Step 14: Complete Verification
|
|
- [ ] DNS resolves correctly for main domain and wildcard
|
|
- [ ] SSL certificates are valid and trusted
|
|
- [ ] Main application loads at https://dev.uggla.uamils.com
|
|
- [ ] Default tenant works at https://app.dev.uggla.uamils.com
|
|
- [ ] API endpoints respond correctly
|
|
- [ ] WebSocket/Socket.IO connections work
|
|
- [ ] Database migration completed successfully
|
|
- [ ] Multi-tenant authentication flows work
|
|
- [ ] SSL auto-renewal is configured
|
|
|
|
### Step 15: Update Documentation and Users
|
|
- [ ] Update any hardcoded URLs in your application
|
|
- [ ] Notify users of the domain change
|
|
- [ ] Update any external integrations
|
|
- [ ] Update monitoring/alerting systems
|
|
- [ ] Update backup scripts if they reference the old domain
|
|
|
|
## Troubleshooting Common Issues
|
|
|
|
### SSL Certificate Issues
|
|
```bash
|
|
# If certificate generation fails:
|
|
# 1. Check DNS TXT records are properly set
|
|
# 2. Wait for DNS propagation (up to 24 hours)
|
|
# 3. Try staging certificates first (STAGING=1 in setup-ssl.sh)
|
|
|
|
# Debug DNS TXT records:
|
|
dig TXT _acme-challenge.dev.uggla.uamils.com
|
|
|
|
# Check certificate details:
|
|
openssl x509 -in ./certbot/conf/live/dev.uggla.uamils.com/fullchain.pem -text -noout
|
|
```
|
|
|
|
### Multi-Tenant Routing Issues
|
|
```bash
|
|
# Check Nginx configuration syntax:
|
|
docker-compose -f docker-compose.production.yml exec nginx nginx -t
|
|
|
|
# Check Nginx logs:
|
|
docker-compose -f docker-compose.production.yml logs nginx
|
|
|
|
# Test tenant detection:
|
|
curl -H "Host: tenant1.dev.uggla.uamils.com" https://dev.uggla.uamils.com/api/health
|
|
```
|
|
|
|
### Database Connection Issues
|
|
```bash
|
|
# Check database logs:
|
|
docker-compose -f docker-compose.production.yml logs postgres
|
|
|
|
# Test database connection:
|
|
docker-compose -f docker-compose.production.yml exec backend npm run db:migrate
|
|
|
|
# Check if tenants table exists:
|
|
docker-compose -f docker-compose.production.yml exec postgres psql -U postgres -d drone_detection -c "\dt"
|
|
```
|
|
|
|
## Security Considerations
|
|
|
|
1. **Strong Secrets**: Ensure JWT_SECRET and SESSION_SECRET are cryptographically secure
|
|
2. **Rate Limiting**: Configure appropriate rate limits in Nginx
|
|
3. **CORS**: Restrict CORS origins to your specific domains
|
|
4. **Firewall**: Configure server firewall to only allow necessary ports (80, 443, 22)
|
|
5. **Database**: Restrict database access to backend containers only
|
|
6. **Monitoring**: Set up log monitoring for security events
|
|
|
|
## Rollback Plan
|
|
|
|
If you need to rollback:
|
|
1. Update DNS to point back to old domain
|
|
2. Restart old environment with original configuration
|
|
3. Database should remain compatible (migrations are additive)
|
|
4. Wait for DNS propagation
|
|
|
|
This completes the domain migration process!
|