"Come in, come in, and know me better Man."
It's been a bit since I have posted. Life is always going and there is so much to learn. I have been learning more about AI and infrastructure surrounding it for work. I have been using it a bit more both there and at home. I have even played with coding some apps and my own agent harness and interface.
There are ups and downs. It is certainly an interesting (and often frustrating) process. There are some things it can be very helpful with though. One of them is planning and documentation. This walkthrough is a testament to that. I had to guide it and steer it, and double check it and I believe I got it to what I needed.
I am a gamer, and I have several I have always wanted to host in a more persistent way. With my homelab setup, I finally have a chance to do that. In this case 7 games I play semi regularly and a couple of demo hosts I am able to take advantage of that I destroy and rebuild n a regular basis. This wasn't all done at once for me, but I have enough documented steps now from various places to make it work. And I thought this would be a good chance to share a walkthrough here.
Prerequisites
- You need an OCI VPS (it can be small its just going to run a couple of things)
- You Need NGINX acting as a reverse Proxy for your on prem stuff
- You need some place to run your self hosted infrastructure (this can be in the cloud as well, but I am set up at home)
- You need a domain, and you need a DNS Provider. I use Cloudflare for these.
Steps
- The first step is to follow Thomas Wildes guide here It's very thorough, and easy to follow. It was the first step for me in creating a way to securely serve internal apps to the outside world.
- You may want to set up some vLANs on network segregation to keep your Game server(s) separated from the rest of your network. I am also using a Proxmox cluster and virtualization for even further separation.
- You will want AMP server for this walkthrough. Yes I use this and paid for it. You will also see I have 4 instances of the amp server running. One runs in Hybrid mode and acts as the ADS(AMP Deployment Server) and as a game host, and the other three act as target hosts. This lets me control all of my game instances and hosts from a single AMP instance that can be passed through my tunnel.
- I also use VSCode to do most of my editing. Particularly for my OCI VPS as it give me a nice visual picture of the file structure. But feel free to just SSH using a key and VIM or NANO if you are more comfortable there.
What is this?
Below is the outline and steps the LLM and I cam up with to ensure the games I wanted to run would work. You would of course modify this for whatever games you want to run, but the general idea is a good solid guide with all the right steps in place to show a clear picture of how to do this. When set up correctly you have security, multiple layers of segregation and isolation. A single management panel and TLS security for access to that. And a game or game cluster to share with your friends and family.
π HybridCloudHQ β Game Server Master Reference
Cluster Summary
4-node Proxmox VE hyper-converged cluster Β· Ceph Β· AMP + Docker game hosting Β· Pangolin/OCI tunnel Β· NGINX + TLS Ceph raw: 3.88 TiB Β· Usable (rep-3): ~1.13 TiB Β· Utilization target: β€ 50% per node
1 β Cluster Hardware
| Property | Value |
|---|---|
| Nodes | 4Γ (PVE1βPVE4) |
| CPU (per node) | AMD Ryzen 5 β 6C/12T, up to 4.0 GHz |
| Usable host threads (per node) | 10 (2 reserved for Proxmox) |
| RAM (per node) | 64 GB DDR4 |
| Ceph raw total | 3.88 TiB (4 OSDs, one per node) |
| Ceph usable (rep-2) | ~1.13 TiB |
| Proxmox version | |
| External tunnel | OCI VPS β Pangolin + Traefik + Gerbil + Crowdsec |
| TLS | NGINX reverse proxy β already configured |
2 β Node Role Map
| Node | Primary Role | VMs Hosted |
|---|---|---|
| PVE1 | Heavy game (isolated) | amp-conan (102) |
| PVE2 | Heavy game + demo/conditional | amp-enshrouded (104) Β· dune-awakening (107) Β· openshift-sno (300) Β· azure-local-demo (301) |
| PVE3 | Medium games + services | amp-medium (105) Β· containers-a (100) |
| PVE4 | Light games + ADS + services + primary failover | amp-node4 (106) Β· containers-b (103) |
3 β Master VM Table
| VMID | VM Name | Node | vCPUs | RAM Max | Balloon Min | Disk | onboot |
Purpose |
|---|---|---|---|---|---|---|---|---|
| 100 | containers-a | PVE3 | 3 | 8 GB | 3 GB | 60 GB | 1 | Container services A |
| 102 | amp-conan | PVE1 | 6 | 28 GB | 6 GB | 100 GB | 1 | AMP Β· Docker: Conan Exiles Enhanced |
| 103 | containers-b | PVE4 | 2 | 8 GB | 3 GB | 60 GB | 1 | Container services B |
| 104 | amp-enshrouded | PVE2 | 6 | 26 GB | 6 GB | 80 GB | 1 | AMP Β· Docker: Enshrouded |
| 105 | amp-medium | PVE3 | 5 | 20 GB | 6 GB | 80 GB | 1 | AMP Β· Docker: Valheim Β· V Rising Β· Return to Moria |
| 106 | amp-node4 | PVE4 | 6 | 16 GB | 6 GB | 100 GB | 1 | AMP ADS (hybrid) Β· Docker: Minecraft Β· Dragonwilds |
| 107 | dune-awakening | PVE2 | 8 | 24 GB | 8 GB | 120 GB | 0 | AMP Β· Docker: Dune Awakening β CONDITIONAL |
| 300 | openshift-sno | PVE2 | 8 | 32 GB | β | 120 GB thin | 0 | RHCOS SNO β EPHEMERAL |
| 301 | azure-local-demo | PVE2 | 6 | 32 GB | β | 128 GB thin | 0 | Azure Local β EPHEMERAL |
Node Resource Summary
| Node | vCPUs Allocated | RAM Max | RAM Balloon Min | Failover Headroom |
|---|---|---|---|---|
| PVE1 | 6 / 10 | 28 GB | 6 GB | ~36 GB free |
| PVE2 | 6 / 10 (base) | 26 GB | 6 GB | ~52 GB free at balloon min |
| PVE3 | 8 / 10 | 28 GB | 9 GB | ~36 GB free |
| PVE4 | 8 / 10 | 24 GB | 9 GB | ~40 GB free β primary failover target |
4 β Master Port Reference
AMP SFTP β LAN/VPN Only, Never Internet Exposed
AMP assigns a unique SFTP port per game instance for admin file management (mods, configs, world saves). Players never use SFTP β do not add these ports to OCI, iptables, Traefik, or Pangolin. Access SFTP via your local LAN or VPN when remote. Each instance on amp-medium gets its own port so they don't collide on the same VM.
This Table Is the Single Source of Truth
OCI Security List, iptables, traefik_config.yml, docker-compose.yml, Pangolin UI, and AMP instance config must all match the Internet ports in this table exactly.
4.1 β Game Ports (Internet Exposed via Pangolin)
| Service | VM (VMID) | Proto | Port | Notes |
|---|---|---|---|---|
| Conan Exiles Game | amp-conan (102) | TCP | 7777 | Both TCP and UDP required |
| Conan Exiles Game | amp-conan (102) | UDP | 7777 | Must match end-to-end β NO remap ever |
| Conan Pinger | amp-conan (102) | UDP | 7778 | Must match end-to-end |
| Conan Steam Query | amp-conan (102) | UDP | 27015 | Must match end-to-end |
| Enshrouded Query | amp-enshrouded (104) | TCP | 15637 | AMP-confirmed port |
| Enshrouded Query | amp-enshrouded (104) | UDP | 15637 | AMP-confirmed port |
| Valheim Game | amp-medium (105) | UDP | 2456 | |
| Valheim Query | amp-medium (105) | UDP | 2457 | |
| V Rising Game | amp-medium (105) | UDP | 9876 | |
| V Rising Query | amp-medium (105) | UDP | 9877 | |
| Return to Moria Game | amp-medium (105) | UDP | 7780 | Remapped from default 7777 inside AMP |
| Minecraft Java | amp-node4 (106) | TCP | 25565 | |
| Minecraft Java | amp-node4 (106) | UDP | 25565 | |
| RuneScape: Dragonwilds | amp-node4 (106) | UDP | 7779 | Remapped from default 7777 via AMP launch flag |
| Dune: Awakening | dune-awakening (107) | β | β | Server browser discovery only (PTC) β no Pangolin needed |
4.2 β Admin Ports (LAN/VPN Only β never through Pangolin)
| Service | VM (VMID) | Proto | Port | Notes |
|---|---|---|---|---|
| Conan SFTP | amp-conan (102) | TCP | 2224 | Admin file access β LAN/VPN only |
| Conan RCON | amp-conan (102) | TCP | 25575 | LAN/VPN only |
| Enshrouded SFTP | amp-enshrouded (104) | TCP | 2224 | Admin file access β LAN/VPN only |
| Enshrouded RCON | amp-enshrouded (104) | TCP | 25575 | LAN/VPN only |
| Valheim SFTP | amp-medium (105) | TCP | 2224 | Per-instance port β LAN/VPN only |
| Valheim RCON | amp-medium (105) | TCP | 25575 | LAN/VPN only |
| V Rising SFTP | amp-medium (105) | TCP | 2225 | Per-instance port β LAN/VPN only |
| V Rising RCON | amp-medium (105) | TCP | 25575 | LAN/VPN only |
| Return to Moria SFTP | amp-medium (105) | TCP | 2226 | Per-instance port β LAN/VPN only |
| Moria RCON | amp-medium (105) | TCP | 25577 | LAN/VPN only |
| Minecraft SFTP | amp-node4 (106) | TCP | 2224 | Admin file access β LAN/VPN only |
| Minecraft RCON | amp-node4 (106) | TCP | 25575 | LAN/VPN only |
| Dragonwilds SFTP | amp-node4 (106) | TCP | 2225 | Admin file access β LAN/VPN only |
| Dragonwilds RCON | amp-node4 (106) | TCP | 25578 | LAN/VPN only |
Conan Exiles β TCP+UDP 7777 Cannot Be Remapped. Ever.
Conan Exiles uses UE4 networking which hardwires the advertised port to the bound port. BattlEye validates port consistency on both TCP and UDP 7777 during the authentication handshake. A remap was attempted and confirmed broken. TCP 7777, UDP 7777, UDP 7778, and UDP 27015 must pass end-to-end with zero translation through iptables, Traefik, Pangolin, and AMP. Do not revisit this.
Return to Moria β Default 7777 Fixed by Internal Remap
Moria defaults to UDP 7777, conflicting with Conan at the Pangolin layer. Moria has no BattlEye β safe to remap. Fix inside AMP β Moria01 β Configuration:
ListenPort = 7780AdvertisePort = 7780
Pangolin exposes 7780 β 7780 with no translation. Restart instance after saving.
RuneScape: Dragonwilds β Default 7777 Fixed by Launch Flag Follow a pattern. 7777, 7778, 7779, etc...
Dragonwilds defaults to UDP 7777 β no BattlEye, safe to remap. Fix inside AMP β Dragonwilds01 β GenericModule β Launch Parameters: add -port=7779. Pangolin exposes 7779 β 7779. Restart instance after saving.
Enshrouded β Verify Additional Ports if Needed
AMP confirms TCP+UDP 15637. If players report connection issues, also test opening 15636 (game) and 15638 (stream) β add to OCI, iptables, and Pangolin if required.
TCP and UDP 7777 Are Different Sockets
Conan requires both. Traefik treats tcp-7777 and udp-7777 as completely independent entryPoints β both must be defined in traefik_config.yml and mapped in docker-compose.yml.
Pangolin β One Backend Per External Port + Protocol
Traefik binds one OS socket per entryPoint. A second Pangolin target on the same port+protocol crashes Traefik on next restart. All game ports in this cluster are unique per protocol β do not reuse them.
5 β OCI VPS Setup
5.1 Security List Ingress Rules
Navigate: Networking β VCN β Security Lists β Default Security List
Source CIDR: 0.0.0.0/0 for all game ports. Do not add SFTP or RCON ports.
- [ ] TCP 7777 β Conan game (TCP required alongside UDP)
- [ ] UDP 7777 β Conan game
- [ ] UDP 7778 β Conan pinger
- [ ] UDP 27015 β Conan Steam query
- [ ] TCP 15637 β Enshrouded query
- [ ] UDP 15637 β Enshrouded query
- [ ] UDP 2456 β Valheim game
- [ ] UDP 2457 β Valheim query
- [ ] UDP 9876 β V Rising game
- [ ] UDP 9877 β V Rising query
- [ ] UDP 7780 β Return to Moria game
- [ ] TCP 25565 β Minecraft Java
- [ ] UDP 25565 β Minecraft Java
- [ ] UDP 7779 β RuneScape: Dragonwilds
- [ ] TCP 443 β Pangolin HTTPS
- [ ] TCP 80 β Pangolin HTTP redirect
5.2 OCI VPS iptables
# TCP game ports
sudo iptables -I INPUT 6 -p tcp -m multiport \
--dports 80,443,7777,15637,25565 -j ACCEPT
# UDP game ports
sudo iptables -I INPUT 6 -p udp -m multiport \
--dports 7777,7778,7779, 7780,2456,2457,9876,9877,15637,25565,27015 -j ACCEPT
# Persist
sudo netfilter-persistent save
# Verify
sudo iptables -L INPUT -n -v --line-numbers
6 β Pangolin Setup
NGINX + TLS Is Already In Place
HTTP resources (AMP ADS, Portainer, Forgejo, Stirling PDF) are handled by your existing NGINX reverse proxy. Only Raw TCP/UDP game server ports need Pangolin entryPoints. SFTP and RCON are never added here.
6.1 traefik_config.yml β Add Under entryPoints:
File: /opt/pangolin/config/traefik/traefik_config.yml
entryPoints:
# Pangolin system β do not modify existing entries
websecure:
address: :443
web:
address: :80
# Conan Exiles β TCP AND UDP 7777, no remapping ever
tcp-7777:
address: :7777/tcp
udp-7777:
address: :7777/udp
udp-7778:
address: :7778/udp
udp-27015:
address: :27015/udp
# Enshrouded β query port TCP + UDP
tcp-15637:
address: :15637/tcp
udp-15637:
address: :15637/udp
# Valheim
udp-2456:
address: :2456/udp
udp-2457:
address: :2457/udp
# V Rising
udp-9876:
address: :9876/udp
udp-9877:
address: :9877/udp
# Return to Moria β internal port also 7780 (changed in AMP)
udp-7780:
address: :7780/udp
tcp-7780:
address: :7780/tcp
# Minecraft
udp-25565:
address: :25565/udp
# RuneScape: Dragonwilds β internal port also 7785 (AMP launch flag)
udp-7779:
address: :7779/udp
# SFTP ports β NOT added here (LAN/VPN access only)
# Dune: Awakening β NOT added here (PTC server-list discovery only)
6.2 docker-compose.yml β Add Under services: gerbil: ports:
File: /opt/pangolin/docker-compose.yml
ports:
- 443:443
- 80:80
# Conan Exiles β both TCP and UDP 7777 required
- 7777:7777/tcp
- 7777:7777/udp
- 7778:7778/udp
- 27015:27015/udp
# Enshrouded
- 15637:15637/tcp
- 15637:15637/udp
# Valheim
- 2456:2456/udp
- 2457:2457/udp
# V Rising
- 9876:9876/udp
- 9877:9877/udp
# Return to Moria
- 7780:7780/udp
- 7780:7780/tcp
# Minecraft
- 25565:25565/udp
# RuneScape: Dragonwilds
- 7779:7779/udp
# SFTP NOT mapped here β LAN/VPN only
# Dune: Awakening NOT mapped here β server-list only
This is what I mean by easy for me to visualize the editing here
6.3 Apply and Verify
cd /opt/pangolin
docker compose up -d
docker compose restart traefik
# Check UDP listeners
ss -lunp | grep -E '7777|7778|7779|7780|2456|2457|9876|9877|15637|25565|27015'
# Check TCP listeners β 7777 and 15637 are both TCP now
ss -ltnp | grep -E '7777|15637|443|80'
# Check Traefik β no crash loops, no "address already in use"
docker ps
docker logs traefik --tail=50
6.4 Pangolin Raw TCP/UDP Resources
Create one resource per row. Do not create resources for SFTP or RCON ports.
| Resource Name | Protocol | External Port | Target Address | Target Port | VM |
|---|---|---|---|---|---|
| conan-game-tcp | TCP | 7777 | amp-conan LAN IP | 7777 | 102 |
| conan-game-udp | UDP | 7777 | amp-conan LAN IP | 7777 | 102 |
| conan-pinger | UDP | 7778 | amp-conan LAN IP | 7778 | 102 |
| conan-query | UDP | 27015 | amp-conan LAN IP | 27015 | 102 |
| enshrouded-query-tcp | TCP | 15637 | amp-enshrouded LAN IP | 15637 | 104 |
| enshrouded-query-udp | UDP | 15637 | amp-enshrouded LAN IP | 15637 | 104 |
| valheim-game | UDP | 2456 | amp-medium LAN IP | 2456 | 105 |
| valheim-query | UDP | 2457 | amp-medium LAN IP | 2457 | 105 |
| vrising-game | UDP | 9876 | amp-medium LAN IP | 9876 | 105 |
| vrising-query | UDP | 9877 | amp-medium LAN IP | 9877 | 105 |
| moria-game | UDP | 7780 | amp-medium LAN IP | 7780 | 105 |
| minecraft-tcp | TCP | 25565 | amp-node4 LAN IP | 25565 | 106 |
| minecraft-udp | UDP | 25565 | amp-node4 LAN IP | 25565 | 106 |
| dragonwilds | UDP | 7779 | amp-node4 LAN IP | 7785 | 106 |
7 β AMP Installation & Configuration
AMP Architecture
AMP is installed bare metal on the VM OS. During install, answer YES to Docker isolation. AMP then manages each game server as a Docker container internally β handling Wine, SteamCMD, and dependencies per-container automatically.
7.1 AMP Install Command (all AMP VMs)
sudo su
bash <(wget -qO- getamp.sh)
# Prompts:
# Username / password β set strong credentials
# Docker isolation β YES β critical
# HTTPS β No (NGINX handles TLS)
Apply licence key in the web UI at http://<vm-ip>:xxxx β restart when prompted.
7.2 AMP Instance Registry
| AMP Instance | VMID | VM Name | Node | AMP Role | Game | Internet Port(s) | SFTP Port |
|---|---|---|---|---|---|---|---|
| ADS01 | 106 | amp-node4 | PVE4 | ADS Controller | β | TCP xxxx (UI) | β |
| Conan01 | 102 | amp-conan | PVE1 | Target | Conan Exiles Enhanced | TCP+UDP 7777 Β· UDP 7778 Β· UDP 27015 | TCP 2224 |
| Enshrouded01 | 104 | amp-enshrouded | PVE2 | Target | Enshrouded | TCP+UDP 15637 | TCP 2224 |
| Valheim01 | 105 | amp-medium | PVE3 | Target | Valheim | UDP 2456 Β· UDP 2457 | TCP 2224 |
| VRising01 | 105 | amp-medium | PVE3 | Target | V Rising | UDP 9876 Β· UDP 9877 | TCP 2225 |
| Moria01 | 105 | amp-medium | PVE3 | Target | Return to Moria | UDP 7780 | TCP 2226 |
| Minecraft01 | 106 | amp-node4 | PVE4 | Via ADS | Minecraft Java | TCP+UDP 25565 | TCP 2224 |
| Dragonwilds01 | 106 | amp-node4 | PVE4 | Via ADS | RuneScape: Dragonwilds | UDP 7779 | TCP 2225 |
| Dune01 | 107 | dune-awakening | PVE2 | Target | Dune: Awakening | Server list (PTC) | TCP 2224 |
amp-medium Hosts Three Game Servers
Valheim01, VRising01, and Moria01 all run as separate Docker containers inside VMID 105. AMP assigns each its own SFTP port (2224, 2225, 2226) so they don't collide. Manage all three through ADS01.
amp-node4 Is a Hybrid VM
VMID 106 runs AMP ADS and hosts Minecraft and Dragonwilds via that same ADS instance. No network hop needed β ADS and its instances communicate internally on the same VM.
7.3 Critical AMP Port Configurations
Return to Moria β Must Remap From Default 7777
AMP β Moria01 β Configuration β Network:
ListenPort = 7780
AdvertisePort = 7780
Restart instance after saving. Verify in instance logs that it reports binding to 7780.
There was also a challenge here getting everything to apply 100% correctly so I edited the MoriaServerConfig.ini directly and imported the config to AMP to ensure it grabbed all of the settings (advertise address and advertise port were the most important here as it was hitting my home internet public IP and I needed it to hit the IP of the AMP host.)
[Host]
ListenAddress=0.0.0.0
ListenPort=7780
AdvertiseAddress=[your.host.ip.address]
AdvertisePort=7780
InitialConnectionRetryTime=60
AfterDisconnectionRetryTime=600
If the instance ever resets to defaults: re-apply the above and restart.
RuneScape: Dragonwilds β Must Remap From Default 7777
AMP β Dragonwilds01 β GenericModule β Launch Parameters, add:
-port=7779
Restart instance after saving.
If the instance ever resets to defaults: re-apply the above and restart.
Minecraft Java β JVM Heap & GC Flags
AMP β Minecraft01 β Java Settings β Memory: Min 4 GB / Max 10 GB
JVM Arguments:
-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1
8 β Demo & Conditional VMs (PVE2)
PVE2 One-at-a-Time Rule
VMIDs 107, 300, and 301 all live on PVE2 alongside amp-enshrouded (104). amp-enshrouded balloon min = 6 GB Β· host reserve = 6 GB Β· free at idle = ~52 GB Any two ephemeral/conditional VMs together consume 48β64 GB β exceeds node capacity. Run only ONE of 107, 300, or 301 at any time.
VMID 300 β openshift-sno (Ephemeral)
qm start 300 # verify 107 and 301 are stopped first
qm shutdown 300
VMID 301 β azure-local-demo (Ephemeral)
qm start 301 # verify 107 and 300 are stopped first
qm shutdown 301
VMID 107 β dune-awakening (Conditional)
| Property | Value |
|---|---|
| OS | Ubuntu Server 24.04 LTS |
| AMP | Bare metal + Docker isolation |
| CPU requirement | AVX2 β satisfied by cpu: host on Ryzen 5 |
| Specs | 8 vCPU Β· 24 GB / 8 GB balloon Β· 120 GB CephPool |
onboot |
0 β start manually only |
| Connection method | In-game server browser only (PTC phase) |
| Pangolin resources | None needed |
Dune: Awakening β Token Required Before First Start
- Own Dune: Awakening on Steam
- Install and run the PTC client at least once
- Get your token:
https://account-pts.duneawakening.com/(sign in with Steam) - AMP β Dune01 β Configuration β Dune Awakening β Identity β Self-Host Service Token β paste β save
- Do NOT touch "FLS World Name" unless Funcom has specifically issued you one
Dune: Awakening Known Issues (PTC β May 2026)
Confirmed bugs β not setup errors:
- Resource monitoring shows 0 β server is running, ignore it
- Player tracking broken β AMP cannot detect player joins/leaves
- "Missing Configuration" on first update β run the update a second time, it will succeed
- Several minutes to appear in server browser after startup β wait patiently
- PTC world data not guaranteed to persist after full release
qm start 107 # verify 300 and 301 are stopped first
# Stop the instance in AMP first for graceful world save, then:
qm shutdown 107
9 β Operational Gotchas & Tips
Conan Exiles β TCP AND UDP 7777. No Remap. Ever.
TCP 7777, UDP 7777, UDP 7778, and UDP 27015 must be identical at OCI, iptables, Traefik, Pangolin, and AMP. BattlEye + UE4 hardwire port advertising across both protocols. Remap = broken auth = zero players. Confirmed by prior failed attempt.
PVE2 β Never Run Multiple Ephemeral/Conditional VMs Simultaneously
107 + 300 = 56 GB Β· 107 + 301 = 56 GB Β· 300 + 301 = 64 GB. All exceed available headroom when amp-enshrouded is at its balloon minimum. Check PVE2 free RAM before starting any of 107, 300, 301.
Pangolin β One Port+Protocol = One Backend
Traefik crashes on next restart if two resources share an external port+protocol. Change the internal port of the conflicting service first.
SFTP Ports β LAN/VPN Only, Always
Never add SFTP ports (2224, 2225, 2226) to OCI Security List, iptables, Traefik, or Pangolin. Access via WireGuard/Tailscale when remote. Players do not need SFTP.
Moria Remap β If Instance Resets to Defaults
Re-apply: AMP β Moria01 β Configuration β ListenPort=7780, AdvertisePort=7780 β restart.
Dragonwilds Remap β If Instance Resets to Defaults
Re-apply: AMP β Dragonwilds01 β GenericModule β Launch Parameters β -port=7779 β restart.
Enshrouded β Confirm Port Coverage if Players Can't Connect
AMP confirms TCP+UDP 15637. If players have issues, also test 15636 (game) and 15638 (stream) β add to OCI, iptables, and Pangolin if needed.
Dune: Awakening β Token Is Per-Instance
Each separate Dune server instance needs its own unique self-host token from https://account-pts.duneawakening.com/.
cpu: host on Every VM β Always
Passes AVX2, AES-NI, SHA, and vmx/svm. AVX2 is specifically required by Dune: Awakening. Never use kvm64.
Balloon Min Is Intentionally Low
Game containers idle at 2β6 GB. The balloon driver reclaims unused RAM for live migrations. Raise balloon min only if swap is observed after 72 hours of real load:
ssh <vm-ip> 'vmstat -s | grep swap'
AMP Docker Isolation β Why It Was Chosen
Docker isolation (YES during install) means AMP handles Wine, SteamCMD, and per-game dependencies automatically. Return to Moria's Wine layer and Dune's dependencies are both managed this way. Changing it requires a full AMP reinstall.
Crowdsec on OCI VPS
High UDP packet rates from game clients can trigger false-positive bans. Whitelist game server IPs and port ranges in Crowdsec rules or add custom scenario exclusions.
10 β Quick Reference Commands
Verify Game Ports (OCI VPS)
# UDP game ports
ss -lunp | grep -E '7777|7778|7779|7780|2456|2457|9876|9877|15637|25565|27015'
# TCP game ports β 7777 and 15637 are both TCP
ss -ltnp | grep -E '7777|15637|25565|443|80'
Pangolin
cd /opt/pangolin
docker compose up -d
docker compose restart traefik
docker logs traefik --tail=50 # Check for errors
ss -lunp | grep <port> # Verify a specific port
VM Lifecycle
qm start <VMID>
qm shutdown <VMID>
qm status <VMID>
qm migrate <VMID> <target-node> --online
qm snapshot <VMID> <name> "<description>"
qm listsnapshot <VMID>
qm rollback <VMID> <snapname>
AMP
ampinstmgr status
ampinstmgr startall
ampinstmgr stopall
journalctl -u ampinstmgr -f
11 β Game Server Status Summary
| Game | VM (VMID) | AMP | Internet Port(s) | SFTP | Status |
|---|---|---|---|---|---|
| Conan Exiles Enhanced | amp-conan (102) | β Docker | TCP+UDP 7777 Β· UDP 7778 Β· UDP 27015 | 2224 LAN | π’ Active β no remap ever |
| Enshrouded | amp-enshrouded (104) | β Docker | TCP+UDP 15637 | 2224 LAN | π’ Active |
| Valheim | amp-medium (105) | β Docker | UDP 2456 Β· UDP 2457 | 2224 LAN | π’ Active |
| V Rising | amp-medium (105) | β Docker | UDP 9876 Β· UDP 9877 | 2225 LAN | π’ Active |
| Return to Moria | amp-medium (105) | β Docker + Wine | UDP 7780 | 2226 LAN | π’ Active β remapped from 7777 |
| Minecraft Java | amp-node4 (106) | β Docker via ADS | TCP+UDP 25565 | 2224 LAN | π’ Active |
| RuneScape: Dragonwilds | amp-node4 (106) | β Docker via ADS | UDP 7779 | 2225 LAN | π’ Active β remapped from 7777 |
| Dune: Awakening | dune-awakening (107) | β Docker | Server list (PTC) | 2224 LAN | π Conditional Β· token required Β· onboot: 0 |
| OpenShift SNO | openshift-sno (300) | β | β | β | βͺ Ephemeral Β· onboot: 0 |
| Azure Local | azure-local-demo (301) | β | β | β | βͺ Ephemeral Β· onboot: 0 |
Here is what you wind up with. I think it's fantastic.
Anyway, I hope it help someone, and as always wishing you all the best.