Compare commits
34 Commits
gitea-draf
...
04737ff93c
| Author | SHA1 | Date | |
|---|---|---|---|
| 04737ff93c | |||
| 9d7a9207f6 | |||
| c22af5a786 | |||
| cf8a68b72a | |||
| 89a278d0bc | |||
| 25be7bab30 | |||
| cb5a34ac95 | |||
| 2bd26f9d4d | |||
| 31b893a85a | |||
| 86506f744a | |||
| 5877dd00ba | |||
| 78cda0c83d | |||
| d490eb9131 | |||
| d770dd669c | |||
| 2362332d15 | |||
| 607719e7d9 | |||
| bf18fa9a3c | |||
| 00eff22bf5 | |||
| dd447678ad | |||
| b066e85b29 | |||
| fb4781f3ae | |||
| eada80734a | |||
| 265d6d5ce7 | |||
| ec2b6e13b7 | |||
| 07f4c78355 | |||
| fbea0bc085 | |||
| fc76f14fca | |||
| f7031b96ea | |||
| 19ec4e82f3 | |||
| a9a446d8b7 | |||
| 7db0de6eda | |||
| db68076181 | |||
| c0b936f792 | |||
| dd903276f7 |
@@ -1,3 +1,3 @@
|
||||
Просто склад моих заметок доступный всем.
|
||||
Просто склад моих заметок, доступный всем.
|
||||
|
||||
Можно предлагать правки и дополнения на [GitHub](https://github.com/Arity-T/knowledge-base).
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
```
|
||||
@@ -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
5
docs/misc/devtools.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# Заметка о Chrome DevTools
|
||||
|
||||
## Дебаг элементов, исчезающих при смене фокуса
|
||||
|
||||
В DevTools нажимаем сочетание клавиш `ctrl + shift + p` и ищем раздел `Show Rendering`. Устанавливаем флажок `Emulate a focused page`. Теперь элементы, исчезающие при смене фокуса (датапикеры, модальные окна, etc.), не будут исчезать при переключении на DevTools, а значит их код можно спокойно инспектировать.
|
||||
@@ -1,86 +1,196 @@
|
||||
# Кастомизация Gitea
|
||||
|
||||
```sh
|
||||
sudo su - git
|
||||
cd /var/lib/gitea/custom
|
||||
```
|
||||
Во всех командах подразумевается, что Gitea [установлена из бинарника](https://docs.gitea.com/installation/install-from-binary) и [запускается как `systemd` сервис](https://docs.gitea.com/installation/linux-service).
|
||||
|
||||
```sh
|
||||
mkdir -p /var/lib/gitea/custom/public/css
|
||||
mkdir -p /var/lib/gitea/custom/templates/custom
|
||||
```
|
||||
В документации есть страница, посвящённая [кастомизации Gitea](https://docs.gitea.com/administration/customizing-gitea).
|
||||
|
||||
```sh
|
||||
sudo nano /var/lib/gitea/custom/templates/custom
|
||||
```
|
||||
|
||||
```html
|
||||
<link rel="stylesheet" href="/custom/css/custom.css">
|
||||
```
|
||||
## Свой `css`
|
||||
|
||||
```sh
|
||||
sudo -u git mkdir css
|
||||
sudo -u git nano css/custom.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
|
||||
```
|
||||
@@ -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
14
docs/python/django.md
Normal 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
51
docs/servers/bash.md
Normal 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
75
docs/servers/cleanup.md
Normal 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
83
docs/servers/grafana.md
Normal 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`.
|
||||
@@ -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
|
||||
```
|
||||
|
||||
|
||||
Несколько полезных команд.
|
||||
|
||||
@@ -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
49
docs/servers/ssh.md
Normal 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`.
|
||||
@@ -1,4 +1,4 @@
|
||||
site_name: Tishenko's knowledge base
|
||||
site_name: Tish Knowledge Base
|
||||
site_url: https://kb.tishenko.dev
|
||||
copyright: Copyright © 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
|
||||
|
||||
@@ -1,2 +1,4 @@
|
||||
mkdocs
|
||||
pymdown-extensions
|
||||
mkdocs-material
|
||||
mkdocs-glightbox
|
||||
Reference in New Issue
Block a user