All apps · 0 apps
tuliprox-vpn
Docker app from brycelarge's Repository
Overview
Readme
View on GitHubtuliprox VPN (Unraid-ready)
[!NOTE] Credits to the tuliprox team and all contributors. Access the tuliprox documentation here
This repo builds a tuliprox-vpn container image that:
- Runs on Alpine (
brycelarge/alpine-baseimage:3.21) - Uses s6-overlay to supervise the
tuliproxprocess - Includes an OpenVPN client (CUSTOM configs or built-in providers) — sourced from
brycelarge/openvpn-buildtools - Includes optional Privoxy (HTTP proxy) for VPN-routed traffic
- Includes built-in speed testing tooling
- Supports Unraid-style runtime user mapping via
PUID/PGID/UMASK - Published automatically to
ghcr.io/brycelarge/tuliprox-vpnvia GitHub Actions
Upstream project: https://github.com/euzu/tuliprox
What’s in the image
- Binary:
/app/tuliprox - Web UI:
/app/web(built viatrunk, copied fromfrontend/dist) - Resources:
/app/resources(includes generated.tsassets built in the image) - Config path:
/app/config
The container runs:
/app/tuliprox -s -p /app/config
You can append extra args via TULIPROX_ARGS.
Environment variables
PUID- Default:
133 - The container will adjust the internal
tuliproxuser to this UID at startup.
- Default:
PGID- Default:
144 - The container will adjust the internal
tuliproxgroup to this GID at startup.
- Default:
UMASK- Default:
022 - Applied before launching
tuliproxso newly created files follow your desired permissions.
- Default:
TZ- Default:
UTC
- Default:
TULIPROX_ARGS- Optional. Appended to the default args (
-s -p /app/config).
- Optional. Appended to the default args (
Volumes
/app/config/app/data/app/backup/app/downloads
On container start, an s6 init step will ensure these directories exist and will chown -R them to the runtime PUID/PGID.
Ports
8901/tcp— Tuliprox web UI and API (M3U, Xtream, EPG)5004/tcp— HDHomeRun emulation (Plex/Emby/Jellyfin DVR discovery)8118/tcp— Privoxy HTTP proxy (optional, only whenPRIVOXY_ENABLED=true)
VPN (OpenVPN) + Privoxy
OpenVPN and Privoxy support is provided by brycelarge/openvpn-buildtools.
For full documentation on environment variables, supported providers, custom configs, LOCAL_NETWORK, Privoxy, and more — see the openvpn-buildtools README.
⚠️ The container requires
--cap-add=NET_ADMINand--device=/dev/net/tunwhenVPN_ENABLED=true.⚠️ Set
LOCAL_NETWORKto your LAN subnet (e.g.192.168.1.0/24) or the web UI on port8901will be unreachable once the VPN connects.
Speed test
The image includes a simple wrapper:
/scripts/speedtest.sh
By default it runs speedtest-cli --simple.
Healthcheck
The image defines a Docker healthcheck:
/usr/local/bin/healthcheck.sh
Which runs:
/app/tuliprox -p /app/config --healthcheck
Image
ghcr.io/brycelarge/tuliprox-vpn:latest # master branch
ghcr.io/brycelarge/tuliprox-vpn:next # develop branch
Builds are published automatically via GitHub Actions on push to master / develop and on version tags.
Build locally
docker build -t tuliprox-vpn .
Build script (latest + next)
This repo includes a build script.
Build both tags locally:
./scripts/build.sh
Build/push both tags to a repo:
./scripts/build.sh -p
Build only latest (master):
./scripts/build.sh -l
Build only next (develop):
./scripts/build.sh -n
Build args
TULIPROX_REF(default:master)- Git ref to build from the upstream repo.
RUST_TARGET(default:x86_64-unknown-linux-musl)
Run (plain Docker)
docker run --rm -it \
-p 8901:8901 \
-p 5004:5004 \
-e TZ=Europe/Paris \
-e PUID=99 \
-e PGID=100 \
-e UMASK=022 \
-v $(pwd)/config:/app/config \
-v $(pwd)/data:/app/data \
-v $(pwd)/backup:/app/backup \
-v $(pwd)/downloads:/app/downloads \
--name tuliprox \
tuliprox-s6
Local development (docker compose)
A docker-compose.yml is included for local testing.
1. Create your .env file
Copy the example and fill in your credentials:
cp .env.example .env
Edit .env:
OPENVPN_USERNAME=your_service_username
OPENVPN_PASSWORD=your_service_password
OPENVPN_PROVIDER=NORDVPN
OPENVPN_CONFIG=us9196.nordvpn.com.udp
# ⚠️ Set this to your LAN subnet — required for web UI access when VPN is enabled
LOCAL_NETWORK=192.168.0.0/24
The
.envfile is gitignored — never commit credentials.
For NordVPN, service credentials are found at: https://my.nordaccount.com/dashboard/nordvpn/manual-configuration/
2. Configure docker-compose.yml
Key variables to set directly in docker-compose.yml:
| Variable | Default | Description |
|---|---|---|
VPN_ENABLED |
false |
Set true to enable OpenVPN |
OPENVPN_PROVIDER |
CUSTOM |
NORDVPN, PIA, SURFSHARK, IPVANISH, VYPRVPN, PROTONVPN, CUSTOM |
OPENVPN_CONFIG |
(first .ovpn found) | Specific config filename |
OPENVPN_FORCE_UPDATE |
false |
Set true to re-download provider configs |
PRIVOXY_ENABLED |
false |
Enable Privoxy HTTP proxy on port 8118 |
3. Start
docker compose up -d
docker compose logs -f
4. Stop
docker compose down
Notes
- Volumes are written to
./data/(gitignored). - Requires
NET_ADMINcap and/dev/net/tundevice whenVPN_ENABLED=true(already set indocker-compose.yml). - The image is
linux/amd64only — on Apple Silicon it runs under emulation.
First boot
On first boot, if /app/config/config.yml, source.yml, or api-proxy.yml are missing, the container copies defaults from /app/defaults/ automatically. The api-proxy.yml host IP is auto-detected from the container's LAN interface.
Edit the generated files in your config volume to suit your setup.
Accessing playlists
After configuring api-proxy.yml with your credentials:
- M3U:
http://<host>:8901/get.php?username=<user>&password=<pass> - Xtream Codes: host
http://<host>:8901, username/password as configured - EPG (XMLTV):
http://<host>:8901/xmltv.php?username=<user>&password=<pass> - HDHomeRun discovery:
http://<host>:5004/discover.json
api-proxy.yml
Required for playlist access. Minimum config:
server:
- name: default
protocol: http
host: 192.168.1.x # your Unraid/host LAN IP
port: '8901'
timezone: UTC
message: tuliprox
user:
- target: my_target
credentials:
- username: myuser
password: mypass
proxy: reverse
server: default
Usernames must be unique across all targets. The target name must match a target defined in source.yml.
Unraid
See UNRAID.md.
Install tuliprox-vpn on Unraid in a few clicks.
Find tuliprox-vpn in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.
Requirements
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/brycelarge/tuliprox-vpn:latestRuntime arguments
- Web UI
http://[IP]:[PORT:8901]/- Network
bridge- Shell
bash- Privileged
- false
- Extra Params
--cap-add=NET_ADMIN --device=/dev/net/tun
Template configuration
Tuliprox web UI and API
- Target
- 8901
- Default
- 8901
- Value
- 8901
HDHomeRun device port. Must match the port value set in config.yml hdhomerun.devices. Add additional port mappings for each extra device.
- Target
- 5004
- Default
- 5004
- Value
- 5004
Privoxy HTTP proxy port (only needed if PRIVOXY_ENABLED=true)
- Target
- 8118
- Default
- 8118
- Value
- 8118
EPG scraper guide server port (only needed if EPG_SCRAPER_ENABLED=true)
- Target
- 3002
- Default
- 3002
- Value
- 3002
Tuliprox config directory. Place config.yml and source.yml here.
- Target
- /app/config
- Default
- /mnt/user/appdata/tuliprox-vpn/config
- Value
- /mnt/user/appdata/tuliprox-vpn/config
Tuliprox runtime data and database
- Target
- /app/data
- Default
- /mnt/user/appdata/tuliprox-vpn/data
- Value
- /mnt/user/appdata/tuliprox-vpn/data
Tuliprox backup directory
- Target
- /app/backup
- Default
- /mnt/user/appdata/tuliprox-vpn/backup
- Value
- /mnt/user/appdata/tuliprox-vpn/backup
Video download directory
- Target
- /app/downloads
- Default
- /mnt/user/appdata/tuliprox-vpn/downloads
- Value
- /mnt/user/appdata/tuliprox-vpn/downloads
EPG scraper data directory. Contains channels.xml (your channel list) and the generated guide.xml. Only needed if EPG_SCRAPER_ENABLED=true.
- Target
- /app/epg
- Default
- /mnt/user/appdata/tuliprox-vpn/epg
- Value
- /mnt/user/appdata/tuliprox-vpn/epg
Enable OpenVPN tunnel
- Target
- VPN_ENABLED
- Default
- true
- Value
- true
VPN provider: NORDVPN, PIA, SURFSHARK, IPVANISH, VYPRVPN, PROTONVPN, CUSTOM
- Target
- OPENVPN_PROVIDER
- Default
- NORDVPN
- Value
- NORDVPN
VPN service username (for NordVPN: use service credentials from my.nordaccount.com)
- Target
- OPENVPN_USERNAME
VPN service password
- Target
- OPENVPN_PASSWORD
Specific .ovpn config name to use (e.g. us9196.nordvpn.com.udp). Leave blank to use first available.
- Target
- OPENVPN_CONFIG
OpenVPN protocol: udp or tcp
- Target
- OPENVPN_PROTOCOL
- Default
- udp
- Value
- udp
Additional OpenVPN CLI flags (optional)
- Target
- OPENVPN_OPTIONS
IMPORTANT: Set to your LAN subnet (e.g. 192.168.1.0/24) so the web UI stays accessible when VPN is connected. Comma-separated for multiple subnets.
- Target
- LOCAL_NETWORK
Comma-separated DNS servers to use inside the container (optional, e.g. 1.1.1.1,8.8.8.8)
- Target
- NAME_SERVERS
Enable Privoxy HTTP proxy
- Target
- PRIVOXY_ENABLED
- Default
- false
- Value
- false
Privoxy internal port
- Target
- PRIVOXY_PORT
- Default
- 8118
- Value
- 8118
User ID for file permissions (use Unraid's nobody: 99)
- Default
- 99
- Value
- 99
Group ID for file permissions (use Unraid's users: 100)
- Default
- 100
- Value
- 100
File creation umask
- Default
- 022
- Value
- 022
Timezone (e.g. America/New_York)
- Target
- TZ
- Default
- UTC
- Value
- UTC
Enable debug logging
- Target
- DEBUG
- Default
- false
- Value
- false