Compare commits

...

72 Commits

Author SHA1 Message Date
98004bcb67 docs: create DevOps/PostgreSQL/instruments 2025-06-17 09:33:17 +00:00
f7e0663d3e docs: upload DevOps/attachments/photo_2025-05-21_20-48-32.jpg 2025-06-17 09:32:50 +00:00
756607fbb9 docs: upload DevOps/attachments/photo_2025-05-21_20-48-32_(2).jpg 2025-06-17 09:32:50 +00:00
ce9454d518 docs: delete attachments/photo_2025-05-21_20-48-32_(2).jpg 2025-06-17 09:32:33 +00:00
038d71be6e docs: delete attachments/photo_2025-05-21_20-48-32.jpg 2025-06-17 09:32:29 +00:00
039eeb40e5 docs: upload attachments/photo_2025-05-21_20-48-32.jpg 2025-06-17 09:32:06 +00:00
cd480c69a9 docs: upload attachments/photo_2025-05-21_20-48-32_(2).jpg 2025-06-17 09:32:06 +00:00
34d17c9c9b docs: update DevOps/Docker/converter 2025-06-17 09:21:01 +00:00
351d80d3ff docs: create DevOps/Docker/converter 2025-06-17 09:20:18 +00:00
5a017ac47a docs: upload DevOps/attachments/photo_2025-05-16_16-20-54.jpg 2025-06-17 09:19:31 +00:00
f438203912 docs: upload DevOps/attachments/photo_2025-05-16_16-20-53.jpg 2025-06-17 09:19:29 +00:00
ce0d02d0b0 docs: upload DevOps/attachments/photo_2025-05-16_16-20-54_(2).jpg 2025-06-17 09:19:29 +00:00
caf80d3c20 docs: update Hypervisors/Proxmox/Cluster/DestroyCluster 2025-05-22 09:28:32 +00:00
17f6f8ac98 docs: update Hypervisors/Proxmox/Cluster/DestroyCluster 2025-05-21 11:38:58 +00:00
902ee9d5fb docs: update Hypervisors/Proxmox/Cluster/DestroyCluster 2025-05-21 11:32:20 +00:00
3905acf5b1 docs: create Hypervisors/Proxmox/Cluster/DestroyCluster 2025-05-21 11:32:12 +00:00
92a2df6b73 docs: update sysadmin/supermicro/fan 2025-05-19 09:26:40 +00:00
5118268045 docs: create sysadmin/supermicro/fan 2025-05-19 08:49:28 +00:00
a9c1d87b38 docs: update DevOps/Clickhouse/Cluster/1-Install-Clickhouse-cluster 2025-05-15 20:11:18 +00:00
3310c3143e docs: update DevOps/Clickhouse/Cluster/1-Install-Clickhouse-cluster 2025-05-15 20:10:46 +00:00
91e73ffbef docs: update DevOps/Clickhouse/Cluster/1-Install-Clickhouse-cluster 2025-05-15 20:09:24 +00:00
3f10edf636 docs: create DevOps/Clickhouse/Cluster/3-Create-manual 2025-05-15 20:07:43 +00:00
5d7f0eb094 docs: update DevOps/Clickhouse/Cluster/0-Bases-and-query 2025-05-15 20:02:43 +00:00
6864921ba2 docs: create DevOps/Clickhouse/Cluster/0-Bases-and-query 2025-05-15 20:01:53 +00:00
695d095133 docs: create DevOps/Clickhouse/Cluster/1-Install-Clickhouse-cluster 2025-05-15 18:05:05 +00:00
f8c68fc017 docs: rename Monitoring/VictoriaLogs/VictoriaLogs-setup to Monitoring/VictoriaLogs-setup 2025-04-28 07:28:04 +00:00
24027d9d7c docs: update Monitoring/VictoriaLogs/VictoriaLogs-setup 2025-04-28 07:27:35 +00:00
ca2c0ecb0d docs: rename sysadmin/Monitoring/Gatus to Monitoring/Gatus 2025-04-28 07:26:53 +00:00
3c01fb220c docs: create Monitoring/VictoriaLogs/VictoriaLogs-setup 2025-04-28 07:26:05 +00:00
7813c906b6 docs: rename monitoring/victorialogs.png to monitoring/victorialogs-3.png 2025-04-28 07:25:29 +00:00
54e0280d36 docs: rename monitoring/image.png to monitoring/victorialogs.png 2025-04-28 07:25:14 +00:00
8291eabd96 docs: upload monitoring/image.png 2025-04-28 07:25:07 +00:00
5f53344c8d docs: rename monitoring/image.png to monitoring/victorialogs-2.png 2025-04-28 07:25:00 +00:00
fffbc19277 docs: upload monitoring/image.png 2025-04-28 07:24:46 +00:00
5eab9c24f8 docs: rename monitoring/image.png to monitoring/victorialogs-1.png 2025-04-28 07:24:36 +00:00
82f1fe3ebe docs: upload monitoring/image.png 2025-04-28 07:24:22 +00:00
8b96c3784f docs: create NAS/Synology/Disable-check-hdd 2025-04-21 09:52:04 +00:00
ad86c1410a docs: update Hypervisors/Proxmox/Disable-ProxMox-Subscription-Notice 2025-04-11 07:57:43 +00:00
52ea4eb4c8 docs: create Hypervisors/Proxmox/Disable-ProxMox-Subscription-Notice 2025-04-11 07:53:57 +00:00
d56d13dfa4 docs: create NAS/Synology/synology_app_mover 2025-04-05 12:08:53 +00:00
ec880e8d5d docs: rename NAS/scrutiny to NAS/Synology/scrutiny 2025-04-05 10:11:30 +00:00
49c3a582f1 docs: rename NAS/install-xpenology to NAS/Synology/install-xpenology 2025-04-05 10:11:06 +00:00
a400048ef3 docs: rename NAS/cupsd to NAS/Synology/cupsd 2025-04-05 10:10:53 +00:00
672a33d6f9 docs: rename NAS/syn-console-command to NAS/Synology/syn-console-command 2025-04-05 10:10:31 +00:00
e5977484af docs: update NAS/syn-console-command 2025-04-05 10:10:04 +00:00
62fe0e0ca1 docs: rename NAS/Synology-support-HEVC to NAS/Synology/Synology-support-HEVC 2025-04-05 10:09:15 +00:00
1ea6770013 docs: rename NAS/Qemu-for-Synology to NAS/Synology/Qemu-for-Synology 2025-04-05 10:08:43 +00:00
8047021a44 docs: rename NAS/brtfs-or-ext-for-synology to NAS/Synology/brtfs-or-ext-for-synology 2025-04-05 10:08:28 +00:00
198d6d22a7 docs: create NAS/brtfs-or-ext-for-synology 2025-04-05 10:07:57 +00:00
17f4d4caf2 docs: update DevOps/Gitlab/Minimal-install 2025-03-25 18:40:58 +00:00
3cee2b82ac docs: create DevOps/Gitlab/Minimal-install 2025-03-25 18:40:07 +00:00
e9e886bd5d docs: create DevOps/ELK/EFK-rotate 2025-03-13 16:02:32 +00:00
3e4620a388 docs: create DevOps/ELK/Rotation-logs-ILM 2025-03-13 08:17:08 +00:00
f1bfc53bb5 docs: create NAS/scrutiny 2025-03-12 10:21:38 +00:00
83d57cfc36 docs: rename Hackintosh/Soft to Apple/Hackintosh/Opencore 2025-02-14 16:49:38 +00:00
5351b235dc docs: create Apple/MacOS/Create-flash-on-m3 2025-02-14 16:48:04 +00:00
ddace8434d docs: update NAS/syn-console-command 2024-11-27 20:02:26 +00:00
e771369149 docs: update NAS/syn-console-command 2024-11-27 18:26:34 +00:00
05c40b0ee6 docs: update NAS/syn-console-command 2024-11-27 17:23:05 +00:00
92fac48655 docs: update NAS/syn-console-command 2024-11-27 15:21:27 +00:00
a5726a2d72 docs: update NAS/syn-console-command 2024-11-27 14:47:21 +00:00
0b2f00cbb4 docs: create NAS/syn-console-command 2024-11-27 08:35:42 +00:00
7c8dd413c3 docs: rename NAS/NAS/cupsd to NAS/cupsd 2024-10-29 09:05:33 +00:00
bae611e68d docs: create NAS/NAS/cupsd 2024-10-29 09:05:08 +00:00
5fd2d3ae93 docs: rename nas/{265af3fe-c0fe-4400-bc1b-f4e4cc6acebe}.png to nas/cups4.png 2024-10-29 08:58:51 +00:00
f9bbb41e70 docs: upload nas/{265af3fe-c0fe-4400-bc1b-f4e4cc6acebe}.png 2024-10-29 08:58:39 +00:00
2871dc4b22 docs: rename nas/{bb5ebb2d-1a92-4ad1-b9b0-64f8b0ec6254}.png to nas/cups3.png 2024-10-29 08:58:07 +00:00
1831e7f03a docs: upload nas/{bb5ebb2d-1a92-4ad1-b9b0-64f8b0ec6254}.png 2024-10-29 08:57:56 +00:00
12fca342c5 docs: rename nas/{e0b22c78-2b8e-4ec3-97ee-0c4174bc2f9c}.png to nas/cups2.png 2024-10-29 08:57:27 +00:00
1551ebccaa docs: upload nas/{e0b22c78-2b8e-4ec3-97ee-0c4174bc2f9c}.png 2024-10-29 08:57:18 +00:00
70ca44f15d docs: rename nas/{9bec395a-dddb-40a3-8858-4f6fd738b022}.png to nas/cups1.png 2024-10-29 08:55:07 +00:00
6af90cffb7 docs: upload nas/{9bec395a-dddb-40a3-8858-4f6fd738b022}.png 2024-10-29 08:54:54 +00:00
37 changed files with 2073 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
<!--
title: Создание загрузочной флешки с macOS
description:
published: true
date: 2025-02-14T16:47:57.135Z
tags: macos, m3, flash
editor: ckeditor
dateCreated: 2025-02-14T16:47:57.135Z
-->
<h1>Установка на ноуте с arm процессорами</h1>
<p><code>cd /Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/</code></p>
<p><code>codesign -s - -f createinstallmedia</code></p>
<p>с результатом<br>createinstallmedia: replacing existing signature</p>
<p>После этого повторяем команду для создания и все идет.</p>
<p><code>sudo /Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/macos</code></p>
<h1>Установка High Sierra</h1>
<p>Делал на новой ОС - "Секвойя"(MacBook Air M1), там дополнительно перед командами пришлось в настройках безопаности разрешить выполнение программы:<br>Настройки - конфиденциальности и безопасность-управление приложениями. Здес нужно добавить из раздела "программы" появившуюся там программу установки "Установка MacOS High Sierra" (!Важно, для тех кто не знает(если что то я не знал - не часто вожусьс МакОС) - в раздел "Программы" "Установка MacOS High Sierra" - добавляется простым копированием из подмонтированного .dmg-файла образа установочного.<br>Только после этого сработали команды что выше и флэшка создалась.<br>Также не забывам, что потом при загрузке с нее на старом Мак-е и попытке установки, можем получить ошибку: "Экземпляр программы "установка macOS high sierra" поврежден и не может быть использован для установки". Решается просто отключением Wi-Fi и заданием даты в терминале. И только потом жмем установку ОС.</p>

View File

@@ -0,0 +1,164 @@
---
title: 0. Основы и запросы
description:
published: true
date: 2025-05-15T20:02:37.600Z
tags: clickhouse
editor: markdown
dateCreated: 2025-05-15T20:01:45.285Z
---
## Структура кластера
### Найдено на просторах инета:
##### Выбор решения:
- Если **диск загружен на запись (INSERT)****шардирование (Distributed)**.
- Если **диск загружен на чтение (SELECT)****репликация (Replicated)**.
- Если **один сервер, но много дисков****JBOD или RAID 0/10**.
#### Реализуем такую структуру тестового кластера:
- сервер clickhouse-1
- сервер clickhouse-2
- сервер clickhouse-keeper
Для того, чтобы это было надежно и работало быстро с записью в БД, необходимо сделать репликацию (Replicated) таблиц и распределенный (Distributed) доступ к таблицам.
Если делать несколько шардов (shard) в настройках кластера, то это значит, что часть данных будет находится на одном сервере, другая часть на другом. При выходе из строя сервера мы потеряем всю базу.
Поэтому настраиваем shard1 на обоих серверах, а также replica1 и replica2 для дублирования данных на серверах.
### Репликация поддерживается только для таблиц семейства MergeTree:
https://clickhouse.com/docs/ru/engines/table-engines/mergetree-family/replication
- ReplicatedMergeTree
- ReplicatedSummingMergeTree
- ReplicatedReplacingMergeTree
- ReplicatedAggregatingMergeTree
- ReplicatedCollapsingMergeTree
- ReplicatedVersionedCollapsingMergeTree
- ReplicatedGraphiteMergeTree
### Для одиночного сервера и кластера
#### Получение списка всех баз данных на сервере
```sql
SHOW DATABASES;
```
#### Просмотр всех таблиц в конкретной базе default
```sql
SHOW TABLES FROM default;
```
#### Получить запрос на создание таблицы из существующей
```sql
show create table default.event;
```
#### Создание базы данных
```sql
CREATE DATABASE IF NOT EXISTS my_database ENGINE = Atomic;
```
Создает новую базу данных с именем `my_database`. Если такая база уже существует, ничего не произойдет благодаря условию `IF NOT EXISTS`.
Параметр `ENGINE = Atomic` используется для новых версий ClickHouse и позволяет создавать транзакционно безопасные базы данных. В ранних версиях использовался простой синтаксис без указания движка.
#### Создание таблицы
```sql
CREATE TABLE my_table (
event_date Date,
user_id UInt32,
page_views Int32,
revenue Float64
)
ENGINE = MergeTree()
ORDER BY (event_date);
```
##### Вставка данных
```sql
INSERT INTO my_table VALUES ('2023-08-01', 1, 10, 100.5), ('2023-08-02', 2, 15, 150.75);
```
##### Выборка данных
```sql
SELECT * FROM my_table WHERE event_date >= '2023-08-01' AND event_date <= '2023-08-31';
```
#### Показ структуры таблицы
```sql
DESCRIBE TABLE my_database.my_table;
```
или подробнее:
```sql
SELECT * FROM system.columns WHERE table='my_table' AND database='my_database';
```
### Узнать сколько занимают места базы
```sql
SELECT
database,
formatReadableSize(sum(bytes_on_disk)) AS total_size
FROM system.parts
WHERE active
GROUP BY database
ORDER BY sum(bytes_on_disk) DESC;
```
#### Узнать сколько занимают места таблицы в базе
default
```sql
SELECT
name AS table_name,
formatReadableSize(total_bytes) AS size_readable,
total_rows AS rows_count
FROM system.tables
WHERE database = 'default'
ORDER BY total_bytes DESC;
```
system
```sql
SELECT
name AS table_name,
formatReadableSize(total_bytes) AS size_readable,
total_rows AS rows_count
FROM system.tables
WHERE database = 'system'
ORDER BY total_bytes DESC;
```
#### Очистка базы event_replicated
```sql
TRUNCATE TABLE default.event_replicated;
```
#### Очистка старых данных от определенной даты
```sql
ALTER TABLE my_table DELETE WHERE event_date < '2023-08-01';
```
#### Безопасное удаление таблицы
```sql
DROP TABLE IF EXISTS my_database.my_table;
```
Безопасно удаляет указанную таблицу, если она существует.
### Для кластера
#### Вывести список серверов в кластере
```sql
SELECT hostName() FROM clusterAllReplicas('smvu2_cluster', 'system', 'one')
```
#### Получение списка Replicated таблиц
```sql
SELECT
database,
name AS table,
engine
FROM system.tables
WHERE engine LIKE 'Replicated%';
```
#### Получение списка Distributed таблиц
```sql
SELECT
database,
name AS table,
engine
FROM system.tables
WHERE engine LIKE 'Distributed%';
```
#### Проверить распределение данных базы event на серверах кластера
```sql
SELECT
hostName() AS host,
count() AS count
FROM clusterAllReplicas(smvu2_cluster, default.event)
GROUP BY host;
```
#### Удалить таблицу в кластере
```sql
DROP TABLE event_replicated ON CLUSTER smvu2_cluster SYNC;
```

View File

@@ -0,0 +1,228 @@
---
title: 1. Создание кластера Clickhouse
description:
published: true
date: 2025-05-15T20:11:12.215Z
tags: clickhouse, cluster
editor: markdown
dateCreated: 2025-05-15T18:04:57.423Z
---
https://clickhouse.com/docs/guides/sre/keeper/clickhouse-keeper
## Установка и настройка clickhouse, clickhouse-keeper
### Установка clickhouse-keeper
```bash
apt-get install -y apt-transport-https ca-certificates curl gnupg
curl -fsSL 'https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key' | sudo gpg --dearmor -o /usr/share/keyrings/clickhouse-keyring.gpg
ARCH=$(dpkg --print-architecture)
echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg arch=${ARCH}] https://packages.clickhouse.com/deb stable main" | sudo tee /etc/apt/sources.list.d/clickhouse.list
apt-get update
apt-get install -y clickhouse-keeper
```
#### Готовим конфиг clickhouse-keeper
```
nano /etc/clickhouse-keeper/keeper_config.xml
```
```xml
<clickhouse>
<logger>
<level>warning</level>
<log>/var/log/clickhouse-keeper/clickhouse-keeper.log</log>
<errorlog>/var/log/clickhouse-keeper/clickhouse-keeper.err.log</errorlog>
<size>1000M</size>
<count>10</count>
<!-- <console>1</console> --> <!-- Default behavior is autodetection (log to console if not daemon mode and is tty) -->
</logger>
<max_connections>4096</max_connections>
<listen_host>0.0.0.0</listen_host>
<listen_host>::1</listen_host>
<keeper_server>
<tcp_port>9181</tcp_port>
<server_id>1</server_id>
<log_storage_path>/var/lib/clickhouse/coordination/logs</log_storage_path>
<snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path>
<coordination_settings>
<operation_timeout_ms>10000</operation_timeout_ms>
<session_timeout_ms>30000</session_timeout_ms>
<raft_logs_level>warning</raft_logs_level>
<compress_logs>true</compress_logs>
</coordination_settings>
<!-- enable sanity hostname checks for cluster configuration (e.g. if localhost is used with remote endpoints) -->
<hostname_checks_enabled>false</hostname_checks_enabled>
<raft_configuration>
<server>
<id>1</id>
<hostname>localhost</hostname>
<port>9234</port>
</server>
</raft_configuration>
</keeper_server>
</clickhouse>
```
#### Пароль пользователя
```
nano /etc/clickhouse-server/users.d/default-password.xml
```
```xml
<yandex>
<users>
<default>
<password>SuperPass</password>
<networks>
<ip>::/0</ip>
<ip>127.0.0.1</ip>
<ip>172.16.212.0/24</ip>
</networks>
</default>
</users>
</yandex>
```
### Готовим конфиги clickhouse на серверах SMVU2-DEV14 и SMVU2-Click-DEV
```bash
nano /etc/clickhouse-server/config.d/remote_servers.xml
```
##### server 1
```xml
<yandex>
<display_name>smvu2_cluster node 1</display_name>
<remote_servers replace="true">
<smvu2_cluster>
<!--<secret>mysecretphrase</secret> -->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>172.16.212.14</host>
<port>9000</port>
<priority>1</priority>
<secure>0</secure>
<user>default</user>
<password>SuperPass</password>
</replica>
<replica>
<host>172.16.212.42</host>
<port>9000</port>
<priority>2</priority>
<secure>0</secure>
<user>default</user>
<password>SuperPass</password>
</replica>
</shard>
</smvu2_cluster>
</remote_servers>
</yandex>
```
```
nano /etc/clickhouse-server/config.d/shard.xml
```
```xml
<yandex>
<macros>
<shard>1</shard>
<replica>replica1</replica>
</macros>
</yandex>
```
##### server 2
```xml
<yandex>
<display_name>smvu2_cluster node 2</display_name>
<remote_servers replace="true">
<smvu2_cluster>
<!--<secret>mysecretphrase</secret> -->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>172.16.212.42</host>
<port>9000</port>
<priority>2</priority>
<secure>0</secure>
<user>default</user>
<password>SuperPass</password>
</replica>
<replica>
<host>172.16.212.14</host>
<port>9000</port>
<priority>1</priority>
<secure>0</secure>
<user>default</user>
<password>SuperPass</password>
</replica>
</shard>
</smvu2_cluster>
</remote_servers>
</yandex>
```
```
nano /etc/clickhouse-server/config.d/shard.xml
```
```xml
<yandex>
<macros>
<shard>1</shard>
<replica>replica2</replica>
</macros>
</yandex>
```
```
nano /etc/clickhouse-server/config.d/keeper.xml
```
```xml
<yandex>
<zookeeper>
<node>
<host>172.16.212.41</host>
<port>9181</port>
</node>
</zookeeper>
</yandex>
```
```
nano /etc/clickhouse-server/config.d/distributed_ddl.xml
```
```xml
<yandex>
<distributed_ddl>
<task_max_lifetime>86400</task_max_lifetime>
<profile>default</profile>
<cleanup_delay>60</cleanup_delay>
<max_workers>16</max_workers>
</distributed_ddl>
</yandex>
```
### Проверить сервера, что они в кластере
#### Показать кластер
```sql
SHOW clusters;
```
#### Вывести список серверов в кластере
```sql
SELECT hostName() FROM clusterAllReplicas('smvu2_cluster', 'system', 'one')
```
#### Keeper status
```sql
SELECT * FROM system.zookeeper WHERE path = '/';
```

View File

@@ -0,0 +1,646 @@
---
title: 3. Создание таблиц вручную
description:
published: true
date: 2025-05-15T20:07:34.738Z
tags: clickhouse
editor: markdown
dateCreated: 2025-05-15T20:07:34.738Z
---
Можно создать все таблицы для кластера вручную.
Запрашиваем структуру каждой таблицы, создаем под другим именем и копируем данные с исходника.
##### Может возникнуть проблема, что таблицы содержат много данных, поэтому внизу статьи будет решение
## Создаем реплицированные таблицы
**Разберем первую таблицу подробно**
### 1. api_request_log_replicated
Запрашиваем структуру
```sql
show create table default.api_request_log
```
Выход:
```sql
CREATE TABLE default.api_request_log
(
`uuid` UUID DEFAULT '00000000-0000-0000-0000-000000000000',
`ver` UInt8,
`request_ts` DateTime64(3) DEFAULT '0000000000.000',
`duration` Float64,
`endpoint` String,
`method` FixedString(5),
`status_code` UInt32,
`remote_addr` String,
`username` Nullable(String),
`error` Nullable(String),
`request_body` Nullable(String) TTL toDateTime(request_ts) + toIntervalMonth(1),
`query_params` Nullable(String) TTL toDateTime(request_ts) + toIntervalMonth(1),
`response_body` Nullable(String) TTL toDateTime(request_ts) + toIntervalMonth(1)
)
ENGINE = MergeTree(ver)
PARTITION BY toYYYYMM(request_ts)
ORDER BY uuid
SETTINGS index_granularity = 8192;
```
Дорабатываем запрос, чтобы получилась на выходе реплицируемая таблица
```sql
CREATE TABLE default.api_request_log_replicated ON CLUSTER smvu2_cluster
(
`uuid` UUID DEFAULT '00000000-0000-0000-0000-000000000000',
`ver` UInt8,
`request_ts` DateTime64(3) DEFAULT '0000000000.000',
`duration` Float64,
`endpoint` String,
`method` FixedString(5),
`status_code` UInt32,
`remote_addr` String,
`username` Nullable(String),
`error` Nullable(String),
`request_body` Nullable(String) TTL toDateTime(request_ts) + toIntervalMonth(1),
`query_params` Nullable(String) TTL toDateTime(request_ts) + toIntervalMonth(1),
`response_body` Nullable(String) TTL toDateTime(request_ts) + toIntervalMonth(1)
)
ENGINE = ReplicatedReplacingMergeTree(
'/clickhouse/tables/{shard}/default/api_request_log_replicated',
'{replica}',
ver
)
PARTITION BY toYYYYMM(request_ts)
ORDER BY uuid
SETTINGS index_granularity = 8192;
```
Копируем данные
```sql
INSERT INTO default.api_request_log_replicated
SELECT * FROM default.api_request_log
```
### 2. event_replicated
```sql
show create table default.event
```
```sql
CREATE TABLE default.event_replicated ON CLUSTER smvu2_cluster
(
`event_id` UUID,
`unipoll_id` UUID,
`sensor_id` UUID,
`sensor_type_id` UUID,
`sensor_type_name` String,
`sensor_activation_status_name` String,
`sensor_logic_status_id` UUID,
`sensor_logic_status_name` String,
`sensor_comment` Nullable(String),
`command` String,
`priority_name` String,
`pub_ts` DateTime,
`sub_ts` DateTime64(3, 'Europe/Moscow'),
`state_id` UInt8,
`state_name` String,
`status_id` UInt8,
`status_name` String,
`unitype_id` UInt16,
`unitype_name` String,
`system_id` UInt16,
`system_short_name` String,
`system_name` String,
`checked` UInt8,
`object_id` UUID,
`object_type_name` String,
`data_id` UInt8,
`value` Nullable(String),
`raw_value` Nullable(String),
`data` String,
`region_id` UUID,
`region_name` String,
`complex_id` UUID,
`complex_name` String,
`collector_id` Nullable(UUID),
`collector_name` Nullable(String),
`control_room_id` Nullable(UUID),
`control_room_name` Nullable(String),
`picket_id` Nullable(UUID),
`picket_name` Nullable(String),
`picket_n` Nullable(UInt32),
`cstate_id` UUID,
`cstate_name` String,
`cstate_color_id` UInt8,
`sub_ms` UInt64,
`linked_channel_state` Nullable(String),
`on_guard` Nullable(UInt8),
`internal_id` Nullable(String),
`floor_number` Nullable(Int32)
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/default/event_replicated',
'{replica}'
)
PARTITION BY toYYYYMM(pub_ts)
ORDER BY (priority_name, sensor_type_id, cstate_id, object_id, sensor_id, pub_ts, sub_ts, event_id)
SETTINGS index_granularity = 8192;
```
Копируем данные
```sql
INSERT INTO default.event_replicated
SELECT * FROM default.event
```
### 3. event_automation_replicated
```sql
show create table default.event_automation
```
```sql
CREATE TABLE default.event_automation_replicated ON CLUSTER smvu2_cluster
(
`event_id` UUID DEFAULT '00000000-0000-0000-0000-000000000000',
`unipoll_id` UUID DEFAULT '00000000-0000-0000-0000-000000000000',
`automation_id` UUID DEFAULT '00000000-0000-0000-0000-000000000000',
`automation_name` String,
`automation_mode` UInt8,
`pub_ts` DateTime DEFAULT '0000000000',
`sub_ts` DateTime64(3) DEFAULT '0000000000.000',
`sub_ms` UInt64,
`state_id` UInt8,
`state_name` String,
`status_id` UInt8,
`unitype_id` UInt8,
`unitype_name` String,
`group_id` UUID DEFAULT '00000000-0000-0000-0000-000000000000',
`group_name` String,
`data` String,
`cstate_id` UUID DEFAULT '00000000-0000-0000-0000-000000000000',
`cstate_name` String,
`cstate_color_id` UInt8
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/default/event_automation_replicated',
'{replica}'
)
PARTITION BY toYYYYMMDD(pub_ts)
ORDER BY (event_id, pub_ts, sub_ts)
SETTINGS index_granularity = 8192;
```
Копируем данные
```sql
INSERT INTO default.event_automation_replicated
SELECT * FROM default.event_automation
```
### 4. event_confirmation_replicated
```sql
show create table default.event_confirmation
```
```sql
CREATE TABLE default.event_confirmation_replicated ON CLUSTER smvu2_cluster
(
`uuid` UUID,
`event_id` UUID,
`reason` String DEFAULT '',
`event_checked` Int8,
`username` String,
`datetime` DateTime,
`confirmation_group` String,
`node_id` UUID
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/default/event_confirmation_replicated',
'{replica}'
)
PARTITION BY toYYYYMM(datetime)
ORDER BY datetime
SETTINGS index_granularity = 8192;
```
Копируем данные
```sql
INSERT INTO default.event_confirmation_replicated
SELECT * FROM default.event_confirmation
```
### 5. event_objects_replicated
```sql
show create table default.event_objects
```
```sql
CREATE TABLE default.event_objects_replicated ON CLUSTER smvu2_cluster
(
`event_id` UUID,
`node_id` UUID,
`pub_ts` DateTime,
`sub_ts` DateTime64(3, 'UTC'),
`cstate_id` UUID,
`source_id` UUID,
`source_name` String DEFAULT '',
`source_type_id` UUID,
`event_data` String,
`complex_id` UUID
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/default/event_objects_replicated',
'{replica}'
)
PARTITION BY toYYYYMM(pub_ts)
PRIMARY KEY event_id
ORDER BY (event_id, pub_ts, sub_ts)
SETTINGS index_granularity = 8192;
```
Копируем данные
```sql
INSERT INTO default.event_objects_replicated
SELECT * FROM default.event_objects
```
### 6. infi_clickhouse_orm_migrations_replicated
```sql
show create table default.infi_clickhouse_orm_migrations
```
```sql
CREATE TABLE default.infi_clickhouse_orm_migrations_replicated ON CLUSTER smvu2_cluster
(
`package_name` String,
`module_name` String,
`applied` Date DEFAULT '1970-01-01'
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/default/infi_clickhouse_orm_migrations_replicated',
'{replica}'
)
PARTITION BY toYYYYMM(applied)
ORDER BY (package_name, module_name)
SETTINGS index_granularity = 8192;
```
Копируем данные
```sql
INSERT INTO default.infi_clickhouse_orm_migrations_replicated
SELECT * FROM default.infi_clickhouse_orm_migrations
```
### 7. unchecked_event_replicated
```sql
show create table default.unchecked_event
```
```sql
CREATE TABLE default.unchecked_event_replicated ON CLUSTER smvu2_cluster
(
`event_id` UUID,
`unipoll_id` Nullable(UUID),
`sensor_id` Nullable(UUID),
`sensor_type_id` Nullable(UUID),
`sensor_type_name` Nullable(String),
`sensor_activation_status_name` Nullable(String),
`sensor_logic_status_id` Nullable(UUID),
`sensor_logic_status_name` Nullable(String),
`sensor_comment` Nullable(String),
`command` Nullable(String),
`priority_name` Nullable(String),
`pub_ts` Nullable(DateTime),
`sub_ts` DateTime64(3),
`state_id` Nullable(UInt8),
`state_name` Nullable(String),
`status_id` Nullable(UInt8),
`status_name` Nullable(String),
`unitype_id` Nullable(UInt16),
`unitype_name` Nullable(String),
`system_id` Nullable(UInt16),
`system_short_name` Nullable(String),
`system_name` Nullable(String),
`checked` Nullable(UInt8),
`object_id` Nullable(UUID),
`object_type_name` Nullable(String),
`data_id` Nullable(UInt8),
`data` Nullable(String),
`region_id` Nullable(UUID),
`region_name` Nullable(String),
`complex_id` Nullable(UUID),
`complex_name` Nullable(String),
`collector_id` Nullable(UUID),
`collector_name` Nullable(String),
`control_room_id` Nullable(UUID),
`control_room_name` Nullable(String),
`picket_id` Nullable(UUID),
`picket_name` Nullable(String),
`picket_n` Nullable(UInt32),
`cstate_id` Nullable(UUID),
`cstate_name` Nullable(String),
`cstate_color_id` Nullable(UInt8),
`sub_ms` Nullable(UInt64),
`linked_channel_state` Nullable(String),
`on_guard` Nullable(UInt8),
`internal_id` Nullable(String),
`floor_number` Nullable(Int32),
`sign` Int8,
`value` Nullable(String),
`raw_value` Nullable(String)
)
ENGINE = ReplicatedCollapsingMergeTree(
'/clickhouse/tables/{shard}/default/unchecked_event_replicated',
'{replica}',
sign
)
PARTITION BY toYYYYMM(sub_ts)
PRIMARY KEY event_id
ORDER BY event_id
SETTINGS index_granularity = 8192;
```
Копируем
```sql
INSERT INTO default.unchecked_event_replicated
SELECT * FROM default.unchecked_event;
```
### 8. unchecked_objects_event_replicated
```sql
show create table default.unchecked_objects_event;
```
```sql
CREATE TABLE default.unchecked_objects_event_replicated ON CLUSTER smvu2_cluster
(
`event_id` UUID,
`node_id` Nullable(UUID),
`complex_id` Nullable(UUID),
`pub_ts` Nullable(DateTime),
`sub_ts` DateTime64(3, 'UTC'),
`cstate_id` Nullable(UUID),
`source_id` Nullable(UUID),
`source_name` Nullable(String),
`source_type_id` Nullable(UUID),
`event_data` Nullable(String),
`sign` Int8
)
ENGINE = ReplicatedCollapsingMergeTree(
'/clickhouse/tables/{shard}/default/unchecked_objects_event_replicated',
'{replica}',
sign
)
PARTITION BY toYYYYMM(sub_ts)
PRIMARY KEY event_id
ORDER BY event_id
SETTINGS index_granularity = 8192;
```
Копируем
```sql
INSERT INTO default.unchecked_objects_event_replicated
SELECT * FROM default.unchecked_objects_event;
```
### Проверка состояния репликации после создания:
```sql
SELECT database, table, is_leader, total_replicas, active_replicas
FROM system.replicas
WHERE database = 'default'
```
### Узнаем и сравниваем сколько занимают места таблицы в базе default
```sql
SELECT
name AS table_name,
formatReadableSize(total_bytes) AS size_readable,
total_rows AS rows_count
FROM system.tables
WHERE database = 'default'
ORDER BY total_bytes DESC;
```
### Переименовываем исходные таблицы
```sql
rename table api_request_log to api_request_log_old;
rename table event to event_old;
rename table event_objects to event_objects_old;
rename table event_confirmation to event_confirmation_old;
rename table audit_new to audit_new_old;
rename table event_automation to event_automation_old;
rename table infi_clickhouse_orm_migrations to infi_clickhouse_orm_migrations_old;
rename table unchecked_event to unchecked_event_old;
rename table unchecked_objects_event to unchecked_objects_event_old;
```
### Создаем Distributed-таблицы
```sql
CREATE TABLE default.event ON CLUSTER smvu2_cluster AS default.event_replicated
ENGINE = Distributed(smvu2_cluster, default, api_request_log_replicated, rand());
```
```sql
CREATE TABLE default.event ON CLUSTER smvu2_cluster AS default.event_replicated
ENGINE = Distributed(smvu2_cluster, default, event_replicated, rand());
```
```sql
CREATE TABLE default.audit_new ON CLUSTER smvu2_cluster AS default.audit_new_replicated
ENGINE = Distributed(smvu2_cluster, default, audit_new_replicated, rand());
```
```sql
CREATE TABLE default.event_objects ON CLUSTER smvu2_cluster AS default.event_objects_replicated
ENGINE = Distributed(smvu2_cluster, default, event_objects_replicated, rand());
```
```sql
CREATE TABLE default.event_automation ON CLUSTER smvu2_cluster AS default.event_automation_replicated
ENGINE = Distributed(smvu2_cluster, default, event_automation_replicated, rand());
```
```sql
CREATE TABLE default.event_confirmation ON CLUSTER smvu2_cluster AS default.event_confirmation_replicated
ENGINE = Distributed(smvu2_cluster, default, event_confirmation_replicated, rand());
```
```sql
CREATE TABLE default.infi_clickhouse_orm_migrations ON CLUSTER smvu2_cluster AS default.infi_clickhouse_orm_migrations_replicated
ENGINE = Distributed(smvu2_cluster, default, infi_clickhouse_orm_migrations_replicated, rand());
```
```sql
CREATE TABLE default.unchecked_event ON CLUSTER smvu2_cluster AS default.unchecked_event_replicated
ENGINE = Distributed(smvu2_cluster, default, unchecked_event_replicated, rand());
```
```sql
CREATE TABLE default.unchecked_objects_event ON CLUSTER smvu2_cluster AS default.unchecked_objects_event_replicated
ENGINE = Distributed(smvu2_cluster, default, unchecked_objects_event_replicated, rand());
```
### Решение проблемы размера таблицы
#### 1. Используя ограничение отправляемых строк, прикладываю скрипт, который делает в автоматическом режиме
```bash
#!/bin/bash
# Список таблиц для репликации
TABLES=(
api_request_log
audit_new
event
event_automation
event_confirmation
event_objects
infi_clickhouse_orm_migrations
)
PASSWORD="q1"
BATCH_SIZE=100000 # Размер порции для вставки
MAX_THREADS=4 # Максимальное количество потоков для вставки
for table in "${TABLES[@]}"; do
replicated_table="${table}_replicated"
echo "Processing $table to $replicated_table"
# 1. Получаем общее количество строк
total_rows=$(clickhouse-client --password "$PASSWORD" --query="
SELECT count() FROM remote('localhost', 'default', '$table')")
echo "Total rows to copy: $total_rows"
# 2. Копируем данные порциями
for ((offset=0; offset<total_rows; offset+=BATCH_SIZE)); do
echo "Copying rows $((offset+1))-$((offset+BATCH_SIZE))..."
clickhouse-client --password "$PASSWORD" --query="
INSERT INTO default.$replicated_table
SELECT * FROM remote('localhost', 'default', '$table')
LIMIT $BATCH_SIZE OFFSET $offset
SETTINGS
max_insert_threads=$MAX_THREADS,
max_memory_usage='10Gi'"
if [ $? -ne 0 ]; then
echo "Error copying batch $((offset/BATCH_SIZE+1))"
break
fi
done
# 3. Проверяем количество скопированных строк
copied_rows=$(clickhouse-client --password "$PASSWORD" --query="
SELECT count() FROM default.$replicated_table")
echo "Successfully copied $copied_rows/$total_rows rows from $table to $replicated_table"
done
```
#### 2. Копирование с помощью программы clickhouse-copier
Создается конфиг подключения к кластеру (keeper)
config.xml
```xml
<yandex>
<logger>
<level>warning</level>
<log>/var/log/clickhouse-server/clickhouse-copier.log</log>
<errorlog>/var/log/clickhouse-server/clickhouse-copier.err.log</errorlog>
</logger>
<zookeeper>
<!-- Для ClickHouse Keeper (рекомендуется) -->
<node>
<host>172.16.212.41</host>
<port>9181</port>
</node>
</zookeeper>
<distributed_ddl>
<path>/clickhouse/task_queue/ddl</path>
</distributed_ddl>
<http_port>9999</http_port>
</yandex>
```
Создается папка tasks и там размещаются файлы для каждой таблицы, например api_request_log.xml
```xml
<yandex>
<!-- Configuration of clusters as in an ordinary server config -->
<remote_servers>
<source_cluster>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>172.16.212.14</host>
<port>9000</port>
<user>default</user>
<password>q1</password>
<secure>0</secure>
</replica>
</shard>
</source_cluster>
<destination_cluster>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>172.16.212.14</host>
<port>9000</port>
<user>default</user>
<password>q1</password>
<secure>0</secure>
</replica>
</shard>
</destination_cluster>
</remote_servers>
<!-- How many simultaneously active workers are possible. If you run more workers superfluous workers will sleep. -->
<max_workers>2</max_workers>
<!-- Setting used to fetch (pull) data from source cluster tables -->
<settings_pull>
<readonly>1</readonly>
</settings_pull>
<!-- Setting used to insert (push) data to destination cluster tables -->
<settings_push>
<readonly>0</readonly>
</settings_push>
<!-- Common setting for fetch (pull) and insert (push) operations. Also, copier process context uses it.
They are overlaid by <settings_pull/> and <settings_push/> respectively. -->
<settings>
<connect_timeout>3</connect_timeout>
<!-- Sync insert is set forcibly, leave it here just in case. -->
<insert_distributed_sync>1</insert_distributed_sync>
</settings>
<tables>
<!-- A table task, copies one table. -->
<event>
<!-- Source cluster name (from <remote_servers/> section) and tables in it that should be copied -->
<cluster_pull>source_cluster</cluster_pull>
<database_pull>default</database_pull>
<table_pull>api_request_log</table_pull>
<!-- Destination cluster name and tables in which the data should be inserted -->
<cluster_push>destination_cluster</cluster_push>
<database_push>default</database_push>
<table_push>api_request_log_replicated</table_push>
<engine>
ENGINE = ReplicatedReplacingMergeTree(
'/clickhouse/tables/{shard}/default/api_request_log_replicated',
'{replica}',
ver
)
PARTITION BY toYYYYMM(request_ts)
ORDER BY uuid
SETTINGS index_granularity = 8192;
</engine>
<sharding_key>rand()</sharding_key>
</event>
</tables>
</yandex>
```
В каждом файле меняется название базы в разделе **tables**
После этого запускается копирование, где --task-path должен быть уникальным для каждой таблицы
```bash
clickhouse-copier --config config.xml --task-file ./tasks/api_request_log.xml --task-path /clickhouse/copier/task1
```

View File

@@ -0,0 +1,44 @@
---
title: Конвертация строки в compose
description:
published: true
date: 2025-06-17T09:20:55.103Z
tags: docker
editor: markdown
dateCreated: 2025-06-17T09:20:07.483Z
---
Я попал на сайт к какому-то девопсу, где были материалы по Playwright. Я немного походил по нему и набрёл на раздел DevTools (https://ray.run/tools). Он там собрал то ли свои, то ли просто open source инструменты для решения простых прикладных задач. Вроде ничего особенного, но некоторые вещи я просто не знал, что вообще существуют. Всегда их делал вручную.
Покажу сразу на примерах, что мне показалось полезным:
- Docker Run to Docker Compose Converter (https://ray.run/tools/docker-run-to-docker-compose)
Отправляем в форму однострочник с docker run и получаем файл для docker compose. Вроде мелочь, но я всегда это делал вручную. Не думал, что кому-то придёт в голову написать конвертер.
- Docker Compose to Docker Run Converter (https://ray.run/tools/docker-compose-to-docker-run)
И соответственно в обратную сторону преобразование из docker compose в однострочник для docker run. Не припоминаю, чтобы мне приходилось такие преобразования делать, но в тему к первому упоминаю.
- Bash Command Formatter (https://ray.run/tools/bash-command-formatter)
Эта штука тоже очень понравилась. Она длинный однострочник разбивает на строки с переходами через \ То есть вот такую колбасу:
```
curl -v --url "smtp://mail.server.ru:25" --mail-from "root@server.ru" --mail-rcpt "user@gmail.com" --user 'root@server.ru:password123' --upload-file ~/mail.txt
```
Нарезает на кусочки:
```
curl -v \
 --url "smtp://mail.server.ru:25" \
 --mail-from "root@server.ru" \
 --mail-rcpt "user@gmail.com" \
 --user 'root@server.ru:password123' \
 --upload-file ~/mail.txt
```
Я тоже всегда это вручную делал, особенно для публикации сюда. Можно упростить себе задачу.
- URL Extractor (https://ray.run/tools/url-extractor)
Просто кидаешь сюда любой текст, а на выходе получаешь набор ссылок, если они в нём присутствуют.
Там много всяких конвертеров и анализаторов синтаксиса для json, yaml, toml, csv. Не стал обращать на них внимание, так как их существует десятки. Обычно просто в гугле ищут что-то подобное, когда надо преобразовать. Посмотрите список, может вам что-то ещё приглянётся. Меня впечатлили только эти четыре штуки.
![photo_2025-05-16_16-20-53.jpg](/DevOps/attachments/photo_2025-05-16_16-20-53.jpg)
![photo_2025-05-16_16-20-54.jpg](/DevOps/attachments/photo_2025-05-16_16-20-54.jpg)
![photo_2025-05-16_16-20-54_(2).jpg](/DevOps/attachments/photo_2025-05-16_16-20-54_(2).jpg)

49
DevOps/ELK/EFK-rotate.md Normal file
View File

@@ -0,0 +1,49 @@
---
title: EFK - ротация логов fluent-bit
description:
published: true
date: 2025-03-13T16:02:22.898Z
tags: elk, efk, fluent-bit, rotate
editor: markdown
dateCreated: 2025-03-13T16:02:22.898Z
---
# Ротация логов fluent-bit
Не получилось сделать ротацию логов, если индекс имеет текущую дату, получилось с помощью порядокового номера
> Нужно в конфиге флюента в разделе [OUTPUT] сделать такие параметры:
Logstash_Format Off
Index smvu2-test-stand-docker
## Запросы в EFK:
После запуска контейнера лог уже отправляется в EFK и создается индекс, поэтому нужно сначала его удалить
```json
DELETE /smvu2-test-stand-docker
```
Создаем шаблон
```json
PUT _index_template/smvu2-test-stand-docker-template
{
"index_patterns": [
"smvu2-test-stand-docker-*"
],
"composed_of": ["smvu2-common-settings"],
"template": {
"settings": {
"index.lifecycle.name": "smvu2-policy",
"index.lifecycle.rollover_alias": "smvu2-test-stand-docker"
}
}
}
```
Ну и создаем индекс с алиасом, куда будет прилетать лог
```json
PUT smvu2-test-stand-docker-000001
{
"aliases": {
"smvu2-test-stand-docker": {
"is_write_index": true
}
}
}
```

View File

@@ -0,0 +1,146 @@
---
title: Ротация логов с помощью Lificycle
description: ILM
published: true
date: 2025-03-13T08:16:59.504Z
tags: ilm, elk, efk
editor: markdown
dateCreated: 2025-03-13T08:16:59.504Z
---
# Ротация логов в ELK
Конечно! Давайте разберем настройку ротации логов с помощью ILM (Index Lifecycle Management) в Elasticsearch простым языком. Это пошаговая инструкция, которая поможет вам настроить автоматическое управление жизненным циклом индексов (логов).
---
### **1. Что такое ротация логов с ILM?**
Ротация логов — это процесс автоматического создания новых индексов (например, когда текущий индекс становится слишком большим или старым) и удаления старых индексов, чтобы освободить место. ILM помогает автоматизировать этот процесс.
---
### **2. Основные шаги настройки ILM для ротации логов:**
#### **Шаг 1: Создайте алиас для индексов**
Алиас — это "псевдоним", который будет указывать на текущий активный индекс. Все новые данные будут писаться в индекс, на который указывает этот алиас.
Пример:
```bash
PUT _aliases
{
"actions": [
{
"add": {
"index": "logs-2023.10.01-000001", # текущий индекс
"alias": "logs-alias" # алиас
}
}
]
}
```
---
#### **Шаг 2: Создайте политику ILM**
Политика ILM определяет, что делать с индексами на разных этапах их жизни (например, когда переходить на новый индекс, когда удалять старые данные).
Пример политики:
```bash
PUT _ilm/policy/logs-policy
{
"policy": {
"phases": {
"hot": { # этап "горячих" данных
"actions": {
"rollover": { # ротация индекса
"max_size": "50gb", # ротация при достижении 50 ГБ
"max_age": "7d" # или через 7 дней
}
}
},
"delete": { # этап удаления
"min_age": "30d", # удалить через 30 дней
"actions": {
"delete": {} # действие — удалить индекс
}
}
}
}
}
```
---
#### **Шаг 3: Создайте шаблон индекса**
Шаблон индекса автоматически применяет настройки (например, политику ILM и алиас) к новым индексам, которые соответствуют определенному шаблону имени.
Пример шаблона:
```bash
PUT _index_template/logs-template
{
"index_patterns": ["logs-*"], # шаблон имени индекса
"template": {
"settings": {
"index.lifecycle.name": "logs-policy", # применяем политику ILM
"index.lifecycle.rollover_alias": "logs-alias" # указываем алиас
}
}
}
```
---
#### **Шаг 4: Создайте начальный индекс**
Создайте первый индекс, который будет использоваться для записи данных. Убедитесь, что он соответствует шаблону и имеет алиас.
Пример:
```bash
PUT logs-2023.10.01-000001
{
"aliases": {
"logs-alias": {} # назначаем алиас
}
}
```
---
#### **Шаг 5: Настройте сбор логов**
Убедитесь, что ваши логи (например, из Filebeat, Logstash или другого источника) пишутся в алиас `logs-alias`. Это гарантирует, что данные будут попадать в текущий активный индекс.
---
#### **Шаг 6: Проверка работы ILM**
- Когда текущий индекс достигнет 50 ГБ или пройдет 7 дней, ILM создаст новый индекс (например, `logs-2023.10.08-000002`) и перенаправит запись на него.
- Старые индексы будут автоматически удаляться через 30 дней.
---
### **3. Как проверить, что все работает?**
- Проверьте статус ILM:
```bash
GET _ilm/status
```
- Посмотрите информацию по конкретному индексу:
```bash
GET logs-2023.10.01-000001/_ilm/explain
```
- Убедитесь, что новые индексы создаются, а старые удаляются.
---
### **4. Пример полного цикла:**
1. Создаете алиас `logs-alias` и первый индекс `logs-2023.10.01-000001`.
2. Данные начинают писаться в `logs-2023.10.01-000001`.
3. Через 7 дней или при достижении 50 ГБ создается новый индекс `logs-2023.10.08-000002`, и данные начинают писаться туда.
4. Через 30 дней индекс `logs-2023.10.01-000001` автоматически удаляется.
---
### **5. Частые ошибки:**
- **Алиас не указан:** Убедитесь, что алиас указан в шаблоне индекса и в самом индексе.
- **Политика не применяется:** Проверьте, что политика ILM указана в шаблоне индекса.
- **Нет данных для ротации:** Убедитесь, что данные пишутся в алиас.
---
Если все настроено правильно, ILM будет автоматически управлять вашими индексами, и вам не придется вручную заниматься ротацией логов. 😊

View File

@@ -0,0 +1,103 @@
---
title: Gitlab minimal install
description:
published: true
date: 2025-03-25T18:40:52.824Z
tags: gitlab
editor: markdown
dateCreated: 2025-03-25T18:39:58.350Z
---
Популярный open source продукт, который можно развернуть на своём оборудовании, Gitlab требует для своей работы приличное количество ресурсов. Для того, чтобы он в установке по умолчанию работал бодрячком лучше всего начать с 4 CPU и 8 GB оперативной памяти. Можно выделить 4 GB, но будет заметно тормозить, иногда 500-е ошибки выдавать.
Для того, чтобы иметь возможность использовать Gitlab для единоличного использования, либо очень небольшого коллектива, многие из стандартных компонентов и настроек программного комплекса можно безболезненно отключить. В документации есть отдельная статья на этот счёт:
⇨ Running GitLab in a memory-constrained environment (https://docs.gitlab.com/omnibus/settings/memory_constrained_envs.html) (Запуск GitLab в среде с ограниченным объемом памяти)
Следуя этим рекомендация, можно заставить работать систему с использованием всего 2 GB оперативной памяти. Если вы запускаете его для себя на арендованном железе, то можно получить существенную экономию ресурсов.
Я взял виртуальную машину с 1 CPU и 2 GB памяти и попробовал на ней запустить Gitlab. Что для этого нужно сделать?
1⃣ Подключаем 1 GB свопа.
```
# dd if=/dev/zero of=/swap bs=1024 count=1000000
# mkswap /swap
# chmod 0600 /swap
# swapon /swap
```
Добавляем в /etc/fstab:
`/swap swap swap defaults 0 0`
2⃣ Меняем параметр swappiness:
`# sysctl vm.swappiness=10`
Добавляем в /etc/sysctl.conf:
`vm.swappiness=10`
3⃣ Устанавливаем Gitlab.
```
# curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | bash
# EXTERNAL_URL="http://10.20.1.36" apt-get install gitlab-ce
````
4⃣ Отключаем службу puma, которая помогает обрабатывает конкурентные запросы. Без большой нагрузки можно обойтись без неё. В /etc/gitlab/gitlab.rb добавляем:
`puma['worker_processes'] = 0`
5⃣ Уменьшаем число фоновых процессов Sidekiq:
`sidekiq['concurrency'] = 10`
6⃣ Оптимизируем Gitaly. Туда же в конфиг добавляем:
```json
gitaly['configuration'] = {
  concurrency: [
   {
    'rpc' => "/gitaly.SmartHTTPService/PostReceivePack",
    'max_per_repo' => 3,
   }, {
    'rpc' => "/gitaly.SSHService/SSHUploadPack",
    'max_per_repo' => 3,
   },
  ],
}
gitaly['env'] = {
 'GITALY_COMMAND_SPAWN_MAX_PARALLEL' => '2'
}
```
❗️Обращаю ваше внимание, что я убрал из этого раздела настройки, касающиеся cgroups. В инструкции судя по всему какая-то ошибка. Если их оставить, то сокет gitaly не поднимается. А в интерфейсе при создании каких-либо сущностей, например, нового проекта, вылетает 502 ошибка. И это не зависит от выделенных ресурсов.
7⃣ Отключаем мониторинг:
`prometheus_monitoring['enable'] = false`
8⃣ Уменьшаем потребление памяти процессам GitLab:
```
gitlab_rails['env'] = {
 'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000'
}
gitaly['env'] = {
 'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000'
}
```
9⃣ Перезапускаем Gitlab:
`# gitlab-ctl reconfigure`
🔟 Идём в веб интерфейс и отключаем в настройках мониторинга метрики Prometheus: Admin Area ⇨ Settings ⇨ Metrics and profiling ⇨ Metrics - Prometheus ⇨ отключаем Enable Prometheus Metrics.
После перезапуска Gitlab будет очень долго подниматься. Но в итоге заработает. Смотрим потребление памяти и проверяем, как всё работает:
`# free -h`
Более подробно всё это описано по ссылке в статье из начала заметки. Для комфортной работы лучше всё же добавить до 2CPU и 3GB памяти. Тогда всё это будет бодро работать с предложенными параметрами. Если этого не сделать, то иногда будете видеть 500-е ошибки.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.

View File

@@ -0,0 +1,82 @@
---
title: Инструменты для обслуживания postgresql
description:
published: true
date: 2025-06-17T09:33:07.672Z
tags: postgresql
editor: markdown
dateCreated: 2025-06-17T09:33:07.672Z
---
Расскажу про парочку инструментов, которые упростят обслуживание сервера PostgreSQL. Начну с наиболее простого - pgBadger (https://pgbadger.darold.net/examples/sample.html). Это анализатор лога, который на его основе генерирует отчёты в формате html. На выходе получаются одиночные html файлы, которые можно просто открыть в браузере. Сделано всё аккуратно и добротно, легко настраивается, отчёты наглядные и информационные.
🔹Чтобы было что анализировать, необходимо включить логирование интересующих вас событий. Для разовой отладки это всё можно включать на ходу, либо постоянно через файл конфигурации `postgresql.conf` и перезапуск сервера. Он обычно хорошо прокомментирован. Вас будут интересовать параметры, начинающие с log_*. Они собраны все в отдельном блоке. Для примера я включил почти всё:
```
log_min_duration_statement = 0
log_checkpoints = on
log_connections = on
log_disconnections = on
log_duration = on
log_line_prefix = '%m [%p] %q%u@%d '
log_lock_waits = on
log_temp_files = 0
log_timezone = 'Europe/Moscow'
```
Вся включенная статистика стала писаться в общий лог-файл `/var/log/postgresql/postgresql-17-main.log`. С ним и будем работать. Устанавливаем pgBadger:
```
# wget https://github.com/darold/pgbadger/archive/refs/tags/v13.1.tar.gz
# tar xzvf v13.1.tar.gz
# cd pgbadger-*
# apt install make
# make && make install
```
Анализируем лог файл:
```
# pgbadger /var/log/postgresql/postgresql-17-main.log
```
Тут же в директории, где его запускали, увидите файл out.html. Забирайте его к себе и смотрите. Там будет информация с общей статистикой сервера, информация по запросам и их типам, времени исполнения, подключениям, по пользователям, базам и хостам откуда подключались и много всего остального.
PgBadger удобен тем, что по сути это одиночный скрипт на Perl. Можно включить логирование в конфигурации, применить её через `SELECT pg_reload_conf();` без перезапуска сервера СУБД. Пособирать некоторое время данные, забрать лог и анализировать его. Логирование отключить и снова перечитать конфиг. В итоге всё будет сделано без перезапуска сервера.
🔹Второй инструмент - PgHero (https://github.com/ankane/pghero), он показывает примерно то же самое, только в режиме реального времени и работает в виде веб сервиса. Для него уже надо создавать пользователя, настраивать доступ, отдельную базу. Немного другой подход. Надо будет дёргать сервер с СУБД.
Надо перейти в консоль и создать необходимые сущности:
```sql
# su postgres
# psql
> CREATE USER pghero WITH PASSWORD 'pgheropass';
> CREATE DATABASE pgherodb OWNER pghero;
> \q
```
Разрешаем этому пользователю подключаться. Добавляем в `pg_hba.conf` строку:
```
host pgherodb pghero 172.17.0.0/24 md5
```
`172.17.0.0/24` - подсеть, из которой будет подключаться PgHero. В данном случае это Docker контейнер, запущенный на этом же хосте. PostgreSQL должен принимать запросы с локального IP адреса, к которому будет доступ из Docker сети. Можно добавить в конфиг `postgresql.conf` параметр:
```
listen_addresses = 'localhost,172.17.0.1'
```
Перезапускаем PotgreSQL:
```
# systemctl restart postgresql
```
Запускаем PgHero в Docker контейнере:
```
# docker run -ti -e DATABASE_URL=postgres://pghero:pgheropass@172.17.0.1:5432/pgherodb -p 8080:8080 ankane/pghero
```
Идём на порт севера 8080, где запущен контейнер и смотрим информацию о PostgreSQL. Если у вас не настроено расширение **pg_stat_statements**, которое использует PgHero для сбора статистики, то установите его. Для этого в конфигурацию `postgresql.conf` добавьте параметры:
```
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.track = all
pg_stat_statements.max = 10000
track_activity_query_size = 2048
```
Перезапустите Postgresql и выполните в консоли СУБД:
```sql
> CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
> GRANT pg_read_all_stats TO pghero;
```
Теперь можно возвращаться в веб интерфейс и смотреть информацию. По умолчанию, пользователь pghero не будет видеть запросы других пользователей, если ему не дать права superuser. Это можно исправить, выдав ему набор прав и ролей из этой инструкции (https://github.com/ankane/pghero/blob/master/guides/Permissions.md).
![photo_2025-05-21_20-48-32.jpg](/DevOps/attachments/photo_2025-05-21_20-48-32.jpg)
![photo_2025-05-21_20-48-32_(2).jpg](/DevOps/attachments/photo_2025-05-21_20-48-32_(2).jpg)

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

View File

@@ -0,0 +1,20 @@
<!--
title: Удаление кластера Proxmox
description:
published: true
date: 2025-05-21T11:31:51.721Z
tags: proxmox, cluster
editor: ckeditor
dateCreated: 2025-05-21T11:31:51.721Z
-->
<p>systemctl&nbsp;stop&nbsp;pve-cluster.service</p>
<p>systemctl&nbsp;stop&nbsp;corosync.service</p>
<p>pmxcfs -l</p>
<p>rm -rf /etc/pve/corosync.conf</p>
<p>rm -rf /etc/corosync/</p>
<p>killall pmxcfs</p>
<p>systemctl&nbsp;restart&nbsp;pve-cluster.service</p>
<p>cd&nbsp;/etc/pve/nodes</p>
<p>ls</p>
<p>rm -rf /etc/pve/nodes/pve-01/</p>

View File

@@ -0,0 +1,68 @@
---
title: Как удалить ноду из кластера Proxmox?
description:
published: true
date: 2025-05-22T09:28:25.522Z
tags: proxmox, cluster
editor: markdown
dateCreated: 2025-05-21T11:31:51.721Z
---
Перед удалением ноды важно убедиться в том, что все виртуальные машины и данные безопасно мигрированы или созданы резервные копии, чтобы избежать потери данных и поддерживать целостность кластера.
1. Остановите службу "pve-cluster" на изолируемой ноде
```
systemctl stop pve-cluster.service
systemctl stop corosync.service
```
2. Запустите команду для перевода файловой системы кластера на изолируемой ноде в локальный режим
```
pmxcfs -l
```
3. Запустите команду для удаления файлов конфигурации Corosync:
```
rm -rf /etc/pve/corosync.conf
rm -rf /etc/corosync/*
```
4. Запустите команду для перезапуска службы файловой системы кластера:
```
killall pmxcfs
systemctl start pve-cluster.service
```
5. Удалите файлы неисправной ноды:
```
cd /etc/pve/nodes
ls
rm -rf /etc/pve/nodes/pve2 # Path corresponding to the faulty node
```
6. Очистите остаточную информацию о кластере:
```
pvecm delnode NodeName
```
Здесь приведена информация по устранению распространенных проблем, с которыми вы можете столкнуться.
Нода не отвечает: Если нода, которую вы хотите удалить, не отвечает из-за проблем с сетью или по другим причинам, вы можете использовать опцию Force для принудительного удаления ее из кластера:
```
pvecm delnode <NODE_NAME> --force
```
Застревание процесса удаления: В случае возникновения проблем с выполнением команды или застревания процесса во время удаления, вы можете диагностировать проблему, просмотрев системный журнал:
```
journalctl -xe
```
После устранения потенциальной проблемы попробуйте удалить ноду еще раз.
```
systemctl stop pve-cluster.service
systemctl stop corosync.service
pmxcfs -l
rm -rf /etc/pve/corosync.conf
rm -rf /etc/corosync/
killall pmxcfs
systemctl restart pve-cluster.service
cd /etc/pve/nodes
ls
rm -rf /etc/pve/nodes/pve-01/
pvecm delnode pve-01
pvecm delnode pve-01 --force
systemctl restart corosync.service
```

View File

@@ -0,0 +1,14 @@
---
title: Disable ProxMox Subscription Notice
description:
published: true
date: 2025-04-11T07:57:37.999Z
tags: proxmox
editor: markdown
dateCreated: 2025-04-11T07:53:49.776Z
---
Proxmox 8.3
```bash
sed -Ezi.bak "s/(function\(orig_cmd\) \{)/\1\n\torig_cmd\(\);\n\treturn;/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js && systemctl restart pveproxy.service
```

View File

@@ -0,0 +1,80 @@
---
title: VictoriaLogs - установка и настройка
description:
published: true
date: 2025-04-28T07:27:29.722Z
tags: victorialogs
editor: markdown
dateCreated: 2025-04-28T07:25:56.957Z
---
Пару лет назад у VictoriaMetrics вышел продукт, который является частью именного стека, VictoriaLogs. Руки не доходили раньше на него посмотреть и вот дошли. Сразу скажу, что всё очень понравилось за простоту, функциональность и удобство. Покажу сразу с примерами.
Отдельно перечислю особенности VictoriaLogs:
▪️По своей сути это одиночный бинарник, который можно сконфигурировать ключами запуска, не нужен даже конфигурационный файл.
▪️В бинарнике есть всё, что надо для сбора и просмотра логов: веб интерфейс, метрики для мониторинга за системой, все типы приёмников логов.
▪️Для бэкапа достаточно скопировать директорию с данными, например, с помощью rsync. То есть вообще никаких проблем и заморочек с бэкапом.
▪️Есть плагин для datasource в Grafana, чтобы делать оттуда запросы к логам, а также готовый дашборд для визуализации метрик хранилища.
▪️Простая, короткая документация, где есть всё необходимое для запуска и настройки.
Покажу примеры сбора логов в VictoriaLogs от Journald, Syslog и Vector. Для этого подготовил небольшой docker-compose.yml с некоторыми параметрами:
```yaml
services:
victoria-logs:
image: victoriametrics/victoria-logs:latest
volumes:
- ./victoria-logs-data:/victoria-logs-data
command:
- --storageDataPath=/victoria-logs-data
- --retentionPeriod=90d
- --syslog.listenAddr.tcp=:514
ports:
- 9428:9428
- 514:514
restart: always
```
Запускаем проект, переходим на порт 9428, чтобы убедиться в том, что всё запустилось. По умолчанию открывается страница с некоторыми ссылками на Web UI, Метрики и ключи запуска.
Отправим в VictoriaLogs логи от systemd от любого сервера, локального или внешнего. Для этого понадобится служба systemd-journal-remote (https://t.me/srv_admin/3136). Ставим её:
`# apt install systemd-journal-remote`
Редактируем конфиг /etc/systemd/journal-upload.conf, добавляя один параметр:
```
[Upload]
URL=http://localhost:9428/insert/journald
```
URL, соответственно, измените, если у вас сбор логов не с локального сервера, а удалённого. Запускаем службу и проверяем, что она успешно начала отправку логов:
`# systemctl start systemd-journal-upload`
`# systemctl status systemd-journal-upload`
Идём в веб интерфейс VictoriaLogs - http://212.193.59.87:9428/select/vmui и смотрим там логи.
Переходим к Syslog. Я уже добавил параметр syslog.listenAddr.tcp=:514. Убедитесь, что указанный порт прослушивается:
`# ss -tulnp | grep 514`
Если у вас этот порт уже занят syslog сервером, то измените порт для VictoriaLogs. В общем-то настраивать больше ничего не надо. Теперь в любом софте, который умеет отправлять данные в формате syslog, укажите в качестве сервера IP вашего VictoriaLogs. Например, в том же Микротике: System ⇨ Logging ⇨ Actions ⇨ Add Type Remote.
Для сбора логов от всех популярных агентов, типа Filebeat, Fluentd, Vector (https://t.me/srv_admin/2388) и т.д. тоже ничего специально настраивать не надо. Делаете всё точно так же, как для отправки логов в Elasticsearch, только в качестве endpoint указываете URL от вашего сервера VictoriaLogs. Вот пример для Vector:
```yaml
sinks:
vlogs:
inputs:
- nginx_access_logs
type: elasticsearch
endpoints:
- http://212.193.59.87:9428/insert/elasticsearch/
api_version: v8
compression: gzip
```
Решение очень понравилось своей простотой, универсальностью и скоростью настройки. Буквально за час со всем разобрался и настроил. Никаких затруднений. Отдельно нужно решать вопрос доступа к приёмнику логов и веб интерфейсу. С уровня приложения никаких решений нет. Нужно либо firewall, либо proxy использовать.
Отдельно отмечу, что те же логи syslog и journald сразу парсятся по основным полям, типа hostname, time, cmdline и т.д. Ничего для этого настраивать не надо. Сразу в веб интерфейсе можно поиск и группировку по ним делать. Получается очень функциональное решение по простоте и скорости настройки на уровне обычного syslog сервера, но с гораздо большими возможностями.
![victorialogs-1.png](/monitoring/victorialogs-1.png)
![victorialogs-2.png](/monitoring/victorialogs-2.png)
![victorialogs-3.png](/monitoring/victorialogs-3.png)

View File

@@ -0,0 +1,11 @@
---
title: Отключение проверки совместимости дисков в Synology
description:
published: true
date: 2025-04-21T09:51:56.904Z
tags: synology, check, hdd
editor: markdown
dateCreated: 2025-04-21T09:51:56.903Z
---
https://github.com/007revad/Synology_HDD_db?tab=readme-ov-file

View File

@@ -0,0 +1,48 @@
---
title: Какую файловую систему выбрать brtfs или ext4 для synology ?
description:
published: true
date: 2025-04-05T10:07:48.849Z
tags: brtfs, ext4
editor: markdown
dateCreated: 2025-04-05T10:07:48.849Z
---
Выбор между **Btrfs** и **ext4** для Synology зависит от ваших потребностей в функциональности, надёжности и производительности.
### **1. Btrfs (Рекомендуется для Synology)**
**Плюсы:**
**Снимки (snapshots)** возможность создавать мгновенные копии файлов для защиты от случайного удаления или ransomware.
**Самовосстановление данных** проверка целостности данных и автоматическое исправление ошибок (если используется SHR-1/SHR-2 или RAID с избыточностью).
**Эффективное сжатие** экономия места без потери производительности (особенно полезно для текстовых файлов, логов, баз данных).
**Дедупликация** (вручную или через сторонние утилиты) экономия места при дублировании файлов.
**Поддержка копирования при записи (CoW)** уменьшает риск повреждения данных.
**Минусы:**
**Требует больше ресурсов** (CPU, RAM) на слабых моделях (например, DS220j) может работать медленнее.
**Не поддерживается на всех моделях** (старые или бюджетные Synology могут не иметь Btrfs).
**Чувствителен к внезапному отключению питания** (но Synology использует журналирование для минимизации рисков).
---
### **2. ext4 (Классический вариант)**
**Плюсы:**
**Высокая скорость** особенно на слабом железе.
**Стабильность** проверенная временем файловая система.
**Меньше накладных расходов** не требует много оперативной памяти.
**Минусы:**
**Нет снимков (snapshots)** нельзя быстро откатить изменения.
**Нет самовосстановления данных** при повреждении файлов потребуется проверка вручную (fsck).
**Нет сжатия и дедупликации** занимает больше места.
---
### **Вывод: что выбрать?**
- **Btrfs** если у вас **NAS с двухдисковой (или более) конфигурацией (SHR-1/SHR-2, RAID 1/5/6)** и вы хотите **защиту от повреждения данных, снимки и сжатие**.
- **ext4** если у вас **однодисковый NAS** или **очень слабое железо** (например, серия **"j"**), и вам важна **максимальная скорость без дополнительных функций**.
#### **Рекомендация для большинства пользователей:**
**Btrfs** лучший выбор для Synology, если ваша модель его поддерживает. Он даёт больше возможностей для защиты данных и экономии места.
Если сомневаетесь, выбирайте **Btrfs**, но убедитесь, что у вас **достаточно оперативной памяти** (минимум **1-2 ГБ** для комфортной работы).

70
NAS/Synology/cupsd.md Normal file
View File

@@ -0,0 +1,70 @@
---
title: Подключение принтера в Synology
description:
published: true
date: 2024-10-29T09:04:59.553Z
tags: synology, cups
editor: markdown
dateCreated: 2024-10-29T09:04:59.553Z
---
# Подключение принтера по usb
https://github.com/ziwork/synology-airprint
Когда подключил принтер по usb к synology, то не получилось распечатать удаленно, вполне возможно что малая поддержка устройств.
Нашел на просторах интернета проект synology-airprint с помощью которого получилось завести.
![cups1.png](/nas/cups1.png)
Так как принтер не определяется с нормальным именем, например как /dev/ttyUSB0
Поэтому пришлось делать символьную ссылку через планировщик
`ln -s /dev/usb/04e8:3413:8J66BAAY331838K /dev/ttyUSB0`
![cups2.png](/nas/cups2.png)
![cups3.png](/nas/cups3.png)
![cups4.png](/nas/cups4.png)
Создаем docker-compose с таким содержимым
```
nano docker-compose.yml
```
```yaml
version: '3.5'
services:
airprint:
container_name: airprint
image: znetwork/synology-airprint:latest
restart: always
# network_mode: "bridge"
network_mode: "host"
devices:
# - "/dev/bus/usb/001/001:/dev/ttyUSB0"
- "/dev/ttyUSB0:/dev/ttyUSB0"
# ports:
# - "9631:631"
environment:
CUPSADMIN: admin
CUPSPASSWORD: admin
```
Нужно по странице проекта остановить и выключить службы
```
sudo synosystemctl stop cupsd
sudo synosystemctl stop cups-lpd
sudo synosystemctl stop cups-service-handler
sudo synosystemctl disable cupsd
sudo synosystemctl disable cups-lpd
sudo synosystemctl disable cups-service-handler
```
И поднимаем контейнер (нужно перед этим через центр пакетов поставить Container Manager)
```
docker compose up -d
```
Заходим на страницу и там добавляем принтер
http://192.168.88.250:631/
И потом добавляем принтер на компьютере:
через ipip http://192.168.88.250:631/printers/samsung

142
NAS/Synology/scrutiny.html Normal file
View File

@@ -0,0 +1,142 @@
<!--
title: Просмотр атрибутов SMART в DSM 7.2.1 и новее
description: scrutiny
published: true
date: 2025-03-12T10:21:29.816Z
tags: scrutiny, smart
editor: ckeditor
dateCreated: 2025-03-12T10:21:29.816Z
-->
<p>Источник: https://bafista.ru/prosmotr-atributov-smart-v-dsm-7-2-1-i-novee/</p>
<h2><strong>Введение</strong></h2>
<p>В самой лучшей на данный момент ОС DSM для NAS от компании Synology было все необходимое для работы с дисками. Но 26.09.2023 вышло <a href="https://www.synology.com/ru-ru/releaseNote/DSM"><u>обновление DSM 7.2.1</u></a> и вместе с ним обновление для <a href="https://www.synology.com/ru-ru/releaseNote/StorageManager"><u>диспетчера хранения</u></a> 1.0.0-0017. В этом обновлении произошло невероятное: <i><strong>Атрибуты S.M.A.R.T. больше не записываются и не отображаются.</strong></i></p>
<p>При проверке опасения подтвердились. Кнопка просмотров атрибутов SMART пропала со своего места и теперь ее нигде нет. Очень печальная ситуация.</p>
<p><a href="https://github.com/AnalogJ/scrutiny"><u>Scrutiny&nbsp;</u></a> это инструмент, который собирает данные SMART с жесткого диска и отображает их через веб-интерфейс. Дополнительно ведется логирование полученных данных и есть возможность настроить уведомления.</p>
<figure class="image image_resized" style="width:47.66%;"><img src="https://bafista.ru/wp-content/uploads/2023/09/scr-20230930-iwuw.png"></figure>
<p>&nbsp;</p>
<figure class="image image_resized" style="width:47.81%;"><img src="https://bafista.ru/wp-content/uploads/2023/09/scr-20230930-jdtv.png"></figure>
<h2><strong>Установка Scrutiny</strong></h2>
<p>Для установки нам понадобится Container Manager. Поэтому перед началом найдите его в центре пакетов и установите. Если в центре пакетов его нет, значит ваше устройство его не поддерживает и дальше вам можно не читать данную инструкцию.</p>
<p>Откройте File station и перейдите в папку docker. В этой папке создайте пустой каталог с именем <strong>scrutiny</strong>, а внутри еще один пустой с именем <strong>influxdb</strong> как показано на картинке ниже.</p>
<figure class="image image_resized" style="width:46.87%;"><img src="https://bafista.ru/wp-content/uploads/2023/09/image-180-1024x594.png"></figure>
<p>Так тут же нужно создать файл <strong>collector.yaml</strong> следующего содержимого:</p>
<pre><code class="language-plaintext">version: 1
host:
id: "NAS"
devices:
- device: /dev/sata1
type: 'sat'
# - device: /dev/sata2
# type: 'sat'
# - device: /dev/sata3
# type: 'sat'
- device: /dev/nvme0n1
type: 'nvme'
# - device: /dev/nvme1n1
# type: 'nvme'</code></pre>
<p>Разберем что в этом файле и зачем.</p>
<ul>
<li>ИмяСервера замените на ваше, желательно латинскими буквами</li>
<li>sata1 sata2 sata3 это все ваши диски. Укажите тут точное количество ваших дисков в Synology и где они установлены. Номер 1 2 и 3 совпадает с номеров диска в слотах устройства. В некоторых случаях вместо sata1 sata2 sata3 и т.д. нужно указывать sda sdb sdc и т.д.</li>
<li>nvme0m1 и nvme1n1 это ssd диски установленные в M2 слоты, если у вас их нет, то просто удалите их.</li>
</ul>
<blockquote>
<p><i>Так же можно добавить диски подключенные по USB, подробнее в комментарии по </i><a href="https://bafista.ru/prosmotr-atributov-smart-v-dsm-7-2-1-i-novee/#comment-2692"><i><u>ссылке</u></i></a></p>
</blockquote>
<p>Теперь открываем Container Manager, переходим в проекты и нажимаем создать проект. В открывшемся окне придумываем имя, задаем путь, который мы ранее создали и выбираем создать docker-compose.yml как показано на картинке ниже.</p>
<figure class="image"><img src="https://bafista.ru/wp-content/uploads/2023/09/image-181-1024x617.png"></figure>
<p>В тактовое поле вставляем такой текст заранее его подредактировав:</p>
<pre><code class="language-plaintext">services:
scrutiny:
container_name: scrutiny
image: ghcr.io/analogj/scrutiny:master-omnibus
cap_add:
- SYS_RAWIO
- SYS_ADMIN
ports:
- "8095:8080" # webapp
- "8096:8086" # influxDB admin
volumes:
- /run/udev:/run/udev:ro
- ./:/opt/scrutiny/config
- ./influxdb:/opt/scrutiny/influxdb
- ./scrutiny.yaml:/opt/scrutiny/config/scrutiny.yaml
devices:
- /dev/sata1:/dev/sata1
# - /dev/sata2:/dev/sata2
# - /dev/sata3:/dev/sata3
- /dev/nvme0n1:/dev/nvme0n1
# - /dev/nvme1n1:/dev/nvme1n1
environment:
- COLLECTOR_CRON_SCHEDULE='*/5 * * * *'
- SCRUTINY_WEB_INFLUXDB_TOKEN=ANYLONGSTRING
- SCRUTINY_WEB_INFLUXDB_INIT_USERNAME=sadmin
- SCRUTINY_WEB_INFLUXDB_INIT_PASSWORD=6lise-shorter-Direct0
- TZ=Europe/Moscow
restart: unless-stopped</code></pre>
<p>Разберем что в этом файле и зачем.</p>
<ul>
<li>Порт 8095 это порт для web интерфейса scrutiny. Порт 8096 для web интерфейса influxDB. Порты после двоеточия 8080 и 8086 менять нельзя.</li>
<li>sata1 sata2 sata3 это все ваши диски. Укажите тут точное количество ваших дисков в Synology и где они установлены. Номер 1 2 и 3 совпадает с номеров диска в слотах устройства. В некоторых случаях вместо sata1 sata2 sata3 и т.д. нужно указывать sda sdb sdc и т.д.</li>
<li>nvme0m1 и nvme1n1 это ssd диски установленные в M2 слоты, если у вас их нет, то просто удалите их.</li>
<li>Токен, логин и пароль устанавливайте на свое усмотрение, но не менее 8 символов иначе не будет работать.</li>
</ul>
<p>По умолчанию сбор данных в scrutiny выполняется раз в сутки и этого вполне достаточно почти всегда, но это можно переопределить вставив такую переменную:</p>
<blockquote>
<p><i>Спешу напомнить, что если вы хотите переопределить частоту запуска коллектора, то нужно заново создавать проект с контейнером.</i></p>
<p style="text-align:center;"><i>!!! Не делайте часто, это не есть хорошо !!!</i></p>
</blockquote>
<pre><code class="language-plaintext">- COLLECTOR_CRON_SCHEDULE='*/1 * * * *'</code></pre>
<p>Где:</p>
<ul>
<li>*/1 * * * * запуск коллектора каждую минуту</li>
<li>*/5 * * * * запуск коллектора каждые 5 минут</li>
<li>*/10 * * * * запуск коллектора каждые 10 минут</li>
<li>0 * * * * запуск коллектора каждый час</li>
</ul>
<p>Далее нигде ничего менять не нужно, просто на заключительном этапе жмите выполнено для создания и запуска проекта scrutiny</p>
<figure class="image"><img src="https://bafista.ru/wp-content/uploads/2023/09/image-182-1024x554.png"></figure>
<p>Процесс этот весьма небыстрый. Будет скачен образ контейнера docker, затем распакован и создан сам контейнер. Если все сделано правильно, то увидите Exit Code 0, что означает успешное создание проекта с контейнером. Если нет, то увидите в чем проблема, ее нужно будет устранить и начать заново.</p>
<figure class="image"><img src="https://bafista.ru/wp-content/uploads/2023/09/image-183-1024x559.png"></figure>
<p>&nbsp;</p>
<p>Теперь в браузере открываете новую вкладку и вбиваете http://IP-NAS:8095. Естественно, что IP адрес и порт вы вставляете свои.</p>
<blockquote>
<p><i>При создании проекта для него создается отдельная сеть bridge, которую нужно разрешить на фаерволе Synology, если он у вас включен</i></p>
</blockquote>
<figure class="image"><img src="https://bafista.ru/wp-content/uploads/2023/09/image-184-1024x674.png"></figure>
<p>Для просмотра атрибутов SMART щелкните три точки у нужного диска и нажмите Detail</p>
<figure class="image"><img src="https://bafista.ru/wp-content/uploads/2023/09/image-185-1024x674.png"></figure>
<p>Тут нужно отметить, что данные обновляются раз в сутки в 6:00 утра или после старта контейнера scrunity.</p>
<p><i>За образец была взята эта </i><a href="https://drfrankenstein.co.uk/2023/05/29/scrutiny-in-container-manager-on-a-synology-nas/"><i><u>инструкция</u></i></a><i>, но сделано по моему.</i></p>
<p>Добавочные файлы config.yml</p>
<pre><code class="language-plaintext">bolt-path: /opt/scrutiny/influxdb/influxd.bolt
engine-path: /opt/scrutiny/influxdb/engine
http-bind-address: ":8086"
reporting-disabled: true
</code></pre>
<p>Уведомление через Gotify scrutiny.yml</p>
<pre><code class="language-plaintext">version: 1
web:
listen:
port: 8080
host: 0.0.0.0
basepath: ''
database:
location: /opt/scrutiny/config/scrutiny.db
src:
frontend:
path: /opt/scrutiny/web
influxdb:
host: 0.0.0.0
port: 8086
retention_policy: true
log:
file: '' #absolute or relative paths allowed, eg. web.log
level: INFO
notify:
urls:
# - "telegram://token@telegram?channels=channel-1[,channel-2,...]"
- "gotify://prodik.ddns.net:8880/token"
</code></pre>

View File

@@ -0,0 +1,90 @@
---
title: Synology - reindex photo
description:
published: true
date: 2025-04-05T10:09:59.015Z
tags: ssh, synology, reindex, photo
editor: markdown
dateCreated: 2024-11-27T08:35:34.807Z
---
# Зависла индексация
Попытки исправить проблему с зависшей индексацией ни к чему не привели.
Пытался с помощью консольных команд, но ругался на битую таблицу в postgresql.
Пробовал исправить таблицу, но не получилось.
В итоге нашел решение, которое помогло, хотя очень кординальным методом, гроханием базы данных.
```
sudo rm -rf /volume1/@database/pgsql
reboot
```
После этого сделать реиндексацию фоток и видео.
Источник https://community.synology.com/enu/forum/17/post/103120
## Перезапуск synology photo
```bash
synopkgctl stop SynologyPhotos && synopkgctl start SynologyPhotos
```
## Реиндексация фото и видео
```
synoindex -a /volume3/photo/PhotoLibrary/2024/11/
synoindex -R all
```
Help:
```
bash-4.4# synoindex --help
Usage:
synoindex [OPTIONS]
Index Options:
-h, --help
this help text
-A dirpath
add a dir
-a filepath
add a file
-D dirpath
delete a dir
-d filepath
delete a file
-N new_dirpath old_dirpath
rename a dir
-n new_filepath old_filepath
rename a file
-R [all|media|photo|music|video|thumb|dirpath]
all: reindex all dirpath that registered in each package
media: reindex dirpath that registered in MediaIndex package
photo: reindex photo dirpath
music: reindex music dirpath
video: reindex video dirpath
thumb: check converted video of each video file
dirpath: reindex this specific dirpath
-R user:{user_name}
reindex personal photo dirpath
-R share:{share_name}
reindex share dirpath
-R [type_music|type_video|type_photo]
reindex dirpath that registered with specific type in MediaIndex
Package Index Options:
-P [MediaIndex|{package_name}] {index_option}
index operation only apply on this package
-p [MediaIndex|{package_name}] {index_option}
index operation apply all packages except for this package
File Index Options:
-f {index_option}
index operation apply on file index
-U photo
update photo images
```
```
/var/packages/SynologyPhotos/target/usr/bin/synofoto-bin-clear-index-task -t thumbnail
```
```
/var/packages/SynologyPhotos/target/usr/bin/synofoto-bin-index-tool -t basic -i /volume3/photo/PhotoLibrary/2024/ -t basic_reindex
```

View File

@@ -0,0 +1,11 @@
<!--
title: Перенос приложений на другой том
description:
published: true
date: 2025-04-05T12:08:46.013Z
tags: synology, app, move
editor: ckeditor
dateCreated: 2025-04-05T12:08:46.013Z
-->
<p>https://github.com/007revad/Synology_app_mover</p>

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

BIN
nas/cups1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
nas/cups2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
nas/cups3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
nas/cups4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@@ -0,0 +1,39 @@
---
title: Регулировка скорости вращения вентиляторов
description:
published: true
date: 2025-05-19T09:26:33.340Z
tags: ipmi, fan
editor: markdown
dateCreated: 2025-05-19T08:49:19.082Z
---
https://forums.servethehome.com/index.php?resources/supermicro-x9-x10-x11-fan-speed-control.20/
https://forums.servethehome.com/index.php?threads/supermicro-x9-x10-x11-fan-speed-control.10059/page-8
```bash
#!/bin/bash
# IPMI settings
IPMI_IP="192.168.88.221" # Replace with your BMC IP
IPMI_USER="ADMIN" # Replace with your IPMI username
IPMI_PASS="JYGEABVVCV" # Replace with your IPMI password
# Fan settings (for FAN3)
FAN_ID="0x02" # 0x02 = FAN3 (0x00=FAN1, 0x01=FAN2, etc.)
FAN_SPEED="0x32" # 0x32 = 50% (0x01=FULL, 0x24=37%, 0x16=25%)
# Set FULL
ipmitool -I lanplus -H $IPMI_IP -U $IPMI_USER -P $IPMI_PASS raw 0x30 0x45 0x01 0x01
sleep 3
# Set manual control mode
ipmitool -I lanplus -H $IPMI_IP -U $IPMI_USER -P $IPMI_PASS raw 0x30 0x70 0x66 0x01 0x00 0x16
# Set fan speed
ipmitool -I lanplus -H $IPMI_IP -U $IPMI_USER -P $IPMI_PASS raw 0x30 0x70 0x66 0x01 $FAN_ID $FAN_SPEED
# Log the action (optional)
#echo "$(date) - Set FAN3 speed to 50%" >> /var/log/fan_control.log
```