Easy Gate is a simple web application built in Go and React that acts as the home page for your self-hosted infrastructure. Services and notes are parsed from a JSON file in real-time (without restarting the application). Items can also be assigned to one or more groups to show them only to specific users (based on their IP addresses).
- Service and note parsing from a JSON file in real-time (without restarting the application).
- Service and note assignment to one or more groups to show items only to specific users (based on their IP addresses).
- Customizable theme.
- Run as dependecy free standalone executable or as a Docker image.
- Persistant data storage
- New section: Most popular
- New section: Announcement with calendar
- Additional/Improved UI components
- Extensive branding settings
- Minimal login for additional service filtering
In order to run Easy Gate as a standalone binary, you can build it from source code or download a pre-built binary from the latest release.
Build from source:
git clone https://github.com/r7wx/easy-gate.git
cd easy-gate
make
Run executable:
easy-gate <path to easy-gate.json>
If no command line argument is provided Easy Gate will search the configuration file in current directory.
You can deploy an instance of Easy Gate by using docker:
docker run -d --name=easy-gate \
-p 8080:8080 \
-v /path/to/easy-gate.json:/etc/easy-gate/easy-gate.json \
--restart unless-stopped \
r7wx/easy-gate:latest
You can run Easy Gate by using the provided docker-compose file:
services:
easy-gate:
image: r7wx/easy-gate:latest
build: .
container_name: easy-gate
restart: unless-stopped
ports:
- 8080:8080
volumes:
- ./easy-gate.json:/etc/easy-gate/easy-gate.json
docker-compose up
If you need to host Easy Gate behind an already running nginx instance (or other reverse proxies), you can use the docker-compose file in the examples directory:
services:
easy-gate:
image: r7wx/easy-gate:latest
container_name: easy-gate
expose:
- 8080
networks:
- nginx-net
volumes:
- ../easy-gate.json:/etc/easy-gate/easy-gate.json
nginx:
image: nginx:latest
container_name: nginx
ports:
- 80:80
networks:
- nginx-net
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
networks:
nginx-net:
driver: bridge
In order to correctly use the groups feature, the nginx instance (or your other reverse proxy) must be configured to use the X-Forwarded-For header:
[...]
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://easy-gate:8080;
}
[...]
It is also mandatory to set "behind_proxy" to true in easy-gate.json:
[...]
"behind_proxy": true,
[...]
You can find the complete docker-compose and nginx configuration files in the examples directory. The same logic applies to standalone and docker image deployments.
Easy gate can be configured by the easy-gate.json file. An example configuration is provided in the root directory of this repository (easy-gate.json).
- addr: IP address to listen on
- use_tls: If true, the application will use TLS
- cert_file: Path to the SSL certificate file (if TLS is enabled)
- key_file: Path to the SSL key file (if TLS is enabled)
- behind_proxy: If true, the application will use the X-Forwarded-For header to determine the IP address of the client
- title: Title of the application
- icon: Font-awesome icon to use as the application icon
- motd: Message to display on home page
Easy Gate theme can be configured by providing colors for background and foreground. Theme changes will be applied immediately.
Example of a dark mode theme:
"theme": {
"background": "#1d1d1d",
"foreground": "#ffffff"
}
Group entries are used to define which users can see which items, by providing the user subnet:
"groups": [
{
"name": "internal",
"subnet": "192.168.1.1/24"
},
{
"name": "vpn",
"subnet": "10.8.1.1/24"
}
]
A service entry is used to define a service that is available in the infrastructure. Each service has a name, an url, an icon and the groups that can see it (defined in the groups section). If no group is provided the item can be seen by all users:
{
"icon": "fa-brands fa-git-square",
"name": "Git",
"url": "https://git.example.vpn",
"groups": [
"vpn"
]
},
{
"icon": "fa-brands fa-docker",
"name": "Portainer",
"url": "https://portainer.example.internal",
"groups": []
}
A note entry is used to define a simple text note which has a title and a content. Each note has a name, the note content (text) and the groups that can see it (defined in the groups section). If no group is provided the item can be seen by all users:
{
"name": "Simple note",
"text": "This is a simple note for vpn users",
"groups": [
"vpn"
]
},
{
"name": "Global note",
"text": "This note will be visible to everyone",
"groups": []
}
Icons are provided by the Font Awesome library. Get the appropriate icon name by using the Font Awesome website (only free icons are available).