WSL2 permite desarrollar aplicaciones backend completas desde un entorno Linux real sobre Windows, facilitando el uso de tecnologías como Node.js, Express, PostgreSQL y herramientas modernas de frontend como React o Vue. Este caso real describe paso a paso cómo montar un entorno fullstack funcional, productivo y reproducible usando WSL2, PostgreSQL y herramientas de desarrollo frontend y backend.
Objetivo
Construir y ejecutar una API REST con Express y PostgreSQL desde WSL2, accesible desde Windows y conectada a un cliente frontend moderno (React). Todo funcionando de forma local, con persistencia y debugging habilitado.
Paso 1: Preparar entorno base en WSL2
Crear proyecto y entorno de trabajo
mkdir ~/proyectos/fullstack-wsl2
cd ~/proyectos/fullstack-wsl2
Instalar dependencias comunes:
sudo apt update
sudo apt install -y nodejs npm postgresql postgresql-contrib
Verificar PostgreSQL:
psql --version
Verificar Node.js:
node -v
npm -v
Paso 2: Configurar base de datos PostgreSQL
Crear base de datos y usuario
sudo -u postgres psql
Dentro de PostgreSQL:
CREATE DATABASE fullstack_dev;
CREATE USER devuser WITH PASSWORD 'clave123';
GRANT ALL PRIVILEGES ON DATABASE fullstack_dev TO devuser;
Salir con \q
.
Paso 3: Crear backend con Node.js y Express
mkdir backend
cd backend
npm init -y
npm install express pg dotenv
Crear archivo .env
:
PORT=5000
DB_USER=devuser
DB_PASSWORD=clave123
DB_HOST=localhost
DB_PORT=5432
DB_NAME=fullstack_dev
Crear index.js
:
const express = require('express');
const { Pool } = require('pg');
require('dotenv').config();
const app = express();
const port = process.env.PORT;
const pool = new Pool({
user: process.env.DB_USER,
host: process.env.DB_HOST,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
port: process.env.DB_PORT
});
app.use(express.json());
app.get('/api/usuarios', async (req, res) => {
const result = await pool.query('SELECT NOW()');
res.json(result.rows);
});
app.listen(port, () => console.log(`Servidor corriendo en http://localhost:${port}`));
Ejecutar backend:
node index.js
Probar desde navegador o curl
:
curl http://localhost:5000/api/usuarios
Paso 4: Crear cliente frontend (React)
Desde el directorio raíz:
npx create-react-app frontend
cd frontend
Modificar package.json
:
"proxy": "http://localhost:5000"
Crear componente para consumir la API:
import React, { useEffect, useState } from "react";
function App() {
const [hora, setHora] = useState("");
useEffect(() => {
fetch("/api/usuarios")
.then((res) => res.json())
.then((data) => setHora(data[0].now));
}, []);
return <div>Hora desde PostgreSQL: {hora}</div>;
}
export default App;
Ejecutar:
npm start
Acceder desde navegador a http://localhost:3000
para ver la integración.
Paso 5: Acceso desde Windows
Tanto el backend (puerto 5000) como el frontend (puerto 3000) son accesibles desde navegador en Windows gracias al reenvío automático de puertos WSL2.
Verificar:
curl http://localhost:5000/api/usuarios
start http://localhost:3000
Buenas prácticas
- Separar entorno de desarrollo y producción con variables de entorno
- Versionar código en Git desde WSL2 o integrado a GitHub
- Usar
nodemon
para hot-reload del backend - Crear scripts de inicio en
package.json
para automatización - Agregar middleware de CORS si frontend se ejecuta desde origen distinto
Conclusión
WSL2 permite desarrollar aplicaciones fullstack modernas combinando tecnologías de backend y frontend con base de datos PostgreSQL de manera fluida. Todo el entorno corre desde Linux real dentro de Windows, lo que permite depurar, escalar y trabajar colaborativamente sin comprometer el rendimiento ni la experiencia de desarrollo.
Ver también
- Construcción de un asistente contextual para escritorio usando IA local con acceso al sistema
- Integración de inferencia local ONNX con Windows ML en apps modernas
- Integración con servicios locales vía App Services y extensión de funcionalidades entre apps
- Implementación de Background Tasks persistentes en apps modernas
- Empaquetado de apps modernas con MSIX y configuración avanzada del manifiesto