Сервер в 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
pnpm amxts dev --docker
yarn amxts dev --docker
bunx 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; он
компилирует его сам при первом запуске.
Плагин, собранный для сервера на Windows, на этом не загрузится: собирайте с
--os linux или напишите AMXTS_SERVER_OS=linux в .env проекта
(система сервера). dev --docker всегда собирает
для Linux.Настройки
| переменная | по умолчанию | что это |
|---|---|---|
MAP | de_dust2 | первая карта |
MAXPLAYERS | 16 | число слотов |
PORT | 27015 | порт, который слушает сервер; публикуйте тот же: -p 27016:27016/udp -e PORT=27016 |
RCON_PASSWORD | случайный | пароль rcon; если он не задан, случайный печатается при запуске |
SERVER_NAME | amxts server | имя в списке серверов |
SV_LAN | 1 | 1 — для сервера на вашей машине или в локальной сети, 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 # остановить и удалить
Установка на сервер
Чтобы игровой сервер запускал плагины amxts, на нём нужны две вещи: модуль amxts_amxx и папка addons/amxts с плагинами. На этой странице — как поставить их на свой сервер. Другой путь — сервер в Docker, в котором всё это уже есть.
Ограничения
Чего amxts пока не умеет — и что писать вместо этого. Почти о каждом пункте ниже скажут сборка, редактор или консоль сервера; здесь можно посмотреть, что это значит.