Install with Docker Compose
Download Zelvynta CRM, add your settings and start it with Docker Compose.
Download Zelvynta CRM
Copy the source code to your server, then move into its folder.
git clone https://github.com/Zelvynta/zelvynta-platform.git
cd zelvynta-platformRun every command on this page from inside the zelvynta-platform folder.
Create your settings file
Copy the example settings file. Zelvynta CRM reads its settings from .env.
cp .env.example .envAdd two secret keys
Create a long random value:
openssl rand -hex 32Open the settings file:
nano .envReplace these two placeholder values. Use a different random value for each one.
| Setting | Replace this placeholder |
|---|---|
AUTH_SECRET | replace-with-a-long-random-string |
UPDATER_SECRET | replace-with-a-random-updater-secret |
Save the file. In nano, press Ctrl+O, then Enter, then Ctrl+X.
Warning
Keep .env private. UPDATER_SECRET guards the update agent, which can control Docker on your server. Don't
commit .env or share it.
Start Zelvynta CRM
docker compose -f infra/compose/docker-compose.yml up -d --buildThe first start builds the app on your server. This can take several minutes.
Check that it is running
docker compose -f infra/compose/docker-compose.yml psweb, worker, mongodb, redis, caddy and updater should show as running. mongodb-init stops after its
first run. That is expected.
Block the ports that must stay private
This Compose file also opens ports 3000 (the app without HTTPS), 27017 (the database) and 6379 (Redis). They are there for testing. Only ports 80 and 443 should be reachable from the internet.
Block 3000, 27017 and 6379 in your VPS provider's network firewall. Leave port 22 open so you can still use SSH.
Danger: risk of data loss
The database on port 27017 has no password in this setup. If that port is reachable from the internet, anyone can read or delete all of your CRM data.
Note
Docker opens published ports in the server's own firewall rules, so tools such as ufw on the server don't block
them. Use the firewall your VPS provider offers instead.
