Getting Started
TailConsole is a reverse proxy manager that routes public domains to private services through Tailscale's userspace networking. It runs on shared hosting without root access.
How it works
Internet → Your Domain → PHP Proxy → SOCKS5 Tunnel → Tailscale Network → Your Service (100.x.x.x:port)
Setup Guide
1. Add a Domain
Go to the Domains tab and add your base domain (e.g. with.dpdns.org). Make sure the domain's DNS A record points to this server's IP. A wildcard * record is recommended so all subdomains resolve automatically.
2. Create a Proxy Host
Go to Proxy Hosts → Add Proxy Host:
- Enter a subdomain prefix (e.g.
grafana) - Select your domain from the dropdown
- Enter the Tailscale IP of your backend (e.g.
100.100.4.4) - Enter the port (e.g.
3000) - Choose http or https
The system creates the subdomain in Hostinger and adds the proxy route. Your service is now accessible at grafana.with.dpdns.org.
3. Tailscale (Admin only)
The Dashboard tab shows Tailscale status. Admins can start/stop the daemon and connect to the tailnet using an auth key from https://login.tailscale.com/admin/settings/keys.
User Roles
| Role | Can do |
|---|---|
Owner | Everything — manage users, Tailscale, all domains/routes, settings |
Admin | Manage Tailscale controls, own domains and routes |
User | Manage own domains and routes only |
Viewer | Read-only access to dashboard |
Security
- All passwords are bcrypt-hashed
- Sessions expire after 7 days
- Each user only sees their own domains and routes
- Internal files (
lib/,data/) are blocked by.htaccess - The SQLite database is stored in a directory with
700permissions - API tokens and secrets never leave the server
Architecture
┌─────────────────────────────────────────────┐ │ Shared Hosting (CageFS, no root) │ │ │ │ tailscaled (userspace mode) │ │ └── SOCKS5 proxy on 127.0.0.1:41055 │ │ │ │ PHP Front Controller (index.php) │ │ ├── Routes::match(host, uri) │ │ ├── If match → Proxy via cURL + SOCKS5 │ │ └── If no match → Show control panel UI │ │ │ │ SQLite DB (users, routes, domains, sessions)│ │ Hostinger API (subdomain creation) │ └─────────────────────────────────────────────┘
Tailscale Installation
cd /tmp curl -fsSL -o ts.tgz https://pkgs.tailscale.com/stable/tailscale_1.98.4_amd64.tgz tar -xzf ts.tgz cp tailscale_1.98.4_amd64/tailscale ~/.local/bin/ cp tailscale_1.98.4_amd64/tailscaled ~/.local/bin/ chmod +x ~/.local/bin/tailscale ~/.local/bin/tailscaled rm -rf ts.tgz tailscale_1.98.4_amd64/
Configuration
Edit config.php:
// Paths (adjust HOME to your hosting user)
define('TS_HOME', '/home/youruser');
define('TS_BIN', TS_HOME . '/.local/bin/tailscale');
define('TS_DAEMON', TS_HOME . '/.local/bin/tailscaled');
// SOCKS5 proxy ports (must be >2000 on shared hosting)
define('TS_SOCKS5_PORT', 41055);
// Hostinger API (for auto-subdomain creation)
define('HOSTINGER_API_TOKEN', 'your-token');
define('HOSTINGER_ORDER_ID', 123456789);
// Database
define('DB_PATH', __DIR__ . '/data/console.db');
Persistence
Add a cron job (via hPanel → Cron Jobs) to keep the daemon alive:
*/5 * * * * /home/youruser/tailscale/bin/watchdog.sh >/dev/null 2>&1
Default Credentials
Username: admin / Password: changeme — change immediately after first login.