Начало работы

Сервер в Docker

ghcr.io/amxts/server — образ Docker с сервером Counter-Strike 1.6 на Linux, на котором работает amxts: HLDS с ReHLDS, ReGameDLL, Metamod-R, AMX Mod X 1.10 и ReAPI, модуль amxts и его компилятор. Ваш проект монтируется в него, и сервер запускает ваши плагины с вашими конфигами и файлами — на Windows, macOS или Linux, и ставить не нужно ничего, кроме Docker.

У каждого выпуска amxts свой образ: ghcr.io/amxts/server:0.2.0 — сервер amxts 0.2.0, а ghcr.io/amxts/server (тег latest) — самый новый. docker run скачивает его в первый раз; docker pull ghcr.io/amxts/server берёт более новый latest.

Одна версия с проектом
Сервер загружает только плагины, скомпилированные тем же выпуском amxts: запускайте образ версии вашего проекта (@amxts/core в его package.json). Плагин, собранный другим выпуском, не загружается, и консоль говорит, какой собрать заново: [amxts] myplugin.aot was built for amxts 0.1.0, this is 0.2.0 - build it again. npx amxts dev --docker печатает строку docker run с версией вашего проекта.

Запуск

Соберите плагины для Linux и запустите сервер, смонтировав проект в /project:

npx amxts build --os linux
docker run --rm -it -p 27015:27015/udp -v "${PWD}:/project" ghcr.io/amxts/server

На Windows папку можно написать как есть: -v D:\my-server:/project. Консоль сервера — в терминале, и с -it в неё можно вводить команды. Без -it сервер работает так же, а консоль показывает docker logs. Из игры: connect 127.0.0.1:27015.

Во время работы

npx amxts dev --docker

dev --docker — это dev для этого сервера. Он собирает плагины для Linux в dist/ и снова при каждом сохранении; запущенный сервер видит новые файлы и перезагружает их сам. Ничего никуда не копируется, и AMXTS_SERVER не используется. Ответ сервера появляется под сборкой:

✔ 14:02:11 plugins/my-plugin.ts changed: rebuilt my-plugin into dist (4.2s)
  | [amxts] my-plugin.aot changed on disk
  | [amxts] reloading
  | [amxts] loaded my-plugin.aot

Сервер команда находит по монтированию: запущенный контейнер, в котором этот проект смонтирован в /project. Если такого нет, она об этом говорит и показывает строку docker run, которой его запустить. Сама она сервер не запускает и не останавливает.

Новый плагин проекта попадает в plugins.ini при сборке и загружается по amxts_reload в консоли сервера или со сменой карты.

Что он берёт из проекта

При каждом запуске сервер берёт из /project то, что там есть:

из проектана сервере
dist/плагины и plugins.ini — список того, что запускается
configs/поверх addons/amxmodx/configs/ — configs/myplugin/settings.ini, configs/users.ini
data/поверх addons/amxmodx/data/ — data/lang/myplugin.txt
maps/, models/, sound/, sprites/, gfx/, overviews/, resource/поверх одноимённых папок игры
addons/поверх addons/ папки игры — модуль AMX Mod X, плагин на Pawn
motd.txtсообщение дня; без него игрок никакого не видит

Плагины читаются из dist/ там, где они лежат, поэтому новая сборка сразу доходит до запущенного сервера. Всё остальное копируется в сервер при запуске: изменённый конфиг, звук или карта доходят до него после перезапуска — docker restart с именем контейнера. То, что пишет сам сервер — конфиг, который сохраняет плагин, логи, — остаётся в контейнере.

Модули и плагины на Pawn

На сервере есть собственные модули AMX Mod X и ReAPI. Модуль, которого у него нет, приходит с проектом: сборка под Linux (<имя>_amxx_i386.so) в addons/amxmodx/modules/ и его имя в configs/modules.ini:

my-server/
├── addons/amxmodx/modules/resemiclip_amxx_i386.so
└── configs/modules.ini          resemiclip

Плагин на Pawn кладётся в addons/amxmodx/plugins/, а его имя — в configs/plugins.ini. modules.ini и plugins.ini проекта заменяют серверные; reapi и amxts_amxx дописываются в конец modules.ini, потому что они нужны серверу.

Если плагин вызывает native модуля, которого на сервере нет, вызов заканчивается ошибкой, и консоль называет этот native:

[amxts] resemiclip_take_control was called, and it is not on this server: the module or plugin that provides it is not loaded

Без проекта сервер запускает пример, который носит с собой, — hello.ts; он компилирует его сам при первом запуске.

Собрано для Linux
Плагин, собранный для сервера на Windows, на этом не загрузится: собирайте с --os linux или напишите AMXTS_SERVER_OS=linux в .env проекта (система сервера). dev --docker всегда собирает для Linux.

Настройки

переменнаяпо умолчаниючто это
MAPde_dust2первая карта
MAXPLAYERS16число слотов
PORT27015порт, который слушает сервер; публикуйте тот же: -p 27016:27016/udp -e PORT=27016
RCON_PASSWORDслучайныйпароль rcon; если он не задан, случайный печатается при запуске
SERVER_NAMEamxts serverимя в списке серверов
SV_LAN11 — для сервера на вашей машине или в локальной сети, 0 — для сервера в интернете

Они передаются через -e:

docker run --rm -it -p 27015:27015/udp -v "${PWD}:/project" -e MAP=cs_office -e MAXPLAYERS=32 ghcr.io/amxts/server

Всё, что стоит после имени образа, дописывается в конец командной строки сервера:

docker run --rm -it -p 27015:27015/udp -v "${PWD}:/project" ghcr.io/amxts/server +mp_timelimit 0 +sv_cheats 1

Чтобы зайти с другой машины в вашей сети, подключайтесь к адресу этой машины и опубликованному порту: connect 192.168.1.20:27015.

В фоне

docker run -dit --name myserver -p 27015:27015/udp -v "${PWD}:/project" ghcr.io/amxts/server
docker logs -f myserver     # консоль
docker attach myserver      # консоль с вводом; Ctrl-P Ctrl-Q оставляет сервер работать
docker restart myserver     # запустить заново, скопировав файлы проекта ещё раз
docker rm -f myserver       # остановить и удалить