{"id":50248812,"url":"https://github.com/jaameypr/aethera-next","last_synced_at":"2026-06-27T02:04:54.995Z","repository":{"id":351610936,"uuid":"1155405429","full_name":"jaameypr/aethera-next","owner":"jaameypr","description":"Self-hosted game server management panel for minecraft","archived":false,"fork":false,"pushed_at":"2026-05-10T14:00:58.000Z","size":1606,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-10T15:34:38.491Z","etag":null,"topics":["aethera","docker","game-server","minecraft"],"latest_commit_sha":null,"homepage":"https://getaethera.de","language":"TypeScript","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/jaameypr.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-11T13:31:26.000Z","updated_at":"2026-05-10T13:45:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jaameypr/aethera-next","commit_stats":null,"previous_names":["jaameypr/aethera-next"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jaameypr/aethera-next","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaameypr%2Faethera-next","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaameypr%2Faethera-next/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaameypr%2Faethera-next/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaameypr%2Faethera-next/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jaameypr","download_url":"https://codeload.github.com/jaameypr/aethera-next/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaameypr%2Faethera-next/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33545458,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"ssl_error","status_checked_at":"2026-05-26T15:22:15.568Z","response_time":63,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["aethera","docker","game-server","minecraft"],"created_at":"2026-05-27T00:30:48.483Z","updated_at":"2026-06-27T02:04:54.989Z","avatar_url":"https://github.com/jaameypr.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003e⚡ Aethera\u003c/h1\u003e\n  \u003cp\u003eSelf-hosted game server management panel — built with Next.js, MongoDB, and Docker.\u003c/p\u003e\n\u003c/div\u003e\n\n---\n\n## Overview\n\nAethera is a full-featured, self-hosted control panel for managing game servers. It organises servers into **projects**, enforces fine-grained **role-based permissions**, and talks directly to the Docker daemon to spin up, monitor, and control containers — no SSH required.\n\n---\n\n## Features\n\n### 🗂️ Projects\n- Group any number of servers under a named project with a unique short key\n- Invite team members and assign project-level roles\n- Per-project audit log tracking every significant action\n\n### 👥 Role-Based Access Control\n| Role | Project management | Server control | Blueprints | View only |\n|------|--------------------|----------------|------------|-----------|\n| **Owner** | ✅ Full | ✅ Full | ✅ | ✅ |\n| **Admin** | ✅ | ✅ Full | ✅ | ✅ |\n| **Manager** | ❌ | ✅ start/stop/console/files/backups | ✅ initialize | ✅ |\n| **Viewer** | ❌ | ❌ | ❌ | ✅ |\n\nServer-level permissions (`server.start`, `server.stop`, `server.console`, `server.files`, `server.backups`, `server.settings`) are auto-provisioned on member invite and can be fine-tuned individually.\n\n### 🖥️ Server Management\n- **Full lifecycle control** — create, start, stop, soft-stop, recreate, delete\n- **Real-time console** — send commands and stream live log output\n- **Live metrics** — CPU and memory usage streamed from Docker stats\n- **Server status polling** — stopped / starting / running / stopping / error\n- **Auto-start** — flag a server to start automatically with the panel\n- **Custom Java args** — pass arbitrary JVM flags per server\n- **`server.properties` editor** — edit all Minecraft server properties in-panel\n- **Environment variable overrides** — set any Docker env var directly\n\n### 🎮 Server Types\n| Type | Category | Pack-driven |\n|------|----------|-------------|\n| Vanilla | Vanilla-like | — |\n| Paper | Vanilla-like | — |\n| Spigot | Vanilla-like | — |\n| Purpur | Vanilla-like | — |\n| Forge | Modded | — |\n| Fabric | Modded | — |\n| CurseForge | Pack | ✅ |\n| Modrinth | Pack | ✅ |\n\nPack-driven servers resolve Minecraft version, loader, and loader version automatically from pack metadata.\n\n### 📦 Mod \u0026 Content Management\n- **Additional mods** — add mods from Modrinth or CurseForge on top of any pack server; they are injected via `MODRINTH_PROJECTS` / `CURSEFORGE_FILES` on every start\n- **Exclude pack mods** — suppress specific mods bundled with a modpack without modifying the pack itself\n- **Plugins** — dedicated endpoint for Bukkit/Spigot/Paper plugin management\n- **Datapacks** — upload and manage vanilla datapacks per-world\n- **.mrpack upload** — upload a Modrinth modpack file directly without needing a hosted URL\n\n### 📐 Blueprints\n- Create reusable **server templates** with a name and a RAM cap\n- Managers and Admins can **initialize** a blueprint into a live server (capped at the blueprint's RAM limit)\n- Once claimed, a blueprint links back to the created server\n- Prevents unauthorized over-provisioning of resources\n\n### 💾 Backup System\n- **Selective component backups** — choose any combination of: `world`, `config`, `mods`, `plugins`, `datapacks`\n- **Async jobs** — large backups run in a background worker process; the UI shows live progress\n- **Download \u0026 restore** — download any backup as a `.tar.gz` archive or restore it in-place\n- **Import backups** — import `.zip` or `.tar.gz` archives from external tools\n- **Startup cleanup** — stuck async jobs are resolved automatically on panel restart\n\n### 📁 File Manager\n- Browse the full server data directory in-browser\n- Read and write individual files without leaving the panel\n\n### 🤝 Discord Integration\n- **Admin setup** — set `DISCORD_BOT_TOKEN` in the environment and invite the bot to Discord once\n- **Project linking** — a project manager generates a short-lived verification code in the panel, then uses it via the bot command in their Discord guild to link the project to that guild\n- **Event notifications** — once linked, the bot posts server events (started, stopped, backup created, error) as embeds to a `#aethera` or `#server-status` channel, falling back to the first available text channel\n- **Discord module** — optional Spring Boot bot that polls server logs and handles whitelist approval callbacks\n\n### 🧩 Module System\n- Install, start, stop, and remove Docker-based **add-on modules** from a remote registry\n- Modules run on `aethera-net` alongside the panel and communicate internally\n- **SSO** — short-lived JWTs (signed with `JWT_SECRET`) are passed to modules for authenticated callbacks\n- **API key provisioning** — modules that declare `auth.strategy: api_key` receive an auto-generated key in their config\n- **Paperview** — built-in integration for the Paperview file viewer module\n\n### 🛡️ Admin Panel\n- **User management** — create, enable/disable, and manage users\n- **Role management** — define custom roles with granular permission sets\n- **System metrics** — live host CPU and memory overview\n- **Setup wizard** — first-run wizard to create the initial admin account without touching the CLI\n\n### 🔐 Authentication\n- Stateless **JWT** auth (access token 15 min, refresh token 7 days)\n- Refresh tokens stored in the database and rotated on use\n- Middleware-enforced route protection\n\n---\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|-----------|\n| Framework | [Next.js 16](https://nextjs.org) (App Router) |\n| Language | TypeScript |\n| Database | MongoDB 7 via Mongoose |\n| Container orchestration | Docker (via `@pruefertit/docker-orchestrator`) |\n| Styling | Tailwind CSS v4 + shadcn/ui |\n| Auth | JWT (access + refresh) |\n| Theming | next-themes (dark / light) |\n| Testing | Vitest |\n\n---\n\n## Deployment\n\n### Prerequisites\n- Docker \u0026 Docker Compose v2\n- A host where the panel container can reach the Docker socket\n\n### Quick Start (one command)\n\nThe fastest way to get a panel running from the pre-built image — no clone, no source build:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/jaameypr/aethera-next/master/install.sh | bash\n```\n\nThe installer will:\n- Verify Docker and Docker Compose v2 are present\n- Create a target directory (`./aethera` by default — override with `AETHERA_DIR`)\n- Download `docker-compose.prod.yml` and `.env.example` into it\n- Generate a fresh `.env` with random `JWT_SECRET` and `MONGO_PASS`\n- Create the data directories, pull the image, and start the stack\n\nWhen it finishes, open `http://localhost:3000` (or `APP_PORT` if overridden) and complete the `/setup` wizard. **Set `ADMIN_PASSWORD` in `.env` (or use the setup wizard) before exposing the panel.**\n\nTo install a specific channel, set `AETHERA_TAG` on the `bash` that runs the installer (defaults to `latest`):\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/jaameypr/aethera-next/master/install.sh | AETHERA_TAG=0.2.0 bash\n```\n\n### Manual install (pre-built image)\n\nPrefer to drive Compose yourself? Pull the published image and use the production compose file:\n\n```bash\n# 1. Download the production compose file and the env template\ncurl -fsSLO https://raw.githubusercontent.com/jaameypr/aethera-next/master/docker-compose.prod.yml\ncurl -fsSLO https://raw.githubusercontent.com/jaameypr/aethera-next/master/.env.example\n\n# 2. Create your env file and fill in secrets\ncp .env.example .env\nopenssl rand -hex 16   # → MONGO_PASS\nopenssl rand -hex 32   # → JWT_SECRET\n\n# 3. (Optional) Pull the image up front\ndocker pull ghcr.io/jaameypr/aethera-next:latest\n\n# 4. Start the stack\ndocker compose -f docker-compose.prod.yml pull\ndocker compose -f docker-compose.prod.yml up -d\n```\n\nThe image is published to the GitHub Container Registry as `ghcr.io/jaameypr/aethera-next`. Available tags:\n\n| Tag | Channel | Description |\n|-----|---------|-------------|\n| `latest` | Stable | Most recent tagged release (also tagged `0.2.0`, `0.2`, …) |\n| `edge` | Master | Latest build from the `master` branch |\n| `experimental` | Experimental | Latest build from the `experimental` branch (also `experimental-\u003csha\u003e`) |\n\nSelect a tag via the `AETHERA_TAG` environment variable, which `docker-compose.prod.yml` reads (defaults to `latest`):\n\n```bash\nAETHERA_TAG=edge docker compose -f docker-compose.prod.yml up -d\n```\n\nThe panel is available at `http://\u003chost\u003e:3000` (or `APP_PORT` if overridden).  \nOn first run, the setup wizard will guide you through creating the admin account.\n\n### Key Environment Variables\n\n| Variable | Description |\n|----------|-------------|\n| `MONGO_PASS` | MongoDB root password |\n| `JWT_SECRET` | Secret used to sign all JWTs |\n| `AETHERA_DATA_DIR` | Host path for server data volumes |\n| `AETHERA_BACKUP_DIR` | Host path for backup storage |\n| `AETHERA_MINECRAFT_IMAGE` | Docker image for Minecraft servers (default: `itzg/minecraft-server`) |\n| `DISCORD_BOT_TOKEN` | *(Optional)* Enable Discord integration |\n| `CURSEFORGE_API_KEY` | *(Optional)* Enable CurseForge pack support |\n| `MODULE_REGISTRY_URL` | *(Optional)* Remote URL for the module registry |\n\nSee `.env.example` for the full list.\n\n---\n\n## Development\n\nBuild and run from source — this path uses the existing `docker-compose.yml` (which builds the image locally) via `run.sh`:\n\n```bash\n# Clone the repo, then build and start the stack from source\n./run.sh up      # builds the image and starts app + mongo\n```\n\nOr run the Next.js app directly without Docker:\n\n```bash\nnpm install\nnpm run dev       # start dev server at http://localhost:3000\nnpm run build     # production build\nnpm test          # run Vitest test suite\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaameypr%2Faethera-next","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjaameypr%2Faethera-next","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaameypr%2Faethera-next/lists"}