ArchCNTL
ArchCNTL is a self-hosted control panel for managing remote Linux (and cross-platform) machines from a central web dashboard. Run the Server on your main host, install the Client daemon on machines you want to manage, and control them through a modern web UI.
Current version: see version.txt
Features
Dashboard
- Live server grid with online/offline status
- OS detection and platform logos on each managed machine
- Rename servers with custom aliases
- Multi-select servers for batch actions
- Pending system update counts per client
- Live package update progress with speed and phase tracking
- Reboot, update, and remove servers from the dashboard
- Remote terminal sessions over WebSocket
- Browse and view remote log files
Admin Panel
- Toggle user registration and admin verification requirements
- Rotate the application secret key
- Restart the ArchCNTL service from the UI
- One-click infrastructure updates (clients first, then server) with live progress modal
- Automatic update-available check on page load
- Full user management: email, password override, admin/enabled/verified flags
- Per-user client counts (online/total)
User Settings
- Update username and email
- Change password (requires current password)
- Permanent 9-digit account ID display
Client Daemon
- Authenticates to the main server with a per-client token
- Heartbeat and status reporting
- Executes remote commands (reboot, system updates, log collection)
- Cross-platform update support (Arch, Debian/Ubuntu, Fedora, macOS, Windows)
- Self-update via the infrastructure update pipeline
UI
- Dark glass-panel design with animated modals and toast notifications
- Responsive layout with sidebar navigation
- Unified toast system with slide/fade animations
Architecture
| Component | Install path | systemd unit | Role |
|---|---|---|---|
| Server | /opt/archcntl-server |
archcntl-server.service |
Web UI, API, Socket.IO, SQLite database |
| Client | /opt/archcntl-client |
archcntl-client.service |
Daemon on managed machines |
Both can be installed on the same machine. The server listens on port 8928 by default.
Requirements
- Linux (developed and tested on Arch Linux)
- Python 3 with
venv - systemd
- git, curl, jq (installed automatically on Arch via the installer)
Server dependencies are listed in requirements.txt. Client dependencies are in requirements-daemon.txt.
Installation
One-line install (recommended)
Install the server:
sudo bash -c "$(curl -fsSL https://gitssy.nakildias.com/Nakildias/ArchCNTL/raw/master/install.sh)"
Choose 1 for Server or 2 for Client when prompted.
The one-line installer detects remote execution, clones the repository to /var/cache/archcntl-src, and installs from there.
Local install
Clone the repository and run the installer from the checkout:
git clone https://gitssy.nakildias.com/Nakildias/ArchCNTL.git
cd ArchCNTL
sudo ./install.sh
Client setup
When installing the client, you will be prompted for:
- Main ArchCNTL server address (URL, hostname, or IP)
- Your ArchCNTL username
- Your ArchCNTL password
Server address examples:
| Input | Normalized URL |
|---|---|
192.168.1.132 |
http://192.168.1.132:8928 |
192.168.1.132:8925 |
http://192.168.1.132:8925 |
https://example.address.com/ |
https://example.address.com |
http://10.0.0.5 |
http://10.0.0.5:8928 |
- HTTP addresses use port 8928 when no port is specified.
- HTTPS addresses never include a port (your reverse proxy handles TLS on 443).
The installer contacts the server, obtains an auth token, and writes /opt/archcntl-client/config.ini.
First login
- Open
http://<server-ip>:8928in your browser (or your HTTPS reverse-proxy URL). - Register the first account — the first registered user automatically receives admin privileges.
- Install client daemons on machines you want to manage and register them through the dashboard.
Updating
From the Admin Panel, use Update ArchCNTL to run the full infrastructure update (clients, then server) with live progress.
Manual update from an existing installation:
sudo /opt/archcntl-server/update.sh
Options:
sudo /opt/archcntl-server/update.sh --local # deploy from current checkout
sudo /opt/archcntl-server/update.sh --server-only # update server only
sudo /opt/archcntl-server/update.sh --client-only # update client only
sudo /opt/archcntl-server/update.sh --no-restart # deploy without restarting services
Uninstallation
One-line uninstall
sudo bash -c "$(curl -fsSL https://gitssy.nakildias.com/Nakildias/ArchCNTL/raw/master/uninstall.sh)"
If both Server and Client are installed, you will be asked which to remove (or both).
Local uninstall
sudo ./uninstall.sh
Non-interactive uninstall
sudo ARCHCNTL_UNINSTALL_TARGET=server ./uninstall.sh
sudo ARCHCNTL_UNINSTALL_TARGET=client ./uninstall.sh
sudo ARCHCNTL_UNINSTALL_TARGET=both ./uninstall.sh
Removing the server deletes /opt/archcntl-server, including the SQLite database. After all components are removed, you can optionally purge shared cache and log directories:
/var/cache/archcntl-src/var/cache/archcntl-update/var/log/archcntl
Service management
# Server
sudo systemctl status archcntl-server
sudo systemctl restart archcntl-server
sudo journalctl -u archcntl-server -f
# Client
sudo systemctl status archcntl-client
sudo systemctl restart archcntl-client
sudo journalctl -u archcntl-client -f
Project structure
ArchCNTL/
├── app.py # Flask application entry point
├── archcntl-daemon.py # Client daemon source
├── daemon_platform.py # OS detection and system update logic
├── database.py # SQLite schema and migrations
├── url_utils.py # Server URL normalization (HTTP/HTTPS, default port)
├── install.sh # Server/client installer
├── uninstall.sh # Server/client uninstaller
├── update.sh # Git-based update script
├── update_orchestrator.py # Infrastructure update pipeline
├── routes/ # Flask blueprints
├── templates/ # Jinja2 HTML templates
└── version.txt # Current release version
Links
- Repository: gitssy.nakildias.com/Nakildias/ArchCNTL
- Author: Nakildias