Hetzner Server Manager ๐Ÿ–ฅ๏ธโš™๏ธ

November 3, 2025 ยท View on GitHub

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. ๐Ÿณ๐Ÿ

Screenshots ๐Ÿ“ท

Dashboard

Project Page

Modal Confirm

Features โญ

  • 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. ๐Ÿณ

Tech Stack ๐Ÿ› ๏ธ

  • Backend: Python, Flask, Gunicorn ๐Ÿ๐Ÿ”ฅ
  • Database: SQLite with Flask-SQLAlchemy ๐Ÿ—„๏ธ
  • Frontend: Tailwind CSS, Alpine.js ๐ŸŽจโšก
  • Tooling: Node.js/npm (for asset compilation), Docker, Docker Compose ๐Ÿ“ฆ

๐Ÿ› ๏ธ Development Setup

Use this method if you want to run the app in development mode, contribute to the project, or customize the code.

Prerequisites ๐Ÿ“‹

  • Docker ๐Ÿณ
  • Docker Compose (optional, for dev DB or Redis)
  • Python 3.10+ ๐Ÿ
  • Node.js and npm ๐Ÿ“ฆ

Steps ๐Ÿš€

  1. Clone the repository:
git clone <your-repository-url>
cd hetzner-server-manager
  1. Create the environment file:
cp .env.example .env
  1. Create and activate a Python virtual environment:
python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate
  1. Install Python dependencies:
pip install -r requirements.txt
  1. Generate a secret encryption key:
docker run --rm ghcr.io/alfiosalanitri/docker-fernet-key-generator:latest

Paste the key into .env under SECRET_ENCRYPTION_KEY.

  1. Generate a secret key:
python -c "import secrets; print(secrets.token_urlsafe(32))"

Paste the key into .env under SECRET_KEY.

  1. Enable Debug Mode:

Set Debug mode to true into .env under FLASK_DEBUG.

  1. Install Node.js dependencies:
npm install
  1. Initialize the database:
flask db upgrade
  1. Run the application:

Open two terminals:

  • Terminal 1: Tailwind watcher
npm run dev
  • Terminal 2: Flask development server
python ./app.py
  1. Access the app:

Navigate to http://localhost:5000 ๐ŸŒ

The database will be created in the data/ folder. ๐Ÿ“‚


๐Ÿงช Running Tests

To ensure your changes work as expected or to simply verify the app, you can run automated tests! โš™๏ธโœ…

Setup

Make sure you have the development dependencies installed (including testing tools):

pip install -r requirements-dev.txt

Run Tests

Use pytest to run all tests:

pytest

You should see output with passed/failed tests. Tests cover models, forms, utils, and routes.


๐Ÿš€ Production Setup (Docker)

If you want to deploy the app in production, you can use the prebuilt Docker image with minimal configuration.

Prerequisites ๐Ÿ“‹

Steps (use the pre built image) ๐Ÿ—๏ธ

ghcr.io/alfiosalanitri/hetzner-server-manager:latest
  1. 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

  1. 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
  1. Run the container:
docker compose up -d

Steps (create your image) ๐Ÿ—๏ธ

  1. Clone this repository:
git clone https://github.com/alfiosalanitri/hetzner-server-manager.git
  1. Create and edit your .env file:
co .env.example .env
  1. Run the container:
docker compose up --build -d

The app will be available at http://localhost:5000 ๐ŸŒ


โœ… Docker Image Compatibility

The Docker image has been successfully tested on the following platforms:

PlatformArchitectureStatus
Arch Linuxx86_64โœ… Tested
Ubuntu 22.04+x86_64โœ… Tested
Raspberry Pi OSARMv7/ARM64โœ… Tested

โ„น๏ธ If you encounter issues running the container on other systems, feel free to open an issue.


๐Ÿ” Environment Variables

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.


โš ๏ธ Security & Access Warning

โ— 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.


๐Ÿค Contributing

Contributions are welcome! Please open an issue to suggest improvements or report bugs. Pull requests are appreciated. ๐Ÿ™Œโœจ


๐Ÿ“„ License

This project is licensed under the MIT License. See LICENSE for details. ๐Ÿ“œ