Fluxer is a free and open-source instant messaging and VoIP platform for friends, groups, and communities, providing messaging, communities, text and voice channels, media uploads, search, presence, and voice and video communication from a web-based interface. Fluxer ships an official Docker Compose stack that runs the web application, API, gateway, administration dashboard, messaging services, media services, PostgreSQL, Valkey, NATS, Meilisearch, SeaweedFS, LiveKit, and Caddy. This guide deploys Fluxer on a Linux server using that Docker Compose stack, exposes it over HTTPS with Caddy as a reverse proxy, and creates the owner account. By the end, you'll have a self-hosted Fluxer instance running securely at your domain with messaging and voice/video channels ready to use.
Set Up the Directory Structure and Environment Variables
This section covers creating a working directory for Fluxer, downloading the official Docker Compose files, and configuring the environment variables required by the application.
1. Create a new directory for Fluxer and move into it:
$ mkdir ~/fluxer
$ cd ~/fluxer
2. Download the official Docker Compose manifest:
$ curl -fsSLO https://raw.githubusercontent.com/fluxerapp/fluxer/3b1eb56713d59181823df284b9646c890d2a3cba/deploy/self-hosting/docker-compose.yml
3. Download the default Caddy configuration:
$ curl -fsSLO https://raw.githubusercontent.com/fluxerapp/fluxer/3b1eb56713d59181823df284b9646c890d2a3cba/deploy/self-hosting/Caddyfile
4. Download the LiveKit configuration:
$ curl -fsSLO https://raw.githubusercontent.com/fluxerapp/fluxer/3b1eb56713d59181823df284b9646c890d2a3cba/deploy/self-hosting/livekit.yaml
5. Download the example environment file and save it as .env:
$ curl -fsSL https://raw.githubusercontent.com/fluxerapp/fluxer/3b1eb56713d59181823df284b9646c890d2a3cba/deploy/self-hosting/.env.example -o .env
The Fluxer directory now contains the following files:
Caddyfile
docker-compose.yml
livekit.yaml
.env
These files define the Fluxer containers, public routing, voice services, and application configuration.
6. Open the .env file:
$ nano .env
Set the following variables at the beginning of the file. Replace fluxer.example.com with your Fluxer domain and admin@example.com with your email address.
FLUXER_DOMAIN=fluxer.example.com
FLUXER_CADDY_SITE_ADDRESS=fluxer.example.com
FLUXER_VAPID_EMAIL=admin@example.com
Save and close the file. FLUXER_DOMAIN defines the public Fluxer address. FLUXER_CADDY_SITE_ADDRESS specifies the hostname Caddy serves.
Generate Fluxer Secrets
Fluxer requires separate secrets for PostgreSQL, Meilisearch, object storage, internal RPC communication, the administration dashboard, media uploads, and LiveKit.
1. Run the following loop to generate random hexadecimal values and insert them into .env:
$ for key in POSTGRES_PASSWORD MEILI_MASTER_KEY FLUXER_S3_SECRET_KEY FLUXER_SUDO_MODE_SECRET FLUXER_CONNECTION_INITIATION_SECRET FLUXER_GATEWAY_RPC_AUTH_TOKEN FLUXER_MEDIA_PROXY_SECRET_KEY FLUXER_ADMIN_SECRET_KEY_BASE FLUXER_ADMIN_OAUTH_CLIENT_SECRET LIVEKIT_API_SECRET; do sed -i "s|^$key=.*|$key=$(openssl rand -hex 32)|" .env; done
2. Generate the media upload relay secret in Base64 format and insert it into the .env file:
$ sed -i "s|^FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64=.*|FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64=$(openssl rand -base64 32)|" .env
Generate VAPID Keys
Fluxer uses VAPID keys for web push notifications.
1. Add your user to the docker group to run Docker commands without sudo:
$ sudo usermod -aG docker $USER
2. Apply the group change to the current session:
$ newgrp docker
3. Generate a VAPID key pair using a temporary Node.js container:
$ docker run --rm node:24-alpine npx --yes web-push generate-vapid-keys --json
Your output contains two values: publicKey (VAPID public key) and privateKey (VAPID private key). Copy the value displayed after publicKey and privateKey.
4. Add the public key to .env:
$ sed -i 's|^FLUXER_VAPID_PUBLIC_KEY=.*|FLUXER_VAPID_PUBLIC_KEY=YOUR_VAPID_PUBLIC_KEY|' .env
Replace YOUR_VAPID_PUBLIC_KEY with the publicKey value from your output.
5. Add the private key to .env:
$ sed -i 's|^FLUXER_VAPID_PRIVATE_KEY=.*|FLUXER_VAPID_PRIVATE_KEY=YOUR_VAPID_PRIVATE_KEY|' .env
Replace YOUR_VAPID_PRIVATE_KEY with the privateKey value from your output.
6. Restrict access to the .env file so that only your account can read or modify it:
$ chmod 600 .env
The .env file contains the credentials and secrets for your Fluxer deployment. Do not upload it to a public repository or include its contents in screenshots.
7. Verify the public Fluxer settings:
$ grep -E '^(FLUXER_DOMAIN|FLUXER_CADDY_SITE_ADDRESS|FLUXER_VAPID_EMAIL)=' .env
Output:
FLUXER_DOMAIN=fluxer.example.com
FLUXER_CADDY_SITE_ADDRESS=fluxer.example.com
FLUXER_VAPID_EMAIL=admin@example.com
Deploy Fluxer Containers
This section covers validating the Docker Compose configuration, deploying the Fluxer containers, and verifying that all services initialize correctly.
1. Navigate to the Fluxer directory:
$ cd ~/fluxer
2. Validate the Docker Compose configuration:
$ docker compose config --quiet
The command returns no output when the Compose configuration is valid.
3. Download the Fluxer container images:
$ docker compose pull
Docker downloads the Fluxer application images and supporting services required by the stack.
4. Create and start the containers:
$ docker compose up -d
The first deployment can take several minutes while Docker downloads images and Fluxer initializes its application, database, search, object storage, and messaging services.
5. Verify the containers:
$ docker compose ps -a
Every service should show a status of Up, and services with a health check also show (healthy). The seaweedfs-init container exits after creating the required object-storage buckets — an exit code of 0 for this container is expected.
6. View the Fluxer API logs:
$ docker compose logs -f api
Press Ctrl+C after the API completes its startup process.
7. View recent logs from all Fluxer services:
$ docker compose logs --tail=100
8. If a container fails to start, view its logs using the service name:
$ docker compose logs SERVICE_NAME
Replace SERVICE_NAME with the failed service, such as api, gateway, or livekit.
Configure Caddy as a Reverse Proxy to Expose Fluxer
Fluxer's official Docker Compose stack includes Caddy as the reverse proxy. Caddy listens on ports 80 and 443, automatically provisions HTTPS certificates for the hostname defined by FLUXER_CADDY_SITE_ADDRESS, and forwards requests to the appropriate Fluxer containers. The API, gateway, media service, administration dashboard, LiveKit signaling, and web application are all available through the same public hostname.
1. Validate the Caddy configuration:
$ docker compose exec caddy caddy validate --config /etc/caddy/Caddyfile
A successful validation indicates that Caddy can load the configuration.
2. View the Caddy logs:
$ docker compose logs --tail=100 caddy
Caddy automatically requests and renews TLS certificates when fluxer.example.com resolves to your server and ports 80 and 443 are publicly reachable.
Access and Configure Fluxer
This section covers accessing the Fluxer web application, creating the initial owner account, and reviewing the main instance settings.
- Open
https://fluxer.example.comin your web browser. - The Fluxer Set Up Welcome page should appear. Select your preferred language from the Language menu and click Next to continue.
- Choose a theme for the Fluxer Admin interface and click Next to continue.
- The Create the administrator account page appears. Fluxer displays a message that the instance does not have any accounts yet and that the first account you create automatically becomes the administrator. Click Next to continue.
- Configure the administrator account. Enter all required information and click Next to create an account.
- Open a new tab in your web browser and access the Fluxer administration dashboard at
https://fluxer.example.com/admin. - Log in using the Fluxer account you created.
- Review the requested permissions required by the administration application. Keep the required scopes enabled and click Authorize.
- Fluxer redirects you to the Admin dashboard after authorization. The dashboard displays administrative tools in the left navigation menu.
Your Fluxer administrator account is now configured and ready to manage users, guilds, applications, moderation settings, and other instance-level features.
Next Steps
Fluxer is running with messaging, voice and video channels, and media sharing available to your users behind HTTPS. From here you can:
- Create additional guilds and channels, and invite members to your community
- Review moderation and permission settings from the admin dashboard
- Configure object storage retention and monitor SeaweedFS, Meilisearch, and LiveKit resource usage as usage grows
For the full guide with additional tips, visit the original article on Vultr Docs.
Top comments (0)