Compare commits
10 Commits
37ada3e96e
...
b52007d4fa
Author | SHA1 | Date | |
---|---|---|---|
b52007d4fa | |||
4ca9da3df1 | |||
b7cf9d999f | |||
9a705f42e2 | |||
b371a5317f | |||
35b2b1c57e | |||
708b65be30 | |||
0a497f5a69 | |||
bcdd9ac51b | |||
3a99e1f830 |
36
.env.example
36
.env.example
@ -1,13 +1,47 @@
|
||||
################################################################################
|
||||
# Docker images
|
||||
################################################################################
|
||||
GAME_IMAGE=git.old-metin2.com/metin2/server:latest
|
||||
WEB_IMAGE=git.old-metin2.com/metin2/web:latest
|
||||
|
||||
################################################################################
|
||||
# MySQL settings
|
||||
################################################################################
|
||||
MYSQL_HOST=mysql
|
||||
MYSQL_USER=root
|
||||
MYSQL_PASSWORD=metin2
|
||||
MYSQL_PORT=3306
|
||||
MYSQL_EXTERNAL_PORT=3306
|
||||
MYSQL_DB_ACCOUNT=account
|
||||
MYSQL_DB_PLAYER=player
|
||||
MYSQL_DB_COMMON=common
|
||||
MYSQL_DB_LOG=log
|
||||
|
||||
################################################################################
|
||||
# Web app settings
|
||||
################################################################################
|
||||
|
||||
# General configuration
|
||||
WEB_APP_NAME=Metin2
|
||||
WEB_APP_ENV=production
|
||||
WEB_APP_URL=http://metin2.local
|
||||
WEB_APP_KEY=
|
||||
WEB_EXTERNAL_PORT=80
|
||||
|
||||
# E-mail configuration
|
||||
WEB_MAIL_MAILER=smtp
|
||||
WEB_MAIL_HOST=smtp.example.com
|
||||
WEB_MAIL_PORT=587
|
||||
WEB_MAIL_USERNAME=smtp-username
|
||||
WEB_MAIL_PASSWORD=smtp-password
|
||||
WEB_MAIL_ENCRYPTION=tls
|
||||
WEB_MAIL_FROM_ADDRESS=no-reply@example.com
|
||||
WEB_MAIL_FROM_NAME=Metin2
|
||||
|
||||
################################################################################
|
||||
# Game server settings
|
||||
################################################################################
|
||||
|
||||
# Global settings
|
||||
TEST_SERVER=0
|
||||
|
||||
@ -17,6 +51,4 @@ DB_PORT=15000
|
||||
|
||||
# Game settings
|
||||
PUBLIC_IP=127.0.0.1
|
||||
GAME_IMAGE=git.old-metin2.com/metin2/server:nightly
|
||||
GAME_MAX_LEVEL=105
|
||||
GAME_MALL_URL=metin2.test/mall
|
||||
|
139
README.md
139
README.md
@ -1,29 +1,140 @@
|
||||
# The Metin2 Deployment Files
|
||||
The Old Metin2 Project aims at improving and maintaining the 2014 Metin2 game files up to modern standards. The goal is to archive the game as it was in order to preserve it for the future and enable nostalgic players to have a good time.
|
||||
The Old Metin2 Project aims at improving and maintaining the 2014 Metin2 game
|
||||
files up to modern standards. The goal is to archive the game as it was in
|
||||
order to preserve it for the future and enable nostalgic players to have a
|
||||
good time.
|
||||
|
||||
For-profit usage of this material is certainly illegal without the proper licensing agreements and is hereby discouraged (not legal advice). Even so, the nature of this project is HIGHLY EXPERIMENTAL - bugs are to be expected for now.
|
||||
For-profit usage of this material is certainly illegal without the proper
|
||||
licensing agreements and is hereby discouraged (not legal advice). Even so, the
|
||||
nature of this project is HIGHLY EXPERIMENTAL - bugs are to be expected for now.
|
||||
|
||||
## Usage
|
||||
The deployment strategy for this project is based around Docker Compose. For now, no images are published, so building your own server image is required. Also, for now, you need to provide your own database schema.
|
||||
## Quick start guide
|
||||
The deployment strategy for this project is based around Docker Compose. Make
|
||||
sure that you have a compatible Linux + Docker environment - for more
|
||||
information, check out the [compatibility matrix](https://git.old-metin2.com/metin2/deploy#compatibility-matrix).
|
||||
|
||||
### Building the server image
|
||||
This process requires that you do the following steps on a Linux environment with Docker installed and running.
|
||||
### Architecture description
|
||||
The MySQL database is currently pinned on version 5.5. We're using the
|
||||
[biarms/mysql](https://github.com/biarms/mysql) project in order to provide ARM
|
||||
compatibility for such an old version of MySQL.
|
||||
|
||||
Clone the Server project repository:
|
||||
The game cores (`db`, `auth`, `game-*`) are ran by using pre-built images
|
||||
containing the server binaries and game files, provided in the
|
||||
[Server repository](https://git.old-metin2.com/metin2/server/packages).
|
||||
|
||||
The web application provides the actual website, item mall and autopatcher
|
||||
functionality. Moreover, it is responsible with maintaining the database schema,
|
||||
creating and updating tables when needed. Pre-built images containing the web
|
||||
application are provided in the
|
||||
[Website repository](https://git.old-metin2.com/metin2/web/packages).
|
||||
|
||||
### Preparing the server
|
||||
Clone this repository and access its root directory. For instance, on Linux you
|
||||
would do this:
|
||||
```shell
|
||||
git clone https://git.old-metin2.com/metin2/server.git
|
||||
git clone --depth 1 https://git.old-metin2.com/metin2/deploy.git metin2-deploy
|
||||
cd metin2-deploy/
|
||||
```
|
||||
|
||||
Build the image:
|
||||
Now, we need to copy the example environment file and name it `.env`. This file
|
||||
contains all settings used by Docker Compose to start up our project.
|
||||
```shell
|
||||
cd server
|
||||
docker build -t metin2/server:test .
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
Some settings aren't yet filled out. The actual settings will differ based on
|
||||
your setup. We'll assume that you're using WSL and Docker on your own computer,
|
||||
and you want to run the server locally, just for yourself. Start with opening
|
||||
the newly copied `.env` file.
|
||||
|
||||
Firstly, we need to configure the web application. Find `WEB_APP_URL` and change
|
||||
it to the URL you would use to access the machine you're installing this on
|
||||
(without a trailing slash!). In our case, simply set it to `http://localhost`.
|
||||
|
||||
You might already use port 80 on your machine for something else, in which case
|
||||
we need to configure the app to use another port. Simply change `WEB_EXTERNAL_PORT`
|
||||
to another value, for example `8080`. Don't forget to change `WEB_APP_URL`
|
||||
accordingly, in our case to `http://localhost:8080`.
|
||||
|
||||
Next, we need to generate a cryptographic key. We'll make use of Laravel's
|
||||
generator feature, as follows:
|
||||
```shell
|
||||
docker run --rm git.old-metin2.com/metin2/web:latest "php artisan key:generate --show"
|
||||
```
|
||||
|
||||
Run the above command and configure `WEB_APP_KEY` with the output. You should
|
||||
end up with something like: `WEB_APP_KEY=base64:<your-key-here>`.
|
||||
|
||||
Lastly, let's switch our focus to the game server. Make sure that `PUBLIC_IP` is
|
||||
set to a value at which you can access your machine. As a rule of thumb, this
|
||||
should be the same value you set in your client's `serverinfo.py`. In our case,
|
||||
leaving a value of `127.0.0.1` should work just fine.
|
||||
|
||||
Don't forget to save your `.env` file!
|
||||
|
||||
### Starting the server
|
||||
Clone this repository and open a terminal window in its root directory. Then, simply bring up the Compose project:
|
||||
You're ready to start the server. Simply run the following command to start up
|
||||
the server:
|
||||
```shell
|
||||
docker compose up -d
|
||||
docker compose up -d --pull always
|
||||
```
|
||||
|
||||
On the first run, you might need to connect to port 3306 with your favourite MySQL client (Navicat, DBeaver, phpMyAdmin etc.) and install a Metin2 database schema.
|
||||
On the first run, your database tables will be created and populated with default data.
|
||||
|
||||
### Stopping the server
|
||||
Should you want to stop the server, simply bring down the Docker Compose stack:
|
||||
```shell
|
||||
docker compose down
|
||||
```
|
||||
|
||||
### Only start some services
|
||||
This deployment environment can also be used for development purposes. If you
|
||||
need a database and website, but want to run the server in some other way (for
|
||||
example, in an IDE), you can just bring up only the services you need:
|
||||
|
||||
```shell
|
||||
docker compose up -d mysql web
|
||||
```
|
||||
|
||||
## Compatibility matrix
|
||||
| **Operating system** | amd64 | i386 | arm64 | armv7 | Notes |
|
||||
|------------------------|-------|------|-------|-------|------------------------------------------------------------|
|
||||
| **Debian 11** | ⚠️ | ❔ | ❔ | ❌ | Requires `EVENT_NOEPOLL=1` environment variable to be set. |
|
||||
| **Debian 12** | ✅ | ❔ | ❔ | ❌ | |
|
||||
| **Ubuntu 22.04.5 LTS** | ✅ | N/A | ❔ | ❌ | |
|
||||
| **Ubuntu 24.04.1 LTS** | ❔ | N/A | ❔ | ❌ | |
|
||||
| **Docker on WSL** | ✅ | N/A | ❔ | N/A | |
|
||||
| **Docker on macOS** | ❔ | N/A | ✅ | N/A | |
|
||||
|
||||
### What about Windows, FreeBSD? macOS?
|
||||
As described above, the deployment system for The Old Metin2 Project is based
|
||||
on Docker and Docker Compose. Since support for native Windows, FreeBSD or
|
||||
macOS Docker containers is experimental at best and unavailable at worst,
|
||||
the auto-magical deployment system in this repository is not compatible with
|
||||
these OSs.
|
||||
|
||||
Compiling [the server](https://git.old-metin2.com/metin2/server)
|
||||
binary and running it on these systems should be possible, but you have to come
|
||||
up with your own deployment strategy, be it shell scripts, a custom watchdog
|
||||
program, or simply manually starting the binaries. Moreover, this is currently
|
||||
outside the scope of the project and unsupported for the time being.
|
||||
|
||||
|
||||
## Help!
|
||||
|
||||
### `epoll_wait` issues
|
||||
On some Linux distributions, kernels are shipped without `epoll_wait` support,
|
||||
which in turn might lead to the following error being shown (and the server
|
||||
naturally won't start):
|
||||
|
||||
```
|
||||
[warn] epoll_wait: Function not implemented
|
||||
```
|
||||
|
||||
Luckily, there is a workaround: disabling the `epoll` backend of libevent. In
|
||||
order to do this, modify your `&common-environment` section in your
|
||||
`docker-compose.yml` file by adding the following line:
|
||||
|
||||
```
|
||||
EVENT_NOEPOLL: 1
|
||||
```
|
5
assets/db-init/create-databases.sql
Normal file
5
assets/db-init/create-databases.sql
Normal file
@ -0,0 +1,5 @@
|
||||
CREATE DATABASE account CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
CREATE DATABASE common CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
CREATE DATABASE log CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
CREATE DATABASE player CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
CREATE DATABASE website CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
@ -16,25 +16,66 @@ x-environment:
|
||||
|
||||
PUBLIC_IP: ${PUBLIC_IP}
|
||||
GAME_MAX_LEVEL: ${GAME_MAX_LEVEL}
|
||||
GAME_MALL_URL: ${GAME_MALL_URL}
|
||||
WEB_APP_URL: ${WEB_APP_URL}
|
||||
WEB_APP_KEY: ${WEB_APP_KEY}
|
||||
|
||||
services:
|
||||
# MySQL Database
|
||||
mysql:
|
||||
image: mysql:5.5
|
||||
restart: on-failure
|
||||
# The biarms/mysql Docker image supports ARM machines; you may also use mysql:5.5
|
||||
image: biarms/mysql:5.5
|
||||
restart: always
|
||||
environment:
|
||||
# Password for root access
|
||||
MYSQL_ROOT_PASSWORD: 'metin2'
|
||||
MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
|
||||
ports:
|
||||
- '${MYSQL_PORT}:${MYSQL_PORT}'
|
||||
- '${MYSQL_EXTERNAL_PORT}:${MYSQL_PORT}'
|
||||
expose:
|
||||
- ${MYSQL_PORT}
|
||||
volumes:
|
||||
- ./storage/database/:/var/lib/mysql/
|
||||
- ./assets/db-init/:/docker-entrypoint-initdb.d/:ro
|
||||
healthcheck:
|
||||
#test: ["CMD", "mysql", "-u", "${MYSQL_USER}", "--password", "${MYSQL_PASSWORD}", "-e", "USE ${MYSQL_DB_ACCOUNT};"]
|
||||
test: ["CMD", 'mysqladmin', 'ping', '-h', 'localhost', '-u', 'root', '-p$$MYSQL_ROOT_PASSWORD' ]
|
||||
test: mysqladmin ping -h localhost -u root -p$$MYSQL_ROOT_PASSWORD
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
# Web management system
|
||||
web:
|
||||
image: ${WEB_IMAGE}
|
||||
restart: always
|
||||
environment:
|
||||
# Application config
|
||||
APP_NAME: ${WEB_APP_NAME}
|
||||
APP_ENV: ${WEB_APP_ENV}
|
||||
APP_KEY: ${WEB_APP_KEY}
|
||||
APP_URL: ${WEB_APP_URL}
|
||||
|
||||
# Database credentials
|
||||
DB_HOST: ${MYSQL_HOST}
|
||||
DB_PORT: ${MYSQL_PORT}
|
||||
DB_USERNAME: ${MYSQL_USER}
|
||||
DB_PASSWORD: ${MYSQL_PASSWORD}
|
||||
|
||||
# E-mail config
|
||||
MAIL_MAILER: ${WEB_MAIL_MAILER}
|
||||
MAIL_HOST: ${WEB_MAIL_HOST}
|
||||
MAIL_PORT: ${WEB_MAIL_PORT}
|
||||
MAIL_USERNAME: ${WEB_MAIL_USERNAME}
|
||||
MAIL_PASSWORD: ${WEB_MAIL_PASSWORD}
|
||||
MAIL_ENCRYPTION: ${WEB_MAIL_ENCRYPTION}
|
||||
MAIL_FROM_ADDRESS: ${WEB_MAIL_FROM_ADDRESS}
|
||||
MAIL_FROM_NAME: ${WEB_MAIL_FROM_NAME}
|
||||
ports:
|
||||
- '${WEB_EXTERNAL_PORT}:80'
|
||||
volumes:
|
||||
- ./storage/web/:/app/storage/
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
healthcheck:
|
||||
test: curl --fail http://localhost:80/ || exit 1
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
@ -42,7 +83,7 @@ services:
|
||||
# DBCache Server
|
||||
db:
|
||||
image: ${GAME_IMAGE}
|
||||
restart: on-failure
|
||||
restart: always
|
||||
environment: *common-environment
|
||||
expose:
|
||||
- ${DB_PORT}
|
||||
@ -52,11 +93,13 @@ services:
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
web:
|
||||
condition: service_healthy
|
||||
|
||||
# Auth server
|
||||
auth:
|
||||
image: ${GAME_IMAGE}
|
||||
restart: on-failure
|
||||
restart: always
|
||||
environment:
|
||||
<<: *common-environment
|
||||
MYSQL_DB_PLAYER: ${MYSQL_DB_ACCOUNT}
|
||||
@ -76,11 +119,13 @@ services:
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
web:
|
||||
condition: service_healthy
|
||||
|
||||
# Game server (CH1)
|
||||
ch1_first:
|
||||
image: ${GAME_IMAGE}
|
||||
restart: on-failure
|
||||
restart: always
|
||||
environment:
|
||||
<<: *common-environment
|
||||
GAME_HOSTNAME: ch1_first
|
||||
@ -101,10 +146,12 @@ services:
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
web:
|
||||
condition: service_healthy
|
||||
|
||||
ch1_game1:
|
||||
image: ${GAME_IMAGE}
|
||||
restart: on-failure
|
||||
restart: always
|
||||
environment:
|
||||
<<: *common-environment
|
||||
GAME_HOSTNAME: ch1_game1
|
||||
@ -124,10 +171,12 @@ services:
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
web:
|
||||
condition: service_healthy
|
||||
|
||||
ch1_game2:
|
||||
image: ${GAME_IMAGE}
|
||||
restart: on-failure
|
||||
restart: always
|
||||
environment:
|
||||
<<: *common-environment
|
||||
GAME_HOSTNAME: ch1_game2
|
||||
@ -147,11 +196,13 @@ services:
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
web:
|
||||
condition: service_healthy
|
||||
|
||||
# Game server (game99)
|
||||
game99:
|
||||
image: ${GAME_IMAGE}
|
||||
restart: on-failure
|
||||
restart: always
|
||||
environment:
|
||||
<<: *common-environment
|
||||
GAME_HOSTNAME: game99
|
||||
@ -171,3 +222,5 @@ services:
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
web:
|
||||
condition: service_healthy
|
||||
|
Reference in New Issue
Block a user