Go to file
2022-11-12 22:34:59 +03:00
static replace favicon with svg for yandex 2021-11-13 08:09:35 +03:00
templates change telegram 2022-08-09 14:33:00 +03:00
__init__.py added host='0.0.0.0' to init 2022-11-10 22:12:48 +03:00
.gitignore add requirements 2021-10-23 18:33:40 +03:00
product.db change price on FN 2022-06-24 07:52:25 +03:00
README.org almost finish redme 2022-11-12 22:34:59 +03:00
requirements.txt add data base, change header and footer 2021-11-04 22:37:24 +03:00

Install server from scratch (Rocky Linux)

Установка сервера с нуля (gunicorn + nginx + flask) и настройка WireGuard

Данная инструкция предназначена для перенастройки сервера с сайтом и VPN.

Создание и первоначальная настройка сервера

Создаем сервер. Заходим через SSH -> выходим -> копируем ключи на сервер:

ssh <login>@<ip-address server>
exit
ssh-copy-id <login>@<ip-address server>

Теперь можем заходить по ключу (~/.ssh).

На сервере настраиваем SSH (запрет авторизации по паролю, запрет root по ssh):

sudo vim /etc/ssh/sshd_config

Добавляем или изменяем строки:

AllowUsers <login>
PermitRootLogin no
PasswordAuthentication no

Перезапускаем ssh:

sudo systemctl restart sshd

Установка необходимых пакетов

Обновляем систему:

sudo dnf update
sudo dnf upgrade --refresh

Включаем CRB репозиторий:

sudo dnf config-manager --set-enabled crb

Далее устанавливаем EPEL. Как я понимаю - это репозиторий Fedora:

sudo dnf install \
    https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm \
    https://dl.fedoraproject.org/pub/epel/epel-next-release-latest-9.noarch.rpm

Ставим необходимые пакеты:

sudo dnf install zsh htop nginx git wget vim python3-pip python3-devel gcc -y
sudo pip3 install virtualenv

Устанавливаем [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh):

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

Добавляем в ~/.zshrc:

#  History
# хранить историю в указанном файле
export HISTFILE=~/.zsh_history
# максимальное число команд, хранимых в сеансе
export HISTSIZE=1000
export SAVEHIST=$HISTSIZE
# включить историю команд
setopt APPEND_HISTORY
# убрать повторяющиеся команды, пустые строки и пр.
setopt HIST_IGNORE_ALL_DUPS
setopt HIST_IGNORE_SPACE
setopt HIST_REDUCE_BLANKS

# alias ls='exa'

Начинаем работу с проектом.

Создаем пользователя klintorg-www:

sudo mkdir /home/klintorg-www
sudo groupadd klintorg-www
sudo adduser -G nginx -g klintorg-www -d /home/klintorg-www klintorg-www --system --shell=/bin/false

Временно выдаем права на папку klintorg-www и переходим в нее:

sudo chmod -R 777 /home/klintorg-www
cd /home/klintorg-www

Клонируем проект:

git clone https://github.com/Noretsa/klintorg.git

git запросит логин и пароль. Пароль необходимо создать, github -> settings -> Developer settings -> Personal access token -> Fine grained tokens. Дальше надо дать права токену, ну разберешься…

Переходим в папку проекта:

cd klintorg

Создаем файл wsgi.py:

vim wsgi.py

В нем делаем так:

from __init__ import app

if __name__ == "__main__":
    app.run()

Создаем папку окружения и ставим зависимости проекта:

virtualenv .klintorg
source .klintorg/bin/activate
pip install -r requirements.txt
pip install gunicorn
deactivate

Разрешаем в firewall порт 5000 и 8000 для тестов:

sudo firewall-cmd --add-port=5000/tcp --permanent
sudo firewall-cmd --add-port=8000/tcp --permanent
sudo firewall-cmd --reload

Чтобы посмотреть лист открытых портов:

sudo firewall-cmd --list-all

Отключаем SELinux:

sudo vim /etc/selinux/config
SELINUX=disabled #enforcing

Перезагружаемся:

sudo reboot now

Теперь для klintorg-www назначаем права:

sudo chown -R klintorg-www:nginx /home/klintorg-www
sudo chmod -R 755 /home/klintorg-www

Тестим проект

Можем протестировать проект:

cd /home/klintorg-www/klintorg
source .klintorg/bin/activate
python __init__.py

С локального компьютера открываем браузер на странице http://<ip-address server>:5000.

Если все работает - начинаем тестировать gunicorn:

gunicorn --bind 0.0.0.0:8000 wsgi:app

С локального компьютера открываем браузер на странице http://<ip-address server>:8000.

Если все работет гасим gunicorn (ctrl+c) и деактивируем окружение python:

deactivate

Настраиваем Flask Application

Мы протестировали что наш gunicorn работает с нашим приложением Flask. Теперь необходимо сделать так, чтобы он загружался при старте системы. Чтобы этого добиться, мы создадим systemd service и socket file.

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

Начнем с создания systemd socket файла:

sudo vim /etc/systemd/system/klintorg.socket

Внутри создаем следующие секции:

[Unit]
Description=klintorg socket

[Socket]
ListenStream=/run/klintorg.sock

[Install]
WantedBy=sockets.target

Далее создаем systemd service файл. Имя этого файла должно совпадать с именем socket файла:

sudo vim /etc/systemd/system/klintorg.service

В этом файле будет так:

[Unit]
Description=klintorg daemon
Requires=klintorg.socket
After=network.target

[Service]
User=nginx
Group=nginx
WorkingDirectory=/home/klintorg-www/klintorg
ExecStart=/home/klintorg-www/klintorg/.klintorg/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/klintorg.sock -m 007\
          wsgi:app

[Install]
WantedBy=multi-user.target

Перезапускаем демоны:

sudo systemctl daemon-reload

Теперь запускаем Gunicorn socket, когда он запустится, он стартанет наш gunicorn service:

sudo systemctl start klintorg.socket
sudo systemctl enable klintorg.socket

Настраиваем NGINX

Создаем файл конфигурации:

sudo vim /etc/nginx/conf.d/klintorg.conf

В файл добавляем следующие строки:

server {
    listen 80;
    server_name server_domain_or_IP;

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://unix:/run/klintorg.sock;
    }
}

Теперь разрешаем Nginx доступ к соккету gunicorn:

sudo semanage permissive -a httpd_t

Так же разрешаем Nginx доступ к папке проекта (???????):

sudo chgrp -R nginx /usr/share/nginx/html/klintorg-www/klintorg/

Проверяем синтаксис:

sudo nginx -t

Запускаем и добавляем в автостарт nginx:

sudo systemctl start nginx
sudo systemctl enable nginx

Открываем 80 и 443 порты на firewall:

sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --add-port=443/tcp --permanent
sudo firewall-cmd --reload

Настраиваем сертификат Let's Encrypt

Ставим certbot:

sudo dnf install certbot python3-certbot-nginx

Ставим snapd для автопродления сертификата:

sudo dnf install snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
exit

Необходимо перезайти в систему!

Запускаем:

sudo certbot --nginx

Проверяем обновляется ли:

sudo certbot renew --dry-run

Проверяем что встало автообновление:

sudo systemctl list-timers -all

Wireguard

Начальная установка:

sudo dnf install elrepo-release epel-release
sudo dnf install wireguard-tools

Генерируем ключи:

wg genkey | sudo tee /etc/wireguard/private.key
sudo chmod go= /etc/wireguard/private.key
sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

Создаем файл конфигурации:

sudo vim /etc/wireguard/wg0.conf
[Interface]
Address = 10.8.0.1/24
# SaveConfig = true                                                                                              
ListenPort = 51820
PrivateKey = KM12oqlqAxKPyHXuOhL1XXcCeaGzYwAZ2pyYmHM8u2s=

PostUp = firewall-cmd --zone=public --add-masquerade; firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i \
wg0 -o ens3 -j ACCEPT; firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o ens3 -j MASQUERADE; firewall-c\
md --add-port=51820/udp

PostDown = firewall-cmd --zone=public --remove-masquerade; firewall-cmd --direct --remove-rule ipv4 filter FORWA\
RD 0 -i wg0 -o ens3 -j ACCEPT; firewall-cmd --direct --remove-rule ipv4 nat POSTROUTING 0 -o ens3 -j MASQUERADE;\
 firewall-cmd --remove-port=51820/udp

[Peer]
PublicKey = ffLtSBKib0Wi7KnaEZXp7ZSWV+dswaPjPQHDYO1iiSQ=
AllowedIPs = 10.8.0.2/32
sudo vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sudo sysctl -p

Настраиваем Firewall (сначала делаем без этого, выше ссылка на инструкцию):

firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o enp0s3 -j MASQUERADE # это в первую очередь и проверяем, потом уже остальные
sudo firewall-cmd --zone=public --add-port=51830/udp --permanent
sudo firewall-cmd --zone=internal --add-interface=wg0 --permanent
sudo firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=10.8.0.0/24 masquerade' --permanent
# sudo firewall-cmd --zone=public --add-rich-rule='rule family=ipv6 source address=fd0d:86fa:c3bc::/64 masquerade' --permanent
sudo firewall-cmd --reload

Включаем Wireguard:

sudo systemctl enable wg-quick@wg0.service
sudo systemctl start wg-quick@wg0.service

Настройка клиента

Создаем папку в домашней директории:

mkdir wg_norets

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

wg genkey | tee /home/norets/wg_norets/norets_privatekey | wg pubkey | tee /home/norets/wg_norets/norets_publickey

Добавляем в конфиг WG:

sudo vim /etc/wireguard/wg0.conf
[Peer]
PublicKey = ll3VDt3gl81S54Lg9fX4wo2TylqfQLYZEB/63dxPgRg= # <norets_publickey>
AllowedIPs = 10.8.0.2/32

Перезапускаем сервис wireguard:

sudo systemctl restart wg-quick@wg0
sudo systemctl status wg-quick@wg0

На клиенте создаем файл:

[Interface]
PrivateKey = 2JgSg050VqNNgd+9rEt/NkhmuGTdzJNnzhNsDvIvSH8=  # <CLIENT-PRIVATE-KEY>
Address = 10.8.0.2/32
DNS = 8.8.8.8

[Peer]
PublicKey = cW4mpBGG3CBcW01I2HTSXpyxzId72Lh/EAF5Q7iS3RQ= # <SERVER-PUBKEY>
Endpoint = 88.210.3.57:51830
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 20