#!/bin/bash # Mail Server Setup Script for Keys For All # This script sets up the mail server environment using Docker set -e echo "🚀 Setting up Mail Server for Keys For All..." # Check if Docker is installed if ! command -v docker &> /dev/null; then echo "❌ Docker is not installed. Please install Docker first." exit 1 fi # Check if Docker Compose is installed if ! command -v docker-compose &> /dev/null; then echo "❌ Docker Compose is not installed. Please install Docker Compose first." exit 1 fi # Create necessary directories echo "📁 Creating mail server directories..." mkdir -p docker-data/mail-data mkdir -p docker-data/mail-state mkdir -p docker-data/mail-logs mkdir -p docker-data/mailhog mkdir -p docker-data/redis mkdir -p config/mailserver # Get domain from user or use default if [ -z "$MAIL_DOMAIN" ]; then read -p "Enter your mail domain (e.g., example.com): " MAIL_DOMAIN MAIL_DOMAIN=${MAIL_DOMAIN:-localhost} fi # Copy mailserver environment file if it doesn't exist if [ ! -f .env.mailserver ]; then if [ -f .env.mailserver.example ]; then echo "📋 Creating mailserver environment file..." sed "s/your-domain.com/$MAIL_DOMAIN/g" .env.mailserver.example > .env.mailserver echo "✅ Created .env.mailserver with domain: $MAIL_DOMAIN" else echo "⚠️ .env.mailserver.example not found. Creating a basic one..." cat > .env.mailserver << EOF OVERRIDE_HOSTNAME=mail.$MAIL_DOMAIN DOMAINNAME=$MAIL_DOMAIN CONTAINER_NAME=keys-mailserver ENABLE_LDAP=0 ENABLE_SASLAUTHD=0 SMTP_ONLY=0 LOG_LEVEL=info DMS_DEBUG=0 EOF fi fi # Function to create mail accounts create_mail_account() { local email=$1 local password=$2 echo "Creating mail account: $email" docker exec -it keys-mailserver setup email add "$email" "$password" 2>/dev/null || true } # Start the mail servers echo "🔧 Starting mail servers..." docker-compose -f docker-compose.mail.yml up -d # Wait for mail server to be ready echo "⏳ Waiting for mail server to initialize..." sleep 30 # Generate passwords NOREPLY_PASS=$(openssl rand -base64 12) SUPPORT_PASS=$(openssl rand -base64 12) ADMIN_PASS=$(openssl rand -base64 12) # Create default mail accounts echo "📧 Creating default mail accounts..." create_mail_account "noreply@$MAIL_DOMAIN" "$NOREPLY_PASS" create_mail_account "support@$MAIL_DOMAIN" "$SUPPORT_PASS" create_mail_account "admin@$MAIL_DOMAIN" "$ADMIN_PASS" # Determine which env file to update ENV_FILE=".env" if [ "$1" == "--production" ] || [ "$NODE_ENV" == "production" ]; then ENV_FILE=".env.production" fi # Create env file if it doesn't exist if [ ! -f "$ENV_FILE" ]; then echo "📝 Creating $ENV_FILE from .env.example..." cp .env.example "$ENV_FILE" fi # Update mail configuration in env file echo "📝 Updating mail configuration in $ENV_FILE..." # Function to update or add env variable update_env() { local key=$1 local value=$2 local file=$3 if grep -q "^$key=" "$file"; then # Update existing value sed -i.bak "s|^$key=.*|$key=$value|" "$file" else # Add new value echo "$key=$value" >> "$file" fi } # Update mail settings update_env "MAIL_USER" "noreply@$MAIL_DOMAIN" "$ENV_FILE" update_env "MAIL_PASS" "$NOREPLY_PASS" "$ENV_FILE" update_env "MAIL_FROM" "Keys For All " "$ENV_FILE" update_env "MAIL_SUPPORT" "support@$MAIL_DOMAIN" "$ENV_FILE" update_env "IMAP_USER" "support@$MAIL_DOMAIN" "$ENV_FILE" update_env "IMAP_PASS" "$SUPPORT_PASS" "$ENV_FILE" # Clean up backup files rm -f "$ENV_FILE.bak" echo "✅ Mail credentials updated in $ENV_FILE" # Also save a backup of credentials CREDS_BACKUP=".mail-credentials.backup" cat > "$CREDS_BACKUP" << EOF Mail Server Credentials Backup Generated: $(date) Domain: $MAIL_DOMAIN Accounts: noreply@$MAIL_DOMAIN : $NOREPLY_PASS support@$MAIL_DOMAIN : $SUPPORT_PASS admin@$MAIL_DOMAIN : $ADMIN_PASS EOF chmod 600 "$CREDS_BACKUP" # Show status echo "" echo "✅ Mail server setup complete!" echo "" echo "📊 Service Status:" docker-compose -f docker-compose.mail.yml ps echo "" echo "🌐 Access Points:" echo " - SMTP: localhost:587 (submission)" echo " - SMTP: localhost:25 (standard)" echo " - IMAP: localhost:143" echo " - IMAPS: localhost:993" echo " - MailHog Web UI: http://localhost:8025 (development only)" echo " - Redis: localhost:6379" echo "" echo "📧 Mail accounts created for domain: $MAIL_DOMAIN" echo " - noreply@$MAIL_DOMAIN" echo " - support@$MAIL_DOMAIN" echo " - admin@$MAIL_DOMAIN" echo "" echo "⚠️ IMPORTANT:" echo " 1. Mail credentials automatically updated in: $ENV_FILE" echo " 2. Credentials backup saved to: $CREDS_BACKUP" echo " 3. For production, use proper SSL certificates" echo " 4. Configure proper DNS records (MX, SPF, DKIM, DMARC)" echo " 5. The admin password is only in $CREDS_BACKUP (not in .env)" echo "" echo "🔐 To add more email accounts:" echo " docker exec -it keys-mailserver setup email add user@$MAIL_DOMAIN password" echo "" echo "📖 For more information, see the documentation in docs/MAIL_SERVER_SETUP.md"