Обновить

Facepunch буквально вынудили меня использовать Docker

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели7.8K
Всего голосов 4: ↑0 и ↓4-4
Комментарии17

Комментарии 17

докер это конечно хорошо.
Но вместо того чтобы создать нормальный примитивный сервис (как раз systemd с этим очень хорошо справляется), пляски с бубном с докером

в случае с OxideMod, установленном поверх RustDedicated, предполагается, что папка oxide должна быть в корне. Сервис, который вы предлагаете создать, позволяет создать изолированную папку oxide, которая не будет перезаписана другим таким же сервисом ?

как это примерно будет выглядеть, можете, пожалуйста, показать ?

Можно создать два сервиса, и каждому прописать свою WorkingDirectory.

НЛО прилетело и опубликовало эту надпись здесь

спасибо за пример, смысл понятен. А можете, пожалуйста, подсказать, чем подход с докером хуже, чем ваш ?

НЛО прилетело и опубликовало эту надпись здесь

а как в вашем случае быть с обновлениями нескольких серверов ? и отдельно интересует, как происходит автоматизация через крон - вы прописываете для каждой директории /var/lib/valheim/XXX отдельное правило в crontab или это можно как-то обобщить (по типу перебора всех подпапок в bash-скрипте, вызова там обновлений и уже этот скрипт вызывать в кроне?)

с моим подходом я устанавливаю обновления всего раз в месяц (force wipe) в одну единственную папку и эти изменения автоматически затрагивают все имеющиеся инстансы серверов.

НЛО прилетело и опубликовало эту надпись здесь

спасибо за развернутый ответ. Именно это я имел ввиду когда писал что докер излишен в данном случае

и это работало исправно, пока сервер был всего один. Но серверов стало два. И выключение всех серверов каждый раз, когда я выключаю один из них - меня не устраивало. Вот тут-то и появился он.

То есть вместо того, чтобы заменить pkill на kill, и вырубать нужный сервер по его process ID, вы замутили целый докер, а не разобравшись как пробросить каталог внутрь, замутили синхронизацию с рамдиском.

Давайте я решу все ваши проблемы, поправив run-server.sh

#!/bin/bash
WORKDIR=$(dirname $0)
PIDFILE=${WORKDIR}/server.pid

if [ "$1" == "start" ]; then
  [ -e ${PIDFILE} ] && echo "Server is already running" && exit 1

SEED=$(cat ${WORKDIR}/server/$IDENTITY/seed.txt)
  cp -R ${WORKDIR}/server/$IDENTITY/oxide/* ${WORKDIR}/oxide
  ./set-permissions.sh &
  ./watch-oxide-dir.sh &

  ${WORKDIR}/RustDedicated -batchmode \
    +server.hostname "$HOSTNAME" \
    +server.identity "$IDENTITY" \
    +server.maxplayers $MAXPLAYERS \
    +server.worldsize $WORLDSIZE \
    +server.seed "$SEED" \
    +server.tags "$SERVER_TAGS" \
    +server.url "$SERVER_URL" \
    +server.port $SERVER_PORT \
    +server.queryport $QUERY_PORT &
  echo $! > ${PIDFILE}
elif [ "$1" == "stop" ]; then
  [ ! -e "${PIDFILE}" ] && echo "Server is not running" && exit 0
  read PID<${PIDFILE}
  if ps $PID >/dev/null 2>&1; then
    kill $PID
  else
    echo "Server is not running and previous shutdown was not graceful"
  fi
else
  echo "Usage: $0 start|stop"
fi

если честно, я с этого начинал - пытался запоминать pid, чтобы потом вырубать через kill, только потом у меня в чем-то случилась загвоздка и я не смог этот вариант довести до конца.

замутили целый докер

а можете подсказать, почему использование докера будет избыточно ? кроме того, что нужно устанавливать новый софт.

Ну тем что вам пришлось
1. устанавливать докер
2. докеризировать сервер, что включает в себя и сеть и проброс дисков
3. вместо проброса дисков, вы нашли возможность использовать рамдрайв, но его надо синхронизировать - сделали еще лишний скрипт
4. усложнили поддержку своего сервера.


И вместо всего этого - можно просто удалить процесс по PID.

но корневая папка oxide-то все еще общая в вашем случае. Т.е. если я запущу второй сервер - он перезапишет эту папку и будет конфликт. И в итоге придется вернуться к изначальному подходу - т.е. копировать папку для каждого нового сервера.

Пожалуйста, исправьте меня, если я ошибаюсь.

проброс дисков

можете уточнить, что вы называете "пробросом дисков" ? монтирование (volumes) ? Если да, то несовсем понятен ваш следующий пункт

вместо проброса дисков, вы нашли возможность использовать рамдрайв

я и пробрасываю диск (вся папка Rust_Server) и использую рамдрайв (исключительно для одной подпапки, которая должна быть локальной для каждого запущенного сервера).

Т.е. не "вместо", а "вместе с" в данном случае будет корретнее.

усложнили поддержку своего сервера

можете развить эту мысль ? в чем сложность поддержки ?

Простите, а как вы раньше запускали два сервера?

Если вы хотели сделать какие-то папки общими для всех серверов - сделайте линками. Просто я не знаком с архитектурой серверов, что там можно обобщать, что нельзя. Но я уверен что Докер - это явно не тот инструмент, если вы хотели сэкономить место на дисках, и ln тут будет и быстрее и проще.

Хотите больше игроков? Отключите EAC. Я знаю всего один сервер сейчас где можно играть из-под Линукса, остальные не пускают из-за того что EAC не пашет в wine.

А зачем хранить все файлы RustDedicated и Oxide локально?

Может вынести их установку в Dockerfile, а отдельно хранить только конфиги и каталоги Oxide/plugins для каждого сервера (подключенные к разным веткам git) и подмонтировать их в контейнеры в соответствующие каталоги (через volumes)?

В таком случае при получении изменений с репозитория с плагинами они сразу будут видны в контейнере.

P.S.: с серверами раста сталкивался лет 5 назад, может какие-то моменты не учел.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации