---
title: "Deploy Minecraft Server"
description: "Paper Minecraft server with web console and plugins for friends"
category: "Other"
url: https://railway.com/deploy/minecraft-server-1
---

# Deploy Minecraft Server

Paper Minecraft server with web console and plugins for friends

**[Deploy Minecraft Server on Railway](https://railway.com/template/minecraft-server-1)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/minecraft-server-1/manifest.json

- **Creator:** Will
- **Category:** Other

## Template content

### Caddy https://bogusz.co/external/caddy-icon.png

- **Image:** caddy:2.11.4-alpine
- **Start command:** `/bin/sh -c 'printf "%s\n" ":${PORT} {" "  reverse_proxy https://${CRAFTY_HOST}:8443 {" "    header_up Host {http.request.host}" "    transport http {" "      tls_insecure_skip_verify" "    }" "  }" "}" > /tmp/Caddyfile; exec caddy run --config /tmp/Caddyfile --adapter caddyfile'`
- **Health check:** /status
- **Public domain:** Yes

### Crafty Controller https://bogusz.co/external/crafty-controller-icon.png

- **Image:** arcadiatechnology/crafty-4:4.10.8
- **Start command:** `/bin/sh -c 'set -eu; cd /; mv /crafty /image-crafty; root=/data/root2; hold=/data/.crafty-state; mkdir -p "$hold"; if [ -d "$root/app/config" ] && [ ! -e "$hold/config" ]; then mv "$root/app/config" "$hold/config"; fi; for d in backups logs servers import; do if [ -d "$root/$d" ] && [ ! -e "$hold/$d" ]; then mv "$root/$d" "$hold/$d"; fi; done; rm -rf "$root"; mkdir "$root"; cp -aL /image-crafty/. "$root/"; seeded=0; rm -rf "$root/app/config"; if [ -d "$hold/config" ]; then mv "$hold/config" "$root/app/config"; else cp -a "$root/app/config_original" "$root/app/config"; rm -f "$root/app/config/default.json"; umask 077; printf '"'"'{"username":"admin","password":"%s"}\n'"'"' "$CRAFTY_ADMIN_PASSWORD" > "$root/app/config/default.json"; chown crafty:root "$root/app/config/default.json"; seeded=1; fi; for d in backups logs servers import; do rm -rf "$root/$d"; if [ -d "$hold/$d" ]; then mv "$hold/$d" "$root/$d"; else mkdir "$root/$d"; chown crafty:root "$root/$d"; chmod g+rwx "$root/$d"; fi; done; image_hash=$(sha256sum /image-crafty/main.py | cut -d " " -f1); runtime_hash=$(sha256sum "$root/main.py" | cut -d " " -f1); [ "$image_hash" = "$runtime_hash" ]; printf "Image refresh verified: main.py sha256=%s\n" "$runtime_hash"; if [ "$seeded" = 1 ]; then (while [ ! -s "$root/app/config/default-creds.txt" ]; do sleep 1; done; rm -f "$root/app/config/default.json" "$root/app/config/default-creds.txt"; [ ! -e "$root/app/config/default.json" ]; printf "Credential seed removed after admin creation\n") & else [ ! -e "$root/app/config/default.json" ]; printf "Credential seed absent: persisted admin state reused\n"; fi; ln -s "$root" /crafty; cd /crafty; exec ./docker_launcher.sh -d -i'`

## Documentation

# Deploy and Host Minecraft Server with Railway

Run a private Paper Minecraft Java server for friends without managing a VPS. Crafty Controller gives you a browser console, file manager, players, schedules, backups, and server settings. Caddy publishes that panel safely through Railway, while Railway gives the game its own TCP address.

## About Hosting Minecraft Server

This template deploys two pinned services: **Crafty Controller** runs the panel and your Paper server, and **Caddy** publishes the panel on a public web address. The Minecraft world, server files, Crafty settings, and backups are stored on the **Crafty Controller** service's persistent Railway volume.

The **Caddy** service's URL is the management console, not the address players enter in Minecraft. Players use the separate TCP Proxy address on the **Crafty Controller** service.

## Common Use Cases

- A private Paper world for a small group of friends
- A browser-managed server with no SSH administration
- Bukkit and Spigot plugins managed through a file browser
- Scheduled backups before updates or plugin changes
- Operator and whitelist management from the live console

## Dependencies for Minecraft Server Hosting

- A Railway Hobby account
- A licensed Minecraft Java Edition client for each player
- The [Minecraft EULA](https://www.minecraft.net/eula), accepted when the server first starts
- [Crafty Controller](https://craftycontrol.com/) for administration
- [Paper](https://papermc.io/) for the Minecraft Java server

### Deployment Dependencies

The template uses the pinned stock images `arcadiatechnology/crafty-4:4.10.8` and `caddy:2.11.4-alpine`. There are no required form fields.

### Implementation Details

The **Crafty Controller** service owns the persistent data and game endpoint; the **Caddy** service is the public front door to it. Complete the login, Paper wizard, and TCP Proxy steps below in order.

## Start Playing in Three Steps

### 1. Deploy and sign in

Click **Deploy**, choose your Railway project, and wait for both services to finish deploying. In the Railway dashboard, open your project, select the **Caddy** service, then open its public URL from **Settings → Networking**.

Sign in with username `admin`. For the password, return to the Railway project canvas, select the **Crafty Controller** service, open **Variables**, and copy the value of `CRAFTY_ADMIN_PASSWORD`.

### 2. Build and start Paper

In Crafty, open **Servers → Create New Server** and follow this exact wizard flow:

1. Open the **Minecraft-Java** tab.
2. Set **Server Select** to `paper`.
3. Choose **Server Version** and enter a **Server Name**.
4. Set **Minimum Memory** to `4` and **Maximum Memory** to `4`.
5. Click **Build Server**.
6. Open the new server, click **Start**, accept the EULA, and wait for `Done` in the console.

The tested build took about five minutes; Start to `Done` took about 38 seconds. Keep the panel open while Paper downloads and creates the world.

### 3. Copy the game address and invite friends

In the Railway dashboard, open the **Crafty Controller** service, then **Settings → Networking → TCP Proxy**. Copy the complete `host:port`, including the port after the colon. The public port usually is not `25565`.

In Minecraft Java, choose **Multiplayer → Add Server**, paste that value into **Server Address**, and save it. Paste the same `host:port` in Discord for your friends. Do not send them the Caddy URL; that URL is only the Crafty console.

## Operators, Whitelist, and Plugins

Open the server's **Terminal** page in Crafty and run these commands without a leading slash:

```text
op PLAYER_NAME
whitelist on
whitelist add PLAYER_NAME
```

Replace `PLAYER_NAME` with the player's Java username. Only make trusted people operators.

To install a plugin, stop the server, open its **Files** page, enter the `plugins/` directory, upload a Paper-compatible plugin JAR, and restart. Add one plugin at a time and check the console. BlueMap is one possible Paper plugin, but it is not included in this version; publishing its live map would need additional networking that this template does not configure.

## Backups, Worlds, and Upgrades

Crafty's **Backup** page creates, restores, downloads, and removes backups. Its policy editor can compress backups, stop the server during a backup, exclude paths, and cap retention; `0` keeps every backup. Backup files are on the same persistent volume under `/data/root2/backups`, grouped by server and backup policy.

To schedule one, open the server's **Schedule** page, create a schedule, choose **Backup Server**, select the backup policy, and set an interval or cron schedule. To download your world, open **Backup**, run the Default Backup, edit that policy, and click **Download** beside the completed archive. Keep an off-Railway copy: a backup on the same volume does not protect against deleting the volume or project.

Live server files, including the world, are under `/data/root2/servers/SERVER_UUID/` on the volume. Use Crafty's file manager and Backup page instead of trying to browse the Railway volume directly.

Before changing Minecraft versions, download a backup. Either create a separate server with the new version in **Create New Server**, or select the existing server, open **Update Center**, choose Paper and the target version, submit the settings, then run **Update Server**. Watch the console and test the world before inviting everyone back. World upgrades can be one-way; do not downgrade unless Paper and every plugin support it.

A redeploy briefly takes the game and panel offline because the volume-attached **Crafty Controller** service cannot overlap old and new deployments. The world persists on its volume and returns when Crafty starts again.

## Requirements

**The Railway Hobby plan is required.** Trial and Free accounts are limited to 1 GB or less of RAM and a 0.5 GB volume; the Crafty panel can deploy within those limits, but a Minecraft server will not run there.

The heap you choose in the Crafty wizard sets how much memory the server uses. Memory grows toward the full heap as people play and explore; 4 GB is a comfortable default for a small group with a few plugins.

## Java Edition Only

This template is for Minecraft Java Edition. It does not host Bedrock Edition or provide Java/Bedrock cross-play. Railway's TCP Proxy carries Java's TCP connection; Bedrock requires UDP, which the proxy does not support. Phones, tablets, consoles, and the Windows Bedrock client cannot join this server without a separate tested UDP or cross-play service, which is not included.

## Frequently Asked Questions

**Which Minecraft versions work?** Any Paper release Crafty offers in the wizard, including the current Minecraft Java Edition version, and you can run a different version per server. Players need a matching Java Edition client.

**Can my friends on a phone, console, or Xbox join?** Not with this template. Those are Bedrock Edition and need UDP, which Railway's TCP Proxy does not carry.

**How do I add plugins?** Stop the server, upload the plugin JAR to `plugins/` in Crafty's file manager, and start it again. Paper runs Bukkit, Spigot, and Paper plugins.

**How do I make myself an operator?** In the server's Terminal in Crafty, run `op YOUR_NAME`.

**Where is my world stored, and how do I back it up?** On the **Crafty Controller** service's Railway volume. Crafty's Backup page makes downloadable archives and can run on a schedule.

**What is the server address my friends type in?** The **Crafty Controller** service's TCP Proxy `host:port` from Settings → Networking, not the Caddy panel URL.

### Why Deploy Minecraft Server on Railway?

Railway runs the panel, reverse proxy, persistent storage, and public game endpoint in one project. You manage Paper from the browser, keep the world on a volume, and share one complete TCP address with friends.

## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/minecraft-server-1
