#!/bin/bash # Script de instalación automática de Listmonk en Ubuntu 22.04 # Uso: sudo bash install-listmonk.sh set -e # Colores para output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Función para imprimir mensajes print_message() { echo -e "${GREEN}[INFO]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } print_step() { echo -e "${BLUE}[STEP]${NC} $1" } # Verificar si se ejecuta como root if [ "$EUID" -ne 0 ]; then print_error "Por favor ejecuta este script como root (sudo)" exit 1 fi print_message "=== Iniciando instalación de Listmonk ===" print_message "Sistema operativo recomendado: Ubuntu 22.04 LTS" # Paso 1: Actualizar el sistema print_step "1. Actualizando el sistema..." apt update && apt upgrade -y # Paso 2: Instalar dependencias básicas print_step "2. Instalando dependencias básicas..." apt install -y curl wget unzip software-properties-common apt-transport-https ca-certificates gnupg lsb-release # Paso 3: Instalar PostgreSQL print_step "3. Instalando PostgreSQL..." apt install -y postgresql postgresql-contrib # Iniciar y habilitar PostgreSQL systemctl start postgresql systemctl enable postgresql # Paso 4: Configurar PostgreSQL print_step "4. Configurando PostgreSQL..." # Generar contraseña aleatoria para PostgreSQL DB_PASSWORD=$(openssl rand -base64 32) LISTMONK_PASSWORD=$(openssl rand -base64 32) # Configurar usuario de PostgreSQL sudo -u postgres psql << EOF CREATE DATABASE listmonk; CREATE USER listmonk WITH ENCRYPTED PASSWORD '$DB_PASSWORD'; GRANT ALL PRIVILEGES ON DATABASE listmonk TO listmonk; ALTER USER listmonk CREATEDB; \q EOF print_message "Base de datos configurada correctamente" # Paso 5: Crear usuario para Listmonk print_step "5. Creando usuario del sistema para Listmonk..." useradd --system --shell /bin/bash --home /opt/listmonk listmonk || true # Paso 6: Descargar e instalar Listmonk print_step "6. Descargando Listmonk..." # Obtener la última versión LATEST_VERSION=$(curl -s https://api.github.com/repos/knadh/listmonk/releases/latest | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') print_message "Descargando Listmonk versión: $LATEST_VERSION" # Crear directorio de instalación mkdir -p /opt/listmonk cd /opt/listmonk # Descargar binario wget "https://github.com/knadh/listmonk/releases/download/$LATEST_VERSION/listmonk_${LATEST_VERSION}_linux_amd64.tar.gz" tar -xzf "listmonk_${LATEST_VERSION}_linux_amd64.tar.gz" rm "listmonk_${LATEST_VERSION}_linux_amd64.tar.gz" # Hacer ejecutable chmod +x listmonk # Cambiar propietario chown -R listmonk:listmonk /opt/listmonk # Paso 7: Crear archivo de configuración print_step "7. Creando archivo de configuración..." cat > /opt/listmonk/config.toml << EOF [app] address = "0.0.0.0:9000" admin_username = "admin" admin_password = "$LISTMONK_PASSWORD" # Database. [db] host = "localhost" port = 5432 user = "listmonk" password = "$DB_PASSWORD" database = "listmonk" ssl_mode = "disable" max_open = 25 max_idle = 25 max_lifetime = "300s" # SMTP servers. [smtp] [smtp.default] enabled = true host = "localhost" port = 1025 auth_protocol = "none" username = "" password = "" hello_hostname = "" max_conns = 10 max_msg_retries = 2 idle_timeout = "15s" wait_timeout = "5s" tls_enabled = false tls_skip_verify = false email_headers = [] # Bounce processing. [bounce] enabled = false webhooks_enabled = false # Default bounce e-mail box that listmonk will connect to. [bounce.mailbox] enabled = false type = "pop" host = "" port = 995 auth_protocol = "userpass" username = "" password = "" return_path = "" scan_interval = "15m" tls_enabled = true tls_skip_verify = false # File upload settings. [upload] provider = "filesystem" filesystem_upload_path = "./uploads" filesystem_upload_uri = "/uploads" # HTTP security headers. [security] enable_captcha = false captcha_key = "" captcha_secret = "" EOF chown listmonk:listmonk /opt/listmonk/config.toml chmod 600 /opt/listmonk/config.toml # Paso 8: Inicializar la base de datos print_step "8. Inicializando base de datos..." sudo -u listmonk /opt/listmonk/listmonk --install --config /opt/listmonk/config.toml # Paso 9: Crear servicio systemd print_step "9. Creando servicio systemd..." cat > /etc/systemd/system/listmonk.service << EOF [Unit] Description=Listmonk After=network.target [Service] Type=simple User=listmonk Group=listmonk WorkingDirectory=/opt/listmonk ExecStart=/opt/listmonk/listmonk --config /opt/listmonk/config.toml Restart=always RestartSec=3 StandardOutput=journal StandardError=journal SyslogIdentifier=listmonk [Install] WantedBy=multi-user.target EOF # Recargar systemd y habilitar el servicio systemctl daemon-reload systemctl enable listmonk systemctl start listmonk # Paso 10: Instalar Nginx como proxy reverso (opcional) read -p "¿Deseas instalar Nginx como proxy reverso? (s/n): " -n 1 -r echo if [[ $REPLY =~ ^[Ss]$ ]]; then print_step "10. Instalando y configurando Nginx..." apt install -y nginx # Crear configuración de Nginx cat > /etc/nginx/sites-available/listmonk << EOF server { listen 80; server_name _; client_max_body_size 50M; location / { proxy_pass http://127.0.0.1:9000; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto \$scheme; proxy_read_timeout 300s; proxy_connect_timeout 75s; } } EOF # Habilitar el sitio ln -sf /etc/nginx/sites-available/listmonk /etc/nginx/sites-enabled/ rm -f /etc/nginx/sites-enabled/default # Verificar configuración y reiniciar Nginx nginx -t && systemctl restart nginx systemctl enable nginx print_message "Nginx configurado correctamente" fi # Paso 11: Configurar firewall básico print_step "11. Configurando firewall básico..." ufw --force enable ufw allow ssh ufw allow 'Nginx Full' ufw allow 9000/tcp # Paso 12: Crear script de backup print_step "12. Creando script de backup..." mkdir -p /opt/listmonk/backups cat > /opt/listmonk/backup.sh << 'EOF' #!/bin/bash BACKUP_DIR="/opt/listmonk/backups" DATE=$(date +%Y%m%d_%H%M%S) DB_NAME="listmonk" # Crear backup de la base de datos sudo -u postgres pg_dump $DB_NAME > "$BACKUP_DIR/listmonk_db_$DATE.sql" # Crear backup de archivos de configuración tar -czf "$BACKUP_DIR/listmonk_config_$DATE.tar.gz" -C /opt/listmonk config.toml uploads/ # Mantener solo los últimos 7 backups find $BACKUP_DIR -name "listmonk_*" -type f -mtime +7 -delete echo "Backup completado: $DATE" EOF chmod +x /opt/listmonk/backup.sh chown listmonk:listmonk /opt/listmonk/backup.sh # Configurar cron para backup automático (crontab -u listmonk -l 2>/dev/null; echo "0 2 * * * /opt/listmonk/backup.sh") | crontab -u listmonk - # Mostrar información final print_message "=== Instalación completada exitosamente ===" echo print_message "Información de acceso:" echo -e " ${BLUE}URL:${NC} http://$(hostname -I | awk '{print $1}'):9000" echo -e " ${BLUE}Usuario:${NC} admin" echo -e " ${BLUE}Contraseña:${NC} $LISTMONK_PASSWORD" echo print_message "Base de datos PostgreSQL:" echo -e " ${BLUE}Usuario:${NC} listmonk" echo -e " ${BLUE}Contraseña:${NC} $DB_PASSWORD" echo -e " ${BLUE}Base de datos:${NC} listmonk" echo print_message "Archivos importantes:" echo -e " ${BLUE}Configuración:${NC} /opt/listmonk/config.toml" echo -e " ${BLUE}Logs:${NC} sudo journalctl -u listmonk -f" echo -e " ${BLUE}Backup script:${NC} /opt/listmonk/backup.sh" echo print_message "Comandos útiles:" echo -e " ${BLUE}Estado del servicio:${NC} sudo systemctl status listmonk" echo -e " ${BLUE}Reiniciar servicio:${NC} sudo systemctl restart listmonk" echo -e " ${BLUE}Ver logs:${NC} sudo journalctl -u listmonk -f" echo print_warning "¡Guarda estas credenciales en un lugar seguro!" print_warning "Se recomienda cambiar la contraseña del admin desde la interfaz web" # Guardar credenciales in archivo cat > /root/listmonk-credentials.txt << EOF === Credenciales de Listmonk === URL: http://$(hostname -I | awk '{print $1}'):9000 Usuario admin: admin Contraseña admin: $LISTMONK_PASSWORD Base de datos PostgreSQL: Usuario: listmonk Contraseña: $DB_PASSWORD Base de datos: listmonk Fecha de instalación: $(date) EOF print_message "Credenciales guardadas en: /root/listmonk-credentials.txt"