Instalación y Configuración

Instalación y Configuración del Sistema DTEM

Requisitos Previos

Antes de comenzar la instalación, asegúrese de cumplir con los siguientes prerrequisitos:

Requisitos de Hardware

  • CPU: Mínimo 4 cores, recomendado 8 cores
  • RAM: Mínimo 8GB, recomendado 16GB
  • Almacenamiento: Mínimo 100GB SSD, recomendado 500GB SSD
  • Red: Conexión a internet estable

Requisitos de Software

  • Sistema Operativo:
    • Ubuntu 20.04+ o CentOS 8+ (recomendado)
    • Windows Server 2019+ (alternativa)
  • Java: OpenJDK 11+ o Oracle JDK 11+
  • Node.js: 18+ LTS
  • PostgreSQL: 13+
  • Redis: 6+
  • Docker: 20.10+ (opcional pero recomendado)

Métodos de Instalación

Método 1: Instalación con Docker (Recomendado)

Paso 1: Instalar Docker y Docker Compose

# Ubuntu/Debian
sudo apt update
sudo apt install docker.io docker-compose -y
sudo systemctl enable docker
sudo usermod -aG docker $USER

# CentOS/RHEL
sudo yum install docker docker-compose -y
sudo systemctl enable docker
sudo usermod -aG docker $USER

Paso 2: Descargar los archivos de configuración

# Clonar el repositorio
git clone https://github.com/csc-chile/dtem-docker.git
cd dtem-docker

# O descargar el archivo comprimido
wget https://releases.csc-chile.com/dtem/latest/dtem-docker.tar.gz
tar -xzf dtem-docker.tar.gz
cd dtem-docker

Paso 3: Configurar variables de entorno

# Copiar archivo de configuración
cp .env.example .env

# Editar configuración
nano .env

Archivo .env de ejemplo:

# Configuración de Base de Datos
POSTGRES_DB=dtem
POSTGRES_USER=dtem_user
POSTGRES_PASSWORD=your_secure_password
POSTGRES_HOST=postgres
POSTGRES_PORT=5432

# Configuración de Redis
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=your_redis_password

# Configuración de la Aplicación
DTEM_ENV=production
DTEM_PORT=8080
DTEM_HOST=0.0.0.0

# Configuración de Seguridad
JWT_SECRET=your_jwt_secret_key
ENCRYPTION_KEY=your_encryption_key

# Configuración SII
SII_ENV=production
SII_CERT_PATH=/app/certificates/sii_cert.p12
SII_CERT_PASSWORD=your_cert_password

# Configuración de Email
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your_email@gmail.com
SMTP_PASSWORD=your_app_password

Paso 4: Iniciar los servicios

# Construir y levantar los contenedores
docker-compose up -d

# Verificar el estado
docker-compose ps

# Ver logs
docker-compose logs -f

Paso 5: Inicializar la base de datos

# Ejecutar migraciones
docker-compose exec app npm run migrate

# Cargar datos iniciales
docker-compose exec app npm run seed

Método 2: Instalación Manual

Paso 1: Instalar Java

# Ubuntu/Debian
sudo apt update
sudo apt install openjdk-11-jdk -y

# CentOS/RHEL
sudo yum install java-11-openjdk-devel -y

# Verificar instalación
java -version
javac -version

Paso 2: Instalar Node.js

# Usando NodeSource
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs

# Verificar instalación
node --version
npm --version

Paso 3: Instalar PostgreSQL

# Ubuntu/Debian
sudo apt install postgresql postgresql-contrib -y
sudo systemctl enable postgresql
sudo systemctl start postgresql

# Crear base de datos y usuario
sudo -u postgres psql
CREATE DATABASE dtem;
CREATE USER dtem_user WITH PASSWORD 'your_secure_password';
GRANT ALL PRIVILEGES ON DATABASE dtem TO dtem_user;
\q

Paso 4: Instalar Redis

# Ubuntu/Debian
sudo apt install redis-server -y
sudo systemctl enable redis-server
sudo systemctl start redis-server

# Configurar contraseña (opcional)
sudo nano /etc/redis/redis.conf
# Descomentar y configurar: requirepass your_redis_password
sudo systemctl restart redis-server

Paso 5: Descargar y Configurar DTEM

# Descargar aplicación
wget https://releases.csc-chile.com/dtem/latest/dtem-app.tar.gz
tar -xzf dtem-app.tar.gz
cd dtem-app

# Instalar dependencias
npm install --production

# Configurar aplicación
cp config/config.example.json config/config.json
nano config/config.json

Archivo config/config.json:

{
  "database": {
    "host": "localhost",
    "port": 5432,
    "database": "dtem",
    "username": "dtem_user",
    "password": "your_secure_password",
    "ssl": false,
    "pool": {
      "min": 2,
      "max": 10
    }
  },
  "redis": {
    "host": "localhost",
    "port": 6379,
    "password": "your_redis_password",
    "db": 0
  },
  "server": {
    "port": 8080,
    "host": "0.0.0.0",
    "cors": {
      "origin": ["http://localhost:3000"],
      "credentials": true
    }
  },
  "security": {
    "jwtSecret": "your_jwt_secret_key",
    "jwtExpiration": "24h",
    "encryptionKey": "your_encryption_key"
  },
  "sii": {
    "environment": "production",
    "certPath": "/app/certificates/sii_cert.p12",
    "certPassword": "your_cert_password",
    "apiUrl": "https://palena.sii.cl"
  },
  "email": {
    "smtp": {
      "host": "smtp.gmail.com",
      "port": 587,
      "secure": false,
      "auth": {
        "user": "your_email@gmail.com",
        "pass": "your_app_password"
      }
    }
  },
  "logging": {
    "level": "info",
    "file": "/app/logs/dtem.log",
    "maxSize": "10m",
    "maxFiles": 5
  }
}

Paso 6: Configurar Certificados Digitales

# Crear directorio para certificados
sudo mkdir -p /app/certificates
sudo chown $USER:$USER /app/certificates

# Copiar certificado del SII
cp /path/to/your/sii_cert.p12 /app/certificates/
chmod 600 /app/certificates/sii_cert.p12

Paso 7: Inicializar Base de Datos

# Ejecutar migraciones
npm run migrate

# Cargar datos iniciales
npm run seed

Paso 8: Iniciar la Aplicación

# En desarrollo
npm run dev

# En producción
npm run build
npm start

Configuración del Servidor Web

Nginx Configuration

# /etc/nginx/sites-available/dtem
server {
    listen 80;
    server_name your-domain.com;
    
    # Redirección a HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name your-domain.com;
    
    # Configuración SSL
    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/private.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
    ssl_prefer_server_ciphers off;
    
    # Headers de seguridad
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
    
    # Límites de tamaño
    client_max_body_size 50M;
    
    # Proxy a la aplicación
    location /api/ {
        proxy_pass http://localhost:8080/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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_cache_bypass $http_upgrade;
        proxy_read_timeout 300s;
        proxy_connect_timeout 75s;
    }
    
    # Archivos estáticos
    location / {
        root /var/www/dtem/dist;
        try_files $uri $uri/ /index.html;
        
        # Cache para archivos estáticos
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
            expires 1y;
            add_header Cache-Control "public, immutable";
        }
    }
    
    # Logs
    access_log /var/log/nginx/dtem_access.log;
    error_log /var/log/nginx/dtem_error.log;
}

Apache Configuration

# /etc/apache2/sites-available/dtem.conf
<VirtualHost *:80>
    ServerName your-domain.com
    Redirect permanent / https://your-domain.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName your-domain.com
    
    # Configuración SSL
    SSLEngine on
    SSLCertificateFile /path/to/your/certificate.crt
    SSLCertificateKeyFile /path/to/your/private.key
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
    
    # Headers de seguridad
    Header always set X-Frame-Options DENY
    Header always set X-Content-Type-Options nosniff
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
    
    # Proxy a la aplicación
    ProxyPreserveHost On
    ProxyPass /api/ http://localhost:8080/
    ProxyPassReverse /api/ http://localhost:8080/
    
    # Archivos estáticos
    DocumentRoot /var/www/dtem/dist
    <Directory /var/www/dtem/dist>
        AllowOverride All
        Require all granted
    </Directory>
    
    # Logs
    ErrorLog ${APACHE_LOG_DIR}/dtem_error.log
    CustomLog ${APACHE_LOG_DIR}/dtem_access.log combined
</VirtualHost>

Verificación de la Instalación

1. Verificar Servicios

# Verificar que los servicios estén corriendo
systemctl status postgresql
systemctl status redis-server
systemctl status nginx

# Verificar puertos
netstat -tlnp | grep -E ':(80|443|5432|6379|8080)'

2. Probar Conexión a Base de Datos

# Conectar a PostgreSQL
psql -h localhost -U dtem_user -d dtem -c "SELECT version();"

3. Probar API

# Health check
curl -X GET http://localhost:8080/api/health

# Verificar respuesta
# {"status": "ok", "timestamp": "2023-01-01T00:00:00.000Z"}

4. Acceder a la Aplicación

Abrir navegador y acceder a:

  • URL: https://your-domain.com
  • Usuario por defecto: admin
  • Contraseña por defecto: admin123

Configuración Post-Instalación

1. Configurar Backup Automático

# Crear script de backup
sudo nano /usr/local/bin/backup-dtem.sh
#!/bin/bash
BACKUP_DIR="/backup/dtem"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="dtem"
DB_USER="dtem_user"

# Crear directorio de backup
mkdir -p $BACKUP_DIR

# Backup de base de datos
pg_dump -h localhost -U $DB_USER $DB_NAME > $BACKUP_DIR/db_backup_$DATE.sql

# Backup de archivos
tar -czf $BACKUP_DIR/files_backup_$DATE.tar.gz /app/certificates /app/logs

# Eliminar backups antiguos (más de 7 días)
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
# Hacer ejecutable
sudo chmod +x /usr/local/bin/backup-dtem.sh

# Agregar a crontab (diario a las 2 AM)
sudo crontab -e
# Agregar línea: 0 2 * * * /usr/local/bin/backup-dtem.sh

2. Configurar Monitoreo

# Instalar Prometheus (opcional)
docker run -d \
  --name prometheus \
  -p 9090:9090 \
  -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

3. Configurar Logs Rotación

# Crear configuración de logrotate
sudo nano /etc/logrotate.d/dtem
/app/logs/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 644 dtem dtem
    postrotate
        systemctl reload dtem
    endscript
}

Solución de Problemas Comunes

Problema: La aplicación no inicia

Causas posibles:

  • Puerto 8080 en uso
  • Permisos incorrectos
  • Configuración de base de datos incorrecta

Solución:

# Verificar puerto
sudo netstat -tlnp | grep 8080

# Verificar logs
tail -f /app/logs/dtem.log

# Verificar configuración
node -e "console.log(JSON.stringify(require('./config/config.json'), null, 2))"

Problema: Error de conexión a base de datos

Causas posibles:

  • Servicio PostgreSQL no iniciado
  • Credenciales incorrectas
  • Firewall bloqueando conexión

Solución:

# Verificar servicio
sudo systemctl status postgresql

# Probar conexión
psql -h localhost -U dtem_user -d dtem

# Verificar firewall
sudo ufw status

Próxima sección: Infraestructura y Despliegue