1 · PrerequisitesRequisitos
What you need on the host.Qué necesitás en el host.
| Docker | ≥ 24.x |
| Docker Compose | v2 plugin |
| RAM | 2 GB minimum, 4 GB comfortable2 GB mínimo, 4 GB cómodo |
| Storage | 10 GB starter (logs + DB)10 GB para empezar (logs + DB) |
| OS | Linux (any modern distro) |
| Ports | 80 · 443 · 25 · 587 |
| Domain | A subdomain you can DNSUn subdominio que puedas DNS-ear |
| api.your.tld | public-api |
| api-dashboard.your.tld | dashboard-api |
| dashboard.your.tld | dashboard SPA |
| cdn.your.tld | widget bundlebundle del widget |
2 · Quick startInicio rápido
One repo, one make command, full stack.Un repo, un make, stack completo.
For evaluation, demos and local development. The quelora-dx-env repo bundles every component plus an installer that handles local SSL (via mkcert), DNS mapping, dependencies and a fully-seeded MongoDB. Expect a working stack in ~5 minutes.
Para evaluar, demos y desarrollo local. El repo quelora-dx-env agrupa todos los componentes y un instalador que se encarga del SSL local (mkcert), del DNS, de las dependencias y de un MongoDB con seed. Stack funcionando en ~5 minutos.
# Clone the orchestration repo
git clone https://github.com/Quelora/quelora-dx-env
cd quelora-dx-env
# Full setup — clones components, configures SSL+DNS, installs deps, seeds DB
make setup
# Bring up the stack
make up
# Then open in your browser:
# https://demo.quelora.dev — embeddable widget in action
# https://dashboard.quelora.dev — admin SPA
#
# Default dashboard credentials (change them on first login):
# admin demo: demo / Quelora26*/
# god mode: quelora / Quelora26*/
| make setup | First-time install (clone + SSL + DNS + deps + DB seed).Instalación inicial (clone + SSL + DNS + deps + seed). |
| make up / down | Start / stop the core stack.Arrancar / parar el stack core. |
| make start / stop | Cascading start / stop of Core + WordPress + ML environments.Arrancar / parar en cascada Core + WordPress + ML. |
| make wp-setup | Spin up the bundled WordPress demo with the plugin pre-installed.Levantar el demo de WordPress con el plugin pre-instalado. |
| make ml-up | Start the optional Detoxify ML moderation API.Arrancar la API ML de moderación (Detoxify). |
| make logs | Tail logs in real time.Logs en vivo. |
| make rebuild-api | Rebuild backend services only.Rebuild solo de los servicios backend. |
| make help | Full list of targets with descriptions.Lista completa de targets con descripciones. |
| make nuke | Full cleanup — irreversible. Wipes DBs, repos, certs. Asks for typed confirmation.Limpieza total — irreversible. Borra DBs, repos, certs. Pide confirmación tipeada. |
For production deployments where you want fine control over images, secrets, and your own SSL/DNS — the manual path below is the right starting point. Para producción, donde querés control fino sobre imágenes, secretos y tu propio SSL/DNS — la ruta manual de abajo es el punto de partida.
3 · Clone & configureClonar y configurar
Pull each component you'll run.Traé cada componente que vayas a correr.
# Pick the components you need from github.com/Quelora
git clone https://github.com/Quelora/quelora-public-api # required
git clone https://github.com/Quelora/quelora-dashboard-api # required
git clone https://github.com/Quelora/quelora-dashboard # required
git clone https://github.com/Quelora/quelora-worker # required
git clone https://github.com/Quelora/quelora-jobs # required
git clone https://github.com/Quelora/quelora-widget-community# required (built & served)
git clone https://github.com/Quelora/quelora-wp-plugin # optional (WordPress)
# Copy .env templates and fill in secrets
cp quelora-public-api/.env.example quelora-public-api/.env
cp quelora-dashboard-api/.env.example quelora-dashboard-api/.env
# Generate strong secrets
openssl rand -hex 32 # JWT_SECRET
openssl rand -hex 32 # JWT_ADMIN_SECRET
openssl rand -hex 32 # ENCRYPTION_KEY
4 · Bring up the stackLevantar el stack
Docker Compose handles the rest.Docker Compose se ocupa del resto.
services:
mongo: { image: mongo:4.4, volumes: [ mongo:/data/db ] }
redis: { image: redis:alpine }
public-api:
build: ./quelora-public-api
env_file: ./quelora-public-api/.env
depends_on: [ mongo, redis ]
dashboard-api:
build: ./quelora-dashboard-api
env_file: ./quelora-dashboard-api/.env
depends_on: [ mongo, redis ]
dashboard:
build: ./quelora-dashboard
worker:
build: ./quelora-worker
env_file: ./quelora-public-api/.env
jobs:
build: ./quelora-jobs
env_file: ./quelora-public-api/.env
nginx:
image: nginx:mainline-alpine
ports: [ "80:80", "443:443" ]
volumes: [ ./nginx.conf:/etc/nginx/nginx.conf:ro ]
volumes:
mongo: {}
docker compose up -d
docker compose ps
docker compose logs -f public-api dashboard-api worker jobs
5 · Environment variablesVariables de entorno
The essentials, copy-pasteable.Lo esencial, listo para copiar.
Both APIs share a common variable layout. Below is the minimum to get the public API alive.Ambas APIs comparten un layout común. Lo de abajo es el mínimo para que la API pública arranque.
# Server
PORT=3000
BASE_URL=https://api.your.tld
DASHBOARD_URL=https://dashboard.your.tld
# Data
MONGO_URI=mongodb://mongo:27017/quelora
CACHE_REDIS_URL=redis://redis:6379
# Secrets (rotate these)
JWT_SECRET=...64-hex...
JWT_ADMIN_SECRET=...64-hex...
ENCRYPTION_KEY=...64-hex...
# Moderation (optional)
PERSPECTIVE_API_KEY=
TOXICITY_THRESHOLD=0.7
# VAPID push (optional)
VAPID_PUBLIC_KEY=
VAPID_PRIVATE_KEY=
VAPID_EMAIL=admin@your.tld
# Tenant identity
CID=QU-XXXXXXXX-XXXXX
6 · Scaling notesNotas de escala
Where to grow when traffic grows.Dónde crecer cuando crece el tráfico.
The public API and dashboard API are stateless. Run multiple replicas behind nginx and they share Redis + Mongo. quelora-worker and quelora-jobs also scale by replica count.
La API pública y la de dashboard son stateless. Corré múltiples réplicas detrás de nginx y comparten Redis + Mongo. quelora-worker y quelora-jobs también escalan por réplicas.
Mongo and Redis are usually the first to feel the pressure. Move them to managed instances (Atlas, Elasticache) before you scale anything else.
Mongo y Redis suelen ser los primeros en sentir presión. Pasalos a instancias gestionadas (Atlas, Elasticache) antes que cualquier otra cosa.
7 · HardeningEndurecimiento
Sensible defaults are not enough.Los defaults sensatos no alcanzan.
- Terminate TLS at nginx with Let's Encrypt; redirect HTTP to HTTPS.
- Terminá TLS en nginx con Let's Encrypt; redirigí HTTP a HTTPS.
- Set
MONGO_SYNC_INDEXES=trueon the first boot only — disable in production after. - Activá
MONGO_SYNC_INDEXES=truesolo en el primer arranque — desactivá en producción después. - Put Redis behind the internal Docker network — it has no auth by default.
- Mantené Redis en la red interna de Docker — no tiene auth por default.
- Rotate
JWT_SECRET,JWT_ADMIN_SECRETandENCRYPTION_KEYon a schedule that matches your threat model. - Rotá
JWT_SECRET,JWT_ADMIN_SECRETyENCRYPTION_KEYsegún tu modelo de amenazas. - Back up the Mongo volume — every relation lives there.
- Hacé backups del volumen de Mongo — toda relación vive ahí.