The control centre for Luna Network: every Minecraft server across every machine in the cluster, with its plugins, config, ports and players, managed from a centralized web console or a terminal.
State, health, tick rate, memory and player count for every backend and the proxy, live. No SSH, no screen attaches.
Verbs apply to the selection, so restarting nine servers is one action. A verb that cannot run on what you picked is disabled with the reason.
Per instance: the command it launched with, the JVM flags it inherited, the address the proxy routes to, and the process behind it.
Name, version, heap, machine. luna downloads the Paper build, allocates a port, writes the forwarding secret, registers the server with Velocity and deploys every plugin that targets it.
Each step reports as it runs, and a failure names the step that broke instead of leaving you to find what got half done.
CPU, memory, players, tick rate and JVM heap, sampled every five seconds and kept for an hour.
Tick rate and heap come from inside the server rather than from the outside of its process, so they match what players are feeling.
The log streams live, with a command line into the running server.
Each server gets the newest build compatible with the Minecraft version it runs, or the version you pinned. Nine plugin folders stay in step without being touched.
Targets are rules, not lists: *paper covers every Paper backend including ones that do not exist yet. Updates stay on their channel and never move a server backwards.
Search and install from Modrinth, Hangar and CurseForge, plus Smithed for data packs. The source is recorded, so update checks still work months later.
Real ranges, real choices, validated before anything reaches disk.
The keys that wire proxy forwarding are shown but locked. Editing one by hand breaks every login on that backend while the server still looks healthy.
Any file in an instance, edited in Monaco from the browser. A value you keep retyping becomes a placeholder backed by one variable.
When a plugin rewrites a managed config, the rewrite is reported as drift and its version is kept beside the file, so nothing is lost silently.
Variables layer builtin, global, machine, instance. Rotating a database password is one edit and a restart, not nine files.
Secrets are masked wherever they appear. Revealing one is recorded with the scope and the time, never with the value.
Per instance: what it resolves, which layer won, and which config files and plugin templates read it.
Allocation comes from named pools and is tracked per machine, because two hosts can both bind 25565.
Deleting a server releases its port. An audit flags duplicates, configs that drifted from the registry, and addresses the proxy disagrees with.
Pools are cluster-wide so a provision can land on any machine; a machine sets only the range it hands out.
[servers] and [forced-hosts] are generated from the instance registry and diffed against disk before anything is saved.
Only the sections luna owns get replaced, so the rest of velocity.toml survives. A backend on another machine gets its LAN address filled in.
A follower joins the cluster and its servers appear on the same screens. Instances are launched onto it from the same form.
Reachability is TCP-probed from the primary rather than inferred from the control link. Upgrades roll out by command, not by SSH.
Per machine: checks, resource headroom, owned instances and the build each daemon is running.
Everyone the network has seen, with first and last seen, the backend they were last on, playtime, sessions and auth type.
Recorded across the network rather than per server, so moderation and support are a lookup instead of a grep through seven log directories.
Balance, playtime by backend, chat, commands, permissions and moderation history on one page.
LuckPerms groups from one shared database, so a promotion lands on every server at once.
Group detail lists every node it carries, including what it inherits, with contexts and expiry.
Resource packs stack by priority, are scoped per server, and apply on a proxy reload.
Rules exclude as well as include, so *, !create is the whole network except the modded server.
The chest players open with /servers, edited as a chest: MiniMessage names, and tooltips drawn the way the client draws them with live status filled in.
Start, stop or restart on a cron expression, a fixed time or a rate. Nothing depends on a shell staying open.
Every run is kept with its outcome, so a restart that failed last Tuesday is on the record. Stops are graceful, not kills.
The compiled binary, with the completion engine the shell uses: Tab completion, ghost text and the same history. Everything the console cannot do yet is a command away.
The drawer shortens the page instead of covering it.
Alt+S indexes instances, addon groups, packs, schedules, ports, proxy routes, players, machines and variables.
Enter opens the hit. Objects without a page of their own hand their term to the table that lists them.
luna-console is built to run the luna ecosystem, and it leans on it. Without a copy of the luna suite of plugins and mods, the instance, addon, network and fleet screens still work; the player, permission and economy screens will be empty.
The host needs a JRE, GNU screen, and MariaDB and RabbitMQ if you want the player-facing screens to have anything in them. Everything else ships in one compiled binary.
sudo luna setup # install this machine: user, root, config, unit, start
luna setup --dry-run # every change it would make, making none
luna daemon run # the daemon that owns the cluster
luna web --host 0.0.0.0 # the console, on 8330
Building from source needs Bun:
bun install
bun run build # compile the single binary -> dist/luna
cd web && bun run build # the console bundle
docker build -t luna . # or the published image: binary + console + JRE + screen
Warning
This repository is public for transparency and to ship release artifacts to the machines that run it. It is not open source, and none of the above is permission to run it. See the licence below before you clone it.
This project does not take outside contributions. Issues and pull requests will be closed unread, and there is no roadmap to sign up to. Read the code if it is useful to you. The licence does not grant permission to build on it.
Copyright (c) 2026 Belikhun. All rights reserved.
Publishing this source does not place it in the public domain and does not make it open source. No permission is granted to any person to use, copy, modify, merge, publish, distribute, sublicense, create derivative works of, or sell this software or any part of it, in any form, without prior written permission from the copyright holder. Viewing the source, and the forking mechanics GitHub's Terms of Service afford to public repositories hosted there, are permitted. Nothing further is.
Third-party components are not covered by that notice. This includes the vendored assets under web/static/ and every dependency resolved at build time.
The full text is in LICENSE.























