Installation
DigitalOcean Marketplace
The easiest way to get started is via the DigitalOcean Marketplace — no manual setup required.
→ Vodia Analytics on DigitalOcean Marketplace
Steps
1. Create Your Droplet
Click the link above and deploy a new Droplet. Choose a size that meets the requirements below. Once the Droplet is running, make note of its public IPv4 address.
2. Point Your Domain
Create a DNS A record pointing your chosen domain (e.g. cdr.example.com) to your Droplet's public IP. DNS must propagate before you proceed — Vodia Analytics needs this to issue a TLS certificate automatically.
3. First-Time Setup
Wait approximately 10 minutes after the Droplet starts, then open:
http://your_droplet_public_ipv4
You will be prompted to enter your domain name and admin email address. Once submitted, Vodia Analytics will configure itself and redirect you to the login portal.
4. Access the Application
After setup completes, access your instance at:
https://your_domain
Log in with the admin email and password you set during first-time setup.
Self-Hosted Installation
Vodia Analytics uses MongoDB 7, which requires a CPU that supports AVX (Advanced Vector Extensions). This is available on Intel Sandy Bridge (2011) or newer, and AMD Bulldozer (2011) or newer.
Older CPUs or virtual machines configured with a generic or legacy CPU model (e.g. QEMU's default kvm64) may not expose AVX even if the underlying hardware supports it — and MongoDB will fail to start.
If MongoDB fails to start, check your hypervisor's CPU type settings and set it to expose a named CPU model (e.g. host, Skylake-Client, or SandyBridge) rather than a generic one.
For servers outside of DigitalOcean, or if you prefer a manual install.
Requirements
| Component | Minimum | Recommended |
|---|---|---|
| OS | Ubuntu 24.04 | Ubuntu 24.04 |
| CPU | 4 vCPU | 8 vCPU |
| RAM | 8 GB | 16 GB (for AI transcription) |
| Disk | 200 GB | 500 GB+ (depends on recording volume) |
| Network | Public IP, ports 80/443 open | Dedicated domain with DNS A record |
Recordings are stored in uncompressed Linear Stereo WAV format and can consume significant disk space. We recommend configuring an external S3-compatible storage provider such as AWS S3 or DigitalOcean Spaces to offload recording storage — this can be configured under Admin → Storage.
For servers with 8+ CPUs, you can speed up transcription by increasing numThreads in worker/src/transcriber.js — for example, set it to 7 on an 8 CPU system. Then in .env, set TRANSCRIPTION_CONCURRENCY=6 (one less than numThreads). After changing these values, rebuild the worker with docker compose build --no-cache worker and restart with docker compose up -d worker.
Install Steps
1. Point Your Domain
Create a DNS A record pointing your chosen domain (e.g. cdr.example.com) to your server's public IP. Let DNS propagate before proceeding.
2. Download and Run
apt-get install -y wget unzip
wget https://cdn.vodia.net/cdrstats/cdrstats.zip
unzip cdrstats.zip
cd cdrstats
bash install.sh
3. Answer the Prompts
| Prompt | Required | Notes |
|---|---|---|
| Domain | Yes | e.g. cdr.example.com — or localhost for local dev |
| Admin email | Yes | Used as your login username |
| Admin password | Yes | Minimum 8 characters |
| OpenAI API key | No | Enables AI summaries and sentiment analysis. Transcription works without it. You can add it later under Admin settings, or use Gemini or Claude instead. |
| PBX IP whitelist | No | Comma-separated IPs of your Vodia PBX servers. Only these IPs can push CDR/recording data. Leave blank to allow all. Can be configured later under Admin settings. |
4. Wait ~5–10 Minutes
The installer will:
- Install Docker if not present
- Generate all secrets (MongoDB, Redis, MinIO, JWT)
- Build the frontend and all containers
- Start all services with auto-HTTPS via Caddy
- Configure UFW firewall
- Set up a daily backup cron job
5. Verify
Open https://your-domain.com in a browser and log in with the email and password you entered.
All services run in Docker containers managed by Docker Compose: Caddy (reverse proxy + auto-HTTPS), Fastify API, BullMQ worker (transcription), MongoDB 7, Redis 7, MinIO (recording storage), and Grafana (optional monitoring). Configuration lives in .env at the project root.
Network & Firewall Requirements
The self-hosted installer configures UFW on the server itself. This section covers any firewall in front of the server — DigitalOcean Cloud Firewalls, Azure NSGs, AWS Security Groups, or a corporate edge device — which the installer cannot configure.
Inbound (Ingress)
| Port | Protocol | Source | Purpose |
|---|---|---|---|
| 80 | TCP | Any | Let's Encrypt HTTP-01 validation, HTTPS redirect, first-time setup wizard |
| 443 | TCP | Any, or restrict to user + PBX IPs | Web UI, API, CDR/recording push from the PBX, live call WebSocket |
| 443 | UDP | Any | HTTP/3 (QUIC) — optional; Caddy falls back to TCP if closed |
| 22 | TCP | Your admin IPs only | SSH |
Let's Encrypt validates from multiple locations worldwide. Geo-IP filtering or country blocking on inbound TCP 80 will cause certificate issuance and renewal to fail, even if the site loads fine for you. If you cannot open port 80 globally, you will need a Caddy build with a DNS-01 challenge provider instead.
Your Vodia PBX servers push CDRs and recordings into Vodia Analytics over port 443. If you restrict inbound 443, make sure every PBX source IP is allowed. The IP whitelist under Admin settings is an additional application-layer check, not a replacement for it.
Outbound (Egress)
Required in all deployments:
| Destination | Port | Purpose |
|---|---|---|
| Your Vodia PBX servers | 443 (or your PBX's HTTPS port) | Recording downloads, REST API queries, live call WebSocket |
acme-v02.api.letsencrypt.org and OCSP responders | 443 | TLS certificate issuance and renewal |
| DNS resolvers | 53 (UDP/TCP) | Name resolution |
Required only if the corresponding feature is configured:
| Destination | Port | Required for |
|---|---|---|
portal.vodia-teams.com, api.ipify.org | 443 | License validation (Marketplace / licensed deployments) |
api.openai.com | 443 | OpenAI transcription, summaries, AI briefings |
api.anthropic.com | 443 | Anthropic Claude AI features |
generativelanguage.googleapis.com | 443 | Google Gemini AI features |
| Your Ollama server | Custom | Self-hosted local AI |
| Your SMTP server | 587, 465, or 25 | Email briefings, password resets, alerts |
| AWS S3 / DigitalOcean Spaces / other S3 endpoint | 443 | External recording storage backend |
download.docker.com, registry.npmjs.org, cdn.vodia.net | 443 | Installation, upgrades, container builds |