- Node.js 22+
- pnpm 10+
- MongoDB 7+
- Redis 7+
- Docker & Docker Compose (for containerized development)
cp apps/core/.env.example apps/core/.env
# Edit .env with your configuration# Setup MongoDB and Redis
cd docker
docker compose -f docker-compose.dev.yml up -d
# Setup Lavalink
cd lavalink
cp .env.example .env
# Edit .env with your configuration
docker compose up -d- Install
node-gyp - Create a GitHub Personal Access Token with
read:packagesscope - Save your token as an environment variable
export GITHUB_TOKEN=your_gh_pat- Then run
# Install packages and build
pnpm install --frozen-lockfile
pnpm build
# Start core app
pnpm start
# Start web app dev server
pnpm start:web- Docker & Docker Compose
- MongoDB and Redis already running and reachable. They can be:
- Running on the host machine
- Running on a separate server/VPS
- Running in another Docker network (in which case add them to the
lacunanetwork or expose ports)
- A domain pointed at the server, with a valid SSL certificate/key pair
- Sufficient RAM: at least ~3GB free to cover the configured memory limits (can be edited)
Set up the project folder on the server like this:
lacuna/
├── docker-compose.yml
├── .env
└── nginx/
├── nginx.conf
├── conf.d/
│ └── upstreams.conf
└── sites-available/
└── api.lacunabot.com.conf
See docker for more info.
- Create a
.envfile next todocker-compose.ymland fill it - Verify MongoDB and Redis are reachable from the Docker host before continuing
Make sure the SSL certificate files referenced in docker-compose.yml actually exist on the host at these exact paths:
/etc/ssl/lacunabot.com.pem
/etc/ssl/lacunabot.com.key
The api service only exposes port 5810 internally, so nginx must proxy to it by service name.
docker compose pull
docker compose up -dStart order matters slightly: nginx depends on api, but broker, bot, and api have no explicit dependency on each other in the compose file.
docker compose ps
docker compose logs -f bot
docker compose logs -f api
# Confirm the API responds behind nginx
curl -I https://your-domain.comCopyright (C) 2020 Daniyar Kurmangaliyev
This project is licensed under the GNU Affero General Public License v3.0 or later - see the LICENSE file for details.
This license applies to this software and its entire commit history, including versions predating the addition of the LICENSE file, effective as of August 22, 2026.

