Xpressgo is a multi-app project with:
server- Go backend API and WebSocket serverweb- React mini appadmin- Nuxt admin panelpostgres- PostgreSQL database via Docker
The root Makefile is the main entry point for local development and quality checks.
Use this when you want to keep the current PostgreSQL data and existing Docker volume state.
- Start the stack:
make up- View logs if needed:
make logsThis keeps:
- existing Postgres data
- existing Docker volume state
- previously seeded or manually created records
Use this when you want a zero-state local environment with nothing preserved from previous runs.
make freshmake fresh is destructive. It does all of the following:
- stops all containers
- removes containers
- removes Docker volumes, including PostgreSQL data
- removes repo-local generated runtime artifacts:
web/distadmin/.nuxtadmin/.outputserver/tmpserver/bin
- rebuilds and starts the full Docker stack
- runs database migrations
- runs the seed command
After make fresh, the project is running again from a fully clean local state.
make up- Start the Docker stack without deleting existing data.
make down- Stop the Docker stack without deleting volumes.
make restart- Restart containers while keeping existing data.
make fresh- Fully destroy local runtime state and start again from zero.
make logs- Follow Docker logs for the running services.
make migrate- Run database migrations from the
serverapp.
- Run database migrations from the
make seed- Seed demo data into the database.
These run apps directly from the host machine instead of Docker.
make server- Run the Go server locally.
make web- Run the Vite mini app locally.
make admin- Run the Nuxt admin panel locally.
make quality- Run repo-wide quality checks across server, web, and admin.
make quality-fix- Apply safe autofixes, then rerun full quality checks.
make quality-server- Run server-only quality checks.
make quality-web- Run web-only quality checks.
make quality-admin- Run admin-only quality checks.
make fmt- Format Go files in
server.
- Format Go files in
make fmt-check- Fail if Go files are not properly formatted.
make lint- Run lint checks across the repo.
make typecheck- Run frontend type checks.
make test- Run server tests.
make docs-check- Analyze the current diff and suggest which docs may need review.
make docs-refresh- Run a broader reflection pass across the tracked codebase and suggest long-lived docs to review.
Use this when you want to continue working with your existing local data:
make upmake logsif you need to inspect service output- make your changes
make quality
Use this when you suspect stale local state or want to reset everything:
make fresh- confirm the apps are reachable:
- mini app: local Docker/Vite endpoint
- admin:
http://localhost:3000 - server:
http://localhost:8080
- continue development
make quality
Production-style deployment uses three public hosts:
customer.novdaunion.uz- customer mini app frontend
admin.novdaunion.uz- admin panel frontend
srvr.novdaunion.uz- backend API and WebSocket origin
Both frontends call the same backend origin:
https://srvr.novdaunion.uz
The Telegram bot should open:
https://customer.novdaunion.uz
Deployments are automated on every push to main, but only after the quality gate passes with zero errors.
CI gate:
make qualitymake test- Docker Compose config validation
- Nginx config validation
Only if those checks pass does GitHub Actions deploy to the VPS over SSH.
- Point DNS for
customer.novdaunion.uz,admin.novdaunion.uz, andsrvr.novdaunion.uzto the VPS. - Install Docker Engine, Docker Compose plugin, Nginx, Let's Encrypt tooling, and Go on the VPS.
- Clone the repo to the deploy path, for example
/opt/xpressgo. - Create
infra/deploy/vps.envfrominfra/deploy/vps.env.example. - Install the Nginx host configs from
infra/nginx/. - Issue TLS certificates for the three public domains.
- Add GitHub Actions deploy secrets:
DEPLOY_HOSTDEPLOY_USERDEPLOY_PORTDEPLOY_SSH_KEY
- Push to
mainand let the pipeline deploy.
Use this when you want to run one or more apps outside Docker:
- start dependencies you still need, usually Postgres:
make up- run the app you want locally:
make server
make web
make adminUse the documentation workflow when a change affects architecture, runtime commands, permissions, shared UI patterns, quality tooling, or any other long-lived repo behavior.
Primary tools:
make docs-check- diff-based advisory review for the current working tree
make docs-refresh- broader reflection review against the current tracked codebase
docs-syncskill- deeper advisory analysis when the change is substantial and you want richer doc-routing suggestions
Recommended order after meaningful changes:
- run
make quality - run
make docs-check - if the change is substantial, run
make docs-refresh - if you need a more targeted advisory review, run the
docs-syncskill - decide whether to update
README.md,AGENTS.md, specs, plans, or workflow docs
Common document targets:
README.md- runtime commands, operator flow, local development workflow
AGENTS.md- architecture reflection, repo rules, agent guidance, shared implementation patterns
docs/code-quality-tooling.md- lint, build, verification, and autofix workflow
docs/superpowers/specs/- intended product or architecture behavior
docs/superpowers/plans/- implementation sequencing, when the plan itself changes
This workflow is advisory only. It suggests likely stale docs; it does not edit them automatically.
make upis non-destructive.make restartis also non-destructive.make freshis intentionally destructive and will wipe the local PostgreSQL data volume.- If you need a true clean local environment, use
make fresh, notmake restart.