Перейти к содержимому

Сертификат

Он не нужен, чтобы пользоваться телефоном. Из коробки, без какой-либо настройки, игрок сканирует QR-код в Настройки › Связанные устройства — и его реальный телефон становится телефоном его персонажа: сообщения, почта, контакты, City ID, гараж, недвижимость, доска объявлений, сохранённые места. Всё это работает по обычному HTTP через порт, который ваш сервер и так держит открытым.

Сертификат добавляет то, что браузер не отдаёт небезопасной странице:

Обычный HTTPHTTPS
Сообщения, почта, гараж, всё остальноедада
Уведомления при закрытой страниценетда
Микрофон, чтобы можно было записывать голосовые сообщениянетда
Установка как приложения на Android, с собственной иконкойнетда
«Не защищено» в адресной строкепоказываетсяне показывается
Токен сессиипередаётся открытозашифрован

Последняя строка — не косметика. По обычному HTTP тот, кто сидит в одной сети Wi-Fi с вашим игроком, может перехватить его сессию и прочитать его телефон. Для ролевого города это может быть приемлемым компромиссом, но это должно быть хотя бы решением, а не сюрпризом.

У вас есть имя, которое можно направить на сервер, — пусть телефон сам получит себе сертификат

Заголовок раздела «У вас есть имя, которое можно направить на сервер, — пусть телефон сам получит себе сертификат»

Это короткий вариант, и ему не нужна никакая другая программа на машине. Ресурс запрашивает у Let’s Encrypt сертификат, сам отвечает на проверку, сам обслуживает TLS и сам продлевает сертификат, пока работает.

-- shared/server_config.lua (server-only: this file is never sent to a client)
ServerConfig.Web = {
Url = 'https://phone.yourserver.com/',
Https = {
Enabled = true,
Names = { 'phone.yourserver.com' },
Contact = '[email protected]',
},
}

Затем, один раз:

  1. Направьте это имя на сервер. На VPS это одна A-запись. Нет собственного домена? duckdns.org даст вам его бесплатно за минуту, и он никогда не меняется.
  2. Откройте в брандмауэре 443 и 80. 80 открывается только на время запроса сертификата и закрывается снова, как только ответ дан, — лог говорит об обоих моментах.

phonehttps показывает, как обстоят дела с сертификатом. phonehttps check спрашивает тестовый сервер Let’s Encrypt, станет ли он вообще разговаривать с этой машиной, — это тот вопрос, на который стоит ответить первым, когда ничего не приходит: он отделяет ваш брандмауэр от этого ресурса.

Продление происходит само, когда остаётся ещё треть срока жизни сертификата, проверка — каждые шесть часов.

Провайдер выдаёт домашнему подключению новый адрес, когда ему вздумается, и в тот момент, когда он это делает, имя указывает на чужой роутер: связанные телефоны не могут достучаться до сервера, а сертификат не может продлиться. Этот ресурс уже замечает такое — он каждые полчаса спрашивает свой собственный адрес для QR-кода, — а в случае имени DuckDNS он может ещё и всё исправить:

-- shared/server_config.lua
DuckDNS = {
Enabled = true,
Domains = { 'yourname' }, -- the part in front of .duckdns.org
Token = '01d8b39f-...', -- from your duckdns.org page
},

Он сообщает, когда адрес меняется, и раз в день, когда не меняется, — этот «пульс» также исправляет ситуацию после периода без интернета, когда смена произошла, пока ничего нельзя было отправить. Когда всё срабатывает, лог так и пишет, и тревога не поднимается; когда нет — отправляется прежнее предупреждение, в том числе в webhook Server.

На VPS адрес не меняется, и всё это не нужно. Оставьте Enabled = false.

Делать ничего не нужно. Если установлен sv_listingHostOverride, QR строится как https://your.domain/mic_phone/web/ сам, потому что этот прокси пропускает весь корень на ваш сервер. Это самый простой случай, и он уже обработан.

У вас уже есть обратный прокси, и вы хотите оставить всё как есть

Заголовок раздела «У вас уже есть обратный прокси, и вы хотите оставить всё как есть»

Одна строка в shared/config/web.lua:

Url = 'https://phone.yourserver.com/mic_phone/web/',

и обратный прокси перед сервером, который завершает TLS и пересылает запросы на игровой порт. С Caddy это две строки в Caddyfile:

phone.yourserver.com {
reverse_proxy 127.0.0.1:30120
}

С nginx перенаправляйте / на 127.0.0.1:30120 и отключите буферизацию (proxy_buffering off;), иначе поток событий будет задерживаться, и телефон перестанет что-либо слышать.

Одна вещь, которая не работает: включить оранжевое облако на DNS-записи, указывающей на порт 30120. Прокси Cloudflare принимает только фиксированный список портов источника — 80, 8080, 8880, 2052, 2082, 2086, 2095 и 443, 2053, 2083, 2087, 2096, 8443, — а 30120 в нём нет. Вам нужен собственный прокси перед сервером, как описано выше.

На эту машину нельзя ничего устанавливать, но и не нужно: первый вариант выше ничего не устанавливает, это и есть этот ресурс. От хостинга вам нужны два собственных порта, 443 и 80, и имя, направленное на сервер. Многие хостинги дают и то, и другое; некоторые делят эти порты между всеми клиентами на машине и не дадут ни того, ни другого. Спросите у них про порты раньше, чем о чём-либо другом; если ответ «нет», направьте имя на именованный туннель Cloudflare.

Вы вообще не можете открыть порт — нет имени или мешает провайдер

Заголовок раздела «Вы вообще не можете открыть порт — нет имени или мешает провайдер»

Тогда туннель: tools/tunnel.ps1 запускает быстрый туннель Cloudflare, записывает полученный адрес в конфиг и сообщает вам перезапустить ресурс. Без открытия портов и без сертификата.

Но знайте, что это такое: быстрый туннель по замыслу эфемерен. Адрес случайный, и новый выдаётся при каждом перезапуске туннеля — а поскольку браузер привязывает установленное приложение, его сохранённый токен и его push-подписку к адресу, с которого они пришли, каждую из этих вещей приходится настраивать заново каждый раз. Он подходит для проб. Для всего, что должно пережить перезапуск, направьте имя на именованный туннель, который сохраняет свой адрес, — для этого нужен аккаунт Cloudflare и домен в нём.

Телефон держит одно долгое соединение открытым, чтобы узнавать о сообщениях по мере их поступления, и открывает его через POST, а не через обычный GET EventSource. Две причины, обе стоит знать, если вы ставите перед ним прокси:

  • Токен в строке запроса — это токен, записанный в каждый лог прокси между телефоном и сервером. В теле POST его там нет.
  • Быстрый туннель Cloudflare удерживает GET-поток событий закрытым, пока сервер не закроет соединение, а POST пропускает (cloudflared#1449). Многие прокси по умолчанию буферизуют GET-потоки.

Сервер отвечает и на GET по тем же маршрутам — для всего, что знает только EventSource.