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.
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