Crafty Controller
Overview
Crafty Controller is an open source, self-hosted control panel for creating, running and administering Minecraft and other game servers from your browser. You can create, start, stop and restart servers, watch a live console and send commands, edit configuration and files, schedule automated tasks and backups, and set per-server CPU and memory limits. Role-based access lets your team share the panel, all without touching the command line.
This SecureAnyCloud image runs Crafty Controller from the vendor's official container (crafty-controller/crafty-4, pinned by digest), published only on loopback 127.0.0.1:8443. nginx fronts it on port 443 over TLS and is WebSocket aware, so the live console and status channels work through the proxy. It is ready for your own certificate. The panel's embedded SQLite datastore lives in Docker volumes captured into the image.
The image is secure by default. Crafty generates a fresh, random administrator password on the first boot of every instance. It is never baked into the image, and SecureAnyCloud writes it to a root-only file, /root/crafty-credentials.txt, for you to retrieve. On first boot, the crafty-firstboot.service oneshot generates a per-VM TLS certificate, starts the stack, captures the per-VM admin password and resolves the instance URL, then disables itself.
What you get:
- Crafty Controller 4.10.7 (GPL-3.0) from the official
crafty-controller/crafty-4image, pinned by digest - Embedded SQLite datastore in Docker volumes (
crafty-config,crafty-servers,crafty-backups,crafty-logs,crafty-import) crafty.servicerunning the container, published on127.0.0.1:8443- A unique random admin password generated at first boot, stored
0600 root:rootin/root/crafty-credentials.txt - An nginx TLS reverse proxy on port 443 (port 80 redirects to 443), WebSocket aware, with a per-VM self-signed certificate
crafty-firstboot.servicefor first-boot certificate generation, admin capture and stack start- Bundled Java runtime handling for the game servers Crafty manages
- Docker Engine runtime
- Ubuntu 24.04 LTS base, patched at build time
- 24/7 SecureAnyCloud support, 24h response SLA
Prerequisites
You need an active Azure subscription, an SSH key pair, and a VNet with a subnet.
The recommended VM size is Standard_B2s. The panel is lightweight, so size the VM for the game servers you create later.
Deploy from the Azure Portal
Search the Marketplace for Crafty Controller on Ubuntu 24.04 and choose your VM size. Attach an NSG that allows TCP 22 (SSH) from your management network and TCP 443 (the panel) from the networks that need it.
To run game servers that players connect to, you open the relevant game ports later.
Deploy from the Azure CLI
RG="crafty-prod"; LOCATION="eastus"; VM_NAME="crafty-01" IMAGE_URN="sac1647283583153:crafty-controller-ubuntu-24-04:default:latest" SSH_KEY="$(cat ~/.ssh/id_rsa.pub)" az group create --name "$RG" --location "$LOCATION" az network vnet create -g "$RG" --name crafty-vnet --address-prefix 10.80.0.0/16 --subnet-name crafty-subnet --subnet-prefix 10.80.1.0/24 az network nsg create -g "$RG" --name crafty-nsg az network nsg rule create -g "$RG" --nsg-name crafty-nsg --name allow-ssh --priority 100 \
--source-address-prefixes "<your-mgmt-cidr>" --destination-port-ranges 22 --access Allow --protocol Tcp az network nsg rule create -g "$RG" --nsg-name crafty-nsg --name allow-panel --priority 110 \
--source-address-prefixes "<your-mgmt-cidr>" --destination-port-ranges 443 --access Allow --protocol Tcp
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:crafty-controller-ubuntu-24-04:default:latest
az vm create -g "$RG" --name "$VM_NAME" --image "$IMAGE_URN" \
--size Standard_B2s --storage-sku StandardSSD_LRS \
--admin-username azureuser --ssh-key-values "$SSH_KEY" \
--vnet-name crafty-vnet --subnet crafty-subnet --nsg crafty-nsg --public-ip-sku StandardConnect via SSH
ssh azureuser@<vm-ip>Verify the services are running
Crafty runs in a container published on loopback 127.0.0.1:8443. nginx fronts the panel on port 443 over TLS and proxies its WebSocket traffic. Check the services:
systemctl is-active docker crafty nginx crafty-firstboot
sudo ss -tlnp | grep -E ':443 |127.0.0.1:8443'
sudo docker ps --format 'table {{.Names}}\t{{.Status}}'All services report active, nginx is bound to :443, the container is published only on 127.0.0.1:8443, and the crafty container is Up.
Retrieve your unique admin password
No known password ships in the image. Crafty generated a random administrator password for this VM at first boot and wrote it to a root-only file. Check the file's permissions and read it:
sudo stat -c '%n perms=%a owner=%U:%G' /root/crafty-credentials.txt
sudo cat /root/crafty-credentials.txtThe file is 600 root:root and holds CRAFTY_ADMIN_USERNAME (admin) and a unique CRAFTY_ADMIN_PASSWORD generated for this instance. Copy the password, and change it after your first login.
Log in to the panel
Open https://<vm-ip>/ in your browser. The panel uses a per-VM self-signed certificate, so your browser shows a certificate warning the first time. Accept it, or install your own certificate (see Step 12).
Enter the Username (admin) and the Password from /root/crafty-credentials.txt, then click Log In.
The dashboard
After you sign in, you land on the dashboard. It shows host CPU, memory and storage, how many servers are online and offline, and an All Servers panel. A fresh instance has no servers yet, so the dashboard invites you to create your first one.
Create a game server
Click Create New Server on the dashboard or in the Servers menu. Choose the server type (Minecraft Java, Minecraft Bedrock or Hytale), pick the server flavour and version, and give it a name. Under Quick Settings, set the minimum and maximum memory and the server port.
Click Create Server, and Crafty downloads the server files and provisions the server. You can also import an existing server from a zip archive.
Users, roles and configuration
Open Panel Settings to reach the Crafty Configuration area. Under Panel Config, add users, assign them to servers, and create roles with fine-grained permissions. Your team then shares access without sharing the admin password.
Your admin account is a super user with access to all servers.
The stack
sudo docker inspect --format '{{.Config.Image}}' crafty
sudo docker exec crafty cat /crafty/app/config/version.json | tr -d ' \n' nginx -v curl -sk -o /dev/null -w 'GET / -> HTTP %{http_code}\n' https://127.0.0.1/The pinned crafty-4 image runs the panel, the Crafty version is 4.10.7, nginx fronts it over TLS, and the panel returns HTTP 200 through nginx.
Data and persistence
All Crafty data lives in the embedded SQLite database and the server files inside Docker volumes. The volumes are captured into the image and carried onto every instance.
sudo docker volume ls | grep crafty
sudo docker exec crafty ls -lh /crafty/app/config/db/crafty.sqlite systemctl is-enabled crafty-firstboot.service apt-mark showholdThe volumes are present, the database file is on disk inside crafty-config, and the first-boot service is enabled for the next fresh instance. There are no held packages, so the OS security baseline is intact.
Install your own TLS certificate
The image ships with a per-VM self-signed certificate, so the panel is encrypted from first boot. To remove the browser warning, point a DNS record at your VM and install a trusted certificate with certbot:
sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d <your-domain> --agree-tos -m <your-email> --redirectcertbot obtains the certificate, rewrites the nginx server block to use it, and sets up automatic renewal. The panel is then served over HTTPS with a trusted certificate.
Running game servers
Crafty runs your game servers inside its container. To let players reach a server you create, open the game's port on your NSG (for example TCP 25565 for a default Minecraft Java server) and publish it from the container.
The panel image publishes only the management port by design. Adjust the container's published ports for the game servers you run, then restart the service:
sudo systemctl status crafty --no-pager | head -n 6
sudo docker logs --tail 8 craftyManaging the service
Restart the stack with sudo systemctl restart crafty, and follow the live container logs with sudo docker logs -f crafty. The nginx logs are under /var/log/nginx/.
Back up the instance by snapshotting the OS disk or by using Crafty's built-in scheduled backups. Change the admin password from the Crafty user settings after your first login.
Support
SecureAnyCloud provides 24/7 support for this image by email and live chat. Support covers deployment, nginx TLS termination, upgrades, game server configuration and performance tuning. Email sales@secureanycloud.com.
This is a repackaged open source software product, with additional charges for SecureAnyCloud support services. Crafty Controller is a trademark of its respective owner. All product and company names are trademarks or registered trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.
Deploy on Azure
Launch Crafty Controller on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Overview
Crafty Controller is an open source, self-hosted control panel for running and administering Minecraft and other game servers from your browser. You can create, start, stop and restart servers, watch a live console, edit configuration and files, schedule automated tasks and backups, set per-server CPU and memory limits, and import existing servers. Role-based access lets your team share the panel, all without touching the command line.
This SecureAnyCloud image runs Crafty Controller as the vendor's official crafty-controller/crafty-4 container, pinned by digest, under a single systemd service. The panel binds to the loopback interface only, on HTTPS port 8443. A host nginx reverse proxy terminates TLS on port 443 with a per-instance self-signed certificate and proxies WebSocket console and stats traffic through to the panel. Plain HTTP on port 80 redirects to HTTPS.
Docker Engine and its entire data root live on a dedicated data volume mounted at /var/lib/docker. That includes the pre-pulled, digest-pinned image and every Crafty volume: the SQLite panel database and configuration, your game-server directories and worlds, backups, logs and imports. Your game data survives OS-disk changes and is resizable independently.
Security is enforced from first boot. Crafty generates a fresh, random administrator password on its first database initialisation, and this image never bakes in a known credential. Before the panel is reachable, the per-instance password is captured to a root-only file and a per-instance TLS certificate is generated. Only then does nginx start.
What you get:
- Crafty Controller 4.10.7, the GPL-3.0 licensed game-server control panel, shipped as the vendor's official container pinned by digest, with its GPL-3.0 licence text baked to
/opt/crafty-controller/LICENSE - Docker Engine with the Crafty panel on the loopback interface behind nginx over TLS on port 443
- A unique random administrator password generated on first boot and written to a root-only file, never baked into the image
- A per-instance self-signed TLS certificate generated on first boot
- The panel database and every managed game server on a dedicated data volume at
/var/lib/docker docker.service,crafty.serviceandnginx.serviceas systemd units, enabled and active- 24/7 SecureAnyCloud support
What is not included (by design): no Minecraft or other game server software is bundled, and no end-user licence agreement is accepted on your behalf. You choose and download a server through the panel and accept its end-user licence agreement yourself at run time, exactly as you would on your own hardware. The panel bundles the Java runtime required to run the servers you create.
Prerequisites
You need an AWS account, an EC2 key pair in the target Region, and a VPC with a public subnet.
m5.large (2 vCPU / 8 GiB RAM) is the recommended instance type. Choose a larger type for busier servers with more players.
Configure the security group to allow inbound 22/tcp from your management network for SSH and 443/tcp for the web panel. This image deliberately does not open the game-server port (Minecraft defaults to 25565/tcp). Add it to your security group yourself, only for the servers you choose to run.
Step 1 - Launch the AMI
Subscribe to the listing in AWS Marketplace, then launch an instance from the AMI into your VPC with the security group described above. Choose the m5.large instance type and attach your EC2 key pair.
The image keeps the pre-pulled container image on the dedicated data volume, so the panel comes up within a couple of minutes of first boot with no image re-pull.
Step 2 - Connect to your instance
Connect over SSH as the default login user for the operating system variant you launched. On Ubuntu 24.04, the login user is ubuntu:
ssh -i your-key.pem ubuntu@<public-ip>Step 3 - Read your unique administrator credential
On first boot, the instance captures the random administrator password that Crafty generated on its first database initialisation, along with the resolved panel URL, and writes them to a root-only file. Read it with sudo:
sudo cat /root/crafty-credentials.txtThe file shows CRAFTY_ADMIN_USERNAME, CRAFTY_ADMIN_PASSWORD and CRAFTY_URL for this instance. There is no default or shared login anywhere in the image. The password is unique to this instance and differs on every launch. Change it from the Crafty user settings after your first sign-in.
Step 4 - Verify the security model from the command line
Confirm that the three services are active:
systemctl is-active docker crafty nginxactive active activeConfirm that the panel binds only to loopback on 8443 and that nginx is the only public listener on 443:
sudo ss -tlnp | grep -E ':(443|8443)\b'LISTEN 0 511 0.0.0.0:443 0.0.0.0:* LISTEN 0 4096 127.0.0.1:8443 0.0.0.0:* LISTEN 0 511 [::]:443 [::]:*The panel is on 127.0.0.1:8443 (loopback only), so it is never exposed directly. Only nginx on 443 faces the network.
Confirm that the TLS front door answers and that plain HTTP redirects to HTTPS:
curl -sk -o /dev/null -w 'HTTPS /login -> %{http_code}\n' https://127.0.0.1/login
curl -s -o /dev/null -w 'HTTP / -> %{http_code}\n' http://127.0.0.1/HTTPS /login -> 200 HTTP / -> 301Confirm that the baked GPL-3.0 licence is present:
head -2 /opt/crafty-controller/LICENSEGNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007Step 5 - Sign in to the web panel over TLS
Open the panel in a browser at https://<instance-public-ip>/. The instance uses a per-instance self-signed TLS certificate, so your browser warns about the certificate the first time. Accept it to continue, or front the instance with your own domain and certificate (see Step 8).
Sign in with the CRAFTY_ADMIN_USERNAME and CRAFTY_ADMIN_PASSWORD from Step 3. You land on the dashboard, which shows host CPU, memory and storage usage and the status of every server you manage. A fresh instance has no servers yet.
Change the administrator password now. Open the user menu (top right) and set your own password. Keep the root-only credentials file only as a record of the original.
Step 6 - Create your first game server
On the dashboard, choose Create New Server. Crafty opens a wizard where you select the server type and version, name the server, and set its memory limits and port.
When you create a server, Crafty downloads the server software you selected, and you accept that software's end-user licence agreement at that point. For Minecraft servers, this means accepting Mojang's Minecraft End User Licence Agreement, exactly as you would when running the server yourself. This image ships only the Crafty Controller panel. It bundles no game server and accepts no such agreement on your behalf.
The game-server port (Minecraft defaults to 25565) is not open in the instance security group. When you are ready to let players connect, add the specific port for that server to your security group, scoped to the networks you trust. Keeping the port closed by default means a freshly launched instance never exposes an unconfigured game server to the internet.
Step 7 - Manage users and roles
Crafty supports multiple users with role-based access, so moderators and helpers can operate specific servers without SSH or root access to the host. Open Panel Settings to add users, create roles and scope each role to the servers it may control.
Step 8 - Data volume and backups
The Docker data root lives on a dedicated EBS data volume mounted at /var/lib/docker, separate from the OS disk. That means the panel database, the configuration, and every managed game server, world and backup are on that volume. Confirm the mount:
df -hT /var/lib/docker /Filesystem Type Size Used Avail Use% Mounted on /dev/nvme1n1 ext4 40G ... ... /var/lib/docker /dev/root ext4 19G ... ... /The volume is mounted by filesystem UUID (see /etc/fstab), so it survives reboots and re-launches. Back it up with EBS snapshots or AWS Backup, and resize it independently of the OS disk as your worlds and backups grow. Crafty's own scheduled-backup feature writes into this same volume, so a single snapshot captures both the panel database and your backup archives.
To front the panel with your own domain and a trusted certificate, point a DNS record at the instance or an Application Load Balancer. Then either terminate TLS at the load balancer with an ACM certificate, or replace the per-instance self-signed certificate at /etc/nginx/ssl/ with your own and reload nginx.
Security model
- No default or shared credentials. The administrator password is generated fresh and at random on every instance's first boot and written only to a root-only file. It is never baked into the image.
- Per-instance TLS. nginx terminates TLS on port 443 with a per-instance self-signed certificate generated on first boot. Plain HTTP on port 80 redirects to HTTPS.
- Loopback-only panel. The Crafty panel binds exclusively to
127.0.0.1:8443. Only the nginx reverse proxy is exposed to the network. - Deliberate game-server exposure. The game-server port is never opened by default. You open it in your security group only for the servers you choose to run.
- Dedicated data volume. The panel database and every managed server live on their own EBS volume, which survives OS-disk changes and is resizable independently.
Troubleshooting
- The panel does not load. Check the services with
systemctl status docker crafty nginxand the first-boot log at/var/log/sac/sac-firstboot.log. On a brand-new instance, allow a couple of minutes for first boot to generate the certificate and capture the administrator credential. - Certificate warning in the browser. This is expected on a fresh instance, which uses a per-instance self-signed certificate. Accept it, or install your own certificate as in Step 8.
- Players cannot connect to a server. Confirm that you added that server's port to the instance security group and that the server is started in the panel.
- Lost the administrator password. Read it again with
sudo cat /root/crafty-credentials.txt.
Support
SecureAnyCloud provides 24/7 technical support for this product by email and live chat at sales@secureanycloud.com. We help with deployment, reverse-proxy termination with your own domain and certificate, opening game-server ports safely, sizing instances for your player counts, and scheduling and restoring backups of your game worlds and panel database.
Deploy on AWS
Launch Crafty Controller with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com