[Dev] [DEV] MuServer on Node.js

pafa7a

Well-Known Member
Joined
Jul 9, 2009
Messages
1,402
Reaction score
821
Здравейте съфорумници ;)

Днес реших, че искам да се поразръчкам малко из MuOnline sources и ми направи впечатление, че все-още няма особено много решения за MuServer под Linux/Mac. Всичко е обвързано с Windows, което не е много яко, защото хостинг на Windows си е в пъти по-скъпо от хостинг на Linux. Да не споменаваме speed, reliability, security, etc.
Та, реших да започна тази инициатива с чисто опознавателна цел. Далеч съм от мисълта, че ще я докарам до production ready. Дори не съм сигурен дали след някакво време няма да се откажа. Бутам само когато имам свободно време и ми се занимава.
Към момента какво съм направил:
Имаме Node.js ConnectServer който създава 1xTCP & 1xUDP сървъра. TCP сървъра слуша на порт 44405 и предназначението му е да си комуникира с клиента. Частта с комуникацията с клиента е готова на 100%. UDP сървъра служи за комуникация с JoinServer & GameServer. Там съм на 50% готов - получавам инфо от GameServer, остава да се декоднат пакетите и от JoinServer-a и да им се намери предназначение.
Тъй като е javascript, сметнах за по-яко ако вместо ServerList.dat да имаме ServerList.json, съответно във валиден JSON формат.
Имплементирал съм възможност да се презареждат настройките в ServerList.json през терминала - не е нужно да рестартирате сървъра за да се отразят промените. Имплементирах и нещо, което обикновенните ConnectServers нямат - при reload, да прати пакет на всички вързани клиенти да си обновят информацията и те - примерно ако добавя нов сървър в ServerList.json, мога да напиша "reload" и да видя промените си директно в клиента (без да трябва да рестартирам ConnectServer или Client).

След определено време най-вероятно ще пусна Github repo и ще го направя open-source. Най-вероятно ще преструктурирам и този пост за да е по-подреден и не чак толкова фокусиран върху ConnectServer а по-скоро върху цялата картинка.
Към момента в главата ми е следния списък с неща, които да метна на Node.js: ConnectServer, JoinServer, DataServer, GameServer.

Видео демо на ConnectServer.js:


Моля споделете 1 мнение какво мислите по въпроса, бихте ли взели участие в open-source-a и кат цяло какво мислите xD
- Updated root README.md
- Created a Discord server for the project - https://discord.gg/TFEZ7j4MZd
- The libs "mu-packet-manager" and "mu-db" are now publicly available in npmjs.com
- JoinServer TCP handlers are moved into separate files
- Added handler for login packets & returning response to GS
- Created GitHub project to tackle all future development & contributions: https://github.com/users/pafa7a/projects/4/views/2
- Registered domains "mu-js.com" and "muonline-js.com"

Upcoming plans:
- Complete user login logic in JoinServer, so it's using the DB to verify the credentials & returns the proper response
- Refactor the ConnectServer TCP & UDP servers - move all handlers into separate files
 
Last edited:
Добре звучи. Не разбрах дали ще пренаписваш сървъра или ще го превеждаш на js.

Надеждността на тази игра зависи основно от комуникацията клиент-сървър, а не от операционната система (освен ако Демона не е админ :D) така, че това трябва да ти е основният фокус. В тази връзка ако ще пренаписваш(а не превеждаш протокола) от c на js заложи на някой по-надежден енкрипт алгоритъм, нещо базирано на Feistel или RSA. Съпорт на IPV6 също няма да е лошо.

Успех.
 
Ще се включим как.. много яко!
 
Добре звучи. Не разбрах дали ще пренаписваш сървъра или ще го превеждаш на js.

Надеждността на тази игра зависи основно от комуникацията клиент-сървър, а не от операционната система (освен ако Демона не е админ :D) така, че това трябва да ти е основният фокус. В тази връзка ако ще пренаписваш(а не превеждаш протокола) от c на js заложи на някой по-надежден енкрипт алгоритъм, нещо базирано на Feistel или RSA. Съпорт на IPV6 също няма да е лошо.

Успех.
Най-вероятно ще се води пренаписване на сървъра, да. По въпроса за смяната на протоколите/пакетите - имам леки притеснения. Самата смяна за мен би била доста лесна, защото работя със source на main.exe. Целта ми (поне за сега) обаче е като правя нещата, да ги правя общи за всички сезони (до които имам достъп до source code). Примерно в настройките на GameServer-a да има опция "Version": "S3E1"/ "Version": "S6E2" или нещо от тоя сорт. Да се направи gameserver-a да работи с г/д всеки клиент. Ако ще се сменя протокола, ще трябва да се сменя и във всеки клиент, което не съм сигурен че ще мога да направя (ясно ми е, че думкам един .dll с който override-вам логиката, ама частта със събирането на офсетите, евентуалното декриптиране на main.exe и т.н. не ми се нрави много-много). Ще видим до къде ще стигне де - може пък на някой да му се занимава :D

Другото, което съвсем леко ме притеснява, е че има логика да се подмени client->server и всеки сървър да си има private key, ама посоката server->client малко се обезсмисля, защото това означава да има private key и в клиента, което е същото като да не правя нищо :D А може би не е чак толкова важно server->client да е защитено. Не знам какви хакове има и дали не се експойтва точно нещо от там.

Edit: мисля си за JWT попринцип. Притеснява ме единствено размера на пакетите дали няма да стане прекалено голям и това да се отрази на UX-a, ама ще експериментираме. За ConnectServer-a няма да е проблем със сигурност
 
Last edited:
Не знам как са нещата с тредовете и мултипроцесинга с node.js, но без добре менаджиране ще ти спича UI със сигурност. Това, което може да пробваш, ако е трудно с тредовете, ако ще бачка в линукс среда, да ползваш supervisor или systemd (да нкараш линукса да бачка за тебе) и пуснеш всеки процес на отделна нишка. Даже сега като се замисля, ако си направиш mini SDK ще можеш да си енкапсулираш решението, което ще помогне за антихак примерно в бъдеще.

http://supervisord.org/
 
Last edited:
Най-вероятно ще се води пренаписване на сървъра, да. По въпроса за смяната на протоколите/пакетите - имам леки притеснения. Самата смяна за мен би била доста лесна, защото работя със source на main.exe. Целта ми (поне за сега) обаче е като правя нещата, да ги правя общи за всички сезони (до които имам достъп до source code). Примерно в настройките на GameServer-a да има опция "Version": "S3E1"/ "Version": "S6E2" или нещо от тоя сорт. Да се направи gameserver-a да работи с г/д всеки клиент. Ако ще се сменя протокола, ще трябва да се сменя и във всеки клиент, което не съм сигурен че ще мога да направя (ясно ми е, че думкам един .dll с който override-вам логиката, ама частта със събирането на офсетите, евентуалното декриптиране на main.exe и т.н. не ми се нрави много-много). Ще видим до къде ще стигне де - може пък на някой да му се занимава :D

Другото, което съвсем леко ме притеснява, е че има логика да се подмени client->server и всеки сървър да си има private key, ама посоката server->client малко се обезсмисля, защото това означава да има private key и в клиента, което е същото като да не правя нищо :D А може би не е чак толкова важно server->client да е защитено. Не знам какви хакове има и дали не се експойтва точно нещо от там.

Edit: мисля си за JWT попринцип. Притеснява ме единствено размера на пакетите дали няма да стане прекалено голям и това да се отрази на UX-a, ама ще експериментираме. За ConnectServer-a няма да е проблем със сигурност

То в момента всеки клиент и сървър има .dec файл и .enc. Но те са добре познати и ако не се променя ключа (което никой не прави) си прецакан. Пакетите могат да ти ги прихванат и да ти ги декриптират. Идеята ми беше да допълниш енкрипшъна double encrypt. Проксито или сокет сървъра ти проверява дали може да го декодне ако успее си го препраща към сървъра, ако не го дропва. Да работи като middleware. Това е една от опциите другата е да промениш всичко, но там както казваш ще се наложи да пипаш и клиента.

Сървъра бачка локално на порт 127.0.0.1:5506, проксито на 200.100.20.49:44405. Клиента вижда само проксито, а то преценява какво да пусне към 127.0.0.1:5506. Пoне така си го представям де... може и да е тъпо :D
 
Last edited:
Не влизам често, а от навик 😀
Нито се занимавам от години със сървари въпреки, че плащам домейна на darknessmu все още, но ми прави впечатление че сте игнорирали javascript.. и може би само 2-3ма от форума се занимават с него, не ми е ясно защо? Каква е причината? Защо не правите responsive уебове? Няма нито един уеб вдигнат с nodejs? Или аз не виждам.
Желая ти успех!
 
Не знам как са нещата с тредовете и мултипроцесинга с node.js, но без добре менаджиране ще ти спича UI със сигурност. Това, което може да пробваш, ако е трудно с тредовете, ако ще бачка в линукс среда, да ползваш supervisor или systemd (да нкараш линукса да бачка за тебе) и пуснеш всеки процес на отделна нишка. Даже сега като се замисля, ако си направиш mini SDK ще можеш да си енкапсулираш решението, което ще помогне за антихак примерно в бъдеще.

http://supervisord.org/
Честно да си призная, не съм запознат със supervisor. Ще поработя над този проблем. Иначе за nodejs multithreading - by default е single thread, което и аз подозирам, че ще е проблем в някакъв момент. Може обаче да се spawn-ват service workers, които не блокират main process-a/thread-a и работят паралелно (има варианти за multi threading).
Ще е доста интересно като стигнем до този момент. Ако е прекалено тегаво, може пък да не се придържаме към "всичко в 1 gameserver". Може всяко нещо което трябва да е на отделен thread да има смисъл да е на отделен nodejs app :D Като стигнем до там ще разиграем няколко варианта и ще преценим (y)

Не влизам често, а от навик 😀
Нито се занимавам от години със сървари въпреки, че плащам домейна на darknessmu все още, но ми прави впечатление че сте игнорирали javascript.. и може би само 2-3ма от форума се занимават с него, не ми е ясно защо? Каква е причината? Защо не правите responsive уебове? Няма нито един уеб вдигнат с nodejs? Или аз не виждам.
Желая ти успех!
https://darksteam.net/threads/nyxweb-muonline-website-in-javascript.24829/ - ей го, има React сайт :) Но съм съгласен, че в туй community, теми като javascript-a, responsive, UX, SEO, accessibility, mobile страдат от мижав интерес :D
Преди време се бях хванал да правя и launcher на JS който да работи на Windows, Linux, Mac. Докарах го до що/годе работещо положение и осъзнах, че на никой няма да му е полезно и го drop-нах :D
Най-вероятно и с тази тема ще стане така, ама нали знаеш - като те засърбят пръстите... :D
 
Last edited:
  • Like
Reactions: Dea7h and Mortred
Update 11.04.2023:
- Updated root README.md
- Created a Discord server for the project - https://discord.gg/TFEZ7j4MZd
- The libs "mu-packet-manager" and "mu-db" are now publicly available in npmjs.com
- JoinServer TCP handlers are moved into separate files
- Added handler for login packets & returning response to GS
- Created GitHub project to tackle all future development & contributions: https://github.com/users/pafa7a/projects/4/views/2
- Registered domains "mu-js.com" and "muonline-js.com"


Upcoming plans:
- Complete user login logic in JoinServer, so it's using the DB to verify the credentials & returns the proper response
- Refactor the ConnectServer TCP & UDP servers - move all handlers into separate files
 
Last edited:
  • Like
Reactions: Dea7h
progress update:
Account authentication handler in the JoinServer - done.
We have a new server called "WebServer" that contains 'mu-web-admin" directory which is a Next.js project. So far I've implemented the protected pages & routes logic, implemented the login & auth mechanism, security mechanism. Next time I will focus on styling the login page, implement a logout & style the core of the dashboard
also the web is added as part of the docker-compose setup and it builds & runs the production version of the app.

The idea of this mu-web-admin will be to have everything that you need as an administrator on one place. For example - stop & start the servers, configure the servers, watch logs in real-time, create/edit/delete accounts, modify warehouse, etc. All admin tools that you can think of in just one place accessible from your browser
 
I'm happy to share with you that now we can start & stop & control servers from the mu-admin server (directly from the browser) :)
Demo:
 
Update:
- MuWebAdmin: the main menu now supports sub-menus + automatically detects the active one
- MuWebAdmin: you can now watch server logs real-time :) (in future, we can integrate the logs with Discord private channels :) )
Video demo:
 
Здравейте съфорумници ;)

Днес реших, че искам да се поразръчкам малко из MuOnline sources и ми направи впечатление, че все-още няма особено много решения за MuServer под Linux/Mac. Всичко е обвързано с Windows, което не е много яко, защото хостинг на Windows си е в пъти по-скъпо от хостинг на Linux. Да не споменаваме speed, reliability, security, etc.
Та, реших да започна тази инициатива с чисто опознавателна цел. Далеч съм от мисълта, че ще я докарам до production ready. Дори не съм сигурен дали след някакво време няма да се откажа. Бутам само когато имам свободно време и ми се занимава.
Към момента какво съм направил:
Имаме Node.js ConnectServer който създава 1xTCP & 1xUDP сървъра. TCP сървъра слуша на порт 44405 и предназначението му е да си комуникира с клиента. Частта с комуникацията с клиента е готова на 100%. UDP сървъра служи за комуникация с JoinServer & GameServer. Там съм на 50% готов - получавам инфо от GameServer, остава да се декоднат пакетите и от JoinServer-a и да им се намери предназначение.
Тъй като е javascript, сметнах за по-яко ако вместо ServerList.dat да имаме ServerList.json, съответно във валиден JSON формат.
Имплементирал съм възможност да се презареждат настройките в ServerList.json през терминала - не е нужно да рестартирате сървъра за да се отразят промените. Имплементирах и нещо, което обикновенните ConnectServers нямат - при reload, да прати пакет на всички вързани клиенти да си обновят информацията и те - примерно ако добавя нов сървър в ServerList.json, мога да напиша "reload" и да видя промените си директно в клиента (без да трябва да рестартирам ConnectServer или Client).

След определено време най-вероятно ще пусна Github repo и ще го направя open-source. Най-вероятно ще преструктурирам и този пост за да е по-подреден и не чак толкова фокусиран върху ConnectServer а по-скоро върху цялата картинка.
Към момента в главата ми е следния списък с неща, които да метна на Node.js: ConnectServer, JoinServer, DataServer, GameServer.

Видео демо на ConnectServer.js:


Моля споделете 1 мнение какво мислите по въпроса, бихте ли взели участие в open-source-a и кат цяло какво мислите xD
- Updated root README.md
- Created a Discord server for the project - https://discord.gg/TFEZ7j4MZd
- The libs "mu-packet-manager" and "mu-db" are now publicly available in npmjs.com
- JoinServer TCP handlers are moved into separate files
- Added handler for login packets & returning response to GS
- Created GitHub project to tackle all future development & contributions: https://github.com/users/pafa7a/projects/4/views/2
- Registered domains "mu-js.com" and "muonline-js.com"

Upcoming plans:
- Complete user login logic in JoinServer, so it's using the DB to verify the credentials & returns the proper response
- Refactor the ConnectServer TCP & UDP servers - move all handlers into separate files
Аз сега уча JS и се занимавам с node.js имам желание като напредна да участвам в проекта ако може разбира се ;)
 
всяка помощ е добре дошла - няма да върна никого. Дори и да го учиш езика в момента, не се бърка да се пробваш да направиш нещо. Тъкмо на code review фазата ще ти казвам ако нещо не е ок и ще давам идеи за подобрение :)
Всички постоянно учим
 
Как учим е браД, аз съм мистър компетенция, от всичко по малко. Нямам какво ново да науча, всичко ми е ясно. Майстор по всичкология, демек нищология.;)
 
update:
- WebAdmin: 3 box settings added to logs pages. Clear logs, reload logs, delete logs
- WebAdmin: When you visit the logs pages, it will first get the latest 500 logs stored in ElasticSearch (500 logs for 3ms :) ) for the respective app and then will continue with real-time logs
- WebAdmin: All logs are now starting with date & time
1683517897238.png