app-installers/listmonk-installer.sh

324 lines
8.4 KiB
Bash

#!/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"