167 lines
4.6 KiB
Bash
167 lines
4.6 KiB
Bash
#!/bin/bash
|
|
|
|
set -e
|
|
|
|
# ========= CONFIGURACIÓN =========
|
|
APP_NAME="rss"
|
|
APP_DIR="$(cd "$(dirname "$0")" && pwd)" # SIEMPRE el directorio del script
|
|
PYTHON_ENV="$APP_DIR/venv"
|
|
SERVICE_FILE="/etc/systemd/system/$APP_NAME.service"
|
|
FLASK_FILE="app.py"
|
|
|
|
DB_NAME="rss"
|
|
DB_USER="rss"
|
|
DB_PASS="x"
|
|
|
|
# ========= INSTALAR POSTGRESQL (ÚLTIMA VERSIÓN RECOMENDADA) =========
|
|
echo "🟢 Instalando PostgreSQL (repositorio oficial)..."
|
|
sudo apt update
|
|
sudo apt install -y wget ca-certificates
|
|
|
|
# Añade el repositorio oficial de PostgreSQL (ajusta para tu distro si hace falta)
|
|
echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
|
|
wget -qO - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
|
|
sudo apt update
|
|
sudo apt install -y postgresql postgresql-contrib
|
|
|
|
# ========= CAMBIAR AUTENTICACIÓN DE peer A md5 =========
|
|
PG_HBA=$(find /etc/postgresql -name pg_hba.conf | head -1)
|
|
if grep -q "local\s\+all\s\+all\s\+peer" "$PG_HBA"; then
|
|
echo "📝 Ajustando pg_hba.conf para autenticación md5 (contraseña)..."
|
|
sudo sed -i 's/local\s\+all\s\+all\s\+peer/local all all md5/' "$PG_HBA"
|
|
sudo systemctl restart postgresql
|
|
else
|
|
echo "✅ pg_hba.conf ya configurado para md5."
|
|
fi
|
|
|
|
# ========= CONFIGURAR BASE DE DATOS Y USUARIO =========
|
|
echo "🛠️ Configurando PostgreSQL: usuario y base de datos..."
|
|
|
|
sudo -u postgres psql <<EOF
|
|
DO \$\$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT FROM pg_catalog.pg_user WHERE usename = '$DB_USER'
|
|
) THEN
|
|
CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';
|
|
END IF;
|
|
END
|
|
\$\$;
|
|
|
|
CREATE DATABASE $DB_NAME OWNER $DB_USER;
|
|
GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;
|
|
EOF
|
|
|
|
# ========= CREAR TABLAS =========
|
|
echo "📐 Creando tablas en PostgreSQL..."
|
|
|
|
export PGPASSWORD="$DB_PASS"
|
|
psql -U "$DB_USER" -h localhost -d "$DB_NAME" <<EOF
|
|
CREATE TABLE IF NOT EXISTS continentes (
|
|
id SERIAL PRIMARY KEY,
|
|
nombre VARCHAR(50) NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS categorias (
|
|
id SERIAL PRIMARY KEY,
|
|
nombre VARCHAR(100) NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS paises (
|
|
id SERIAL PRIMARY KEY,
|
|
nombre VARCHAR(100) NOT NULL,
|
|
continente_id INTEGER REFERENCES continentes(id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS feeds (
|
|
id SERIAL PRIMARY KEY,
|
|
nombre VARCHAR(255),
|
|
descripcion TEXT,
|
|
url TEXT NOT NULL,
|
|
categoria_id INTEGER REFERENCES categorias(id),
|
|
pais_id INTEGER REFERENCES paises(id),
|
|
idioma CHAR(2),
|
|
activo BOOLEAN DEFAULT TRUE,
|
|
fallos INTEGER DEFAULT 0,
|
|
CONSTRAINT feeds_idioma_chk CHECK (idioma ~* '^[a-z]{2}$' OR idioma IS NULL)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS noticias (
|
|
id VARCHAR(32) PRIMARY KEY,
|
|
titulo TEXT,
|
|
resumen TEXT,
|
|
url TEXT,
|
|
fecha TIMESTAMP,
|
|
imagen_url TEXT,
|
|
categoria_id INTEGER REFERENCES categorias(id),
|
|
pais_id INTEGER REFERENCES paises(id)
|
|
);
|
|
EOF
|
|
|
|
echo "✅ Tablas creadas/verificadas correctamente."
|
|
|
|
# ========= DATOS INICIALES =========
|
|
|
|
# Continentes
|
|
if [ -f "$APP_DIR/continentes.sql" ]; then
|
|
echo "🌎 Insertando continentes..."
|
|
psql -U "$DB_USER" -h localhost -d "$DB_NAME" -f "$APP_DIR/continentes.sql"
|
|
else
|
|
echo "⚠️ No se encontró $APP_DIR/continentes.sql"
|
|
fi
|
|
|
|
# Países
|
|
if [ -f "$APP_DIR/paises.sql" ]; then
|
|
echo "🌐 Insertando países..."
|
|
psql -U "$DB_USER" -h localhost -d "$DB_NAME" -f "$APP_DIR/paises.sql"
|
|
else
|
|
echo "⚠️ No se encontró $APP_DIR/paises.sql"
|
|
fi
|
|
|
|
# Categorías
|
|
if [ -f "$APP_DIR/categorias.sql" ]; then
|
|
echo "🏷️ Insertando categorías estándar..."
|
|
psql -U "$DB_USER" -h localhost -d "$DB_NAME" -f "$APP_DIR/categorias.sql"
|
|
else
|
|
echo "⚠️ No se encontró $APP_DIR/categorias.sql"
|
|
fi
|
|
|
|
# ========= ENTORNO PYTHON =========
|
|
echo "🌀 Creando entorno virtual en $PYTHON_ENV"
|
|
python3 -m venv "$PYTHON_ENV"
|
|
|
|
echo "📦 Instalando dependencias"
|
|
source "$PYTHON_ENV/bin/activate"
|
|
pip install --upgrade pip
|
|
pip install -r "$APP_DIR/requirements.txt"
|
|
deactivate
|
|
|
|
# ========= SYSTEMD SERVICE =========
|
|
echo "⚙️ Creando servicio systemd: $SERVICE_FILE"
|
|
sudo tee "$SERVICE_FILE" > /dev/null <<EOF
|
|
[Unit]
|
|
Description=RSS Flask App
|
|
After=network.target
|
|
|
|
[Service]
|
|
User=$USER
|
|
WorkingDirectory=$APP_DIR
|
|
ExecStart=$PYTHON_ENV/bin/python $FLASK_FILE
|
|
Restart=always
|
|
Environment=PYTHONUNBUFFERED=1
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
# ========= ACTIVAR SERVICIO =========
|
|
echo "🔁 Recargando systemd y activando servicio"
|
|
sudo systemctl daemon-reexec
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable "$APP_NAME"
|
|
sudo systemctl restart "$APP_NAME"
|
|
|
|
# ========= ESTADO =========
|
|
echo "✅ Servicio '$APP_NAME' instalado y funcionando."
|
|
echo "👉 Revisa con: systemctl status $APP_NAME"
|
|
|