使用 Docker Compose 部署 MonkeyBusiness

Konami Apr 29, 2023

MonkeyBusiness 是一个用 Python 写的 EA3 服务器模拟器, 看起来还可以。由于我服务器上的所有服务都是使用 Docker Compose 方式部署的,遂尝试使用 Docker Compose 进行部署。

以下是 docker-compose.yml

version: '3'
services:
  monkeybusiness:
    image: python:3.11-slim
    volumes:
      - ./src:/app
      - ./venv:/venv
    networks:
      - http
    command: /venv/bootstrap.sh
networks:
  http:
    external: true
    name: http

以及 bootstrap.sh

#!/usr/bin/env bash

cd /app

if test -f "/venv/bin/activate"; then
  source /venv/bin/activate
else
  python -m venv /venv
  source /venv/bin/activate
  pip install -U -r requirements.txt
fi

python pyeamu.py

bootstrap.sh 的作用是创建 venv 环境, 避免使用 Dockerfile 来创建额外的 image 。主播一直觉得为了开服务而写 Dockerfile 不太合适

接下来就是修改 config.py 以及解决一个bug, 由于这个服务端并没有设计开在 Docker 内, 所以有些小问题需要修改

config.py

import socket

# simple /etc/hosts hack
host = 'ea3.girlsband.party'
ip = socket.gethostbyname(socket.gethostname())

with open("/etc/hosts", "a") as hosts:
    hosts.write(f'{ip} ea3.girlsband.party')

ip = host

port = 80
services_prefix = "/core"
verbose_log = True

arcade = "EA3"
paseli = 1145
maintenance_mode = False

以及修改bug

diff --git a/modules/core/facility.py b/modules/core/facility.py
index 63a6ada..6e358e7 100644
--- a/modules/core/facility.py
+++ b/modules/core/facility.py
@@ -1,5 +1,6 @@
 import config

+from socket import gethostbyname
 from fastapi import APIRouter, Request, Response

 from core_common import core_process_request, core_prepare_response, E
@@ -36,7 +37,7 @@ async def facility_get(request: Request):
                 E("id", 3, __type="str"),
             ),
             E.portfw(
-                E.globalip(config.ip, __type="ip4"),
+                E.globalip(gethostbyname(config.ip), __type="ip4"),
                 E.globalport(5704, __type="u16"),
                 E.privateport(5705, __type="u16"),
             ),

修改完之后将源码拉到 src 文件夹后使用 docker-compose up 启动即可

注: 在连接服务器时除了需要设置服务器 url 之外还需要把 URL Slash 选项打开, 不然会报 404

标签