Self-Hosted Server Guide

Run your own GameVox server on your hardware. Full control over voice, chat, files, and data — with automatic updates and cloud account sync.

Contents

Overview

A self-hosted GameVox server runs entirely on your own machine — your voice, messages, files, emojis, and soundboard clips are stored locally on your hardware. The server connects to GameVox cloud for account authentication and auto-updates, but all your community data stays on your machine.

Voice & Video

Built-in WebRTC SFU for crystal clear voice and video, hosted on your own network.

Chat & Files

Full text chat, file sharing, emojis, soundboard, polls, events, and announcements.

Automatic Updates

The server binary updates itself when a new version is available. Zero manual intervention.

Cloud Account Sync

Members sign in with their GameVox accounts. Usernames, avatars, and badges sync from the cloud.

Automatic Backups

Databases are backed up every 3 hours with tiered retention going back 12 months.

One-Click Restore

Restore to any backup point from the server settings GUI. A pre-restore backup is created automatically.

System Requirements

The server is a single, self-contained binary with no external dependencies. No database server and no runtime to install. A Docker image is also available.

Getting Started

  1. Create a new server in the desktop GameVox app. Self-hosted is free for life before July 1st. After that, $2/mo or $15/yr is required.
    Click Add Server
    Enable Self-Hosted Server toggle
  2. Download your server binary. After activation, you'll receive a personalized server binary with your community's configuration embedded inside.
  3. Place it anywhere on your machine and run it. The server creates a data/ folder next to the binary for all databases and files.
  4. Open the required ports on your firewall and/or router (see Firewall & Port Forwarding).
  5. Done. Your server will appear in the GameVox app. Members can join and start chatting.
Your binary is unique. Each self-hosted binary has an encrypted configuration payload embedded inside it, specific to your community and your owner account. Do not share your binary with others.

Setup on Windows

1. Choose a location

Create a folder for your server, for example C:\GameVox-Server\. Place the downloaded .exe binary inside it.

2. Run the server

Double-click the binary, or open a terminal and run:

C:\GameVox-Server\gamevox-self-hosted-server.exe

On first launch, you'll see the server create its data directory and connect to the GameVox cloud. The console will display the required ports:

Required firewall/router ports: TCP 8088 - Client connections (WebSocket + HTTP) UDP 7070 - Voice/video media (WebRTC)

3. Allow through Windows Firewall

Windows will likely show a firewall prompt on first run. Click "Allow access" for both private and public networks. If you missed the prompt, you can add rules manually:

netsh advfirewall firewall add rule name="GameVox TCP" dir=in action=allow protocol=tcp localport=8088 netsh advfirewall firewall add rule name="GameVox UDP" dir=in action=allow protocol=udp localport=7070

4. Install as a Windows service (optional)

To keep the server running in the background and auto-start on boot, open an Administrator terminal and run:

gamevox-self-hosted-server.exe --install

The installer will prompt you to configure your server:

Configuration (press Enter to accept defaults): Data directory [C:\GameVox-Server\data]: TCP port (client connections) [8088]: UDP port (voice/video) [7070]:

Press Enter to accept each default, or type a custom value. The installer then shows a summary of what it will do and asks for confirmation before proceeding.

On first run, the server will also offer to install as a service automatically — no need to pass --install manually.

Setup on Linux

1. Download and make executable

chmod +x gamevox-self-hosted-server ./gamevox-self-hosted-server

2. Install as a systemd service (recommended)

Run the installer to create a system user, copy the binary to /opt/gamevox/, and set up a systemd service:

sudo ./gamevox-self-hosted-server --install

The installer will prompt you to configure your server:

Configuration (press Enter to accept defaults): Data directory [/opt/gamevox/data]: TCP port (client connections) [8088]: UDP port (voice/video) [7070]:

Press Enter to accept each default, or type a custom value (e.g. a mounted drive for data). The installer then shows a summary and asks for confirmation before proceeding.

Once installed, manage the service with:

sudo journalctl -u gamevox-self-hosted-server -f # view logs sudo systemctl restart gamevox-self-hosted-server # restart sudo systemctl stop gamevox-self-hosted-server # stop sudo systemctl disable gamevox-self-hosted-server # disable auto-start

On first run, the server will also offer to install as a service automatically — no need to pass --install manually.

3. Open firewall ports

# UFW (Ubuntu/Debian) sudo ufw allow 8088/tcp sudo ufw allow 7070/udp # firewalld (Fedora/CentOS/RHEL) sudo firewall-cmd --permanent --add-port=8088/tcp sudo firewall-cmd --permanent --add-port=7070/udp sudo firewall-cmd --reload

Setup with Docker

Prefer containers? The self-hosted server runs great in Docker with ~45 MB RAM usage at idle.

1. Download the Docker zip

From your server's download page in the GameVox app, select the Docker option. This downloads a gamevox-docker.zip file containing everything you need:

gamevox-docker.zip gamevox-docker/ gamevox-self-hosted-server (Linux binary with your server config embedded) Dockerfile (ready-to-use Alpine-based image definition) docker-compose.yml (optional — for docker compose workflows)

2. Extract and build

Extract the zip, then open a terminal in the gamevox-docker/ folder and run:

docker build -t gamevox-self-hosted-server .

3. Run the container

docker run -d \ --name gamevox \ -v $(pwd)/data:/app/data \ -p 8088:8088 \ -p 7070:7070/udp \ gamevox-self-hosted-server

On Windows (PowerShell), replace $(pwd) with ${PWD} or the full path to your data directory.

4. Verify it's running

docker logs gamevox

You should see the server connecting to GameVox cloud. Check the health endpoint:

curl -k https://localhost:8088/health

Sample Dockerfile

If you'd like to build your own image, here's a minimal Dockerfile:

FROM alpine:latest RUN mkdir /app WORKDIR /data VOLUME /app/data COPY ./gamevox-self-hosted-server /app RUN chmod +x /app/gamevox-self-hosted-server ENV DATA_DIR=/app/data EXPOSE 8088 7070/udp CMD ["/app/gamevox-self-hosted-server"]
Persistent data: All server data (databases, files, backups) is stored in the /app/data volume. Mount this to a host directory to persist data across container restarts and updates.

Updating

Auto-updates work the same as on bare metal — the server replaces its own binary and restarts automatically. If you prefer manual updates, you can also download the latest Linux binary, rebuild the image, and restart the container. Your data is preserved in the volume mount.

# Manual update (optional - auto-updates handle this for you): docker stop gamevox docker rm gamevox docker build -t gamevox-self-hosted-server . docker run -d --name gamevox -v $(pwd)/data:/app/data -p 8088:8088 -p 7070:7070/udp gamevox-self-hosted-server

Docker Compose

Create a docker-compose.yml file in your gamevox-docker/ folder alongside the Dockerfile:

services: gamevox: build: . # Builds the image from the Dockerfile in this folder container_name: gamevox ports: - "8088:8088" # WebSocket (chat, signaling) + HTTP (file downloads) - "7070:7070/udp" # Voice traffic (WebRTC/UDP) volumes: - ./data:/app/data # All server data: config, databases, files, backups environment: - DATA_DIR=/app/data # Where the server stores databases, files, and backups restart: unless-stopped # Auto-restart on crash or host reboot healthcheck: test: ["CMD", "wget", "-qO-", "--no-check-certificate", "https://localhost:8088/health"] interval: 30s timeout: 5s start_period: 10s retries: 3 logging: driver: json-file options: max-size: "10m" # Keep logs from filling your disk max-file: "3"

Using Docker Compose

# Start the server (first time or after updating the binary): docker compose up -d --build # Check if it's running and healthy: docker compose ps # View logs: docker compose logs -f gamevox # Stop the server: docker compose down # Restart after a config change: docker compose restart
Before starting: Your directory layout should look like this:
gamevox-docker/ docker-compose.yml Dockerfile gamevox-self-hosted-server (Linux binary from your download page) data/ (created automatically on first run)

Firewall & Port Forwarding

Your server needs two ports accessible from the internet so GameVox clients can connect:

Port Protocol Purpose
8088 TCP WebSocket connections (chat, signaling) and HTTP (file downloads)
7070 UDP WebRTC media (voice and video streams)

Both ports can be customized with environment variables: TCP_PORT for TCP and UDP_PORT for UDP. See Environment Variables for details.

Router port forwarding: If your server is behind a home router (NAT), you will also need to set up port forwarding in your router's admin panel. Forward both ports to the local IP address of the machine running the server.

To check if your ports are reachable, start the server and ask a friend outside your network to connect — or use an online port checker tool.

Environment Variables

The self-hosted server can be configured entirely through environment variables. Set these before starting the server to customize ports, storage locations, and more. All are optional — sensible defaults are used when not set.

Variable Default Description
TCP_PORT 8088 Port for HTTP and WebSocket connections from clients (chat, signaling, file downloads). Change this if port 8088 is already in use by another application.
UDP_PORT 7070 Port for WebRTC media traffic (voice and video streams over UDP). Change this if port 7070 conflicts with another service.
DATA_DIR ./data Root directory for all server data: databases, logs, emojis, soundboard clips. Defaults to a data/ folder next to the server binary. Useful for Docker or when you want to store data on a separate drive.
FILES_DIR {DATA_DIR}/files Directory for uploaded file attachments (images, videos, documents shared in channels and file shares). Set this to redirect file storage to a larger drive without moving the entire data directory.
BACKUPS_DIR {DATA_DIR}/backups Directory for automatic and manual backups (database snapshots and file archives). Set this to store backups on a separate drive or network mount for redundancy.

Examples

Windows (start-gamevox.bat)

@echo off :: Change the server port to 9090 and store files on D: drive set TCP_PORT=9090 set FILES_DIR=D:\gamevox-files gamevox-self-hosted-server.exe pause

Linux (start-gamevox.sh)

#!/bin/bash # Change the server port to 9090 and store files on a mounted drive export TCP_PORT=9090 export FILES_DIR=/mnt/storage/gamevox-files ./gamevox-self-hosted-server

Docker Compose

services: gamevox: build: . container_name: gamevox ports: - "9090:9090" - "7070:7070/udp" volumes: - ./data:/app/data environment: - DATA_DIR=/app/data - TCP_PORT=9090 restart: unless-stopped
Docker port mapping: When changing ports in Docker, remember to update both the TCP_PORT environment variable and the -p port mapping to match (e.g., -p 9090:9090).

The server prints a configuration summary at startup showing each variable, its current value, and whether it's using a custom value or the default:

Environment Variables Value ------------------------------------------------------- DATA_DIR [USING DEFAULT] /opt/gamevox/data FILES_DIR [CUSTOM] /mnt/storage/gamevox-files BACKUPS_DIR [USING DEFAULT] /opt/gamevox/data/backups TCP_PORT [CUSTOM] 9090 UDP_PORT [USING DEFAULT] 7070

How It Works

When your self-hosted server starts, it establishes a persistent WebSocket connection to the GameVox cloud (the "control channel"). This connection is used for:

GameVox Client Your Server GameVox Cloud | | | |--- connect (WebSocket) --->| | | |--- verify account ------>| | |<-- identity confirmed ---| |<-- welcome, here's data ---| | | | | |--- voice join ------------>| | |<== WebRTC media (UDP) ====>| (direct, not via cloud) |

All voice, chat, and file traffic goes directly between clients and your server. The cloud is only used for authentication and coordination — it never sees your messages or voice streams.

Telemetry & Monitoring

Your self-hosted server sends a lightweight status heartbeat to the GameVox cloud every 30 seconds over the control channel. This data is used to power the owner dashboard, detect when updates should be delivered, and help diagnose issues. No message content, voice audio, file contents, or user activity is ever included.

What is sent

DataPurpose
Binary versionDetermines whether an update is available
Connected users countOwner dashboard & update scheduling (updates are deferred while users are in voice)
Video/screen share countOwner dashboard
UptimeOwner dashboard
Memory usageHealth monitoring
Goroutine countHealth monitoring
Database file sizesStorage monitoring on owner dashboard
Total message & file countStorage monitoring (counts only, no content)
Storage directory sizeDisk usage monitoring
Backup status & timestampAlerts the owner if backups stop succeeding
Schema versionEnsures database migrations are applied correctly
Control channel reconnect countConnection stability monitoring
Recent errors (type and context)Helps diagnose issues without requiring operator intervention (e.g. database write failures, backup errors). Error messages are truncated and never contain user data.
No opt-out needed. The heartbeat contains only operational metrics — the same kind of data you would see in a process monitor or server dashboard. It does not include IP addresses of connected users, usernames, channel names, message text, or any content your community creates.

Database Architecture

Your server uses two SQLite databases, stored in the data/ folder next to the binary:

community.db

Structural data that defines your server's configuration:

content.db

Growing content data:

audit.db

Activity log data:

Safe to delete. The audit.db file can be deleted at any time without affecting server functionality. It is not included in automatic backups. If deleted, the server will create a new empty audit.db on the next activity log event.

All databases use SQLite in WAL mode (Write-Ahead Logging) for better concurrent read/write performance. Schema migrations are embedded in the binary and run automatically when the server updates to a new version.

Why separate databases? Separating structural data from content data keeps the community.db small and fast (typically under 1 MB), while content.db can grow to gigabytes over time without impacting server configuration operations. The audit.db is kept separate so it can be freely deleted to reclaim disk space without touching any server data.

Automatic Updates

Your self-hosted server updates itself automatically. When a new version is available, the cloud sends a notification through the control channel with a download URL. The server then:

  1. Downloads the new binary to a temporary file next to the current one.
  2. Verifies the download (checks file size is reasonable).
  3. Notifies all connected clients that the server is restarting for an update.
  4. Replaces the running binary using a platform-specific safe replacement strategy.
  5. Restarts. On Linux, the process re-execs itself in-place. On Windows, it spawns a new process and exits.

If users are in a voice call when an update arrives, the update is deferred until all voice connections are closed. This prevents interrupting active conversations.

Update strategy by platform

Using a process manager? If you're running the server under systemd, NSSM, or similar, the Restart=always policy ensures the server comes back up after updates. The binary replacement happens before the exit, so the restarted process will be the new version.

Backups & Restore

Automatic database backups

Both databases are backed up automatically every 3 hours using SQLite's VACUUM INTO, which creates a consistent snapshot even while the database is being written to. Each backup creates a timestamped directory inside data/backups/ containing everything for that point in time.

Each backup directory contains:

data/backups/2026-03-15_140000/ backup_community_2026-03-15_140000.db Community database snapshot backup_content_2026-03-15_140000.db Content database snapshot manifest_2026-03-15_140000.json File manifest (list of all files) files_backup_2026-03-15_140000.zip All files under 100 MB

Tiered retention policy

Old backups are automatically cleaned up using a tiered retention schedule:

Age Retention
Last 7 days Keep all backups (one every 3 hours)
7 – 30 days Keep 1 backup per day
1 – 6 months Keep 1 backup per week
6 – 12 months Keep 1 backup per month
Older than 12 months Deleted

Restoring from a backup

You can restore from any backup point directly from the server settings in the GameVox app:

  1. Open Server Settings and go to the Backups tab (owner only).
  2. Browse the list of available backup snapshots with their timestamps and sizes.
  3. Click Restore on the snapshot you want to revert to.
  4. Confirm the action in the warning dialog.

When you restore, the server automatically creates a pre-restore backup of the current databases before replacing them. This means you can always undo a restore by restoring from the pre-restore snapshot. After replacing the databases, the server restarts.

Data loss warning: Restoring a backup replaces both databases with the selected snapshot. All messages, channels, permissions, and other changes made after the backup timestamp will be lost. Uploaded files are not affected by a database restore.

Manual backup trigger

You can also trigger an immediate backup from the Backups tab by clicking Backup Now. This creates a fresh snapshot of both databases without waiting for the next scheduled backup.

File Storage & Large File Backups

Uploaded files, custom emojis, and soundboard clips are stored on disk in subdirectories under data/:

Files under 100 MB are automatically included in each backup snapshot as a zip archive. Files over 100 MB are backed up separately. You can also create a manual backup of all files from the GUI.

Automatic small file backups

Every backup snapshot automatically includes a files_backup_*.zip containing all uploaded files, emojis, and soundboard clips under 100 MB. This means each backup directory is a self-contained snapshot of your entire server.

Large file backups (automatic)

Files over 100 MB are automatically backed up individually as zip files in data/backups/large_files/. Each large file gets its own zip, created once and kept as a single copy. Since uploaded files are immutable (never modified after upload), the server only needs to zip each large file once. This runs automatically after each backup.

Manual file backup (from the GUI)

In the Backups tab, click Create File Backup to generate a .zip archive of all uploaded files (including large ones). The archive is saved to its own timestamped directory and can be downloaded from the browser.

File manifests

Each backup also generates a file manifest — a JSON file listing every uploaded file that existed at that point in time, including file IDs, paths, sizes, and whether each file is classified as "large" (100 MB+). Manifests are included in the backup directory alongside the database snapshots.

Data & File Locations

All data is stored in a data/ directory next to the server binary. The full directory structure:

gamevox-self-hosted-server (or gamevox-self-hosted-server.exe on Windows) data/ community.db SQLite database: channels, groups, permissions, settings community.db-wal Write-ahead log (auto-managed by SQLite) content.db SQLite database: messages, files, reactions, read state content.db-wal Write-ahead log audit.db SQLite database: activity log (not backed up, safe to delete) files/ Uploaded file attachments emojis/ Custom server emojis soundboard/ Soundboard audio clips backups/ 2026-03-15_140000/ Timestamped backup snapshot directory backup_community_*.db Community database snapshot backup_content_*.db Content database snapshot manifest_*.json File manifest files_backup_*.zip Small files zip (under 100 MB) large_files/ Individual zips of files over 100 MB
Moving your server: To move your self-hosted server to a different machine, stop the server, copy the entire directory (binary + data/ folder), and start it on the new machine. That's it.

What Data Is Stored Where

DataStored OnDetails
Channels, categories, permissionsYour servercommunity.db
Groups and rolesYour servercommunity.db
Server settingsYour servercommunity.db
Chat messagesYour servercontent.db
Uploaded filesYour serverdata/files/
Custom emojisYour serverdata/emojis/
Soundboard clipsYour serverdata/soundboard/
Activity logYour serveraudit.db (not backed up, safe to delete)
Announcements, events, pollsYour servercontent.db
BadgesYour servercontent.db
User accounts & authenticationGamevox cloudLogin, registration, sessions
Subscription & billingGamevox cloudTier, payment status
Banner settingsGamevox cloudServer banner images
Access control rulesGamevox cloudWho can join the server

Custom Storage Location

Want to store uploaded files or backups on a different drive? Use a start script to set environment variables before launching the server. Download a template and edit the paths:

Windows

Save this as start-gamevox.bat next to gamevox-self-hosted-server.exe and double-click it to start:

@echo off :: Gamevox Self-Hosted Start Script :: Edit the paths below to store files or backups on a different drive. :: Leave blank to use the default (data/files/ and data/backups/). :: set FILES_DIR=D:\gamevox-files :: set BACKUPS_DIR=D:\gamevox-backups echo Starting Gamevox Self-Hosted Server... gamevox-self-hosted-server.exe pause

Linux / macOS

Save this as start-gamevox.sh, run chmod +x start-gamevox.sh, then ./start-gamevox.sh:

#!/bin/bash # Gamevox Self-Hosted Start Script # Edit the paths below to store files or backups on a different location. # Leave commented out to use the default (data/files/ and data/backups/). # export FILES_DIR=/mnt/storage/gamevox-files # export BACKUPS_DIR=/mnt/storage/gamevox-backups echo "Starting Gamevox Self-Hosted Server..." ./gamevox-self-hosted-server
Uncomment and edit the lines to redirect storage. The server will create the directories automatically if they don't exist. If you're moving existing files, stop the server first and copy the contents of data/files/ or data/backups/ to the new location before restarting.

Troubleshooting

Can't connect to the server

Voice connects but no audio

Server won't start

Update failed

Database is corrupted

LAN & Event Use

GameVox self-hosted is a great fit for LAN parties, tournaments, and events. While the server and clients still need an internet connection for the GameVox API and authentication, all the bandwidth-heavy traffic — voice, video, and screen share — stays entirely on your local network. The built-in SFU (Selective Forwarding Unit) runs on the host machine, so media never leaves the LAN.

What stays on the LAN

On a LAN, WebRTC candidates resolve to local IP addresses directly. There are no STUN servers, no TURN relays, and no NAT traversal needed. Media packets travel the shortest possible path — from one machine on the switch to another. This means:

What still needs internet

The server maintains a control channel connection to GameVox cloud, and clients authenticate through the GameVox API. This means your venue needs some form of internet access, but it can be minimal — even a basic mobile hotspot is enough, since only lightweight API calls go over the wire. All the heavy media traffic stays local.

Setting up for a LAN event

  1. Run the server on any machine connected to the LAN that also has internet access (even a basic connection is fine).
  2. Clients connect to the server's LAN IP (e.g., 192.168.1.50). No port forwarding needed on a flat LAN — just make sure the host firewall allows TCP 8088 and UDP 7070.
  3. Each client needs internet for login — they authenticate with GameVox cloud, then all voice/video/chat traffic goes directly to the LAN server.
No port forwarding needed. On a LAN, all machines can reach each other directly. You only need to ensure the server machine's OS firewall (Windows Firewall or Linux iptables/ufw) allows inbound connections on TCP 8088 and UDP 7070.

Traffic breakdown

Traffic Path
Voice & video streams LAN only (UDP to server)
Screen sharing LAN only (UDP to server)
Chat messages LAN only (WebSocket to server)
File uploads & downloads LAN only (HTTP to server)
Soundboard, emojis, polls LAN only (WebSocket to server)
User authentication Internet (GameVox cloud)
Server control channel Internet (GameVox cloud)
Minimal internet is enough. Only authentication and the server's control channel go over the internet — both are lightweight API calls. A phone hotspot or basic connection is plenty. All the bandwidth-intensive media stays on your LAN.