Saltar a contenido

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:

  1. Registrar dominio empresarial en proveedor (ej. Namecheap, GoDaddy, Hostinger). Ejemplo: erp.tuempresa.com.do.
  2. Configurar registros DNS apuntando al VPS:
Tipo  Nombre  Valor              TTL
A     erp     76.13.100.236      300
A     www.erp 76.13.100.236      300
  1. Esperar propagación DNS (de 5 minutos a 24 horas):
dig +short erp.tuempresa.com.do
nslookup erp.tuempresa.com.do 8.8.8.8
  1. 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).