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
Importante: Cambie la contraseña por defecto inmediatamente después del primer inicio de sesión.
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