From 43a624bbe7d38a2711eea78f0a917db321a80098 Mon Sep 17 00:00:00 2001 From: openhands Date: Mon, 20 Jul 2026 20:54:26 +0200 Subject: [PATCH] docs: add self-contained setup reference configs (emulator + nitro) and bold-link buttons --- .gitea/workflows/deploy.yaml | 8 ++-- setup/emulator/config.ini | 66 ++++++++++++++++++++++++++++ setup/emulator/emulator | 17 ++++++++ setup/emulator/emulator.service | 25 +++++++++++ setup/nitro/client-mode.json | 8 ++++ setup/nitro/renderer-config.json | 75 ++++++++++++++++++++++++++++++++ setup/nitro/ui-config.json | 38 ++++++++++++++++ 7 files changed, 233 insertions(+), 4 deletions(-) create mode 100644 setup/emulator/config.ini create mode 100755 setup/emulator/emulator create mode 100644 setup/emulator/emulator.service create mode 100644 setup/nitro/client-mode.json create mode 100644 setup/nitro/renderer-config.json create mode 100644 setup/nitro/ui-config.json diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml index 0754eb3f..44d4ed2a 100644 --- a/.gitea/workflows/deploy.yaml +++ b/.gitea/workflows/deploy.yaml @@ -77,7 +77,7 @@ jobs: echo "" echo "A complete hotel stack = **EpicNext-CMS** (this repo) + **Polaris Emulator** + **Nitro V3 client** + **Catalogus** data. Follow the steps in order." echo "" - echo '

Full setup guide EpicNext-CMS repo

' + echo "**Quick links:** [Full setup guide](https://github.com/duckietm/Complete-Retro-on-Ubuntu) · [EpicNext-CMS repo](https://gitlab.epicnabbo.nl/remco/EpicNext-Cms) · [Reference configs in this repo](https://gitlab.epicnabbo.nl/remco/EpicNext-Cms/src/branch/main/setup)" echo "" echo "### 1. Clone & Install the CMS" echo '```bash' @@ -121,7 +121,7 @@ jobs: echo "mvn clean package" echo '```' echo "" - echo "Place the built Habbo-*-jar-with-dependencies.jar next to config.ini, then create an emulator.service systemd unit so it starts on boot. The bundled update-Nitrov3.sh in this repo automates cloning, building and updating the emulator and Nitro — run it any time to pull the latest commits and rebuild:" + echo "Place the built Habbo-*-jar-with-dependencies.jar next to **config.ini** (see [setup/emulator/config.ini](https://gitlab.epicnabbo.nl/remco/EpicNext-Cms/src/branch/main/setup/emulator/config.ini)), then create a systemd unit from [setup/emulator/emulator.service](https://gitlab.epicnabbo.nl/remco/EpicNext-Cms/src/branch/main/setup/emulator/emulator.service) with the [emulator](https://gitlab.epicnabbo.nl/remco/EpicNext-Cms/src/branch/main/setup/emulator/emulator) launcher so it starts on boot. The bundled update-Nitrov3.sh in this repo automates cloning, building and updating the emulator and Nitro — run it any time to pull the latest commits and rebuild:" echo '```bash' echo "./update-Nitrov3.sh" echo '```' @@ -136,7 +136,7 @@ jobs: echo "cd /var/www/Nitro-V3 && yarn install && yarn link \"@nitrots/nitro-renderer\" && yarn build" echo '```' echo "" - echo "Rename the *.example files in /var/www/Nitro-V3/public/configuration to *.json and set your domain, API URL and gamedata paths (see the Full setup guide, NitroV3_And_Emulator.md)." + echo "Copy the reference configs from [setup/nitro/](https://gitlab.epicnabbo.nl/remco/EpicNext-Cms/src/branch/main/setup/nitro) into /var/www/Nitro-V3/public/configuration, keep them as *.json, and replace **MY_DOMAIN** with your domain, API URL and gamedata paths (see the Full setup guide, NitroV3_And_Emulator.md)." echo "" echo "### 8. Catalogus (catalog & gamedata)" echo "" @@ -188,7 +188,7 @@ jobs: echo "| Nitro-Render-V3 | https://github.com/duckietm/Nitro_Render_V3 | ${RENDER_REF:-?} |" echo "| Polaris Emulator | https://github.com/duckietm/Polaris-Emulator | ${EMU_REF:-?} |" echo "" - echo '

Nitro-V3 Nitro Renderer Polaris Emulator Catalogus

' + echo "**[Nitro-V3](https://github.com/duckietm/Nitro-V3)** · **[Nitro Renderer](https://github.com/duckietm/Nitro_Render_V3)** · **[Polaris Emulator](https://github.com/duckietm/Polaris-Emulator)** · **[Catalogus](https://gitlab.epicnabbo.nl/remco/Epicnabbo-Catalogus-Updated-Daily)**" echo "" echo "---" echo "*Automated release from Gitea Actions*" diff --git a/setup/emulator/config.ini b/setup/emulator/config.ini new file mode 100644 index 00000000..8730c63e --- /dev/null +++ b/setup/emulator/config.ini @@ -0,0 +1,66 @@ +# =========================================================================== +# Polaris Emulator — reference config.ini +# Copy this to /var/www/emulator/Emulator/target/config.ini and fill in the +# values marked CHANGE_ME. The emulator reads this file on startup. +# Full guide: https://github.com/duckietm/Complete-Retro-on-Ubuntu +# =========================================================================== + +# ---- Database configuration ---- +db.hostname=127.0.0.1 +db.port=3306 +db.database=habbo # DB name (shared with the CMS) +db.username=root # Username +db.password=CHANGE_ME # Password +db.params=?characterEncoding=utf8&useSSL=false&serverTimezone=Europe/Amsterdam +db.pool.minsize=25 +db.pool.maxsize=100 +db.pool.connection_timeout_ms=10000 +db.pool.idle_timeout_ms=600000 +db.pool.max_lifetime_ms=1800000 +db.pool.validation_timeout_ms=5000 +db.pool.leak_detection_ms=20000 # set to 0 to disable leak detection + +# ---- Game configuration ---- +# Host IP. Use 0.0.0.0 in most cases. Use 127.0.0.1 for LAN only. +game.host=0.0.0.0 +game.port=3000 + +# ---- RCON configuration ---- +# Leave host at 127.0.0.1 if the CMS runs on the same server as the emulator. +rcon.host=127.0.0.1 +rcon.port=3001 +rcon.allowed=127.0.0.1;127.0.0.2 + +# ---- Nitro secure runtime assets (disabled by default) ---- +nitro.secure.assets.enabled=false +nitro.secure.api.enabled=false +nitro.secure.session_ttl_sec=900 +nitro.secure.config.root= +nitro.secure.gamedata.root= +# Set a persistent secret when using Cloudflare or multiple backend requests. +nitro.secure.master_key=change-me-to-a-long-random-secret + +# ---- Login ---- +login.remember.enabled=true +login.remember.duration.days=30 +# Optional: set a persistent remember-me JWT secret here. +login.remember.jwt.secret= +login.news.limit=5 + +# ---- Secure runtime ECDH session TTL in seconds ---- +# (kept for compatibility; unused when secure assets are disabled) + +# ---- WebSockets (Nitro client) ---- +ws.enabled=true +ws.host=0.0.0.0 +ws.port=2096 +# Header used to obtain the real client IP when behind a proxy +# (usually X-Forwarded-For, or CF-Connecting-IP behind Cloudflare). +ws.ip.header=X-Forwarded-For + +# ---- Console / emulator_settings ---- +# Run these SQL statements ONCE, after importing the emulator database: +# USE habbo; +# UPDATE emulator_settings SET `value` = '0' WHERE `key` = 'console.mode'; +# UPDATE emulator_settings SET `value` = 'MY_DOMAIN.COM,*.MY_DOMAIN.COM,localhost,127.0.0.1' WHERE `key` = 'websockets.whitelist'; +# console.mode MUST be 0 and the whitelist MUST match your domain. diff --git a/setup/emulator/emulator b/setup/emulator/emulator new file mode 100755 index 00000000..5829085c --- /dev/null +++ b/setup/emulator/emulator @@ -0,0 +1,17 @@ +#!/bin/sh +# Launcher for the Polaris emulator. +# Place at /var/www/emulator/Emulator/target/emulator and chmod +x. +# Update the JAR name to match the version built by `mvn clean package`. + +file_name_emulator=emulator.log +current_time=$(date "+%H%M_%d-%m-%Y") +file_name=$file_name_emulator.$current_time + +# Rotate the previous log +mkdir -p /var/log/emu +mv /var/log/emu/emulator.log /var/log/emu/$file_name 2>/dev/null || true + +# -Xmx4096m = 4 GB. 1 GB=1024, 2 GB=2048, 3 GB=3072, 4 GB=4096 +java -Dfile.encoding=UTF8 -Xmx4096m \ + -jar /var/www/emulator/Emulator/target/Habbo-*-jar-with-dependencies.jar \ + >/var/log/emu/emulator.log diff --git a/setup/emulator/emulator.service b/setup/emulator/emulator.service new file mode 100644 index 00000000..5cfe3de2 --- /dev/null +++ b/setup/emulator/emulator.service @@ -0,0 +1,25 @@ +[Unit] +Description=Habbo Emulator + +# Make sure the database has started before the emulator can start +After=mariadb.service +Requires=mariadb.service + +# If you want to run as a less privileged account, change User below. +# Make sure that account has the right permissions on the working directory and target folders. +[Service] +User=root + +# Working directory where config.ini and the JAR live +WorkingDirectory=/var/www/emulator/Emulator/target + +# The launcher script we created below. It is a shell wrapper that calls the JAR. +ExecStart=/var/www/emulator/Emulator/target/emulator + +SuccessExitStatus=143 +TimeoutStopSec=10 +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target diff --git a/setup/nitro/client-mode.json b/setup/nitro/client-mode.json new file mode 100644 index 00000000..542160d2 --- /dev/null +++ b/setup/nitro/client-mode.json @@ -0,0 +1,8 @@ +{ + "distObfuscationEnabled": false, + "secureAssetsEnabled": false, + "secureApiEnabled": false, + "apiBaseUrl": "https://MY_DOMAIN:2096", + "plainConfigBaseUrl": "https://MY_DOMAIN/configuration/", + "plainGamedataBaseUrl": "https://MY_DOMAIN/gamedata/" +} diff --git a/setup/nitro/renderer-config.json b/setup/nitro/renderer-config.json new file mode 100644 index 00000000..fe6ef1d2 --- /dev/null +++ b/setup/nitro/renderer-config.json @@ -0,0 +1,75 @@ +{ + "socket.url": "wss://MY_DOMAIN.COM:2096", + "crypto.ws.enabled": false, + "crypto.ws.signing.enabled": false, + "crypto.ws.signing.public_key": "", + "api.url": "https://MY_DOMAIN.COM:2096", + "asset.url": "https://MY_DOMAIN.COM/gamedata", + "image.library.url": "http://MY_DOMAIN.COM/gamedata/c_images/", + "hof.furni.url": "https://MY_DOMAIN.COM", + "images.url": "${asset.url}/images", + "gamedata.url": "${asset.url}", + "sounds.url": "${asset.url}/sounds/%sample%.mp3", + "external.texts.url": [ + "${gamedata.url}/config/ExternalTexts.json?v=1", + "${gamedata.url}/config/UITexts.json?v=1" + ], + "external.samples.url": "${gamedata.url}/sounds/sound_machine_sample_%sample%.mp3", + "furnidata.url": "${gamedata.url}/config/FurnitureData.json?v=1", + "productdata.url": "${gamedata.url}/config/ProductData.json?v=1", + "avatar.actions.url": "${gamedata.url}/config/HabboAvatarActions.json?v=1", + "avatar.figuredata.url": "${gamedata.url}/config/FigureData.json?v=1", + "avatar.figuremap.url": "${gamedata.url}/config/FigureMap.json?v=1", + "avatar.effectmap.url": "${gamedata.url}/config/EffectMap.json?v=1", + "avatar.asset.url": "${asset.url}/clothes/%libname%.nitro", + "avatar.asset.effect.url": "${asset.url}/effect/%libname%.nitro", + "furni.asset.url": "${asset.url}/furniture/%libname%.nitro", + "furni.asset.icon.url": "http://MY_DOMAIN.COM/gamedata/icons/%libname%%param%_icon.png", + "pet.asset.url": "${asset.url}/pets/%libname%.nitro", + "generic.asset.url": "${asset.url}/bundled/generic/%libname%.nitro", + "room.asset.url": "${asset.url}/room/%libname%/%libname%.json", + "badge.asset.url": "${image.library.url}album1584/%badgename%.gif", + "badge.asset.group.url": "http://MY_DOMAIN.COM/habbo-imaging/badge/%badgedata%", + "badge.asset.group.external.url": "", + "badge.asset.grouparts.url": "https://MY_DOMAIN.COM/gamedata/badgeparts/badgepart_%part%.png", + "furni.rotation.bounce.steps": 20, + "furni.rotation.bounce.height": 0.0625, + "room.color.skip.transition": false, + "enable.avatar.arrow": false, + "system.animation.fps": 60, + "system.limits.fps": false, + "system.dispatcher.log": false, + "system.packet.log": false, + "system.pong.manually": true, + "system.pong.interval.ms": 20000, + "room.color.skip.transition": true, + "user.badges.group.slot.enabled": true, + "timezone.settings": "Europe/Amsterdam", + "login.screen.enabled": true, + "login.endpoint": "${api.url}/api/auth/login", + "login.register.endpoint": "${api.url}/api/auth/register", + "login.forgot.endpoint": "${api.url}/api/auth/forgot-password", + "login.logout.endpoint": "${api.url}/api/auth/logout", + "login.health.endpoint": "${api.url}/api/auth/health", + "login.check-email.endpoint": "${api.url}/api/auth/check-email", + "login.check-username.endpoint": "${api.url}/api/auth/check-username", + "login.room_templates.endpoint": "${api.url}/api/auth/room-templates", + "login.remember.endpoint": "${api.url}/api/auth/remember", + "login.server_key.endpoint": "${api.url}/api/auth/server-key", + "login.sso-token.endpoint": "${api.url}/api/auth/sso-token", + "login.refresh.endpoint": "${api.url}/api/auth/refresh", + "badges.custom.list.endpoint": "${api.url}/api/badges/custom", + "badges.custom.create.endpoint": "${api.url}/api/badges/custom", + "badges.custom.update.endpoint": "${api.url}/api/badges/custom/%badgeId%", + "badges.custom.delete.endpoint": "${api.url}/api/badges/custom/%badgeId%", + "badges.custom.texts.endpoint": "${api.url}/api/badges/custom/texts", + "account.change-password.endpoint": "${api.url}/api/auth/change-password", + "account.change-email.endpoint": "${api.url}/api/auth/change-email", + "account.change-username.endpoint": "${api.url}/api/auth/change-username", + "login.health.method": "GET", + "login.news.url": "${asset.url}/news/news.json", + "login.turnstile.enabled": false, + "login.turnstile.sitekey": "", + "avatar.mandatory.libraries": ["bd:1", "li:0"], + "avatar.mandatory.effect.libraries": ["dance.1", "dance.2", "dance.3", "dance.4"] +} diff --git a/setup/nitro/ui-config.json b/setup/nitro/ui-config.json new file mode 100644 index 00000000..b7e8d710 --- /dev/null +++ b/setup/nitro/ui-config.json @@ -0,0 +1,38 @@ +{ + "image.library.notifications.url": "${image.library.url}notifications/%image%.png", + "achievements.images.url": "${image.library.url}Quests/%image%.png", + "camera.url": "https://MY_DOMAIN.COM/camera/photo", + "thumbnails.url": "https://MY_DOMAIN.COM/camera/photo/thumb/%thumbnail%.png", + "url.prefix": "", + "habbopages.url": "/gamedata/habbopages/", + "group.homepage.url": "${url.prefix}/groups/%groupid%/id", + "guide.help.alpha.groupid": 0, + "chat.viewer.height.percentage": 0.4, + "widget.dimmer.colorwheel": false, + "avatar.wardrobe.max.slots": 10, + "user.badges.max.slots": 5, + "camera.publish.disabled": false, + "hc.disabled": false, + "badge.descriptions.enabled": true, + "motto.max.length": 38, + "bot.name.max.length": 15, + "wired.action.bot.talk.to.avatar.max.length": 64, + "wired.action.bot.talk.max.length": 64, + "wired.action.chat.max.length": 100, + "wired.action.kick.from.room.max.length": 100, + "wired.action.mute.user.max.length": 100, + "game.center.enabled": false, + "catalog.style.new": true, + "show.google.ads": false, + "loginview": { + "images": { + "background": "${asset.url}/c_images/reception/stretch_blue.png", + "background.colour": "#6eadc8", + "sun": "${asset.url}/c_images/reception/sun.png", + "drape": "${asset.url}/c_images/reception/drape.png", + "left": "${asset.url}/c_images/reception/ts.png", + "right": "${asset.url}/c_images/reception/US_right.png", + "right.repeat": "${asset.url}/c_images/reception/US_top_right.png" + } + } +}