«Система без базовой настройки — это как человек без паспорта и часов. Вроде живёт, а кто он и когда — неизвестно. — Воланд»
Настоящее руководство настраивает фундамент сервера, на который лягут все остальные сервисы. Мы начинаем с уже работающего SSH-сервера, к которому можем подключиться пользователем uservpn и имеем права sudo (пока — без пароля, как настроено в предыдущем руководстве).
По сравнению с предыдущим документом сервер всё ещё «голый»: не установлена правильная локаль, часовой пояс, скорее всего, стандартный европейский, hostname — набор символов, выданных провайдером, а swap-файл отсутствует. На сервере с 1 ГБ оперативной памяти отсутствие swap — это как ходить по канату без страховки.
Все шаги пронумерованы и должны выполняться в указанном порядке. Перескакивать не рекомендуется.
Входные данные: вы подключены к серверу по SSH пользователем
uservpn. Команды сsudoне запрашивают пароль.
Локаль (locale) — набор параметров, определяющих язык, кодировку, форматирование дат, чисел и валют для программ в системе. Без правильно настроенной локали вы получите «кракозябры» в логах, некорректное отображение кириллицеских символов и проблемы с сортировкой текста.
В Ubuntu по умолчанию часто установлена одна en_US.UTF-8. Мы добавим ru_RU.UTF-8 и сделаем её основной — сервер-то наш русскоязычный.
Проверьте текущие настройки локали:
locale
Ожидаемый вывод на чистом сервере — всё значения C или en_US.UTF-8:
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
...
LC_ALL=
Проверьте, какие локали уже сгенерированы:
locale -a
ru_RU.UTF-8Установите пакет локалей (если ещё не установлен) и сгенерируйте русскую локаль:
sudo apt install -y locales
sudo locale-gen ru_RU.UTF-8
Ожидаемый результат:
Generating locales (this might take a while)...
ru_RU.UTF-8... done
Generation complete.
Настройте ru_RU.UTF-8 как системную локаль по умолчанию:
sudo update-locale LANG=ru_RU.UTF-8 LANGUAGE=ru_RU:ru LC_ALL=ru_RU.UTF-8
После этого примените изменения в текущей сессии:
export LANG=ru_RU.UTF-8
export LANGUAGE=ru_RU:ru
export LC_ALL=ru_RU.UTF-8
Проверьте результат:
locale
Ожидаемый вывод — все значения ru_RU.UTF-8:
LANG=ru_RU.UTF-8
LANGUAGE=ru_RU:ru
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
...
LC_ALL=ru_RU.UTF-8
Также убедитесь, что локаль доступна в списке сгенерированных:
locale -a | grep ru_RU
Ожидаемый вывод:
ru_RU.utf8
Воланд удовлетворённо улыбнулся:
«Теперь сервер понимает, на каком языке с ним говорят. Раньше он был как иностранец, не знающий ни одного наречия. Теперь — он наш. Русский, грамотный, с правильной кодировкой. И дата будет отображаться так, как привыкли мы, а не какой-нибудь техасец.»
timedatectl и NTPЧасовой пояс (timezone) — правило, определяющее сдвиг местного времени относительно UTC. Серверы провайдеров часто по умолчанию стоят в UTC или Europe/London. Это неудобно: логи, cron-задачи, время создания файлов — всё будет показывать «не наше» время.
NTP (Network Time Protocol) — протокол синхронизации системных часов с серверами точного времени. Без NTP часы сервера постепенно «уплывают» — на несколько миллисекунд в сутки, но за год это накапливается до минут. Расхождение во времени ломает аутентификацию TLS, проверку сертификатов, журналы событий и работу VPN-туннелей.
Утилита timedatectl — часть systemd — управляет системным временем, часовым поясом и синхронизацией NTP. В Ubuntu 24.04 служба systemd-timesyncd уже включена по умолчанию и автоматически синхронизирует часы с серверами NTP Canonical. Настраивать NTP вручную (устанавливать chrony или ntp) на нашем сервере не нужно. В этом можно убедиться:
timedatectl show --property=NTPSynchronized --value
Ожидаемый вывод:
yes
Если вы видите yes — время уже синхронизируется. Если no — запустите службу:
sudo systemctl enable --now systemd-timesyncd
После этого проверьте статус:
timedatectl status
В строке System clock synchronized: должно быть yes:.
timedatectl
Ожидаемый вывод (фрагмент):
Local time: Вт 2025-04-29 10:00:00 UTC
Universal time: Вт 2025-04-29 10:00:00 UTC
Time zone: UTC (UTC, +0000)
Если в строке Time zone написано UTC или что-то отличное от Europe/Moscow — меняем.
sudo timedatectl set-timezone Europe/Moscow
timedatectl
Ожидаемый результат:
Local time: Вт 2025-04-29 13:00:00 MSK
Universal time: Вт 2025-04-29 10:00:00 UTC
Time zone: Europe/Moscow (MSK, +0300)
Обратите внимание: местное время теперь на 3 часа впереди UTC. MSK — московское стандартное время.
Коровьев прищурился на часы:
«Время — вещь удивительная. В Амстердаме полдень, а у нас уже три часа дня. Но серверу, видите ли, всё равно — он работает и в UTC, и в MSK. Мы ставим время не ради сервера, а для нашего удобства: чтобы логи показывали, когда именно Анна зашла на сервер, а не когда солнце в Лондоне было в зените.»
Hostname — имя компьютера в сети. Провайдеры обычно присваивают серверам имена вроде vps-12345 или server-abc, что ни о чём не говорит. Мы хотим осмысленное имя — psjsrv01, чтобы при входе в терминал сразу было понятно, на каком сервере вы находитесь, а не гадать по IP-адресу.
Проверьте текущее имя:
hostnamectl
Ожидаемый вывод:
Static hostname: vps-12345
Icon name: computer-vm
Chassis: vm
Machine ID: ...
Boot ID: ...
Virtualization: kvm
Operating System: Ubuntu 24.04 LTS
Kernel: Linux 6.8.0-xx-generic
Architecture: x86-64
sudo hostnamectl set-hostname psjsrv01
/etc/hostsФайл /etc/hosts связывает IP-адреса с именами. После смены hostname нужно обновить его, чтобы система могла корректно резолвить собственное имя.
Откройте текущую версию:
cat /etc/hosts
Пример содержимого:
127.0.0.1 localhost
127.0.1.1 vps-12345
::1 localhost ip6-localhost ip6-loopback
Измените строку 127.0.1.1, заменив старое hostname на psjsrv01. Выполните:
sudo sed -i 's/127\.0\.1\.1.*/127.0.1.1\tpsjsrv01/' /etc/hosts
Проверьте результат:
cat /etc/hosts
Ожидаемый результат:
127.0.0.1 localhost
127.0.1.1 psjsrv01
::1 localhost ip6-localhost ip6-loopback
Проверьте новое имя:
hostnamectl
Ожидаемый вывод:
Static hostname: psjsrv01
Воланд задумчиво кивнул:
«Теперь у сервера есть имя. Не какое-то "vps-12345", а настоящее — psjsrv01. Знаете, это важно — знать, как зовут того, кому вы поручаете свои тайны. Бездомные, кстати, тоже сначала дают кличку, а потом уже доверяют.»
Swap (файл подкачки) — область на диске, которую ядро Linux использует как «дополнительную оперативную память». Когда RAM заполняется, ядро перемещает наименее активные страницы памяти на диск, освобождая место для текущих задач.
На сервере с 1 ГБ RAM swap обязателен. Без него при заполнении памяти срабатывает OOM-killer (Out Of Memory killer) — механизм, который без разбора убивает процессы, потребляющие больше всего памяти. И он часто выбирает самый «жирный» процесс — вашу CMS или VPN.
Мы используем swap-файл, а не swap-раздел. Файл гибче: его можно создать, изменить размер или удалить без переразметки диска.
Создайте файл нужного размера командой fallocate:
sudo fallocate -l 2G /swapfile
Проверьте, что файл создан:
ls -lh /swapfile
Ожидаемый вывод:
-rw-r--r-- 1 root root 2.0G ... /swapfile
Swap-файл должен быть доступен только root. Иначе любой пользователь сможет прочитать его содержимое и, теоретически, извлечь чувствительные данные из памяти.
sudo chmod 600 /swapfile
Проверьте:
ls -lh /swapfile
Ожидаемый результат:
-rw------- 1 root root 2.0G ... /swapfile
Разметьте файл как swap-область:
sudo mkswap /swapfile
Ожидаемый вывод:
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Активируйте swap:
sudo swapon /swapfile
Проверьте, что swap активен:
sudo swapon --show
Ожидаемый результат:
NAME TYPE SIZE USED PRIO
/swapfile file 2G 0B -2
Также проверьте через free:
free -h
В строке Swap: должны отображаться 2.0G в колонке total.
/etc/fstab для автоматического монтированияSwap, активированный командой swapon, пропадёт после перезагрузки. Чтобы этого не произошло, добавьте запись в /etc/fstab:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Проверьте, что запись добавлена:
tail -1 /etc/fstab
Ожидаемый вывод:
/swapfile none swap sw 0 0
vm.swappinessvm.swappiness — параметр ядра, определяющий, насколько активно система будет использовать swap. Диапазон: от 0 до 100.
| Значение | Поведение |
|---|---|
0 |
Swap используется только при критической нехватке памяти |
10 |
Система предпочитает RAM, но при необходимости сбрасывает фоновые данные |
60 |
Значение по умолчанию в Ubuntu — умеренно активное использование swap |
100 |
Агрессивный swap — всё, что можно, уходит на диск |
Зачем менять значение по умолчанию? На сервере с 1 ГБ RAM и 2 ГБ swap значение 60 означает, что ядро начнёт активно сбрасывать данные на диск слишком рано. Это приведёт к тому, что даже при наличии свободной памяти часть данных окажется на медленном диске, и производительность упадёт. Значение 10 скажет ядру: «Используй RAM по максимуму, а swap — только когда совсем прижмёт». Для сервера с малым объёмом памяти это оптимальный баланс.
Установите значение:
sudo sysctl vm.swappiness=10
Проверьте:
sysctl vm.swappiness
Ожидаемый вывод:
vm.swappiness = 10
Для сохранения параметра после перезагрузки создайте конфигурационный файл:
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf
Проверьте:
cat /etc/sysctl.d/99-swappiness.conf
Ожидаемый вывод:
vm.swappiness=10
Воланд предупреждает:
«Swap — это не замена оперативной памяти. Это последняя линия обороны. Если ваш сервер постоянно работает с заполненным swap — это как дышать через трубочку: жив, но качество жизни… нет, вам нужен сервер с большей RAM.»
После развёртывания сервера от провайдера образ может быть не первой свежести: в нём содержатся устаревшие пакеты, включая потенциальные уязвимости безопасности. Перед установкой любого ПО — обновляемся.
sudo apt update
Ожидаемый вывод (фрагмент):
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Get:2 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
...
All packages are up to date.
sudo apt upgrade -y
Флаг -y подтверждает установку обновлений автоматически. Процесс может занять несколько минут, в зависимости от количества пакетов.
После обновления удалите загруженные архивные файлы пакетов — они занимают место на диске, а на сервере с 60 ГБ каждый мегабайт на счету:
sudo apt autoremove -y && sudo apt autoclean
Ожидаемый результат — сообщение о количестве освобождённого места или Пакеты не требуют обновления.
Воланд, просматривая список обновлённых пакетов:
«Сорок семь обновлений. Сорок семь дыр, которые кто-то уже закрыл, пока вы читали это руководство. Сервер — как квартира: чем дольше не закрываете замки, тем больше желающих зайти без приглашения.»
На данном этапе мы имеем:
| Что | Статус |
|---|---|
Локаль ru_RU.UTF-8 установлена |
✅ |
Часовой пояс Europe/Moscow |
✅ |
Hostname psjsrv01 |
✅ |
| Swap-файл 2 ГБ активен | ✅ |
vm.swappiness = 10 |
✅ |
| Системные пакеты обновлены | ✅ |
Одной командой — проверка всех параметров:
echo "=== Hostname ===" && hostnamectl --static && \
echo "=== Часовой пояс ===" && timedatectl show --property=Timezone --value && \
echo "=== Локаль ===" && locale | head -1 && \
echo "=== Swap ===" && swapon --show --noheadings && \
echo "=== Swappiness ===" && sysctl -n vm.swappiness
Ожидаемый вывод:
=== Hostname ===
psjsrv01
=== Часовой пояс ===
Europe/Moscow
=== Локаль ===
LANG=ru_RU.UTF-8
=== Swap ===
/swapfile file 2G ...
=== Swappiness ===
10
Следующее руководство: настройка фаервола UFW.
Конец документа. Настроившему — порядок, забывшему swap — сюрприз от OOM-killer, пропустившему apt update — уязвимости из 2024 года.