Run the agency locally
Get your package running on your computer, with Docker.
For the Full Stack package
Before you start: install and open Docker Desktop, or Docker Engine with Compose.
View requirementsDownload your template
Open My templates and download the ZIP for your package.
Expected result: A file named like
velra-real-estate-full-stack-….zipis in your downloads.Unzip and open the folder
Open a terminal where the ZIP is, extract it and move into the
velra-real-estate-full-stackfolder. On Windows, you can extract it in File Explorer instead, then open a terminal in the folder.Terminalunzip -q velra-real-estate-full-stack-*.zip cd velra-real-estate-full-stackExpected result: The folder lists
Having trouble?admin-dashboard,back-end,storefrontanddocker-compose.yml, besideREADME.md,QUICKSTART.mdandLICENSE.md.Start the apps
Build and start the API, the public website and the agency dashboard. Nothing has to be configured first. The first start builds three images and fills the database with the demo agency, which takes a few minutes; later starts take seconds.
Terminalinvelra-real-estate-full-stackdocker compose up --buildA port is already in use?
If the start stops with
A port is already in useports are not available,address already in useorport is already allocated, another program uses 3030, 3031 or 8000. Either stop it, or create a file named.envin thevelra-real-estate-full-stackfolder, besidedocker-compose.yml, with the port you need, such asADMIN_PORT=3041(SITE_PORTfor the website,API_PORTfor the API). Rundocker compose up --buildagain and open the app on its new port.Expected result: The three services keep running and the log stops scrolling. Leave this terminal open.
Having trouble?Open the public website
Open localhost:3030Local. English is at
/enand Arabic at/ar. The website has no accounts: saved homes and the comparison are kept in the visitor's browser.Expected result: The website opens on its home page with the demo listings and their photos.
Having trouble?Sign in to the agency dashboard
Open localhost:3031Local. Sign in with
admin@velra.exampleand the passwordAdmin@123. For the agent, typeagent@velra.examplewithAgent@123. Change both passwords before the stack is reachable from the internet.Expected result: The dashboard opens on its overview, with the published properties, the latest inquiries and the upcoming viewings.
Having trouble?
Take a tour
What the demo agency looks like once everything runs.
| Account | Password | |
|---|---|---|
| Super Admin: every page and permission | admin@velra.example | Admin@123 |
| Agent: overview, properties, inquiries, viewings, the staging studio and the neighborhood list | agent@velra.example | Agent@123 |
The seed adds 17 properties (15 published, 2 drafts) with their photos, 6 neighborhoods, 2 approved staging previews, 5 inquiries and 8 viewing requests, so every screen opens full. These are local demo accounts only.
Stop and start again
Press Ctrl+C in the terminal to stop the apps, or run this from the velra-real-estate-full-stack folder. Your data, the database and the uploads, is kept in the velra-data volume.
velra-real-estate-full-stackdocker compose downStart again with the same command as step 3. Without --build it reuses the images you already built.
velra-real-estate-full-stackdocker compose upKeep your data
docker compose down -v also deletes the data volume. The next start seeds a fresh copy of the demo agency, and everything you created is gone.
Run the public website
This package is the public website on its own. It reads everything from the Velra API, so start the API first. Unless you build it with another address, the website expects the API at http://localhost:8000. The API is a separate package and is not in this download.
Unzip and open the folder
Terminalunzip -q velra-website-*.zip cd velra-websiteExpected result: The folder has a
Having trouble?Dockerfileand apackage.json.Build the image
The
NEXT_PUBLIC_*values are compiled into the JavaScript the browser loads, so they are build arguments. Without any, the website uses the API athttp://localhost:8000/apiand calls itselfhttp://localhost:3030. For an API somewhere else, pass its address.Terminalinvelra-websitedocker build -t velra-website .With your own API and domain:
Terminalinvelra-websitedocker build -t velra-website --build-arg NEXT_PUBLIC_API_BASE_URL=https://api.your-agency.com/api --build-arg NEXT_PUBLIC_SITE_URL=https://www.your-agency.com --build-arg NEXT_PUBLIC_MEDIA_HOSTNAME=media.your-agency.com .Having trouble?Start it
Inside the container
localhostis the container itself, soAPI_INTERNAL_URLtells the website's own server where to reach the API on your computer, for property page titles, the first render of a property page and the sitemap.--add-hostmakeshost.docker.internalwork on Linux; Docker Desktop already has it. If port3030is taken, change the number on the left of-p, for example-p 3041:3030, open that port instead, and addhttp://localhost:3041to the API'sCORS_ORIGIN.Terminalinvelra-websitedocker run -p 3030:3030 -e API_INTERNAL_URL=http://host.docker.internal:8000/api --add-host=host.docker.internal:host-gateway velra-websiteExpected result: localhost:3030Local opens the website with the listings from your API. English is at
Having trouble?/en, Arabic at/ar.
Run the agency dashboard
This package is the agency dashboard on its own. Every screen reads the Velra API, so start the API first. Unless you build it with another address, the dashboard expects the API at http://localhost:8000. The API is a separate package and is not in this download.
Unzip and open the folder
Terminalunzip -q velra-agency-dashboard-*.zip cd velra-agency-dashboardExpected result: The folder has a
Having trouble?Dockerfileand apackage.json.Build the image
Without build arguments the dashboard uses the API at
http://localhost:8000/api. For an API somewhere else, pass its address, its address without/apifor the live notifications, and the website's address for the "View website" link.Terminalinvelra-agency-dashboarddocker build -t velra-dashboard .With your own API:
Terminalinvelra-agency-dashboarddocker build -t velra-dashboard --build-arg NEXT_PUBLIC_API_BASE_URL=https://api.your-domain.com/api --build-arg NEXT_PUBLIC_WEBSOCKET_BASE_URL=https://api.your-domain.com --build-arg NEXT_PUBLIC_MEDIA_HOSTNAME=api.your-domain.com --build-arg NEXT_PUBLIC_SITE_URL=https://your-domain.com .Having trouble?Start it and sign in
If port
3031is taken, change the number on the left of-p, for example-p 3041:3031, open that port instead, and addhttp://localhost:3041to the API'sCORS_ORIGIN(and set itsFRONTEND_URLto it, the address the live notifications connect from).Terminalinvelra-agency-dashboarddocker run -p 3031:3031 velra-dashboardExpected result: localhost:3031Local opens the sign-in form. Sign in with
Having trouble?admin@velra.exampleand the passwordAdmin@123, which a seeded API accepts.
Run the API
This package is the NestJS API on its own, on a SQLite file kept in a Docker volume with the uploads. The public website and the agency dashboard are separate packages and are not in this download.
Unzip and open the folder
Terminalunzip -q velra-backend-*.zip cd velra-backendExpected result: The folder has a
Having trouble?Dockerfile, adocker-entrypoint.shand apackage.json.Start it with the demo agency
A new volume gets empty tables and no accounts unless you ask for the demo agency, so keep
-e SEED_DEMO_DATA=truefor a first start. Thevelra-api-datavolume keeps the database and the uploads between runs. If port8000is taken, change the number on the left of-p, for example-p 8010:8000, and add-e PUBLIC_MEDIA_URL=http://localhost:8010/mediaso the photo addresses use it too. Your frontends must then point athttp://localhost:8010/api.Terminalinvelra-backenddocker run -p 8000:8000 -v velra-api-data:/data -e SEED_DEMO_DATA=true velra-apiExpected result: localhost:8000/
Having trouble?api/ healthLocal answers with "status":"ok"and"database":"up".
The container accepts the website on http://localhost:3030 and the dashboard on http://localhost:3031. On other addresses, set CORS_ORIGIN (both, comma separated) and FRONTEND_URL (the dashboard) with -e.
To give the container your own keys (R2, AI, MCP), create .env from .env.example with cp .env.example .env, fill it in, and add --env-file .env -e NODE_ENV=production to docker run:
velra-backenddocker run -p 8000:8000 -v velra-api-data:/data -e SEED_DEMO_DATA=true --env-file .env -e NODE_ENV=production velra-apiA value given with -e wins over the same name in the file, so the container runs in production whatever .env says, and it moves the file's relative paths (SQLITE_DATABASE, MEDIA_UPLOAD_DIR) into the volume. Without a JWT_SECRET of your own, or with the example one, the container generates a secret and keeps it in the volume, so sign-ins survive a restart.