mirror of
https://github.com/etiennecollin/unifi-voucher-manager.git
synced 2025-11-02 13:03:17 +00:00
9.2 KiB
9.2 KiB
WiFi Voucher Manager
A modern, touch-friendly web application for managing WiFi vouchers on UniFi controllers. Perfect for businesses, cafes, hotels, and home networks that need to provide guest WiFi access.
✨ Features
🎫 Voucher Management
- Quick Create - Generate guest vouchers with preset durations (1 hour to 1 week)
- Custom Create - Full control over voucher parameters:
- Custom name
- Duration (minutes to days)
- Guest count limits
- Data usage limits
- Upload/download speed limits
- View All Vouchers - Browse and search existing vouchers by name
- Search Vouchers - Search vouchers by name
- Bulk Operations - Select and delete multiple vouchers
- Auto-cleanup - Remove expired vouchers with a single click
🎨 Modern Interface
- Touch-Friendly – Optimized for tablet, mobile, and desktop.
- Dark/Light Mode – Follows system preference, with manual override.
- Responsive Design - Works seamlessly across all screen sizes
- Smooth Animations – Semantic transitions for polished UX.
- Real-time Notifications - Instant feedback for all operations
🔧 Technical Features
- Docker Ready - Easy deployment with Docker Compose and included healthcheck
- UniFi Integration - Direct API connection to UniFi controllers
🏗 Architecture
This application is built with a clear separation of concerns:
- Frontend: A Next.js 14 application (TypeScript + Tailwind CSS) that provides a responsive, touch-friendly UI.
- Backend: A Rust service powered by Axum that exposes a JSON API.
- UniFi Controller: The Axum backend securely communicates with your UniFi controller’s API, isolating API keys from the user-facing frontend.
{ DOCKER }
[User Browser] <––– HTTP/HTTPS –––> [Next.js Frontend] <––– HTTP/HTTPS –––> [Axum Rust Backend] <––– HTTPS –––> [UniFi Controller]
- The frontend only knows about the backend API endpoint.
- All UniFi credentials and site IDs are stored on the backend.
- This isolation limits the scope of user actions and protects sensitive API keys.
🚀 Quick Start
🐳 Using Docker Compose (Recommended)
- Create the configuration files
# Download the compose file curl -o compose.yaml https://raw.githubusercontent.com/etiennecollin/unifi-voucher-manager/main/compose.yaml - Configure your environment
- Set the required environment variables (see Environment Variables) in the
compose.yamlfile.
- Set the required environment variables (see Environment Variables) in the
- Start the application
docker compose up -d --force-recreate - Access the interface
- Open your browser to
http://localhost:3000.
- Open your browser to
⚙️ Without Docker
-
Install the dependencies
rust >= 1.88.0nodejs >= 24.3.0npm >= 11.4.2
-
Clone the repository
git clone https://github.com/etiennecollin/unifi-voucher-manager -
Configure your environment
- In your shell, set the required environment variables (see Environment Variables)
or set them in a
.envfile at the root of the repository and use thedotenvfeature of the rust backend.
- In your shell, set the required environment variables (see Environment Variables)
or set them in a
-
Start the frontend and backend
# Backend (without using a .env file) cd backend && cargo run --release # Backend (using a .env file) cd backend && cargo run --release --features dotenv # Frontend (development) cd frontend && npm install && npm run dev # Frontend (release) cd frontend && npm ci && npm run build && npm run start -
Access the interface
- Open your browser to
http://localhost:3000.
- Open your browser to
⚙️ Configuration
Environment Variables
| Variable | Type | Description | Example (default if optional) |
|---|---|---|---|
UNIFI_CONTROLLER_URL |
Required | URL to your UniFi controller with protocol. | https://unifi.example.com:8443 |
UNIFI_API_KEY |
Required | API Key for your UniFi controller. | abc123... |
UNIFI_SITE_ID |
Optional | Site ID of your UniFi controller. Using the value default, the backend will try to fetch the ID of the default site. |
default (default) |
FRONTEND_BIND_HOST |
Optional | Address on which the frontend server binds. | 0.0.0.0 (default) |
FRONTEND_BIND_PORT |
Optional | Port on which the frontend server binds. | 3000 (default) |
FRONTEND_TO_BACKEND_URL |
Optional | URL where the frontend will make its API requests to the backend. | http://127.0.0.1 (default) |
BACKEND_BIND_HOST |
Optional | Address on which the server binds. | 127.0.0.1 (default) |
BACKEND_BIND_PORT |
Optional | Port on which the backend server binds. | 8080 (default) |
TIMEZONE |
Optional | Server timezone. | UTC (default) |
RUST_LOG |
Optional | Log level of the Rust backend. | info(default) |
Getting UniFi API Credentials
- Access your UniFi Controller
- Navigate to Settings -> Control Plane -> Integration
- Create a new API key by giving it a name and an expiration.
- Find your Site ID in the controller URL or on unifi.ui.com
🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Development Guidelines
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes with proper TypeScript types
- Update documentation as needed
- Commit changes:
git commit -m 'feat: Add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open a Pull Request
Code Style
- Use TypeScript for all new code
- Follow the existing Tailwind CSS semantic utility patterns
- Ensure components are touch-friendly and responsive
- Add proper error handling and user feedback
🐛 Troubleshooting
Common Issues
Vouchers not appearing or connection issue to UniFi controller
- Verify
UNIFI_CONTROLLER_URLis correct and accessible - Verify
UNIFI_SITE_IDmatches your controller's site - Check if UniFi controller is running and reachable
- Ensure API key is valid
- Ensure the site has hotspot/guest portal enabled
Application won't start
- Check all environment variables are set
- Verify Docker container has network access to UniFi controller
- Check logs:
docker compose logs unifi-voucher-manager
Getting Help
- Check the Issues page
- Create a new issue with detailed information about your problem
- Include relevant logs and environment details (redact sensitive information)
⭐ If this project helped you, please consider giving it a star!
