From be63d4707da5d4fa7da9afcdf7b25c5431b3c481 Mon Sep 17 00:00:00 2001 From: kozhilya Date: Fri, 24 Mar 2023 10:32:38 +0000 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB(?= =?UTF-8?q?=D0=B0)=20=D0=BD=D0=B0=20'README.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 260 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 259 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 40978cd..d832723 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,260 @@ -# omgauto-public-description +# Подключение к SSH +Для работы с серверами используется терминал. Текстовый интерфейс, который он обеспечивает, может быть менее наглядным, +чем графический, однако он обеспечивает гораздо более гибкий доступ к настройкам и менее требователен к ресурсам. + +Откройте приложение **Терминал** (Finder - Программы - Утилиты). Должно открыться примерно такое окно: + +![Терминал](https://blog.allo.ua/wp-content/uploads/Kak-ispolzovat-terminal-na-Mac-stroka-priglasheniya-vvoda.jpg) + +Здесь и далее, все команды в терминале будут обозначены символом `$` в начале строки, например: +```shell +~$ ls +/srv$ pwd +$ echo "Hello, world!" +``` +Здесь: +* `~` и `/srv` - текущий каталог (`~` - домашний каталог). Подразумевается, что запускать команду надо из этого +каталога. Если эта часть не указана, то это команду можно выполнять в любом каталоге. +* `$` индикатор начала команды +* `ls` и `pwd` - собственно команды который надо ввести, что эта команда терминалу; при этом в сам терминал его вводить _не нужно_. Для +запуска команды достаточно будет просто нажать `Enter`. + +Пример запуска первой команды из примера выше: + +![ls](https://www.macworld.com/wp-content/uploads/2023/01/terminal-macos-big-sur-1.jpg?quality=50&strip=all) + +Если же каталог в запущенном терминале не совпадает с каталогом, указанном до `$`, то необходимо изменить каталог, +используя команду `cd <целевой каталог>`, например: +```shell +$ cd /srv +``` + +К сожалению, более постоянные картинки-примеры я привести не смогу ввиду отсутствия устройств от Apple... + +## 1 Добавление синонима сервера +Добавьте в файл `hosts` следующую строку: +``` +45.9.42.246 omgauto.ssh +``` +В Mac OS этот файл располагается в `/private/etc/hosts`, редактировать его необходимо от имени администратора. +[Подробнее об изменении этого файла](https://help.reg.ru/support/dns-servery-i-nastroyka-zony/rabota-s-dns-serverami/fayl-hosts-na-macos). +Таким образом, создаётся синоним для IP адреса сервера (`45.9.42.246`), так что дальнейшие команды будут чуть более понятны. + +## 2 Ключ шифрования +Откройте Терминал и введите следующую команду: +```shell +$ ssh-keygen -t ed25519 +``` +И нажмите `Enter`. Скрипт после этого, скорее всего, попросит ввести дополнительные данные: место сохранения и +_passphrase_. Оставьте их значениями по умолчанию (пусть это и [не рекомендовано](https://serverfault.com/questions/142959/is-it-okay-to-use-a-ssh-key-with-an-empty-passphrase)), +нажав на `Enter` ещё несколько раз. После этого ключ будет создан, а на консоль будет выведено примерно следующее сообщение: +``` +Your identification has been saved in /Users/myname/.ssh/id_ed25519. +Your public key has been saved in /Users/myname/.ssh/id_ed25519.pub. +The key fingerprint is: +ae:89:72:0b:85:da:5a:f4:7c:1f:c2:43:fd:c6:44:38 myname@mymac.local + +The key's randomart image is: + ++--[ RSA 2048]----+ +|+.o.             | +|ooE              | +|oo               | +|o.+..            | +|.+.+..  S .      | +|....+  o +       | +|  .o ....        | +|  .  .. .        | +|    ....         | ++-----------------+ +``` +Эта команда создала [ключи шифрования](https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%81_%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D1%8B%D0%BC_%D0%BA%D0%BB%D1%8E%D1%87%D0%BE%D0%BC). +Этот ключ состоит из 2 частей: публичного (`/Users/myname/.ssh/id_ed25519.pub`) и приватного (`/Users/myname/.ssh/id_ed25519`). +Эти ключи будут обеспечивать шифрование всего потока данных между вашим компьютером и сервером; а также позволит +подключиться к серверу без дополнительного ввода пароля. + +**Никогда и никому не сообщайте приватный ключ**!!! Он должен хранится только на вашем компьютере. Файл с приватным ключом +начинается с `-----BEGIN RSA PRIVATE KEY-----`. + +Передавать можно и нужно только публичный ключ. Что бы увидеть публичный ключ, введите +```shell +$ cat ~/.ssh/id_ed25519.pub +``` +После нажатия на `Enter`, в консоль выведется примерно такое содержимое (конкретные символы будут, разумеется, другими): +``` +ssh-ed25519 AAA...qUx user@localhost.local +``` +Скопируйте эту строку, она понадобится позже. + +## 3 Первое подключение к серверу + +На сервере создано несколько аккаунтов: +* `root` - это главный администраторский аккаунт сервера. Он имеет максимальные права... И поэтому использовать его как + основной аккаунт крайне не рекомендуется. Его пароль я вышлю отдельно. +* `omgauto` - это дополнительный пользовательский аккаунт, который я создал специально для вас. У него стоит временный + пароль `321321`, который нужно будет изменить при первой возможности (см. ниже). + +Я настоятельно рекомендую использовать `root` только в случае крайней необходимости. Из-под `omgauto` тоже можно будет +выполнить команды от имени администратора (`sudo` - Super-User DO), однако это потребует ввода пароля, что бы потенциально +небезопасные команды не запускались "случайно". + +Для подключения к серверу, в терминале нужно ввести: +```shell +$ ssh omgauto@omgauto.ssh +``` +Здесь: +* `ssh` - команда подключения к серверу по протоколу SSH +* `omgauto` - имя пользователя +* `@` (читается как `at`) - разделитель между именем пользователя и сервером (`user@server` = `user AT server`) +* `omgauto.ssh` - алиас IP сервера; здесь можно использовать просто IP адрес (`omgauto@45.9.42.246`), однако мне кажется +это менее очевидным способом. + +После ввода команды, сервер в первый раз запросит пароль. Не пугайтесь, если после нажатия на клавиши на экране ничего не +будет меняться: так и задумано. Просто введите пароль (`321321`) и нажмите `Enter`. Если всё получилось, должно выйти что-то +типа такого: + +![ssh](https://i.imgur.com/FBLor5U.png) + +_Заметка_: `ssh` работает одинаково на всех ОС, так что тот факт, что я использую Windows, ни на что не влияет в данном примере. +А после установки соединения с сервером различия и вовсе исчезают, так как теперь мы работаем в терминале сервера. + +Сразу же после того, как подключение произошло, измените пароль. Для этого используйте команду +```shell +$ passwd +``` +Эта команда попросит ввести сначала текущий пароль (`321321`), а затем дважды новый. Если пароль изменился успешно, +появится сообщение `passwd: password updated successfully`. + +Как было сказано выше, подключаться к серверу можно и без пароля. Для этого необходимо ввести следующую команду: +```shell +$ nano ~/.ssh/authorized_keys +``` +Откроется консольный редактор `nano`. Вставьте в него публичный ключ, который мы создали ранее: +![nano ~/.ssh/authorized_keys](https://i.imgur.com/1DeNpTD.png) +Для сохранения и выхода нажмите сначала `F2` (появится запрос сохранения), затем `Y` (подтверждение сохранения), затем +`Enter` (подтверждение стандартного места сохранения). + +Для проверки, что всё сохранилось, можно ввести +```shell +$ cat ~/.ssh/authorized_keys +``` +В консоли должен появиться введённый вами ключ. + +Теперь, при следующем подключении, сервер не будет запрашивать пароль. Что бы это проверить, отключитесь от сервера, +завершив SSH-сессию: +```shell +$ exit +``` +а затем вновь подключитесь, используя +```shell +$ ssh omgauto@omgauto.ssh +``` +Если сервер снова запроси пароль, то что-то произошло с сохранением публичного ключа. +Но, скорее всего, в терминале появится вопрос, уточняющий, продолжать ли подключение к неизвестному (для системы) серверу: +![unknown_host](https://i.imgur.com/GxL05Dx.png) +Введите `yes` на запрос и нажмите `Enter`. Публичный ключ сервера теперь будет сохранён в системе, и следующее (третье) +подключение к серверу произойдёт без дополнительных вопросов. + +## 4 Работа с сервером + +Базовые команды: +* `ls` - Показать содержимое каталога (список названий файлов); +* `ll` - Показать подробное содержимое каталога (это не стандартная команда, а сокращение); +* `cd` - Сменить каталог (перейти в другой); +* `mkdir` - Создать новую папку (каталог); +* `touch` - Создать новый файл; +* `rm` - Удалить файл; +* `cat` - Показать содержимое файла; +* `pwd` - Показать текущий каталог (полный путь к этому каталогу); +* `cp` - Копировать файл/папку; +* `mv` - Переместить файл/папку; +* `grep` - Поиск конкретной фразы в файле; +* `find` - Поиск файлов и папок; +* `vi` и `nano` - Текстовые редакторы; +* `history` - Показать 50 последних использованных команд; +* `clear` - Очистить окно терминала. + +Что бы узнать подробнее о команде, используйте руководство (`man` - **man**ual): +```shell +$ man <команда> +``` +Так, например +```shell +$ man ls +``` +выдаст такое содержимое: +![man ls](https://i.imgur.com/oVjIyVx.png) +Используйте стрелки вверх и вниз для построчной прокрутки содержимого, кнопки `PageUp` и `PageDown` для более быстрой +прокрутки и `q` для выхода из руководства. + +## 5 Критические моменты: HTTPS + +Для обеспечения работы HTTPS я использую бесплатные сертификаты от [Let’s Encrypt](https://letsencrypt.org). Для +автоматизации используется инструмент `certbot`. И на вашем сервере я настроил автоматическое обновление +SSL-сертификата, используя этот инструмент. + +Что бы проверить, что это обновление всё ещё запускается на фоне, достаточно запустить команду: +```shell +$ systemctl list-timers +``` +и найти элемент с названием `snap.certbot.renew.time`: +![snap.certbot.renew.time](https://i.imgur.com/bQnfmCR.png) +Если в столбце `PASSED` указано значение меньше суток, то всё в порядке. + +## 6 О Node и библиотеках + +Ещё одна причина, из-за которой работа генератора PDF прерывалась на моём сервере, — это обновление Node.JS. Это +набор утилит, который я использовал для эмуляции Chrome и последующей "печати" PDF оттуда. Это обновление каким-то +образом сделало новую версию Node несовместимым с внутренней версией утилиты `npm`, которая используется для +обновления пользовательских библиотек и запуска скриптов. Когда вы сообщили о проблеме, я быстро её починил, просто +переустановив Node... + +Суть в том, что так как на вашем сервере частые обновления не нужны (один из главных принципов системного +администрирования: "Работает - не трогай!"), ломаться оно не будет. Так же, как не ломалось долгое время на хостинге, +пока они не отключили на хостингах критическую библиотеку, которая не нужна для обычных сайтов, но критическая для +Chrome. + +Проверить версию этих библиотек можно используя команды: +```shell +$ node -v +$ npm -v +``` +![node/npm versions](https://i.imgur.com/yS6AeQj.png) + +Таблицу совместимости версий я не найду, потому что её не существует, но обновлять их всегда надо вместе. + +## 7 Проверка ошибок работы скриптов + +Что бы проверить, что всё работает и ничто нигде не застряло, можно посмотреть несколько место. + +Для всех дальнейших проверок, потребуется перейти в папку, где находятся файлы проекта: +```shell +$ cd /srv/ampodbor.ru +/srv/ampodbor.ru$ ll +``` +Вторая команда (`ll`) отобразит список файлов, что бы можно было проверить, что всё на месте: + +![список файлов](https://i.imgur.com/SelfZvy.png) + +### 7.1 Проверка заданий конвертации +```shell +/srv/ampodbor.ru$ ll tasks +``` +В этой папке не должно быть файлов, то есть вывод выглядит так: +![пустая папка tasks](https://i.imgur.com/DNLCiDs.png) + +Если же отображается файл с названием типа `task-1234.json`, то есть необработанное задание. Это может произойти по 2 +причинам: +1. Задание просто не успело обработаться, так как запуск этих заданий происходит каждую минуту. Подождите минуту, и +запустите команду ещё раз. Файл должен удалиться автоматически. +2. Если же файл не удалился, то, скорее всего, его обработка закончилась ошибкой. + +### 7.2 Проверка лога конвертации +```shell +/srv/ampodbor.ru$ tail cron.log +``` + +Если отображается что-то такое: +![Ошибка](https://i.imgur.com/Frwu95G.png) +То что-то сломалось. Зовите меня, будут разбираться :) \ No newline at end of file