MVP for hosting
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "Template",
|
||||
"position": 6,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Template description"
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"label": "Ansible",
|
||||
"position": 6,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Ansible commands docs blog"
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"label": "Cloud",
|
||||
"position": 8,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Cloud commands docs blog"
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
# TimeWeb
|
||||
|
||||
Тут частые команды
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
# Yandex
|
||||
|
||||
Тут частые команды
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"label": "Docker",
|
||||
"position": 4,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Docker commands docs blog"
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"label": "Git",
|
||||
"position": 9,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Github | Gitlab commands docs blog"
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
---
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
# Gitlab
|
||||
|
||||
|
||||
[Automatically add code reviewers](http://akmalov.com/blog/gitlab-auto-reviewers)
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"label": "Helm",
|
||||
"position": 5,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Helm commands docs blog"
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
# Helm charts
|
||||
|
||||
Общее хранилище чартов - [artifacthub.io](https://artifacthub.io)
|
||||
@@ -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
|
||||
```
|
||||
|
Before Width: | Height: | Size: 28 KiB |
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"label": "Kubernetes",
|
||||
"position": 3,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Kubernetes commands docs blog"
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
```
|
||||
|
||||
|
Before Width: | Height: | Size: 152 KiB |
|
Before Width: | Height: | Size: 365 KiB |
|
Before Width: | Height: | Size: 31 KiB |
@@ -1,164 +0,0 @@
|
||||
---
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
# K8s заметки
|
||||
|
||||
|
||||
Мои конспекты по куберу. Описал своими словами, могут быть ошибки или неточности
|
||||
Ссылка на официальную документацию [kubernetes.io](https://kubernetes.io/docs/home/)
|
||||
|
||||
Ниже представлена галерея архитектуры с разных сайтов, суть одна визуализация разная
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
## Компоненты мастера (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.
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
# Kubespray
|
||||
|
||||
Добавить инфо по kubespray
|
||||
|
Before Width: | Height: | Size: 141 KiB |
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"label": "Misc",
|
||||
"position": 12,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Misc"
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
```
|
||||
@@ -1,36 +0,0 @@
|
||||
---
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
# Kafka
|
||||
|
||||
## Вопросы про партиции
|
||||
|
||||
1. То есть каждый консьюмер видит не все сообщения в топике, а то только ту часть, которая попала в его партицию?
|
||||
|
||||
>Да, это так. Каждый консьюмер в консьюмер-группе читает только из своей выделенной партиции топика.
|
||||
>Если количество консьюмеров совпадает с количеством партиций в топике, то каждый консьюмер будет читать только из своей партиции, и соответственно не будет видеть сообщения, которые находятся в других партициях.
|
||||
>
|
||||
> Это может быть полезно для обработки большого объема данных и для масштабирования консьюмеров.
|
||||
>
|
||||
> Однако, если количество консьюмеров не совпадает с количеством партиций, то некоторые партиции будут обрабатываться несколькими консьюмерами.
|
||||
> Это может быть полезно, если некоторые из партиций генерируют больше данных, чем другие.
|
||||
>
|
||||
>Используя партиционность, можно обеспечить балансировку нагрузки между консьюмерами и обеспечить распределенную обработку данных. Это может улучшить производительность и масштабируемость вашей системы.
|
||||
|
||||
|
||||
2. Если нужно, чтобы все консьюмеры видели все сообщения в топике, то они не должны быть в одной группе?
|
||||
|
||||
|
||||
>Нет. Если мы добавим ещё одного консьюмера в группу, то партиции автоматически распределятся между ними.
|
||||
>Скажем, у нас 3 партиции. c1(consumer1) теперь будет читать сообщения из первой и второй партиции, а c2 — из третьей. Добавив ещё одного консьюмера (c3), мы добьёмся идеального распределения нагрузки, и каждый из консьюмеров в этой группе будет читать данные из одной партиции.
|
||||
А вот если мы добавим в группу ещё одного консьюмера (c4), то он не будет задействован в обработке сообщений вообще.
|
||||
>
|
||||
>Важно понять: внутри одной консьюмер-группы партиции назначаются консьюмерам уникально, чтобы избежать повторной обработки.
|
||||
>
|
||||
>Если консьюмеры не справляются с текущим объёмом данных, то следует добавить новую партицию в топик. Только после этого консьюмер c4 начнёт свою работу.
|
||||
|
||||
|
||||
3. Если в один топик пишутся события для разных консьюмеров и они находят нужное им событие по определенному uuid и консьюмеры не объединены в группу, то получается каждый прочтет свое сообщение и тк его прочтут не все консьюмеры, то оно будет лежать в топике, пока не выйдет его время жизни и Кафка сама его не почистит?
|
||||
|
||||
>Если 1 партиция, где лежат разного рода данные, тогда создайте разные консюмер-группы под каждый случай, либо делайте разные топики для каждого типа сообщения. Да, кафка удалит сообщение после retention периода
|
||||
@@ -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
|
||||

|
||||
```
|
||||
|
||||

|
||||
|
||||
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
|
||||

|
||||
```
|
||||
|
||||
## 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> !
|
||||
@@ -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 меня не устраивает, и нужно именно каждый новый месяц
|
||||
@@ -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
|
||||
|
||||
Тут частые команды
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"label": "Proxmox",
|
||||
"position": 7,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Proxmox commands docs blog"
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
```
|
||||
@@ -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)
|
||||
```
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
sidebar_position: 10
|
||||
---
|
||||
|
||||
# Fast api
|
||||
|
||||
Тут про Fast API
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"label": "Python",
|
||||
"position": 2,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Python docs"
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
```
|
||||
@@ -1,10 +0,0 @@
|
||||
---
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
# Python gitlab api
|
||||
|
||||
[Документация](https://python-gitlab.readthedocs.io/en/stable/api-usage.html)
|
||||
|
||||
## Примеры
|
||||
|
||||
@@ -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.gif)
|
||||
|
||||
|
||||
### [yq](https://github.com/mikefarah/yq)
|
||||
|
||||
Для работы с YAML в CLI
|
||||
|
||||
|
||||
|
||||
### [bat](https://github.com/sharkdp/bat)
|
||||
|
||||
Альтернатива для `cat` с подсветкой синтаксиса, интеграция с git и много других полезных фич
|
||||
|
||||
|
||||
[](./bat.png)
|
||||
|
||||
|
||||
|
||||
### [peco](https://github.com/peco/peco)
|
||||
|
||||
Я бы назвал это интерактивным `grep` - принимает на вход список строк и создает меню с удобной навигцей и поиском
|
||||
|
||||
[](./peco.gif)
|
||||
|
||||
|
||||
### [httpie](https://github.com/httpie/cli)
|
||||
|
||||
Обычно пользуюсь `curl`, но когда нужно часто использовать различные API запросы, то этот инструмент кажется более удобным и простым
|
||||
|
||||
[](./httpie.gif)
|
||||
|
||||
|
||||
### [duf](https://github.com/muesli/duf)
|
||||
Красивая версия `df` подробная информация по дискам
|
||||
[](./duf.png)
|
||||
|
||||
|
||||
### [ncdu](https://github.com/drewcrawford/ncdu)
|
||||
Улучшенный `du` инструмент для анализа дискового пространства.
|
||||
[](./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.png)
|
||||
|
||||
Если есть единая точка сбора логов типо ELK, Loki, OpenSearch, то `frontail` врядли пригодиться, но выглядит интересно.
|
||||
|
||||
### [iperf](https://github.com/esnet/iperf)
|
||||
|
||||
Простой и удобный инструмент для генерации трафика и проверки скорости канала
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
# Mac
|
||||
|
||||
Список ПО
|
||||
@@ -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) показался самым простым для настройки и перезначения клавиш
|
||||
|
||||
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 123 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 1019 KiB |
|
Before Width: | Height: | Size: 1.0 MiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 327 KiB |
@@ -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
|
||||
```
|
||||
|
||||