מדריך התקנת Forward Email Self-Hosting עבור Debian
סקירה כללית
מדריך זה מספק הוראות שלב אחר שלב להתקנת פתרון ה-self-hosted של Forward Email על מערכות Debian. מדריך זה מותאם במיוחד עבור Debian 11 (Bullseye) ו-Debian 12 (Bookworm).
דרישות מוקדמות
לפני תחילת ההתקנה, ודא שיש לך:
- שרת Debian: גרסה 11 (Bullseye) או 12 (Bookworm)
- גישה כ-root: עליך להיות מסוגל להריץ פקודות כ-root (גישה עם sudo)
- שם דומיין: דומיין שבשליטתך עם גישה לניהול DNS
- שרת נקי: מומלץ להשתמש בהתקנת Debian חדשה
- חיבור אינטרנט: נדרש להורדת חבילות ותמונות Docker
דרישות מערכת
- זיכרון RAM: מינימום 2GB (מומלץ 4GB לייצור)
- אחסון: מינימום 20GB שטח פנוי (מומלץ 50GB+ לייצור)
- מעבד CPU: מינימום 1 vCPU (מומלץ 2+ vCPUs לייצור)
- רשת: כתובת IP ציבורית עם הפתחים הבאים נגישים:
- 22 (SSH)
- 25 (SMTP)
- 80 (HTTP)
- 443 (HTTPS)
- 465 (SMTPS)
- 993 (IMAPS)
- 995 (POP3S)
התקנה שלב אחר שלב
שלב 1: הגדרת מערכת ראשונית
ראשית, ודא שהמערכת שלך מעודכנת והחלף למשתמש root:
# Update system packages
sudo apt update && sudo apt upgrade -y
# Switch to root user (required for the installation)
sudo su -
Step 2: Configure DNS Resolvers
הגדר את המערכת שלך להשתמש בשרתי ה-DNS של Cloudflare לצורך יצירת תעודות אמינות:
# Stop and disable systemd-resolved if running
if systemctl is-active --quiet systemd-resolved; then
rm /etc/resolv.conf
systemctl stop systemd-resolved
systemctl disable systemd-resolved
systemctl mask systemd-resolved
fi
# Configure Cloudflare DNS resolvers
tee /etc/resolv.conf > /dev/null <<EOF
nameserver 1.1.1.1
nameserver 2606:4700:4700::1111
nameserver 1.0.0.1
nameserver 2606:4700:4700::1001
nameserver 8.8.8.8
nameserver 2001:4860:4860::8888
nameserver 8.8.4.4
nameserver 2001:4860:4860::8844
EOF
Step 3: Install System Dependencies
התקן את החבילות הנדרשות עבור Forward Email בדביאן:
# Update package list
apt-get update -y
# Install basic dependencies (Debian-specific package list)
apt-get install -y \
ca-certificates \
curl \
gnupg \
git \
openssl \
lsb-release \
apt-transport-https \
software-properties-common
Step 4: Install and Configure Snapd
בדביאן לא כלול snapd כברירת מחדל, לכן יש להתקין ולהגדיר אותו:
# Install snapd
apt-get install -y snapd
# Enable and start snapd service
systemctl enable snapd
systemctl start snapd
# Create symlink for snap to work properly
ln -sf /var/lib/snapd/snap /snap
# Wait for snapd to be ready
sleep 10
# Verify snapd is working
snap version
Step 5: Install Snap Packages
התקן את AWS CLI ו-Certbot דרך snap:
# Install AWS CLI
snap install aws-cli --classic
# Install Certbot and DNS plugin
snap install certbot --classic
snap set certbot trust-plugin-with-root=ok
snap install certbot-dns-cloudflare
# Verify installations
aws --version
certbot --version
Step 6: Install Docker
התקן את Docker CE ו-Docker Compose בדביאן:
# Add Docker's official GPG key (Debian-specific)
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | tee /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
# Add Docker repository (Debian-specific)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list
# Update package index and install Docker
apt-get update -y
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Install standalone docker-compose as fallback (if plugin doesn't work)
if ! command -v docker-compose &> /dev/null; then
apt-get install -y docker-compose
fi
# Verify Docker installation
docker --version
docker compose version || docker-compose --version
Step 7: Configure Docker Service
ודא ש-Docker יתחיל אוטומטית ופועל:
# Enable and start Docker service
systemctl unmask docker
systemctl enable docker
systemctl start docker
# Verify Docker is running
docker info
אם Docker נכשל בהפעלה, נסה להפעילו ידנית:
# Alternative startup method if systemctl fails
nohup dockerd >/dev/null 2>/dev/null &
sleep 5
docker info
Step 8: Install and Configure UFW Firewall
התקנות מינימליות של דביאן עשויות לא לכלול את UFW, לכן התקן אותו תחילה:
# Install UFW if not present
if ! command -v ufw &> /dev/null; then
apt-get update -y
apt-get install -y ufw
fi
# Set default policies
ufw default deny incoming
ufw default allow outgoing
# Allow SSH (important - don't lock yourself out!)
ufw allow 22/tcp
# Allow email-related ports
ufw allow 25/tcp # SMTP
ufw allow 80/tcp # HTTP (for Let's Encrypt)
ufw allow 443/tcp # HTTPS
ufw allow 465/tcp # SMTPS
ufw allow 993/tcp # IMAPS
ufw allow 995/tcp # POP3S
ufw allow 2993/tcp # IMAP (alternative port)
ufw allow 2995/tcp # POP3 (alternative port)
ufw allow 3456/tcp # Custom service port
ufw allow 4000/tcp # Custom service port
ufw allow 5000/tcp # Custom service port
# Allow local database connections
ufw allow from 127.0.0.1 to any port 27017 # MongoDB
ufw allow from 127.0.0.1 to any port 6379 # Redis
# Enable firewall
echo "y" | ufw enable
# Check firewall status
ufw status numbered
שלב 9: שכפל את מאגר Forward Email
הורד את קוד המקור של Forward Email:
# Set up variables
REPO_FOLDER_NAME="forwardemail.net"
REPO_URL="https://github.com/forwardemail/forwardemail.net.git"
ROOT_DIR="/root/$REPO_FOLDER_NAME"
# Clone the repository
git clone "$REPO_URL" "$ROOT_DIR"
cd "$ROOT_DIR"
# Verify the clone was successful
ls -la
שלב 10: הגדר את תצורת הסביבה
הכן את תצורת הסביבה:
# Set up directory variables
SELF_HOST_DIR="$ROOT_DIR/self-hosting"
ENV_FILE_DEFAULTS=".env.defaults"
ENV_FILE=".env"
# Copy default environment file
cp "$ROOT_DIR/$ENV_FILE_DEFAULTS" "$SELF_HOST_DIR/$ENV_FILE"
# Create SSL directory
mkdir -p "$SELF_HOST_DIR/ssl"
# Create database directories
mkdir -p "$SELF_HOST_DIR/sqlite-data"
mkdir -p "$SELF_HOST_DIR/mongo-backups"
mkdir -p "$SELF_HOST_DIR/redis-backups"
שלב 11: הגדר את הדומיין שלך
הגדר את שם הדומיין שלך ועדכן את משתני הסביבה:
# Replace 'yourdomain.com' with your actual domain
DOMAIN="yourdomain.com"
# Function to update environment file
update_env_file() {
local key="$1"
local value="$2"
if grep -qE "^${key}=" "$SELF_HOST_DIR/$ENV_FILE"; then
sed -i -E "s|^${key}=.*|${key}=${value}|" "$SELF_HOST_DIR/$ENV_FILE"
else
echo "${key}=${value}" >> "$SELF_HOST_DIR/$ENV_FILE"
fi
}
# Update domain-related environment variables
update_env_file "DOMAIN" "$DOMAIN"
update_env_file "NODE_ENV" "production"
update_env_file "HTTP_PROTOCOL" "https"
update_env_file "WEB_HOST" "$DOMAIN"
update_env_file "WEB_PORT" "443"
update_env_file "CALDAV_HOST" "caldav.$DOMAIN"
update_env_file "CARDDAV_HOST" "carddav.$DOMAIN"
update_env_file "API_HOST" "api.$DOMAIN"
update_env_file "APP_NAME" "$DOMAIN"
update_env_file "SMTP_HOST" "smtp.$DOMAIN"
update_env_file "SMTP_PORT" "465"
update_env_file "IMAP_HOST" "imap.$DOMAIN"
update_env_file "IMAP_PORT" "993"
update_env_file "POP3_HOST" "pop3.$DOMAIN"
update_env_file "POP3_PORT" "995"
update_env_file "MX_HOST" "mx.$DOMAIN"
update_env_file "SMTP_EXCHANGE_DOMAINS" "mx.$DOMAIN"
update_env_file "SELF_HOSTED" "true"
update_env_file "WEBSITE_URL" "$DOMAIN"
update_env_file "AUTH_BASIC_ENABLED" "true"
שלב 12: צור תעודות SSL
אפשרות א: אתגר DNS ידני (מומלץ לרוב המשתמשים)
# Generate certificates using manual DNS challenge
certbot certonly \
--manual \
--agree-tos \
--preferred-challenges dns \
-d "*.$DOMAIN" \
-d "$DOMAIN"
חשוב: כאשר תתבקש, תצטרך ליצור רשומות TXT ב-DNS שלך. ייתכן שתראה מספר אתגרים עבור אותו דומיין - צור את כולם. אל תסיר את רשומת ה-TXT הראשונה כשאתה מוסיף את השנייה.
אפשרות ב: DNS של Cloudflare (אם אתה משתמש ב-Cloudflare)
אם הדומיין שלך משתמש ב-Cloudflare עבור DNS, תוכל לאוטומט את יצירת התעודות:
# Create Cloudflare credentials file
cat > /root/.cloudflare.ini <<EOF
dns_cloudflare_email = "your-email@example.com"
dns_cloudflare_api_key = "your-cloudflare-global-api-key"
EOF
# Set proper permissions
chmod 600 /root/.cloudflare.ini
# Generate certificates automatically
certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /root/.cloudflare.ini \
-d "$DOMAIN" \
-d "*.$DOMAIN" \
--non-interactive \
--agree-tos \
--email "your-email@example.com"
העתק תעודות
לאחר יצירת התעודות, העתק אותן לתיקיית האפליקציה:
# Copy certificates to application SSL directory
cp /etc/letsencrypt/live/$DOMAIN*/* "$SELF_HOST_DIR/ssl/"
# Verify certificates were copied
ls -la "$SELF_HOST_DIR/ssl/"
שלב 13: צור מפתחות הצפנה
צור את מפתחות ההצפנה השונים הדרושים להפעלה מאובטחת:
# Generate helper encryption key
helper_encryption_key=$(openssl rand -base64 32 | tr -d /=+ | cut -c -32)
update_env_file "HELPER_ENCRYPTION_KEY" "$helper_encryption_key"
# Generate SRS secret for email forwarding
srs_secret=$(openssl rand -base64 32 | tr -d /=+ | cut -c -32)
update_env_file "SRS_SECRET" "$srs_secret"
# Generate TXT encryption key
txt_encryption_key=$(openssl rand -hex 16)
update_env_file "TXT_ENCRYPTION_KEY" "$txt_encryption_key"
# Generate DKIM private key for email signing
openssl genrsa -f4 -out "$SELF_HOST_DIR/ssl/dkim.key" 2048
update_env_file "DKIM_PRIVATE_KEY_PATH" "/app/ssl/dkim.key"
# Generate webhook signature key
webhook_signature_key=$(openssl rand -hex 16)
update_env_file "WEBHOOK_SIGNATURE_KEY" "$webhook_signature_key"
# Set SMTP transport password
update_env_file "SMTP_TRANSPORT_PASS" "$(openssl rand -base64 32)"
echo "✅ All encryption keys generated successfully"
Step 14: Update SSL Paths in Configuration
הגדר את נתיבי תעודת ה-SSL בקובץ הסביבה:
# Update SSL paths to point to the correct certificate files
sed -i -E \
-e 's|^(.*_)?SSL_KEY_PATH=.*|\1SSL_KEY_PATH=/app/ssl/privkey.pem|' \
-e 's|^(.*_)?SSL_CERT_PATH=.*|\1SSL_CERT_PATH=/app/ssl/fullchain.pem|' \
-e 's|^(.*_)?SSL_CA_PATH=.*|\1SSL_CA_PATH=/app/ssl/chain.pem|' \
"$SELF_HOST_DIR/$ENV_FILE"
Step 15: Set Up Basic Authentication
צור אישורי אימות בסיסיים זמניים:
# Generate a secure random password
PASSWORD=$(openssl rand -base64 16)
# Update environment file with basic auth credentials
update_env_file "AUTH_BASIC_USERNAME" "admin"
update_env_file "AUTH_BASIC_PASSWORD" "$PASSWORD"
# Display credentials (save these!)
echo ""
echo "🔐 IMPORTANT: Save these login credentials!"
echo "=================================="
echo "שם משתמש: admin"
echo "סיסמה: $PASSWORD"
echo "=================================="
echo ""
echo "תזדקק לאלה כדי לגשת לממשק האינטרנט לאחר ההתקנה."
echo ""
Step 16: Deploy with Docker Compose
הפעל את כל שירותי Forward Email:
# Set Docker Compose file path
DOCKER_COMPOSE_FILE="$SELF_HOST_DIR/docker-compose-self-hosted.yml"
# Stop any existing containers
if command -v docker-compose &> /dev/null; then
docker-compose -f "$DOCKER_COMPOSE_FILE" down
else
docker compose -f "$DOCKER_COMPOSE_FILE" down
fi
# Pull the latest images
if command -v docker-compose &> /dev/null; then
docker-compose -f "$DOCKER_COMPOSE_FILE" pull
else
docker compose -f "$DOCKER_COMPOSE_FILE" pull
fi
# Start all services in detached mode
if command -v docker-compose &> /dev/null; then
docker-compose -f "$DOCKER_COMPOSE_FILE" up -d
else
docker compose -f "$DOCKER_COMPOSE_FILE" up -d
fi
# Wait a moment for services to start
sleep 10
# Check service status
if command -v docker-compose &> /dev/null; then
docker-compose -f "$DOCKER_COMPOSE_FILE" ps
else
docker compose -f "$DOCKER_COMPOSE_FILE" ps
fi
Step 17: Verify Installation
בדוק שכל השירותים פועלים כראוי:
# Check Docker containers
docker ps
# Check service logs for any errors
if command -v docker-compose &> /dev/null; then
docker-compose -f "$DOCKER_COMPOSE_FILE" logs --tail=50
else
docker compose -f "$DOCKER_COMPOSE_FILE" logs --tail=50
fi
# Test web interface connectivity
curl -I https://$DOMAIN
# Check if ports are listening
ss -tlnp | grep -E ':(25|80|443|465|587|993|995)'
Post-Installation Configuration
DNS Records Setup
עליך להגדיר את רשומות ה-DNS הבאות עבור הדומיין שלך:
MX Record
@ MX 10 mx.yourdomain.com
A Records
@ A YOUR_SERVER_IP
mx A YOUR_SERVER_IP
smtp A YOUR_SERVER_IP
imap A YOUR_SERVER_IP
pop3 A YOUR_SERVER_IP
api A YOUR_SERVER_IP
caldav A YOUR_SERVER_IP
carddav A YOUR_SERVER_IP
SPF Record
@ TXT "v=spf1 mx ~all"
DKIM Record
קבל את מפתח ה-DKIM הציבורי שלך:
# Extract DKIM public key
openssl rsa -in "$SELF_HOST_DIR/ssl/dkim.key" -pubout -outform DER | openssl base64 -A
צור רשומת DKIM ב-DNS:
default._domainkey TXT "v=DKIM1; k=rsa; p=YOUR_DKIM_PUBLIC_KEY"
DMARC Record
_dmarc TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.com"
First Login
- פתח את דפדפן האינטרנט שלך וגש ל-
https://yourdomain.com - הזן את אישורי האימות הבסיסיים ששמרת קודם
- השלם את אשף ההגדרה הראשוני
- צור את חשבון האימייל הראשון שלך
Backup Configuration
Set Up S3-Compatible Backup
הגדר גיבויים אוטומטיים לאחסון תואם S3:
# Create AWS credentials directory
mkdir -p ~/.aws
# Configure AWS credentials
cat > ~/.aws/credentials <<EOF
[default]
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
EOF
# Configure AWS settings
cat > ~/.aws/config <<EOF
[default]
region = auto
output = json
EOF
# For non-AWS S3 (like Cloudflare R2), add endpoint URL
echo "endpoint_url = YOUR_S3_ENDPOINT_URL" >> ~/.aws/config
הגדרת עבודות Cron לגיבוי
# הפוך את סקריפטי הגיבוי לביצועים
chmod +x "$ROOT_DIR/self-hosting/scripts/backup-mongo.sh"
chmod +x "$ROOT_DIR/self-hosting/scripts/backup-redis.sh"
# הוסף עבודת cron לגיבוי MongoDB (רצה מדי יום בחצות)
(crontab -l 2>/dev/null; echo "0 0 * * * $ROOT_DIR/self-hosting/scripts/backup-mongo.sh >> /var/log/mongo-backup.log 2>&1") | crontab -
# הוסף עבודת cron לגיבוי Redis (רצה מדי יום בחצות)
(crontab -l 2>/dev/null; echo "0 0 * * * $ROOT_DIR/self-hosting/scripts/backup-redis.sh >> /var/log/redis-backup.log 2>&1") | crontab -
# אמת שעבודות ה-cron נוספו
crontab -l
הגדרת עדכון אוטומטי
הגדר עדכונים אוטומטיים להתקנת Forward Email שלך:
# צור פקודת עדכון אוטומטי (השתמש בפקודת docker compose המתאימה)
if command -v docker-compose &> /dev/null; then
DOCKER_UPDATE_CMD="docker-compose -f $DOCKER_COMPOSE_FILE pull && docker-compose -f $DOCKER_COMPOSE_FILE up -d"
else
DOCKER_UPDATE_CMD="docker compose -f $DOCKER_COMPOSE_FILE pull && docker compose -f $DOCKER_COMPOSE_FILE up -d"
fi
# הוסף עבודת cron לעדכון אוטומטי (רצה מדי יום בשעה 1 בלילה)
(crontab -l 2>/dev/null; echo "0 1 * * * $DOCKER_UPDATE_CMD >> /var/log/autoupdate.log 2>&1") | crontab -
# אמת שעבודת ה-cron נוספה
crontab -l
שיקולים ספציפיים ל-Debian
הבדלים בניהול חבילות
- Snapd: לא מותקן כברירת מחדל ב-Debian, דורש התקנה ידנית
- Docker: משתמש במאגרי Debian ספציפיים ומפתחות GPG
- UFW: ייתכן שלא ייכלל בהתקנות מינימליות של Debian
- systemd: ההתנהגות עשויה להיות שונה במעט מאובונטו
ניהול שירותים
# בדוק סטטוס שירותים (פקודות ספציפיות ל-Debian)
systemctl status snapd
systemctl status docker
systemctl status ufw
# הפעל מחדש שירותים במידת הצורך
systemctl restart snapd
systemctl restart docker
תצורת רשת
ייתכן של-Debian יש שמות או תצורות שונות לממשקי רשת:
# בדוק ממשקי רשת
ip addr show
# בדוק ניתוב
ip route show
# בדוק פתרון DNS
nslookup google.com
תחזוקה ומעקב
מיקומי לוגים
- לוגים של Docker Compose: השתמש בפקודת docker compose המתאימה לפי ההתקנה
- לוגי מערכת:
/var/log/syslog - לוגי גיבוי:
/var/log/mongo-backup.log,/var/log/redis-backup.log - לוגי עדכון אוטומטי:
/var/log/autoupdate.log - לוגי Snapd:
journalctl -u snapd
משימות תחזוקה שוטפות
- נטר שטח דיסק:
df -h - בדוק סטטוס שירותים: השתמש בפקודת docker compose המתאימה
- סקור לוגים: בדוק גם לוגים של האפליקציה וגם של המערכת
- עדכן חבילות מערכת:
apt update && apt upgrade - נטר את snapd:
snap listו-snap refresh
חידוש תעודות SSL
התעודות אמורות להתחדש אוטומטית, אך ניתן לחדש ידנית במידת הצורך:
# חידוש תעודה ידני
certbot renew
# העתקת תעודות מחודשות
cp /etc/letsencrypt/live/$DOMAIN*/* "$SELF_HOST_DIR/ssl/"
# הפעל מחדש שירותים לשימוש בתעודות החדשות
if command -v docker-compose &> /dev/null; then
docker-compose -f "$DOCKER_COMPOSE_FILE" restart
else
docker compose -f "$DOCKER_COMPOSE_FILE" restart
fi
פתרון בעיות
בעיות ספציפיות ל-Debian
1. Snapd לא עובד
# בדוק סטטוס snapd
systemctl status snapd
# הפעל מחדש את snapd
systemctl restart snapd
# בדוק את PATH של snap
echo $PATH | grep snap
# הוסף את snap ל-PATH אם חסר
echo 'export PATH=$PATH:/snap/bin' >> ~/.bashrc
source ~/.bashrc
2. פקודת Docker Compose לא נמצאה
# בדוק איזו פקודת docker compose זמינה
command -v docker-compose
command -v docker
# השתמש בפקודה המתאימה בסקריפטים
if command -v docker-compose &> /dev/null; then
echo "משתמש ב-docker-compose"
else
echo "משתמש ב-docker compose"
fi
3. בעיות בהתקנת חבילות
# Update package cache
apt update
# Fix broken packages
apt --fix-broken install
# Check for held packages
apt-mark showhold
בעיות נפוצות
1. שירות Docker לא מתחיל
# Check Docker status
systemctl status docker
# Check Docker logs
journalctl -u docker
# Try alternative startup
nohup dockerd >/dev/null 2>/dev/null &
2. כשל ביצירת תעודה
- ודא שפורט 80 ו-443 נגישים
- אמת שרשומות ה-DNS מפנות לשרת שלך
- בדוק את הגדרות חומת האש עם
ufw status
3. בעיות בהעברת דואר אלקטרוני
- אמת שרשומות MX נכונות
- בדוק רשומות SPF, DKIM ו-DMARC
- ודא שפורט 25 אינו חסום על ידי ספק האירוח שלך
קבלת עזרה
- תיעוד: https://forwardemail.net/self-hosted
- בעיות ב-GitHub: https://github.com/forwardemail/forwardemail.net/issues
- תיעוד דביאן: https://www.debian.org/doc/
שיטות עבודה מומלצות לאבטחה
- שמור על המערכת מעודכנת: עדכן באופן קבוע את דביאן והחבילות
- נטר יומנים: הגדר ניטור והתראות ליומנים
- גבה באופן קבוע: בדוק נהלי גיבוי ושחזור
- השתמש בסיסמאות חזקות: צור סיסמאות חזקות לכל החשבונות
- הפעל Fail2Ban: שקול להתקין fail2ban לאבטחה נוספת
- בצע ביקורות אבטחה תקופתיות: בדוק את התצורה שלך מעת לעת
- נטר את Snapd: שמור על חבילות snap מעודכנות עם
snap refresh
סיכום
התקנת Forward Email עצמאית שלך אמורה להיות כעת מלאה ופועלת על דביאן. זכור:
- הגדר את רשומות ה-DNS שלך כראוי
- בדוק שליחת וקבלת דואר אלקטרוני
- הגדר גיבויים קבועים
- נטר את המערכת שלך באופן קבוע
- שמור על ההתקנה מעודכנת
- נטר את snapd וחבילות ה-snap
ההבדלים העיקריים מאובונטו הם התקנת snapd והגדרת מאגר Docker. לאחר שהדברים הללו מוגדרים כראוי, אפליקציית Forward Email מתנהגת זהה בשתי המערכות.
לאפשרויות תצורה נוספות ותכונות מתקדמות, עיין בתיעוד הרשמי של Forward Email בכתובת https://forwardemail.net/self-hosted#configuration.