{"id":28902607,"url":"https://github.com/alfiosalanitri/hetzner-server-manager","last_synced_at":"2026-01-31T07:02:43.156Z","repository":{"id":300100992,"uuid":"1005204106","full_name":"alfiosalanitri/hetzner-server-manager","owner":"alfiosalanitri","description":"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. 🐳🐍","archived":false,"fork":false,"pushed_at":"2025-06-19T21:57:57.000Z","size":191,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-19T22:23:55.738Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alfiosalanitri.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-19T21:05:59.000Z","updated_at":"2025-06-19T21:58:01.000Z","dependencies_parsed_at":"2025-06-19T22:34:48.560Z","dependency_job_id":null,"html_url":"https://github.com/alfiosalanitri/hetzner-server-manager","commit_stats":null,"previous_names":["alfiosalanitri/hetzner-server-manager"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/alfiosalanitri/hetzner-server-manager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alfiosalanitri%2Fhetzner-server-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alfiosalanitri%2Fhetzner-server-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alfiosalanitri%2Fhetzner-server-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alfiosalanitri%2Fhetzner-server-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alfiosalanitri","download_url":"https://codeload.github.com/alfiosalanitri/hetzner-server-manager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alfiosalanitri%2Fhetzner-server-manager/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261110672,"owners_count":23111069,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-21T11:10:03.036Z","updated_at":"2026-01-31T07:02:43.151Z","avatar_url":"https://github.com/alfiosalanitri.png","language":"HTML","funding_links":[],"categories":["Integrations"],"sub_categories":["Rust"],"readme":"# Hetzner Server Manager 🖥️⚙️\n\nA 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. 🐳🐍\n\n## Screenshots 📷\n\n![Dashboard](preview/dashboard.png)\n\n![Project Page](preview/project.png)\n\n![Modal Confirm](preview/project-modal.png)\n\n## Features ⭐\n\n* **Multi-Project Management**: Securely add and manage multiple Hetzner Cloud projects. 🔐\n* **Encrypted API Tokens**: API tokens are encrypted at rest in the database for enhanced security. 🔒\n* **Modern Dashboard**: A responsive, card-based dashboard to monitor all your servers. 📊\n* **Core Server Actions**: Power on, shutdown, and reboot servers with a single click. ⚡🔄\n* **Styled Confirmation Modals**: Prevent accidental actions with sleek, non-intrusive confirmation modals. ✔️\n* **Dark/Light Mode**: Theme toggler with `localStorage` persistence for user preferences. 🌙☀️\n* **User-Friendly UX**: Features like copy-to-clipboard for IP addresses and real-time status indicators. 📋🟢🔴\n* **Dockerized**: Easily deploy with a single command using Docker and Docker Compose. 🐳\n\n## Tech Stack 🛠️\n\n* **Backend**: Python, Flask, Gunicorn 🐍🔥\n* **Database**: SQLite with Flask-SQLAlchemy 🗄️\n* **Frontend**: Tailwind CSS, Alpine.js 🎨⚡\n* **Tooling**: Node.js/npm (for asset compilation), Docker, Docker Compose 📦\n\n---\n\n## 🛠️ Development Setup\n\nUse this method if you want to run the app in development mode, contribute to the project, or customize the code.\n\n### Prerequisites 📋\n\n* [Docker](https://docs.docker.com/get-docker/) 🐳\n* [Docker Compose](https://docs.docker.com/compose/install/) (optional, for dev DB or Redis)\n* Python 3.10+ 🐍\n* Node.js and npm 📦\n\n### Steps 🚀\n\n1. **Clone the repository:**\n\n```bash\ngit clone \u003cyour-repository-url\u003e\ncd hetzner-server-manager\n````\n\n2. **Create the environment file:**\n\n```bash\ncp .env.example .env\n```\n\n3. **Create and activate a Python virtual environment:**\n\n```bash\npython -m venv venv\nsource venv/bin/activate  # On Windows: venv\\Scripts\\activate\n```\n\n4. **Install Python dependencies:**\n\n```bash\npip install -r requirements.txt\n```\n\n5. **Generate a secret encryption key:**\n\n```bash\ndocker run --rm ghcr.io/alfiosalanitri/docker-fernet-key-generator:latest\n```\n\nPaste the key into `.env` under `SECRET_ENCRYPTION_KEY`.\n\n6. **Generate a secret key:**\n\n```bash\npython -c \"import secrets; print(secrets.token_urlsafe(32))\"\n```\n\nPaste the key into `.env` under `SECRET_KEY`.\n\n7. **Enable Debug Mode:**\n\nSet Debug mode to true into `.env` under `FLASK_DEBUG`.\n\n8. **Install Node.js dependencies:**\n\n```bash\nnpm install\n```\n\n9. **Initialize the database:**\n\n```bash\nflask db upgrade\n```\n\n10. **Run the application:**\n\nOpen two terminals:\n\n* **Terminal 1:** Tailwind watcher\n\n```bash\nnpm run dev\n```\n\n* **Terminal 2:** Flask development server\n\n```bash\npython ./app.py\n```\n\n11. **Access the app:**\n\nNavigate to [http://localhost:5000](http://localhost:5000) 🌐\n\n\u003e The database will be created in the `data/` folder. 📂\n\n---\n\n## 🧪 Running Tests\n\nTo ensure your changes work as expected or to simply verify the app, you can run automated tests! ⚙️✅\n\n### Setup\n\nMake sure you have the development dependencies installed (including testing tools):\n\n```bash\npip install -r requirements-dev.txt\n```\n\n### Run Tests\n\nUse `pytest` to run all tests:\n\n```bash\npytest\n```\n\nYou should see output with passed/failed tests. Tests cover models, forms, utils, and routes.\n\n---\n\n## 🚀 Production Setup (Docker)\n\nIf you want to deploy the app in **production**, you can use the prebuilt Docker image with minimal configuration.\n\n### Prerequisites 📋\n\n* [Docker](https://docs.docker.com/get-docker/) 🐳\n* [Docker Compose](https://docs.docker.com/compose/install/)\n\n### Steps (use the pre built image) 🏗️\n\n```text\nghcr.io/alfiosalanitri/hetzner-server-manager:latest\n```\n\n1. **Create and edit your `.env` file:**\n\n```bash\nvim .env\n```\n\nAdd your `SECRET_ENCRYPTION_KEY`, `SECRET_KEY` and `FLASK_DEBUG=false`.\n\n💡 Tip: You can generate a valid `SECRET_ENCRYPTION_KEY` using [https://fernetkeygen.com](https://fernetkeygen.com)\n\n2. **Create the docker-compose.yml file:** \n\n```bash\nservices:\n  web:\n    image: ghcr.io/alfiosalanitri/hetzner-server-manager:latest\n    ports:\n      - \"5000:5000\"\n    volumes:\n      - ./data/instance:/app/instance\n    env_file:\n      - .env\n    restart: unless-stopped\n```\n\n3. **Run the container:**\n\n```bash\ndocker compose up -d\n```\n---\n\n### Steps (create your image) 🏗️\n\n1. **Clone this repository:**\n\n```bash\ngit clone https://github.com/alfiosalanitri/hetzner-server-manager.git\n```\n2. **Create and edit your `.env` file:**\n\n```bash\nco .env.example .env\n```\n\n3. **Run the container:**\n\n```bash\ndocker compose up --build -d\n```\n---\n\nThe app will be available at [http://localhost:5000](http://localhost:5000) 🌐\n\n---\n\n## ✅ Docker Image Compatibility\n\nThe Docker image has been successfully tested on the following platforms:\n\n| Platform        | Architecture | Status   |\n| --------------- | ------------ | -------- |\n| Arch Linux      | x86\\_64      | ✅ Tested |\n| Ubuntu 22.04+   | x86\\_64      | ✅ Tested |\n| Raspberry Pi OS | ARMv7/ARM64  | ✅ Tested |\n\n\u003e ℹ️ If you encounter issues running the container on other systems, feel free to open an issue.\n\n---\n\n## 🔐 Environment Variables\n\nThe following variable is required in your `.env` file:\n\n* `SECRET_ENCRYPTION_KEY`: Used to encrypt and decrypt Hetzner API tokens. 🔑\n\n\u003e ⚠️ If you lose this key, previously saved projects will become inaccessible.\n\n* `SECRET_KEY`: Used for securely signing session cookies and other cryptographic operations.\n\n* `FLASK_DEBUG`: Enable or disable Flask debug mode.\n\n---\n\n## ⚠️ Security \u0026 Access Warning\n\n\u003e ❗ **Warning:** This application **does not implement** any kind of authentication or login mechanism.\n\nAnyone 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.**\n\nFor this reason, **it is strongly discouraged to expose the application directly to the internet without additional protection**.\nIt 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.\n\n\u003e 🔒 In production environments, securing access is essential to prevent unauthorized usage or potential harm to your infrastructure.\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome! Please open an issue to suggest improvements or report bugs. Pull requests are appreciated. 🙌✨\n\n---\n\n## 📄 License\n\nThis project is licensed under the MIT License. See [LICENSE](LICENSE) for details. 📜\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falfiosalanitri%2Fhetzner-server-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falfiosalanitri%2Fhetzner-server-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falfiosalanitri%2Fhetzner-server-manager/lists"}