Compare commits

..

17 Commits

Author SHA1 Message Date
08a4112420 Заготовка для статьи про кастомизацию gitea 2025-01-26 23:44:04 +03:00
a420980165 Лого
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-01-25 22:50:16 +03:00
c4ce5155fe Дополнения про Fail2Ban
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-01-25 18:52:11 +03:00
e34afe876c Дополнительные команды
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-01-25 15:18:11 +03:00
b24d95ac83 Настройка Fail2Ban 2025-01-25 14:50:10 +03:00
0891a4dcc1 Пометки про ssh 2025-01-25 13:28:36 +03:00
c8d7f83fcc Пометка про перезагрузку sshd
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 1s
2025-01-24 12:29:02 +03:00
abd5f2c97a Пометка про перезагрузку 2025-01-24 12:20:31 +03:00
868dec5ab3 Правки
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 1s
2025-01-24 12:11:37 +03:00
4ef1bedad7 Настройка фаерволла c UFW 2025-01-24 11:47:40 +03:00
0f7e022a5f Настройка сервера
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-01-23 22:21:16 +03:00
25cc09b930 index pages for sections enabled 2025-01-23 14:52:50 +03:00
7f0d996c00 заготовка для nginx переезжает в servers 2025-01-23 14:27:40 +03:00
69653d9883 Заготовка заметки по сервакам 2025-01-23 14:27:09 +03:00
49fc40b1f7 Заменил заголовок 2025-01-23 14:17:08 +03:00
534f950565 Nginx. SSL-сертификаты 2025-01-22 12:16:50 +03:00
7f7bdfa749 Перенос строк в блоках кода 2025-01-22 12:16:28 +03:00
7 changed files with 443 additions and 4 deletions

28
docs/assets/logo.svg Normal file
View File

@@ -0,0 +1,28 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 175.000000 198.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,198.000000) scale(0.100000,-0.100000)"
fill="#ffffff" stroke="none">
<path d="M202 1689 l-92 -231 250 -620 c137 -342 262 -639 277 -661 31 -45 98
-92 153 -107 47 -13 155 -13 205 1 58 16 123 65 155 116 32 49 100 214 100
240 0 28 -153 434 -160 426 -4 -4 -42 -102 -85 -218 -42 -115 -86 -219 -96
-230 -19 -19 -19 -19 -38 0 -10 11 -40 78 -66 150 -26 72 -89 243 -140 380
-51 138 -152 412 -225 610 -73 198 -135 363 -139 367 -3 4 -48 -97 -99 -223z"/>
<path d="M783 1906 c-60 -19 -107 -51 -139 -93 -27 -36 -114 -232 -114 -259 0
-12 59 -178 130 -366 12 -32 25 -58 29 -58 4 0 43 96 86 213 43 116 85 220 95
230 16 17 17 17 37 0 14 -12 111 -262 289 -743 147 -399 271 -736 276 -750 9
-22 22 5 104 209 l93 234 -229 573 c-126 315 -241 598 -255 629 -35 79 -75
126 -137 160 -45 24 -66 29 -138 32 -52 2 -101 -2 -127 -11z"/>
<path d="M1412 1737 c-34 -94 -62 -178 -62 -185 0 -20 173 -443 179 -437 2 3
35 80 73 171 l67 165 -91 230 c-51 126 -94 229 -97 229 -3 0 -34 -78 -69 -173z"/>
<path d="M834 1116 c-35 -16 -72 -58 -80 -93 -17 -67 30 -145 99 -164 83 -22
159 29 172 116 15 101 -97 184 -191 141z"/>
<path d="M242 850 c-5 -14 -36 -90 -68 -169 -31 -79 -57 -150 -57 -156 0 -17
176 -455 183 -455 7 0 130 333 130 353 0 15 -151 402 -170 437 -7 12 -10 10
-18 -10z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,6 +1,4 @@
---
title: git-filter-repo
---
# git-filter-repo
С помощью [git-filter-repo](https://github.com/newren/git-filter-repo/) можно переписать историю репозитория.

86
docs/misc/gitea.md Normal file
View File

@@ -0,0 +1,86 @@
# Кастомизация Gitea
```sh
sudo su - git
cd /var/lib/gitea/custom
```
```sh
mkdir -p /var/lib/gitea/custom/public/css
mkdir -p /var/lib/gitea/custom/templates/custom
```
```sh
sudo nano /var/lib/gitea/custom/templates/custom
```
```html
<link rel="stylesheet" href="/custom/css/custom.css">
```
```sh
sudo -u git mkdir css
sudo -u git nano css/custom.css
```
```sh
sudo systemctl restart gitea
```
```sh
sudo nano /etc/gitea/app.ini
```
https://docs.gitea.com/administration/customizing-gitea
https://docs.gitea.com/administration/config-cheat-sheet
```ini title="app.ini"
[server]
LANDING_PAGE = explore
[other]
SHOW_FOOTER_VERSION = false
SHOW_FOOTER_TEMPLATE_LOAD_TIME = false
SHOW_FOOTER_POWERED_BY = false
ENABLE_FEED = false
[i18n]
LANGS = en-US,ru-RU
NAMES = English,Русский
[repository]
DISABLE_STARS = true
[ui.meta]
AUTHOR = Artem Tishenko: Personal Git Repository Hub
DESCRIPTION = A personal hub for managing Git repositories by Artem Tishenko.
KEYWORDS = Artem Tishenko, Artyom Tishchenko, Git, self-hosted, personal projects, repositories, Gitea
```
```sh
mkdir -p /var/lib/gitea/custom/templates/base
cd /var/lib/gitea/custom/templates/base
# перейти туда
wget https://raw.githubusercontent.com/go-gitea/gitea/refs/tags/v1.22.3/templates/base/footer_content.tmpl
# remove help - https://docs.gitea.com
# remove explore - explore.repos
# remove sign_in (just visit /user/login)
wget https://github.com/go-gitea/gitea/raw/refs/tags/v1.22.3/templates/base/head_navbar.tmpl
mkdir -p /var/lib/gitea/custom/templates/repo
cd /var/lib/gitea/custom/templates/repo
# remove packages
# remove wiki
# remove repo.activity
# remove repo.issues
# remove repo.pulls
# remove watch, fork
wget https://raw.githubusercontent.com/go-gitea/gitea/refs/tags/v1.22.3/templates/repo/header.tmpl
```
```sh
# <a class="item" href="https://kb.tishenko.dev/" target="_blank">Knowledge base</a>
/var/lib/gitea/custom/templates/custom/extra_links.tmpl
```

261
docs/servers/index.md Normal file
View File

@@ -0,0 +1,261 @@
# Начальная настройка сервера
## Первое подключение
Подключаемся к серверу к `root` по паролю, который должен выдаваться вместе с VDS.
```sh
ssh root@<IPv4>
```
Уже в терминале сервера выполняем.
```sh { .code-wrap }
# Создаём пользователя и наделяем правом использовать `sudo`.
adduser <user>
adduser <username> sudo
# Переключаемся на нового пользователя
su - <user>
# Все файлы, созданные пользователем, по умолчанию будут иметь права 600, а директории - 700.
echo 'umask 0077' >> .bashrc
source ~/.bashrc
# Добавляем свой публичный SSH ключ (cat ~/.ssh/id_rsa.pub), чтобы подключаться к пользователю по SSH напрямую.
mkdir .ssh
echo "<your-id-rsa.pub>" >> .ssh/authorized_keys
# Актуально, только если настройку umask не добавлять в .bashrc
# chmod 700 ~/.ssh
# chmod 600 ~/.ssh/authorized_keys
```
Теперь можно попробовать подключиться к серверу по SSH-ключу.
```sh
ssh <user>@<IPv4>
```
Желательно обновить все пакеты и перезагрузить сервер.
```sh
sudo apt update
sudo apt upgrade
sudo reboot
```
Можно придумать серверу имя, оно будет отображаться в терминале после `<user>@`.
```sh
sudo nano /etc/hostname
sudo nano /etc/hosts
sudo systemctl restart systemd-hostnamed
```
## Настройка конфига SSH
Открываем конфиг SSH.
```sh
sudo nano /etc/ssh/sshd_config
```
- `Port <ssh-port>` - можно поменять со стандартного 22 на какой-нибудь другой. Лучше больше 10000, чтобы уменьшить вероятность конфликтов с другим ПО.
- `PermitRootLogin no` - запрещаем авторизацию по SSH под `root`.
- `PasswordAuthentication no` - запрещаем авторизацию по SSH по паролю.
После внесения изменений в конфиг, необходимо перезагрузить `sshd`.
```sh
# На некоторых системах ssh вместо sshd
sudo systemctl reload sshd
```
??? question "А что будет, если потерять SSH-ключ?"
Хостинг предоставляет доступ к `VNC` или другие методы подключения к серверу, которые не требуют подключения по SSH. Однако в таком случае будет необходим доступ к личному кабинету хостинга.
На своей машине добавляем сервер в конфиг SSH.
```sh
# На Windows надо будет нажать на Tab, чтобы раскрыть `~`.
# code - VS Code
code ~/.ssh/config
```
```
Host <host>
HostName <IPv4>
User <user>
Port <ssh-port>
```
Можно проверить, что подключение проходит без ошибок.
```sh
# Если конфиг настроен
ssh <host>
```
```sh
# Без конфига
ssh <user>@<IPv4> -p <ssh-port>
```
## Настройка фаерволла c UFW
```sh
# Установка UFW
sudo apt update
sudo apt install ufw -y
# Открываем порт, используемый для SSH (по умолчанию 22)
sudo ufw allow <ssh-port>/tcp
# Закрываем все входные
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Включаем фаерволл
sudo ufw enable
# Показать состояние ufw и активные правила
sudo ufw status verbose
```
??? tip "Дополнительные команды `ufw`"
```sh
# Отключить фаерволл
sudo ufw disable
# Удалить правило (будут применены настройки по умолчанию)
sudo ufw delete allow <port>/<protocol> # удалить разрешение
sudo ufw delete deny <port>/<protocol> # удалить запрет
# Сброс всех правил
sudo ufw reset
# Вывести логи ufw
sudo tail -f -n 100 /var/log/ufw.log
# Изменить уровень логирования
sudo ufw logging <low/medium/high>
# Разрешить доступ ко всем портам с определённого IP-адреса
sudo ufw allow from <IPv4>
# Разрешить доступ к порту с определённого IP-адреса
sudo ufw allow from <IPv4> to any port <port>
```
Некоторые приложения, например `OpenSSH` или `Nginx`, добавляют пресеты с правилами для `ufw`, которые точно так же можно разрешать и запрещать.
```sh
# Вывести список пресетов
sudo ufw app list
# Открыть все соединения, которые нужны Nginx
sudo ufw allow "Nginx Full"
# Удалить правило для пресета
sudo ufw delete allow "Nginx Full"
```
## Настройка Fail2Ban
[Fail2Ban](https://github.com/fail2ban/fail2ban) - базовая защита сервера от brute-force аттак.
```sh
sudo apt update
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
```
Теперь нужно [правильно настроить Fail2Ban](https://github.com/fail2ban/fail2ban/wiki/Proper-fail2ban-configuration).
```sh
# Создаём файл с пользовательскими настройками
sudo nano /etc/fail2ban/jail.local
```
Настройка защиты SSH сервера.
```ini
[sshd]
# Единственный обязательный параметр
enabled = true
# Можно не указывать, если используется стандартный порт
port = <ssh-port>
# Пример настроек. Эти параметры можно не указывать, тогда будут использованы
# значения по умолчанию.
# Если в течении 24 часов
findtime = 86400
# произведено 3 неудачных попытки логина,
maxretry = 3
# то банить IP навсегда.
bantime = -1
```
!!! tip "Более строгий конфиг для `fail2ban`"
Если на сервере настроена авторизация по ключу, можно смело использовать такой конфиг.
При авторизации по ключу, бан возможен только в случае указания неправильного имени пользователя, что исключено при использовании корректно настроенного SSH-конфига. В случае случайного бана всегда можно зайти на сервер через личный кабинет хостинга.
```ini
[sshd]
enabled = true
port = <ssh-port>
# Если произведена хотя бы одна неудачная попытка логина,
maxretry = 1
# то банить IP навсегда.
bantime = -1
```
```sh
# Применяем настройки
sudo fail2ban-client reload
```
После установки и первоначальной настройки `fail2ban` лучше перезагрузить сервер, иначе `fail2ban` может не заработать.
```sh
sudo reboot
```
??? tip "Дополнительные команды `fail2ban`"
```sh
# Вывести список активных jail's
sudo fail2ban-client status
# Вывести информацию по конкретному jail, в т. ч. список заблокированных IP
sudo fail2ban-client status <jail-name>
# Разблокировать IP
sudo fail2ban-client set <jail-name> unbanip <IP>
# Вывести логи fail2ban
sudo tail -f -n 100 /var/log/fail2ban.log
```
## Дополнительно
```sh
# Вывести записи о неудачных попытках входа в систему
sudo lastb | head -n 20
# Очистить записи о неудачных попытках входа в систему
sudo truncate -s 0 /var/log/btmp
# Показывает, кто в системе прямо сейчас
sudo w
# Логи попыток входа
sudo grep "Accepted password" /var/log/auth.log | tail -n 20
sudo grep "Failed password" /var/log/auth.log | tail -n 20
sudo grep "Invalid user" /var/log/auth.log | tail -n 20
# Очистить логи с попытками входа
sudo truncate -s 0 /var/log/auth.log
```
## Полезные ссылки
- [Initial Server Setup with Ubuntu 20.04](https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-20-04)
- [UFW Essentials: Common Firewall Rules and Commands](https://www.digitalocean.com/community/tutorials/ufw-essentials-common-firewall-rules-and-commands)
- [VPS cheatsheet](https://habr.com/ru/articles/756804/)
- [Fail2Ban](https://github.com/fail2ban/fail2ban)

50
docs/servers/nginx.md Normal file
View File

@@ -0,0 +1,50 @@
## SSL-сертификат с certbot
!!! tip "Актуальная версия Python"
Обычно системый `Python` достаточно старый. Для установки `certbot` может потребоваться более новая версия. Минимальные требования можно узнать на [pypi](https://pypi.org/project/certbot/).
```sh
sudo apt update
sudo add-apt-repository ppa:deadsnakes/ppa
# Вместо 3.1x нужно указать актуальную версию Python
sudo apt install python3.1x python3.1x-venv
```
Теперь вместо `python3` можно использовать `python3.1x`.
SSL-сертификат получается и устанавливается с помощью [certbot](https://github.com/certbot/certbot). На их сайте есть подробная пошаговая [инструкция](https://certbot.eff.org/instructions?ws=nginx&os=pip) о том, как правильно его установить, получить сертификаты и включить их автообновление.
??? note "Установка вкратце"
```sh { .code-wrap }
# Установили certbot в venv
# Вместо 3.1x нужно указать актуальную версию Python
sudo python3.x -m venv /opt/certbot/
sudo /opt/certbot/bin/pip install --upgrade pip
sudo /opt/certbot/bin/pip install certbot certbot-nginx
# Добавили в PATH
sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot
# Автообновление сертификатов
echo "0 0,12 * * * root /opt/certbot/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && sudo certbot renew -q" | sudo tee -a /etc/crontab > /dev/null
```
Несколько полезных команд.
```sh
# Получить сертификат для определённого домена. Предварительно нужно
# настроить конфиг nginx для этого домена.
sudo certbot --nginx -d example.com -d www.example.com
# Список сертификатов со сроками их жизни
sudo certbot certificates
# Удалить сертификат (команда предложит выбор)
sudo certbot delete
```

View File

@@ -5,3 +5,17 @@
.md-footer {
margin-top: 50px;
}
/* Достаточно добавить { .code-wrap } к блоку кода, чтобы включить автоперенос строк.
attr_list, очевидно, должен быть подключен в markdown_extensions.
Пример:
```sh { .code-wrap }
*very long line of code here*
```
*/
.code-wrap code {
white-space: pre-wrap;
word-break: break-word;
}

View File

@@ -7,12 +7,14 @@ edit_uri: edit/main/docs/
theme:
name: material
language: ru
logo: assets/logo.svg
favicon: assets/favicon.ico
icon:
repo: fontawesome/brands/github
features:
- navigation.indexes
- navigation.instant
- navigation.tabs
- content.code.copy