-
Notifications
You must be signed in to change notification settings - Fork 84
deployment
github-actions[bot] edited this page Feb 11, 2026
·
7 revisions
The recommended way to run Muximux in production.
# docker-compose.yml
services:
muximux:
image: ghcr.io/mescon/muximux:latest
ports:
- "8080:8080"
volumes:
- ./data:/app/data
restart: unless-stopped
# Optional: for OIDC secrets
environment:
- OIDC_CLIENT_SECRET=your-secret-hereMount a directory to /app/data. This stores:
-
config.yaml-- Configuration -
themes/-- Custom themes -
icons/-- Icon caches and custom uploads
The Docker image includes a built-in health check (GET /api/health every 30s).
docker compose pull
docker compose up -dFor running Muximux as a native binary on Linux.
Create /etc/systemd/system/muximux.service:
[Unit]
Description=Muximux - Web Application Portal
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=muximux
Group=muximux
WorkingDirectory=/opt/muximux
ExecStart=/opt/muximux/muximux --config /opt/muximux/data/config.yaml
Restart=on-failure
RestartSec=5
# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/muximux/data
PrivateTmp=true
[Install]
WantedBy=multi-user.target# Create user
sudo useradd -r -s /bin/false muximux
# Create directories
sudo mkdir -p /opt/muximux/data
sudo chown -R muximux:muximux /opt/muximux
# Copy binary
sudo cp muximux /opt/muximux/
# Create config
sudo cp config.example.yaml /opt/muximux/data/config.yaml
sudo chown muximux:muximux /opt/muximux/data/config.yaml
# Enable and start
sudo systemctl daemon-reload
sudo systemctl enable muximux
sudo systemctl start muximux
# Check status
sudo systemctl status muximux
sudo journalctl -u muximux -fIf you run Muximux behind Nginx, Traefik, or Caddy (external), you do not need Muximux's built-in TLS. Use auth.method: none or forward_auth depending on your setup.
server {
listen 443 ssl;
server_name muximux.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}services:
muximux:
image: ghcr.io/mescon/muximux:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.muximux.rule=Host(`muximux.example.com`)"
- "traefik.http.routers.muximux.tls.certresolver=letsencrypt"
- "traefik.http.services.muximux.loadbalancer.server.port=8080"
volumes:
- ./data:/app/data- Same network as apps: Muximux needs to reach your apps (for health checks and the built-in reverse proxy). In Docker, use the same Docker network or host networking.
- WebSocket support: If running behind an external reverse proxy, make sure it supports WebSocket connections (needed for real-time health updates).
- Ports: By default, only port 8080 needs to be exposed. If using auto-HTTPS with a domain, ports 80 and 443 also need to be accessible.
Getting Started
Features
- Apps
- HTTP Actions
- Reverse Proxy
- Docker Discovery
- Navigation
- Split View
- Themes
- Keyboard Shortcuts
- Health Monitoring
- Icons
- Translations
Security
Identity provider guides
Operations