MVP for hosting

This commit is contained in:
2023-12-15 16:21:59 +03:00
parent fec5db6efd
commit 9f26a11327
173 changed files with 93 additions and 3626 deletions
+8
View File
@@ -0,0 +1,8 @@
{
"label": "Template",
"position": 6,
"link": {
"type": "generated-index",
"description": "Template description"
}
}
-8
View File
@@ -1,8 +0,0 @@
{
"label": "Ansible",
"position": 6,
"link": {
"type": "generated-index",
"description": "Ansible commands docs blog"
}
}
-8
View File
@@ -1,8 +0,0 @@
{
"label": "Cloud",
"position": 8,
"link": {
"type": "generated-index",
"description": "Cloud commands docs blog"
}
}
-7
View File
@@ -1,7 +0,0 @@
---
sidebar_position: 2
---
# TimeWeb
Тут частые команды
-7
View File
@@ -1,7 +0,0 @@
---
sidebar_position: 3
---
# Yandex
Тут частые команды
-8
View File
@@ -1,8 +0,0 @@
{
"label": "Docker",
"position": 4,
"link": {
"type": "generated-index",
"description": "Docker commands docs blog"
}
}
-74
View File
@@ -1,74 +0,0 @@
---
sidebar_position: 2
title: Docker commands
---
Тут частые команды
Docker run exec or have entry point use: --entry-point=/bin/bash
```
docker run --rm -it image-name sh
```
## Build args
```
docker build . -t myimage --build-arg ARTIFACTORY_USER=$ARTIFACTORY_USER --build-arg ARTIFACTORY_PASSWORD=$ARTIFACTORY_PASSWORD
```
## Docker run rm exec
```
docker run --rm -it tg_webhook_exporter bash
```
## Docker overlay who use (need install jq)
```
docker inspect $(docker ps -qa) | jq -r 'map([.Name, .GraphDriver.Data.MergedDir]) | .[] | "\(.[0])\t\(.[1])"'
```
## Docker image size
```
docker ps --format '{{.Names}}\n{{.Image}}:{{.Size}}\n' -s
```
## Docker cp
```
docker cp <containerId>:/file/path/within/container /host/path/target
```
## Retag for own registory
Скачать необходимый image docker pull
```
docker pull nginx:1.23.1
```
Изменить tag
```
docker tag nginx:1.23.1 registry.gitlab.example.com/test/nginx:1.23.1
```
Push в артифактори
```
docker push registry.gitlab.example.com/test/nginx:1.23.1
```
## Docker compose run
Запуск тупой команды чтоб контейнер не падал, иногда бывает нужно
version: "3.7"
services:
chatops:
image: registry.gitlab.example.com/test/myubuntu-image:v.0.1
command: tail -F anything
-8
View File
@@ -1,8 +0,0 @@
{
"label": "Git",
"position": 9,
"link": {
"type": "generated-index",
"description": "Github | Gitlab commands docs blog"
}
}
-8
View File
@@ -1,8 +0,0 @@
---
sidebar_position: 3
---
# Gitlab
[Automatically add code reviewers](http://akmalov.com/blog/gitlab-auto-reviewers)
-8
View File
@@ -1,8 +0,0 @@
{
"label": "Helm",
"position": 5,
"link": {
"type": "generated-index",
"description": "Helm commands docs blog"
}
}
-7
View File
@@ -1,7 +0,0 @@
---
sidebar_position: 3
---
# Helm charts
Общее хранилище чартов - [artifacthub.io](https://artifacthub.io)
-21
View File
@@ -1,21 +0,0 @@
---
sidebar_position: 2
title: Helm commands
---
## rollback
История версий (список)
```
helm history podname -n default
```
Откат на выбранную ревизию
```
helm rollback <release> <revision> -n <namespace>
```
```
helm rollback podname -n default
```
Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

-8
View File
@@ -1,8 +0,0 @@
{
"label": "Kubernetes",
"position": 3,
"link": {
"type": "generated-index",
"description": "Kubernetes commands docs blog"
}
}
-48
View File
@@ -1,48 +0,0 @@
---
sidebar_position: 2
title: K8s commands
---
## k8s resources usage
Просмотр потребления ресурсов контейнеров внутри пода
```
kubectl -n name-space top pod --containers _
```
Просмотр ресурсов node
```
kubectl top node --sort-by=cpu
```
in container usage show
```
cat /sys/fs/cgroup/memory/memory.usage_in_bytes
```
limits
```
cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes
```
## k8s top script
Просмотр ресурсов подов выбранного сервиса
```
for pod in $(kubectl -n name-space get po | grep dialogs | awk '{print $1}'); do echo "top ${pod}"; kubectl -n name-space top pod $pod; done
```
## kubectl logs
```
kubectl -n name-space logs -l app=app_name --all-containers --tail=1 -f --max-log-requests=45 | grep -v health
```
kubectl resources container
```
kubectl -n name-space top pod --containers container-5c5968d4f9-bbvrm
```
keydb logs pod
```
kubectl -n name-space logs -l app=app_name --all-containers --tail=1 -f --max-log-requests=45 | grep -v health
```
Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 365 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

-164
View File
@@ -1,164 +0,0 @@
---
sidebar_position: 3
---
# K8s заметки
Мои конспекты по куберу. Описал своими словами, могут быть ошибки или неточности
Ссылка на официальную документацию [kubernetes.io](https://kubernetes.io/docs/home/)
Ниже представлена галерея архитектуры с разных сайтов, суть одна визуализация разная
![Kubernetes Architecture](./components-of-kubernetes.png "Kubernetes Architecture")
![Kubernetes Architecture](./k8s-arch2.png "Kubernetes Architecture")
![Kubernetes Architecture](./k8s-arch3.png "Kubernetes Architecture")
![Kubernetes Architecture](./Kubernetes-components.png "Kubernetes Architecture")
![Kubernetes Architecture](./maxresdefault.jpg "Kubernetes Architecture")
## Компоненты мастера (master node)
### API Server (kube-scheduler)
Основная шина взаимодействия и точка входа для всех запросов. Аутентификация, валидация (линтер)
### Scheduler (kube-scheduler)
Определяет на какой worker ноде создать новый под, в зависимости от требуемых ресурсов и занятости нод. Смотрит и проверяет нагрузку на ноды, по оределенной логике определяет куда назначить под
### Controller (kube controller manager)
Проверяет состояние кластера по API (через kube-api) в etcd. Демон который включается в себя группы контроллеров. Занимается созданием и обслуживанием linux name-space.
Контролируют разные ячейки типо deployment, replicaset, pod. Например если удалить под, а вышего него есть replicsate, deployment с желаемым состоянием под удалится, controller manager видит желаемое состояние ячеек и поднимет новый под.
### Etcd
База данных (хранилище ключ-значение). Хранятся все манифесты, текущее состояние, желаемое состояние. Любая сущность описанная в yml. Для работы необходим кворум (нечетное количество). Один master — один etcd, поэтому для отказоустойчивости желательно иметь 3 мастер ноды. В некоторых случаях выносят за пределы мастера в отдельный кластер БД.
## Компоненты ноды Node (worker node)
### Pod
Базовая сущность k8s, которая группирует контейнеры между собой. Внутри может содержать несколько контейнеров ( контейнеры находятся в одном namespace шарят между собой loopback интерфейс)
### Kubelet
Бинарник, основной компонент k8s существует на каждой worker ноде кластера. Проверят API сервер на предмет описания новых подов, смотрим принес ли controller что нибудь новое, если есть изменения пытается применить их. Например смотрит на новые ноды которые должны быть развернуты на своей ноде. (который назначает scheduler (положил в etcd))
После того как привел к нужному состоянию передает информацию в API сервер. Также сообщает постоянно о состояних подов
### Kube-proxy
Представляет собой контейнер, аналог ривер прокси, отвечает за пересылку и проксирование запросов к уже существующим сервисам или приложениям, в приватной сети самого кубера, по умолчанию использует ipvs (аналог iptables оптимизированный для k8s).
### Optionals Addons
Дополнительные плагины такие как RBAC, kalico (CNI),
## Сущности
### Deployment -> Replicaset -> Pod
Поле kind — сущности представлены и описаны в виде yaml файлов. Записываем то состояние к которму k8s должен привести. (Мы не описываем как наливать чай, а просто говорим какую кружку, какой чай, какого цвета, какой температуры и т.д. нужен как в ansible)
В yaml файл записывают минимальный необходимый набор описаний, остальное докидывает controller
Deployment — набор сценариев который порождает другую сущность replicaset ( а он своб очередь другую сущность pod)
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: name-space
spec:
selector:
matchLabels:
app: nginx
replicas: 5
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginxdemos/hello:0.2
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /
port: 80
readinessProbe:
httpGet:
path: /
port: 80
resources:
limits:
cpu: "0.5"
memory: 128Mi
requests:
cpu: "0.5"
memory: 128Mi
```
### Service
Используется для доступа к подам.
В моем понимании ClusterIP сервис работает как виртуальный IP для доступа к подам и проброса портов внутри кластера, т.к. к IP адресам подов нет смысла подвязываться
А тут имеем статичный сервис который по лейблам сам направит на нужный под.
Так же там по умолчанию выполняется балансировка нагрузки по round-robin
```yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service-cluster-ip
namespace: name-space
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service-nodeport
namespace: name-space
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30000
```
## Пробы (Probes)
Нужны для проверки работоспособности контейнера. Проверкой проб занимается kubelet. Интересная статья про пробы хабр
Их существует три вида:
- Startup
- Liveness
- Readiness
### Startup probe
Производит проверку при старте контейнера, если контейнер запустился без ошибок и его процесс по PID живой значит проверка прошла успешно
### Liveness probe
Выполняется постоянно
### Readiness probe
Производит проверку при старте контейнера, если контейнер запустился без ошибок и его процесс по PID живой значит проверка прошла успешно
### Дополнительно про пробы
Производит проверку при старте контейнера, если контейнер запустился без ошибок и его процесс по PID живой значит проверка прошла успешно
## Пример запроса в API сервер
kubectl если отправляем какой нибудь манифест на создание пода например:
kubectl applay -f test.yml -n name-space
Запрос проходит аутентификацию, валидацию и передает информацию в etcd.
Scheduler через API сервер смотрит изменения etcd, видит что пытаются создать новый под, определяет ноду куда можно его засунуть и отправляет эту информацию в API сервер, а API сервер записывает в etcd
Controller manager в это время контролирует все это добро. Сморит тип kind создает ячейки внутри etcd
Дальше kubelet на соответствующей ноде видит информацию в etcd, что на него хотят загрузить под и пытается это сделать через CRI и результаты и сам процесс через API сервер сообщает в etcd.
-7
View File
@@ -1,7 +0,0 @@
---
sidebar_position: 4
---
# Kubespray
Добавить инфо по kubespray
Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

-8
View File
@@ -1,8 +0,0 @@
{
"label": "Misc",
"position": 12,
"link": {
"type": "generated-index",
"description": "Misc"
}
}
-78
View File
@@ -1,78 +0,0 @@
---
sidebar_position: 3
---
# Bash
## Lograte log gz
обычная архивация
```bash
cat access.log | gzip -c -9 > /home/access.log-20220815.gz
```
Архивация с PV (красиво, наглядно с прогресс баром)
```bash
cat access.log | pv -s $(ls -la /var/log/nginx/access.log | awk '{print $5}') | gzip -c -9 > /home/access.log-20220815.gz
```
## Check port
```bash
nc -zv <host> <port>
```
## SSH menu
Консольная простая менюшка для быстрого подключения к часто используемым серверам
В примере скрипт в зависимости от домена сервера заранее определяет под каким логином подключаться `user` или `admin`
```bash
# !/bin/bash
echo `clear`
USER="user"
ADMUSER="admin"
COLUMNS=1
PS3='Please select server: '
SERVERS=(
'Sentry srv-sentry'
'Prometheus srv-mon'
'Nginx srv-nginx'
'Example1 srv-admin1'
'Example2 srv-admin2'
)
select opt in "${SERVERS[@]}"
do
case $opt in
*admin1 |*admin2 ) # admin login
echo "Connecting ${ADMUSER}@${opt##*}"
ssh $ADMUSER@${opt##* }.akmalov.com
break
;;
*sentry |*mon | *nginx ) #user login
echo "Connecting ${USER}@${opt##*}"
echo "Message for USER"
ssh $USER@${opt##* }.akmalov.com
break
;;
*)
break
;;
esac
done
```
## iptables
Вывод формате команд
```
iptables -S -t nat
```
Список nat
```
iptables -vL -t nat
```
-36
View File
@@ -1,36 +0,0 @@
---
sidebar_position: 4
---
# Kafka
## Вопросы про партиции
1. То есть каждый консьюмер видит не все сообщения в топике, а то только ту часть, которая попала в его партицию?
>Да, это так. Каждый консьюмер в консьюмер-группе читает только из своей выделенной партиции топика.
>Если количество консьюмеров совпадает с количеством партиций в топике, то каждый консьюмер будет читать только из своей партиции, и соответственно не будет видеть сообщения, которые находятся в других партициях.
>
> Это может быть полезно для обработки большого объема данных и для масштабирования консьюмеров.
>
> Однако, если количество консьюмеров не совпадает с количеством партиций, то некоторые партиции будут обрабатываться несколькими консьюмерами.
> Это может быть полезно, если некоторые из партиций генерируют больше данных, чем другие.
>
>Используя партиционность, можно обеспечить балансировку нагрузки между консьюмерами и обеспечить распределенную обработку данных. Это может улучшить производительность и масштабируемость вашей системы.
2. Если нужно, чтобы все консьюмеры видели все сообщения в топике, то они не должны быть в одной группе?
>Нет. Если мы добавим ещё одного консьюмера в группу, то партиции автоматически распределятся между ними.
>Скажем, у нас 3 партиции. c1(consumer1) теперь будет читать сообщения из первой и второй партиции, а c2 — из третьей. Добавив ещё одного консьюмера (c3), мы добьёмся идеального распределения нагрузки, и каждый из консьюмеров в этой группе будет читать данные из одной партиции.
А вот если мы добавим в группу ещё одного консьюмера (c4), то он не будет задействован в обработке сообщений вообще.
>
>Важно понять: внутри одной консьюмер-группы партиции назначаются консьюмерам уникально, чтобы избежать повторной обработки.
>
>Если консьюмеры не справляются с текущим объёмом данных, то следует добавить новую партицию в топик. Только после этого консьюмер c4 начнёт свою работу.
3. Если в один топик пишутся события для разных консьюмеров и они находят нужное им событие по определенному uuid и консьюмеры не объединены в группу, то получается каждый прочтет свое сообщение и тк его прочтут не все консьюмеры, то оно будет лежать в топике, пока не выйдет его время жизни и Кафка сама его не почистит?
>Если 1 партиция, где лежат разного рода данные, тогда создайте разные консюмер-группы под каждый случай, либо делайте разные топики для каждого типа сообщения. Да, кафка удалит сообщение после retention периода
-150
View File
@@ -1,150 +0,0 @@
---
sidebar_position: 10
---
# Markdown Features
Docusaurus supports **[Markdown](https://daringfireball.net/projects/markdown/syntax)** and a few **additional features**.
## Front Matter
Markdown documents have metadata at the top called [Front Matter](https://jekyllrb.com/docs/front-matter/):
```text title="my-doc.md"
// highlight-start
---
id: my-doc-id
title: My document title
description: My document description
slug: /my-custom-url
---
// highlight-end
## Markdown heading
Markdown text with [links](./hello.md)
```
## Links
Regular Markdown links are supported, using url paths or relative file paths.
```md
Let's see how to [Create a page](/bash).
```
```md
Let's see how to [Create a page](./bash.md).
```
**Result:** Let's see how to [Create a page](./bash.md).
## Images
Regular Markdown images are supported.
You can use absolute paths to reference images in the static directory (`static/img/docusaurus.png`):
```md
![Docusaurus logo](/img/docusaurus.png)
```
![Docusaurus logo](/img/docusaurus.png)
You can reference images relative to the current file as well. This is particularly useful to colocate images close to the Markdown files using them:
```md
![Docusaurus logo](./img/docusaurus.png)
```
## Code Blocks
Markdown code blocks are supported with Syntax highlighting.
```jsx title="src/components/HelloDocusaurus.js"
function HelloDocusaurus() {
return (
<h1>Hello, Docusaurus!</h1>
)
}
```
```jsx title="src/components/HelloDocusaurus.js"
function HelloDocusaurus() {
return <h1>Hello, Docusaurus!</h1>;
}
```
## Admonitions
Docusaurus has a special syntax to create admonitions and callouts:
:::tip My tip
Use this awesome feature option
:::
:::danger Take care
This action is dangerous
:::
:::tip My tip
Use this awesome feature option
:::
:::danger Take care
This action is dangerous
:::
## MDX and React Components
[MDX](https://mdxjs.com/) can make your documentation more **interactive** and allows using any **React components inside Markdown**:
```jsx
export const Highlight = ({children, color}) => (
<span
style={{
backgroundColor: color,
borderRadius: '20px',
color: '#fff',
padding: '10px',
cursor: 'pointer',
}}
onClick={() => {
alert(`You clicked the color ${color} with label ${children}`)
}}>
{children}
</span>
);
This is <Highlight color="#25c2a0">Docusaurus green</Highlight> !
This is <Highlight color="#1877F2">Facebook blue</Highlight> !
```
export const Highlight = ({children, color}) => (
<span
style={{
backgroundColor: color,
borderRadius: '20px',
color: '#fff',
padding: '10px',
cursor: 'pointer',
}}
onClick={() => {
alert(`You clicked the color ${color} with label ${children}`);
}}>
{children}
</span>
);
This is <Highlight color="#25c2a0">Docusaurus green</Highlight> !
This is <Highlight color="#1877F2">Facebook blue</Highlight> !
-90
View File
@@ -1,90 +0,0 @@
---
sidebar_position: 6
---
# Mikrotik
## Tips and Tricks
Всякие мелочи
## Mikrotik узнать внешний IP адрес
Иногда возникает необходимость на удаленном устройстве быстро посмотреть внешний IP адрес.
```
/tool fetch url="https://wtfismyip.com/text" keep-result=yes; delay 1s; :put [file get text contents]
```
Одна строка, включает 3 команды.
- GET запрос и сохранение результата
- Задержка для сохранения файла
- Вывод содержимого
## Mikrotik отправить сообщение Telegram
Нужен ТОКЕН бота (создается через @Botfather по инструкции)
Token выглядит примерно так: `1064657353:AAFH1MioTXgrmHGZмAr-XcGE18BShD5ud0Y`
Дальше нужно получить chatID
```
https://api.telegram.org/bot*API_token*/getUpdates
```
Открыть в браузере, где необходимо найти строку **chat id**:
Например:
- API Token: 1064657353:AAFH1MioTXgrmHGZмAr-XcGE18BShD5ud0Y
- chat id: :268900781
**Отправка сообщения через микротик тест бота**
Команда для проверки работоспособности:
```
/tool fetch url="https://api.telegram.org/botAPI_TOKEN/sendMessage\?chat_id=CHAT_ID&text=test"
```
(Подставить свои API_TOKEN и CHAT_ID)
>failure: closing connection: `400 Bad Request`
При такой ошибке надо проверять синтаксис команды
Для использования кириллицы (использовать русские буквы) в Router OS можно использовать UTF кодирование.
Например:
**Упал канал**`%D0%A3%D0%BF%D0%B0%D0%BB+%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB`
Онлайн кодирование [ссылка](http://www.codenet.ru/services/urlencode-urldecode/)
## Выполнение скрипта (команды) ежемесячно на Router OS
Данный скрипт я использую чтобы ежемесячно стирать накопленный трафик на вкладке Queues.
Сброс или обнуление счетчика трафика simple queues
**Описание**
Скрипт каждый день проверяет какое сегодня число и если сегодня «первое» число то выполняет команду
Узнать какой сегодня день (создает глобальную переменную с актуальной датой):
```
:global day [:pick [/system clock get date] 4 6]
```
Условие «если сегодня первое число» то сбросить все счётчики в /queue simple
```
:if ($day="01") do={/queue simple reset-counters-all}
```
Добавляю этот скрипт в расписание **system -> schedule** и запускаю в 00:00:01 с интервалом в один день.
Когда вариант с **schedule** с интервалом в 30d меня не устраивает, и нужно именно каждый новый месяц
-34
View File
@@ -1,34 +0,0 @@
---
sidebar_position: 4
---
# WireGuard
## WireGuard no route local address
При подключении VPN WireGuard весь трафик пойдет через этот туннель
Цель: Не маршрутизировать локальный трафик
Например сети:
- 192.168.0.0/16
- 10.0.0.0/8
Нужно исключить, чтоб не проходили через VPN
В настройках есть поле ``AllowedIPs``, где можно указать какие адреса пойдут через VPN.
Поэтому приходиться делать наоборот и все адреса за исключением нужных, добавить в allowed IP:
```
[Interface]
PrivateKey = PrivateKey
Address = Address
DNS = DNS
[Peer]
PublicKey = PublicKey
PresharedKey = PresharedKey
AllowedIPs = 0.0.0.0/5, 8.0.0.0/7, 11.0.0.0/8, 12.0.0.0/6, 16.0.0.0/4, 32.0.0.0/3, 64.0.0.0/2, 128.0.0.0/3, 160.0.0.0/5, 168.0.0.0/6, 172.0.0.0/12, 172.32.0.0/11, 172.64.0.0/10, 172.128.0.0/9, 173.0.0.0/8, 174.0.0.0/7, 176.0.0.0/4, 192.0.0.0/9, 192.128.0.0/11, 192.160.0.0/13, 192.169.0.0/16, 192.170.0.0/15, 192.172.0.0/14, 192.176.0.0/12, 192.192.0.0/10, 193.0.0.0/8, 194.0.0.0/7, 196.0.0.0/6, 200.0.0.0/5, 208.0.0.0/4, 8.8.8.8/32
Endpoint = Endpoint
```
@@ -1,8 +1,8 @@
{
"label": "Soft",
"label": "Nginx",
"position": 1,
"link": {
"type": "generated-index",
"description": "My Software"
"description": "Nginx commands and docs"
}
}
@@ -1,7 +1,7 @@
---
sidebar_position: 2
title: Nginx commands
---
# Github
Тут частые команды
-8
View File
@@ -1,8 +0,0 @@
{
"label": "Proxmox",
"position": 7,
"link": {
"type": "generated-index",
"description": "Proxmox commands docs blog"
}
}
-91
View File
@@ -1,91 +0,0 @@
---
sidebar_position: 2
title: Proxmox commands
---
## Proxmox Directory
### Конфиги LXC
```
/etc/pve/lxc/
```
### Конфиги VM
```
/etc/pve/qemu-server/
```
## Proxmox Backup
### Backup в директорию
```
vzdump 200 --dumpdir /mnt/backup
```
Можно так же добавить тип:
```
--mode suspend
--mode snapshot
```
## Proxmox Storage
### Подключить директорию (каталог, папку) к LXC
Проброс папки с PVE на LXC.
Открываю конфигурацию контейнера
```
nano /etc/pve/lxc/110.conf
```
Добавляю строку (Mount Point)
```
mp0: /каталог PVE(Node), mp=/каталог на LXC
mp0: /home/dirPVE,mp=/mnt/dirLXC
```
### Подключить реальный физический диск к VM
```
ls -l /dev/disk/by-id
```
Копирую ID необходимого диска и добавляю
```
qm set 592 -scsi2 /dev/disk/by-id/ata-ST3000DM001-1CH166_Z1F41BLC
```
### fstab auto mount
Создаю папку
```
mkdir /mnt/nextcloud
```
Вывожу и копирую UUID диска
```
blkid
nano /etc/fstab
```
Добавляю строку с UUID нужного диска:
```
UUID=9d022d03-a7c1-40a5-92f0-cb6245e93b60 /mnt/nextcloud ext4 defaults 0 0
```
Монтирую и проверяю:
```
mount -a
lsblk
```
-62
View File
@@ -1,62 +0,0 @@
---
sidebar_position: 4
---
# NFS
Заметки для быстрого создания NFS доступа c Promox LXC
```
FOLDER=/mnt/data
```
```
apt install -y nfs-kernel-server
```
```
chown nobody:nogroup $FOLDER
```
```
echo "$FOLDER 10.6.0.0/24(rw,sync,no_subtree_check)" >> /etc/exports
```
```
systemctl restart nfs-kernel-server
```
```
/usr/share/nginx/html
```
```
/mnt/nginx 10.6.0.0/24(rw,sync,no_subtree_check) >> /etc/exports
```
```
systemctl status nfs-kernel-server
```
```bash
cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5)
#
# Example for NFSv2 and NFSv3
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#
/mnt/data 10.6.6.6/24(rw,sync,no_subtree_check)
/mnt/nginx 10.6.6.6/24(rw,sync,no_subtree_check)
/mnt/django 10.6.6.6/24(rw,sync,no_subtree_check,no_root_squash)
```
-7
View File
@@ -1,7 +0,0 @@
---
sidebar_position: 10
---
# Fast api
Тут про Fast API
-8
View File
@@ -1,8 +0,0 @@
{
"label": "Python",
"position": 2,
"link": {
"type": "generated-index",
"description": "Python docs"
}
}
-21
View File
@@ -1,21 +0,0 @@
---
sidebar_position: 1
---
# Install
## Windows
Python download and install [Python.org](https://www.python.org/downloads/)
Poetry install
```
curl -sSL https://install.python-poetry.org | python -
```
pip install
```
pip install black mypy
```
-10
View File
@@ -1,10 +0,0 @@
---
sidebar_position: 3
---
# Python gitlab api
[Документация](https://python-gitlab.readthedocs.io/en/stable/api-usage.html)
## Примеры
-83
View File
@@ -1,83 +0,0 @@
---
sidebar_position: 1
---
# Linux
## Linux cli tools
Подборка консольных утилит которые мне кажутся удобными и полезными
- Название + ссылка на оффициальный сайт или репозиторий
- Краткое описание
- Скрин (если есть)
### top
- **htop** - более красивый top для процессов
- **iotop** - информация по дисковой активности
- **iftop** - сетевая активность
- **ctop** - просмотр docker контейнеров
### [jq](https://github.com/jqlang/jq)
Для работы с JSON в CLI
[![jq](./jq.gif)](./jq.gif)
### [yq](https://github.com/mikefarah/yq)
Для работы с YAML в CLI
### [bat](https://github.com/sharkdp/bat)
Альтернатива для `cat` с подсветкой синтаксиса, интеграция с git и много других полезных фич
[![bat](./bat.png)](./bat.png)
### [peco](https://github.com/peco/peco)
Я бы назвал это интерактивным `grep` - принимает на вход список строк и создает меню с удобной навигцей и поиском
[![peco](./peco.gif)](./peco.gif)
### [httpie](https://github.com/httpie/cli)
Обычно пользуюсь `curl`, но когда нужно часто использовать различные API запросы, то этот инструмент кажется более удобным и простым
[![httpie](./httpie.gif)](./httpie.gif)
### [duf](https://github.com/muesli/duf)
Красивая версия `df` подробная информация по дискам
[![duf](./duf.png)](./duf.png)
### [ncdu](https://github.com/drewcrawford/ncdu)
Улучшенный `du` инструмент для анализа дискового пространства.
[![ncdu](./ncdu.png)](./ncdu.png)
### [frontail](https://github.com/mthenw/frontail)
Для удобного вывода логов по web интерфейсу с полем поиска
Можно не устанавливать и запускать с помощью docker например:
```bash
docker run -d -p 80:9001 -v /var/log:/log mthenw/frontail /log/syslog
```
по IP адресу хоста можно увидеть логи в таком формате:
[![frontail](./frontail.png)](./frontail.png)
Если есть единая точка сбора логов типо ELK, Loki, OpenSearch, то `frontail` врядли пригодиться, но выглядит интересно.
### [iperf](https://github.com/esnet/iperf)
Простой и удобный инструмент для генерации трафика и проверки скорости канала
-7
View File
@@ -1,7 +0,0 @@
---
sidebar_position: 4
---
# Mac
Список ПО
-21
View File
@@ -1,21 +0,0 @@
---
sidebar_position: 2
---
# Windows
Список набор программ
- [VSCode](https://code.visualstudio.com/)
- [Obsidian](https://obsidian.md/)
- [Yandex.Disk](https://disk.yandex.ru/client/disk)
- [WireGuard](https://www.wireguard.com/install/)
- [Deluge](https://dev.deluge-torrent.org/wiki/Download)
- [Telegram](https://desktop.telegram.org/)
- [Google Chrome](https://www.google.com/chrome/)
- [OpenLens](https://github.com/MuhammedKalkan/OpenLens)
При частом переключении между Mac + Windows часто возникается путаница с сочетанями клавиш
[PowerToys](https://github.com/microsoft/PowerToys) показался самым простым для настройки и перезначения клавиш
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1019 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 327 KiB

-30
View File
@@ -1,30 +0,0 @@
---
sidebar_position: 10
---
# Settings
## VSCode
Пример конфига для подключения по SSH key (~/ssh/config)
Remote SSH - Microsoft
```
Host <IP>
HostName <IP>
User <USER>
IdentityFile ~/.ssh/id_rsa
```
maybe rename id_rsa.pub to authorized_keys
## OpenLens
OpenLens extensions (exec and logs)
Для просмотра логов и подключения к контейнерам нужно добавить расширение
```
@alebcay/openlens-node-pod-menu
```