Skip to content

Instantly share code, notes, and snippets.

@MakStashkevich
Last active October 20, 2025 10:06
Show Gist options
  • Select an option

  • Save MakStashkevich/9c42d2d6fcbfd11ecfc1cec82128052a to your computer and use it in GitHub Desktop.

Select an option

Save MakStashkevich/9c42d2d6fcbfd11ecfc1cec82128052a to your computer and use it in GitHub Desktop.
Сборка и запуск TShock Terraria сервера на macOS ARM

Тестировалось при установленной Terraia 1.4.4.9 на MacOS купленной и скачанной из Steam. Теоритически, со взломками и старыми версиями также будет работать.

Установка

Перед использованием моих скриптов нужно скачать последнюю версию TShock в папку Documents вашего мака.

Сделать это можно командой cd ~/Documents && git clone https://github.com/Pryaxis/TShock.git --recurse-submodules.

(*) чтобы команда отработала у вас должен быть установлен Git: brew install git

После установки открываете папку TShock внутри папки документов.

И добавляете туда два моих скрипта start.sh и build.sh.

В обоих скриптах нужно изменить ваш никнейм пользователя в пути до папок и файлов.

Вместо /Users/makstashkevich написать что-то свое например /Users/vasia-pupkin

1. Запускаем сборку лаунчера под MacOS ./build.sh

Нужен для того чтобы собрать образ TShock Launcher на версию MacOS ARM.

(*) Перед запуском скрипта установите DotNET 9.0 с официального сайта https://dotnet.microsoft.com/en-us/download/dotnet

2. Запускаем сервер ./start.sh

Нужен для того чтобы запустить сервер TShock на MacOS с выбранной картой.

Путь до карты нужно указывать в самом скрипте.

Рекомендация и пояснение

Скрипт запустит сервер таким образом, чтобы сервер мог работать в фоновом режиме компьютера.

Если вы закроете консоль - сервер всеравно останется работать.

Подключится к текущей консоли сервера можно всегда по команде screen -x tschock

Сервер можно перезапустить заного запустив скрипт ./start.sh

Но я рекомендую зайти в консоль сервера и прописать stop чтобы сервер правильно выключился и сохранил данные карты.

А после заного запускать сервер по необходимости.

Также не забудьте изменить путь до файла .wld вашей карты мира которая будет использоваться сервером.

Плагины сервера

Плагины сервера будут хранится в папке ~/Documents/TShock/TShockLauncher/bin/Release/net9.0/osx-arm64/ServerPlugins

Для подключения из интернета

Нужно зайти в настройки роутера 192.168.0.1

И добавить перенаправление портов с внутреннего айпи адреса компьютера в сети на порт 7777 по протоколу TCP.

Внутренний айпи адрес MacOS можно узнать введя команду ifconfig в консоли.

Нужно искать строку вида:

inet 192.168.0.200 netmask 0xffffff00 broadcast 192.168.0.255

Где 192.168.0.200 является внутренним айпи адресом внутри домашней сети.

Вводим переадресацию с 192.168.0.200 и порта 7777 на внешний порт 7777 (чтобы могли подключится игроки).

Сохраняем найстройки роутера.

Далее заходим на сайт 2ip.ru и отправляем друзьям наш айпи адрес для подключения.

Чтобы подключится им нужно будет ввести айпи адрес из 2ip.ru и порт 7777.

Внимание!

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

Как правило, по опыту, система сбрасывается раз в 2-3 дня.

DuckDNS

Можно использовать сервис duckdns для того чтобы автоматически менять внешний айпи адрес.

Регистрируемся на сайте.

Устанавливаем скрипт на мак командой brew install duckdns

Далее создаем файл по пути ~/.duckdns с текстом

DOMAIN="domain-name"
TOKEN="ХХХХ-ХХХХ-ХХХХ-ХХХХ"

Указываем свой домен и токен при регистрации на сервисе.

Далее сохраняем файл и запускаем скрипт командой brew services start duckdns.

Все, теперь система автоматически будет обновлять домен, чтобы тот подключался на актуальный внешний айпи адрес.

К сожалению автоматизировать обновление внутреннего айпи адреса мака не получится, поэтому если он слетит, нужно будет заходить в настройки роутера 192.168.0.1 и снова обновлять все в ручную.

#!/bin/bash
# Путь к корню проекта TShockLauncher (где TShockLauncher.csproj)
PROJECT_DIR="/Users/makstashkevich/Documents/TShock/TShockLauncher"
# Переходим в директорию проекта
cd "$PROJECT_DIR" || { echo "Не удалось перейти в директорию $PROJECT_DIR"; exit 1; }
echo "Сборка TShock..."
# Сначала делаем обычный build
dotnet build
if [ $? -ne 0 ]; then
echo "Ошибка при сборке проекта."
exit 1
fi
# Переходим в директорию проекта (на всякий случай)
cd TShockLauncher || { echo "Не удалось перейти в TShockLauncher"; exit 1; }
echo "Публикация TShock для macOS arm64..."
# Публикуем с нужными параметрами
dotnet publish -r osx-arm64 -f net9.0 -c Release -p:PublishSingleFile=true --self-contained false
if [ $? -eq 0 ]; then
echo "Сборка и публикация завершены успешно."
else
echo "Ошибка при публикации."
exit 1
fi
#!/bin/bash
# Путь к TShock
TSHOCK_DIR="/Users/makstashkevich/Documents/TShock/TShockLauncher/bin/Release/net9.0/osx-arm64"
SCREEN_NAME="tshock"
LOG_FILE="$TSHOCK_DIR/tshock.log"
# Переходим в директорию
cd "$TSHOCK_DIR" || { echo "Не удалось перейти в директорию $TSHOCK_DIR"; exit 1; }
# Проверяем, есть ли уже запущенная сессия
if screen -list | grep -q "$SCREEN_NAME"; then
echo "Сессия $SCREEN_NAME уже существует. Завершаем старый сервер..."
# Завершаем все процессы TShock
pkill -f TShock.Server
sleep 2
# Убиваем старую screen сессию
screen -S "$SCREEN_NAME" -X quit
sleep 1
fi
echo "Запускаем новый сервер..."
# Запуск интерактивного screen с caffeinate и логом
# https://tshock.readme.io/docs/command-line-parameters
screen -S "$SCREEN_NAME" bash -c "export TSHOCK_LANGUAGE=ru_RU; caffeinate -ismu ./TShock.Server -ip 0.0.0.0 -port 7777 -maxplayers 5 -lang ru_RU -world '/Users/makstashkevich/Library/Application Support/Terraria/Worlds/hard_AMKD.wld'"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment