Должен быть установлен на обеих машинах: на локальной и на сервере.
Порядок аргументов: сначала источник (что копируем), потом назначение (куда копируем).
Перед каждым прогоном — пробный запуск с -n. rsync может натворить много бед,
если что-то указать неверно.
Завершающий слеш "/" у источника
Без слеша копируется сам каталог, со слешем — только его содержимое:
~]$ rsync -a /path/dir user@host:/dest/ → /dest/dir/... ~]$ rsync -a /path/dir/ user@host:/dest/ → /dest/...
Слеш в конце назначения ни на что не влияет. Путь назначения без начального /
(user@host:html/) считается от домашнего каталога.
Деплой сайта
У обычного пользователя нет прав записи в /var/www/html/, поэтому деплой в два шага:
через домашний каталог сервера.
Локальная машина → домашний каталог сервера: ~]$ rsync -nva --delete -e "ssh -p 2222" html/ user@host:html/ — проверка ~]$ rsync -a --delete -e "ssh -p 2222" html/ user@host:html/ — выполнение
На сервере → каталог веб-сервера: ~]$ sudo rsync -nva --delete ~/html/ /var/www/html/ — проверка ~]$ sudo rsync -a --delete ~/html/ /var/www/html/ — выполнение
Другой владелец файлов — добавить --chown=apache:apache (на Debian/Ubuntu www-data).
Параметры
-a — режим архива: рекурсия, ссылки, права, время, группа, владелец. Владелец и группа сохраняются, только если приёмник работает от root.
-n — пробный прогон, -v — подробный вывод, -i — что именно меняется в каждом файле. В конце вывода должно быть (DRY RUN).
-e "ssh -p 2222" — нестандартный порт SSH (для scp порт задаётся заглавной -P).
--exclude 'assets/css' — исключить из переноса. Путь считается от корня источника и совпадает на любой глубине;
'/assets/css' — только в корне. Исключённое не удаляется при --delete.
--delete — удалить в назначении всё, чего нет в источнике.
Самый опасный параметр: проверяйте путь назначения и строки deleting в выводе -nv.
--mkpath — создать всю цепочку каталогов назначения. Без него создаётся только последний уровень.
scp — копирует файлы между хостами по SSH. Работает подобно команде cp:
сначала источник, потом назначение. Удалённый путь записывается как user@host:путь.
Относительный путь считается от домашнего каталога, а user@host: — это сам домашний каталог.
Примеры:
Файл на сервер — ~]$ scp file.txt user@host:/remote/dir/
Файл с сервера в текущий каталог — ~]$ scp user@host:/remote/dir/file.txt .
Каталог с сервера через другой порт — ~]$ scp -r -P 2222 user@host:/remote/dir .
Внимание:
порт у scp задаётся заглавной -P, а у ssh и в rsync -e "ssh -p …" — строчной;
для каталогов нужен -r;
существующие файлы в назначении перезаписываются без вопросов, пробного режима нет;
для больших и повторных копирований лучше rsync. Разработчики OpenSSH в релизе
8.0 (2019) назвали протокол scp устаревшим
и рекомендовали sftp и rsync. Начиная с 9.0 (2022)
команда scp по умолчанию работает через SFTP; прежний протокол включается флагом -O.
Для AlmaLinux 8 и Debian. Команды для Debian собраны по документации и пока не проверены.
Порядок: DNS → пользователь → SSH (ключи → конфиг → SELinux → firewall → только потом применить) →
веб-сервер → сертификат.
Новый порт SSH применяем после открытия его в firewall, иначе потеряем доступ к серверу.
Обозначения: your_domain.com, your_username, host, порт SSH — 2222.
1. DNS
A-запись с IPv4 сервера для your_domain.com и www.your_domain.com, для IPv6 — AAAA.
Проверка — ~]$ dig +short your_domain.com
Важно: DNS должен работать до получения сертификата.
2. Пользователь с sudo
Под root в консоли хостера (VNC):
AlmaLinux 8
~]# useradd your_username
~]# passwd your_username
~]# usermod -aG wheel your_username
Debian
~]# apt install sudo — если sudo не установлен
~]# adduser your_username — создаёт домашний каталог и спрашивает пароль
~]# usermod -aG sudo your_username
Проверка: ~]# su - your_username, затем ~]$ sudo whoami → root. Дальше работаем по SSH под новым пользователем.
~]$ sudo sshd -T | grep -Ei '^(port|passwordauthentication|permitrootlogin) ' — что sshd применит на самом деле.
На Debian в начале sshd_config подключается sshd_config.d/*.conf, и там действует
первое найденное значение директивы. Если sshd -T показывает не то, что вы задали, ищите в этом каталоге.
⚠️ Пока не применяем: сначала 3.3 и 3.4.
3.3 SELinux: разрешить новый порт (только AlmaLinux)
~]$ sudo ufw allow 22/tcp — пока SSH на 22, иначе включение ufw оборвёт сессию
~]$ sudo ufw allow 2222/tcp
~]$ sudo ufw enable, затем ~]$ sudo ufw status
Сервер в облаке — откройте порт ещё и в сетевом экране (security group) провайдера.
3.5 Применить и проверить
AlmaLinux — ~]$ sudo systemctl reload sshd
Debian — ~]$ sudo systemctl reload ssh
Если systemctl is-active ssh.socket показывает active (Ubuntu 22.10+, возможны образы Debian),
порт задаётся сокетом, и Port из sshd_config игнорируется:
~]$ sudo systemctl daemon-reload, затем ~]$ sudo systemctl restart ssh.socket
~]$ sudo ss -tlnp | grep 2222 — порт слушается.
Не закрывая старую сессию, в новом окне терминала:
~]$ ssh -p 2222 your_username@host — пускает без пароля
Debian: файл в /etc/apache2/sites-available/your_domain.com.conf, в путях логов ${APACHE_LOG_DIR}/. Затем
~]$ sudo a2ensite your_domain.com.conf, ~]$ sudo a2dissite 000-default.conf,
~]$ sudo apache2ctl configtest, ~]$ sudo systemctl reload apache2
Nginx: файл в /etc/nginx/conf.d/ (Alma) или sites-available/ + ссылка в sites-enabled/ (Debian).
Проверка — ~]$ sudo nginx -t. Пример конфигурации — в посте.
Тест: ~]$ echo '<h1>It works</h1>' | sudo tee /var/www/html/index.html
AlmaLinux: если после mv файлов в /var/www/html сайт отвечает 403 — ~]$ sudo restorecon -Rv /var/www/html
Пакет mod_ssl создаёт /etc/httpd/conf.d/ssl.conf с хостом на 443 и самоподписанным сертификатом
localhost.crt. Он может мешать certbot, поэтому убираем с копией: