Compare commits

...

39 Commits

Author SHA1 Message Date
4de49b9d0e GItea в Docker + бэкапы
Some checks failed
Build MkDocs / build-and-deploy (push) Failing after 0s
2025-10-12 14:41:59 +03:00
d2a796e67f Шпаргалка по командам 2025-10-11 20:03:12 +03:00
96176d2f0c Скрипт для бэкапов
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-10-09 15:29:45 +03:00
4836eabc2c Мелкие правки
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 1s
2025-10-09 04:25:48 +03:00
63d729aec4 Заметка про сервер майнкрафт
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-10-09 04:07:35 +03:00
04737ff93c Небольшие уточнения по сетапу сервера
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 3s
2025-10-09 00:17:03 +03:00
9d7a9207f6 alt+r в bash 2025-10-09 00:15:42 +03:00
c22af5a786 Отдельная заметка по bash
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 3s
2025-09-27 22:12:48 +03:00
cf8a68b72a rename
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 3s
2025-09-09 10:36:53 +03:00
89a278d0bc перейти к реализации
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 1s
2025-08-18 21:08:34 +03:00
25be7bab30 перейти к определению типа
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 1s
2025-08-18 15:00:30 +03:00
cb5a34ac95 Reveal File in Explorer View hotkey
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 1s
2025-08-18 14:42:53 +03:00
2bd26f9d4d Добавил пример конфиг и proxy_params в заметку про Nginx
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-08-17 10:47:41 +03:00
31b893a85a Очистка места на сервере
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 1s
2025-08-16 22:41:54 +03:00
86506f744a Обновление PSReadLine
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-08-16 18:47:29 +03:00
5877dd00ba Добавил про проверку конфигов и логи nginx 2025-08-15 16:19:31 +03:00
78cda0c83d Алиас для git cherry-pick
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-08-12 10:18:49 +03:00
d490eb9131 Переход к определению
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 3s
2025-08-10 16:16:09 +03:00
d770dd669c Исправил ошибку в requirements
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 3s
2025-07-28 14:47:13 +03:00
2362332d15 Дебаг элементов, исчезающих при смене фокуса
Some checks failed
Build MkDocs / build-and-deploy (push) Failing after 1s
2025-07-28 14:41:29 +03:00
607719e7d9 Вернул плашку Made with MKDocs
Some checks failed
Build MkDocs / build-and-deploy (push) Failing after 1s
2025-07-28 12:56:49 +03:00
bf18fa9a3c Дополнил requirements 2025-07-28 12:55:35 +03:00
00eff22bf5 VS Code Сочетания клавиш для создания и удаления папок
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 3s
2025-07-28 12:52:28 +03:00
dd447678ad Настройки для очистки памяти
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-05-22 12:08:59 +03:00
b066e85b29 Замечание про отключение ufw
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-05-18 22:19:55 +03:00
fb4781f3ae Сохранил пару сочетаний клавиш
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 1s
2025-05-11 22:03:36 +03:00
eada80734a No more Windows Powershell
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-05-10 21:19:04 +03:00
265d6d5ce7 *nix which analog for powershell
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 3s
2025-05-10 20:37:09 +03:00
ec2b6e13b7 Уточнил инструкцию по поиску команд в bash
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-02-24 19:19:17 +03:00
07f4c78355 Поиск по истории команд в bash
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 3s
2025-02-22 00:09:27 +03:00
fbea0bc085 Заметка про SSH-agent
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 3s
2025-02-18 21:59:53 +03:00
fc76f14fca Когда-нибудь потом сделаю нормальное readme
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-02-04 20:03:09 +03:00
f7031b96ea Добавил про переключение между вкладками 2025-02-04 20:02:02 +03:00
19ec4e82f3 Очепятки
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-02-01 17:00:26 +03:00
a9a446d8b7 Вынес настройку сервера в отдельный раздел 2025-02-01 16:58:30 +03:00
7db0de6eda Добавление сайта Nginx 2025-02-01 16:50:48 +03:00
db68076181 Отслеживание SQL запросов django 2025-02-01 16:48:10 +03:00
c0b936f792 Заметка про установку Prometheus и Node Exporter 2025-02-01 16:45:46 +03:00
dd903276f7 Заметка про кастомизацию Gitea
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
2025-01-27 16:06:59 +03:00
16 changed files with 1216 additions and 86 deletions

View File

@@ -1,3 +1,3 @@
Просто склад моих заметок доступный всем.
Просто склад моих заметок, доступный всем.
Можно предлагать правки и дополнения на [GitHub](https://github.com/Arity-T/knowledge-base).

View File

@@ -13,6 +13,8 @@
`ctrl + shift + p` - главное сочетание клавиш, которое стоит запомнить.
`alt + 1/2/3/...` - переключение между открытыми вкладками в порядке их расположения.
Удалить множественные курсоры можно с помощью `Esc`.
Если с помощью `ctrl + d` выделили лишнее, то сочетанием `ctrl + u` можно убрать последнее выделение.
@@ -21,3 +23,60 @@
`alt + z` - крайне полезно при работе с Latex, Markdown и другими "широкими" файлами.
`ctrl + j` - скрыть/показать нижнюю панель (терминал, логи и т.д.).
`alt + shift + r` - показать файл, выбранный в левой панели с файлами, в проводнике.
`ctrl + shift + .` - breadcrumbs
## Кастомные сочетания клавиш
Сочетания клавиш для быстрого создания папок и файлов через проводник внутри VS Code.
- `a` - создать файл.
- `shift + a` - создать папку.
Быстрый переход к определению и типу функции, метода, переменной, etc. В дополнение к `F12`. Удобно использовать вместе с `alt + ←/→`.
- `alt + d` - перейти к определению.
- `alt + t` - перейти к определению типа.
- `alt + i` - перейти к реализации (актуально для Java).
Обычно я отключаю `explorer.autoReveal` в настройках, чтобы боковая панель с проводником не изменялась, когда я переключаюсь по файлам. Если мне всё-таки требуется выделить открытый файл в `Explorer View`, то я использую дополнительное сочетание клавиш.
- `alt + shift + r` - показать открытый файл в `Explorer View`.
```json
[
{
"key": "a",
"command": "explorer.newFile",
"when": "filesExplorerFocus && !inputFocus"
},
{
"key": "shift+a",
"command": "explorer.newFolder",
"when": "filesExplorerFocus && !inputFocus"
},
{
"key": "alt+d",
"command": "editor.action.revealDefinition",
"when": "editorHasDefinitionProvider && editorTextFocus"
},
{
"key": "alt+t",
"command": "editor.action.goToTypeDefinition",
"when": "editorHasTypeDefinitionProvider && editorTextFocus"
},
{
"key": "alt+i",
"command": "editor.action.goToImplementation",
"when": "editorHasImplementationProvider && editorTextFocus"
},
{
"key": "shift+alt+r",
"command": "workbench.files.action.showActiveFileInExplorer",
"when": "editorTextFocus"
}
]
```

View File

@@ -8,6 +8,7 @@ git config --global alias.ci commit
git config --global alias.cim "commit -m"
git config --global alias.st status
git config --global alias.br branch
git config --global alias.cp cherry-pick
git config --global alias.hist "log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short"
git config --global alias.histt "log --pretty=format:'%h %cd | %s%d [%an]' --graph --date=iso"
git config --global alias.ad "add -A"

5
docs/misc/devtools.md Normal file
View File

@@ -0,0 +1,5 @@
# Заметка о Chrome DevTools
## Дебаг элементов, исчезающих при смене фокуса
В DevTools нажимаем сочетание клавиш `ctrl + shift + p` и ищем раздел `Show Rendering`. Устанавливаем флажок `Emulate a focused page`. Теперь элементы, исчезающие при смене фокуса (датапикеры, модальные окна, etc.), не будут исчезать при переключении на DevTools, а значит их код можно спокойно инспектировать.

View File

@@ -1,86 +1,449 @@
# Кастомизация Gitea
# Gitea
Шпаргалки актуальны для Gitea 1.24.
## Установка с Docker
Эта заметка лишь дополнение к [документации](https://docs.gitea.com/installation/install-with-docker#basics).
=== "Терминал"
```sh
# Создаём служебного пользователя
sudo useradd --create-home --shell /bin/bash --system gitea
# Даём пользователю права использовать Docker
# Строго говоря это необязательно для разворачивания Gitea,
# но скорее всего и ранеры будут запускаться от этого пользователя,
# так что ему в любом случае потребуются права на Docker
sudo usermod -aG docker gitea
# Переключаемся на пользователя gitea
sudo su - gitea
# Узнаём его uid и gid
id
# Создаём docker-compose.yml по примеру
# Указываем переменные USER, USER_UID и USER_GID и порты
nano docker-compose.yml
# Создаём директорию для данных Gitea из-под пользователя gitea,
# иначе Docker сам создаст её из-под root
# см. секцию "volumes" в docker-compose.yml
mkdir data
# Запускаем Gitea
docker compose up -d
```
=== "docker-compose.yml"
```yaml
networks:
gitea:
external: false
services:
server:
image: docker.gitea.com/gitea:1.24.6
container_name: gitea
environment:
- USER=<user>
- USER_UID=<uid>
- USER_GID=<gid>
restart: always
networks:
- gitea
volumes:
- ./data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "28500:3000"
- "28522:22"
```
Теперь можно перейти по адресу `http://<IPv4>:28500` и завершить установку Gitea.
Подключиться к контейнеру можно командой.
```sh
sudo su - git
cd /var/lib/gitea/custom
docker exec --user gitea -it gitea bash
# Уже внутри контейнера можно запускать бинарник gitea
/usr/local/bin/gitea help
```
## Создание бэкапа
Ссылка на [документацию](https://docs.gitea.com/administration/backup-and-restore).
### Gitea установлена из бинарника
```sh
mkdir -p /var/lib/gitea/custom/public/css
mkdir -p /var/lib/gitea/custom/templates/custom
# gitea - это пользователь под которым запущен Gitea, часто это просто git
sudo su - gitea
mkdir gitea-backup
cd gitea-backup
# Нужно указать актуальный путь к конфигу
/usr/local/bin/gitea dump -c /etc/gitea/app.ini
# Если планируется восстановление с другой базой данных,
# то нужно указать параметр --database <sqlite3|mysql|postgres>
/usr/local/bin/gitea dump --database sqlite3 -c /etc/gitea/app.ini
```
### Gitea установлена с Docker
Предполагается, что Gitea развёрнута с помощью Docker Compose как описано в инструкции [выше](#установка-с-docker).
Подключаемся к контейнеру.
```sh
sudo nano /var/lib/gitea/custom/templates/custom
docker exec --user gitea -it gitea bash
```
```html
<link rel="stylesheet" href="/custom/css/custom.css">
```
Внутри контейнера выполняем.
```sh
sudo -u git mkdir css
sudo -u git nano css/custom.css
# Бэкап нужно создать в директории /data, потому что она прокинута на хост
cd /data
# (Опционально) Создаём директорию для бэкапов
mkdir backups
cd backups
# Нужно указать актуальный путь к конфигу
/usr/local/bin/gitea dump -c /data/gitea/conf/app.ini
# Если планируется восстановление с другой базой данных,
# то нужно указать параметр --database <sqlite3|mysql|postgres>
/usr/local/bin/gitea dump --database sqlite3 -c /data/gitea/conf/app.ini
```
То же самое в одну команду.
```sh
docker exec -u gitea -w /data gitea /usr/local/bin/gitea dump -c /data/gitea/conf/app.ini
```
### Перенос бэкапа на другую машину
Перенести бэкап на другую машину можно, например, так:
```sh
# Запускаем HTTP сервер (с scp загрузка больших файлов займёт много времени)
python3 -m http.server 8080
# На другой машине скачиваем бэкап
curl -O http://<IP>:8080/gitea-dump-1760203345.zip
```
## Восстановление из бэкапа в Docker
Предполагается, что Gitea разворачивается из [бэкапа](#создание-бэкапа) с помощью Docker Compose как описано в инструкции [выше](#установка-с-docker). В [документации](https://docs.gitea.com/1.24/administration/backup-and-restore#using-docker-restore) есть соответствующая инструкция, однако она не полная и содержит ошибки.
```sh
# Если создавали пользователя по инструкции выше,
# то команды выполняем от него
sudo su - gitea
# Распаковываем бэкап
unzip -q gitea-dump-*.zip -d dump
# Создаём директорию для данных Gitea
mkdir data
# Копируем данные
cp -r dump/data/ data/gitea/
# Копируем репозитории
mkdir data/git/
cp -r dump/repos/ data/git/repositories/
# Копируем кастомные стили и шаблоны
cp -r dump/custom/. data/gitea/
# Если Gitea в Docker будет работать с SQLite,
# то восстановить базу данных можно так.
# Команды для других баз данныех есть в документации
sqlite3 data/gitea/gitea.db < dump/gitea-db.sql
# Копируем конфиг
mkdir data/gitea/conf
cp dump/app.ini data/gitea/conf/app.ini
```
Если до этого Gitea была запущена не через Docker, то нужно отредактировать конфиг.
=== "Терминал"
```sh
vim data/gitea/conf/app.ini
```
=== "`app.ini` для Docker"
Это не полноценный конфиг, а лишь часть настроек для запуска Gitea Docker.
Подразумевается, что конфиг был перенесён из бэкапа.
```ini
RUN_USER = gitea
WORK_PATH = /data/gitea
[server]
LOCAL_ROOT_URL = http://localhost:3000
APP_DATA_PATH = /data/gitea
DOMAIN = localhost
SSH_DOMAIN = localhost
HTTP_PORT = 3000
SSH_PORT = 22
[repository]
ROOT = /data/git/repositories
[database]
PATH = /data/gitea/gitea.db
DB_TYPE = sqlite3
HOST = localhost:3306
NAME = gitea
USER = root
PASSWD =
LOG_SQL = false
[lfs]
PATH = /data/git/lfs
[log]
ROOT_PATH = /data/gitea/log
```
Запускаем Gitea, скорее всего она начнёт падать с ошибкой `permission denied`, а Docker будет пытаться её перезапустить. При первом запуске Gitea создаёт директории для ssh ключей, но по какой-то причине они создаются из-под `root`, а не из-под пользователя `gitea`.
```sh
# Специально без -d, ждём когда в логах повалятся ошибки и нажимаем Ctrl+C
docker compose up
```
Теперь нужно из-под `root` или с помощью `sudo` указать нужные права.
```sh
# Выходим из пользователя gitea (Ctrl + D или exit)
# и выполняем команду с root правами
sudo chown -R gitea:gitea ~gitea/data
```
Снова запускаем Gitea.
```sh
sudo su - gitea
docker compose up -d
```
Если всё работает корректно, то файлы бэкапа можно удалить.
```sh
rm -rf dump gitea-dump-*.zip
```
## Кастомизация Gitea
Во всех командах подразумевается, что Gitea [установлена из бинарника](https://docs.gitea.com/installation/install-from-binary) и [запускается как `systemd` сервис](https://docs.gitea.com/installation/linux-service).
В документации есть страница, посвящённая [кастомизации Gitea](https://docs.gitea.com/administration/customizing-gitea).
### Свой `css`
Добавляем ссылку на свой файл со стилями.
=== "Терминал"
```sh
# Путь по умолчанию
export GITEA_CUSTOM=/var/lib/gitea/custom
sudo -u git mkdir -p $GITEA_CUSTOM/templates/custom
sudo -u git nano $GITEA_CUSTOM/templates/custom/header.tmpl
```
=== "header.tmpl"
```html
<link rel="stylesheet" href="/assets/css/custom.css">
```
Создаём файл со стилями.
=== "Терминал"
```sh
sudo -u git mkdir -p $GITEA_CUSTOM/public/assets/css
sudo -u git nano $GITEA_CUSTOM/public/assets/css/custom.css
```
=== "Пример custom.css"
```css
/* Стили для git.tishenko.dev */
* {
transition: all 0.125s;
}
/* Список переменных и их значения по умолчанию
*
* Для светлой темы
* https://github.com/go-gitea/gitea/blob/main/web_src/css/themes/theme-gitea-light.css
*
* Для тёмной темы
* https://github.com/go-gitea/gitea/blob/main/web_src/css/themes/theme-gitea-dark.css
*/
/* Переопределения переменных для светлой и тёмной темы одновременно */
:root {
/* Основной цвет */
--color-primary: #6674c4;
--color-primary-contrast: #ffffff;
/* https://maketintsandshades.com/#4051B5 */
--color-primary-dark-1: #7985cb;
--color-primary-dark-2: #8c97d3;
--color-primary-dark-3: #a0a8da;
--color-primary-dark-4: #b3b9e1;
--color-primary-dark-5: #c6cbe9;
--color-primary-dark-6: #d9dcf0;
--color-primary-dark-7: #eceef8;
--color-primary-light-1: #5362bc;
--color-primary-light-2: #4051b5;
--color-primary-light-3: #3a49a3;
--color-primary-light-4: #334191;
--color-primary-light-5: #2d397f;
--color-primary-light-6: #26316d;
--color-primary-light-7: #20295b;
--color-primary-alpha-10: #6674c419;
--color-primary-alpha-20: #6674c433;
--color-primary-alpha-30: #6674c44b;
--color-primary-alpha-40: #6674c466;
--color-primary-alpha-50: #6674c480;
--color-primary-alpha-60: #6674c499;
--color-primary-alpha-70: #6674c4b3;
--color-primary-alpha-80: #6674c4cc;
--color-primary-alpha-90: #6674c4e1;
}
/* Переопределения переменных для светлой темы */
@media (prefers-color-scheme: light) {
:root {}
#navbar-logo {
padding: 5px !important;
background: #14151A;
}
#navbar-logo img {
width: 27px !important;
height: 27px !important;
}
#navbar-logo:hover {
background: #14151A !important;
}
}
/* Переопределения переменных для тёмной темы */
@media (prefers-color-scheme: dark) {
:root {
/* Шапка */
--color-nav-bg: #14151A;
--color-secondary-nav-bg: #14151A;
--color-nav-text: #BEC1C6;
--color-nav-hover-bg: #272A35;
/* Тёмно-серый фон основной */
--color-body: #1E2129;
--color-input-background: #14151A;
--color-menu: #14151A;
--color-card: #14151A;
--color-button: #14151A;
}
}
```
Перезапускаем Gitea.
```sh
sudo systemctl restart gitea
```
После изменения стилей, страницу в браузере нужно обновить с помощью `ctrl + f5`.
### Настройка `app.ini`
Перечень всех возможных настроек представлен в [документации](https://docs.gitea.com/administration/config-cheat-sheet).
=== "Терминал"
```sh
sudo nano /etc/gitea/app.ini
```
=== "Пример параметров app.ini"
```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
[cron]
ENABLED = 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
```
Перезапускаем 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
sudo systemctl restart gitea
```
### Изменение шаблонов страниц
Ищем шаблон для нужной версии в [репозитории Gitea](https://github.com/go-gitea/gitea/tree/main/templates), загружаем с помощью `wget` по такому же пути в `$GITEA_CUSTOM/templates` и редактируем.
Так, например, можно убрать пункт "Помощь" с ссылкой на `https://docs.gitea.com` из основного меню.
```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
# Путь по умолчанию
export GITEA_CUSTOM=/var/lib/gitea/custom
# 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
# gitea --version
export GITEA_VERSION=v1.22.3
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
sudo -u git mkdir -p $GITEA_CUSTOM/templates/base
wget -P $GITEA_CUSTOM/templates/base https://raw.githubusercontent.com/go-gitea/gitea/refs/tags/$GITEA_VERSION/templates/base/head_navbar.tmpl
sudo -u git nano $GITEA_CUSTOM/templates/base/head_navbar.tmpl
```
Перезапускаем Gitea.
```sh
# <a class="item" href="https://kb.tishenko.dev/" target="_blank">Knowledge base</a>
/var/lib/gitea/custom/templates/custom/extra_links.tmpl
sudo systemctl restart gitea
```

View File

@@ -0,0 +1,282 @@
# Minecraft Server
[docker-minecraft-server](https://github.com/itzg/docker-minecraft-server) - самый простой и удобный способ запуска своего Minecraft сервера. У проекта есть хорошая [документация](https://docker-minecraft-server.readthedocs.io/en/latest/), но всё же есть некоторые нюансы, которые стоит записать.
## Запуск сервера
1. Устанавливаем [`docker`](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository). Не забываем про [post-install steps](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user).
2. Создаём папку для сервера.
```sh
mkdir minecraft-server
cd minecraft-server
```
3. Создаём файл `docker-compose.yml`.
=== "Терминал"
```sh
nano docker-compose.yml
```
=== "docker-compose.yml"
```yaml
# https://docker-minecraft-server.readthedocs.io/en/latest/
services:
mc:
image: itzg/minecraft-server
tty: true
stdin_open: true
ports:
# Порт 25565 является стандартным, все клиенты по умолчанию
# подключаются к нему, если порт не задан явно
- "25565:25565"
environment:
# Полный список переменных можно найти в документации
# https://docker-minecraft-server.readthedocs.io/en/latest/variables/
EULA: "TRUE"
# Не забудьте указать нужную версию Minecraft
VERSION: 1.19.4
# Разрешаем подключаться без лицензии Minecraft
ONLINE_MODE: false
# Указываем название игрового мира (будет храниться в ./data/<LEVEL>)
# Чтобы изменить мир, достаточно изменить значение этой переменной
# и перезапустить контейнер
LEVEL: MyWorld
# Описание сервера
MOTD: |
Tish's Minecraft Server on %VERSION%
# Иконка сервера
# Надо разместить файл icon.png в ./data/
# ICON: /data/icon.png
# OVERRIDE_ICON: true
# Автоотключение пустого сервера
# ENABLE_AUTOSTOP: TRUE
# AUTOSTOP_TIMEOUT_EST: 300
# AUTOSTOP_TIMEOUT_INIT: 600
volumes:
- ./data:/data
```
4. Запускаем сервер.
```sh
docker compose up -d
```
## Остановка сервера
```sh
docker compose stop
```
## Консоль сервера
`ctrl + p ctrl + q` - отключиться от консоли.
Если просто нажать `ctrl + c`, то сервер остановится.
```sh
docker compose attach mc
```
### Шпаргалка по командам
1. `/list` — список игроков.
2. `/op <nickname>` — сделать игрока оператором.
3. `/deop <nickname>` — удалить из списка операторов.
4. Отдельной команды для просмотра списка операторов нет, но он хранится в файле `data/ops.json`.
5. `/whitelist <on|off>` — включить или выключить белый список игроков.
6. `/whitelist list` — вывести белый список игроков.
7. `/whitelist add <nickname>` — добавить игрока в белый список.
8. `/whitelist remove <nickname>` — удалить игрока из белого списка.
9. `/gamemode <0|1|2|3>` — изменить режим игры (0 — выживание, 1 — креатив, 2 — приключение, 3 — наблюдатель).
10. `/time set <day|night|<число>>` — установить время суток.
11. `/weather <clear|rain|thunder>` — изменить погоду.
12. `/tp <nickname1> <nickname2>` — телепортировать первого игрока ко второму.
13. `/difficulty <peaceful|easy|normal|hard>` — изменить уровень сложности сервера.
## Домен для сервера
Если порт стандартный (`25565`), то при подключении можно просто указать домен в A-записи которого указан IP-адрес сервера. Однако если порт нестандартный или хочется сделать несколько доменных имён для одного сервера, то можно использовать SRV-записи.
Например, если я создам домен `minecraft.tishenko.dev` и запущу сервер на порте `12345`, то чтобы подключаться к серверу без указания порта, мне нужно будет добавить следующую SRV-запись для `minecraft.tishenko.dev`:
```dns
_minecraft._tcp.minecraft.tishenko.dev. 3600 IN SRV 0 5 12345 minecraft.tishenko.dev.
```
Обычно ДНС провайдеры предоставляют UI для создания записей, в нём скорее всего будут следующие поля:
- Поддомен: `minecraft`
- Сервис: `minecraft` (SpaceWeb, например, сам подставляет `_`)
- Протокол: `tcp`
- TTL: `3600`
- Приоритет: `0`
- Вес: `5`
- Порт: `12345`
- Целевой домен: `minecraft.tishenko.dev.` (точка в конце обязательна)
Целевой домен не обязательно должен совпадать с поддоменом. Можно сделать подключение к серверу по домену `tishenko.dev` указан следующую SRV-запись для домена `tishenko.dev`:
```dns
_minecraft._tcp.tishenko.dev. 3600 IN SRV 0 5 12345 minecraft.tishenko.dev.
```
Домен `minecraft.tishenko.dev` в своей A-записи должен указывать на IP-адрес сервера, но при этом совершенно неважно какая A-запись будет у `tishenko.dev`.
DNS-записи распространяются не мгновенно, но обычно это занимает 15-30 минут. Отслеживать распространение записей можно с помощью сайта [DNS Checker](https://dnschecker.org/#SRV/_minecraft._tcp.tishenko.dev).
!!! note "Клиенты Minecraft читают SRV-запись"
С помощью SRV-записи можно подменять как порт, так и домен сервера. Стандартный клиент Minecraft Java Edition при подключении по домену автоматически ищет SRV-запись _minecraft._tcp.<домен> в DNS. Если такая запись есть, клиент использует указанные в ней порт и хост. С Bedrock Edition могут возникнуть сложности, там не все клиенты читают SRV-запись.
## Автоматическое создание бэкапов
Скрипт ниже автоматически создаёт бэкапы при завершении работы сервера. Особенно удобно сочетать его с настройкой `ENABLE_AUTOSTOP`, тогда при завершении игровой сессии бэкап будет создан автоматически.
=== "Терминал"
```sh
# Создаём скрипт в директории рядом с docker-compose.yml
nano run-and-backup.sh
# После создания скрипта надо дать ему права на выполнение
chmod u+x run-and-backup.sh
```
=== "run-and-backup.sh"
```bash
#!/usr/bin/env bash
set -euo pipefail
# === настройки ===
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DATA_DIR="${PROJECT_DIR}/data"
BACKUP_DIR="${PROJECT_DIR}/backups"
KEEP_BACKUPS=3
TAR_COMPRESS_FLAGS="-czf"
mkdir -p "$BACKUP_DIR"
ts() { date +"%Y-%m-%d_%H-%M-%S"; }
show_help() {
cat <<'EOF'
run-and-backup.sh — запускает Minecraft-сервер через Docker Compose
и создаёт резервную копию каталога ./data после завершения работы.
ИСПОЛЬЗОВАНИЕ:
./run-and-backup.sh — запустить сервер в foreground
./run-and-backup.sh -d — запустить в background (логи в run-and-backup.log)
./run-and-backup.sh -b — только сделать бэкап и выйти
./run-and-backup.sh -h — показать эту справку
ЧТО ДЕЛАЕТ:
1) docker compose up (следит за завершением контейнера)
2) по Ctrl+C или штатному выходу — docker compose down
3) создаёт архив ./backups/mc-data-YYYY-MM-DD_HH-MM-SS.tar.gz
4) хранит последние KEEP_BACKUPS бэкапов
КАК ВОССТАНОВИТЬ СЕРВЕР ИЗ БЭКАПА:
1) Остановите сервер:
docker compose down
2) Очистите или перенесите текущие данные:
mv ./data ./data.old
mkdir ./data
ИЛИ
rm -rf ./data/*
3) Распакуйте нужный архив в ./data:
tar -xzf ./backups/mc-data-YYYY-MM-DD_HH-MM-SS.tar.gz -C ./data
4) Запустите сервер
ПРИМЕЧАНИЯ:
• Архив содержит всё из ./data (мир, плагины, конфиги, whitelist, ops и т.д.)
• Для фонового режима логи скрипта пишутся в ./run-and-backup.log
EOF
}
backup() {
local stamp archive
stamp="$(ts)"
archive="${BACKUP_DIR}/mc-data-${stamp}.tar.gz"
if [[ ! -d "$DATA_DIR" ]]; then
echo "[!] Нет каталога DATA_DIR: $DATA_DIR" >&2
exit 1
fi
echo "[*] Бэкап ${DATA_DIR} -> ${archive}"
tar $TAR_COMPRESS_FLAGS "$archive" -C "$DATA_DIR" .
echo "[+] Готово: $archive"
echo "[*] Ротация: оставляю последние ${KEEP_BACKUPS}"
ls -1t "${BACKUP_DIR}"/mc-data-*.tar.* 2>/dev/null | tail -n +$((KEEP_BACKUPS+1)) | xargs -r rm -f
}
graceful_down_and_backup() {
echo "[*] Останавливаю docker compose (graceful)..."
docker compose down || true
backup
}
# ---- разбор флагов ----
bg=false
do_backup_only=false
while getopts ":dbh" opt; do
case "$opt" in
d) bg=true ;;
b) do_backup_only=true ;;
h) show_help; exit 0 ;;
\?) echo "Неизвестный флаг: -$OPTARG" >&2; show_help; exit 2 ;;
esac
done
# -b имеет приоритет: просто делаем бэкап и выходим
if $do_backup_only; then
backup
exit 0
fi
# запуск в фоне
if $bg; then
echo "[*] Запускаю в background (логи: ${PROJECT_DIR}/run-and-backup.log)"
nohup "$0" >"${PROJECT_DIR}/run-and-backup.log" 2>&1 &
echo "[✓] PID: $!"
exit 0
fi
# ---- основной режим ----
trap graceful_down_and_backup INT TERM
echo "[*] Запускаю docker compose в foreground (Ctrl+C для остановки)..."
if docker compose up; then
echo "[*] docker compose завершился сам — делаю бэкап..."
backup
else
echo "[!] docker compose завершился с ошибкой; если это был Ctrl+C, бэкап уже выполнен ловушкой."
fi
echo "[✓] Готово."
```
Теперь можно запускать сервер командой `./run-and-backup.sh`.
```sh
./run-and-backup.sh -d
```
Вывести справку можно командой.
```sh
./run-and-backup.sh -h
```

View File

@@ -1,8 +1,38 @@
# Заметка о Powershell
## Мой Powershell profile
## Установка Powershell
Открыть файл настроек Powershell:
По умолчанию в Windows установлен устаревший Windows PowerShell с кучей багов и отсутствующей поддержкой базовых операторов (`&&`, `|`, `||`). Установить новый Powershell можно по [инструкции в репозитории](https://github.com/PowerShell/PowerShell?tab=readme-ov-file#get-powershell).
```powershell
winget search Microsoft.PowerShell
winget install --id Microsoft.PowerShell --source winget
```
Затем стоит [установить PowerShell как профиль по умолчанию](https://stackoverflow.com/a/75891592/17341937).
Чтобы VSCode использовал PowerShell в качестве профиля по умолчанию, нужно добавить в `settings.json` следующий параметр:
```json
{
"terminal.integrated.defaultProfile.windows": "PowerShell"
}
```
## Обновление PSReadLine
На старых версиях PSReadLine, который используется под капотом PowerShell, возникают различные баги: [иногда не печатаются заглавные буквы](https://github.com/PowerShell/PowerShell/issues/10794#issuecomment-542319327), [не работает `Ctrl + C` при запуске с русской раскладкой](https://github.com/PowerShell/PSReadLine/issues/1393#issuecomment-2065423282). Так что стоит сразу его обновить.
Закрыть открытые PowerShell, в том числе внутри VS Code или других IDE. Запустить `cmd` от имени администратора и выполнить:
```cmd
"C:\Program Files\PowerShell\7\pwsh.exe" -noprofile -command "Install-Module PSReadLine -Force -SkipPublisherCheck -AllowPrerelease"
```
Баг с `Ctrl + C` исправлен частично. Если открыть PowerShell с русской раскладкой, то вместо `Ctrl + C` всё равно будет появляться буква `с`, но теперь достаточно переключить раскладку на английскую и всё заработает.
## Мой PowerShell profile
Открыть файл настроек PowerShell:
```powershell
code $profile # или notepad $profile
```
@@ -12,12 +42,14 @@ code $profile # или notepad $profile
# Лучше заменить настоящим wget
# https://eternallybored.org/misc/wget/
# Скачать EXE для 64-bit и добавить в папку в PATH
remove-item alias:wget
# Удалять алиас нужно только в Windows PowerShell
# remove-item alias:wget
# Заменяем Invoke-WebRequest нормальным curl
# Скачиваем curl for 64-bit тут https://curl.se/windows/
# Из папки bin архива переносим curl.exe в папку в PATH
remove-item alias:curl
# Удалять алиас нужно только в Windows PowerShell
# remove-item alias:curl
# Алиасы
new-alias actvenv venv/Scripts/activate
@@ -28,8 +60,11 @@ function crtvenv {
actvenv
}
function python-path {
python -c "import sys; print(sys.executable)"
# Аналог команды which в Linux
# https://stackoverflow.com/a/16949127/17341937
function which($name)
{
Get-Command $name | Select-Object -ExpandProperty Definition
}
# Модуль для автокомплита GIT https://github.com/dahlbyk/posh-git
@@ -45,7 +80,7 @@ Import-Module DockerCompletion
# Более удобное автодополнение
Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete
# Перемещаться по истории использования команды с помощью стрелочек
# Удобный поиск по истории команд с помощью стрелочек
Set-PSReadlineKeyHandler -Key UpArrow -Function HistorySearchBackward
Set-PSReadlineKeyHandler -Key DownArrow -Function HistorySearchForward
```
@@ -56,21 +91,6 @@ Set-PSReadlineKeyHandler -Key DownArrow -Function HistorySearchForward
Set-ExecutionPolicy RemoteSigned
```
## Баг с uppercase
В какой-то момент заглавные буквы просто перестают печататься в Powershell, это означает, что нужно обновить `PSReadLine`.
Запустить Powershell от имени администратора и выполнить:
```powershell
Install-Module -Name PowerShellGet -Force
```
Перезапустить от имени администратора и выполнить:
```powershell
Install-Module PSReadLine -AllowPrerelease -Force
```
## Крутой аналог grep - ripgrep
[Скачать](https://github.com/BurntSushi/ripgrep/releases/) релиз для винды и добавить в PATH

14
docs/python/django.md Normal file
View File

@@ -0,0 +1,14 @@
## Отслеживание SQL запросов
```python
from django.db import connection, reset_queries
# Сбрасываем счетчик запросов
reset_queries()
# Код, который работает с БД
# Теперь выводим все запросы, которые были зафиксированы
for query in connection.queries:
print(query)
```

51
docs/servers/bash.md Normal file
View File

@@ -0,0 +1,51 @@
# Bash
## Поиск по истории команд в bash (`↑/↓`)
Включаем поиск по истории команд `bash` по префиксу.
=== "Терминал"
```sh
nano ~/.inputrc
```
=== ".inputrc"
```sh
"\e[A": history-search-backward
"\e[B": history-search-forward
```
После обновления `.inputrc` нужно либо начать сеанс заново, либо выполнить команду.
```sh
bind -f ~/.inputrc
```
## Поиск по истории команд (`ctrl + r`)
`ctrl + r` — начать поиск по истории команд. Дальше можно вводить любую часть команды, поиск будет инкрементально обновляться с каждым введённым символом.
- При повторном нажатии `ctrl + r` будет выведена следующая подходящая команда.
- `Esc` или `ctrl + g` — прервать поиск и вернуться в обычный режим.
- `` или `ctrl + j` — вставить найденную команду в командную строку, но не выполнять. Пригождается, если нужно предварительно отредактировать команду.
- `Enter` — выполнить найденную команду.
## Сочетания клавиш
В Bash есть множество сочетаний клавиш для быстрой навигации и редактирования команд.
Это функции [GNU Readline](https://en.wikipedia.org/wiki/GNU_Readline) (по этой же ссылке можно найти полный список сочетаний).
- `ctrl + l` — очистить экран (аналог `clear`).
- `alt + .` — вставить последний аргумент предыдущей команды.
- `ctrl + a` — в начало строки.
- `ctrl + e` — в конец строки.
- `alt + b` — назад на одно слово.
- `alt + f` — вперед на одно слово.
- `ctrl + b` и `ctrl + f` — назад/вперед на один символ (аналог `← / →`, но не нужно тянуться к стрелочкам).
- `ctrl + p` и `ctrl + n` — переход по истории команд (аналог `↑ / ↓`, но не нужно тянуться к стрелочкам).
- `alt + r` — отменить изменения в команде и вернуть к виду, в котором она хранится в истории команд.
- `alt + d` — удалить слово справа от курсора.
- `ctrl + w` — удалить слово слева от курсора.

75
docs/servers/cleanup.md Normal file
View File

@@ -0,0 +1,75 @@
# Очистка места на сервере
## Полезные команды
```sh
# Проверить место во всех разделах
df -h
# Размер файла/папки
du -sh <path>
# Показать самые большие директории в корне
sudo du -h -d1 / | sort -hr
# В домашнем каталоге
du -h -d1 ~ | sort -hr
# Показать файлы больше 100MB
find . -type f -size +100M -exec ls -lh {} \; | awk '{print $5, $9}' | sort -hr
```
## Логи `journalctl`
```sh
# Посмотреть сколько занимают логи журнала
sudo journalctl --disk-usage
# Оставить только 100MB самых актуальных логов
sudo journalctl --rotate
sudo journalctl --vacuum-size=100M
# Можно задать параметры SystemMaxUse и RuntimeMaxUse
# Вместо MB надо использовать M
sudo nano /etc/systemd/journald.conf
# Применить изменения в конфиге
sudo systemctl restart systemd-journald
```
## Другие логи
```sh
# Посмотреть сколько места занимают логи
sudo du -h -d1 /var/log | sort -hr
# Очищать файлы с логами лучше командой, чтобы процессы могли
# дальше писать логи в этим файлы
sudo truncate -s 0
```
## Кэш пакетов
```sh
sudo apt-get clean
sudo apt-get autoremove --purge
```
## Docker
```sh
# Посмотреть сколько место занимает докер
docker system df
# Показать детализацию по образам, контейнерам, волюмам
docker system df -v
# Удалить все нетегированные образы, остановленные контейнеры,
# неиспользуемые сети, кэш сборки
docker system prune
# Очистит также все образы, с которыми не связан ни один контейнер
docker system prune -a
# Удалить волюмы, с которыми не связан ни один контейнер
docker volume prune
```

83
docs/servers/grafana.md Normal file
View File

@@ -0,0 +1,83 @@
## Запуск Prometheus с помощью systemd
Ссылку на последнюю версию `Prometheus` можно найти на [странице загрузок](https://prometheus.io/download/).
```sh
# Скачиваем и распаковываем релиз
wget <link>
tar xvf prometheus-*.*-amd64.tar.gz
cd prometheus-*.*
# Создаём отдельного пользователя и группу для запуска prometheus
sudo adduser --system --no-create-home --group prometheus
# Конфиг
sudo mkdir /etc/prometheus
sudo cp prometheus.yml /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus
# Папка для данных
sudo mkdir /var/lib/prometheus
sudo chown -R prometheus:prometheus /var/lib/prometheus
# Бинарники prometheus и promtool
sudo cp prometheus /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo cp promtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/promtool
```
Создаём `systemd` сервис. Список возможных параметров запуска `Prometheus` представлен в [документации](https://prometheus.io/docs/prometheus/latest/command-line/prometheus/).
=== "Терминал"
```sh
sudo nano /etc/systemd/system/prometheus.service
```
=== "prometheus.service"
```ini
[Unit]
Description=Prometheus Server
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Restart=on-failure
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus \
--storage.tsdb.retention.size=500MB
[Install]
WantedBy=multi-user.target
```
Добавляем `Prometheus` в автозагрузку и запускаем.
```sh
sudo systemctl daemon-reload
sudo systemctl enable prometheus
sudo systemctl start prometheus
sudo systemctl status prometheus
```
При обновлении конфига, нужно будет перезапустить сервис.
```sh
sudo systemctl restart prometheus
```
## Node Exporter
Устанавливаем `Node Exporter` по инструкции из [документации](https://prometheus.io/docs/guides/node-exporter/). Сервис в `systemd` для `Node Exporter` будет создан автоматически.
```sh
sudo systemctl status node_exporter.service
```
[Пример](https://grafana.com/grafana/dashboards/1860-node-exporter-full/) дашборда `Grafana` для `Node Exporter`.

View File

@@ -1,10 +1,118 @@
## Добавление сайта
Создаём конфиг.
=== "Терминал"
```sh
sudo nano /etc/nginx/sites-available/new-site.conf
```
=== "Статический сайт"
```nginx
server {
server_name example.com www.example.com;
listen 80;
root /var/www/new-site;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
```
=== "Веб-приложение"
```nginx
server {
server_name giga-chill.ru www.giga-chill.ru;
listen 80;
# Все запросы к /api/* перенаправляются на бэкенд
location /api/ {
proxy_pass http://127.0.0.1:8081/;
include proxy_params;
}
# Спецификация API в формате OpenAPI
location = /api/openapi.yml {
alias /var/www/giga-chill/openapi.yml;
types { text/yaml yml yaml; }
charset utf-8;
charset_types text/yaml application/yaml text/x-yaml application/x-yaml;
}
# Документация API в Swagger UI
location = /api/swagger { return 301 /api/swagger/; }
location /api/swagger/ {
proxy_pass http://127.0.0.1:1240/;
include proxy_params;
}
# Документация API в Redocly
location = /api/redoc { return 301 /api/redoc/; }
location /api/redoc/ {
alias /var/www/giga-chill/redoc/;
index index.html;
}
# Все остальные запросы направляются на фронтенд
location / {
proxy_pass http://127.0.0.1:3000;
include proxy_params;
}
}
```
Активируем конфиг.
```sh
sudo ln -s /etc/nginx/sites-available/new-site.conf /etc/nginx/sites-enabled/
sudo systemctl reload nginx.service
```
Конфиг можно проверить на наличие синтаксических ошибок.
```sh
sudo nginx -t
```
??? question "`open() "/etc/nginx/proxy_params" failed (2: No such file or directory)`"
Обычно файл `/etc/nginx/proxy_params` создаётся автоматически при установке Nginx, однако его несложно добавить самостоятельно, если по каким-то причинам он не был создан или был удалён.
=== "Терминал"
```sh
sudo nano /etc/nginx/proxy_params
```
=== "proxy_params"
```nginx
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;
```
## Просмотр логов
По умолчанию логи находятся в `access.log` и `error.log` файлах.
```sh
sudo tail -n 20 /var/log/nginx/access.log
sudo tail -n 20 /var/log/nginx/error.log
```
## SSL-сертификат с certbot
!!! tip "Актуальная версия Python"
Обычно системый `Python` достаточно старый. Для установки `certbot` может потребоваться более новая версия. Минимальные требования можно узнать на [pypi](https://pypi.org/project/certbot/).
Обычно системный `Python` достаточно старый. Для установки `certbot` может потребоваться более новая версия. Минимальные требования можно узнать на [pypi](https://pypi.org/project/certbot/).
```sh
sudo apt update
@@ -33,6 +141,17 @@ SSL-сертификат получается и устанавливается
# Автообновление сертификатов
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
```
??? tip "Отключение UFW"
Может потребоваться временно отключить UFW.
```sh
sudo ufw disable
# Получаем сертификат
sudo ufw enable
```
Несколько полезных команд.

View File

@@ -10,7 +10,7 @@ ssh root@<IPv4>
```sh { .code-wrap }
# Создаём пользователя и наделяем правом использовать `sudo`.
adduser <user>
adduser <username> sudo
adduser <user> sudo
# Переключаемся на нового пользователя
su - <user>
@@ -42,8 +42,11 @@ sudo reboot
Можно придумать серверу имя, оно будет отображаться в терминале после `<user>@`.
```sh
sudo nano /etc/hostname
sudo nano /etc/hosts
sudo systemctl restart systemd-hostnamed
# В hosts тоже иногда есть строчка вида
# 127.0.1.1 <hostname>
sudo nano /etc/hosts
```
@@ -61,6 +64,10 @@ sudo nano /etc/ssh/sshd_config
```sh
# На некоторых системах ssh вместо sshd
sudo systemctl reload sshd
# Иногда дополнительно нужно выполнить
systemctl daemon-reload
systemctl restart ssh.socket
```
??? question "А что будет, если потерять SSH-ключ?"
@@ -156,7 +163,7 @@ sudo ufw status verbose
## Настройка Fail2Ban
[Fail2Ban](https://github.com/fail2ban/fail2ban) - базовая защита сервера от brute-force аттак.
[Fail2Ban](https://github.com/fail2ban/fail2ban) - базовая защита сервера от brute-force атак.
```sh
sudo apt update

49
docs/servers/ssh.md Normal file
View File

@@ -0,0 +1,49 @@
# Заметка по SSH
## SSH-agent
### Установка на Windows
`ssh-agent` является частью OpenSSH. Начиная с Windows 10, OpenSSH устанавливается вместе с системой, однако службу `ssh-agent` надо включить вручную. Для этого нужно запустить `Powershell` от имени администратора и выполнить несколько команд.
```powershell
Set-Service -Name ssh-agent -StartupType Automatic
Start-Service ssh-agent
```
Проверить состояние `ssh-agent` можно с помощью команды.
```powershell
Get-Service -Name ssh-agent | select -property status,name,starttype
```
На Windows `git` по умолчанию использует свою службу `ssh` вместо системной, поэтому `ssh-agent` не будет с ним работать и пароли всё равно придётся вводить вручную. Однако можно настроить `git` так, чтобы он использовал системный `ssh`.
```powershell
git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe"
```
### Использование
!!! warning "Security warning"
На Windows доступ к ключам сохраняется даже после перезагрузки системы.
```sh
# Добавляет ключи из ~/.ssh/
ssh-add
# Можно указать путь
ssh-add path/to/id_rsa
# Список добавленных ключей
ssh-add -l
# Удалить все ключи из памяти агента
ssh-add -D
```
Иногда нужно, чтобы при подключении на сервер, были доступны приватные ключи из локального `ssh-agent`. Для этого можно использовать команду `ssh -A`.
```sh
ssh -A user@server
```
Либо указать `ForwardAgent yes` в конфиге `ssh`.

View File

@@ -1,4 +1,4 @@
site_name: Tishenko's knowledge base
site_name: Tish Knowledge Base
site_url: https://kb.tishenko.dev
copyright: Copyright &copy; 2025
repo_url: https://github.com/Arity-T/knowledge-base
@@ -37,7 +37,7 @@ theme:
icon: material/brightness-4
name: Switch to light mode
extra:
generator: false
# generator: false
social:
- icon: fontawesome/brands/github
link: https://github.com/Arity-T

View File

@@ -1,2 +1,4 @@
mkdocs
pymdown-extensions
mkdocs-material
mkdocs-glightbox