Sistema completo de gestión de tienda con backend Express + SQLite.
tienda-pro/
├── server.js # API REST (Express)
├── db.js # Esquema SQLite (better-sqlite3)
├── package.json
├── railway.json # Configuración Railway
├── .env.example # Variables de entorno de ejemplo
├── .gitignore
├── uploads/ # Imágenes subidas (creado automáticamente)
└── public/
├── index.html # Landing con links a los 3 paneles
├── panel-admin.html # Panel de administración
├── tienda-publica.html # Tienda para clientes
└── portal-revendedores.html # Portal con login por KEY
GET /api/config— obtener configuración (whatsapp, store_name)PATCH /api/config— actualizar configuración
GET /api/productos— listar (soporta?publicado=1&search=texto)GET /api/productos/:id— obtener unoPOST /api/productos— crearPUT /api/productos/:id— editarDELETE /api/productos/:id— eliminar
POST /api/productos/:id/imagenes— subir imágenes (multipart/form-data, campoimagenes)DELETE /api/imagenes/:id— eliminar imagen
GET /api/revendedores— listarGET /api/revendedores/by-key/:key— login por KEY únicaPOST /api/revendedores— crearPUT /api/revendedores/:id— editarDELETE /api/revendedores/:id— eliminar
GET /api/compras— listarPOST /api/compras— crearPATCH /api/compras/:id/llego— marcar como llegóDELETE /api/compras/:id— eliminar
GET /api/ventas— listar con itemsPOST /api/ventas— registrar (descuenta stock automáticamente)
GET /api/stats— resumen del dashboard
cd tienda-pro
git init
git add .
git commit -m "Initial commit"- Ve a railway.app → New Project
- Deploy from GitHub repo → selecciona tu repositorio
- Railway detecta automáticamente Node.js con nixpacks
En tu proyecto Railway → Variables → agrega:
| Variable | Valor |
|---|---|
PORT |
(Railway lo pone automáticamente, no hace falta) |
PUBLIC_URL |
La URL de tu app, ej: https://tienda-pro-production.up.railway.app |
NODE_ENV |
production |
PUBLIC_URLes importante para que las URLs de las imágenes sean correctas.
Railway puede reiniciar los contenedores (los archivos locales se borran).
Para datos persistentes necesitas un Volume:
- En tu servicio Railway → Add Volume
- Mount path:
/data - En las variables de entorno agrega:
DB_PATH=/data/tienda.db
- En
server.jsla constanteUPLOADS_DIRtambién debe apuntar a/data/uploads:Y agregaconst UPLOADS_DIR = process.env.UPLOADS_DIR || path.join(__dirname, 'uploads');
UPLOADS_DIR=/data/uploadsen las variables.
Una vez desplegado, Railway te da una URL como:
https://tienda-pro-production.up.railway.app
Esa es tu PUBLIC_URL. Los tres HTML estarán disponibles en:
/→ Landing con links/panel-admin.html→ Panel Admin/tienda-publica.html→ Tienda pública/portal-revendedores.html→ Portal revendedores
# Instalar dependencias
npm install
# Copiar y configurar variables de entorno
cp .env.example .env
# Iniciar servidor
npm start
# → http://localhost:3000- SQLite está incluido (
better-sqlite3). Para producción con mucho tráfico considera migrar a PostgreSQL usando el plugin de Railway. - Imágenes: se guardan en
uploads/como archivos físicos. Si usas Railway, configura el volumen persistente como se explica arriba, o migra a Cloudinary/S3 para imágenes. - El panel admin no tiene autenticación por diseño (igual que el original). Si vas a exponer la URL públicamente, agrega una contraseña de acceso básica.