1. Preparación de infraestructura¶
1.1. Dominio FQDN y DNS¶
Por qué: DGII rechaza URLs sobre IP raw o HTTP plano en ambiente producción. Requiere FQDN público + TLS válido para registrar los endpoints en el portal de postulación.
Pasos:
- Registrar dominio empresarial en proveedor (ej. Namecheap, GoDaddy, Hostinger). Ejemplo:
erp.tuempresa.com.do. - Configurar registros DNS apuntando al VPS:
- Esperar propagación DNS (de 5 minutos a 24 horas):
- Buena práctica: registrar también un subdominio dedicado para los endpoints DGII (
ecf.tuempresa.com.do) para separar tráfico fiscal del comercial. Esto permite políticas de firewall y rate-limit independientes.
1.2. Certificado TLS con Let's Encrypt + Nginx¶
Pre-requisito: Nginx instalado, dominio propagado, puerto 80 y 443 abiertos en VPS.
# Instalar Nginx
apt update && apt install -y nginx
# Instalar Certbot con plugin Nginx
apt install -y certbot python3-certbot-nginx
# Configuración mínima de servidor virtual en Nginx
nano /etc/nginx/sites-available/erp
Contenido mínimo:
server {
listen 80;
server_name erp.tuempresa.com.do;
client_max_body_size 25M;
location /static/ { alias /opt/tienda/staticfiles/; }
location /media/ { alias /opt/tienda/media/; }
location / {
proxy_pass http://127.0.0.1:8000;
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;
}
location /ws/ {
proxy_pass http://127.0.0.1:8002;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
Activar y emitir certificado:
ln -s /etc/nginx/sites-available/erp /etc/nginx/sites-enabled/erp
nginx -t && systemctl reload nginx
# Emitir certificado (modificará el server block automáticamente)
certbot --nginx -d erp.tuempresa.com.do -d www.erp.tuempresa.com.do \
--agree-tos --email admin@tuempresa.com.do --redirect
# Verificar renovación automática
systemctl status certbot.timer
certbot renew --dry-run
Buena práctica: agregar a Nginx (dentro del server { listen 443 }) headers de seguridad:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
1.3. Firewall¶
# Habilitar UFW con política por defecto restrictiva
ufw default deny incoming
ufw default allow outgoing
# Solo abrir lo necesario
ufw allow 22/tcp # SSH
ufw allow 80/tcp # HTTP (redirige a HTTPS)
ufw allow 443/tcp # HTTPS
ufw enable
# Verificar
ufw status numbered
Buena práctica: cambiar el puerto SSH del 22 a uno alto (ej. 22222), deshabilitar PasswordAuthentication, exigir clave pública (/etc/ssh/sshd_config).