A single-container web dashboard for one Linux server: CPU, RAM, disk and temperature graphs, open ports, Docker containers you can start and stop, cloudflared tunnel health, SSH sessions, and a basic process/connection scan.
Screenshots use synthetic data — IANA-reserved documentation ranges, not a
real host. See docs/screenshots/demo-server.py.
The dashboard and the API are one process on 127.0.0.1:3000. There is nothing to
wire together and no CORS to configure.
This app is root-equivalent. It mounts the Docker socket and runs with
pid: host, so anyone who logs in can start a privileged container and own the machine. Treat the admin password like a root password, and never expose the port directly — put it behind a tunnel. Read Security before you do.
Needs Linux with systemd, Docker, and the Compose plugin v2.24+ (older ones
cannot parse this docker-compose.yml). Node and Python for the app itself live
inside the build.
git clone https://github.com/Abishek-Pechiappan/ServerCTL.git && cd ServerCTL
docker compose up -d --buildOpen http://localhost:3000:
On first run the container generates an admin password and prints it once:
docker compose logs | grep -A6 "generated for you"It is kept in a Docker volume, so it survives restarts and rebuilds. To choose your own instead:
printf 'ADMIN_USERNAME=you\nADMIN_PASSWORD=your-secret\n' > backend/.env
docker compose up -d --force-recreateIt is hashed with scrypt at boot and only the hash is stored, but treat
backend/.env as a secret — Compose records its values in the container config.
If it does not come up, run python3 preflight.py; it checks the host side and
names what is wrong.
Point a cloudflared tunnel straight at the app — no nginx needed:
# ~/.cloudflared/config.yml
ingress:
- hostname: panel.example.com
service: http://127.0.0.1:3000
- service: http_status:404Then put Cloudflare Access in front of it. One password is otherwise the only thing between the internet and root on your box. This is the single highest-value thing you can do — see Security.
| Configuration | backend/.env keys, changing ports, the optional nginx proxy |
| API reference | Endpoints, authentication, error shapes |
| Security | What protects the login, what does not, and what to do before exposing it |
| Troubleshooting | Common failures, and known limitations |
| Development | Local setup, the test suite, project layout |
docker compose logs -f # follow logs (auth events land here)
docker compose up -d --build # after a code change
docker compose up -d --force-recreate # after a backend/.env changeMIT © 2026 Abishek Pechiappan
Provided as is, with no warranty — see the licence text. Given what this tool can do to a machine, that disclaimer is worth reading rather than skipping.


