Skip to content

Commit

Permalink
Updated .dockerignore to remove unneeded files from container build. …
Browse files Browse the repository at this point in the history
…Updated docker-compose.yml with new environment variables. Updated README.md. Updated project description. Replaced DISABLE_AUTH with AUTH_DISABLE. Replaced SECURITY_CODE with AUTH_PASSWORD. Implemented AUTH_TOKEN for api authentication. Added migration guide.
  • Loading branch information
glenndehaan committed Aug 21, 2024
1 parent f6c04e0 commit 3ba8d33
Show file tree
Hide file tree
Showing 9 changed files with 94 additions and 50 deletions.
8 changes: 8 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,11 @@ npm-debug.log

# Build files
public/dist/

# Project files
.github
.editorconfig
.gitignore
docker-compose.yml
Dockerfile
README.md
109 changes: 72 additions & 37 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,33 +1,35 @@
# UniFi Voucher Site

A small UniFi Voucher Site for simple voucher creation
UniFi Voucher Site is a web-based platform for generating and managing UniFi network guest vouchers

[![Image Size](https://img.shields.io/docker/image-size/glenndehaan/unifi-voucher-site)](https://hub.docker.com/r/glenndehaan/unifi-voucher-site)

![Vouchers Overview - Desktop](https://github.com/glenndehaan/unifi-voucher-site/assets/7496187/b0d5c208-2ac7-444e-977d-31287ff19e8b)

> Upgrading from 2.x to 3.x? Please take a look at the [migration guide](#migration-from-2x-to-3x)
## Features

- **Voucher Management**: Create, view, and manage vouchers with customizable options for expiration, data limits, and speeds.
- **Web and API Services**: Access the service via a web interface or integrate with other systems using a REST API.
- **Docker Support**: Easily deploy using Docker, with customizable environment settings.
- **Home Assistant Add-on**: Seamlessly integrate with Home Assistant for centralized management.
- **Receipt Printing**: Supports printing vouchers with 80mm thermal printers.
- **Email Functionality**: Automatically send vouchers via SMTP.

## Structure

- Javascript
- NodeJS
- ExpressJS
- EJS
- Node UniFi
- TailwindCSS
- NodeMailer
- PDFKit

## Development Usage

- Install NodeJS 20.0 or higher.
- Run `npm ci` in the root folder
- Run `npm start` & `npm run tailwind` in the root folder
## Installation

Then open up your favorite browser and go to http://localhost:3000/

## Build Usage

- Install NodeJS 20.0 or higher.
- Run `npm ci` in the root folder
- Run `npm run build` in the root folder

## Docker
### Docker

- Code from master is build by Docker Hub
- Builds can be pulled by using this command: `docker pull glenndehaan/unifi-voucher-site`
Expand All @@ -51,10 +53,12 @@ services:
UNIFI_PASSWORD: 'password'
# The UniFi Site ID
UNIFI_SITE_ID: 'default'
# The 'password' used to log in to the voucher portal and used as Bearer token for the API
SECURITY_CODE: '0000'
# The password used to log in to the voucher portal Web UI
AUTH_PASSWORD: '0000'
# The Bearer token used for the API
AUTH_TOKEN: '00000000-0000-0000-0000-000000000000'
# Disables the login/authentication for the portal and API
DISABLE_AUTH: 'false'
AUTH_DISABLE: 'false'
# Voucher Types, format: expiration in minutes (required),single-use or multi-use vouchers value - '0' is for multi-use - '1' is for single-use (optional),upload speed limit in kbps (optional),download speed limit in kbps (optional),data transfer limit in MB (optional)
# To skip a parameter just but nothing in between the comma's
# After a voucher type add a semicolon, after the semicolon you can start a new voucher type
Expand Down Expand Up @@ -85,6 +89,30 @@ services:
> Note: When creating a Local UniFi account ensure you give 'Full Management' access rights to the Network controller. The 'Hotspot Role' won't give access to the API and therefore the application will throw errors.
### Home Assistant Add-on
For users of Home Assistant, we provide a dedicated add-on to seamlessly integrate the UniFi Voucher Site with your Home Assistant instance. This add-on simplifies the setup process and allows you to manage UniFi vouchers directly from your Home Assistant dashboard.
[![Open your Home Assistant instance and show the add add-on repository dialog with a specific repository URL pre-filled.](https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Fglenndehaan%2Fha-addons)
#### Manual Installation
To install the UniFi Voucher Site add-on for Home Assistant, follow these steps:
1. Open the Supervisor panel in your Home Assistant instance.
2. Navigate to the "Add-on Store."
3. Add our repository to the list of repositories by clicking the three dots in the upper-right corner, then selecting "Repositories," and entering the URL of our repository: `https://github.com/glenndehaan/ha-addons`.
4. Once the repository is added, you will find the "UniFi Voucher Site" add-on in the add-on store. Click on it.
5. Click "Install" and wait for the installation to complete.

## Development

- Install NodeJS 20.0 or higher.
- Run `npm ci` in the root folder
- Run `npm start` & `npm run tailwind` in the root folder

Then open up your favorite browser and go to http://localhost:3000/

## Services

The project consists of two main services: Web and API.
Expand Down Expand Up @@ -166,7 +194,7 @@ the different endpoints available in the API:
```

> This endpoint is protected by a security mechanism. To access it, users need to include a bearer token in the
request authorization header. The token must match the value of the `SECURITY_CODE` environment variable. Without
request authorization header. The token must match the value of the `AUTH_TOKEN` environment variable. Without
this token, access to the endpoint will be denied.

4. **`/api/vouchers`**
Expand Down Expand Up @@ -205,25 +233,9 @@ the different endpoints available in the API:
```

> This endpoint is protected by a security mechanism. To access it, users need to include a bearer token in the
request authorization header. The token must match the value of the `SECURITY_CODE` environment variable. Without
request authorization header. The token must match the value of the `AUTH_TOKEN` environment variable. Without
this token, access to the endpoint will be denied.

## Home Assistant Add-on

For users of Home Assistant, we provide a dedicated add-on to seamlessly integrate the UniFi Voucher Site with your Home Assistant instance. This add-on simplifies the setup process and allows you to manage UniFi vouchers directly from your Home Assistant dashboard.

[![Open your Home Assistant instance and show the add add-on repository dialog with a specific repository URL pre-filled.](https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Fglenndehaan%2Fha-addons)

### Installation

To install the UniFi Voucher Site add-on for Home Assistant, follow these steps:

1. Open the Supervisor panel in your Home Assistant instance.
2. Navigate to the "Add-on Store."
3. Add our repository to the list of repositories by clicking the three dots in the upper-right corner, then selecting "Repositories," and entering the URL of our repository: `https://github.com/glenndehaan/ha-addons`.
4. Once the repository is added, you will find the "UniFi Voucher Site" add-on in the add-on store. Click on it.
5. Click "Install" and wait for the installation to complete.

## Print Functionality

The UniFi Voucher Site application includes built-in support for printing vouchers using 80mm receipt printers, offering a convenient way to distribute vouchers in physical format.
Expand Down Expand Up @@ -304,6 +316,29 @@ Once the SMTP environment variables are configured, the email feature will be av
### Voucher Details (Mobile)
![Voucher Details - Mobile](https://github.com/glenndehaan/unifi-voucher-site/assets/7496187/28b8f97b-8042-4e6d-b1dc-8386860a1e39)

## Migration Guide

### Migration from 2.x to 3.x

When upgrading from 2.x to 3.x, the following changes need to be made:

1. **`SECURITY_CODE`** has been replaced by **`AUTH_PASSWORD`**.
- Update your environment variables configuration to use `AUTH_PASSWORD` instead of `SECURITY_CODE`.

2. **`DISABLE_AUTH`** has been replaced by **`AUTH_DISABLE`**.
- Replace `DISABLE_AUTH` with `AUTH_DISABLE` in your environment variables.

3. The API bearer token now uses a dedicated variable **`AUTH_TOKEN`**.
- Ensure that your API token is now stored under the `AUTH_TOKEN` variable and update your implementations to used this new token instead of the `SECURITY_CODE`.

### Migration from 1.x to 2.x

No migration steps are required.

### Migration from Versions Prior to v1

Versions before v1 do not have a direct migration path. If you are using a version earlier than v1, a fresh installation is required. Be sure to back up any important data before proceeding with a reinstall.

## License

MIT
5 changes: 3 additions & 2 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ services:
UNIFI_USERNAME: 'admin'
UNIFI_PASSWORD: 'password'
UNIFI_SITE_ID: 'default'
SECURITY_CODE: '0000'
DISABLE_AUTH: 'false'
AUTH_PASSWORD: '0000'
AUTH_TOKEN: '00000000-0000-0000-0000-000000000000'
AUTH_DISABLE: 'false'
VOUCHER_TYPES: '480,1,,,;'
VOUCHER_CUSTOM: 'true'
SERVICE_WEB: 'true'
Expand Down
4 changes: 2 additions & 2 deletions middlewares/authorization.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ const jwt = require('../modules/jwt');
/**
* Global variables
*/
const authDisabled = (process.env.DISABLE_AUTH === 'true') || false;
const authDisabled = (process.env.AUTH_DISABLE === 'true') || false;

/**
* Verifies if a user is signed in
Expand Down Expand Up @@ -68,7 +68,7 @@ module.exports = {
}

// Check if password is correct
const passwordCheck = req.headers.authorization === `Bearer ${(process.env.SECURITY_CODE || "0000")}`;
const passwordCheck = req.headers.authorization === `Bearer ${(process.env.AUTH_TOKEN || "0000")}`;
if (!passwordCheck) {
res.status(403).json({
error: 'Forbidden',
Expand Down
2 changes: 1 addition & 1 deletion public/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "UniFi Voucher",
"short_name": "Voucher",
"description": "UniFi Voucher",
"description": "UniFi Voucher Site is a web-based platform for generating and managing UniFi network guest vouchers",
"icons": [
{
"src": "./images/icon/logo_192x192.png",
Expand Down
4 changes: 2 additions & 2 deletions server.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ const voucherTypes = types(config('voucher_types') || process.env.VOUCHER_TYPES
const voucherCustom = config('voucher_custom') !== null ? config('voucher_custom') : process.env.VOUCHER_CUSTOM ? process.env.VOUCHER_CUSTOM !== 'false' : true;
const webService = process.env.SERVICE_WEB ? process.env.SERVICE_WEB !== 'false' : true;
const apiService = config('service_api') || (process.env.SERVICE_API === 'true') || false;
const authDisabled = (process.env.DISABLE_AUTH === 'true') || false;
const authDisabled = (process.env.AUTH_DISABLE === 'true') || false;
const smtpFrom = config('smtp_from') || process.env.SMTP_FROM || '';
const smtpHost = config('smtp_host') || process.env.SMTP_HOST || '';
const smtpPort = config('smtp_port') || process.env.SMTP_PORT || 25;
Expand Down Expand Up @@ -199,7 +199,7 @@ if(webService) {
return;
}

const passwordCheck = req.body.password === (process.env.SECURITY_CODE || "0000");
const passwordCheck = req.body.password === (process.env.AUTH_PASSWORD || "0000");

if(!passwordCheck) {
res.cookie('flashMessage', JSON.stringify({type: 'error', message: 'Password Invalid!'}), {httpOnly: true, expires: new Date(Date.now() + 24 * 60 * 60 * 1000)}).redirect(302, `${req.headers['x-ingress-path'] ? req.headers['x-ingress-path'] : ''}/login`);
Expand Down
4 changes: 2 additions & 2 deletions template/404.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimal-ui">

<meta name="description" content="UniFi Voucher">
<meta name="description" content="UniFi Voucher Site is a web-based platform for generating and managing UniFi network guest vouchers">
<meta name="author" content="Glenn de Haan">

<meta property="og:title" content="Not Found | UniFi Voucher"/>
<meta property="og:type" content="website"/>
<meta property="og:description" content="UniFi Voucher"/>
<meta property="og:description" content="UniFi Voucher Site is a web-based platform for generating and managing UniFi network guest vouchers"/>

<link rel="manifest" href="<%= baseUrl %>/manifest.json">
<link rel="shortcut icon" href="<%= baseUrl %>/images/favicon.ico">
Expand Down
4 changes: 2 additions & 2 deletions template/login.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimal-ui">

<meta name="description" content="UniFi Voucher">
<meta name="description" content="UniFi Voucher Site is a web-based platform for generating and managing UniFi network guest vouchers">
<meta name="author" content="Glenn de Haan">

<meta property="og:title" content="Login | UniFi Voucher"/>
<meta property="og:type" content="website"/>
<meta property="og:description" content="UniFi Voucher"/>
<meta property="og:description" content="UniFi Voucher Site is a web-based platform for generating and managing UniFi network guest vouchers"/>

<link rel="manifest" href="<%= baseUrl %>/manifest.json">
<link rel="shortcut icon" href="<%= baseUrl %>/images/favicon.ico">
Expand Down
4 changes: 2 additions & 2 deletions template/voucher.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimal-ui">

<meta name="description" content="UniFi Voucher">
<meta name="description" content="UniFi Voucher Site is a web-based platform for generating and managing UniFi network guest vouchers">
<meta name="author" content="Glenn de Haan">

<meta property="og:title" content="Voucher | UniFi Voucher"/>
<meta property="og:type" content="website"/>
<meta property="og:description" content="UniFi Voucher"/>
<meta property="og:description" content="UniFi Voucher Site is a web-based platform for generating and managing UniFi network guest vouchers"/>

<link rel="manifest" href="<%= baseUrl %>/manifest.json">
<link rel="shortcut icon" href="<%= baseUrl %>/images/favicon.ico">
Expand Down

0 comments on commit 3ba8d33

Please sign in to comment.