Setting up Coolify, Minecraft, and a file browser on the free Oracle VM
Once the machine was up, the first thing I did was set up a Minecraft server. Hit a few snags along the way — none of them hard to work around.
The machine was up and SSH was working. Next up: deciding what to actually run on it.
My plan was to use Coolify to manage everything, and run a Minecraft server inside it. I'd wanted to do this for a while — before I had my own machine, hosting a server meant renting one with a fixed monthly fee, and I never used it enough to justify keeping it. Now the machine itself is free, so there's a reason to set one up properly.
This post covers the whole process, including a few things I had to work around.
Managing the server with Coolify
Coolify is an open-source self-hosted PaaS — think of it as your own Heroku or Railway. Under the hood it uses Docker and Docker Compose to run services, but you don't have to drop into the terminal every time. There's a web UI for deployments, environment variables, logs, and restarts.
Installation is easy — the official one-liner sets everything up and the panel runs on port 8000 by default:
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bashAfter install, open http://your-public-ip:8000 in a browser, set up the admin account, and you're in. The dashboard is clean — Projects, Servers, Services in the sidebar.
Don't forget to open port 8000 in Oracle's Security List, or the browser won't be able to reach it.
Deploying the Minecraft server
For Minecraft, I went with Paper — a performance-improved fork of Spigot with better plugin support. Runs fine on ARM.
In Coolify, I deployed it via Docker Compose. New Service → Docker Compose → paste the compose contents. A basic Paper server setup looks like this:
services:
minecraft:
image: itzg/minecraft-server
environment:
TYPE: PAPER
EULA: "TRUE"
MEMORY: "8G"
VERSION: "LATEST"
ports:
- "25565:25565"
volumes:
- ./data:/data
restart: unless-stoppedThe itzg/minecraft-server image is well put together. TYPE picks the server flavor, EULA: "TRUE" accepts Minecraft's EULA (the server won't start without it), and MEMORY caps the JVM heap.
Once deployed, open port 25565 (TCP) in Oracle's Security List and you can connect from the Minecraft client.
Problem one: no way to run Minecraft commands from Coolify
After connecting, the first thing I wanted to do was give myself op (admin) — without it, you can't run any commands in-game.
Coolify has a Terminal feature in the dashboard, but that terminal drops you into the container's shell, not the Minecraft console. Typing /op yourname in there does nothing — it's a bash shell, it doesn't speak Minecraft.
To talk to the Minecraft server you need to connect to its RCON interface. My fix: install a plugin called Better Web Panel (BWP). BWP is a Paper/Spigot plugin that opens a web interface on port 4242 where you can send server commands, view online players, and read logs straight from a browser — no shelling in, no RCON setup.
To make BWP reachable from outside, expose port 4242 in Docker Compose:
services:
minecraft:
image: itzg/minecraft-server
environment:
TYPE: PAPER
EULA: "TRUE"
MEMORY: "8G"
VERSION: "LATEST"
ports:
- "25565:25565"
- "4242:4242"
volumes:
- ./data:/data
restart: unless-stoppedThe plugin jar needs to go into the container's plugins/ directory. Which brings us to the next problem.
Problem two: how to manage files inside the container
Coolify's UI has no built-in file browser — there's no way to upload or modify files inside a container from the panel.
You can SSH in and use docker cp to copy files from the host into the container, but that's tedious every time you want to tweak a config or add a plugin.
My fix: add Filebrowser as a second service in the same Docker Compose file. Filebrowser is a lightweight web-based file manager — point it at a directory and you can browse, upload, edit, and delete files through the browser.
Add the Filebrowser service, mounting the Minecraft data directory:
services:
minecraft:
image: itzg/minecraft-server
environment:
TYPE: PAPER
EULA: "TRUE"
MEMORY: "8G"
VERSION: "LATEST"
ports:
- "25565:25565"
- "4242:4242"
volumes:
- ./data:/data
restart: unless-stopped
filebrowser:
image: filebrowser/filebrowser
ports:
- "8080:80"
volumes:
- ./data:/srv
restart: unless-stoppedAfter redeploying, open http://your-public-ip:8080, log in with the default credentials (admin / admin), and you can see the full directory tree for the Minecraft server. Upload the BWP jar into plugins/, restart the Minecraft container, and BWP is running.
Open port 8080 in the Security List too. Filebrowser doesn't have HTTPS by default — once you have it working, consider moving it to a less obvious port, or fronting it with something like Cloudflare Tunnel.
Setting up subdomains with Cloudflare
Last step. I didn't want to memorize a string of digits, so I set up subdomains for each service through Cloudflare.
My domain is already on Cloudflare, so I just added a few A records in DNS pointing the subdomains at the Oracle VM's public IP.
A few details:
Minecraft server: Leave the proxy off (grey cloud) in DNS. Minecraft uses TCP, not HTTP/HTTPS, and Cloudflare's HTTP proxy doesn't support it — turning it on will break the connection.
BWP and Filebrowser: These are HTTP services, so proxy on (orange cloud) is fine. Cloudflare handles SSL, you get HTTPS access, and your origin IP stays hidden.
A records usually propagate within minutes. nslookup or dig confirms.
What's running on the box
After all that, here's what's on the machine:
| Service | Port | Purpose |
|---|---|---|
| Coolify | 8000 | Management panel |
| Minecraft | 25565 | Game server |
| BWP | 4242 | Minecraft web console |
| Filebrowser | 8080 | File management |
The 4C / 24G machine handles all of this easily — memory's at maybe half, CPU's barely doing anything most of the time.
I want to run a few more self-hosted services on it eventually — there's plenty of headroom. The machine is genuinely free, and renting this configuration would run a few hundred TWD a month.