A simple, self-hosted web application to manage multiple Hetzner Cloud servers and projects from a single, clean interface. Built with Python, Flask, and Tailwind CSS, and fully containerized with Docker. π³π
- Multi-Project Management: Securely add and manage multiple Hetzner Cloud projects. π
- Encrypted API Tokens: API tokens are encrypted at rest in the database for enhanced security. π
- Modern Dashboard: A responsive, card-based dashboard to monitor all your servers. π
- Core Server Actions: Power on, shutdown, and reboot servers with a single click. β‘π
- Styled Confirmation Modals: Prevent accidental actions with sleek, non-intrusive confirmation modals. βοΈ
- Dark/Light Mode: Theme toggler with
localStorage
persistence for user preferences. πβοΈ - User-Friendly UX: Features like copy-to-clipboard for IP addresses and real-time status indicators. ππ’π΄
- Dockerized: Easily deploy with a single command using Docker and Docker Compose. π³
- Backend: Python, Flask, Gunicorn ππ₯
- Database: SQLite with Flask-SQLAlchemy ποΈ
- Frontend: Tailwind CSS, Alpine.js π¨β‘
- Tooling: Node.js/npm (for asset compilation), Docker, Docker Compose π¦
Use this method if you want to run the app in development mode, contribute to the project, or customize the code.
- Docker π³
- Docker Compose (optional, for dev DB or Redis)
- Python 3.10+ π
- Node.js and npm π¦
- Clone the repository:
git clone <your-repository-url>
cd hetzner-server-manager
- Create the environment file:
cp .env.example .env
- Create and activate a Python virtual environment:
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
- Install Python dependencies:
pip install -r requirements.txt
- Generate a secret encryption key:
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
Paste the key into .env
under SECRET_ENCRYPTION_KEY
.
- Generate a secret key:
python -c "import secrets; print(secrets.token_urlsafe(32))"
Paste the key into .env
under SECRET_KEY
.
- Enable Debug Mode:
Set Debug mode to true into .env
under FLASK_DEBUG
.
- Install Node.js dependencies:
npm install
- Initialize the database:
flask db upgrade
- Run the application:
Open two terminals:
- Terminal 1: Tailwind watcher
npm run dev
- Terminal 2: Flask development server
python ./app.py
- Access the app:
Navigate to http://localhost:5000 π
The database will be created in the
data/
folder. π
To ensure your changes work as expected or to simply verify the app, you can run automated tests! βοΈβ
Make sure you have the development dependencies installed (including testing tools):
pip install -r requirements-dev.txt
Use pytest
to run all tests:
pytest
You should see output with passed/failed tests. Tests cover models, forms, utils, and routes.
If you want to deploy the app in production, you can use the prebuilt Docker image with minimal configuration.
- Docker π³
- Docker Compose
ghcr.io/alfiosalanitri/hetzner-server-manager:latest
- Create and edit your
.env
file:
vim .env
Add your SECRET_ENCRYPTION_KEY
, SECRET_KEY
and FLASK_DEBUG=false
.
π‘ Tip: You can generate a valid SECRET_ENCRYPTION_KEY
using https://fernetkeygen.com
- Create the docker-compose.yml file:
services:
web:
image: ghcr.io/alfiosalanitri/hetzner-server-manager:latest
ports:
- "5000:5000"
volumes:
- ./data/instance:/app/instance
env_file:
- .env
restart: unless-stopped
- Run the container:
docker compose up -d
- Clone this repository:
git clone https://github.com/alfiosalanitri/hetzner-server-manager.git
- Create and edit your
.env
file:
co .env.example .env
- Run the container:
docker compose up --build -d
The app will be available at http://localhost:5000 π
The Docker image has been successfully tested on the following platforms:
Platform | Architecture | Status |
---|---|---|
Arch Linux | x86_64 | β Tested |
Ubuntu 22.04+ | x86_64 | β Tested |
Raspberry Pi OS | ARMv7/ARM64 | β Tested |
βΉοΈ If you encounter issues running the container on other systems, feel free to open an issue.
The following variable is required in your .env
file:
SECRET_ENCRYPTION_KEY
: Used to encrypt and decrypt Hetzner API tokens. π
β οΈ If you lose this key, previously saved projects will become inaccessible.
-
SECRET_KEY
: Used for securely signing session cookies and other cryptographic operations. -
FLASK_DEBUG
: Enable or disable Flask debug mode.
β Warning: This application does not implement any kind of authentication or login mechanism.
Anyone with access to the application's URL will be able to view and control all configured servers. There is no user authentication or permission control.
For this reason, it is strongly discouraged to expose the application directly to the internet without additional protection. It is highly recommended to use an access control layer such as Cloudflare Zero Trust Access, a reverse proxy with authentication, a VPN, or another secure network gateway.
π In production environments, securing access is essential to prevent unauthorized usage or potential harm to your infrastructure.
Contributions are welcome! Please open an issue to suggest improvements or report bugs. Pull requests are appreciated. πβ¨
This project is licensed under the MIT License. See LICENSE for details. π