Skip to content

Repository files navigation

ServerCTL

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.

The ServerCTL dashboard

Every panel (full-height screenshot)

The complete ServerCTL dashboard

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.


Install

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

Open http://localhost:3000:

The ServerCTL login page

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

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

Remote access

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:404

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

Documentation

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

Everyday commands

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 change

License

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

About

Making an Dashboard for homelab servers with agents you can deploy in servers in different place

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Contributors

Languages