Начальная настройка сервера на Debian 11

Серия - Проект на Django + DRF + Nuxt с нуля до деплоя

Для начала берем любой VPS. Я взял на reg.ru самый дешевый - Тариф «Base-1»:

  • 15 ГБ SSD
  • 1 ГБ RAM
  • 1 vCPU
  • Debian 11 Bullseye
  • 370 р/мес (или 0,55 ₽/час)

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

Подключаемся по ssh под root:

ssh root@<server_ip>

Приступаем к настройке. Для начала обновим систему:

apt update && apt upgrade -y

Установим sudo, если его нет:

apt install sudo

Теперь нам нужно создать нового юзера, под которым мы будем подключаться к серверу и выполнять все необходимые в дальнейшем операции. Почему нельзя использовать юзера root? Можно, но практика показывает, что из-за наличия неограниченных админских прав под рутом гораздо проще натворить непоправимых дел, даже по чистой случайности.

Создаем отдельного юзера www (можно использовать любое название):

adduser www

Следуем инструкциям на экране (все поля можно оставить пустыми, главное сохранить пароль).

Добавляем пользователя в группу sudo. Это позволит нашему пользователю www выполнять команды с административными привилегиями, написав перед командой слово sudo:

usermod -aG sudo www

Чтобы разрешить только определенные подключения к определенным службам в Debian можно использовать брандмауэры, например UFW. Он позволяет сделать базовые настройки, для более сложных настроек лучше использовать iptables.

UFW (Uncomplicated Firewall)
  • удобный интерфейс для управления политиками безопасности межсетевого экрана.
  • является простым и популярным инструментом для настройки и управления брандмауэром в дистрибутивах Ubuntu и Debian.

Установим брандмауэр UFW (пока мы все еще залогинены под рутом, поэтому без sudo):

apt install ufw -y

Профили брандмауэра позволяют UFW управлять именованными наборами правил для установленных приложений. Профили для некоторых распространенных программ присутствуют в UFW по умолчанию. Их список пожно посмотреть командой ufw app list. Статус самого UFW можно проверить коммандой ufw status.

Например, для OpenSSH и http/https уже есть профили, которые мы и используем (на данном этапе настройки другие нас не интересуют):

ufw allow OpenSSH
1
ufw allow "WWW Full"

Запускаем сервис:

ufw enable

Вводим y и Enter, чтобы подтвердить активацию брандмауэра.

В итоге, ответ на запрос статуса ufw status должен быть примерно таким:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
WWW Full                   ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
WWW Full (v6)              ALLOW       Anywhere (v6)

Готово. UFW блокирует все соединения, кроме SSH и http/https. В дальнейшем мы будем добавлять новые правила1 по мере необходимости.2

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

sudo apt install -y zsh neovim ripgrep tmux tree htop git curl wget zip unzip build-essential ca-certificates gnupg lsb-release
Что это за пакеты?
  • zsh - одна из современных командных оболочек UNIX (замена bash);
  • neovim - мощный текстовый редактор;
  • ripgrep - хорошая альтернатива grep
  • tmux - терминальный мультиплексор;
  • tree - просмотр дерева директорий в командной строке;
  • htop - программа, предназначенная для вывода на терминал списка запущенных процессов и информации о них;
  • git - система контроля версий (Уже в составе Debian);
  • curl - кроссплатформенная служебная программа командной строки, позволяющая взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL. (Уже в составе Debian);
  • wget - свободная неинтерактивная консольная программа для загрузки файлов по сети. Поддерживает протоколы HTTP, FTP и HTTPS, а также поддерживает работу через HTTP прокси-сервер. (Уже в составе Debian);
  • zip - это утилита для сжатия и упаковки файлов;
  • unzip - распаковывает zip-архивы;
  • build-essential - метапакет (не является программой сам по себе). Устанавливает нужные нам зависимости: g++, gcc, libc-dev, make;
  • ca-certificates - pEM-файлы CA сертификатов позволяют приложениям на основе SSL проверять подлинность SSL-соединений. Необходима для установки Docker;
  • gnupg - свободная программа для шифрования информации и создания электронных цифровых подписей. Необходима для установки Docker;
  • lsb-release - позволяет использовать одноименную утилиту для получения информации об используемом дистрибутиве Linux. Необходима для установки Docker.

Этот шаг не обязателен. Просто добавляет удобства и продуктивности дальнейшей работе.

Для начала убедимся, что zsh установлен:

zsh --version

Если все в порядке, то в терминале будет показана установленная версия, например:

zsh 5.8 (x86_64-debian-linux-gnu)

Теперь установим его оболочкой по умолчанию:

chsh -s $(which zsh)

И переподключимся к серверу. После реконнекта на экране появится сообщение с предложением сконфигурировать zsh.

This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~).  This function can help you with a few settings that should
make your use of the shell easier.

You can:

(q)  Quit and do nothing.  The function will be run again next time.

(0)  Exit, creating the file ~/.zshrc containing just a comment.
     That will prevent this function being run again.

(1)  Continue to the main menu.

(2)  Populate your ~/.zshrc with the configuration recommended
     by the system administrator and exit (you will need to edit
     the file by hand, if so desired).

--- Type one of the keys in parentheses ---

Выбираем вариант 0 (создать файл заглушку) и жмем Enter. На следующем шаге этот файл настроек за нас создаст великолепный Oh My Zsh!

Oh My Zsh - восхитительный, управляемый сообществом фреймворк с открытым исходным кодом для управления вашей конфигурацией Zsh. Он поставляется в комплекте с тысячами полезных функций, помощников, плагинов, тем и нескольких вещей, которые заставят вас вскрикнуть… “Oh My ZSH!”3

Установить его можно двумя способами: через wget, или через curl. Выбирайте любой, так как мы имеем в своем арсенале обе утилиты.

sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

или

sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

При успешной установке вы увидите красивую надпись о том, что фрэймворк установлен.

Powerlevel10k - это тема для Zsh. Она популярная, кастомизируемая, быстрая! и имеет много плюшек.

Для установки достаточно клонировать репозиторий в определенную папку:

git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/themes/powerlevel10k

На этом же шаге можно установить два плагина:

  • zsh-syntax-highlighting - удобная подсветка комманд оболочки в терминале;
  • zsh-autosuggestions - предлагает команды при вводе на основе истории.

Выполним поочередно две команды (клонирование репозиториев):

git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-autosuggestions.git $ZSH_CUSTOM/plugins/zsh-autosuggestions

Теперь нужно отредактировать файл настроек zsh, заменив строку с используемой темой. Открываем файл ~/.zshrc в nvim:

nvim ~/.zshrc

Закомментируем дефолтную тему и добавим установленную:

# ZSH_THEME="robbyrussell"
ZSH_THEME="powerlevel10k/powerlevel10k"

Добавим установленные ранее плагины:

# строка 88-89
plugins=(git zsh-syntax-highlighting zsh-autosuggestions)
Первый раз в Vim/NeoVim?
  • h j k l или - навигация
  • i - режим редактирования
  • esc - выход из режима редактирования
  • :wq - выйти с сохранением изменений
  • :23 - перейти к 23 строке
  • ^ и $ - переход в начало и конец строки

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

source ~/.zshrc

Сразу после этого запустится настройка темы в режиме вопрос-ответ, где нужно просто нажимать нужный варианты ответа. Настройку всегда можно запустить заново командой p10k configure, поэтому не бойтесь ошибиться. По окончании настройки внешний вид терминала изменится.

Как удалить Docker
sudo apt remove docker docker-engine docker.io containerd runc

Все нужные зависимости у нас уже установлены, поэтому перейдем к следующему шагу, описанному в официальной документации Docker4:

Добавим официальный GPG key Docker’а:

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

Следующей коммандой установим репозиторий:

echo "deb [arch="$(dpkg --print-architecture)" \
  signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/debian \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Обновим индекс пакетов:

sudo apt update

И, наконец, установим Docker Engine, containerd, и Docker Compose:

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Проверим статус сервиса:

sudo systemctl status docker

В ответ должны получить нечто похожее:

● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2022-12-09 23:45:01 MSK; 31s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 183873 (dockerd)
      Tasks: 7
     Memory: 33.8M
        CPU: 357ms
     CGroup: /system.slice/docker.service
             └─183873 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Добавим нашего юзера в группу docker, чтоб он мог им управлять:

sudo usermod -aG docker ${USER}

Проверим, каким группам принадлежит юзер www:

groups ${USER}

Вывод в терминале должен быть таким: www : www sudo docker. Если так - все получилось успешно. Чтобы ваше членство в группе было активировано - переподключимся к серверу.

Последнее, что нужно сделать - настроить автозапуск Docker при загрузке системы. Сделать это можно при помощи systemd:

systemd — подсистема инициализации и управления службами в Linux.

sudo systemctl enable docker.service
sudo systemctl enable containerd.service

Проверим свободное место на диске

1
df -h

Размер файла зависит от оперативной памяти серверв. Простое правило - создаем swap в два раза больше, чем RAM. В нашем случае RAM 1GB, значит swap file = 2GB.

1
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048

Пояснения:

  • if=/dev/zero: Указывает входной источник данных. В данном случае, /dev/zero предоставляет поток нулевых байт.
  • of=/swapfile: Указывает выходной файл, который будет создан. В данном случае, это имя файла подкачки (swapfile).
  • bs=1M: Указывает размер блока данных для копирования. 1M означает один мегабайт.
  • count=2048: Указывает количество блоков для копирования. Здесь 2048 означает, что будет создан файл размером 2048 блоков по 1 мегабайту, то есть 2048 мегабайта (или 2 гигабайта).

Таким образом, данная команда создаст файл /swapfile размером 2 гигабайта, заполнив его нулевыми байтами. Файл подкачки может быть использован операционной системой для временного хранения данных, когда физическая память (RAM) исчерпана, и он помогает избежать ситуаций нехватки памяти.

В терминал выведется результат:

1
2
3
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 2.97185 s, 723 MB/s

Задаем файлу нужные права:

sudo chmod 600 /swapfile

Укажем ОС, что созданный объект должен использоваться как файл подкачки:

sudo mkswap /swapfile

Вывод в терминал:

Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=2ad8b3d7-f274-47ed-894e-4cb54183fba5

Активируем файл подкачки:

sudo swapon /swapfile

Проверим, все ли идет по плану:

sudo swapon --show

Вывод в терминал:

NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   -2

Все операции, которые мы предприняли выше, временны. Как только сервер будет перезагружен, они отменятся.

Чтобы сделать изменения постоянными, необходимо отредактировать /etc/fstab.

Делаем резервную копию файла перед внесением изменений:

1
sudo cp /etc/fstab /etc/fstab.back

Чтобы внести изменения в файл можно пойти двумя путями:

  1. Использовать команду
1
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
  1. Открыть текстовый редактор и добавить строку вркчную
1
sudo nvim /etc/fstab
1
/swapfile none swap sw 0 0

Сохранить и закрыть: :wq

У файла подкачки существуют параметры, которые сообщают ОС, как часто его нужно использовать. Это называется «свопингом» и может иметь значение в пределах 0 - 100. Если значение ближе к 100 - ядро будет перемещать в раздел подкачки больше информации чтобы освободить память. При значениях ближе к нулю, система будет использовать подкачку только при крайней необходимости.

Выполним команду:

echo 'vm.swappiness=60' | sudo tee -a /etc/sysctl.conf

Или отредактируем /etc/sysctl.conf вручную

1
sudo nvim /etc/sysctl.conf

Добавим в конец строку

1
2
...
vm.swappiness=60

Теперь перезагркзим sysctl файл конфигурации

1
sudo sysctl -p

Если вам не нужен файл подкачки или вам нужно его увеличить - вы можете отключить уже активный файл в системе, используя следующую команду.

1
2
swapoff /swapfile
sudo rm /swapfile

Теперь можно создать новый файл большего размера, используя описанные выше шаги, или отключить навсегда удалить запись из файла /etc/fstab.


Использованы материалы статьи Initial Server Setup with Debian 11