Содержание
Аренда сервера за крипту ⇪
Купил сервер на хостинге hostry.com за 6 баксов в месяц. Этот сервис принимает криптовалюту в качестве платёжного средства, поэтому оплатил с помощью BTC. Hostry сотрудничает с какими-то coinpayments, которые собирают какую-то комиссию. С перевода $10 получился $1 комиссии, надеюсь, что это не 10%, а фиксированная или какая-то логарифмическая шкала, а иначе — ужас-ужас.
Оплачивал с помощью кошелька Electrum, относительно удобная штука. Есть приложения для всех платформ.
Настройка сервера и Nginx ⇪
После покупки сервера администратору чаще всего предоставляется доступ к нему по протоколу SSH и пароль от root. Доступ к серверу по паролю обыкновенно считается небезопасным, поэтому предпочтительнее настроить доступ по криптографическому ключу.
Чтобы создать SSH-ключ на машине с Linux или MacOS следует воспользоваться
встроенной утилитой ssh-keygen
. Всегда полезно читать
документацию (man ssh-keygen
), но в целом генерация ключа сводится
к команде ssh-keygen -t rsa -b 4096 -C "ваш комментарий"
. Здесь
флаг -t
указывает тип шифрующего алгоритма, а флаг -b
определяет длину ключа.
Говаривают, что на Windows ключ можно сгенерировать с помощью утилиты PuTTY, той самой, которая используется для подключения к удалённому серверу.
Nginx — это самый популярный на данный момент веб-сервер в Интернете. Самая базовая его установка на сервер осуществляется буквально в одну команду:
sudo apt install nginx
Настройка сервера Nginx после нескольких попыток сводится к редактированию
файлов в директории /etc/nginx/sites-available/
.
Создадим файлик в этой директории, назовём его my-server
. В этом файлике нужно
будет прописать следующий текст:
server {
server_name www.project.ru;
# root /var/www/my-project;
# index index.html;
location / {
include proxy_params;
proxy_pass http://unix:/tmp/project.sock;
# try_files $uri $uri/ =404;
}
Давайте разбираться, что здесь что. Файлы конфигурации Nginx состоят из директив — прямых команд серверу и контекстов — групп команд из директив, ограниченных фигурными скобками.
У меня тут задан один контекст server
и в нём прописана директива server_name
project.ru
. В этой директиве нужно будет указать название вашего сервера и его
доменное имя.
Следом идут две закомментированные директивы, которые нужны в случае, когда
веб-сервер просто поставляет файлики из какой-то директории пользователю по
запросу. Директива root
указывает путь к проекту, а директива index
—
основную веб-страницу. Поскольку мой сайт работает как веб-приложение на Flask
(о чём далее), то мне эти директивы не нужны.
Контекст location /
говорит что делать, когда пользователь обращается по
корневому адресу нашего домена. В закоменнтированной строке вновь указана
директива в случае простого веб-сайта из веб-страниц. В моём случае указаны
две директивы. Директива include
подключает внешние директивы, а proxy_pass
указывает куда передать запрос, поступивший на /
. В данном случае он уходит
на специальный файлик на сервере.
После того, как первоначальная конфигурация сервера закончена, необходимо
создать символическую ссылку на эту конфигурацию в директории sites-enabled
:
ln -s /etc/nginx/sites-available/<your-config> /etc/nginx/sites-enabled/<your-config>
Не забудем удалить конфигурацию
default
, которая находится в sites-enabled
по умолчанию. После изменения и применения настроек нужно обязательно перезапускать
сервис Nginx:
sudo nginx -s reload
Покупка доменного имени и настройка DNS ⇪
Доменное имя я покупал на reg.ru. Получилось дёшево и сердито, суммарно вышло в 199 рублей на год. Там нужно оставить свои персональные данные и скан задницы выслать, но, судя по всему, везде так. В противном случае домены уводятся, и доказать, что это твой домен, не получится.
Дальше нужно было зафиксировать, что теперь имя brink-liaison.ru
указывает на мой
сервер. Для этого в сервисе reg.ru после покупки домена нужно было указать
ресурсные записи, а именно www -> <ip-адрес сервера>
. Затем можно подождать 24
часа, пока ресурсные записи во всей системе DNS изменятся и начнут указывать на
нужный сервер, а можно походить по ссылочкам
отсюда и потыкать везде "flush".
В процессе выяснилось, что, оказывается, поисковики считают www.domain
и domain
разными
доменами. Поэтому, чтобы было получше для SEO (я пока не разобрался),
рекомендуют настроить перенаправление от чего-то одного к другому. Немного
почитав мануалы, мне показалось, что правильнее будет настроить перенаправление
от brink-liaison.ru
к www.brink-liaison.ru
. А для этого нужно будет немного
пошаманить в настройках Nginx (см.
выше). А именно нужно будет в том
самом файле конфигурации /etc/nginx/sites-available/my-server
добавить
следующий контекст:
server {
server_name project.ru
return 301 $scheme://www.project.ru$request_uri;
}
Здесь нужно обратить внимание на то, что project.ru
теперь без поддомена www.
и,
по существу, этот контекст отвечает за перенаправления всех запросов, попавших на
project.ru
в аналогичный URL на домене www.project.ru
Настройка HTTPS ⇪
Оказалось, что сделать это совсем несложно. Идём на Let's Encrypt, скроллим до "With Shell Access", переходим по ссылке на Certbot, выбираем там свою систему (моя — Nginx на Ubuntu 20.04) и далее следуем инструкциям.
Certbot сам всё сделает, сформирует запрос, получит сертификат, сам его пропишет в нужные контексты в конфиге Nginx. Одно удовольствие.
Python и Flask ⇪
Сайт сделан на Flask с использованием дополнительной библиотеки Flask-FlatPages. Этот сайт представляет собой набор Markdown-файлов, которые рендерятся в готовые HTML-страницы. Оформление сделано с помощью библиотеки Flask-Bootstrap с минимальными изменениями в CSS.
Для текстового блога пока подходит. Дополнительно, естественно, можно будет навертеть любую желаемую функциональность, хоть приложения в Dash
GitHub и cron ⇪
У меня есть локальные репозитории, где я редактирую Markdown-файлики и потом
пушу их в удалённый приватный репозиторий на GitHub. На сервере же настроена
кронджоба, которая каждый час делает git pull
с этого удалённого репозитория и
перезапускает WSGI-сервер.
Чтобы настроить кронджобу используется утилита crontab
. Пользуясь сайтом
crontab.guru, можно подобрать нужную периодичность для
обновления. Команда в кронджобе в конечном итоге выглядит так:
30 * * * * /path/to/my/shell/script.sh
А скрипт, который выполняется каждый час на тридцатой минуте выглядит вот так:
#!/bin/bash
cd /path/to/project/
git pull
systemctl restart project.service