Cómo configurar SSL gratuito en tu sitio web

D
DanisCh
(Actualizado: ) 13 min de lectura
Cómo configurar SSL gratuito en tu sitio web
Hosting y VPS

Has terminado tu API. Funciona perfectamente en localhost:3000. Ahora necesitas que el mundo pueda acceder a ella — las 24 horas del día, los 7 días de la semana, desde cualquier lugar.

La solución es un VPS (Virtual Private Server): tu propio servidor en la nube con una IP pública, recursos dedicados y control total sobre lo que instalas. A diferencia del hosting compartido, en un VPS tú eres el administrador. Instalas exactamente lo que necesitas, configuras el servidor a tu medida y puedes alojar cualquier tipo de aplicación: APIs REST, aplicaciones Node.js, backends Python, bases de datos, todo al mismo tiempo.

En este tutorial vas a montar un servidor VPS desde cero y dejar tu API corriendo en producción con dominio propio y HTTPS. Sin atajos — paso a paso, con los comandos exactos.


¿Qué vas a conseguir al terminar este tutorial?

✅ VPS corriendo con Ubuntu 24.04 LTS
✅ Acceso SSH seguro con clave pública (sin contraseñas)
✅ Firewall configurado correctamente
✅ Tu API (Node.js o Python) corriendo en segundo plano con PM2
✅ Nginx como proxy inverso (puerto 80/443 → tu API)
✅ Certificado SSL gratuito con Let's Encrypt (HTTPS)
✅ Dominio apuntando al servidor
✅ La API accesible desde https://api.tudominio.com

Tiempo estimado: 45-60 minutos la primera vez. La segunda vez lo harás en 15.


¿Qué VPS elegir? Las dos mejores opciones para developers

🔵 DigitalOcean — el favorito de los desarrolladores

DigitalOcean es la referencia en VPS para desarrolladores. Interfaz limpia, documentación excepcional, snapshots, backups automáticos y una comunidad enorme. Sus servidores se llaman Droplets. El plan más pequeño (1 vCPU, 1 GB RAM, 25 GB SSD) es suficiente para empezar y cuesta $6/mes.

⚡ Crear VPS en DigitalOcean 

🟣 Hostinger VPS — la opción más económica

Si buscas la mejor relación calidad-precio, el VPS de Hostinger arranca desde $4.99/mes con 1 vCPU y 4 GB de RAM — el doble de RAM que DigitalOcean por menos precio. Incluye panel de control propio y soporte 24/7 en español.

🟣 Crear VPS en Hostinger 

En este tutorial usamos DigitalOcean como referencia, pero los comandos son exactamente los mismos en cualquier VPS con Ubuntu.


Paso 1: Crea tu VPS

En DigitalOcean

  1. Regístrate o inicia sesión en DigitalOcean
  2. Haz clic en Create → Droplets
  3. Elige la región más cercana a tus usuarios (Ámsterdam o Nueva York para LatAm)
  4. Sistema operativo: Ubuntu 24.04 LTS (la más estable y soportada)
  5. Plan: Basic — Regular — $6/mes (1 vCPU, 1 GB RAM) para empezar
  6. Autenticación: elige SSH Key (más seguro que contraseña — lo configuramos ahora)
  7. Haz clic en Create Droplet

Tras unos segundos tendrás tu servidor con una IP pública. Anótala — la usaremos en todos los pasos siguientes.

 

En Hostinger

  1. Entra en tu cuenta de Hostinger
  2. Ve a VPS → Contratar VPS
  3. Selecciona el plan KVM 1 (el más económico para empezar)
  4. Elige Ubuntu 24.04 como sistema operativo
  5. Selecciona la región más cercana a tus usuarios
  6. Completa la compra — recibirás la IP y contraseña root por email

Paso 2: Conéctate al servidor por SSH

SSH (Secure Shell) es el protocolo con el que controlas el servidor de forma remota desde tu terminal. Es como tener un teclado conectado directamente al servidor aunque esté a miles de kilómetros.

Generar tu clave SSH (si no tienes)

# En tu computadora local (Mac/Linux/Windows con WSL)
ssh-keygen -t ed25519 -C "tu@email.com"

# Presiona Enter para aceptar la ubicación por defecto
# Pon una passphrase (contraseña) si quieres seguridad extra

# Ver tu clave pública (la que subirás a DigitalOcean/Hostinger)
cat ~/.ssh/id_ed25519.pub
# Copia todo el contenido — empieza con "ssh-ed25519 AAAA..."

Pega esa clave pública en el campo SSH Key al crear el Droplet en DigitalOcean, o en el panel de Hostinger VPS → SSH Keys.

Conectarse al servidor

# Sustituye 123.456.789.0 por la IP real de tu servidor
ssh root@123.456.789.0

# Si usas contraseña (Hostinger):
ssh root@123.456.789.0
# Escribe la contraseña root que te enviaron por email

# Primera vez: te pedirá confirmar la huella del servidor
# Escribe "yes" y presiona Enter

# Si todo va bien verás algo así:
# Welcome to Ubuntu 24.04.1 LTS (GNU/Linux 6.8.0 x86_64)
# root@ubuntu-s-1vcpu-1gb:~#  ← estás dentro del servidor

 


Paso 3: Configuración inicial del servidor

Nunca trabajes directamente con el usuario root en producción. El primer paso es crear un usuario con privilegios sudo y configurar el firewall.

# Actualizar todos los paquetes del sistema
apt update && apt upgrade -y

# Crear un usuario nuevo (sustituye "deploy" por el nombre que prefieras)
adduser deploy

# Darle privilegios de administrador (sudo)
usermod -aG sudo deploy

# Copiar las claves SSH del root al nuevo usuario
# (así puedes conectarte con el nuevo usuario usando tu clave SSH)
rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy

# Verificar que funciona — desde tu computadora local:
# ssh deploy@123.456.789.0
# Si entras sin contraseña → perfecto ✅

Configurar el firewall (UFW)

# UFW (Uncomplicated Firewall) — el firewall de Ubuntu

# Permitir SSH (IMPORTANTE: hazlo antes de activar el firewall
# o te quedarás sin acceso al servidor)
ufw allow OpenSSH

# Permitir tráfico web HTTP y HTTPS
ufw allow 80
ufw allow 443

# Activar el firewall
ufw enable
# Escribe "y" para confirmar

# Verificar el estado
ufw status
# Debería mostrar:
# 22/tcp (OpenSSH)  ALLOW
# 80/tcp            ALLOW
# 443/tcp           ALLOW

⚠️ Importante: Si cierras la sesión SSH ahora, no cierres el puerto 22. Es el puerto por donde te conectas. Sin él, perderías el acceso al servidor.


Paso 4: Instala las dependencias según tu stack

Desde aquí el proceso varía según si tu API está en Node.js o en Python. Sigue la sección que corresponda.

Opción A: API con Node.js / Express

# Instalar Node.js 22 LTS (la versión más reciente estable)
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
apt install -y nodejs

# Verificar versiones instaladas
node --version   # v22.x.x
npm --version    # 10.x.x

# Instalar PM2 globalmente — el gestor de procesos para Node.js en producción
npm install -g pm2

# Verificar PM2
pm2 --version

Opción B: API con Python / FastAPI / Flask

# Python 3.12 ya viene instalado en Ubuntu 24.04
python3 --version   # Python 3.12.x

# Instalar pip y venv
apt install -y python3-pip python3-venv

# Instalar uvicorn globalmente (para FastAPI)
pip3 install uvicorn gunicorn

# O instalar las dependencias de tu proyecto en un entorno virtual
# (lo haremos en el siguiente paso)

Paso 5: Sube tu API al servidor

Opción A: Clonar desde GitHub (recomendado)

# Instalar Git si no está instalado
apt install -y git

# Clonar tu repositorio
cd /var/www
git clone https://github.com/tu-usuario/tu-api.git
cd tu-api

# Para Node.js: instalar dependencias
npm install --production

# Para Python: crear entorno virtual e instalar dependencias
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

Opción B: Subir archivos por SCP desde tu computadora

# Desde tu computadora local (no desde el servidor)
scp -r ./mi-api deploy@123.456.789.0:/var/www/mi-api

# O usar rsync para sincronizar solo los cambios (más eficiente)
rsync -avz --exclude node_modules --exclude .env \
  ./mi-api/ deploy@123.456.789.0:/var/www/mi-api/

Variables de entorno

# Crea el archivo .env en el servidor (nunca lo subas a GitHub)
nano /var/www/tu-api/.env

# Añade tus variables:
NODE_ENV=production
PORT=3000
DATABASE_URL=postgresql://usuario:password@localhost:5432/mi_bd
JWT_SECRET=tu-secreto-muy-largo-y-aleatorio
API_KEY=tu-api-key

# Guarda con Ctrl+X → Y → Enter

Paso 6: Ejecuta tu API con PM2

PM2 es el gestor de procesos estándar para aplicaciones Node.js en producción. Mantiene tu API corriendo en segundo plano, la reinicia automáticamente si falla y la inicia al arrancar el servidor.

Para Node.js

cd /var/www/tu-api

# Iniciar la aplicación con PM2
pm2 start src/index.js --name "mi-api"

# O si usas npm start:
pm2 start npm --name "mi-api" -- start

# Ver el estado
pm2 status
# Debería mostrar tu app con status "online" en verde

# Ver los logs en tiempo real
pm2 logs mi-api

# Configurar PM2 para que arranque con el sistema
pm2 startup
# Copia y ejecuta el comando que te muestra
pm2 save

Para Python / FastAPI

cd /var/www/tu-api # Iniciar con uvicorn en modo producción pm2 start "uvicorn main:app --host 0.0.0.0 --port 8000" --name "mi-api-python" # O con gunicorn para más rendimiento: pm2 start "gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app \  --bind 0.0.0.0:8000" --name "mi-api-python" # Ver estado pm2 status pm2 logs mi-api-python # Configurar inicio automático pm2 startup pm2 save

Verificar que la API responde internamente

# Desde dentro del servidor (sin Nginx todavía)
curl http://localhost:3000/api/health
# o
curl http://localhost:8000/health

# Si ves la respuesta de tu API → todo bien ✅
# Si da error → revisa los logs: pm2 logs mi-api

Paso 7: Configura Nginx como proxy inverso

Nginx recibe las peticiones en los puertos 80 (HTTP) y 443 (HTTPS) y las redirige internamente a tu API en el puerto 3000 o 8000. Así los usuarios llaman a https://api.tudominio.com y Nginx las envía a localhost:3000.

# Instalar Nginx
apt install -y nginx

# Verificar que está corriendo
systemctl status nginx
# Debería mostrar "active (running)"

# Abrir en el navegador: http://123.456.789.0
# Deberías ver la página de bienvenida de Nginx ✅

Crear la configuración del sitio

# Crear el archivo de configuración para tu dominio
nano /etc/nginx/sites-available/api.tudominio.com

Pega esta configuración (ajusta el server_name y el puerto según tu API):

server {
    listen 80;
    server_name api.tudominio.com;

    # Logs
    access_log /var/log/nginx/api.tudominio.com.access.log;
    error_log  /var/log/nginx/api.tudominio.com.error.log;

    location / {
        proxy_pass         http://localhost:3000;  # puerto de tu API
        proxy_http_version 1.1;

        # Headers necesarios para WebSocket y reverse proxy
        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;

        # Timeouts
        proxy_connect_timeout 60s;
        proxy_send_timeout    60s;
        proxy_read_timeout    60s;
    }
}
# Activar el sitio creando un enlace simbólico
ln -s /etc/nginx/sites-available/api.tudominio.com \
      /etc/nginx/sites-enabled/

# Verificar que la configuración es correcta
nginx -t
# Debe mostrar: "syntax is ok" y "test is successful"

# Si hay errores, revísalos y corrígelos antes de continuar

# Recargar Nginx para aplicar los cambios
systemctl reload nginx

Paso 8: Apunta tu dominio al servidor

Para que api.tudominio.com llegue a tu VPS, necesitas añadir un registro A en la configuración DNS de tu dominio.

En el panel DNS de tu registrador (GoDaddy, Namecheap, etc.):

Tipo:   A
Nombre: api           (o @ si quieres usar tudominio.com directamente)
Valor:  123.456.789.0 (la IP de tu VPS)
TTL:    3600 (1 hora)

Si usas DigitalOcean para gestionar el DNS de tu dominio:

# En el panel de DigitalOcean:
# Networking → Domains → tu dominio → Add Record
# Tipo: A
# Hostname: api
# Directs to: (selecciona tu Droplet o escribe la IP)
# TTL: 3600

Espera entre 5 y 30 minutos a que el DNS se propague. Verifica con:

nslookup api.tudominio.com
# Debería devolver la IP de tu VPS

Paso 9: Instala SSL gratuito con Let's Encrypt

El certificado SSL convierte tu API de http:// a https://. Es gratuito con Let's Encrypt y se renueva automáticamente cada 90 días.

# Instalar Certbot
apt install -y certbot python3-certbot-nginx

# Obtener el certificado SSL para tu dominio
certbot --nginx -d api.tudominio.com

# Certbot te pedirá:
# - Tu email (para avisos de renovación)
# - Aceptar los términos de servicio → A
# - Si quieres recibir el boletín de EFF → N (opcional)

# Certbot:
# 1. Verifica que el dominio apunta a tu servidor
# 2. Obtiene el certificado de Let's Encrypt
# 3. Modifica automáticamente la configuración de Nginx para HTTPS
# 4. Configura la renovación automática

# Verificar la renovación automática
certbot renew --dry-run
# Debe mostrar "Congratulations, all renewals succeeded"

Una vez completado, abre en el navegador: https://api.tudominio.com

Si ves la respuesta JSON de tu API con el candado verde de HTTPS → 🎉 ¡Tu API está en producción!


Comandos esenciales del día a día

# ── PM2 — gestión de tu aplicación ──────────────────────────
pm2 status              # ver estado de todos los procesos
pm2 logs mi-api         # ver logs en tiempo real
pm2 logs mi-api --lines 100  # últimas 100 líneas de logs
pm2 restart mi-api      # reiniciar la aplicación
pm2 stop mi-api         # parar la aplicación
pm2 delete mi-api       # eliminar el proceso de PM2
pm2 monit               # monitor en tiempo real (CPU, RAM, logs)

# ── Nginx ────────────────────────────────────────────────────
nginx -t                          # verificar configuración
systemctl reload nginx            # recargar sin downtime
systemctl restart nginx           # reiniciar completamente
systemctl status nginx            # ver estado
tail -f /var/log/nginx/error.log  # ver errores en tiempo real

# ── Actualizar tu API desde GitHub ───────────────────────────
cd /var/www/tu-api
git pull origin main
npm install --production   # si añadiste dependencias
pm2 restart mi-api

# ── Sistema ──────────────────────────────────────────────────
htop                      # monitor de recursos (CPU, RAM)
df -h                     # espacio en disco
free -h                   # memoria disponible
uptime                    # tiempo encendido y carga del servidor

Seguridad básica adicional

# 1. Deshabilitar el login de root por SSH
nano /etc/ssh/sshd_config

# Busca y modifica estas líneas:
PermitRootLogin no         # deshabilita login como root
PasswordAuthentication no  # solo claves SSH, sin contraseñas

# Reiniciar SSH para aplicar
systemctl restart sshd

# 2. Actualizaciones automáticas de seguridad
apt install -y unattended-upgrades
dpkg-reconfigure --priority=low unattended-upgrades
# Selecciona "Yes"

# 3. Fail2ban — bloquea IPs que intentan ataques de fuerza bruta
apt install -y fail2ban
systemctl enable fail2ban
systemctl start fail2ban

¿Cuándo necesitas un plan mayor?

Plan básico (1 vCPU, 1 GB RAM) — suficiente para:
  ✅ APIs con < 100 peticiones/minuto
  ✅ Proyectos personales y portfolios
  ✅ APIs de prueba y desarrollo
  ✅ 1-2 aplicaciones corriendo simultáneamente

Plan medio (2 vCPU, 4 GB RAM) — cuando necesitas:
  🔶 APIs con tráfico moderado (100-1000 req/min)
  🔶 Base de datos en el mismo servidor (PostgreSQL, MySQL)
  🔶 3-5 aplicaciones simultáneas
  🔶 Procesamiento de imágenes o datos

Plan alto (4+ vCPU, 8+ GB RAM) — cuando necesitas:
  🔴 Alta concurrencia (miles de req/min)
  🔴 Machine Learning o procesamiento intensivo
  🔴 Muchas aplicaciones simultáneas

Tanto DigitalOcean como Hostinger permiten escalar el plan en minutos desde el panel de control sin perder datos.

⚡ Ver planes VPS DigitalOcean 🟣 Ver planes VPS Hostinger 


Resumen: lo que aprendiste hoy

  • ✅ Un VPS te da recursos dedicados y control total — ideal para APIs y aplicaciones web
  • ✅ Ubuntu 24.04 LTS es el sistema operativo recomendado para servidores en 2026
  • ✅ Siempre crea un usuario sin root y desactiva el login de root en SSH
  • ✅ UFW gestiona el firewall — abre solo los puertos 22, 80 y 443
  • ✅ PM2 mantiene tu API corriendo en segundo plano y la reinicia automáticamente
  • ✅ Nginx actúa como proxy inverso — recibe el tráfico y lo redirige a tu API
  • ✅ Let's Encrypt proporciona SSL gratuito con renovación automática
  • ✅ El flujo completo: VPS → SSH → firewall → subir código → PM2 → Nginx → DNS → SSL
  • ✅ DigitalOcean es ideal para developers; Hostinger VPS ofrece más RAM por menos precio

¿Conseguiste dejar tu API corriendo en producción? ¿Qué stack usaste — Node.js o Python? ¿Tuviste algún problema con Nginx o con el SSL? Cuéntanos en los comentarios 👇 — respondemos todos. 🚀

Etiquetas: Hostinger DigitalOcean

¿Te ha gustado esta entrada?

Compártela con tus compañeros para que también sigan aprendiendo.

Comunidad y Comentarios

0 COMENTARIOS

No hay comentarios todavía. Sé el primero en compartir tu opinión.

Escribe tu opinión
Respondiendo a