Files
scripts/mailcow-setup-mail02.sh

117 lines
4.8 KiB
Bash

#!/bin/bash
LOG=/var/log/mailcow-agent.log
MAILCOW_DIR=/opt/mailcow-dockerized
MAILCOW_HOSTNAME=mail2.onsethost.com
DB_ROOT=8StOwipONifACqYhWFjxk4MuJK20
API_KEY=4A20D6-CA1BC1-371788-BC7344-D448B7
NFS_SERVER=172.16.0.1
DOMAINS=("relevantmediaproperties.com" "broadcastbeat.com" "broadcastengineering.com" "avbeat.com" "backlotbeat.com" "thepinkpulse.com" "rimshotsports.com" "onsethost.com" "crewgrid.com")
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG; }
ok() { log "$1"; }
warn() { log "⚠️ $1"; }
err() { log "$1"; }
section() { log ""; log "========== $1 =========="; }
section "STORAGE NETWORK"
if ! mountpoint -q /mnt/mail_data; then
warn "mail_data not mounted, mounting..."
sudo mkdir -p /mnt/mail_data
sudo mount -t nfs $NFS_SERVER:/volume1/mail_data /mnt/mail_data 2>/dev/null
mountpoint -q /mnt/mail_data && ok "mail_data mounted" || err "Failed to mount mail_data"
else
ok "mail_data already mounted"
fi
if ! mountpoint -q /mnt/backups; then
sudo mkdir -p /mnt/backups
sudo mount -t nfs $NFS_SERVER:/volume1/backups /mnt/backups 2>/dev/null
mountpoint -q /mnt/backups && ok "backups mounted" || err "Failed to mount backups"
else
ok "backups already mounted"
fi
if ! grep -q "mail_data" /etc/fstab; then
echo "$NFS_SERVER:/volume1/mail_data /mnt/mail_data nfs defaults,_netdev 0 0" | sudo tee -a /etc/fstab
fi
if ! grep -q "backups" /etc/fstab; then
echo "$NFS_SERVER:/volume1/backups /mnt/backups nfs defaults,_netdev 0 0" | sudo tee -a /etc/fstab
fi
sudo systemctl daemon-reload
section "MAILCOW CONTAINERS"
cd $MAILCOW_DIR
CONTAINERS_DOWN=$(sudo docker compose ps --status exited --status dead 2>/dev/null | grep -v "^NAME" | wc -l)
if [ "$CONTAINERS_DOWN" -gt 0 ]; then
warn "$CONTAINERS_DOWN containers down, restarting..."
sudo docker compose up -d 2>&1 | tee -a $LOG
sleep 15
fi
for container in postfix-mailcow dovecot-mailcow nginx-mailcow mysql-mailcow redis-mailcow; do
sudo docker ps --format '{{.Names}}' | grep -q $container && ok "$container running" || err "$container NOT running"
done
section "MAILCOW CONFIGURATION"
sudo sed -i "s/^MAILCOW_HOSTNAME=.*/MAILCOW_HOSTNAME=$MAILCOW_HOSTNAME/" $MAILCOW_DIR/mailcow.conf
ok "Hostname set to $MAILCOW_HOSTNAME"
sudo sed -i "s/^SKIP_LETS_ENCRYPT=.*/SKIP_LETS_ENCRYPT=n/" $MAILCOW_DIR/mailcow.conf
ok "Lets Encrypt enabled"
section "DOMAINS"
for domain in "${DOMAINS[@]}"; do
RESULT=$(curl -sk -X POST "https://127.0.0.1/api/v1/add/domain" \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d "{\"domain\":\"$domain\",\"description\":\"$domain\",\"aliases\":0,\"mailboxes\":100,\"defquota\":3072,\"maxquota\":102400,\"quota\":102400,\"active\":1,\"rl_value\":10,\"rl_frame\":\"s\",\"backupmx\":0,\"relay_all_recipients\":0}" 2>/dev/null)
echo "$RESULT" | grep -q "domain_added\|domain_exists" && ok "Domain $domain OK" || warn "Domain $domain: $RESULT"
done
section "DKIM"
for domain in "${DOMAINS[@]}"; do
DKIM=$(curl -sk "https://127.0.0.1/api/v1/get/dkim/$domain" -H "X-API-Key: $API_KEY" 2>/dev/null)
if echo "$DKIM" | grep -q "dkim_txt"; then
ok "DKIM exists for $domain"
else
curl -sk -X POST "https://127.0.0.1/api/v1/add/dkim" \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d "{\"dkim_selector\":\"dkim\",\"domain\":\"$domain\",\"key_size\":2048}" 2>/dev/null
ok "DKIM generated for $domain"
fi
done
section "SELF-HEALING CRON"
sudo tee /usr/local/bin/mailcow-healer.sh > /dev/null << 'HEALER'
#!/bin/bash
LOG=/var/log/mailcow-healer.log
MAILCOW_DIR=/opt/mailcow-dockerized
NFS_SERVER=172.16.0.1
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG; }
if ! mountpoint -q /mnt/mail_data; then
log "mail_data unmounted, remounting..."
sudo mount -t nfs $NFS_SERVER:/volume1/mail_data /mnt/mail_data 2>/dev/null && log "remounted OK" || log "remount FAILED"
fi
if ! mountpoint -q /mnt/backups; then
log "backups unmounted, remounting..."
sudo mount -t nfs $NFS_SERVER:/volume1/backups /mnt/backups 2>/dev/null && log "remounted OK" || log "remount FAILED"
fi
cd $MAILCOW_DIR
STOPPED=$(sudo docker compose ps --status exited --status dead 2>/dev/null | grep -v "^NAME" | wc -l)
if [ "$STOPPED" -gt 0 ]; then
log "$STOPPED containers stopped, restarting..."
sudo docker compose up -d 2>/dev/null
fi
tail -1000 $LOG > /tmp/healer.tmp && mv /tmp/healer.tmp $LOG
HEALER
sudo chmod +x /usr/local/bin/mailcow-healer.sh
if ! sudo crontab -l 2>/dev/null | grep -q "mailcow-healer"; then
(sudo crontab -l 2>/dev/null; echo "*/5 * * * * /usr/local/bin/mailcow-healer.sh") | sudo crontab -
ok "Self-healing cron installed"
else
ok "Self-healing cron already installed"
fi
section "SUMMARY"
log "MAIL_02 Setup Complete"
log "Hostname: $MAILCOW_HOSTNAME"
log "Admin: https://mail2.onsethost.com/admin"
log "Self-healing cron runs every 5 minutes"