initial commit
This commit is contained in:
commit
17198482bd
4
.env
Normal file
4
.env
Normal file
|
@ -0,0 +1,4 @@
|
|||
UID=1000
|
||||
GID=1000
|
||||
GIT_REV_PHOSG=9bbec3b49e6c5852d444c6bb530a549d292c50bf
|
||||
GIT_REV_NEWSERV=3160d86eaac05dd9b8b8a6d4e756d2fbe9540d75
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
/system
|
98
NOTES.md
Normal file
98
NOTES.md
Normal file
|
@ -0,0 +1,98 @@
|
|||
# Random, Possibly Helpful Notes
|
||||
|
||||
This is not supposed to be anything even approaching a proper `README.md` ;-)
|
||||
|
||||
---
|
||||
|
||||
## Quick `config.json` Setup
|
||||
|
||||
For a public server on the internet:
|
||||
|
||||
* Set `AllowUnregisteredUsers` to `false`
|
||||
* Leave `LocalAddress` configured to the interface name of your primary network
|
||||
adapter, e.g. `en0`
|
||||
* Set `ExternalAddress` to your server's public IP address
|
||||
* Set `DNSServerPort` to 53 if you want to use this, or 0 to disable, in which
|
||||
case you need to set up your own external DNS server (e.g. dnsmasq)
|
||||
* Set `RunInteractiveShell` to `true` (technically not needed as it should
|
||||
autodetect)
|
||||
* Adjusting `LogLevels` is highly recommended. Most things should be set to `WARNING`
|
||||
at the very least, otherwise there will be a **ton** of logging messages that
|
||||
you don't need to see unless you're debugging issues / doing newserv development.
|
||||
* Adjust the `ServerName` WelcomeMessage`, `PCPatchServerMessage` and
|
||||
`BBPatchServerMessage` to have something personalized for your server.
|
||||
* Set `CheatModeBehaviour` to `OffByDefault`
|
||||
|
||||
## Adding Licenses (Player Accounts)
|
||||
|
||||
With `AllowUnregisteredUsers` set to `false` in the `config.json` you **must**
|
||||
manually add "licenses" which are player accounts in order for any client to
|
||||
successfully connect.
|
||||
|
||||
For Gamecube, this must be registered with a serial number and access key, as
|
||||
well as a password.
|
||||
|
||||
```text
|
||||
add-license serial=1234567890 access-key=123456789012 gc-password=myPassword
|
||||
```
|
||||
|
||||
For Blue Burst, this must be registered with a serial number, username, and
|
||||
password.
|
||||
|
||||
```text
|
||||
add-license serial=1234567890 bb-username=myUsername bb-password=myPassword
|
||||
```
|
||||
|
||||
**Serial numbers must be unique across licenses _AND_ client type!**
|
||||
|
||||
For example, if you try to add a Gamecube license with the same serial number
|
||||
as a Blue Burst license, the most recently added license with the duplicate
|
||||
serial number will overwrite the existing license completely!
|
||||
|
||||
### License/Account Privileges
|
||||
|
||||
In the `add-license` command, simply add a `flags=xxx` option, where `xxx`
|
||||
should be one of `normal` (default), `mod`, `admin`, `root` or numeric value.
|
||||
|
||||
## PSO: BB Client Executable Patching
|
||||
|
||||
The addresses to patch (hexedit) in `psobb.exe` to get it to connect to your
|
||||
own server are:
|
||||
|
||||
* Tethealla client v1.25.13
|
||||
* 0x56d70c
|
||||
* 0x56d724
|
||||
* 0x56d750
|
||||
* 0x56d76c
|
||||
* 0x56d788
|
||||
* 0x56d7a4
|
||||
|
||||
* Ephinea client
|
||||
* 0x56d70c
|
||||
* 0x56d724
|
||||
* 0x56d750
|
||||
* 0x56d76c
|
||||
* 0x56d788
|
||||
|
||||
Each address should contain an ASCII string with an IP or hostname in it. Each
|
||||
string has a maximum length of 24 bytes.
|
||||
|
||||
Either patch all of these to the IP you put in the `ExternalAddress` in your
|
||||
`config.json` or use a publicly resolvable DNS hostname that resolves to that
|
||||
IP address.
|
||||
|
||||
## Interactive Shell Usage in a Docker World
|
||||
|
||||
The `docker-compose.yml` file has two options specified on the newserv container
|
||||
that are important for this, which you don't normally see used in a Docker Compose
|
||||
file, but you're probably familiar with these via `docker run` or `docker exec`:
|
||||
|
||||
* `stdin_open: true` which is equivalent to the `-i` option
|
||||
* `tty: true` which is equivalent to the `-t` option
|
||||
|
||||
Finally, in `config.json` uncomment and set `RunInteractiveShell` to `true` just
|
||||
to ensure that newserv's interactive shell feature is enabled.
|
||||
|
||||
Then you can just `docker attach` to the newserv container and Ctrl+P, Ctrl+Q to
|
||||
detach when done.
|
||||
|
53
README.md
Normal file
53
README.md
Normal file
|
@ -0,0 +1,53 @@
|
|||
# Fuzziqer "newserv" Docker Compose Scripts
|
||||
|
||||
Docker Compose scripts for running the
|
||||
[Fuzziqer Software "newserv" PSO server software](https://github.com/fuzziqersoftware/newserv)
|
||||
|
||||
This repository is intended for my own personal use only. I take no responsibility
|
||||
if you, the reader, happens to come across this and decide to use it and
|
||||
have issues or lose data, or whatever else. Fuzziqer Software won't support
|
||||
this either, obviously.
|
||||
|
||||
## Usage
|
||||
|
||||
It is assumed you have prior Docker / sys-admin experience. If not, you have
|
||||
some learning to do first. Don't rush it.
|
||||
|
||||
### Before First Run
|
||||
|
||||
* Edit `.env` as appropriate. Set `UID` and `GID` to the ID's of the user/group
|
||||
you want to run this server as.
|
||||
* Create the `system` directory in the same directory as `docker-compose.yml`
|
||||
and make sure it is owned by the aforementioned `UID` and `GID`.
|
||||
|
||||
### First Run
|
||||
|
||||
* Run `docker compose up` and let the image build and the container start.
|
||||
* The container will abort because the `system` directory was initially empty.
|
||||
But now it should be filled with the out-of-the-box newserv system contents
|
||||
(copied un-altered from the newserv Git repo). Rename `config.example.json`
|
||||
to `config.json` and edit it as needed (see [NOTES.md](NOTES.md) for
|
||||
suggestions)
|
||||
|
||||
### Second Run
|
||||
|
||||
* Re-run `docker compose up` and newserv should start up now.
|
||||
|
||||
### DNS
|
||||
|
||||
I only use newserv with it's built-in DNS server functionality _disabled_ as
|
||||
I prefer to use a separate DNS server like dnsmasq for this task. This means
|
||||
I set `DNSServerPort` to 0 in `config.json` and the `docker-compose.yml` does
|
||||
not have a mapping for UDP port 53 at all.
|
||||
|
||||
See the sample dnsmasq configuration `dnsmasq.conf.example` for something that
|
||||
should work. To connect console PSO clients, you'll need some sort of DNS
|
||||
server set up for your server that the console PSO clients can use.
|
||||
|
||||
### Connecting Clients
|
||||
|
||||
I assume you're familiar with how to get each PSO client to connect to whatever
|
||||
private server you like, and won't be detailing the process here.
|
||||
|
||||
See [NOTES.md](NOTES.md) for patching/hexedit details for the PSO: BB client
|
||||
executable which is quite a bit less straightforward otherwise.
|
21
dnsmasq.conf.example
Normal file
21
dnsmasq.conf.example
Normal file
|
@ -0,0 +1,21 @@
|
|||
port=53
|
||||
|
||||
no-resolv
|
||||
no-poll
|
||||
|
||||
# PSO client DNS lookup rebinding to this server (for newserv)
|
||||
address=/master.pso.dream-key.com/1.2.3.4
|
||||
address=/game01.st-pso.games.sega.net/1.2.3.4
|
||||
address=/game04.st-pso.games.sega.net/1.2.3.4
|
||||
address=/pso.dream-key.com/1.2.3.4
|
||||
address=/pso01.dricas.ne.jp/1.2.3.4
|
||||
address=/pso02.dricas.ne.jp/1.2.3.4
|
||||
address=/pso03.dricas.ne.jp/1.2.3.4
|
||||
address=/pso04.dricas.ne.jp/1.2.3.4
|
||||
address=/pso05.dricas.ne.jp/1.2.3.4
|
||||
address=/gc01.st-pso.games.sega.net/1.2.3.4
|
||||
address=/pso-gc1.pso.playsega.com/1.2.3.4
|
||||
address=/pso-gct01.sonic.isao.net/1.2.3.4
|
||||
address=/pso-kr06.sonic.isao.net/1.2.3.4
|
||||
address=/pso-gc01.sonic.isao.net/1.2.3.4
|
||||
address=/pso-ep3t.sonic.isao.net/1.2.3.4
|
58
docker-compose.yml
Normal file
58
docker-compose.yml
Normal file
|
@ -0,0 +1,58 @@
|
|||
version: "3"
|
||||
|
||||
networks:
|
||||
pso-net:
|
||||
name: pso-net
|
||||
|
||||
services:
|
||||
|
||||
newserv:
|
||||
build:
|
||||
context: docker-image
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
UID: ${UID}
|
||||
GID: ${GID}
|
||||
GIT_REV_PHOSG: ${GIT_REV_PHOSG}
|
||||
GIT_REV_NEWSERV: ${GIT_REV_NEWSERV}
|
||||
container_name: pso-newserv
|
||||
stdin_open: true
|
||||
tty: true
|
||||
ports:
|
||||
# pso client ports
|
||||
- 9000:9000 # gc-jp10 gc login_server
|
||||
- 9001:9001 # gc-jp11 gc login_server
|
||||
- 9002:9002 # gc-jp3te gc login_server
|
||||
- 9003:9003 # gc-jp3 gc login_server
|
||||
- 9064:9064 # gc-us12t1 gc login_server
|
||||
- 9100:9100 # gc-us10 pc pc_console_detect
|
||||
- 9103:9103 # gc-us3 gc login_server
|
||||
- 9200:9200 # gc-eu10 gc login_server
|
||||
- 9201:9201 # gc-eu11 gc login_server
|
||||
- 9202:9202 # gc-eu3-50 gc login_server
|
||||
- 9203:9203 # gc-eu3-60a gc login_server
|
||||
- 9204:9204 # gc-eu3-60b gc login_server
|
||||
- 9300:9300 # pc pc login_server
|
||||
- 10000:10000 # pc-patch patch patch_server_pc
|
||||
- 11000:11000 # bb-patch patch patch_server_bb
|
||||
- 12000:12000 # bb-init bb login_server
|
||||
- 9500:9500 # xb-login xb login_server
|
||||
# newserv-defined ports (defaults from config.json)
|
||||
- 5100:5100 # console-login gc login_server
|
||||
- 5101:5101 # pc-login pc login_server
|
||||
- 5102:5102 # xb-login xb login_server
|
||||
- 5105:5105 # xb-lobby xb login_server
|
||||
- 5110:5110 # console-lobby gc lobby_server
|
||||
- 5111:5111 # pc-lobby pc lobby_server
|
||||
- 5112:5112 # bb-lobby bb lobby_server
|
||||
#- 5120:5120 # dc-proxy dc proxy_server
|
||||
#- 5121:5121 # pc-proxy pc proxy_server
|
||||
#- 5122:5122 # gc-proxy gc proxy_server
|
||||
#- 5123:5123 # xb-proxy xb proxy_server
|
||||
#- 5124:5124 # bb-proxy bb proxy_server
|
||||
- 12004:12004 # bb-data1 bb login_server
|
||||
- 12005:12005 # bb-data2 bb login_server
|
||||
volumes:
|
||||
- ./system:/opt/newserv/system
|
||||
networks:
|
||||
- pso-net
|
55
docker-image/Dockerfile
Normal file
55
docker-image/Dockerfile
Normal file
|
@ -0,0 +1,55 @@
|
|||
FROM ubuntu:22.04 as builder
|
||||
|
||||
MAINTAINER Gered King <gered@blarg.ca>
|
||||
|
||||
ARG GIT_REV_PHOSG
|
||||
ARG GIT_REV_NEWSERV
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y build-essential cmake git libevent-dev zlib1g-dev python3
|
||||
|
||||
# build and install phosg, a dependency of newserv
|
||||
RUN mkdir /tmp/phosg && \
|
||||
cd /tmp/phosg && \
|
||||
git clone https://github.com/fuzziqersoftware/phosg.git . && \
|
||||
git checkout $GIT_REV_PHOSG && \
|
||||
cmake . && \
|
||||
make && \
|
||||
make install && \
|
||||
cd -
|
||||
|
||||
# build newserv itself
|
||||
RUN mkdir /tmp/newserv && \
|
||||
cd /tmp/newserv && \
|
||||
git clone https://github.com/fuzziqersoftware/newserv.git . && \
|
||||
git checkout $GIT_REV_NEWSERV && \
|
||||
cmake . && \
|
||||
make && \
|
||||
cd -
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
FROM ubuntu:22.04
|
||||
|
||||
ARG UID
|
||||
ARG GID
|
||||
|
||||
USER root
|
||||
RUN apt-get update && \
|
||||
apt-get install -y libevent-dev zlib1g-dev && \
|
||||
groupadd --gid $GID newserv && \
|
||||
useradd -m -d /opt/newserv -s /bin/bash --gid newserv --uid $UID newserv
|
||||
|
||||
WORKDIR /opt/newserv
|
||||
|
||||
COPY --chown=newserv:newserv --from=builder /tmp/newserv/newserv .
|
||||
COPY --chown=newserv:newserv --from=builder /tmp/newserv/system ./new-system-template
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
|
||||
USER newserv
|
||||
|
||||
VOLUME /opt/newserv/system
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
34
docker-image/entrypoint.sh
Executable file
34
docker-image/entrypoint.sh
Executable file
|
@ -0,0 +1,34 @@
|
|||
#!/bin/bash
|
||||
|
||||
if [ "$(id -u)" -ne "$(stat -c '%u' $HOME/system)" ]; then
|
||||
echo "The 'system' volume is not writable by newserv."
|
||||
echo "Change the 'system' local volume mount user:group to $(id -u):$(id -g)."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -d "$HOME/system" ] && test -n "$(find $HOME/system -maxdepth 0 -empty)" ; then
|
||||
echo "Newserv system directory not initialized, will initialize one for you right now."
|
||||
cp -r $HOME/new-system-template/* $HOME/system/
|
||||
mkdir -p $HOME/system/players # otherwise, bb clients crash on new char creation!
|
||||
|
||||
echo
|
||||
echo "********************************************************************************"
|
||||
echo "This docker image will now abort for you to initially configure newserv!"
|
||||
echo
|
||||
echo "To proceed you must do the following:"
|
||||
echo "- Copy 'system/config.example.json' to 'system/config.json'"
|
||||
echo "- Edit 'system/config.json' to your liking"
|
||||
echo "- Re-run this container"
|
||||
echo "********************************************************************************"
|
||||
echo
|
||||
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$HOME/system/config.json" ]; then
|
||||
echo "No 'system/config.json' found. Aborting."
|
||||
echo "Did you forget to copy 'system/config.example.json' to 'system/config.json'?"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exec $HOME/newserv $@
|
5
newserv_cli.sh
Executable file
5
newserv_cli.sh
Executable file
|
@ -0,0 +1,5 @@
|
|||
#!/bin/bash
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
echo "Use the sequence Ctrl+P, Ctrl+Q to detach."
|
||||
docker attach pso-newserv
|
Loading…
Reference in a new issue