Плановый перезапуск сервера Valheim стоит завести, и он безопасен, пока соблюдается одно правило: сервер нужно останавливать сигналом прерывания, а не убивать, потому что именно чистая остановка записывает мир на диск. Раз в сутки для загруженного или модифицированного сервера, несколько раз в неделю для небольшой ванильной группы, в час, когда никто не играет. Ванильный Valheim не умеет предупреждать игроков со стороны сервера, поэтому предупреждение уходит через Discord или мод, либо вы перезапускаете сервер только когда он пуст. Обновления можно совмещать с перезапуском, но только на ванильном сервере - модифицированный никогда не должен обновляться сам.
Остальная часть руководства - как собрать это на собственной Linux-машине с cron и systemd, в Docker и на панели, а также ошибки, из-за которых безобидный перезапуск превращается в потерянный вечер стройки.
Зачем вообще перезапускать сервер Valheim#
Сервер Valheim, работающий неделями, продолжает работать, но "уплывает". Причины, по которым плановый перезапуск помогает, вполне конкретны:
- Память растёт. Сервер держит в памяти каждую загруженную зону и каждый экземпляр объекта. Пока игроки исследуют и строят, рабочий набор растёт и не всегда уменьшается, когда они покидают область. Перезапуск возвращает его к цене мира в сохранённом виде.
- Моды текут. Плагины BepInEx пишут добровольцы под игру, которая меняется у них под ногами. Мод, который удерживает ссылки или раздувает кэш, - обычное дело, и ежедневный перезапуск скрывает медленную утечку, которая иначе закончилась бы остановкой из-за нехватки памяти в худший момент.
- Обновлениям он нужен. Патч Valheim применяется так: остановить сервер, запустить SteamCMD и снова запустить сервер. Если перезапуск уже запланирован, обновление можно сделать внутри него.
- Чистый лист для застрявшего состояния. Корабли с рывками, бесконечный набег, объекты, которые отказываются синхронизироваться, - большая часть этого проходит после перезапуска, потому что владение зонами раздаётся заново тем, кто прибыл первым.
Не менее важно, чего перезапуск не исправляет. Он не делает дешевле мир с гигантской терраформированной базой, не лечит плохое соединение одного игрока и не остановит сбой, происходящий при загрузке. Если сервер тормозит сразу после перезапуска, проблема в мире или тарифе, и смотреть надо в статье Производительность и лаги сервера Valheim.
Один побочный эффект подстерегает кроссплей-группы: шестизначный код подключения меняется при каждом запуске сервера. Ежедневный перезапуск означает ежедневный новый код, поэтому, если консольные игроки подключаются так, процедура перезапуска должна публиковать новый код там, где они его увидят. Подробнее об этом ниже.
Как часто и в какое время#
Волшебного интервала нет. Выбирайте его по тому, как используется сервер:
| Сервер | Интервал | Почему |
|---|---|---|
| 2-5 друзей, ваниль | Раз в неделю или дважды в неделю | Небольшой рост, мало объектов, нет модов, которые могут течь |
| 6-10 игроков, ваниль, зрелый мир | Ежедневно | Большие постройки и множество питомцев накапливаются |
| Любой модифицированный сервер | Ежедневно | Плагины - обычный источник растущей памяти |
| Публичный сервер сообщества | Ежедневно, плюс перед событиями | Больше игроков - больше одновременно загруженных зон |
Запускайте, когда сервер обычно пуст. Выясните, когда ваша группа действительно играет, а не гадайте: лог записывает каждое подключение, и недели записей хватит, чтобы найти тихий час. Для европейской группы это часто время между 04:00 и 07:00. Если группа живёт в разных часовых поясах, пустого часа может не быть, и тогда нужно предупреждение, о нём ниже.
Два момента со временем важнее самого часа. Во-первых, знайте, в каком часовом поясе работает планировщик. Cron использует пояс машины, многие контейнеры по умолчанию работают в UTC, а расписание панели следует тому, что настроено в панели. Записывайте перезапуск в заметках в UTC, и переход на летнее время вас не удивит. Во-вторых, не ставьте несколько задач на одну минуту. Бэкап, начавшийся во время остановки сервера, копирует мир, записанный лишь наполовину. Оставляйте несколько минут между перезапуском, бэкапом и всем остальным. Если синтаксис из пяти полей вам незнаком, он разобран в статье Выражения cron: разбор.
Главное правило: останавливайте чисто, чтобы мир сохранился#
Valheim держит мир в памяти и записывает его каждые -saveinterval секунд, по умолчанию 1800. Он также сохраняется, когда его вежливо просят остановиться. В Linux это SIGINT, тот же сигнал, что при нажатии Ctrl+C в терминале. Сервер перехватывает его, пишет в лог World saved и завершается. SIGKILL перехватить нельзя: процесс просто исчезает, и всё с момента последнего сохранения пропадает вместе с ним.
Любой способ перезапуска ниже сводится к отправке правильного сигнала и достаточно долгому ожиданию. Большой старый мир может записываться десятки секунд, а медленный диск удлиняет это время. Если ваш инструмент сдаётся через десять секунд и переходит к убийству, вы потеряете данные именно в самых важных мирах.
Нужная часть юнита systemd выглядит так:
[Service]User=valheimWorkingDirectory=/home/valheim/serverExecStart=/home/valheim/server/start_server.shKillSignal=SIGINTTimeoutStopSec=120Restart=on-failureRestartSec=10Проверьте один раз вручную, прежде чем доверять этому: sudo systemctl restart valheim, затем journalctl -u valheim -n 50, и ищите строку сохранения перед строками запуска. Если сохранения нет, сигнал не доходит до процесса сервера - обычно потому, что стартовый скрипт запускает его в фоне или не использует exec. Полный юнит, включая логи и политику перезапуска, приведён в статье Valheim как сервис systemd.
Перезапуск через cron или таймер systemd#
На машине, которую вы контролируете, самый простой плановый перезапуск - одна строка в cron пользователя root, где остановку и запуск выполняет приведённый выше юнит:
# Every day at 05:00 machine time0 5 * * * root /usr/bin/systemctl restart valheimФайлы в /etc/cron.d принимают поле пользователя (здесь root), в отличие от личного crontab. Если хотите держать всё внутри systemd, таймер делает то же самое и пишет в журнал:
[Unit]Description=Daily Valheim restart[Timer]OnCalendar=*-*-* 05:00:00Persistent=false[Install]WantedBy=timers.target[Unit]Description=Restart the Valheim server[Service]Type=oneshotExecStart=/usr/bin/systemctl restart valheim.serviceВключите его командой sudo systemctl enable --now valheim-restart.timer и проверьте следующий запуск через systemctl list-timers. Persistent=false важно: при значении true машина, которая в 05:00 была выключена, выполнила бы пропущенный перезапуск сразу после загрузки, а для перезапуска это бессмысленно.
LinuxGSM
Если сервер установлен через LinuxGSM, у него свои команды: ./vhserver restart, ./vhserver update (останавливает, обновляет и запускает, только когда есть новая сборка) и ./vhserver monitor (снова запускает сервер, если тот упал). Они помещаются в crontab пользователя vhserver. Настройка и компромиссы по сравнению с простым скриптом описаны в статье LinuxGSM vhserver.
Предупреждение игроков перед перезапуском#
В ванильном Valheim нет ввода в консоль сервера и нет команды рассылки. Нельзя набрать на сервере "перезапуск через пять минут" и увидеть это на экране. Остаются три честных варианта.
- Перезапускать, только когда никого нет. Для небольшой группы это лучший ответ. Перезапуск в пустой час вообще не требует предупреждения.
- Предупреждать через Discord. У большинства групп уже есть канал. Скрипт публикует сообщение в webhook Discord, ждёт, затем перезапускает.
- Использовать мод. Server Devcommands добавляет команду
broadcast, но её вводит подключённый админ, а не запускает cron. Существуют серверные моды-оповещатели; убедитесь, что выбранный поддерживается для текущей версии игры.
Вариант с Discord - это дюжина строк на shell:
#!/usr/bin/env bashset -euo pipefailWEBHOOK="https://discord.com/api/webhooks/REPLACE/ME"say() { curl -fsS -H "Content-Type: application/json" \ -d "{\"content\":\"$1\"}" "$WEBHOOK" >/dev/null || true}say "Valheim restarts in 10 minutes. Find a safe spot."sleep 540say "Valheim restarts in 1 minute."sleep 60systemctl restart valheimsay "Valheim is restarting. Back in about two minutes."Направьте строку cron на скрипт вместо systemctl. || true не даёт сбою Discord отменить перезапуск. Относитесь к URL webhook как к паролю: любой, у кого он есть, может писать в канал. О создании webhook и форматировании сообщений рассказано в статье Webhook Discord для статуса сервера.
Пропуск перезапуска, когда люди играют
Можно также проверять, есть ли кто-нибудь онлайн, и пропускать перезапуск, если да. Сервер отвечает на запросы Steam на игровом порту плюс один (2457 по умолчанию), а библиотека python-a2s читает число игроков:
$ pip install python-a2s$ python3 -c 'import a2s,sys; sys.exit(1 if a2s.info(("127.0.0.1",2457)).player_count else 0)' \ && systemctl restart valheimКоманда завершается с ненулевым кодом, когда игроки подключены, поэтому перезапуск происходит только на пустом сервере. Сначала проверьте запрос на своём сервере: если он завершается по таймауту, перезапуск не произойдёт никогда, что безопасно, но незаметно. Запрос подробно разобран в статье Мониторинг сервера Valheim и число игроков, включая случаи, когда он не отвечает.
Обновление при перезапуске и когда этого делать не стоит#
Перезапуск - естественный момент для обновления. В установке на systemd добавьте обновление SteamCMD как шаг перед запуском, чтобы оно выполнялось при каждом старте:
[Service]ExecStartPre=/usr/games/steamcmd +force_install_dir /home/valheim/server \ +login anonymous +app_update 896660 validate +quitTimeoutStartSec=600Путь к steamcmd зависит от способа установки: /usr/games/steamcmd - там, куда его кладёт пакет Ubuntu и Debian; ручная установка лежит там, куда вы её распаковали. Увеличьте TimeoutStartSec, чтобы медленная загрузка не считалась неудачным запуском. Когда новой сборки нет, шаг занимает несколько секунд.
Для ванильного сервера это правильное значение по умолчанию. После патча игроки обновляют игру и обнаруживают, что сервер уже совпадает. Альтернатива - ошибка "Incompatible version" и сообщение вам в полночь; как работает проверка версии, описано в статье Обновление сервера Valheim.
Для модифицированного сервера это неверное значение по умолчанию, всегда. Обновление игры ломает плагины BepInEx, пока их авторы не догонят, иногда по несколько дней. Сервер, обновляющийся сам при утреннем перезапуске, встречает всех сбоем при запуске или стеной кика из-за несовпадения версий. Уберите шаг перед запуском, обновляйтесь вручную, когда ваши моды обновлены, и сначала делайте бэкап. Плановый перезапуск оставьте; просто не включайте в него обновление.
В Docker-образе lloesche/valheim-server то же разделение выражается двумя переменными: RESTART_CRON (ежедневно в 05:00 по умолчанию) и UPDATE_CRON (каждые 15 минут по умолчанию), у каждой есть переключатель _IF_IDLE, который откладывает действие, пока игроки подключены. Для модифицированного контейнера задайте пустое значение UPDATE_CRON и оставьте RESTART_CRON. Полная таблица переменных есть в статье Valheim в Docker.
Перезапуски и бэкапы вместе#
Важен порядок. Бэкап копирует файлы на диске, а они свежи ровно настолько, насколько свежо последнее сохранение. Если сначала сделать бэкап, а потом перезапуск, бэкап может отставать на целый интервал сохранения. Если сначала перезапуск, чистая остановка записывает мир, и бэкап, сделанный несколькими минутами позже, содержит всё вплоть до перезапуска.
Последовательность, которая работает:
- Предупредите игроков (если кто-то может быть в сети).
- Перезапустите - сохранение произойдёт по дороге вниз.
- Дождитесь полного запуска сервера - от двух до пяти минут для большого мира.
- Сделайте бэкап и скопируйте его за пределы машины.
Не назначайте бэкап на ту же минуту, что и перезапуск. Копия, снятая, пока сервер пишет финальное сохранение, может захватить обрезанный .db, а это именно тот файл, за которым вы потянетесь после катастрофы. Собственная ротация -backups в Valheim не заменяет бэкап: она лежит в той же папке на том же диске. О восстановлении и распознавании повреждённого мира рассказано в статье Бэкапы Valheim и повреждение мира.
На панели#
На хостинговой панели cron-строки и юниты писать не нужно; те же кирпичики представлены задачами в расписании. На RE:NODE вкладка Schedules принимает выражение cron и упорядоченный список задач с задержками между ними, и каждая задача - это команда консоли, бэкап или действие с питанием. Ежедневный перезапуск со свежим бэкапом - две задачи:
| Порядок | Задача | Задержка перед ней | Назначение |
|---|---|---|---|
| 1 | Power action: restart | - | Чистая остановка сохраняет мир, затем запуск |
| 2 | Backup | 5 минут | Захватывает мир в только что сохранённом виде |
Действие питания Restart отправляет чистую остановку, поэтому мир сохраняется до выключения сервера, а бэкапы хранятся вне машины, которую они защищают. Задача с командой консоли бесполезна для предупреждений в ванильном Valheim, потому что сервер не читает ввод консоли; публикуйте предупреждение из Discord или назначайте перезапуск на пустой час. Наблюдатель за сбоями, который предупреждает о повторяющихся перезапусках, не считает перезапуски, которые вы запросили сами, поэтому ежедневное расписание его не сработает. В разделе о расписаниях в руководствах показано, где находится каждое поле.
Чего расписание панели не видит, так это есть ли игроки онлайн. Если это важно, тщательно выберите час или используйте серверный мод, откладывающий перезапуск, пока люди играют.
Когда плановый перезапуск идёт не так#
Мир откатился после перезапуска. Остановка была убийством, а не прерыванием. Проверьте в логе строку World saved прямо перед выключением. В systemd задайте KillSignal=SIGINT и увеличьте TimeoutStopSec. В Docker установите stop_grace_period в минуту-две.
Сервер не вернулся. Смотрите лог запуска, а не выключения. Обычные причины после планового перезапуска - обновление, сломавшее мод, загрузка SteamCMD, оборвавшаяся на полпути, или мир, которому для загрузки теперь нужно больше памяти, чем лимит. Список ошибок есть в статье Сервер Valheim падает при запуске.
Перезапуск прошёл не в тот час. Часовой пояс. Сравните date на машине с ожидаемым и помните, что контейнеры часто работают в UTC.
Игроки получили "Incompatible version" утром после патча. Сервер обновился, а их клиенты ещё нет - или наоборот, если вы убрали шаг обновления. Скажите группе обновиться и перезапустить Steam.
Консольные игроки не могут перезайти. Изменился код подключения. Опубликуйте новый; где он отображается, описано в руководстве по кроссплею.
FAQ#
Сохраняет ли перезапуск мир Valheim?
Только чистая остановка. Сервер записывает мир, когда получает сигнал прерывания, который отправляет обычная остановка в панели или systemctl stop с KillSignal=SIGINT. Принудительное убийство, остановка из-за нехватки памяти или отключение питания теряют всё с момента последнего планового сохранения.
Можно ли отправить предупреждение из консоли сервера?
В ванильном Valheim нет. У выделенного сервера нет ввода в консоль и команды рассылки. Используйте сообщение в Discord перед перезапуском, мод с серверными объявлениями или время перезапуска, когда никого нет онлайн.
Сколько длится перезапуск Valheim?
Обычно от одной до трёх минут: сохранение при остановке, затем загрузка мира. Большие, густо застроенные миры на медленных дисках занимают дольше, а проверка обновлений добавляет время, необходимое для загрузки.
Должен ли модифицированный сервер обновляться автоматически при перезапуске?
Нет. Патчи игры ломают моды BepInEx, пока те не обновлены, и автоматическое обновление превращает обычный перезапуск в сервер, который не запускается. Перезапускайте по расписанию, а обновляйтесь вручную, когда ваши моды поддерживают новую версию.
Изнашивают ли ежедневные перезапуски что-нибудь или стоят прогресса?
Нет. Чистый перезапуск ничего не стоит, кроме минуты-двух простоя. Прогресс теряется, только если остановка нечистая, поэтому настройки сигнала и таймаута важнее расписания.


