Skip to content

w1ve/MumbleManager

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

9 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸŽ™οΈ MumbleManager

A modern web-based administration interface for Mumble (Murmur) voice servers

License: MIT .NET React TypeScript Docker SQLite

Manage your Mumble servers, channels, and users from any browser β€” no command-line access required.


Features β€’ Tech Stack β€’ Quick Start β€’ Configuration β€’ Development β€’ Security β€’ License


✨ Features

Feature Description
πŸ–₯️ Virtual Server Admin View, start, stop, and configure Murmur virtual servers
🌲 Channel Tree Editor Browse, create, rename, move, and delete channels live
πŸ“‹ Channel Templates Save channel layouts and apply them to any server in one click
πŸ” SSH Host Management Reach remote Mumble servers safely through SSH tunnels
πŸ‘₯ User Management Create, promote, demote, reset passwords, and delete app accounts
πŸ“‘ Real-Time Status SignalR-powered live connection state β€” no polling
πŸ“§ Email Notifications HTML email on account events and fatal errors (optional)
πŸ”‘ JWT Authentication Stateless token auth with 8-hour expiry and per-browser session isolation
πŸ“– Swagger UI Full OpenAPI docs available in Development mode

πŸ—οΈ Tech Stack

Backend

  • ⚑ ASP.NET Core 9.0 β€” Minimal APIs
  • πŸ—„οΈ SQLite + Entity Framework Core 9
  • πŸ” JWT Bearer authentication
  • πŸ“‘ ASP.NET Core SignalR
  • 🧊 ZeroC ICE 3.7 (Murmur protocol)
  • πŸ”’ SSH.NET (tunnel to remote servers)
  • πŸ“§ MailKit (SMTP / Gmail)

Frontend

  • βš›οΈ React 18 + TypeScript
  • ⚑ Vite 5
  • 🐻 Zustand (state management)
  • πŸ“‘ @microsoft/signalr
  • 🎨 CSS Modules

Infrastructure

  • 🐳 Docker (multi-stage build)
  • 🌐 Nginx reverse proxy + TLS
  • πŸ“¦ Docker Compose

πŸ›οΈ Architecture

Browser  (HTTPS / WSS)
    β”‚
    β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Nginx  :443        β”‚  ← TLS termination, HTTPβ†’HTTPS redirect
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚ HTTP :5000
           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  ASP.NET Core  β€”  MumbleManager.Api                  β”‚
β”‚                                                      β”‚
β”‚  REST endpoints  ──  JWT middleware                  β”‚
β”‚  SignalR hub  (/hubs/status)                         β”‚
β”‚  Static files  (compiled React SPA)                  β”‚
β”‚                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚  SQLite DB  β”‚    β”‚  SSH Tunnel β†’ Murmur ICE     β”‚ β”‚
β”‚  β”‚  (EF Core)  β”‚    β”‚  (ZeroC ICE 3.7, port 6502)  β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

The React SPA is compiled at Docker build time and served as static files by the .NET process β€” there is no separate Node server in production.


πŸš€ Quick Start

Prerequisites

  • Linux VPS running Ubuntu 22.04+
  • A domain name pointed at your server's IP
  • Ports 80 and 443 open in your firewall
  • A running Murmur server with ZeroC ICE enabled (see Enabling ICE)

1 β€” Clone the repository

git clone https://github.com/YOUR_USERNAME/mumblemanager.git
cd mumblemanager

2 β€” Obtain TLS certificates

sudo apt install certbot

# Stop anything on port 80 first, then:
sudo certbot certonly --standalone -d your.domain.com

# Place certificates where Nginx expects them:
cp /etc/letsencrypt/live/your.domain.com/fullchain.pem nginx/certs/fullchain.pem
cp /etc/letsencrypt/live/your.domain.com/privkey.pem   nginx/certs/privkey.pem
chmod 600 nginx/certs/privkey.pem

3 β€” Configure your environment

cp .env.example .env
nano .env      # Fill in your domain, JWT secret, and email settings

4 β€” Set your domain in Nginx

Edit nginx/nginx.conf β€” replace both occurrences of YOUR_DOMAIN.com with your actual domain.

5 β€” Set your domain & secrets in docker-compose.yml

Edit docker-compose.yml and replace all YOUR_* placeholders.

6 β€” Deploy

chmod +x deploy.sh
sudo ./deploy.sh

deploy.sh will install Docker (if needed), build the image, start the stack, and confirm a healthy start. Your app will be live at https://your.domain.com. πŸŽ‰


Manual Docker Compose

docker compose build
docker compose up -d
docker compose logs -f

βš™οΈ Configuration

All configuration is passed as environment variables to the app container.

Variable Required Description
Jwt__Secret βœ… JWT signing key β€” minimum 32 random characters.
Generate: openssl rand -base64 48
AllowedOrigins βœ… Comma-separated CORS origins, e.g. https://your.domain.com
ConnectionStrings__Default βœ… SQLite path. Default: Data Source=/data/mumblemanager.db
Email__SmtpHost βž– SMTP server. Default: smtp.gmail.com
Email__SmtpPort βž– SMTP port (STARTTLS). Default: 587
Email__From βž– Sender email address
Email__FromName βž– Sender display name. Default: MumbleManager
Email__AppPassword βž– Gmail App Password. Email is silently disabled when empty.
Email__AdminAddress βž– Address for admin notifications
ASPNETCORE_ENVIRONMENT βž– Set to Development to enable Swagger at /swagger

πŸ’‘ Gmail App Password: Enable 2-Factor Authentication on your Google account, then generate an App Password at myaccount.google.com/apppasswords.


πŸ”‘ First Login & Initial Setup

On first start, MumbleManager seeds an admin account automatically.

Default credentials β€” change these immediately:

Field Value
Username admin
Password (value set in DbSeeder.cs before building)

After logging in, use User Management to create additional users and change the admin password via Change Password.

Adding a Mumble Server

  1. Click Add Host in the Hosts panel
  2. Enter your SSH host details and the ICE Secret from your murmur.ini
  3. Click Connect β€” MumbleManager opens an SSH tunnel and connects via ICE

Enabling ICE on Murmur

In murmur.ini (or mumble-server.ini):

ice=tcp -h 127.0.0.1 -p 6502
icesecretread=YOUR_ICE_SECRET
icesecretwrite=YOUR_ICE_SECRET

Restart Murmur after saving. MumbleManager connects through the SSH tunnel, so Murmur's ICE port never needs to be exposed publicly.


πŸ’» Local Development

Backend

cd backend
dotnet restore

ASPNETCORE_ENVIRONMENT=Development \
  Jwt__Secret="dev-secret-key-at-least-32-characters!!" \
  dotnet run
# API + Swagger at http://localhost:5000

Frontend

cd frontend
npm install
npm run dev
# Vite dev server at http://localhost:5173
# Proxies /api and /hubs β†’ http://localhost:5000 automatically

Database Migrations

cd backend
dotnet tool install --global dotnet-ef   # first time only
dotnet ef migrations add YourMigrationName

Schema is applied automatically on startup via DbSeeder.SeedAsync().


πŸ“ Project Structure

mumblemanager/
β”œβ”€β”€ backend/
β”‚   β”œβ”€β”€ Data/                    # EF Core DbContext + migrations
β”‚   β”œβ”€β”€ Endpoints/               # Minimal API route handlers
β”‚   β”‚   β”œβ”€β”€ AuthEndpoints.cs
β”‚   β”‚   β”œβ”€β”€ ChannelEndpoints.cs
β”‚   β”‚   β”œβ”€β”€ ConnectionEndpoints.cs
β”‚   β”‚   β”œβ”€β”€ HostEndpoints.cs
β”‚   β”‚   β”œβ”€β”€ ServerEndpoints.cs
β”‚   β”‚   β”œβ”€β”€ TemplateEndpoints.cs
β”‚   β”‚   └── UserEndpoints.cs
β”‚   β”œβ”€β”€ Generated/               # Auto-generated ZeroC ICE bindings
β”‚   β”œβ”€β”€ Hubs/StatusHub.cs        # SignalR real-time hub
β”‚   β”œβ”€β”€ Models/                  # EF entities + DTOs
β”‚   β”œβ”€β”€ Services/
β”‚   β”‚   β”œβ”€β”€ AuthService.cs       # PBKDF2 hashing + JWT generation
β”‚   β”‚   β”œβ”€β”€ DbSeeder.cs          # Seeds initial admin account
β”‚   β”‚   β”œβ”€β”€ EmailService.cs      # SMTP via MailKit
β”‚   β”‚   β”œβ”€β”€ HostSession.cs       # Per-user ICE session registry
β”‚   β”‚   β”œβ”€β”€ MumbleServerIceService.cs
β”‚   β”‚   β”œβ”€β”€ MurmurLegacyIceService.cs
β”‚   β”‚   β”œβ”€β”€ SshTunnelService.cs  # SSH port forwarding
β”‚   β”‚   └── MurmurVersion.cs     # Auto version detection
β”‚   β”œβ”€β”€ appsettings.json
β”‚   └── Program.cs
β”‚
β”œβ”€β”€ frontend/src/
β”‚   β”œβ”€β”€ api/index.ts             # Typed API client
β”‚   β”œβ”€β”€ components/              # React UI components
β”‚   β”œβ”€β”€ hooks/useSignalR.ts      # SignalR connection hook
β”‚   β”œβ”€β”€ store/                   # Zustand global state
β”‚   └── types/index.ts           # Shared TypeScript types
β”‚
β”œβ”€β”€ nginx/
β”‚   β”œβ”€β”€ nginx.conf               # Reverse proxy + TLS config
β”‚   └── certs/                   # TLS certificates (gitignored)
β”‚
β”œβ”€β”€ .env.example                 # Environment variable template
β”œβ”€β”€ Dockerfile                   # Multi-stage build
β”œβ”€β”€ docker-compose.yml
β”œβ”€β”€ deploy.sh                    # One-shot Ubuntu deployment
└── README.md

πŸ”’ Security Notes

⚠️ Please read before deploying to production.

  • Change the default admin password immediately after first login
  • Generate a strong JWT secret β€” at minimum 48 random bytes: openssl rand -base64 48
  • Never commit nginx/certs/ or your .env file β€” both are gitignored
  • SSH credentials are stored in the SQLite database; protect /data/mumblemanager.db with appropriate filesystem permissions
  • Passwords are hashed with PBKDF2 / SHA-256, 100,000 iterations, random 16-byte salt
  • The .NET container is not exposed directly to the internet β€” all traffic passes through Nginx

🀝 Contributing

Pull requests are welcome! For major changes, please open an issue first to discuss what you'd like to change.

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/your-feature
  3. Commit your changes: git commit -m 'Add some feature'
  4. Push to the branch: git push origin feature/your-feature
  5. Open a Pull Request

πŸ“Έ Screenshots

After Login

Virtual Server Config

Channel Editor

πŸ“„ License

Copyright Β© 2026 Gerald Hull, W1VE

Released under the MIT License β€” see the LICENSE file for details.


Built with ❀️ for the amateur radio and open-source communities.

About

A modern web application to control Mumble servers -- both 1.4.x and 1.5.x versions

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages