Compare commits

..

22 Commits

Author SHA1 Message Date
2a29301db8 Vault 2025-10-07 08:51:28 +05:00
fe5d348b65 RabbitMQ 2025-10-02 18:16:29 +05:00
162688fccd Merge branch 'master' of https://git.mesh.kz/igor/Ubuntu_docs 2025-08-25 07:41:12 +05:00
b6111740e8 + 2025-08-25 07:41:03 +05:00
5745ef2cd6 vector 2025-07-31 08:40:21 +05:00
5d40bb271d + 2025-07-04 12:26:16 +05:00
3ca998f1cf Merge branch 'master' of https://git.mesh.kz/igor/Ubuntu_docs 2025-06-26 20:17:49 +05:00
09241fc5c6 + 2025-06-26 20:17:11 +05:00
f8c995bd43 Merge branch 'master' of https://git.mesh.kz/igor/Ubuntu_docs 2025-06-26 17:18:11 +05:00
ba1914f646 CI CD 2025-06-26 16:59:41 +05:00
c2f357fae1 + 2025-06-25 23:00:43 +05:00
91672d99ee simple 2025-06-13 14:34:58 +05:00
3f831b68ab + 2025-05-22 03:49:49 +05:00
332e1b84e9 По директориям раскидал 2025-05-20 20:16:22 +05:00
cab906cff1 PowerDNS modif 2025-05-16 22:34:24 +05:00
19407be225 Merge branch 'master' of https://git.dirt.kz/igor/Ubuntu_docs
# Conflicts:
#	DNS/PowerDNS_install.md
2025-05-15 21:20:52 +05:00
1d99814706 разное 2025-05-15 21:19:32 +05:00
7380add41d Новые каталоги 2025-05-15 09:04:57 +05:00
aa0179f6c0 Merge branch 'master' of https://git.dirt.kz/igor/Ubuntu_docs
# Conflicts:
#	PostgreSQL_select.md
2025-05-12 09:28:09 +05:00
2d79601c7a Тестирование ИБ при проверки на ГТС 2025-05-12 09:27:05 +05:00
3bbdd7e866 Разное 2025-05-03 19:34:13 +05:00
72ba8986d4 +select 2025-04-23 17:02:52 +05:00
45 changed files with 5505 additions and 2770 deletions

223
Brokers/RabbitMQ_install.md Normal file
View File

@ -0,0 +1,223 @@
****************************************************************************************************
Подключаемся к нужной машине
```sh
ssh ivanov_i@10.101.1.3 -p 22
```
Установка сервиса обмена сообщениями RabbitMQ менеджер сообщений (message broker), написан на Erlang, ближайший аналог в AWS SQS. По документации из: https://rtfm.co.ua/ru/rabbitmq-zapusk-opisanie-primery/
```sh
sudo apt-get update &&
sudo apt-get dist-upgrade &&
sudo apt install rabbitmq-server
```
Создаём пользователя и задаём пароль
```sh
sudo rabbitmqctl list_users &&
sudo rabbitmqctl add_user ivanov_i KGf4nxT8vxZWv3jqNasP &&
sudo rabbitmqctl set_user_tags ivanov_i administrator &&
sudo rabbitmqctl set_permissions -p / ivanov_i ".*" ".*" ".*" &&
sudo rabbitmqctl change_password ivanov_i KGf4nxT8vxZWv3jqNasP
```
Посмотреть список используемых плагинов:
```sh
sudo rabbitmq-plugins list
```
Активируем плагин rabbitmq_management для наблюдения за системой по HTTP https://www.rabbitmq.com/management.html https://thewebland.net/development/devops/chast-3-interfejs-upravleniya-rabbitmq/#:~:text=RabbitMQ%20Management%20%20это%20удобный%20интерфейс,и%20отправлять%20%2F%20получать%20сообщения%20вручную.
```sh
sudo rabbitmq-plugins enable rabbitmq_management
```
rabbitmq_management активирует поддержку API на порту 15672: http://192.168.0.144:15672 http://10.1.7.70:15672 http://192.168.0.83:15672
Но для активации нужно добавить пользователя, смотрим пользователей:
```sh
sudo rabbitmqctl list_users
sudo rabbitmqctl add_user admin paRabbit! или test test для локального тестового сервера
sudo rabbitmqctl set_user_tags admin administrator
sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
```
Также можно создать пользователя для публикации сообщений но уже это можно сделать через WEB интерфейс: producer lgGDWAJEwI для guest с паролем: efewG!4ev Александра: alex jefruf!43
Теперь можно логинется по test test поменять пароль можно: https://kb.vmware.com/s/article/323520#:~:text=Log%20in%20to%20the%20RabbitMQ,host%20where%20RabbitMQ%20is%20installed.
Или так можно поменять пароль: sudo rabbitmqctl change_password zenoss New-Password
producer: клиент, выполняющий отправку сообщения
queue: собственно очередь сообщений
consumer: клиент, получающий сообщения из очереди
exchange: получает сообщения от producer, и отправялет их в очереди в соответствии с его типом (см. тут https://www.rabbitmq.com/tutorials/tutorial-three-python.html)
Дальше можно пробовать отправлять данные в очередь используя допустим java библиотеку урок: https://www.youtube.com/watch?v=6lPK_LgTZ9Y
https://www.rabbitmq.com/devtools.html :
Создаю Maven проект в консоли:
```sh
cd O:\projects\Workspace_Java\
mvn archetype:generate -DgroupId=kz.istt.app -DartifactId=TransitToRabbitMQ -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
```
Открываю его в idea64 и добавляю в POM следующую зависемость из https://mvnrepository.com/artifact/com.rabbitmq/amqp-client:
```xml
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.14.2</version>
</dependency>
```
Также поставил C:\Program Files\Java\jdk-14.0.2 а то не запускалось, также просит рут права для IntelliJ IDEA.
Урок создания maven проекта: https://devcolibri.com/unit/урок-1-подготовка-и-создание-maven-проекта/
или https://www.jetbrains.com/idea/guide/tutorials/working-with-maven/creating-a-project/
Добавил в POM файл:
```xml
<repositories>
<repository>
<name>RabbitMQ</name>
<url>https://repo1.maven.org/maven2/com/rabbitmq/amqp-client/5.16.0</url>
<id>com.rabbitmq</id>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.16.0</version>
</dependency>
</dependencies>
```
Перезагружаем:
```sh
sudo service rabbitmq-server restart
```
****************************************************************************************************
Установка Shovels Plugin для RabbitMQ (лопата) по мотивам из: https://www.rabbitmq.com/docs/shovel
Активирую плагин командой:
```sh
sudo rabbitmq-plugins enable rabbitmq_shovel &&
sudo rabbitmq-plugins enable rabbitmq_shovel_management
```
Настраиваю Shovels Dynamic плагин в RabbitMQ через командную строку:
```sh
sudo rabbitmqctl set_parameter shovel kaz_to_kaz '{
"src-protocol": "amqp091",
"src-uri": "amqp://admin:paRabbit!@127.0.0.1:20000/transportation",
"src-queue": "TO_KAZ",
"dest-protocol": "amqp091",
"dest-uri": "amqp://admin:paRabbit!@10.101.1.11:20000/playground",
"dest-exchange": "swap",
"dest-exchange-key": ".KAZ.",
"ack-mode": "on-confirm",
"publish-properties": {
"delivery_mode": 2
}
}'
```
Для Росии такие настройки:
```sh
sudo rabbitmqctl set_parameter shovel kaz_to_rus '{
"src-protocol": "amqp091",
"src-uri": "amqp://admin:paRabbit!@127.0.0.1:20000/transportation_rus",
"src-queue": "TO_RUS",
"dest-protocol": "amqp091",
"dest-uri": "amqp://iktt_kaz:jkrjHL7xj7PrW1D@192.168.89.133:20000/playground",
"dest-exchange": "swap",
"dest-exchange-key": "KZ",
"ack-mode": "on-confirm",
"publish-properties": {
"delivery_mode": 2
}
}'
```
Для Беларусии такие настройки:
```sh
sudo rabbitmqctl set_parameter shovel kaz_to_blr '{
"src-protocol": "amqp091",
"src-uri": "amqp://admin:paRabbit!@127.0.0.1:20000/transportation_blr",
"src-queue": "TO_BLR",
"dest-protocol": "amqp091",
"dest-uri": "amqp://KZ_IKTT:DK34xDNlZQfQ551k@192.168.90.133:20000/plumber",
"dest-exchange": "eec.swap",
"dest-exchange-key": "KZ",
"ack-mode": "on-confirm",
"publish-properties": {
"delivery_mode": 2
}
}'
```
Для Армении такие настройки:
```sh
sudo rabbitmqctl set_parameter shovel kaz_to_arm '{
"src-protocol": "amqp091",
"src-uri": "amqp://admin:password@127.0.0.1:20000/transportation_arm",
"src-queue": "TO_ARM",
"dest-protocol": "amqp091",
"dest-uri": "amqp://kz_istt:password@192.168.89.158:20000/transportation",
"dest-exchange": "swap_kz",
"dest-exchange-key": "KZ_ISTT",
"ack-mode": "on-confirm",
"publish-properties": {
"delivery_mode": 2
}
}'
```
Для отправки в Кыргызстана (таможенная инфраструктура)
```sh
sudo rabbitmqctl set_parameter shovel kaz_to_kgz '{
"src-protocol": "amqp091",
"src-uri": "amqp://admin:paRabbit!@127.0.0.1:20000/transportation_kgz",
"src-queue": "TO_KGZ",
"dest-protocol": "amqp091",
"dest-uri": "amqp://kz_istt:kzistt123EX@192.168.70.133:20000/kaz_transportation",
"dest-queue": "KAZ",
"ack-mode": "on-confirm",
"publish-properties": {
"delivery_mode": 2
}
}'
```
Удалять так:
```sh
sudo rabbitmqctl clear_parameter shovel kaz_to_kgz
```
НЕ ИСПОЛЬЗОВАТЬ Для отправки из Киргизии нам то такие настройки:
```sh
sudo rabbitmqctl set_parameter shovel kgz_to_kaz '{
"src-protocol": "amqp091",
"src-uri": "amqp://admin:pfta2OFt@127.0.0.1:20000/transportation_kaz",
"src-queue": "TO_KAZ",
"dest-protocol": "amqp091",
"dest-uri": "amqp://kg_amap:qrd2fjEjkegdi7bfb@192.168.70.134:20000/transportation_kgz",
"dest-exchange": "swap",
"dest-exchange-key": "KGZ",
"ack-mode": "on-confirm",
"publish-properties": {
"delivery_mode": 2
}
}'
```
Удалять так:
```sh
sudo rabbitmqctl clear_parameter shovel kgz_to_kaz
```
Чтобы проверить текущие параметры Shovel:
```sh
sudo rabbitmqctl list_parameters
```
А также можно взглянуть что создалось через WEB интерфейс
Не забывать что Exchange: swap должен быть не "direct" а как "topic" иначе маршрутизация не сработает.

View File

@ -1,341 +1,341 @@
Heres a step-by-step guide to setting up a **RabbitMQ cluster with replication** correctly: Heres a step-by-step guide to setting up a **RabbitMQ cluster with replication** correctly:
--- ---
## **Step 1: Prepare the Servers** ## **Step 1: Prepare the Servers**
Ensure you have at least **three** nodes (recommended for HA) with: Ensure you have at least **three** nodes (recommended for HA) with:
- Ubuntu 22.04 (or a supported OS) - Ubuntu 22.04 (or a supported OS)
- Sufficient CPU/RAM based on workload - Sufficient CPU/RAM based on workload
- Open necessary firewall ports (**5672, 15672, 25672**) - Open necessary firewall ports (**5672, 15672, 25672**)
Set hostnames for clarity: Set hostnames for clarity:
```bash ```bash
sudo hostnamectl set-hostname rabbitmq-node1 # Change for each node sudo hostnamectl set-hostname rabbitmq-node1 # Change for each node
``` ```
--- ---
## **Step 2: Install Erlang and RabbitMQ** ## **Step 2: Install Erlang and RabbitMQ**
Run the following on **all nodes**: Run the following on **all nodes**:
### **1. Add the RabbitMQ Repository** ### **1. Add the RabbitMQ Repository**
```bash ```bash
sudo apt update sudo apt update
sudo apt install -y curl gnupg sudo apt install -y curl gnupg
curl -fsSL https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey | sudo tee /usr/share/keyrings/rabbitmq-key.asc curl -fsSL https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey | sudo tee /usr/share/keyrings/rabbitmq-key.asc
echo "deb [signed-by=/usr/share/keyrings/rabbitmq-key.asc] https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list echo "deb [signed-by=/usr/share/keyrings/rabbitmq-key.asc] https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list
``` ```
### **2. Install Erlang and RabbitMQ** ### **2. Install Erlang and RabbitMQ**
```bash ```bash
sudo apt update sudo apt update
sudo apt install -y rabbitmq-server sudo apt install -y rabbitmq-server
``` ```
### **3. Enable RabbitMQ** ### **3. Enable RabbitMQ**
```bash ```bash
sudo systemctl enable --now rabbitmq-server sudo systemctl enable --now rabbitmq-server
``` ```
--- ---
## **Step 3: Configure Clustering** ## **Step 3: Configure Clustering**
### **1. Stop RabbitMQ on All Nodes** ### **1. Stop RabbitMQ on All Nodes**
```bash ```bash
sudo systemctl stop rabbitmq-server sudo systemctl stop rabbitmq-server
``` ```
### **2. Configure Cookie for Clustering** ### **2. Configure Cookie for Clustering**
Run on **all nodes** (same cookie ensures clustering works): Run on **all nodes** (same cookie ensures clustering works):
```bash ```bash
echo "MY_CLUSTER_COOKIE" | sudo tee /var/lib/rabbitmq/.erlang.cookie echo "MY_CLUSTER_COOKIE" | sudo tee /var/lib/rabbitmq/.erlang.cookie
sudo chmod 600 /var/lib/rabbitmq/.erlang.cookie sudo chmod 600 /var/lib/rabbitmq/.erlang.cookie
``` ```
Replace `"MY_CLUSTER_COOKIE"` with a strong, identical value on all nodes. Replace `"MY_CLUSTER_COOKIE"` with a strong, identical value on all nodes.
--- ---
## **Step 4: Join Nodes to the Cluster** ## **Step 4: Join Nodes to the Cluster**
Perform this on **nodes 2 and 3**, joining them to **node1**: Perform this on **nodes 2 and 3**, joining them to **node1**:
```bash ```bash
sudo rabbitmqctl stop_app sudo rabbitmqctl stop_app
sudo rabbitmqctl join_cluster rabbit@rabbitmq-node1 sudo rabbitmqctl join_cluster rabbit@rabbitmq-node1
sudo rabbitmqctl start_app sudo rabbitmqctl start_app
``` ```
Check cluster status: Check cluster status:
```bash ```bash
sudo rabbitmqctl cluster_status sudo rabbitmqctl cluster_status
``` ```
--- ---
## **Step 5: Enable High Availability (HA) Mirroring** ## **Step 5: Enable High Availability (HA) Mirroring**
To replicate all queues, run on **any one node**: To replicate all queues, run on **any one node**:
```bash ```bash
rabbitmqctl set_policy ha-all "^.*" '{"ha-mode":"all","ha-sync-mode":"automatic"}' rabbitmqctl set_policy ha-all "^.*" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
``` ```
This ensures all queues are **replicated across all nodes**. This ensures all queues are **replicated across all nodes**.
--- ---
## **Step 6: Enable Management UI** ## **Step 6: Enable Management UI**
Run on **each node** to enable the web interface: Run on **each node** to enable the web interface:
```bash ```bash
sudo rabbitmq-plugins enable rabbitmq_management sudo rabbitmq-plugins enable rabbitmq_management
``` ```
Access at: Access at:
**http://[NODE_IP]:15672** **http://[NODE_IP]:15672**
(Default login: `guest/guest`, change this for security.) (Default login: `guest/guest`, change this for security.)
--- ---
## **Step 7: Test the Cluster** ## **Step 7: Test the Cluster**
Run on **each node**: Run on **each node**:
```bash ```bash
rabbitmqctl list_queues rabbitmqctl list_queues
``` ```
Queues should be visible and synchronized. Queues should be visible and synchronized.
--- ---
## **Step 8: Enable Auto-Recovery** (Optional) ## **Step 8: Enable Auto-Recovery** (Optional)
Edit `/etc/rabbitmq/rabbitmq.conf` on **each node** and add: Edit `/etc/rabbitmq/rabbitmq.conf` on **each node** and add:
```ini ```ini
cluster_formation.peer_discovery_backend = classic_config cluster_formation.peer_discovery_backend = classic_config
cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-node1 cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-node1
cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-node2 cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-node2
cluster_formation.classic_config.nodes.3 = rabbit@rabbitmq-node3 cluster_formation.classic_config.nodes.3 = rabbit@rabbitmq-node3
``` ```
Then restart RabbitMQ: Then restart RabbitMQ:
```bash ```bash
sudo systemctl restart rabbitmq-server sudo systemctl restart rabbitmq-server
``` ```
--- ---
## **Step 9: Secure the Cluster** (Recommended) ## **Step 9: Secure the Cluster** (Recommended)
### **1. Create an Admin User** ### **1. Create an Admin User**
```bash ```bash
rabbitmqctl add_user admin StrongPassword123! rabbitmqctl add_user admin StrongPassword123!
rabbitmqctl set_user_tags admin administrator rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
``` ```
Then **disable the guest account**: Then **disable the guest account**:
```bash ```bash
rabbitmqctl delete_user guest rabbitmqctl delete_user guest
``` ```
### **2. Enable TLS (Optional)** ### **2. Enable TLS (Optional)**
For security, configure TLS in `/etc/rabbitmq/rabbitmq.conf`. Refer to RabbitMQs [TLS guide](https://www.rabbitmq.com/ssl.html). For security, configure TLS in `/etc/rabbitmq/rabbitmq.conf`. Refer to RabbitMQs [TLS guide](https://www.rabbitmq.com/ssl.html).
--- ---
## **Step 10: Setup Monitoring (Optional)** ## **Step 10: Setup Monitoring (Optional)**
Install **Prometheus & Grafana** or use **RabbitMQ Prometheus plugin**: Install **Prometheus & Grafana** or use **RabbitMQ Prometheus plugin**:
```bash ```bash
sudo rabbitmq-plugins enable rabbitmq_prometheus sudo rabbitmq-plugins enable rabbitmq_prometheus
``` ```
--- ---
Now your RabbitMQ cluster is fully set up with **replication and high availability**! 🚀 Now your RabbitMQ cluster is fully set up with **replication and high availability**! 🚀
--- ---
<br> <br>
<br> <br>
<br> <br>
<br> <br>
# Instructions to fix **unexpected** configuration errors # Instructions to fix **unexpected** configuration errors
If you can't find the RabbitMQ config file under `/etc/rabbitmq`, it may not exist by default. You need to **create it manually**. Here's how: If you can't find the RabbitMQ config file under `/etc/rabbitmq`, it may not exist by default. You need to **create it manually**. Here's how:
## **1⃣ Create the Configuration File** ## **1⃣ Create the Configuration File**
RabbitMQ uses either a **`.conf` file** (modern format) or a **`.config` file** (legacy format). The recommended format is `.conf`. RabbitMQ uses either a **`.conf` file** (modern format) or a **`.config` file** (legacy format). The recommended format is `.conf`.
Create the file if it doesn't exist: Create the file if it doesn't exist:
```bash ```bash
sudo nano /etc/rabbitmq/rabbitmq.conf sudo nano /etc/rabbitmq/rabbitmq.conf
``` ```
Then add the following cluster configuration: Then add the following cluster configuration:
``` ```
cluster_formation.peer_discovery_backend = classic_config cluster_formation.peer_discovery_backend = classic_config
cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-main cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-main
cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-replica cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-replica
``` ```
Save and exit (`CTRL+X`, then `Y`, then `Enter`). Save and exit (`CTRL+X`, then `Y`, then `Enter`).
--- ---
## **2⃣ Set Correct Permissions** ## **2⃣ Set Correct Permissions**
Ensure the RabbitMQ user can read it: Ensure the RabbitMQ user can read it:
```bash ```bash
sudo chown rabbitmq:rabbitmq /etc/rabbitmq/rabbitmq.conf sudo chown rabbitmq:rabbitmq /etc/rabbitmq/rabbitmq.conf
sudo chmod 644 /etc/rabbitmq/rabbitmq.conf sudo chmod 644 /etc/rabbitmq/rabbitmq.conf
``` ```
--- ---
## **3⃣ Restart RabbitMQ** ## **3⃣ Restart RabbitMQ**
After modifying the configuration, restart the RabbitMQ service: After modifying the configuration, restart the RabbitMQ service:
```bash ```bash
sudo systemctl restart rabbitmq-server sudo systemctl restart rabbitmq-server
``` ```
Check the status: Check the status:
```bash ```bash
sudo systemctl status rabbitmq-server sudo systemctl status rabbitmq-server
``` ```
--- ---
## **4⃣ Verify the Cluster Configuration** ## **4⃣ Verify the Cluster Configuration**
After restarting, verify that clustering is working: After restarting, verify that clustering is working:
```bash ```bash
rabbitmqctl cluster_status rabbitmqctl cluster_status
``` ```
If the nodes are listed correctly, your setup is working. If the nodes are listed correctly, your setup is working.
--- ---
## **5⃣ If Using the Legacy `.config` Format** ## **5⃣ If Using the Legacy `.config` Format**
Some older installations use an **Erlang-based configuration file** (`rabbitmq.config`). If you prefer that, create: Some older installations use an **Erlang-based configuration file** (`rabbitmq.config`). If you prefer that, create:
```bash ```bash
sudo nano /etc/rabbitmq/rabbitmq.config sudo nano /etc/rabbitmq/rabbitmq.config
``` ```
Add this: Add this:
```erlang ```erlang
[ [
{rabbit, [ {rabbit, [
{cluster_formation, [ {cluster_formation, [
{peer_discovery_backend, classic_config}, {peer_discovery_backend, classic_config},
{classic_config, [ {classic_config, [
{nodes, ['rabbit@rabbitmq-main', 'rabbit@rabbitmq-replica']} {nodes, ['rabbit@rabbitmq-main', 'rabbit@rabbitmq-replica']}
]} ]}
]} ]}
]} ]}
]. ].
``` ```
Then restart RabbitMQ: Then restart RabbitMQ:
```bash ```bash
sudo systemctl restart rabbitmq-server sudo systemctl restart rabbitmq-server
``` ```
--- ---
### **🔍 Troubleshooting** ### **🔍 Troubleshooting**
**RabbitMQ doesn't restart?** **RabbitMQ doesn't restart?**
Check logs for errors: Check logs for errors:
```bash ```bash
sudo journalctl -u rabbitmq-server --no-pager | tail -50 sudo journalctl -u rabbitmq-server --no-pager | tail -50
``` ```
**Cluster not forming?** **Cluster not forming?**
Try forcing a node to join manually: Try forcing a node to join manually:
```bash ```bash
rabbitmqctl stop_app rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbitmq-main rabbitmqctl join_cluster rabbit@rabbitmq-main
rabbitmqctl start_app rabbitmqctl start_app
``` ```
--- ---
<br> <br>
<br> <br>
<br> <br>
<br> <br>
# Instructions to fix **unexpected** management UI authentication errors # Instructions to fix **unexpected** management UI authentication errors
stackoverflow answer [link](https://stackoverflow.com/a/40845332/27251837) stackoverflow answer [link](https://stackoverflow.com/a/40845332/27251837)
## Answer ## Answer
### ❌ **Cannot login with guest/guest credentials** ### ❌ **Cannot login with guest/guest credentials**
I had the same Problem.. I had the same Problem..
I installed RabbitMQ and Enabled Web Interface also but still couldn't sign in with any user i newly created, this is because you need to be administrator to access this. I installed RabbitMQ and Enabled Web Interface also but still couldn't sign in with any user i newly created, this is because you need to be administrator to access this.
Do not create any config file and mess with it.. Do not create any config file and mess with it..
This is what i did then, This is what i did then,
1. Add a new/fresh user, say user test and password test: 1. Add a new/fresh user, say user test and password test:
```bash ```bash
rabbitmqctl add_user test test rabbitmqctl add_user test test
``` ```
2. Give administrative access to the new user: 2. Give administrative access to the new user:
```bash ```bash
rabbitmqctl set_user_tags test administrator rabbitmqctl set_user_tags test administrator
``` ```
3. Set permission to newly created user: 3. Set permission to newly created user:
```bash ```bash
rabbitmqctl set_permissions -p / test ".*" ".*" ".*" rabbitmqctl set_permissions -p / test ".*" ".*" ".*"
``` ```
That's it, enjoy :) That's it, enjoy :)

View File

@ -1,87 +1,87 @@
Install by docs from https://www.cherryservers.com/blog/install-jenkins-ubuntu Install by docs from https://www.cherryservers.com/blog/install-jenkins-ubuntu
## Prepare installation ## Prepare installation
Открываю нужный сервер Открываю нужный сервер
```sh ```sh
wsl wsl
``` ```
```sh ```sh
sudo apt update sudo apt update
``` ```
```sh ```sh
sudo apt upgrade sudo apt upgrade
``` ```
```sh ```sh
sudo apt install openjdk-21-jdk openjdk-21-jre -y && sudo apt install openjdk-21-jdk openjdk-21-jre -y &&
java -version java -version
``` ```
## Add Jenkins Repository ## Add Jenkins Repository
```sh ```sh
sudo wget -O /usr/share/keyrings/jenkins-keyring.asc https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key sudo wget -O /usr/share/keyrings/jenkins-keyring.asc https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
``` ```
Next, add the Jenkins repository to your systems sources.list: Next, add the Jenkins repository to your systems sources.list:
```sh ```sh
sudo sh -c 'echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian binary/ > /etc/apt/sources.list.d/jenkins.list' sudo sh -c 'echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
``` ```
```sh ```sh
sudo apt update sudo apt update
``` ```
```sh ```sh
sudo apt install jenkins -y sudo apt install jenkins -y
``` ```
If the software was installed incorrectly, you can reinstall it after uninstalling it first.: If the software was installed incorrectly, you can reinstall it after uninstalling it first.:
```sh ```sh
sudo apt remove --purge jenkins sudo apt remove --purge jenkins
``` ```
```sh ```sh
jenkins --version jenkins --version
``` ```
Try run jenkins without service Try run jenkins without service
```sh ```sh
sudo -u jenkins /usr/bin/jenkins --httpPort=8081 --httpListenAddress=0.0.0.0 sudo -u jenkins /usr/bin/jenkins --httpPort=8081 --httpListenAddress=0.0.0.0
``` ```
```sh ```sh
sudo mcedit /lib/systemd/system/jenkins.service sudo mcedit /lib/systemd/system/jenkins.service
``` ```
```sh ```sh
sudo systemctl start jenkins && sudo systemctl start jenkins &&
sudo systemctl enable jenkins && sudo systemctl enable jenkins &&
sudo systemctl status jenkins sudo systemctl status jenkins
``` ```
```sh ```sh
sudo journalctl -xeu jenkins.service | tail -n 50 sudo journalctl -xeu jenkins.service | tail -n 50
``` ```
Если порт занят, проверяем кем: Если порт занят, проверяем кем:
```sh ```sh
sudo lsof -i :8081 sudo lsof -i :8081
``` ```
Переопределяем порт: Переопределяем порт:
```sh ```sh
sudo mcedit /etc/default/jenkins sudo mcedit /etc/default/jenkins
``` ```
```conf ```conf
HTTP_PORT=8081 HTTP_PORT=8081
``` ```
```sh ```sh
sudo systemctl restart jenkins sudo systemctl restart jenkins
``` ```
```sh ```sh
start http://127.0.0.1:8081 start http://127.0.0.1:8081
``` ```
See what port in locked See what port in locked
```sh ```sh
netstat -tpln netstat -tpln
``` ```

83
CI_CD/Woodpecker_CI.md Normal file
View File

@ -0,0 +1,83 @@
```sh
ssh igor@192.168.200.87 -p 22
```
Install
```sh
sudo apt update &&
sudo apt upgrade -y &&
sudo apt-get install python3-venv python3-pip &&
sudo apt install docker.io -y &&
sudo apt install -y docker-compose &&
sudo systemctl enable docker &&
sudo systemctl start docker &&
sudo usermod -aG docker $USER &&
docker-compose --version
```
Create folder for Woodpecker
```sh
sudo mkdir -p /opt/woodpecker &&
cd /opt/woodpecker
```
```sh
cd /opt/woodpecker
sudo tee docker-compose.yml <<'EOF'
services:
woodpecker-server:
image: woodpeckerci/woodpecker-server:latest
restart: always
ports:
- "8000:8000" # Web UI
- "8081:9000" # RPC
environment:
WOODPECKER_OPEN: "true" # Открытый доступ, можно отключить позже
WOODPECKER_HOST: "http://192.168.200.87:8000"
WOODPECKER_GITEA: "true"
WOODPECKER_GITEA_URL: "https://git.mesh.kz"
WOODPECKER_GITEA_CLIENT: "e38fdb9c-2878-4e12-9f9a-f75cc7e7e7e3"
WOODPECKER_GITEA_SECRET: "gto_gapgutecxrghq4sgbv5lrhoht3h5vfgo6ewidf7uxawkn7fhpuma"
WOODPECKER_ADMIN: "your-admin-username"
volumes:
- woodpecker-data:/var/lib/woodpecker
woodpecker-agent:
image: woodpeckerci/woodpecker-agent:latest
restart: always
depends_on:
- woodpecker-server
environment:
WOODPECKER_SERVER: "woodpecker-server:9000"
WOODPECKER_SECRET: "supersecret"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
volumes:
woodpecker-data:
EOF
```
```sh
cd /opt/woodpecker &&
sudo docker-compose up -d
```
```sh
cd /opt/woodpecker &&
sudo docker-compose down
```
Open URL in browser
```sh
start http://192.168.200.87:8000
```
Create OAuth2 Application in:
```conf
https://git.mesh.kz/user/settings/applications
https://git.mesh.kz/org/ccalm.org/settings/applications
http://192.168.200.87:8000/authorize
```

View File

@ -1,138 +1,139 @@
# 📌 Установка Gotify в Docker на Ubuntu 24.04 # 📌 Установка Gotify в Docker на Ubuntu 24.04
## 1. Установка Docker и Docker Compose ## 1. Установка Docker и Docker Compose
Если Docker не установлен, установим его: Если Docker не установлен, установим его:
```sh ```sh
sudo apt update && sudo apt upgrade -y sudo apt update && sudo apt upgrade -y
sudo apt install -y docker.io docker-compose sudo apt install -y docker.io docker-compose
sudo systemctl enable --now docker sudo systemctl enable --now docker
``` ```
Проверим версию: Проверим версию:
```sh ```sh
docker --version docker --version
docker-compose --version docker-compose --version
``` ```
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
## 2. Создание директории для Gotify ## 2. Создание директории для Gotify
Лучшее место для сторонних сервисов — `/opt`: Лучшее место для сторонних сервисов — `/opt`:
```sh ```sh
sudo mkdir -p /opt/gotify sudo mkdir -p /opt/gotify
cd /opt/gotify cd /opt/gotify
``` ```
## 3. Создаём самоподписанный сертификат ## 3. Создаём самоподписанный сертификат
```sh ```sh
sudo mkdir -p /opt/gotify/certs && cd /opt/gotify/certs sudo mkdir -p /opt/gotify/certs && cd /opt/gotify/certs
openssl req -x509 -newkey rsa:4096 -keyout gotify.key -out gotify.crt -days 365 -nodes -subj "/CN=your.domain.com" openssl req -x509 -newkey rsa:4096 -keyout gotify.key -out gotify.crt -days 365 -nodes -subj "/CN=your.domain.com"
``` ```
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
## 3. Создание `docker-compose.yml` ## 3. Создание `docker-compose.yml`
Создадим конфигурацию: Создадим конфигурацию:
```sh ```sh
sudo mcedit /opt/gotify/docker-compose.yml sudo mcedit /opt/gotify/docker-compose.yml
``` ```
Добавляем: Добавляем:
```yaml ```yaml
services: services:
gotify: gotify:
image: gotify/server image: gotify/server
container_name: gotify container_name: gotify
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- "./certs:/certs" - "./certs:/certs"
- "./data:/app/data" - "./data:/app/data"
ports: ports:
- "8080:443" # HTTPS - "8080:443" # HTTPS
environment: environment:
- GOTIFY_DEFAULTUSER_NAME=admin - GOTIFY_DEFAULTUSER_NAME=admin
- GOTIFY_DEFAULTUSER_PASS=s23uBXreliGIAVOohXhW - GOTIFY_DEFAULTUSER_PASS=s23uBXreliGIAVOohXhW
- TZ=Asia/Almaty - TZ=Asia/Almaty
- GOTIFY_SERVER_SSL_ENABLED=true - GOTIFY_SERVER_SSL_ENABLED=true
- GOTIFY_SERVER_SSL_CERTFILE=/certs/gotify.crt - GOTIFY_SERVER_SSL_CERTFILE=/certs/gotify.crt
- GOTIFY_SERVER_SSL_CERTKEY=/certs/gotify.key - GOTIFY_SERVER_SSL_CERTKEY=/certs/gotify.key
networks: - GIN_MODE=debug
- gotify-net networks:
- gotify-net
networks:
gotify-net: networks:
driver: bridge gotify-net:
``` driver: bridge
💡 **Что здесь важно?** ```
- **`security_opt: - no-new-privileges:true`** → запрещает повышать привилегии в контейнере. 💡 **Что здесь важно?**
- **`volumes: ./data:/app/data`** → сохраняет данные вне контейнера. - **`security_opt: - no-new-privileges:true`** → запрещает повышать привилегии в контейнере.
- **`restart: unless-stopped`** → перезапускает Gotify, если он внезапно упадёт. - **`volumes: ./data:/app/data`** → сохраняет данные вне контейнера.
- **`ports: - "8080:80"`** → Gotify будет доступен на порту `8080`. - **`restart: unless-stopped`** → перезапускает Gotify, если он внезапно упадёт.
- **`ports: - "8080:80"`** → Gotify будет доступен на порту `8080`.
🔑 **Замените пароль** (`supersecretpassword`) на свой!
🔑 **Замените пароль** (`supersecretpassword`) на свой!
---
---
## 4. Запуск Gotify
Запускаем контейнер: ## 4. Запуск Gotify
```sh Запускаем контейнер:
cd /opt/gotify ```sh
sudo docker compose down cd /opt/gotify
sudo docker-compose up -d sudo docker compose down
``` sudo docker-compose up -d
Проверяем статус: ```
```sh Проверяем статус:
sudo docker ps ```sh
``` sudo docker ps
Вы должны увидеть работающий контейнер `gotify`. ```
Вы должны увидеть работающий контейнер `gotify`.
---
---
## 5. Проверка работы
Открываем браузер и переходим: ## 5. Проверка работы
👉 **https://192.168.200.84:8080** Открываем браузер и переходим:
👉 **https://gotify.locust.kz:8443** 👉 **https://192.168.200.84:8080**
👉 **https://gotify.locust.kz:8443**
Логинимся:
- **Имя**: `admin` Логинимся:
- **Пароль**: тот, что указан в `GOTIFY_DEFAULTUSER_PASS` - **Имя**: `admin`
- **Пароль**: тот, что указан в `GOTIFY_DEFAULTUSER_PASS`
---
---
## 6. Автоматический запуск при загрузке
Docker уже настроен на автозапуск, но проверим: ## 6. Автоматический запуск при загрузке
```sh Docker уже настроен на автозапуск, но проверим:
sudo systemctl enable --now docker ```sh
``` sudo systemctl enable --now docker
Чтобы Gotify запускался автоматически: ```
```sh Чтобы Gotify запускался автоматически:
cd /opt/gotify ```sh
sudo docker-compose restart cd /opt/gotify
``` sudo docker-compose restart
```
---
---
## 7. Логи и управление
Просмотр логов: ## 7. Логи и управление
```sh Просмотр логов:
sudo docker-compose logs -f ```sh
``` sudo docker-compose logs -f
Перезапуск контейнера: ```
```sh Перезапуск контейнера:
sudo docker-compose restart ```sh
``` sudo docker-compose restart
Остановка: ```
```sh Остановка:
sudo docker-compose down ```sh
``` sudo docker-compose down
```
---
---
## 8. Удаление Gotify (если потребуется)
```sh ## 8. Удаление Gotify (если потребуется)
cd /opt/gotify ```sh
sudo docker-compose down cd /opt/gotify
sudo rm -rf /opt/gotify sudo docker-compose down
``` sudo rm -rf /opt/gotify
```
---
---
## ✅ Готово!
Теперь Gotify работает на порту `80` с безопасными настройками (`no-new-privileges:true`). 🚀 ## ✅ Готово!
Теперь Gotify работает на порту `80` с безопасными настройками (`no-new-privileges:true`). 🚀

View File

@ -1,38 +1,38 @@
Открываю нужный сервер Открываю нужный сервер
```sh ```sh
wsl wsl
``` ```
```sh ```sh
curl -sSX POST https://istt-kz.zulipchat.com/api/v1/fetch_api_key \ curl -sSX POST https://istt-kz.zulipchat.com/api/v1/fetch_api_key \
--data-urlencode username=ivanov.i@istt.kz \ --data-urlencode username=ivanov.i@istt.kz \
--data-urlencode password=fsUHb3hf3QCdpBLsKyhL --data-urlencode password=fsUHb3hf3QCdpBLsKyhL
``` ```
Выдало: Выдало:
```json ```json
{ {
"result":"success", "result":"success",
"msg":"", "msg":"",
"api_key":"91kQqr13HCwFP2HeARWPHxrfksYPH82p", "api_key":"91kQqr13HCwFP2HeARWPHxrfksYPH82p",
"email":"ivanov.i@istt.kz", "email":"ivanov.i@istt.kz",
"user_id":880555 "user_id":880555
} }
``` ```
```sh ```sh
curl -X POST https://istt-kz.zulipchat.com/api/v1/messages \ curl -X POST https://istt-kz.zulipchat.com/api/v1/messages \
-u "ivanov.i@istt.kz:91kQqr13HCwFP2HeARWPHxrfksYPH82p" \ -u "ivanov.i@istt.kz:91kQqr13HCwFP2HeARWPHxrfksYPH82p" \
-d "type=stream" \ -d "type=stream" \
-d "to=general" \ -d "to=general" \
-d "topic=Тест5" \ -d "topic=Тест5" \
-d "content=Привет из консоли!" -d "content=Привет из консоли!"
``` ```
```sh ```sh
curl -X POST https://istt-kz.zulipchat.com/api/v1/messages \ curl -X POST https://istt-kz.zulipchat.com/api/v1/messages \
-u "ivanov.i@istt.kz:91kQqr13HCwFP2HeARWPHxrfksYPH82p" \ -u "ivanov.i@istt.kz:91kQqr13HCwFP2HeARWPHxrfksYPH82p" \
-d "type=private" \ -d "type=private" \
-d "to=ivanov.i@istt.kz" \ -d "to=ivanov.i@istt.kz" \
-d "topic=Тест5" \ -d "topic=Тест5" \
-d "content=Привет из консоли!" -d "content=Привет из консоли!"
``` ```

215
DNS/BIND_install.md Normal file
View File

@ -0,0 +1,215 @@
****************************************************************************************************
## 1. Подключаемся к нужному серверу
```sh
ssh root@bigfoottrade.kz -p 2222
```
****************************************************************************************************
Собственный DynDNS на Linux для observer.kz для начала устанавливаем BIND 9.13 and later по этому мануалу https://www.dmosk.ru/miniinstruktions.php?mini=bind-ubuntu и по этому для новой версии https://www.netss.by/?p=26
```sh
sudo apt-get update &&
sudo apt-get install bind9 dnsutils &&
sudo apt-get install bind9utils
```
Adding the service to autostart
```sh
systemctl enable bind9
```
Checking if the service is working
```sh
nslookup dmosk.ru 127.0.0.1
```
Opening the configuration file
```sh
mcedit /etc/bind/named.conf.options
```
Для глобальных запросов добавляем строку: allow-query { any; };
Также добавляем в этот файл DNS сервера пересылки, на них будут перенаправляться запросы если локальный не содержит данных
//forwarders {
// 8.8.8.8;
// 8.8.4.4;
//};
Проверяем настройки командой (ответ должен быть пустым):
sudo named-checkconf
Перезагружаем:
sudo systemctl restart bind9
Проверяю версию BIND:
named -v
Выдало: BIND 9.16.1-Ubuntu (Stable Release) <id:d497c32>
Можно проверить какой IP выдаст на DNS запрос
dig locust.kz A
На этом базовая настройка закончена. Наш сервер готов принимать и отдавать запросы и работать, как кэширующий dns.
Смотрим какие зоны поддерживает bind:
```sh
mcedit /etc/bind/named.conf.local
```
смотрим подробнее что записано в зоне:
```sh
sudo cat /var/cache/bind/dirt.kz
```
Далее создаём клиента согласно: https://help.ubuntu.ru/wiki/динамический_днс_своими_руками
Перейдем в него.
cd /etc/bind/
Генерируем пару ключь для обмена информацией между клиентом и сервером:
sudo tsig-keygen -a hmac-sha512 dirt.kz > dirt.kz.key
sudo tsig-keygen -a hmac-sha512 locust.kz > locust.kz.key
Для загрузки ключа добавляем его файл mcedit /etc/bind/named.conf строчку с указанием файла, где определен ключ.
include "/etc/bind/dirt.kz.key";
include "/etc/bind/locust.kz.key";
Следующим шагом необходимо в файл mcedit /etc/bind/named.conf.local прописать доменную зону, которой мы оперируем.
zone "dirt.kz" {
type master;
allow-update {key dirt.kz;};
file "/var/cache/bind/dirt.kz";
};
zone "locust.kz" {
type master;
allow-update {key locust.kz;};
file "/var/cache/bind/locust.kz";
};
В файле "mcedit /var/cache/bind/dirt.kz" должны быть прописанны записи домена где:
В файле "mcedit /var/cache/bind/locust.kz" должны быть прописанны записи домена где:
Поле $ORIGIN для подставки имени в знак @, поэтому знак @ не используется просто так в тексте
Если используется символ @ то он заменяется на то что было прописанно в $ORIGIN смотреть в: https://help.dyn.com/how-to-format-a-zone-file/
SOA — Начало полномочий подробней смотри в https://k.psu.ru/wiki/BIND9_(методическое_пособие)#SOA
NS — Сервер имён
A — рекорд
MX — Почта для обмена
CN — Каноническое имя
PTR — указатель
И таким содержимым:
$ORIGIN dirt.kz
$TTL 604800
@ IN SOA bigfoottrade.kz. root.bigfoottrade.kz. (
8 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS bigfoottrade.kz.
Второй файл для locust.kz:
$ORIGIN .
$TTL 604800 ; 1 week
locust.kz IN SOA bigfoottrade.kz. irigm.mail.ru. (
134 ; serial
604800 ; refresh (1 week)
86400 ; retry (1 day)
1419200 ; expire (2 weeks 2 days 10 hours 13 minutes 20 seconds)
604800 ; minimum (1 week)
)
NS bigfoottrade.kz.
$TTL 3600 ; 1 hour
A 5.76.254.182
$ORIGIN locust.kz.
* A 127.0.0.1
Правлю права доступа:
sudo chown -R bind:bind /etc/bind
Если настройки были первоначальными то стоит удалить файл /var/cache/bind/locust.kz.jnl и переинициализировать его командой:
sudo rndc reconfig
Потом следует вызвать:
sudo systemctl restart bind9
Команда выше также переписывет накопившиеся данные из /var/cache/bind/locust.kz.jnl в /var/cache/bind/locust.kz так что после обновления если охото быстрей взглянуть на текстовое значение следует повторно вызвать эту команду
После настроек сервера перезагружаем его:
sudo named-checkconf
sudo rndc reload
sudo systemctl restart bind9
sudo rndc status
journalctl | grep bind
sudo journalctl -u bind9 -n 50
Создаю скрипт /etc/ddns/ddns.sh для обновления доменных зон удалённо с доступом по ключу:
Файл из примера:
#!/bin/bash
TTL=3600
SERVER=ns.dyndns.my
HOSTNAME=dhost.dyndns.my
ZONE=dyndns.my
KEYFILE=Kdyndns.my.+157+48025.private
new_ip_address=`curl http://dyndns.my/ip.php` #Этот файлик создадим позднее на сервере!
cd /etc/ddns
nsupdate -v -k $KEYFILE << EOF
server $SERVER
zone $ZONE
update delete $HOSTNAME A
update add $HOSTNAME $TTL A $new_ip_address
send
EOF
Мой модифицированный файл для обновления IP в Bind9 DNS сервису по созданному файлу ip.txt, файл ip.txt создаётся в PHP скрипте который описан ниже:
#!/bin/bash
TTL=3600
SERVER=127.0.0.1
HOSTNAME=*.dirt.kz
ZONE=dirt.kz
KEYFILE=/etc/bind/dirt.kz.key
new_ip_address=
FILE=/etc/ddns/ip.txt
if test -f "$FILE"; then
new_ip_address=`cat $FILE`
rm $FILE
fi
len=${#new_ip_address}
if [ $len -gt 3 ]
then
echo "New IP address = $new_ip_address"
else
echo "Not find IP address"
exit
fi
cd /etc/ddns
sudo nsupdate -v -k $KEYFILE << EOF
server $SERVER
zone $ZONE
update delete $HOSTNAME A
update add $HOSTNAME $TTL A $new_ip_address
update delete dirt.kz A
update add dirt.kz $TTL A $new_ip_address
send
EOF
echo "OK"
Так как PHP работает за HAProxy то немного модифицировал скрипт который сохраняет IP обратившегося клиента в файл, а именно использую "x-forwarded-for" для передачи IP адреса клиента:
<?php
echo '<pre>'; print_r(getallheaders()); echo '</pre>';
// PROBLEM IS each browser has different "x-forwarder-for" some "X-Forwarder-for" and some browser gave you 2x ip "x.x.x.x, x.x.x.x"
foreach ( getallheaders() as $k => $v) {
if ( strtolower($k) == 'x-forwarded-for' ) {
$tmp = explode(', ', $v);
if ( $tmp[count($tmp)-1] != '' )
$_SERVER['REMOTE_ADDR'] = $tmp[count($tmp)-1];
}
}
if(isset($_GET["key"]) && $_GET["key"]=='4fygxNq539NFfUm6SOd2vn52GwL7o7NA'){
$myfile = fopen("/etc/ddns/ip.txt", "w");
fwrite($myfile, $_SERVER['REMOTE_ADDR']);
fclose($myfile);
}
echo $_SERVER['REMOTE_ADDR'];
?>
Проверяем что находит IP по доменному имени
nslookup dirt.kz 127.0.0.1

View File

@ -2,7 +2,7 @@
**************************************************************************************************** ****************************************************************************************************
## 2. Подключаемся к нужному серверу ## 2. Подключаемся к нужному серверу
```sh ```sh
ssh igor@192.168.200.85 -p 22 ssh root@bigfoottrade.kz -p 2222
``` ```
Connect to CCALM Georgia infrastructure: Connect to CCALM Georgia infrastructure:
```sh ```sh
@ -15,31 +15,32 @@ DNS на Ubuntu 24.04 согласно инстркции https://phoenixnap.com
Можно было-бы использовать не 53 порт, но провайдер не даёт указывать порт при настройке DNS серверов (не знаю какие локальные проблемы могут возникнуть если задать не 53 порт) Можно было-бы использовать не 53 порт, но провайдер не даёт указывать порт при настройке DNS серверов (не знаю какие локальные проблемы могут возникнуть если задать не 53 порт)
Устанавливаем сам PowerDNS https://doc.powerdns.com/authoritative/installation.html Устанавливаем сам PowerDNS https://doc.powerdns.com/authoritative/installation.html
Для установки версии поновее PowerDNS 4.8.5:
```sh
sudo apt install curl gnupg lsb-release &&
curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/pdns.gpg &&
echo "deb [signed-by=/etc/apt/trusted.gpg.d/pdns.gpg] http://repo.powerdns.com/ubuntu $(lsb_release -cs)-auth-48 main" | sudo tee /etc/apt/sources.list.d/pdns.list
```
```sh ```sh
sudo apt-get update && sudo apt-get update &&
sudo apt-get upgrade -y sudo apt-get upgrade -y
``` ```
Install PowerDNS server Install PowerDNS server
```sh ```sh
sudo apt-get install pdns-server -y sudo apt-get install pdns-server -y &&
sudo apt-get install pdns-backend-bind
``` ```
На всякий случай делаю резервные копии исходных файлов настрое:
```sh
cd /etc/powerdns &&
sudo cp named.conf named.conf.bak &&
sudo cp pdns.conf pdns.conf.bak
```
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
Как настроить MariaDB базу для использования в PowerDNS смотри: Как настроить MariaDB базу для использования в PowerDNS смотри:
[Установка PowerDNS с MariaDB](./PowerDNS_install_MarinaDB.md) [Установка PowerDNS с MariaDB](./PowerDNS_install_MarinaDB.md)
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
Как настроить SQLite3 базу для использования в PowerDNS смотри: Как настроить SQLite3 базу для использования в PowerDNS смотри:
[Установка PowerDNS с MariaDB](./PowerDNS_install_SQIite3.md) [Установка PowerDNS с SQIite3](./PowerDNS_install_SQIite3.md)
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
Как настроить PostgreSQL базу для использования в PowerDNS смотри: Как настроить PostgreSQL базу для использования в PowerDNS смотри:
[Установка PowerDNS с MariaDB](./PowerDNS_install_PostgreSQL.md) [Установка PowerDNS с PostgreSQL](./PowerDNS_install_PostgreSQL.md)
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
Наспройку файла pdns.conf авторитетный сервер, есть такой пример который следует изучить: https://raw.githubusercontent.com/trinv/PowerDNS/a56b9122f4a2de9c1f789009f09b9831f74d8bf1/pdns.template.master.conf (естественно без 1й табуляции): Наспройку файла pdns.conf авторитетный сервер, есть такой пример который следует изучить: https://raw.githubusercontent.com/trinv/PowerDNS/a56b9122f4a2de9c1f789009f09b9831f74d8bf1/pdns.template.master.conf (естественно без 1й табуляции):
@ -48,6 +49,12 @@ sudo cp pdns.conf pdns.conf.bak
sudo mcedit /etc/powerdns/pdns.conf sudo mcedit /etc/powerdns/pdns.conf
``` ```
```sh
sudo mkdir /var/run/pdns &&
sudo chown pdns:pdns /var/run/pdns &&
sudo chmod 750 /var/run/pdns
```
Write new settings rr Write new settings rr
```sh ```sh
cd /etc/powerdns/ && cd /etc/powerdns/ &&
@ -57,9 +64,10 @@ allow-axfr-ips=127.0.0.1
also-notify=127.0.0.1 also-notify=127.0.0.1
include-dir=/etc/powerdns/pdns.d include-dir=/etc/powerdns/pdns.d
launch= launch=bind
local-address=88.218.94.134,127.0.0.1
local-address=77.240.38.108,127.0.0.1
local-port=53 local-port=53
log-dns-details=on log-dns-details=on
@ -68,9 +76,9 @@ log-timestamp=yes
loglevel=4 loglevel=4
webserver=yes webserver=yes
webserver-address=127.0.0.1 webserver-address=0.0.0.0
webserver-allow-from=::/0, 0.0.0.0/0 webserver-allow-from=::/0, 0.0.0.0/0
webserver-port=8091 webserver-port=8070
master=yes master=yes
slave=no slave=no
@ -80,14 +88,28 @@ api=yes
api-key=40c89f2a-e2f3-4ff8-a245-3547111f6677 api-key=40c89f2a-e2f3-4ff8-a245-3547111f6677
EOF EOF
``` ```
```sh
sudo chown pdns:pdns /etc/powerdns/pdns.conf &&
sudo chmod 640 /etc/powerdns/pdns.conf
```
Также пробуем запустить под pdns:
```sh
sudo rm -f /var/run/pdns.controlsocket &&
sudo -u pdns /usr/sbin/pdns_server --config-dir=/etc/powerdns
```
Проверяю соединение к базе перезапустив PowerDNS: Проверяю соединение к базе перезапустив PowerDNS:
```sh ```sh
sudo systemctl stop pdns && sudo systemctl stop pdns &&
sudo pdns_server --daemon=no --guardian=no --loglevel=9 sudo pdns_server --daemon=no --guardian=no --loglevel=9
``` ```
Пытаемся открыть WEB интерфейс Пытаемся открыть WEB интерфейс
```sh ```sh
start http://88.218.94.134:8081 start http://77.240.38.108:8070
``` ```
Если всё норм выполняем: Если всё норм выполняем:
@ -111,20 +133,85 @@ start http://88.218.94.134:8081
sudo pdnsutil create-zone test ns1.test && sudo pdnsutil create-zone test ns1.test &&
sudo pdnsutil add-record test ccalm A 192.168.200.184 sudo pdnsutil add-record test ccalm A 192.168.200.184
``` ```
Добавляем зону и две записи Добавляем зону и записи
```sh ```sh
sudo pdnsutil create-zone geovizor.top ns1.geovizor.top && sudo pdnsutil create-zone mesh.kz &&
sudo pdnsutil replace-rrset geovizor.top @ SOA "ns1.geovizor.top admin.geovizor.top $(date +%Y%m%d)01 10800 3600 604800 3600" && sudo pdnsutil replace-rrset mesh.kz @ SOA "ns1.mesh.kz admin.mesh.kz $(date +%Y%m%d)01 10800 3600 604800 3600" &&
sudo pdnsutil add-record geovizor.top ns1 A 88.218.94.134 && sudo pdnsutil add-record mesh.kz @ A 5.251.150.30 &&
sudo pdnsutil add-record geovizor.top ns2 A 88.218.94.134 && sudo pdnsutil add-record mesh.kz "*" A 5.251.150.30 &&
sudo pdnsutil add-record geovizor.top @ A 88.218.94.134 && sudo pdnsutil add-record mesh.kz @ CAA 3600 "0 issue \"letsencrypt.org\"" &&
sudo pdnsutil add-record geovizor.top * A 88.218.94.134 && sudo pdnsutil add-record mesh.kz @ TXT 3600 "\"v=spf1 ip4:77.240.38.108 -all\"" &&
sudo pdnsutil add-record geovizor.top @ CAA 3600 "0 issue \"letsencrypt.org\"" && sudo pdnsutil add-record mesh.kz @ MX 3600 "10 mail.mesh.kz." &&
sudo pdnsutil add-record geovizor.top @ TXT 3600 "\"v=spf1 ip4:88.218.94.134 -all\"" && sudo pdnsutil add-record mesh.kz mail A 3600 77.240.38.108
sudo pdnsutil add-record geovizor.top @ MX 3600 "10 mail.geovizor.top." && sudo pdnsutil add-record mesh.kz @ NS 3600 ns1.mesh.kz
sudo pdnsutil add-record geovizor.top mail A 3600 88.218.94.134 && sudo pdnsutil add-record mesh.kz @ NS 3600 ns2.mesh.kz
sudo pdnsutil add-record geovizor.top powerdns A 3600 88.218.94.134
``` ```
```sh
sudo pdnsutil create-zone dirt.kz &&
sudo pdnsutil replace-rrset dirt.kz @ SOA "ns1.dirt.kz admin.dirt.kz $(date +%Y%m%d)01 10800 3600 604800 3600" &&
sudo pdnsutil add-record dirt.kz @ A 5.251.150.30 &&
sudo pdnsutil add-record dirt.kz "*" A 5.251.150.30 &&
sudo pdnsutil add-record dirt.kz @ CAA 3600 "0 issue \"letsencrypt.org\"" &&
sudo pdnsutil add-record dirt.kz @ TXT 3600 "\"v=spf1 ip4:77.240.38.108 -all\"" &&
sudo pdnsutil add-record dirt.kz @ MX 3600 "10 mail.dirt.kz." &&
sudo pdnsutil add-record dirt.kz mail A 3600 77.240.38.108 &&
sudo pdnsutil add-record dirt.kz @ NS 3600 ns1.dirt.kz &&
sudo pdnsutil add-record dirt.kz @ NS 3600 ns2.dirt.kz &&
sudo pdnsutil add-record dirt.kz ns1 A 77.240.38.108 &&
sudo pdnsutil add-record dirt.kz ns2 A 77.240.38.108
```
```sh
sudo pdnsutil create-zone geovizor.top &&
sudo pdnsutil replace-rrset geovizor.top @ SOA "ns1.geovizor.top admin.geovizor.top $(date +%Y%m%d)01 10800 3600 604800 3600" &&
sudo pdnsutil add-record geovizor.top @ A 5.251.150.30 &&
sudo pdnsutil add-record geovizor.top "*" A 5.251.150.30 &&
sudo pdnsutil add-record geovizor.top @ CAA 3600 "0 issue \"letsencrypt.org\"" &&
sudo pdnsutil add-record geovizor.top @ TXT 3600 "\"v=spf1 ip4:77.240.38.108 -all\"" &&
sudo pdnsutil add-record geovizor.top @ MX 3600 "10 mail.geovizor.top." &&
sudo pdnsutil add-record geovizor.top mail A 3600 77.240.38.108 &&
sudo pdnsutil add-record geovizor.top @ NS 3600 ns1.geovizor.top &&
sudo pdnsutil add-record geovizor.top @ NS 3600 ns2.geovizor.top &&
sudo pdnsutil add-record geovizor.top ns1 A 77.240.38.108 &&
sudo pdnsutil add-record geovizor.top ns2 A 77.240.38.108
```
```sh
sudo pdnsutil create-zone locust.kz &&
sudo pdnsutil replace-rrset locust.kz @ SOA "ns1.locust.kz admin.locust.kz $(date +%Y%m%d)01 10800 3600 604800 3600" &&
sudo pdnsutil add-record locust.kz @ A 5.251.150.30 &&
sudo pdnsutil add-record locust.kz "*" A 5.251.150.30 &&
sudo pdnsutil add-record locust.kz @ CAA 3600 "0 issue \"letsencrypt.org\"" &&
sudo pdnsutil add-record locust.kz @ TXT 3600 "\"v=spf1 ip4:77.240.38.108 -all\"" &&
sudo pdnsutil add-record locust.kz @ MX 3600 "10 mail.locust.kz." &&
sudo pdnsutil add-record locust.kz mail A 3600 77.240.38.108
sudo pdnsutil add-record locust.kz @ NS 3600 ns1.locust.kz
sudo pdnsutil add-record locust.kz @ NS 3600 ns2.locust.kz
```
```sh
sudo pdnsutil create-zone locust.ge &&
sudo pdnsutil replace-rrset locust.ge @ SOA "ns1.geovizor.top admin.locust.ge $(date +%Y%m%d)01 10800 3600 604800 3600" &&
sudo pdnsutil add-record locust.ge @ A 88.218.94.134 &&
sudo pdnsutil add-record locust.ge "*" A 88.218.94.134 &&
sudo pdnsutil add-record locust.ge @ CAA 3600 "0 issue \"letsencrypt.org\"" &&
sudo pdnsutil add-record locust.ge @ TXT 3600 "\"v=spf1 ip4:88.218.94.134 -all\"" &&
sudo pdnsutil add-record locust.ge @ MX 3600 "10 mail.locust.ge." &&
sudo pdnsutil add-record locust.ge mail A 3600 88.218.94.134
sudo pdnsutil add-record locust.ge @ NS 3600 ns1.geovizor.top
sudo pdnsutil add-record locust.ge @ NS 3600 ns2.geovizor.top
```
For deleting record please run command:
```sh
sudo pdnsutil delete-rrset locust.ge locust.ge.locust.ge NS
sudo pdnsutil delete-rrset geovizor.top gotify A
```
Выше задал такие настройки как Выше задал такие настройки как
```conf ```conf
Refresh = 10800 (3 часа) Refresh = 10800 (3 часа)
@ -137,12 +224,15 @@ Minimum = 3600 (1 час)
Проверим список зон Проверим список зон
```sh ```sh
sudo pdnsutil list-all-zones && sudo pdnsutil list-all-zones &&
sudo pdnsutil list-zone geovizor.top sudo pdnsutil list-zone mesh.kz
``` ```
Проверяем отвечалет ли: Проверяем отвечалет ли:
```sh ```sh
dig @127.0.0.1 -p 5300 ccalm.test A dig @127.0.0.1 -p 53 mesh.kz A
``` ```
dig @77.240.38.108 -p 53 mesh.kz A
```sh ```sh
dig @127.0.0.1 -p 53 geovizor.top A dig @127.0.0.1 -p 53 geovizor.top A
``` ```
@ -156,6 +246,22 @@ dig @88.218.94.134 -p 53 powerdns.geovizor.top A
### Теперь можно настроить HTTPS для взаимодействия через API с сервером для динамического задания IP адресов ### Теперь можно настроить HTTPS для взаимодействия через API с сервером для динамического задания IP адресов
```sh ```sh
new_ip_address=
FILE=/etc/ddns/mesh.txt
if test -f "$FILE"; then
new_ip_address=`cat $FILE`
rm $FILE
fi
len=${#new_ip_address}
if [ $len -gt 3 ]
then
echo "New IP address = $new_ip_address"
else
echo "Not find IP address"
exit
fi
API_KEY="40c89f2a-e2f3-4ff8-a245-3547111f6677" API_KEY="40c89f2a-e2f3-4ff8-a245-3547111f6677"
SERVER="156.244.31.209" SERVER="156.244.31.209"
ZONE="geovizor.top" ZONE="geovizor.top"
@ -182,8 +288,6 @@ curl -X PATCH \
}' }'
``` ```
## ********** Настройка рекурсивного DNS от PowerDNS Recursor 4.9.3 порту 53 будет обрабатывать запросы с локальной машины ********** ## ********** Настройка рекурсивного DNS от PowerDNS Recursor 4.9.3 порту 53 будет обрабатывать запросы с локальной машины **********
Документация: https://doc.powerdns.com/recursor/index.html Документация: https://doc.powerdns.com/recursor/index.html
Документация: https://docs.powerdns.com/recursor/indexTOC.html Документация: https://docs.powerdns.com/recursor/indexTOC.html
@ -277,7 +381,7 @@ journalctl -u pdns-recursor --no-pager | tail -n 50
``` ```
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
## ********** По идее отключать не нужно так как systemd-resolved использует другой IP: 127.0.0.54:53 (Отключаю systemd-resolved иначе он будет конфликтовать с PowerDNS) ********** ## ********** По идее systemd-resolved отключать не нужно так как он использует другой IP: 127.0.0.54:53 **********
Редактирую /etc/netplan/ для того чтобы прописать поднятый DNS сервер на 127.0.0.1 (не знаю сработает ли так как отключу systemd-resolved) Редактирую /etc/netplan/ для того чтобы прописать поднятый DNS сервер на 127.0.0.1 (не знаю сработает ли так как отключу systemd-resolved)
```sh ```sh
@ -526,7 +630,7 @@ open http://192.168.200.85:9191/login
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
Настраиваем запус на постоянную работу через Gunicorn и systemd Настраиваем запуск на постоянную работу через Gunicorn и systemd
```sh ```sh
cd /opt/web/powerdns-admin && cd /opt/web/powerdns-admin &&

View File

@ -127,3 +127,17 @@ sudo chmod 640 /etc/powerdns/pdns.d/pdns.local.sqlite.conf
``` ```
In PowerDNS configured to auto read config from dir /etc/powerdns/pdns.d/ In PowerDNS configured to auto read config from dir /etc/powerdns/pdns.d/
For delete record from SQLite run:
```sh
cp /var/lib/powerdns/pdns.sqlite3 /var/lib/powerdns/pdns.sqlite3.bak
sqlite3 /var/lib/powerdns/pdns.sqlite3
SELECT id, name FROM domains WHERE name = 'locust.ge';
SELECT id, name, type, content FROM records WHERE name = 'locust.ge.locust.ge' AND type = 'NS';
DELETE FROM records WHERE id IN (25, 26, 27, 28);
.exit
pdns_control notify locust.ge
```

52
DNS/Ubuntu_config.md Normal file
View File

@ -0,0 +1,52 @@
Чтобы в Ubuntu все домены с маской *.local отправлялись на DNS-сервер 192.168.200.85 (где работает PowerDNS на порту 53), тебе нужно настроить DNS-резолвинг так, чтобы:
Все запросы к доменам, оканчивающимся на .local, отправлялись на указанный DNS.
Остальные домены резолвились через системный DNS как обычно.
✅ Способ 1: Использовать systemd-resolved (рекомендуется для Ubuntu 18.04+, особенно 20.04 и 22.04)
Ubuntu по умолчанию использует systemd-resolved, который поддерживает пер-доменное направление DNS-запросов.
Шаги:
Создай файл в /etc/systemd/resolved.conf.d/:
```sh
ssh igor@192.168.200.84 -p 22
```
Создаю директорию
```sh
sudo mkdir -p /etc/systemd/resolved.conf.d &&
sudo mcedit /etc/systemd/resolved.conf.d/local-dns.conf
```
Прописываю содержимое:
```conf
[Resolve]
DNS=192.168.200.85
Domains=~local
```
Перезапускаю
```sh
sudo systemctl restart systemd-resolved &&
```
Проверяю настройки
```sh
resolvectl status
```
Проверяем
```sh
ping gotify.local
```
Проверяем сертификат:
```sh
curl https://gotify.local
```
Добавляем корневой сертификат для домена local.
```sh
sudo cp rootCA.crt /usr/local/share/ca-certificates/rootCA.crt &&
sudo update-ca-certificates
```

View File

@ -1,94 +1,94 @@
```sh ```sh
sudo apt update && sudo apt update &&
sudo apt install unbound -y && sudo apt install unbound -y &&
unbound -V unbound -V
``` ```
```sh ```sh
sudo systemctl start unbound && sudo systemctl start unbound &&
sudo systemctl enable unbound && sudo systemctl enable unbound &&
sudo systemctl status unbound sudo systemctl status unbound
``` ```
On Windows configuration is: On Windows configuration is:
```yaml ```yaml
server: server:
verbosity: 4 verbosity: 4
qname-minimisation: no qname-minimisation: no
interface: 127.0.0.1 interface: 127.0.0.1
do-ip6: no do-ip6: no
do-ip4: yes do-ip4: yes
logfile: "C:\unbound.log" logfile: "C:\unbound.log"
domain-insecure: "test." domain-insecure: "test."
domain-insecure: "local." domain-insecure: "local."
domain-insecure: "pizza." domain-insecure: "pizza."
auto-trust-anchor-file: "C:\Program Files\Unbound\root.key" auto-trust-anchor-file: "C:\Program Files\Unbound\root.key"
private-address: ::/0 private-address: ::/0
harden-dnssec-stripped: no harden-dnssec-stripped: no
harden-referral-path: no harden-referral-path: no
# Явно указываем, что зона "test." не локальная # Явно указываем, что зона "test." не локальная
local-zone: "test." transparent local-zone: "test." transparent
forward-zone: forward-zone:
name: "test." name: "test."
forward-addr: 192.168.200.85@5300 forward-addr: 192.168.200.85@5300
forward-zone: forward-zone:
name: "local." name: "local."
forward-addr: 192.168.200.85@5300 forward-addr: 192.168.200.85@5300
forward-zone: forward-zone:
name: "pizza." name: "pizza."
forward-addr: 10.101.1.31@53 forward-addr: 10.101.1.31@53
forward-zone: forward-zone:
name: "srv." name: "srv."
forward-addr: 10.101.1.31@53 forward-addr: 10.101.1.31@53
remote-control: remote-control:
control-enable: yes control-enable: yes
control-interface: 127.0.0.1 control-interface: 127.0.0.1
control-use-cert: no control-use-cert: no
``` ```
On Linux conf file devide on anoter files On Linux conf file devide on anoter files
```sh ```sh
sudo mcedit /etc/unbound/unbound.conf sudo mcedit /etc/unbound/unbound.conf
``` ```
```sh ```sh
cd /etc/unbound/ && cd /etc/unbound/ &&
sudo mc sudo mc
``` ```
Получить полный список локальных зон можно так: unbound-control Получить полный список локальных зон можно так: unbound-control
```sh ```sh
unbound-control list_local_zones unbound-control list_local_zones
``` ```
```sh ```sh
sudo systemctl restart unbound sudo systemctl restart unbound
``` ```
```sh ```sh
sudo systemctl status unbound.service sudo systemctl status unbound.service
``` ```
```sh ```sh
sudo journalctl -xeu unbound.service sudo journalctl -xeu unbound.service
``` ```
Check on errors: Check on errors:
```sh ```sh
sudo unbound-checkconf /etc/unbound/unbound.conf sudo unbound-checkconf /etc/unbound/unbound.conf
``` ```
Прописываем для определенного интерфейса: Прописываем для определенного интерфейса:
```sh ```sh
sudo resolvectl dns wlp14s0 127.0.0.1 sudo resolvectl dns wlp14s0 127.0.0.1
``` ```
Проверяем что стоит в качестве NDS резольвера Проверяем что стоит в качестве NDS резольвера
```sh ```sh
resolvectl status resolvectl status
``` ```

View File

@ -57,7 +57,7 @@ WantedBy=multi-user.target
На клиенте запускаем локальный порт также указал 9999 а ключь На клиенте запускаем локальный порт также указал 9999 а ключь
```sh ```sh
htc -F 9999 --base-uri /index.html?mybiglogfile=all 192.168.200.81:80 htc -F 9999 --base-uri /index.html?mybiglogfile=all 192.168.200.81:80
htc -F 9999 --base-uri /index.html?mybiglogfile=all locust.kz:80 htc -F 9999 --base-uri /index.html?mybiglogfile=all dirt.kz:8080
``` ```
Для остановки Для остановки

218
Keycloak_install.md Normal file
View File

@ -0,0 +1,218 @@
# Установка и базовая настройка Keycloak на Ubuntu
Это руководство описывает процесс установки Keycloak на Ubuntu (20.04 или 22.04) и его базовую настройку для использования в микросервисной архитектуре.
## Требования
- Ubuntu 20.04 или 22.04.
- Java Development Kit (JDK) версии 17 или выше.
- Доступ к интернету.
- (Опционально) PostgreSQL для продакшен-использования.
## Шаг 1: Установка Java
Keycloak требует Java. Установим OpenJDK 17:
```sh
sudo apt update &&
sudo apt install openjdk-21-jdk openjdk-21-jre -y
```
Проверьте версию Java:
```sh
java -version
```
Ожидаемый вывод:
```
openjdk 17.0.9 ...
```
## Шаг 2: Загрузка и установка Keycloak
1. **Скачайте последнюю версию Keycloak**:
```sh
wget https://github.com/keycloak/keycloak/releases/download/26.3.0/keycloak-26.3.0.tar.gz
```
2. **Распакуйте архив**:
```sh
tar -xvzf keycloak-26.3.0.tar.gz
sudo mv keycloak-26.3.0 /opt/keycloak
```
3. **Создайте пользователя для Keycloak**:
```sh
sudo useradd -r -s /bin/false keycloak
sudo chown -R keycloak:keycloak /opt/keycloak
```
## Шаг 3: Настройка базы данных (опционально, для продакшена)
По умолчанию используется встроенная база H2, но для продакшена рекомендуется PostgreSQL.
1. **Установите PostgreSQL**:
```sh
sudo apt install -y postgresql postgresql-contrib
```
2. **Создайте базу данных и пользователя**:
```sh
sudo -u postgres psql
```
Внутри psql:
```sql
CREATE DATABASE keycloak;
CREATE USER keycloak WITH PASSWORD 'your_secure_password';
GRANT ALL PRIVILEGES ON DATABASE keycloak TO keycloak;
\q
```
3. **Настройте Keycloak для PostgreSQL**:
Отредактируйте `/opt/keycloak/conf/keycloak.conf`:
```sh
sudo nano /opt/keycloak/conf/keycloak.conf
```
Добавьте:
```ini
db=postgres
db-url=jdbc:postgresql://localhost:5432/keycloak
db-username=keycloak
db-password=your_secure_password
```
4. **Установите JDBC-драйвер PostgreSQL**:
```sh
wget https://jdbc.postgresql.org/download/postgresql-42.7.3.jar
sudo mv postgresql-42.7.3.jar /opt/keycloak/providers/
```
## Шаг 4: Запуск Keycloak
1. **Соберите и настройте Keycloak**:
```sh
/opt/keycloak/bin/kc.sh build
```
2. **Запустите Keycloak в режиме разработки**:
```sh
/opt/keycloak/bin/kc.sh start-dev
```
- Работает на `http://localhost:8080`.
- Для продакшена используйте `kc.sh start` с HTTPS.
3. **Проверьте доступ**:
Откройте браузер и перейдите по `http://localhost:8080`.
## Шаг 5: Базовая настройка Keycloak
1. **Создайте администратора**:
При первом запуске задайте логин и пароль администратора:
```sh
/opt/keycloak/bin/kc.sh start-dev
```
2. **Войдите в админ-консоль**:
- Перейдите по `http://localhost:8080/admin`.
- Используйте учетные данные администратора.
3. **Создайте Realm**:
- В админ-консоли выберите **Create Realm**.
- Задайте имя, например, `myapp-realm`.
4. **Создайте клиента**:
- В разделе **Clients** выберите **Create client**.
- Настройки:
- **Client ID**: `myapp-client`.
- **Client type**: `OpenID Connect`.
- **Client authentication**: Включите для конфиденциального клиента.
- **Root URL**: Например, `http://localhost:3000`.
- **Valid redirect URIs**: Например, `http://localhost:3000/*`.
- Скопируйте **Client Secret**.
5. **Создайте пользователя**:
- В разделе **Users** выберите **Add user**.
- Задайте имя, например, `testuser`.
- Установите пароль в **Credentials** (например, `testpassword`).
6. **Настройте роли**:
- В разделе **Roles** создайте роль, например, `user`.
- Назначьте роль пользователю в **Role Mapping**.
## Шаг 6: Интеграция с микросервисом
1. **Получите OpenID Connect конфигурацию**:
- В **Realm Settings****General****OpenID Endpoint Configuration**.
- URL: `http://localhost:8080/realms/myapp-realm/.well-known/openid-configuration`.
2. **Пример для Spring Boot**:
Добавьте зависимость:
```xml
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-starter</artifactId>
<version>24.0.5</version>
</dependency>
```
Настройте `application.properties`:
```properties
keycloak.realm=myapp-realm
keycloak.auth-server-url=http://localhost:8080
keycloak.resource=myapp-client
keycloak.credentials.secret=your-client-secret
Elders keycloak.use-resource-role-mappings=true
```
3. **Тестирование**:
- Перейдите по:
```
http://localhost:8080/realms/myapp-realm/protocol/openid-connect/auth?client_id=myapp-client&response_type=code&redirect_uri=http://localhost:3000
```
- Войдите как `testuser` с паролем `testpassword`.
## Шаг 7: Настройка Keycloak как службы
1. Создайте systemd-сервис:
```sh
sudo nano /etc/systemd/system/keycloak.service
```
Добавьте:
```ini
[Unit]
Description=Keycloak
After=network.target
[Service]
User=keycloak
Group=keycloak
WorkingDirectory=/opt/keycloak
ExecStart=/opt/keycloak/bin/kc.sh start --hostname=your-domain.com --https-certificate-file=/path/to/cert.pem --https-certificate-key-file=/path/to/key.pem
Restart=always
[Install]
WantedBy=multi-user.target
```
2. Активируйте сервис:
```sh
sudo systemctl daemon-reload
sudo systemctl enable keycloak
sudo systemctl start keycloak
```
3. Проверьте статус:
```sh
sudo systemctl status keycloak
```
## Полезные советы
- **HTTPS**: Настройте SSL/TLS в `keycloak.conf`:
```ini
https-certificate-file=/path/to/cert.pem
https-certificate-key-file=/path/to/key.pem
hostname=your-domain.com
```
- **Резервное копирование**: Сохраняйте базу данных и настройки realm.
- **Логирование**: Включите в `keycloak.conf`:
```ini
log-level=info
```
Теперь Keycloak установлен, настроен и готов к использованию в вашей микросервисной архитектуре. Вы можете интегрировать его с API Gateway или микросервисами, используя JWT-токены для аутентификации и авторизации. Если нужны дополнительные детали или помощь с конкретным сценарием, дайте знать!

171
Logs/Vector_dev_install.md Normal file
View File

@ -0,0 +1,171 @@
# Настройка Vector для отправки логов в Gotify
Эта инструкция описывает, как установить Vector, настроить его для чтения JSON-логов из файла `/opt/org_ccalm_main/logs/ccalm.log`, фильтрации строк с уровнем `ERROR` и отправки уведомлений в Gotify.
---
## 0. ✅ Подключаемся к инфраструктуре
```sh
ssh igor@ccalm.org -p 2200
```
## Предварительные требования
- ОС: Ubuntu/Debian (для других ОС уточните, чтобы адаптировать команды).
- Файл логов: `/opt/org_ccalm_main/logs/ccalm.log` с JSON-строками (поля `level` и `message`).
- Gotify: Доступный сервер Gotify с URL и токеном (например, `https://gotify.example.com/message?token=<your-token>`).
- Доступ к терминалу с правами `sudo`.
## Шаг 1: Установка Vector
Пробуем скачать deb пакет с сайта
```sh
curl -L https://packages.timber.io/vector/0.43.1/vector_0.43.1-1_amd64.deb -o vector_0.43.1-1_amd64.deb &&
sudo dpkg -i vector_0.43.1-1_amd64.deb &&
sudo apt-get install -f &&
vector --version
```
## Шаг 2: Создание конфигурации Vector
Vector использует YAML для конфигурации. Настроим чтение логов, фильтрацию `ERROR` и отправку в Gotify.
1. Создайте файл конфигурации `/etc/vector/vector.yaml`:
```sh
cd /etc/vector &&
sudo tee vector.yaml > /dev/null <<'EOF'
data_dir: "/var/lib/vector"
sources:
ccalm_logs:
type: file
include:
- /opt/org_ccalm_main/logs/ccalm.log
read_from: beginning
transforms:
parse_json:
type: remap
inputs:
- ccalm_logs
source: |
structured, err = parse_json(.message)
if err != null {
abort
}
merged, err = merge(., structured)
if err != null {
abort
}
. = merged
filter_errors:
type: filter
inputs:
- parse_json
condition: '.level == "ERROR"'
format_telegram_json:
type: remap
inputs:
- filter_errors
source: |
msg, err = string(.message)
if err != null {
msg = "Unable to parse message"
}
.message = "{\"title\":\"CCALM Main Error Log\",\"message\":\"ERROR: " + msg + "\"}"
sinks:
gotify:
type: http
inputs:
- filter_errors
uri: "https://gotify.geovizor.top:8443/message?token=AYmcpr43YtPKDmZ"
method: post
encoding:
codec: json
template: '{"title":"CCALM Main Error Log","message":"Test message 00","priority":5}'
request:
headers:
Content-Type: "application/json"
Host: "gotify.geovizor.top"
Content-Length: "{{ content_length }}"
tls:
verify_certificate: false
verify_hostname: false
EOF
```
Пробую отправку через curl
```sh
curl -X POST -k "https://gotify.geovizor.top:8443/message?token=AYmcpr43YtPKDmZ" \
-H "Content-Type: application/json" \
-d '{"message": "Test message", "priority": 5}'
```
Проверяем что gotify работает:
```sh
curl -k -X POST -H "Content-Type: application/json" -H "Host: gotify.geovizor.top" -d '{"message":"Test message 00","priority":5}' --http1.1 https://gotify.geovizor.top:8443/message?token=AYmcpr43YtPKDmZ -v
```
### Объяснение конфигурации
- **Source (`ccalm_logs`)**: Читает логи из файла, парсит JSON, поддерживает многострочные логи.
- **Transform (`filter_errors`)**: Фильтрует логи с `level: "ERROR"`.
- **Sink (`gotify`)**: Отправляет отфильтрованные логи в Gotify через HTTP POST.
## Шаг 3: Проверка конфигурации
Проверьте корректность YAML:
```sh
vector --config /etc/vector/vector.yaml validate
```
Ожидаемый вывод: `Configuration is valid`.
## Шаг 4: Запуск Vector
### Тестовый запуск (для отладки)
```sh
sudo vector --config /etc/vector/vector.yaml
```
### Запуск как сервиса
1. Включите и запустите сервис:
```sh
sudo systemctl enable vector
sudo systemctl start vector
```
2. Проверьте статус:
```sh
sudo systemctl status vector
```
## Шаг 5: Проверка отправки в Gotify
1. Убедитесь, что Gotify доступен по указанному URL.
2. Добавьте тестовую строку лога в `/opt/org_ccalm_main/logs/ccalm.log`:
```sh
echo '{"level": "ERROR", "message": "Database connection failed", "timestamp": "2025-05-18T12:28:00Z"}' | sudo tee -a /opt/org_ccalm_main/logs/ccalm.log
```
3. Проверьте Gotify (веб-интерфейс или приложение) — должно прийти уведомление с заголовком "CCALM Log Error" и сообщением "Database connection failed".
## Шаг 6: Отладка
- Логи Vector: `/var/log/vector/vector.log` или stdout (в тестовом режиме).
- Проверьте логи при проблемах:
```sh
cat /var/log/vector/vector.log
```
## Дополнительные настройки
- **Права доступа к файлу логов**:
```sh
sudo chown vector:vector /opt/org_ccalm_main/logs/ccalm.log
sudo chmod 644 /opt/org_ccalm_main/logs/ccalm.log
```
- **Если JSON-формат отличается**: Если поле `level` называется иначе (например, `log_level`), замените `.level` на `.log_level` в `condition`.
- **HTTP вместо HTTPS**: Если Gotify использует HTTP, замените `https://` на `http://` в `uri`.
## Примечания
- Убедитесь, что Gotify настроен и токен действителен.
- Если логи не отправляются, проверьте сетевую доступность Gotify и правильность URL/токена.
- Для чтения только новых логов удалите `read_from: beginning` в конфигурации.

View File

@ -0,0 +1,434 @@
Шаг 1: Создание Telegram-бота
Зарегистрируйте бота через BotFather:
Откройте Telegram и найдите @BotFather.
Отправьте команду /start.
Отправьте /newbot, чтобы создать нового бота.
Следуйте инструкциям:
Укажите имя бота (например, MyLogBot).
Укажите username бота, заканчивающийся на bot (например, @MyLogAllBot).
После создания вы получите токен (например, 8007457609:AAGnrXOSaoxODMSh4yCzUEIp0uxfH3Hk8ws). Сохраните его, он понадобится для API.
# Настройка Vector для отправки логов в Gotify
Эта инструкция описывает, как установить Vector, настроить его для чтения JSON-логов из файла `/opt/org_ccalm_main/logs/ccalm.log`, фильтрации строк с уровнем `ERROR` и отправки уведомлений в Gotify.
---
## 0. ✅ Подключаемся к инфраструктуре
```sh
ssh ubuntu@almaty.ccalm.org -p 22
```
## Предварительные требования
- ОС: Ubuntu/Debian (для других ОС уточните, чтобы адаптировать команды).
- Файл логов: `/opt/org_ccalm_main/logs/ccalm.log` с JSON-строками (поля `level` и `message`).
- Gotify: Доступный сервер Gotify с URL и токеном (например, `https://gotify.example.com/message?token=<your-token>`).
- Доступ к терминалу с правами `sudo`.
## Шаг 1: Установка Vector
Пробуем скачать deb пакет с сайта
```sh
curl -L https://packages.timber.io/vector/0.46.X/vector_0.46.1-1_amd64.deb -o vector_0.46.1-1_amd64.deb &&
sudo dpkg -i vector_0.46.1-1_amd64.deb &&
sudo apt-get install -f &&
vector --version
```
That make deleting:
```sh
sudo apt remove --purge vector
```
## Шаг 2: Создание конфигурации Vector
Vector использует YAML для конфигурации. Настроим чтение логов, фильтрацию `ERROR` и отправку в Gotify.
1. Создайте файл конфигурации `/etc/vector/vector.yaml`:
```sh
cd /etc/vector &&
sudo tee vector.yaml > /dev/null <<'EOF'
data_dir: "/var/lib/vector"
sources:
ccalm_logs:
type: file
include:
- /opt/org_ccalm_main/logs/org-ccalm-main.log
read_from: beginning
ccalm_translation_logs:
type: file
include:
- /opt/org_ccalm_translation/logs/org-ccalm-translation.log
read_from: beginning
ccalm_dbms_logs:
type: file
include:
- /opt/org_ccalm_dbms/logs/org-ccalm-dbms.log
read_from: beginning
ccalm_jwt_logs:
type: file
include:
- /opt/org_ccalm_jwt/logs/org-ccalm-jwt.log
read_from: beginning
transforms:
parse_json_ccalm:
type: remap
inputs:
- ccalm_logs
source: |
structured, err = parse_json(.message)
if err != null {
abort
}
merged, err = merge(., structured)
if err != null {
abort
}
. = merged
parse_json_translation:
type: remap
inputs:
- ccalm_translation_logs
source: |
structured, err = parse_json(.message)
if err != null {
abort
}
merged, err = merge(., structured)
if err != null {
abort
}
. = merged
parse_json_dbms:
type: remap
inputs:
- ccalm_dbms_logs
source: |
structured, err = parse_json(.message)
if err != null {
abort
}
merged, err = merge(., structured)
if err != null {
abort
}
. = merged
parse_json_jwt:
type: remap
inputs:
- ccalm_jwt_logs
source: |
structured, err = parse_json(.message)
if err != null {
abort
}
merged, err = merge(., structured)
if err != null {
abort
}
. = merged
filter_errors_ccalm:
type: filter
inputs:
- parse_json_ccalm
condition: '.level == "ERROR" || .level == "WARN"'
filter_errors_translation:
type: filter
inputs:
- parse_json_translation
condition: '.level == "ERROR" || .level == "WARN"'
filter_errors_dbms:
type: filter
inputs:
- parse_json_dbms
condition: '.level == "ERROR" || .level == "WARN"'
filter_errors_jwt:
type: filter
inputs:
- parse_json_jwt
condition: '.level == "ERROR" || .level == "WARN"'
format_telegram_json_ccalm:
type: remap
inputs:
- filter_errors_ccalm
source: |
msg, err = string(.message)
if err != null {
msg = "Unable to parse message"
}
marker_str = ""
if exists(.marker) {
m, err = string(.marker)
if err == null && length(m) > 0 {
marker_str = "Marker: \n```text\n" + m + "\n```\n"
}
}
level_str = ""
icon_str = ""
if exists(.level) {
m, err = string(.level)
if err == null {
level_str = "level: \n```text\n" + m + "\n```\n"
}
if m == "ERROR" {
icon_str = "‼"
}
if m == "WARN" {
icon_str = "⚠️"
}
}
.message = "{\"chat_id\":\"-1002640082189\",\"message_thread_id\":2,\"text\":\"" + icon_str + " " + level_str + marker_str + "Message: \n```text\n" + msg + "\n```\", \"parse_mode\":\"Markdown\"}"
format_telegram_json_translation:
type: remap
inputs:
- filter_errors_translation
source: |
msg, err = string(.message)
if err != null {
msg = "Unable to parse message"
}
marker_str = ""
if exists(.marker) {
m, err = string(.marker)
if err == null && length(m) > 0 {
marker_str = "Marker: \n```text\n" + m + "\n```\n"
}
}
level_str = ""
icon_str = ""
if exists(.level) {
m, err = string(.level)
if err == null {
level_str = "level: \n```text\n" + m + "\n```\n"
}
if m == "ERROR" {
icon_str = "‼"
}
if m == "WARN" {
icon_str = "⚠️"
}
}
.message = "{\"chat_id\":\"-1002640082189\",\"message_thread_id\":24,\"text\":\"" + icon_str + " " + level_str + marker_str + "Message: \n```text\n" + msg + "\n```\", \"parse_mode\":\"Markdown\"}"
format_telegram_json_dbms:
type: remap
inputs:
- filter_errors_dbms
source: |
msg, err = string(.message)
if err != null {
msg = "Unable to parse message"
}
marker_str = ""
if exists(.marker) {
m, err = string(.marker)
if err == null && length(m) > 0 {
marker_str = "Marker: \n```text\n" + m + "\n```\n"
}
}
level_str = ""
icon_str = ""
if exists(.level) {
m, err = string(.level)
if err == null {
level_str = "level: \n```text\n" + m + "\n```\n"
}
if m == "ERROR" {
icon_str = "‼"
}
if m == "WARN" {
icon_str = "⚠️"
}
}
.message = "{\"chat_id\":\"-1002640082189\",\"message_thread_id\":9,\"text\":\"" + icon_str + " " + level_str + marker_str + "Message: \n```text\n" + msg + "\n```\", \"parse_mode\":\"Markdown\"}"
format_telegram_json_jwt:
type: remap
inputs:
- filter_errors_jwt
source: |
msg, err = string(.message)
if err != null {
msg = "Unable to parse message"
}
marker_str = ""
if exists(.marker) {
m, err = string(.marker)
if err == null && length(m) > 0 {
marker_str = "Marker: \n```text\n" + m + "\n```\n"
}
}
level_str = ""
icon_str = ""
if exists(.level) {
m, err = string(.level)
if err == null {
level_str = "level: \n```text\n" + m + "\n```\n"
}
if m == "ERROR" {
icon_str = "‼"
}
if m == "WARN" {
icon_str = "⚠️"
}
}
.message = "{\"chat_id\":\"-1002640082189\",\"message_thread_id\":4,\"text\":\"" + icon_str + " " + level_str + marker_str + "Message: \n```text\n" + msg + "\n```\", \"parse_mode\":\"Markdown\"}"
sinks:
telegram_ccalm:
type: http
inputs:
- format_telegram_json_ccalm
uri: "https://api.telegram.org/bot8007457609:AAGnrXOSaoxODMSh4yCzUEIp0uxfH3Hk8ws/sendMessage"
method: post
encoding:
codec: text
request:
headers:
Content-Type: "application/json"
batch:
max_events: 1
telegram_translation:
type: http
inputs:
- format_telegram_json_translation
uri: "https://api.telegram.org/bot8007457609:AAGnrXOSaoxODMSh4yCzUEIp0uxfH3Hk8ws/sendMessage"
method: post
encoding:
codec: text
request:
headers:
Content-Type: "application/json"
batch:
max_events: 1
telegram_dbms:
type: http
inputs:
- format_telegram_json_dbms
uri: "https://api.telegram.org/bot8007457609:AAGnrXOSaoxODMSh4yCzUEIp0uxfH3Hk8ws/sendMessage"
method: post
encoding:
codec: text
request:
headers:
Content-Type: "application/json"
batch:
max_events: 1
telegram_jwt:
type: http
inputs:
- format_telegram_json_jwt
uri: "https://api.telegram.org/bot8007457609:AAGnrXOSaoxODMSh4yCzUEIp0uxfH3Hk8ws/sendMessage"
method: post
encoding:
codec: text
request:
headers:
Content-Type: "application/json"
batch:
max_events: 1
EOF
```
curl https://api.telegram.org/bot8007457609:AAGnrXOSaoxODMSh4yCzUEIp0uxfH3Hk8ws/getUpdates
Пробую отправку через curl
```sh
curl -X POST -k "https://gotify.geovizor.top:8443/message?token=AYmcpr43YtPKDmZ" \
-H "Content-Type: application/json" \
-d '{"message": "Test message", "priority": 5}'
```
Проверяем что gotify работает:
```sh
curl -k -X POST -H "Content-Type: application/json" -H "Host: gotify.geovizor.top" -d '{"message":"Test message 00","priority":5}' --http1.1 https://gotify.geovizor.top:8443/message?token=AYmcpr43YtPKDmZ -v
```
### Объяснение конфигурации
- **Source (`ccalm_logs`)**: Читает логи из файла, парсит JSON, поддерживает многострочные логи.
- **Transform (`filter_errors`)**: Фильтрует логи с `level: "ERROR"`.
- **Sink (`gotify`)**: Отправляет отфильтрованные логи в Gotify через HTTP POST.
## Шаг 3: Проверка конфигурации
Проверьте корректность YAML:
```sh
vector --config /etc/vector/vector.yaml validate
```
Ожидаемый вывод: `Configuration is valid`.
## Шаг 4: Запуск Vector
### Тестовый запуск (для отладки)
```sh
sudo vector --config /etc/vector/vector.yaml
```
### Запуск как сервиса
1. Включите и запустите сервис:
```sh
sudo systemctl enable vector
```
```sh
sudo systemctl start vector
```
2. Проверьте статус:
```sh
sudo systemctl status vector
```
```sh
sudo systemctl stop vector
```
## Шаг 5: Проверка отправки в Gotify
1. Убедитесь, что Gotify доступен по указанному URL.
2. Добавьте тестовую строку лога в `/opt/org_ccalm_main/logs/ccalm.log`:
```sh
echo '{"level": "ERROR", "marker":"12345", "message": "Database connection failed 0", "timestamp": "2025-05-18T12:28:00Z"}' | sudo tee -a /opt/org_ccalm_jwt/logs/org-ccalm-jwt.log
```
3. Проверьте Gotify (веб-интерфейс или приложение) — должно прийти уведомление с заголовком "CCALM Log Error" и сообщением "Database connection failed".
## Шаг 6: Отладка
- Логи Vector: `/var/log/vector/vector.log` или stdout (в тестовом режиме).
- Проверьте логи при проблемах:
```sh
cat /var/log/vector/vector.log
```
## Дополнительные настройки
- **Права доступа к файлу логов**:
```sh
sudo chown vector:vector /opt/org_ccalm_main/logs/ccalm.log
sudo chmod 644 /opt/org_ccalm_main/logs/ccalm.log
```
- **Если JSON-формат отличается**: Если поле `level` называется иначе (например, `log_level`), замените `.level` на `.log_level` в `condition`.
- **HTTP вместо HTTPS**: Если Gotify использует HTTP, замените `https://` на `http://` в `uri`.
## Примечания
- Убедитесь, что Gotify настроен и токен действителен.
- Если логи не отправляются, проверьте сетевую доступность Gotify и правильность URL/токена.
- Для чтения только новых логов удалите `read_from: beginning` в конфигурации.

View File

@ -11,7 +11,7 @@ ssh igor@88.218.94.134 -p 2200
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
```sh ```sh
sudo apt-get update && sudo apt-get update &&
sudo apt-get install nginx sudo apt-get install nginx -y
``` ```
Настройка самоподписанного сертификата для SSL nginx Настройка самоподписанного сертификата для SSL nginx
```sh ```sh
@ -19,36 +19,56 @@ sudo apt-get install nginx
``` ```
Самой важной строкой является Common Name (введите FQDN или свое имя). Как правило, в эту строку вносят доменное имя, с которым нужно связать сервер. В случае если доменного имени нет, внесите в эту строку IP-адрес сервера. Самой важной строкой является Common Name (введите FQDN или свое имя). Как правило, в эту строку вносят доменное имя, с которым нужно связать сервер. В случае если доменного имени нет, внесите в эту строку IP-адрес сервера.
```sh ```sh
sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096 sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048
``` ```
Создаём файл:
```sh
sudo mcedit /etc/nginx/conf.d/ssl.conf
```
И вписываем в него:
```conf
server {
listen 8091 ssl http2;
listen [::]:8091 ssl http2;
server_name istransit.kg; И вписываем в него:
```sh
cd /etc/nginx/sites-available/ &&
sudo tee ccalm.org > /dev/null <<'EOF'
server {
listen 8081 ssl http2;
listen [::]:8081 ssl http2;
root /opt/www/org_ccalm;
index index.html;
server_name ccalm.org www.ccalm.org;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key; ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
ssl_dhparam /etc/nginx/dhparam.pem; ssl_dhparam /etc/nginx/dhparam.pem;
root /opt/www/istransit.kg;
index index.html index.htm;
location / { location / {
try_files $uri $uri/ =404; # Попытка найти файл или возвращение 404 try_files $uri $uri/ =404;
# Оптимизация для быстрой отдачи статики
sendfile on; # Использует sendfile() ядра Linux для ускорения
tcp_nopush off; # Отключает задержку Nagle (если нужна мгновенная отправка)
}
location ~ /index\.html$ {
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate";
add_header Pragma "no-cache";
add_header Expires 0;
} }
} }
EOF
``` ```
Теперь можно включить виртуальный хост:
```sh
sudo ln -s /etc/nginx/sites-available/ccalm.org /etc/nginx/sites-enabled/
```
```sh ```sh
sudo systemctl restart nginx sudo systemctl restart nginx
``` ```
Журнал последних 50 записей
```sh
journalctl -u nginx.service -n 50
```
Также есть такие команды: Также есть такие команды:
nginx -s stop — быстрое завершение nginx -s stop — быстрое завершение
nginx -s quit — плавное завершение nginx -s quit — плавное завершение
@ -67,24 +87,36 @@ server {
cd /etc/nginx/sites-available/ && cd /etc/nginx/sites-available/ &&
sudo tee geovizor.top > /dev/null <<'EOF' sudo tee geovizor.top > /dev/null <<'EOF'
server { server {
listen 8081; listen 8081;
listen [::]:8081; listen [::]:8081;
root /opt/www/istransit.kz; root /opt/www/istransit.kz;
index index.html; index index.html;
server_name istransit.kz www.istransit.kz; server_name istransit.kz www.istransit.kz;
location / { location / {
try_files $uri $uri/ =404; try_files $uri $uri/ =404;
} }
location ~ /index\.html$ {
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate";
add_header Pragma "no-cache";
add_header Expires 0;
}
} }
EOF EOF
``` ```
Теперь можно включить виртуальный хост: Теперь можно включить виртуальный хост:
```sh
sudo ln -s /etc/nginx/sites-available/istransit.kz /etc/nginx/sites-enabled/ sudo ln -s /etc/nginx/sites-available/istransit.kz /etc/nginx/sites-enabled/
```
Проверяем правильность конфигурации: Проверяем правильность конфигурации:
```sh
sudo nginx -t sudo nginx -t
```
Перезапускаем: Перезапускаем:
sudo systemctl restart nginx ```sh
sudo systemctl restart nginx
```

View File

@ -1,66 +1,68 @@
# Установка Uptime Kuma в Ubuntu 24.04 с помощью Docker Compose # Установка Uptime Kuma в Ubuntu 24.04 с помощью Docker Compose
## 1. Установка необходимых пакетов ## 1. Установка необходимых пакетов
Обновите систему и установите Docker и Docker Compose: Обновите систему и установите Docker и Docker Compose:
```sh ```sh
sudo apt update && sudo apt upgrade -y sudo apt update && sudo apt upgrade -y
sudo apt install -y docker.io docker-compose sudo apt install -y docker.io docker-compose
``` ```
## 2. Создание директории для Uptime Kuma ## 2. Создание директории для Uptime Kuma
```sh ```sh
sudo mkdir -p /opt/uptime-kuma sudo mkdir -p /opt/uptime-kuma
cd /opt/uptime-kuma cd /opt/uptime-kuma
``` ```
## 3. Создание `docker-compose.yml` ## 3. Создание `docker-compose.yml`
Создайте файл `docker-compose.yml`: Создайте файл `docker-compose.yml`:
```sh ```sh
sudo mcedit /opt/uptime-kuma/docker-compose.yml sudo mcedit /opt/uptime-kuma/docker-compose.yml
``` ```
Вставьте следующий конфигурационный файл: Вставьте следующий конфигурационный файл:
В кодфиге прописан корневой сертификат чтобы node.js ему доверял
```yaml ```yaml
services: services:
uptime-kuma: uptime-kuma:
image: louislam/uptime-kuma:latest image: louislam/uptime-kuma:latest
container_name: uptime-kuma container_name: uptime-kuma
restart: always restart: always
ports: ports:
- "3001:3001" - "3001:3001"
volumes: volumes:
- ./data:/app/data - ./data:/app/data
``` - /usr/local/share/ca-certificates:/usr/local/share/ca-certificates:ro
environment:
## 4. Запуск контейнера - NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/rootCA.crt
```sh ```
sudo docker-compose up -d
``` ## 4. Запуск контейнера
```sh
## 5. Проверка работы Uptime Kuma sudo docker-compose up -d
Откройте браузер и перейдите по адресу: ```
```sh ## 5. Проверка работы Uptime Kuma
start http://192.168.200.84:3001 Откройте браузер и перейдите по адресу:
```
```sh
## 6. Управление контейнером start http://192.168.200.84:3001
- **Остановить Uptime Kuma:** ```
```sh
sudo docker-compose down ## 6. Управление контейнером
``` - **Остановить Uptime Kuma:**
- **Перезапустить контейнер:** ```sh
```sh sudo docker-compose down
sudo docker-compose restart ```
``` - **Перезапустить контейнер:**
- **Просмотреть логи:** ```sh
sudo docker-compose restart
```sh ```
sudo docker-compose logs -f - **Просмотреть логи:**
```
```sh
Готово! Uptime Kuma установлен и запущен в Docker на Ubuntu 24.04. 🚀 sudo docker-compose logs -f
```
Готово! Uptime Kuma установлен и запущен в Docker на Ubuntu 24.04. 🚀

View File

@ -1,18 +1,27 @@
https://documentation.wazuh.com/current/installation-guide/wazuh-server/installation-assistant.html https://documentation.wazuh.com/current/installation-guide/wazuh-server/installation-assistant.html
Подключаемся к нужному серверу: Connectiong to server:
```sh ```sh
ssh igor@192.168.200.86 ssh igor@192.168.200.86
``` ```
Execute installation commman:
```sh ```sh
curl -sO https://packages.wazuh.com/4.11/wazuh-install.sh curl -sO https://packages.wazuh.com/4.11/wazuh-install.sh &&
sudo bash wazuh-install.sh -a sudo bash wazuh-install.sh -a
``` ```
20/04/2025 12:07:15 INFO: You can access the web interface https://<wazuh-dashboard-ip>:443
User: admin
Password: LsR1i+*DT6Az37rBDTnuyw54wB+Ce*1+
debian virtual box
admin
KD7Iv+BCJkARvxPA6UYp+HdxhacTUNy6
```sh ```sh
start https://192.168.200.86:443 open https://127.0.0.1:443
``` ```
Компонент Порт по умолчанию Доступ Компонент Порт по умолчанию Доступ
Wazuh API 55000 Внутренний Wazuh API 55000 Внутренний
@ -75,9 +84,17 @@ sudo grep -i "history" /var/log/wazuh-indexer/wazuh-cluster.log
sudo grep -i "error" /var/log/wazuh-indexer/wazuh-cluster.log sudo grep -i "error" /var/log/wazuh-indexer/wazuh-cluster.log
``` ```
Инициализируем кластер безопасности:
Временно отключаю аудит:
```sh ```sh
/usr/share/wazuh-indexer/plugins/opensearch-security/tools/securityadmin.sh \ sudo mcedit /etc/wazuh-indexer/opensearch-security/audit.yml
```
Инициализируем кластер безопасности (после отключения аудита перенастраиваем):
```sh
sudo -u wazuh-indexer /usr/share/wazuh-indexer/plugins/opensearch-security/tools/securityadmin.sh \
-cd /etc/wazuh-indexer/opensearch-security/ \ -cd /etc/wazuh-indexer/opensearch-security/ \
-icl -nhnv \ -icl -nhnv \
-cacert /etc/wazuh-indexer/certs/root-ca.pem \ -cacert /etc/wazuh-indexer/certs/root-ca.pem \
@ -85,6 +102,11 @@ sudo grep -i "error" /var/log/wazuh-indexer/wazuh-cluster.log
-key /etc/wazuh-indexer/certs/admin-key.pem -key /etc/wazuh-indexer/certs/admin-key.pem
``` ```
Перезагружаем после применения настроек
```sh
sudo systemctl restart wazuh-indexer
```
Проверьте конфигурацию аудита в файле /etc/wazuh-indexer/opensearch.yml: Проверьте конфигурацию аудита в файле /etc/wazuh-indexer/opensearch.yml:
```sh ```sh
@ -102,3 +124,6 @@ opensearch_security.audit.enable_transport: true
```sh ```sh
sudo grep -i "error" /var/log/wazuh-indexer/wazuh-cluster.log sudo grep -i "error" /var/log/wazuh-indexer/wazuh-cluster.log
``` ```
sudo chown -R wazuh-indexer:wazuh-indexer /etc/wazuh-indexer /var/lib/wazuh-indexer /var/log/wazuh-indexer

View File

@ -1,141 +1,141 @@
Устанавливаю согласно инструкции из: Устанавливаю согласно инструкции из:
https://github.com/prometheus-community/postgres_exporter https://github.com/prometheus-community/postgres_exporter
Подключаюсь к нужной машине Подключаюсь к нужной машине
```sh ```sh
ssh igor@ccalm.org -p 2200 ssh igor@ccalm.org -p 2200
``` ```
Configure postgresql.conf Configure postgresql.conf
```conf ```conf
shared_preload_libraries = 'pg_stat_statements' shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.track = all pg_stat_statements.track = all
``` ```
## 1. Установка Docker и Docker Compose ## 1. Установка Docker и Docker Compose
Если Docker не установлен, установим его: Если Docker не установлен, установим его:
```sh ```sh
sudo apt update && sudo apt upgrade -y && sudo apt update && sudo apt upgrade -y &&
sudo apt install -y docker.io docker-compose && sudo apt install -y docker.io docker-compose &&
sudo systemctl enable --now docker sudo systemctl enable --now docker
``` ```
## 2. Установка postgres-exporter в докере из заранее подготовленного образа ## 2. Установка postgres-exporter в докере из заранее подготовленного образа
```sh ```sh
sudo mkdir -p /opt/postgres-exporter && sudo mkdir -p /opt/postgres-exporter &&
sudo chown $USER:$USER /opt/postgres-exporter && sudo chown $USER:$USER /opt/postgres-exporter &&
cd /opt/postgres-exporter cd /opt/postgres-exporter
``` ```
Создаю файл с настройками Создаю файл с настройками
```sh ```sh
cd /opt/postgres-exporter/ && cd /opt/postgres-exporter/ &&
cat > docker-compose.yml <<'EOF' cat > docker-compose.yml <<'EOF'
services: services:
postgres-exporter: postgres-exporter:
image: quay.io/prometheuscommunity/postgres-exporter image: quay.io/prometheuscommunity/postgres-exporter
container_name: postgres-exporter container_name: postgres-exporter
restart: unless-stopped restart: unless-stopped
network_mode: "host" network_mode: "host"
environment: environment:
DATA_SOURCE_URI: "postgresql://postgres:309A86FF65A78FB428F4E38DFE35F730@localhost:5432/postgres?sslmode=disable" DATA_SOURCE_URI: "postgresql://postgres:309A86FF65A78FB428F4E38DFE35F730@localhost:5432/postgres?sslmode=disable"
volumes: volumes:
- ./postgres_exporter.yml:/etc/postgres_exporter.yml - ./postgres_exporter.yml:/etc/postgres_exporter.yml
command: command:
- "--config.file=/etc/postgres_exporter.yml" - "--config.file=/etc/postgres_exporter.yml"
EOF EOF
``` ```
Создаём файл с настройками Создаём файл с настройками
```sh ```sh
cd /opt/postgres-exporter/ && cd /opt/postgres-exporter/ &&
cat > postgres_exporter.yml <<'EOF' cat > postgres_exporter.yml <<'EOF'
collectors: collectors:
- database - database
- index - index
- query - query
- table - table
EOF EOF
``` ```
Запускаю: Запускаю:
```sh ```sh
cd /opt/postgres-exporter && cd /opt/postgres-exporter &&
sudo docker-compose up -d sudo docker-compose up -d
``` ```
Проверяю запущен ли докер Проверяю запущен ли докер
```sh ```sh
sudo docker ps sudo docker ps
``` ```
Testing with: Testing with:
```sh ```sh
curl "http://127.0.0.1:9187/metrics" curl "http://127.0.0.1:9187/metrics"
``` ```
Посмотреть журнал за сегодня: Посмотреть журнал за сегодня:
```sh ```sh
journalctl --since today journalctl --since today
``` ```
Настраиваем простую авторизацию при помощи HAProxy для скачивания при помощи удаленного сервера Настраиваем простую авторизацию при помощи HAProxy для скачивания при помощи удаленного сервера
```sh ```sh
sudo mcedit /etc/haproxy/haproxy.cfg sudo mcedit /etc/haproxy/haproxy.cfg
``` ```
Настраиваем: Настраиваем:
```text ```text
acl v_metrics_nd path_beg /metrics_nd acl v_metrics_nd path_beg /metrics_nd
acl v_basic_auth http_auth(prometheus_list) acl v_basic_auth http_auth(prometheus_list)
http-request auth realm Metrics_org_ccalm_nd if v_metrics_nd !v_basic_auth http-request auth realm Metrics_org_ccalm_nd if v_metrics_nd !v_basic_auth
use_backend b_metrics_nd if v_metrics_nd v_basic_auth use_backend b_metrics_nd if v_metrics_nd v_basic_auth
backend b_metrics_nd backend b_metrics_nd
mode http mode http
option http-keep-alive option http-keep-alive
http-request replace-path .* /metrics http-request replace-path .* /metrics
server web1 127.0.0.1:9100 check server web1 127.0.0.1:9100 check
``` ```
Проверяем Проверяем
```sh ```sh
haproxy -f /etc/haproxy/haproxy.cfg -c haproxy -f /etc/haproxy/haproxy.cfg -c
```` ````
Перезагружаем: Перезагружаем:
```sh ```sh
sudo systemctl restart haproxy sudo systemctl restart haproxy
```` ````
Подключаюсь к машине где Prometeus: Подключаюсь к машине где Prometeus:
```sh ```sh
ssh igor@192.168.200.84 -p 22 ssh igor@192.168.200.84 -p 22
``` ```
Перезагружаем prometheus чтобы он начал собирать метрики Перезагружаем prometheus чтобы он начал собирать метрики
```sh ```sh
sudo systemctl restart prometheus sudo systemctl restart prometheus
``` ```
Теперь можно настраивать графану, вот готовыдашбоард Теперь можно настраивать графану, вот готовыдашбоард
Открыть Grafana Открыть Grafana
Перейти в Dashboards → Import Перейти в Dashboards → Import
Вставить ID: 9628 Вставить ID: 9628
Выбрать источник данных Prometheus (с PostgreSQL Exporter) Выбрать источник данных Prometheus (с PostgreSQL Exporter)
Нажать Import Нажать Import
Теперь можно настраивать графану, вот готовыдашбоард Теперь можно настраивать графану, вот готовыдашбоард
Открыть Grafana Открыть Grafana
Перейти в Dashboards → Import Перейти в Dashboards → Import
Вставить ID: 12273 Вставить ID: 12273
Выбрать источник данных Prometheus (с PostgreSQL Exporter) Выбрать источник данных Prometheus (с PostgreSQL Exporter)
Нажать Import Нажать Import

View File

@ -0,0 +1,158 @@
Думаю что данный механизм будет лучше чем PAM но WAZUH будет ругаться на создание пользователей, наверно не стоит создавать пользователей чаще чем раз в месяц.
# 🔐 Использование PostgreSQL с Vault Database Secrets Engine
Vault от HashiCorp предоставляет [**Database Secrets Engine**](https://developer.hashicorp.com/vault/docs/secrets/databases) — мощный инструмент для **динамической выдачи учетных данных** к базам данных, включая PostgreSQL.
## Что делает Vault с PostgreSQL
Vault может:
- Создавать **временных пользователей** в PostgreSQL
- Ограничивать **время жизни (TTL)** учетных записей
- Автоматически **удалять пользователей** после TTL
- Выдавать **роли с разными правами**
---
## ⚙️ Настройка Vault с PostgreSQL
### 1. Включить Secret Engine
```bash
vault secrets enable database
```
### 2. Настроить подключение к PostgreSQL
```bash
vault write database/config/my-postgresql-db \
plugin_name=postgresql-database-plugin \
allowed_roles="readonly,readwrite" \
connection_url="postgresql://{{username}}:{{password}}@db.example.com:5432/mydb?sslmode=disable" \
username="vaultadmin" \
password="adminpassword"
```
```bash
vault write database/roles/app_billing \
db_name=my-postgresql-db \
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION NOBYPASSRLS CONNECTION LIMIT 100; GRANT app_billing TO \"{{name}}\";" \
default_ttl="1h" \
max_ttl="24h"
```
```bash
vault write database/roles/app_company \
db_name=my-postgresql-db \
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION NOBYPASSRLS CONNECTION LIMIT 100; GRANT app_company TO \"{{name}}\";" \
default_ttl="1h" \
max_ttl="24h"
```
> `vaultadmin` должен иметь привилегии на создание пользователей и назначение прав.
---
### 3. Создать роли Vault → PostgreSQL
#### Роль readonly:
```bash
vault write database/roles/readonly \
db_name=my-postgresql-db \
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
default_ttl="1h" \
max_ttl="24h"
```
#### Роль readwrite:
```bash
vault write database/roles/readwrite \
db_name=my-postgresql-db \
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
default_ttl="1h" \
max_ttl="24h"
```
2. Создаем два AppRole логина
```
vault auth enable approle
```
```conf
vault write auth/approle/role/app_billing_role \
token_policies="app-billing" \
token_ttl=1h \
token_max_ttl=4h
```
```conf
vault write auth/approle/role/app_company_role \
token_policies="app-company" \
token_ttl=1h \
token_max_ttl=4h
```
---
### 4. Получение динамического пользователя
```bash
vault read database/creds/readonly
vault read database/creds/app_billing
vault read database/creds/app_company
```
Ответ:
```json
{
"data": {
"username": "v-token-readonly-3HeNkcQZ",
"password": "D8uJKv2sO7VvXJ5yMwG1",
"ttl": 3600
}
}
```
### Удаление пользователя:
```bash
vault lease revoke <lease_id>
```
---
## 🔁 Использование существующих пользователей (Static Roles)
```bash
vault write database/static-roles/my-static-role \
db_name=my-postgresql-db \
rotation_statements="ALTER USER readonly WITH PASSWORD '{{password}}';" \
username="readonly" \
rotation_period="24h"
```
> Vault будет менять пароль у существующего пользователя.
---
## 🔐 Привилегии PostgreSQL пользователя `vaultadmin`
```sql
CREATE ROLE;
GRANT ...;
ALTER DEFAULT PRIVILEGES ...;
```
---
## 🎯 Применение
- CI/CD пайплайны: временные креды с TTL
- Разработчики: автоматическая выдача доступов
- Безопасность: без хранения логинов в `.env`
---

View File

@ -0,0 +1,145 @@
Настройка авторизации через Vault при помощи PAM (Пароль для каждого из пользователей храняться в Vault)
------------------------------------------------------------------------------------------
Шаг 1: Настройка Vault для хранения паролей
Vault будет хранить пароли существующих пользователей PostgreSQL в KV Secrets Engine.
Включите KV Secrets Engine
```sh
vault secrets enable -path=secret kv
```
Сохраните пароли пользователей:
Для каждого пользователя PostgreSQL сохраните пароль в Vault. Например:
```sh
vault kv put secret/postgres-users/user1 password="securepassword123"
vault kv put secret/postgres-users/user2 password="anotherpassword456"
```
Здесь:
secret/postgres-users/<username> — путь к секрету.
password — поле, содержащее пароль.
Настройте политики Vault:
Создайте политику, которая позволяет Python-скрипту читать пароли:
```conf
path "secret/data/postgres-users/*" {
capabilities = ["read"]
}
```
Примените политику:
```sh
vault policy write postgres-auth postgres-auth-policy.hcl
```
Создайте токен Vault:
Создайте токен для скрипта с доступом к политике:
```sh
vault token create -policy=postgres-auth
```
Сохраните токен (например, в /etc/vault-token), чтобы скрипт мог его использовать.
------------------------------------------------------------------------------------------
Шаг 1: Настройка PostgreSQL для PAM
Редактируем pg_hba.conf:
В файле /etc/postgresql/<version>/main/pg_hba.conf добавьте строку:
```text
host all all 0.0.0.0/0 pam pamservice=postgresql
```
Создаем PAM-конфигурацию:
Создайте файл /etc/pam.d/postgresql:
```
auth required pam_exec.so /path/to/vault_auth.py
account required pam_permit.so
```
Перезапустите PostgreSQL:
```sh
sudo systemctl restart postgresql
```
Создайте Python-скрипт (vault_auth.py), который будет вызываться PAM для проверки учетных данных через Vault. Пример:
```py
#!/usr/bin/env python3
import os
import sys
import hvac
def authenticate_with_vault(username, password):
try:
# Чтение токена Vault
vault_token = os.getenv('VAULT_TOKEN')
if vault_token is None or vault_token == "":
try:
with open('/etc/vault-token', 'r') as f:
vault_token = f.read().strip()
except FileNotFoundError:
print("Error: Vault token file /etc/vault-token not found", file=sys.stderr)
return False
except Exception as e:
print(f"Error reading vault token file: {e}", file=sys.stderr)
return False
if not vault_token:
print("Error: Vault token is empty", file=sys.stderr)
return False
# Инициализация клиента Vault
client = hvac.Client(url='http://127.0.0.1:8200', token=vault_token)
# Запрашиваем пароль из Vault
secret_path = f"secret/data/postgres-users/{username}"
response = client.secrets.kv.v2.read_secret_version(path=secret_path)
# Получаем хранимый пароль
stored_password = response['data']['data']['password']
# Сравниваем введенный пароль с хранимым
return stored_password == password
except Exception as e:
print(f"Authentication failed: {e}", file=sys.stderr)
return False
def main():
# PAM передает имя пользователя через переменную окружения
username = os.getenv('PAM_USER')
# Пароль читается из стандартного ввода
password = sys.stdin.readline().strip()
if authenticate_with_vault(username, password):
sys.exit(0) # Успешная аутентификация
else:
sys.exit(1) # Ошибка аутентификации
if __name__ == "__main__":
main()
```
Сделайте скрипт исполняемым:
```sh
chmod +x /path/to/vault_auth.py
```
```sh
pip install hvac
```
Или передайте токен безопасно через файл (например, /etc/vault-token) и считывайте его в скрипте:
```
with open('/etc/vault-token', 'r') as f:
vault_token = f.read().strip()
```
----------------------------------------------------------------------------------------------------

View File

@ -1,61 +1,61 @@
**************************************************************************************************** ****************************************************************************************************
Установка и настройка проверяльщик паролей credcheck Установка и настройка проверяльщик паролей credcheck
PostgreSQL https://www.postgresql.org/about/news/credcheck-v200-released-2654/ PostgreSQL https://www.postgresql.org/about/news/credcheck-v200-released-2654/
Тестовая база Тестовая база
```sh ```sh
ssh administrator@10.201.3.36 -p 22 ssh administrator@10.201.3.36 -p 22
``` ```
Похоже в официальном репозитории нет credcheck, так что если будем искать то не найдём: Похоже в официальном репозитории нет credcheck, так что если будем искать то не найдём:
```sh ```sh
apt search credcheck apt search credcheck
``` ```
Поэтому устанавливаем из репозиториев (компилируем на тестовой машине потом устанавливаем на продакшен): Поэтому устанавливаем из репозиториев (компилируем на тестовой машине потом устанавливаем на продакшен):
```sh ```sh
sudo apt-get install postgresql-server-dev-16 && sudo apt-get install postgresql-server-dev-16 &&
sudo apt-get install build-essential && sudo apt-get install build-essential &&
git clone https://github.com/HexaCluster/credcheck.git && git clone https://github.com/HexaCluster/credcheck.git &&
cd credcheck && cd credcheck &&
make && make &&
sudo make install sudo make install
``` ```
Подключаемся к базе данных для выполнения запросов Подключаемся к базе данных для выполнения запросов
```sh ```sh
psql -h 127.0.0.1 -U postgres -d transit psql -h 127.0.0.1 -U postgres -d transit
``` ```
Проверяем что настройки имеются: Проверяем что настройки имеются:
```sh ```sh
SELECT name, setting, unit, source, sourcefile, sourceline SELECT name, setting, unit, source, sourcefile, sourceline
FROM pg_settings FROM pg_settings
WHERE name LIKE 'credcheck%'; WHERE name LIKE 'credcheck%';
``` ```
Читаем текущие настройки Читаем текущие настройки
```sh ```sh
SHOW ALL; SHOW ALL;
``` ```
Создаём расширение в базе postgres: Создаём расширение в базе postgres:
```sh ```sh
CREATE EXTENSION credcheck; CREATE EXTENSION credcheck;
``` ```
Теперь можно настроить расширение по https://tembo.io/docs/getting-started/postgres_guides/extensions/credcheck: Теперь можно настроить расширение по https://tembo.io/docs/getting-started/postgres_guides/extensions/credcheck:
-- Configure credential policies to enforce username and password standards and reload configuration files -- Configure credential policies to enforce username and password standards and reload configuration files
ALTER SYSTEM SET credcheck.username_min_length = 4; ALTER SYSTEM SET credcheck.username_min_length = 4;
ALTER SYSTEM SET credcheck.password_min_length = 8; ALTER SYSTEM SET credcheck.password_min_length = 8;
ALTER SYSTEM SET credcheck.password_min_special = 1; ALTER SYSTEM SET credcheck.password_min_special = 1;
SELECT pg_reload_conf(); SELECT pg_reload_conf();
-- Attempt to create a user for a new park ranger, which does not meet the credential policies -- Attempt to create a user for a new park ranger, which does not meet the credential policies
CREATE USER ranger_ WITH PASSWORD 'forest'; CREATE USER ranger_ WITH PASSWORD 'forest';
ERROR: password length should match the configured credcheck.password_min_length ERROR: password length should match the configured credcheck.password_min_length
Для пароля установить: Для пароля установить:
ALTER SYSTEM SET credcheck.password_expiration_days = 90; ALTER SYSTEM SET credcheck.password_expiration_days = 90;
SELECT pg_reload_conf(); SELECT pg_reload_conf();
Для приложений нужно изменить политику паролей (менять не автоматически а по расписанию у администратора): Для приложений нужно изменить политику паролей (менять не автоматически а по расписанию у администратора):

View File

@ -1,348 +1,381 @@
# Install PostgreSQL database # Install PostgreSQL database
Coonect lto need server: Coonect lto need server:
```sh ```sh
wsl wsl
``` ```
Or coonect to need server: Or coonect to need server:
```sh ```sh
ssh igor@ccalm.org -p 2200 ssh igor@192.168.200.88 -p 22
``` ```
**************************************************************************************************** ****************************************************************************************************
Установка PostgreSQL 11.5 windows10 из https://www.enterprisedb.com/download-postgresql-binaries: Установка PostgreSQL 11.5 windows10 из https://www.enterprisedb.com/download-postgresql-binaries:
Скачал, создаю дирректорию хранения данных: Скачал, создаю дирректорию хранения данных:
O:\MyDocuments\DataBases\postgresql-12.3-1-windows-x64-binaries\pgsql\bin\initdb.exe -D O:\MyDocuments\DataBases\Data_PostgreSQL_12.3 O:\MyDocuments\DataBases\postgresql-12.3-1-windows-x64-binaries\pgsql\bin\initdb.exe -D O:\MyDocuments\DataBases\Data_PostgreSQL_12.3
O:\MyDocuments\DataBases\postgresql-10.13-1-windows-x64-binaries\pgsql\bin\initdb.exe -D O:\MyDocuments\DataBases\Data_PostgreSQL_10.13 O:\MyDocuments\DataBases\postgresql-10.13-1-windows-x64-binaries\pgsql\bin\initdb.exe -D O:\MyDocuments\DataBases\Data_PostgreSQL_10.13
Потом создать BAT файл с тем текстом что отобразится при создании каталога базы Потом создать BAT файл с тем текстом что отобразится при создании каталога базы
База данных создаётся не под пользователем postgres а под локальным пользователем igor База данных создаётся не под пользователем postgres а под локальным пользователем igor
**************************************************************************************************** ****************************************************************************************************
Установка PostgreSQL 14 ubuntu 22.04 или 24.04 Установка PostgreSQL 14 ubuntu 22.04 или 24.04
```sh ```sh
sudo apt-get update sudo apt-get update &&
sudo apt-get install postgresql postgresql-contrib -y sudo apt-get install postgresql postgresql-contrib -y
``` ```
Или так если нужно установить PostGIS Или так если нужно установить PostGIS
```sh ```sh
sudo apt-get install postgis sudo apt-get install postgis -y
``` ```
Для удаления PostGIS в месте с зависимыми пакетами: Для удаления PostGIS в месте с зависимыми пакетами:
```sh ```sh
sudo apt-get remove --auto-remove postgis && sudo apt-get remove --auto-remove postgis &&
sudo apt-get purge postgis sudo apt-get purge postgis
``` ```
Добавить русскую локаль если её нет: Добавить русскую локаль если её нет:
```sh ```sh
sudo locale-gen ru_RU && sudo locale-gen ru_RU &&
sudo locale-gen ru_RU.UTF-8 && sudo locale-gen ru_RU.UTF-8 &&
sudo locale-gen kk_KZ && sudo locale-gen kk_KZ &&
sudo locale-gen kk_KZ.UTF-8 sudo locale-gen kk_KZ.UTF-8
``` ```
Проверить какая локаль по умолчанию: Проверить какая локаль по умолчанию:
```sh ```sh
localectl status localectl status
``` ```
И переконфигурировать локаль по умолчанию в ru_RU.UTF-8 (а то в mc могут быть кракозябры): И переконфигурировать локаль по умолчанию в ru_RU.UTF-8 (а то в mc могут быть кракозябры):
```sh ```sh
sudo dpkg-reconfigure locales sudo dpkg-reconfigure locales
``` ```
Для задания пароля в PostgreSQL выполнить: Для задания пароля в PostgreSQL выполнить:
```sh ```sh
sudo -u postgres psql && sudo -u postgres psql &&
\password postgres ```
``` можно так поменять но лучьше SQL запросом что ниже
Чтобы выйти нужно выпольнить команду: \q ```sql
\password postgres
Роль входа по умолчанию: postgres пароль можно поменять когда в pg_hba.conf установить trust ```
Задать пароль: Или так можно поменять пароль через SQL скрипт
sudo -u postgres psql ```sql
postgres=> SELECT usename FROM pg_user; ALTER ROLE postgres WITH PASSWORD 'SerTestSecrKey1' VALID UNTIL 'infinity';
postgres=> alter user postgres password 'PasSecrKey1'; ```
postgres=> \q Чтобы выйти нужно выпольнить команду: \q
```sql
Настройка postgresql.conf: http://www.lissyara.su/archive/1c_8.2+postgresql/ \q
Создаём базу данных выполнив функцию: ```
CREATE DATABASE CCALM
WITH OWNER = postgres
TEMPLATE = template0 Роль входа по умолчанию: postgres пароль можно поменять когда в pg_hba.conf установить trust
ENCODING = 'UTF8' Задать пароль:
TABLESPACE = pg_default sudo -u postgres psql
LC_COLLATE = 'ru_RU.UTF-8' postgres=> SELECT usename FROM pg_user;
LC_CTYPE = 'ru_RU.UTF-8' postgres=> alter user postgres password 'PasSecrKey1';
CONNECTION LIMIT = -1; postgres=> \q
Файл настроек postgresql: Настройка postgresql.conf: http://www.lissyara.su/archive/1c_8.2+postgresql/
```sh Создаём базу данных выполнив функцию:
sudo mcedit /etc/postgresql/16/main/postgresql.conf CREATE DATABASE CCALM
``` WITH OWNER = postgres
listen_addresses='*' #Разрешить подключение с внешки TEMPLATE = template0
#Для 9й версии разрешаем экранирующие символы \' и другие без спец символа "E" перед строкой ENCODING = 'UTF8'
backslash_quote = on TABLESPACE = pg_default
escape_string_warning = off LC_COLLATE = 'ru_RU.UTF-8'
standard_conforming_strings = off LC_CTYPE = 'ru_RU.UTF-8'
Чтобы воводил двоичные данные по старому изменить на: CONNECTION LIMIT = -1;
bytea_output = 'escape'
Файл настроек postgresql:
Настраиваю лимиты а то в саранче не выполняло большой запрос "Ошибка ввода/ввывода при отправке бэкенду" ```sh
sudo mcedit /etc/postgresql/16/main/postgresql.conf
Для создания нового пользователя выполнить: ```
sudo -u postgres psql listen_addresses='*' #Разрешить подключение с внешки
CREATE ROLE zholak LOGIN ENCRYPTED PASSWORD 'md5c0029083b93a3b16207a83b45e8a324a' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE REPLICATION; #Для 9й версии разрешаем экранирующие символы \' и другие без спец символа "E" перед строкой
backslash_quote = on
Для подключения к определённой базе данных выполнить команду: escape_string_warning = off
sudo -u postgres psql standard_conforming_strings = off
\list or \l: для отображения всех баз Чтобы воводил двоичные данные по старому изменить на:
\connect zholak zholak bytea_output = 'escape'
\dt для отображения всех таблиц
Настраиваю лимиты а то в саранче не выполняло большой запрос "Ошибка ввода/ввывода при отправке бэкенду"
или написать со своим IP: host all all 2.133.238.240/24 trust
Для подключения с любых IP адресов в " Для создания нового пользователя выполнить:
```sh sudo -u postgres psql
sudo mcedit /etc/postgresql/16/main/pg_hba.conf CREATE ROLE zholak LOGIN ENCRYPTED PASSWORD 'md5c0029083b93a3b16207a83b45e8a324a' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE REPLICATION;
```
host all all 0.0.0.0/0 md5 Для подключения к определённой базе данных выполнить команду:
Либо с одного конкретного то: host all all 92.46.48.37/24 md5 sudo -u postgres psql
А также поменять на listen_addresses = '*' в postgresql.conf \list or \l: для отображения всех баз
Потом перезагрузить postgres: \connect zholak zholak
sudo service postgresql restart \dt для отображения всех таблиц
sudo /etc/init.d/postgresql stop
sudo /etc/init.d/postgresql restart или написать со своим IP: host all all 2.133.238.240/24 trust
sudo /etc/init.d/postgresql start Для подключения с любых IP адресов в "
Проверить запущен или нет то: ```sh
sudo /etc/init.d/postgresql status sudo mcedit /etc/postgresql/16/main/pg_hba.conf
Посмотрель лог загрузки PostGreSQL: ```
dmesg |grep pg host all all 0.0.0.0/0 md5
Чтобы посмотреть чем занят порт выполнить команду: Либо с одного конкретного то: host all all 92.46.48.37/24 md5
sudo netstat -tap | grep 5432 А также поменять на listen_addresses = '*' в postgresql.conf
Потом перезагрузить postgres:
Создать Backup (при переносе со старой на новую версию может быть не совместим для этого нужно делать бакам в текстовом формате: plain): ```sh
pg_dump bigfoott_shop>/home/igor/bigfoott_shop.sql --host=127.0.0.1 --username=bigfoott_root sudo systemctl restart postgresql
pg_dump ASDC_Locust>/home/igor/ASDC_Locust.sql --host=127.0.0.1 --username=postgres ```
pg_dump zholak>/home/zholak/zholak.sql --host=127.0.0.1 --username=postgres sudo /etc/init.d/postgresql stop
pg_dump stations>/home/administrator/pg_dump.sql --host=127.0.0.1 --username=postgres --format=custom sudo /etc/init.d/postgresql restart
pg_dump transit>/home/administrator/transit.sql --host=127.0.0.1 --username=postgres sudo /etc/init.d/postgresql start
pg_dump weather>weather.backup --host=127.0.0.1 --username=postgres --format=custom Проверить запущен или нет то:
pg_dump transit>transit.backup --host=127.0.0.1 --username=postgres --format=custom ```sh
sudo /etc/init.d/postgresql status
pg_dump CCALM>CCALM.backup --host=127.0.0.1 --username=postgres --format=custom ```
Посмотрель лог загрузки PostGreSQL:
pg_dump weather_ru>weather_ru.backup --host=127.0.0.1 --username=postgres --format=custom ```sh
pg_dump -d CCALM -h 192.168.0.161 -U postgres -f O:\dumps\CCALM.sql dmesg |grep pg
pg_dump --dbname=postgresql://postgres:PostPas1key@127.0.0.1:5432/ShopMaster | gzip > /mnt/disk1/backup/$(date +%Y-%m-%d).ShopMaster.gz ```
Чтобы посмотреть чем занят порт выполнить команду:
Востановить Dump из текстового файла: ```sh
psql ASDC_Locust < /home/igor/ASDC_Locustfcron.backup sudo apt-get update &&
psql -h 127.0.0.1 -U bigfoott_root -d bigfoott_shop_old2 < E:\dumps\bigfoottrade\dump.sql sudo apt-get install net-tools &&
psql -h 127.0.0.1 -U postgres -d monitoring < /home/igor/pg_dump.sql sudo netstat -tap | grep 5432
psql -h 127.0.0.1 -U postgres -d transit_2024 < /home/administrator/transit.sql ```
psql -h 127.0.0.1 -U postgres -d bigfoot_shop < /home/igor/goods.sql
Создать Backup (при переносе со старой на новую версию может быть не совместим для этого нужно делать бакам в текстовом формате: plain):
Создание SH скрипта для ежедневного бакапирования и архивации в ZIP файл: pg_dump --host=192.168.200.17 --username=postgres salevizor > /home/igor/salevizor.sql
/mnt/O_DRIVE/MyDocuments/DataBases/dumps/run.sh
#!/bin/sh pg_dump bigfoott_shop>/home/igor/bigfoott_shop.sql --host=127.0.0.1 --username=bigfoott_root
pg_dump --dbname=postgresql://postgres:A6dCgeDDWHbC@127.0.0.1:5432/Queue | gzip > /mnt/disk1/backup/$(date +%Y-%m-%d).Queue.gz pg_dump ASDC_Locust>/home/igor/ASDC_Locust.sql --host=127.0.0.1 --username=postgres
pg_dump zholak>/home/zholak/zholak.sql --host=127.0.0.1 --username=postgres
Для востановления через pg_restore (версии баз должны совпадать а то может не восстановиться): pg_dump stations>/home/administrator/pg_dump.sql --host=127.0.0.1 --username=postgres --format=custom
su - postgres pg_dump transit>/home/administrator/transit.sql --host=127.0.0.1 --username=postgres
pg_restore -U <username> -d <dbname> -1 <filename>.dump pg_dump weather>weather.backup --host=127.0.0.1 --username=postgres --format=custom
pg_restore -U postgres -d zholak -1 /home/zholak/zholak_16.01.2019.backup pg_dump transit>transit.backup --host=127.0.0.1 --username=postgres --format=custom
pg_restore -U postgres -d monitoring -1 /home/igor/stations_20200626.backup
pg_restore -U postgres -d transit_new -1 /home/administrator/temp/transit.backup pg_dump CCALM>CCALM.backup --host=127.0.0.1 --username=postgres --format=custom
pg_restore -U postgres -d transit -1 /home/administrator/transit.backup
pg_restore --host=127.0.0.1 --username=postgres --dbname=transit_2024 --verbose /home/administrator/transit.backup pg_dump weather_ru>weather_ru.backup --host=127.0.0.1 --username=postgres --format=custom
pg_dump -d CCALM -h 192.168.0.161 -U postgres -f O:\dumps\CCALM.sql
sudo -u postgres psql -d transit -f /tmp/transit.backup pg_dump --dbname=postgresql://postgres:PostPas1key@127.0.0.1:5432/ShopMaster | gzip > /mnt/disk1/backup/$(date +%Y-%m-%d).ShopMaster.gz
Или из архива (первоначально задать trust на 127.0.0.1) так: Востановить Dump из текстового файла:
gunzip -c /var/www/dump.sql.gz | psql -h 127.0.0.1 -U bigfoott_root -d bigfoott_shop psql ASDC_Locust < /home/igor/ASDC_Locustfcron.backup
psql -h 127.0.0.1 -U bigfoott_root -d bigfoott_shop_old2 < E:\dumps\bigfoottrade\dump.sql
**************************************************************************************************** psql -h 127.0.0.1 -U postgres -d monitoring < /home/igor/pg_dump.sql
Настройка отображения статистики для PostgreSQL: psql -h 127.0.0.1 -U postgres -d transit_2024 < /home/administrator/transit.sql
https://habr.com/ru/articles/488968/ psql -h 127.0.0.1 -U postgres -d bigfoot_shop < /home/igor/goods.sql
SELECT * FROM pg_stat_statements ORDER BY total_exec_time DESC; Создание SH скрипта для ежедневного бакапирования и архивации в ZIP файл:
SELECT * FROM pg_stat_activity /mnt/O_DRIVE/MyDocuments/DataBases/dumps/run.sh
SELECT * FROM pg_stat_replication #!/bin/sh
SELECT * FROM pg_stat_all_tables pg_dump --dbname=postgresql://postgres:A6dCgeDDWHbC@127.0.0.1:5432/Queue | gzip > /mnt/disk1/backup/$(date +%Y-%m-%d).Queue.gz
Полный список: https://postgrespro.ru/docs/postgrespro/9.5/monitoring-stats Для востановления через pg_restore (версии баз должны совпадать а то может не восстановиться):
su - postgres
Установить Prometheus сграфаной Grafana для PostgreSQL там по умолчанию есть набор настроек для сбора статистики с PostgreSQL pg_restore -U <username> -d <dbname> -1 <filename>.dump
По мотивам: https://grafana.com/oss/prometheus/exporters/postgres-exporter/ pg_restore -U postgres -d zholak -1 /home/zholak/zholak_16.01.2019.backup
По мотивам: https://www.youtube.com/watch?v=B_yz37CR1XU pg_restore -U postgres -d monitoring -1 /home/igor/stations_20200626.backup
**************************************************************************************************** pg_restore -U postgres -d transit_new -1 /home/administrator/temp/transit.backup
Установка pgagent pg_restore -U postgres -d transit -1 /home/administrator/transit.backup
sudo apt-get update pg_restore --host=127.0.0.1 --username=postgres --dbname=transit_2024 --verbose /home/administrator/transit.backup
sudo apt-get install pgagent pg_restore --host=127.0.0.1 --username=postgres --dbname=CCALM --verbose /tmp/CCALM.backup
Выполнить в консоли запрос:
psql -h localhost -U postgres sudo -u postgres psql -d transit -f /tmp/transit.backup
create extension pgagent;
\q
Для разрешения подключения откройте файл pg_hba.conf и замените строку на:
host all all 127.0.0.1/32 md5 Или из архива (первоначально задать trust на 127.0.0.1) так:
gunzip -c /var/www/dump.sql.gz | psql -h 127.0.0.1 -U bigfoott_root -d bigfoott_shop
Можно для теста запустить pgagent с повышенным уровнем логирования:
/usr/bin/pgagent -f -l 2 hostaddr=127.0.0.1 dbname=postgres user=postgres password=lelPfAtgQWhHYfy1SsHk ****************************************************************************************************
Настройка отображения статистики для PostgreSQL:
Если файла нет то пытаюсь его создать: https://habr.com/ru/articles/488968/
sudo mcedit /lib/systemd/system/pgagent.service
SELECT * FROM pg_stat_statements ORDER BY total_exec_time DESC;
[Unit] SELECT * FROM pg_stat_activity
Description=PostgreSQL PgAgent Service SELECT * FROM pg_stat_replication
After=network.target SELECT * FROM pg_stat_all_tables
[Service] Полный список: https://postgrespro.ru/docs/postgrespro/9.5/monitoring-stats
Type=simple
User=postgres Установить Prometheus сграфаной Grafana для PostgreSQL там по умолчанию есть набор настроек для сбора статистики с PostgreSQL
ExecStart=/usr/bin/pgagent -f hostaddr=127.0.0.1 dbname=postgres user=postgres password=PasSecrKey1 По мотивам: https://grafana.com/oss/prometheus/exporters/postgres-exporter/
По мотивам: https://www.youtube.com/watch?v=B_yz37CR1XU
[Install] ****************************************************************************************************
WantedBy=multi-user.target Установка pgagent
```sh
Проверяю что сервис был запущен: sudo apt-get update &&
sudo systemctl daemon-reload sudo apt-get install pgagent
sudo systemctl enable pgagent ```
sudo service pgagent start Выполнить в консоли запрос:
sudo systemctl status pgagent psql -h localhost -U postgres
create extension pgagent;
\q
Для проверки пробуем подключиться к базе данных Для разрешения подключения откройте файл pg_hba.conf и замените строку на:
sudo -u postgres psql -h 127.0.0.1 -U postgres -d postgres host all all 127.0.0.1/32 md5
\q
Можно для теста запустить pgagent с повышенным уровнем логирования:
Похоже что нужно ещё создать файл паролей так как агент не знает как подключаться: /usr/bin/pgagent -f -l 2 hostaddr=127.0.0.1 dbname=postgres user=postgres password=lelPfAtgQWhHYfy1SsHk
sudo -u postgres touch /var/lib/postgresql/.pgpass
sudo -u postgres chmod 600 /var/lib/postgresql/.pgpass Если файла нет то пытаюсь его создать:
sudo -u postgres mcedit /var/lib/postgresql/.pgpass sudo mcedit /lib/systemd/system/pgagent.service
И прописать в него:
127.0.0.1:5432:postgres:postgres:PasSecrKey1 [Unit]
Где используется такой формат: hostname:port:database:username:password Description=PostgreSQL PgAgent Service
Затем: After=network.target
sudo systemctl enable pgagent
sudo service pgagent start [Service]
sudo service pgagent status Type=simple
Посмотреть логи: User=postgres
sudo journalctl -u pgagent ExecStart=/usr/bin/pgagent -f hostaddr=127.0.0.1 dbname=postgres user=postgres password=PasSecrKey1
**************************************************************************************************** [Install]
Для добавления автоматического бакапирования Postgresql базы *.backup создать скрипт: WantedBy=multi-user.target
Проверяю что сервис был запущен:
**************************************************************************************************** sudo systemctl daemon-reload
Перенос базы PostgreSQL на другой диск: https://internet-lab.ru/postgresql_ubuntu_move sudo systemctl enable pgagent
sudo service pgagent start
**************************************************************************************************** sudo systemctl status pgagent
Установка PostGIS на PostgreSQL выше 9.0 версии:
sudo apt-get install postgis postgresql-9.3-postgis-2.1
Для 10й версии: Для проверки пробуем подключиться к базе данных
sudo apt install postgresql-10-postgis-2.4 sudo -u postgres psql -h 127.0.0.1 -U postgres -d postgres
sudo apt install postgresql-10-postgis-scripts \q
Для 12й версии:
sudo apt install postgresql-12-postgis-2.4 Похоже что нужно ещё создать файл паролей так как агент не знает как подключаться:
sudo -u postgres touch /var/lib/postgresql/.pgpass
Создать базу данных и выполнть на ней следующие команды: sudo -u postgres chmod 600 /var/lib/postgresql/.pgpass
-- Enable PostGIS (includes raster) sudo -u postgres mcedit /var/lib/postgresql/.pgpass
CREATE EXTENSION postgis; И прописать в него:
-- Enable Topology 127.0.0.1:5432:postgres:postgres:PasSecrKey1
CREATE EXTENSION postgis_topology; Где используется такой формат: hostname:port:database:username:password
-- fuzzy matching needed for Tiger Затем:
CREATE EXTENSION fuzzystrmatch; sudo systemctl enable pgagent
-- rule based standardizer sudo service pgagent start
CREATE EXTENSION address_standardizer; sudo service pgagent status
-- example rule data set Посмотреть логи:
CREATE EXTENSION address_standardizer_data_us; sudo journalctl -u pgagent
-- Enable US Tiger Geocoder
CREATE EXTENSION postgis_tiger_geocoder; ****************************************************************************************************
Для добавления автоматического бакапирования Postgresql базы *.backup создать скрипт:
У меня начало выдавать NOTICE: version "2.2.1" of extension "postgis_topology" is already installed и PostGIS перестал работать на моём PostgreSQL 9.5.17
Аказывается расширение кудато делось установил:
sudo apt-get install postgresql-9.5-postgis-2.2 ****************************************************************************************************
**************************************************************************************************** Перенос базы PostgreSQL на другой диск: https://internet-lab.ru/postgresql_ubuntu_move
Для добавления TOTP авторизации в Postgresql выполнить:
CREATE EXTENSION otp; ****************************************************************************************************
Установка PostGIS на PostgreSQL выше 9.0 версии:
sudo apt-get install postgis postgresql-9.3-postgis-2.1
**************************************************************************************************** Для 10й версии:
sudo apt-get install libpq-dev libpq-fe sudo apt install postgresql-10-postgis-2.4
Если есть несовместимость libpq-dev : Зависит: libpq5 (= 14.3-0ubuntu0.22.04.1) но 14.3-1.pgdg22.04+1 должен быть установлен sudo apt install postgresql-10-postgis-scripts
То удали ранее добавленный репозиторий: /etc/apt/sources.list.d/pgadmin4.list и обнови а потом попробуй установить заново libpq-dev Для 12й версии:
apt update sudo apt install postgresql-12-postgis-2.4
****************************************************************************************************
Установка phpPgAdmin через репозиторий: Создать базу данных и выполнть на ней следующие команды:
sudo apt-get install phppgadmin ```sql
Можно открыть так: http://localhost/phppgadmin -- Enable PostGIS (includes raster)
Для доступа с любых ip адресов в файле: /etc/phppgadmin/apache.conf изменить на allow from all CREATE EXTENSION postgis;
Чтоб можно было залогинется под пользователем postgres меняем в: -- Enable Topology
/etc/phppgadmin/config.inc.php extra_login_security в false CREATE EXTENSION postgis_topology;
Если phpphadmin не дает залогиниться и пишет "Неверный логин", нужно в postgresql.conf прописать $conf['servers'][0]['host'] = 'localhost'; -- fuzzy matching needed for Tiger
CREATE EXTENSION fuzzystrmatch;
Другой вариант скачать с сайта последнюю версию с "http://phppgadmin.sourceforge.net/doku.php". -- rule based standardizer
**************************************************************************************************** CREATE EXTENSION address_standardizer;
Установка pgAdmin4 через докер контейнер -- example rule data set
CREATE EXTENSION address_standardizer_data_us;
```sh -- Enable US Tiger Geocoder
sudo mkdir -p /opt/pgAdmin4 && CREATE EXTENSION postgis_tiger_geocoder;
sudo chmod -R 777 /opt/pgAdmin4 && ```
sudo chown -R $USER:$USER /opt/pgAdmin4 У меня начало выдавать NOTICE: version "2.2.1" of extension "postgis_topology" is already installed и PostGIS перестал работать на моём PostgreSQL 9.5.17
``` Аказывается расширение кудато делось установил:
sudo apt-get install postgresql-9.5-postgis-2.2
```sh ****************************************************************************************************
cd /opt/pgAdmin4 && Для добавления TOTP авторизации в Postgresql выполнить:
cat > docker-compose.yml <<'EOF' ```sql
services: CREATE EXTENSION otp;
pgadmin: ```
image: dpage/pgadmin4
container_name: pgadmin4 ****************************************************************************************************
restart: unless-stopped sudo apt-get install libpq-dev libpq-fe
ports: Если есть несовместимость libpq-dev : Зависит: libpq5 (= 14.3-0ubuntu0.22.04.1) но 14.3-1.pgdg22.04+1 должен быть установлен
- "5050:80" То удали ранее добавленный репозиторий: /etc/apt/sources.list.d/pgadmin4.list и обнови а потом попробуй установить заново libpq-dev
environment: apt update
PGADMIN_DEFAULT_EMAIL: irigm@mail.ru ****************************************************************************************************
PGADMIN_DEFAULT_PASSWORD: 123456 Установка phpPgAdmin через репозиторий:
volumes: sudo apt-get install phppgadmin
- pgadmin_data:/var/lib/pgadmin Можно открыть так: http://localhost/phppgadmin
Для доступа с любых ip адресов в файле: /etc/phppgadmin/apache.conf изменить на allow from all
volumes: Чтоб можно было залогинется под пользователем postgres меняем в:
pgadmin_data: /etc/phppgadmin/config.inc.php extra_login_security в false
EOF Если phpphadmin не дает залогиниться и пишет "Неверный логин", нужно в postgresql.conf прописать $conf['servers'][0]['host'] = 'localhost';
```
Другой вариант скачать с сайта последнюю версию с "http://phppgadmin.sourceforge.net/doku.php".
## 4. Запуск контейнера ****************************************************************************************************
Установка pgAdmin4 через докер контейнер
```sh
cd /opt/pgAdmin4 && ```sh
sudo docker compose up -d sudo mkdir -p /opt/pgAdmin4/backups &&
``` sudo mkdir -p /opt/pgAdmin4 &&
sudo chmod -R 777 /opt/pgAdmin4 &&
```sh sudo chown -R $USER:$USER /opt/pgAdmin4
cd /opt/pgAdmin4 && ```
sudo docker compose down
``` ```sh
cd /opt/pgAdmin4 &&
cat > docker-compose.yml <<'EOF'
services:
pgadmin:
image: dpage/pgadmin4
Проверить что не записан левый репозиторий для phppgadmin в /ect/opt/ container_name: pgadmin4
curl https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo apt-key add restart: unless-stopped
sudo sh -c 'echo "deb https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/bionic pgadmin4 main" > /etc/apt/sources.list.d/pgadmin4.list && apt update' ports:
sudo apt install pgadmin4 - "5050:80"
environment:
И не запустился сервер оболочка пытается стартануть а сервер нет... PGADMIN_DEFAULT_EMAIL: irigm@mail.ru
PGADMIN_DEFAULT_PASSWORD: 123456
sudo curl https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo apt-key add volumes:
sudo sh -c 'echo "deb https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/focal pgadmin4 main" > /etc/apt/sources.list.d/pgadmin4.list && apt update' - pgadmin_data:/var/lib/pgadmin
sudo apt install pgadmin4 - /opt/pgAdmin4/backups:/var/lib/pgadmin/storage
volumes:
Тоже не заработал pgadmin_data:
EOF
Попробовать так: https://www.tecmint.com/install-postgresql-with-pgadmin4-on-linux-mint/ ```
**************************************************************************************************** ## 4. Запуск контейнера
Балансировщик назрузки и потоковая репликация:
Pgpool-II https://www.youtube.com/watch?v=qpxKlH7DBjU сервер с высокой доступностью ```sh
https://ritorika.com.ua/dokument/6/pgpool-chto-jeto cd /opt/pgAdmin4 &&
**************************************************************************************************** sudo docker compose up -d
Мониторинг запросов postgresql ```
```sh
cd /opt/pgAdmin4 &&
sudo docker compose down
```
```sh
open http://localhost:5050
```
Проверить что не записан левый репозиторий для phppgadmin в /ect/opt/
curl https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo apt-key add
sudo sh -c 'echo "deb https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/bionic pgadmin4 main" > /etc/apt/sources.list.d/pgadmin4.list && apt update'
sudo apt install pgadmin4
И не запустился сервер оболочка пытается стартануть а сервер нет...
sudo curl https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo apt-key add
sudo sh -c 'echo "deb https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/focal pgadmin4 main" > /etc/apt/sources.list.d/pgadmin4.list && apt update'
sudo apt install pgadmin4
Тоже не заработал
Попробовать так: https://www.tecmint.com/install-postgresql-with-pgadmin4-on-linux-mint/
****************************************************************************************************
Балансировщик назрузки и потоковая репликация:
Pgpool-II https://www.youtube.com/watch?v=qpxKlH7DBjU сервер с высокой доступностью
https://ritorika.com.ua/dokument/6/pgpool-chto-jeto
****************************************************************************************************
Мониторинг запросов postgresql

View File

@ -1,12 +1,12 @@
Создано на основе https://www.cherryservers.com/blog/how-to-set-up-postgresql-database-replication Создано на основе https://www.cherryservers.com/blog/how-to-set-up-postgresql-database-replication
Подключаюсь к нужной машине Подключаюсь к нужной машине
```sh ```sh
ssh igor@192.168.200.84 -p 22 ssh igor@192.168.200.84 -p 22
``` ```

View File

@ -1,137 +1,137 @@
# Настройка PostgreSQL в синхронном режиме репликации # Настройка PostgreSQL в синхронном режиме репликации
Синхронная репликация в PostgreSQL гарантирует, что данные записываются на реплику перед подтверждением транзакции на основном сервере (Primary). Это повышает надежность, но может замедлить запись из-за необходимости ожидания отклика реплики. Синхронная репликация в PostgreSQL гарантирует, что данные записываются на реплику перед подтверждением транзакции на основном сервере (Primary). Это повышает надежность, но может замедлить запись из-за необходимости ожидания отклика реплики.
--- ---
## **1. Подготовка серверов** ## **1. Подготовка серверов**
Допустим, у нас есть: Допустим, у нас есть:
- **Основной сервер (Primary):** `192.168.1.1` - **Основной сервер (Primary):** `192.168.1.1`
- **Реплика (Standby):** `192.168.1.2` - **Реплика (Standby):** `192.168.1.2`
Убедитесь, что PostgreSQL установлен на обоих серверах. Убедитесь, что PostgreSQL установлен на обоих серверах.
--- ---
## **2. Настройка основного сервера (Primary)** ## **2. Настройка основного сервера (Primary)**
### **2.1 Разрешаем подключение реплики** ### **2.1 Разрешаем подключение реплики**
Редактируем `postgresql.conf`: Редактируем `postgresql.conf`:
```sh ```sh
sudo nano /etc/postgresql/15/main/postgresql.conf sudo nano /etc/postgresql/15/main/postgresql.conf
``` ```
Добавляем/изменяем параметры: Добавляем/изменяем параметры:
```conf ```conf
wal_level = replica wal_level = replica
synchronous_commit = on synchronous_commit = on
synchronous_standby_names = 'replica1' synchronous_standby_names = 'replica1'
max_wal_senders = 3 max_wal_senders = 3
wal_keep_size = 256MB wal_keep_size = 256MB
hot_standby = on hot_standby = on
``` ```
Редактируем `pg_hba.conf`, добавляя доступ для реплики: Редактируем `pg_hba.conf`, добавляя доступ для реплики:
```sh ```sh
sudo nano /etc/postgresql/15/main/pg_hba.conf sudo nano /etc/postgresql/15/main/pg_hba.conf
``` ```
Добавляем строку: Добавляем строку:
```conf ```conf
host replication replicator 192.168.1.2/32 md5 host replication replicator 192.168.1.2/32 md5
``` ```
### **2.2 Создаем пользователя для репликации** ### **2.2 Создаем пользователя для репликации**
```sql ```sql
CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'your_password'; CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'your_password';
``` ```
### **2.3 Перезапускаем PostgreSQL** ### **2.3 Перезапускаем PostgreSQL**
```sh ```sh
sudo systemctl restart postgresql sudo systemctl restart postgresql
``` ```
--- ---
## **3. Настройка реплики (Standby)** ## **3. Настройка реплики (Standby)**
### **3.1 Останавливаем PostgreSQL на реплике** ### **3.1 Останавливаем PostgreSQL на реплике**
```sh ```sh
sudo systemctl stop postgresql sudo systemctl stop postgresql
``` ```
### **3.2 Копируем данные с основного сервера** ### **3.2 Копируем данные с основного сервера**
На реплике выполняем: На реплике выполняем:
```sh ```sh
sudo -u postgres pg_basebackup -h 192.168.1.1 -U replicator -D /var/lib/postgresql/15/main -Fp -Xs -R -P sudo -u postgres pg_basebackup -h 192.168.1.1 -U replicator -D /var/lib/postgresql/15/main -Fp -Xs -R -P
``` ```
### **3.3 Указываем `application_name` вручную** ### **3.3 Указываем `application_name` вручную**
Файл `postgresql.auto.conf`, создаваемый `pg_basebackup`, не добавляет `application_name`, поэтому задаем его вручную: Файл `postgresql.auto.conf`, создаваемый `pg_basebackup`, не добавляет `application_name`, поэтому задаем его вручную:
```sh ```sh
sudo su postgres -c "psql -c \"ALTER SYSTEM SET primary_conninfo TO 'host=192.168.1.1 user=replicator password=your_password application_name=replica1';\"" sudo su postgres -c "psql -c \"ALTER SYSTEM SET primary_conninfo TO 'host=192.168.1.1 user=replicator password=your_password application_name=replica1';\""
``` ```
Затем перезапускаем PostgreSQL на реплике: Затем перезапускаем PostgreSQL на реплике:
```sh ```sh
sudo systemctl restart postgresql sudo systemctl restart postgresql
``` ```
### **3.4 Проверяем `primary_conninfo`** ### **3.4 Проверяем `primary_conninfo`**
```sh ```sh
cat /var/lib/postgresql/15/main/postgresql.auto.conf | grep primary_conninfo cat /var/lib/postgresql/15/main/postgresql.auto.conf | grep primary_conninfo
``` ```
Ожидаемый результат: Ожидаемый результат:
```ini ```ini
primary_conninfo = 'host=192.168.1.1 user=replicator password=your_password application_name=replica1' primary_conninfo = 'host=192.168.1.1 user=replicator password=your_password application_name=replica1'
``` ```
Если строка отсутствует, редактируем файл вручную: Если строка отсутствует, редактируем файл вручную:
```sh ```sh
sudo nano /var/lib/postgresql/15/main/postgresql.auto.conf sudo nano /var/lib/postgresql/15/main/postgresql.auto.conf
``` ```
Добавляем строку: Добавляем строку:
```ini ```ini
primary_conninfo = 'host=192.168.1.1 user=replicator password=your_password application_name=replica1' primary_conninfo = 'host=192.168.1.1 user=replicator password=your_password application_name=replica1'
``` ```
Сохраняем и перезапускаем PostgreSQL: Сохраняем и перезапускаем PostgreSQL:
```sh ```sh
sudo systemctl restart postgresql sudo systemctl restart postgresql
``` ```
--- ---
## **4. Обновляем настройки Primary для работы с репликой** ## **4. Обновляем настройки Primary для работы с репликой**
На основном сервере (Primary) выполняем: На основном сервере (Primary) выполняем:
```sh ```sh
sudo su postgres -c "psql -c \"ALTER SYSTEM SET synchronous_standby_names TO 'replica1';\"" sudo su postgres -c "psql -c \"ALTER SYSTEM SET synchronous_standby_names TO 'replica1';\""
``` ```
Перезапускаем PostgreSQL на Primary: Перезапускаем PostgreSQL на Primary:
```sh ```sh
sudo systemctl restart postgresql sudo systemctl restart postgresql
``` ```
--- ---
## **5. Проверка работы синхронной репликации** ## **5. Проверка работы синхронной репликации**
### **5.1 Проверяем статус репликации** ### **5.1 Проверяем статус репликации**
На **основном сервере (Primary)** выполняем: На **основном сервере (Primary)** выполняем:
```sql ```sql
SELECT application_name, sync_state FROM pg_stat_replication; SELECT application_name, sync_state FROM pg_stat_replication;
``` ```
Ожидаемый результат: Ожидаемый результат:
``` ```
application_name | sync_state application_name | sync_state
-----------------+------------ -----------------+------------
replica1 | sync replica1 | sync
``` ```
Если `sync_state = 'sync'`, значит синхронная репликация работает. Если `sync_state = 'sync'`, значит синхронная репликация работает.
--- ---
## **6. Итоговая проверка** ## **6. Итоговая проверка**
**Задали `primary_conninfo` вручную на реплике** **Задали `primary_conninfo` вручную на реплике**
**Перезапустили PostgreSQL на реплике** **Перезапустили PostgreSQL на реплике**
**Обновили `synchronous_standby_names` на основном сервере** **Обновили `synchronous_standby_names` на основном сервере**
**Перезапустили PostgreSQL на основном сервере** **Перезапустили PostgreSQL на основном сервере**
**Проверили `pg_stat_replication` на Primary** **Проверили `pg_stat_replication` на Primary**
Готово! 🎉 Готово! 🎉

View File

@ -0,0 +1,91 @@
Подключаюсь к инфраструктуре:
```sh
ssh ivanov_i@10.101.1.3
```
Зеркало APP Астана RabbitMQ
```sh
ssh ivanov_i@10.201.1.3 -p 22
```
```shsudo mc
psql -h 10.101.1.6 -U user_developer_igor_i -d transit
```
```sh
psql -h 10.201.3.36 -U postgres -d transit
```
## Логи по Базе
0) Создание таблицы
```sql
CREATE TABLE public.test_table (id bigint, PRIMARY KEY (id));
```
1) Немного изменил права:
```sql
ALTER TABLE IF EXISTS public.test_table OWNER to user_developer_igor_i;
```
2) Удаление таблицы
```sql
DROP TABLE public.test_table;
```
3) Создание пользователя БД
```sql
CREATE ROLE test_user WITH LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOREPLICATION NOBYPASSRLS CONNECTION LIMIT -1 VALID UNTIL '2025-05-22T00:00:00+05:00' PASSWORD '!Ii123456';
```
4) Изменение прав пользователя !!!!!!!!!!Вадим не видел!!!!!!!!!!!
```sql
ALTER ROLE user_developer_igor_i NOLOGIN VALID UNTIL '2025-05-22T00:00:00+05:00';
```
```sql
GRANT app_authorization TO user_developer_igor_i;
```
```sql
REVOKE app_authorization FROM user_developer_igor_i;
```
```sql
REVOKE SELECT ON TABLE public.test_table FROM user_developer_igor_i;
```
```sql
GRANT SELECT ON public.test_table TO user_developer_igor_i;
```
5) Удаление пользователя БД
```sql
DROP ROLE test_user;
```
```sql
CREATE DATABASE test_db WITH OWNER = user_developer_igor_i ENCODING = 'UTF8' LOCALE_PROVIDER = 'libc' CONNECTION LIMIT = -1 IS_TEMPLATE = False;
```
```sql
DROP DATABASE test_db;
```
Выходим:
```sql
\q
```
Логи по ППО:
1) Попытки не верного ввода пароля/логина
2) Авторизация
3) Выход из системы
4) Создание пользователя
5) Изменение прав пользователю.
6) Удаление пользователя
7) Создание перевозки
8) Проведение оплаты

View File

@ -0,0 +1,53 @@
#!/bin/bash
# Конфигурация
DB_NAME="CCALM"
DB_HOST="127.0.0.1"
DB_USER="postgres"
BACKUP_DIR="/opt/backups/data"
TIMESTAMP=$(date +%Y%m%d_%H%M)
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_${TIMESTAMP}.backup"
# Проверка существования директории для бэкапов
if [ ! -d "$BACKUP_DIR" ]; then
echo "Ошибка: Директория $BACKUP_DIR не существует. Создаю..."
mkdir -p "$BACKUP_DIR"
if [ $? -ne 0 ]; then
echo "Ошибка: Не удалось создать директорию $BACKUP_DIR"
exit 1
fi
fi
# Установка прав для пользователя webdav
chown rclone:rclone "$BACKUP_DIR"
chmod 755 "$BACKUP_DIR"
# Экспорт пароля (если не используется .pgpass)
# Замените 'your_password' на реальный пароль или настройте .pgpass
export PGPASSWORD='309A86FF65A78FB428F4E38DFE35F730'
# Выполнение pg_dump
echo "Создание резервной копии базы данных $DB_NAME в $BACKUP_FILE..."
pg_dump "$DB_NAME" \
--host="$DB_HOST" \
--username="$DB_USER" \
--format=custom \
--file="$BACKUP_FILE"
# Проверка успешности выполнения
if [ $? -eq 0 ]; then
echo "Резервная копия успешно создана: $BACKUP_FILE"
# Установка прав для пользователя webdav
chown webdav:webdav "$BACKUP_FILE"
chmod 644 "$BACKUP_FILE"
else
echo "Ошибка: Не удалось создать резервную копию"
exit 1
fi
# Очистка старых бэкапов (например, старше 7 дней)
find "$BACKUP_DIR" -name "${DB_NAME}_*.backup" -mtime +7 -delete
echo "Старые бэкапы (старше 7 дней) удалены"
# Перемещаю на другой сервер
rclone move /opt/backups/data mywebdav:/backups --progress --no-check-certificate

View File

@ -1,260 +1,261 @@
# 📌 Установка HAProxy на Ubuntu 20.04 # 📌 Установка HAProxy на Ubuntu 20.04
**************************************************************************************************** ****************************************************************************************************
На основе инструкции из https://itsecforu.ru/2019/07/15/⏳-настройка-балансировщика-нагрузки-h/ На основе инструкции из https://itsecforu.ru/2019/07/15/⏳-настройка-балансировщика-нагрузки-h/
Connect to the required server: Connect to the required server:
```sh ```sh
ssh administrator@10.101.1.3 -p 22 ssh administrator@10.101.1.3 -p 22
``` ```
Connect to CCALM Turkish infrastructure: Home server
```sh ```sh
ssh igor@88.218.94.134 -p 2200 ssh igor@192.168.200.81 -p 22
``` ```
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
## Install haproxy ## Install haproxy
```sh ```sh
sudo apt-get update && sudo apt-get install haproxy -y sudo apt-get update && sudo apt-get install haproxy -y
```` ````
Создаём резервную копию файла: Создаём резервную копию файла:
```sh ```sh
sudo cp /etc/haproxy/haproxy.cfg{,.bak} sudo cp /etc/haproxy/haproxy.cfg{,.bak}
```` ````
Редактируем конфигурацию (Описание конфигурационного файла HAProxy https://habr.com/ru/sandbox/34354/) Редактируем конфигурацию (Описание конфигурационного файла HAProxy https://habr.com/ru/sandbox/34354/)
```sh ```sh
mcedit /etc/haproxy/haproxy.cfg mcedit /etc/haproxy/haproxy.cfg
``` ```
В конец файла добавляем пока только для перенаправления (для балансироки больше IP адресов): В конец файла добавляем пока только для перенаправления (для балансироки больше IP адресов):
```conf ```conf
frontend frontend-http frontend frontend-http
bind *:80 bind *:80
mode http mode http
# ACL для определения запросов на проверку Let's Encrypt # ACL для определения запросов на проверку Let's Encrypt
acl is_certbot path_beg /.well-known/acme-challenge/ acl is_certbot path_beg /.well-known/acme-challenge/
# Если это не запрос Let's Encrypt, перенаправляем на HTTPS # Если это не запрос Let's Encrypt, перенаправляем на HTTPS
http-request redirect scheme https code 301 unless is_certbot http-request redirect scheme https code 301 unless is_certbot
# Отправляем запросы Let's Encrypt на backend-certbot # Отправляем запросы Let's Encrypt на backend-certbot
use_backend backend-certbot if is_certbot use_backend backend-certbot if is_certbot
frontend LOADBALANCER-01 frontend LOADBALANCER-01
bind *:80 bind *:80
bind *:443 ssl crt /etc/haproxy/ssl/mqtt.kz.pem crt /etc/ssl/certs/bigfoottrade_kz.pem bind *:443 ssl crt /etc/haproxy/ssl/mqtt.kz.pem crt /etc/ssl/certs/bigfoottrade_kz.pem
mode http #режим работы HAProxy, в http режиме происходит анализ Layer 7 трафика mode http #режим работы HAProxy, в http режиме происходит анализ Layer 7 трафика
option httpclose #Закрывает пассивные соединения option httpclose #Закрывает пассивные соединения
http-request set-header x-Forwarded-for %[src] http-request set-header x-Forwarded-for %[src]
http-request set-header x-Forwarded-uri %[url] http-request set-header x-Forwarded-uri %[url]
acl v_geoserver2 hdr(host) -i geoserver2.ccalm.org acl v_geoserver2 hdr(host) -i geoserver2.ccalm.org
use_backend geoserver2_ccalm_org if v_geoserver2 use_backend geoserver2_ccalm_org if v_geoserver2
#Если различные нестандартные порты то так #Если различные нестандартные порты то так
acl v_locust_kz hdr_reg(host) -i ^locust\.kz(:.*)?$ acl v_locust_kz hdr_reg(host) -i ^locust\.kz(:.*)?$
use_backend b_locust_kz if v_locust_kz use_backend b_locust_kz if v_locust_kz
#Перенаправление одной страницы по адресу http://geoserver2.ccalm.org/data/ на другой backend #Перенаправление одной страницы по адресу http://geoserver2.ccalm.org/data/ на другой backend
acl v_geo_data hdr(host) -i geoserver2.ccalm.org/data acl v_geo_data hdr(host) -i geoserver2.ccalm.org/data
use_backend WEBSERVERS-01 if v_geo_data use_backend WEBSERVERS-01 if v_geo_data
default_backend WEBSERVER default_backend WEBSERVER
backend WEBSERVER backend WEBSERVER
balance roundrobin balance roundrobin
server web1 127.0.0.1:8080 check inter 5s ssl verify none server web1 127.0.0.1:8080 check inter 5s ssl verify none
option httpchk GET /index.html option httpchk GET /index.html
backend geoserver2_ccalm_org backend geoserver2_ccalm_org
balance roundrobin balance roundrobin
server web1 192.168.0.90:80 check server web1 192.168.0.90:80 check
option httpchk option httpchk
listen stats listen stats
bind *:8989 bind *:8989
stats enable stats enable
stats uri / stats uri /
stats realm Haproxy\ Statistics stats realm Haproxy\ Statistics
stats auth igor:i123456 stats auth igor:i123456
frontend f-RabbitMQ frontend f-RabbitMQ
mode tcp mode tcp
bind 10.1.7.73:21000 bind 10.1.7.73:21000
default_backend b-RabbitMQ default_backend b-RabbitMQ
backend b-RabbitMQ backend b-RabbitMQ
mode tcp mode tcp
server srv1 10.10.16.21:20000 server srv1 10.10.16.21:20000
``` ```
Для перенаправления незащищённого HTTP трафика можно: xxxxxxxxxxxxxxx Для перенаправления незащищённого HTTP трафика можно: xxxxxxxxxxxxxxx
Для использования SSL и перенаправляние по обычному сокету для начала нужно настроить pem файл объеденив crt и key (и незабыть изменить порт Apache с 433) Для использования SSL и перенаправляние по обычному сокету для начала нужно настроить pem файл объеденив crt и key (и незабыть изменить порт Apache с 433)
cat /etc/ssl/certs/bigfoottrade_kz.crt /etc/ssl/certs/bigfoottrade_kz_ca.crt /etc/ssl/private/bigfoottrade_kz.key > /etc/haproxy/ssl/bigfoottrade_kz.pem cat /etc/ssl/certs/bigfoottrade_kz.crt /etc/ssl/certs/bigfoottrade_kz_ca.crt /etc/ssl/private/bigfoottrade_kz.key > /etc/haproxy/ssl/bigfoottrade_kz.pem
cat AAA_Certificate_Services.crt GoGetSSL_RSA_DV_CA.crt istransit_kz.crt istransit_kz.key > istransit_kz.pem cat AAA_Certificate_Services.crt GoGetSSL_RSA_DV_CA.crt istransit_kz.crt istransit_kz.key > istransit_kz.pem
SSLCertificateFile SSLCertificateFile
SSLCertificateKeyFile SSLCertificateKeyFile
Для включения WEB статистики на 9000 порту добавить в конец конфигурации: Для включения WEB статистики на 9000 порту добавить в конец конфигурации:
listen stats listen stats
bind *:8989 bind *:8989
stats enable stats enable
stats uri /stats stats uri /stats
stats realm Haproxy\ Statistics stats realm Haproxy\ Statistics
stats auth igor:i123456 stats auth igor:i123456
Тестирую файл конфигурации: Тестирую файл конфигурации:
```sh ```sh
haproxy -f /etc/haproxy/haproxy.cfg -c haproxy -f /etc/haproxy/haproxy.cfg -c
```` ````
Также можно в журнале посмотреть что написал HAProxy: Также можно в журнале посмотреть что написал HAProxy:
```sh ```sh
sudo journalctl -u haproxy --no-pager | tail -n 50 sudo journalctl -u haproxy --no-pager -n 50 -f
```` ````
Перезагружаем: Перезагружаем:
```sh ```sh
sudo systemctl restart haproxy sudo systemctl restart haproxy
```` ````
Посмотреть что в журнале можно так: Посмотреть что в журнале можно так:
Посмотреть что в журнале можно так: Посмотреть что в журнале можно так:
```sh ```sh
journalctl -u haproxy --since "1 minutes ago" journalctl -u haproxy --since "1 minutes ago"
journalctl -u haproxy --since "30 minutes ago" | grep "backend" journalctl -u haproxy --since "30 minutes ago" | grep "backend"
tail -f /var/log/haproxy.log tail -f /var/log/haproxy.log
``` ```
administrator@app:~$ journalctl -u haproxy --since "30 minutes ago" | grep "backend" administrator@app:~$ journalctl -u haproxy --since "30 minutes ago" | grep "backend"
backend 'transit_acquiring_v01_kz' has no server available! backend 'transit_acquiring_v01_kz' has no server available!
backend 'transit_translation_v02_kz' has no server available! backend 'transit_translation_v02_kz' has no server available!
backend 'transit_mobile_kz' has no server available! backend 'transit_mobile_kz' has no server available!
backend 'transit_manager_kz' has no server available! backend 'transit_manager_kz' has no server available!
backend 'transit_warehouse_kz' has no server available! backend 'transit_warehouse_kz' has no server available!
backend 'transit_kgd_kz' has no server available! backend 'transit_kgd_kz' has no server available!
backend 'transit_monitoring_kz' has no server available! backend 'transit_monitoring_kz' has no server available!
И теперь должно открываться но адресу: http://data.ccalm.org:8989/ И теперь должно открываться но адресу: http://data.ccalm.org:8989/
Обязательно проверить как установился SSL чекером: https://www.leaderssl.ru/tools/ssl_checker Обязательно проверить как установился SSL чекером: https://www.leaderssl.ru/tools/ssl_checker
# 📌 Бесплатный SSL сертификат Lets Encrypt для HAPROXY # 📌 Бесплатный SSL сертификат Lets Encrypt для HAPROXY
**************************************************************************************************** ****************************************************************************************************
Бесплатный SSL сертификат Lets Encrypt для HAPROXY https://serversforhackers.com/c/letsencrypt-with-haproxy Бесплатный SSL сертификат Lets Encrypt для HAPROXY https://serversforhackers.com/c/letsencrypt-with-haproxy
```sh ```sh
sudo apt-get update sudo apt-get update
sudo apt-get install certbot -y sudo apt-get install certbot -y
```` ````
Для удаления PPA нужно выполнить: Для удаления PPA нужно выполнить:
```sh ```sh
sudo apt-get remove certbot sudo apt-get remove certbot
sudo add-apt-repository --remove ppa:certbot/certbot sudo add-apt-repository --remove ppa:certbot/certbot
apt-get install -f apt-get install -f
apt autoremove apt autoremove
``` ```
Если включён файрволл то разрешаем порт: Если включён файрволл то разрешаем порт:
```sh ```sh
sudo ufw allow 9080/tcp sudo ufw allow 9080/tcp
``` ```
Проверяем что автообновление в certbot работает для этого выполняем команду: Проверяем что автообновление в certbot работает для этого выполняем команду:
```sh ```sh
sudo systemctl status certbot.timer sudo systemctl status certbot.timer
``` ```
Затем пытаемся выполнить пробный прогон при помощи команды: Затем пытаемся выполнить пробный прогон при помощи команды:
```sh ```sh
sudo certbot renew --dry-run sudo certbot renew --dry-run
``` ```
Согласно инструкции модифицируем конфигурационный файл haproxy добавив во frontend это: Согласно инструкции модифицируем конфигурационный файл haproxy добавив во frontend это:
``` ```
# ACL for detecting Let's Encrypt validtion requests # ACL for detecting Let's Encrypt validtion requests
acl is_certbot path_beg /.well-known/acme-challenge/ acl is_certbot path_beg /.well-known/acme-challenge/
use_backend backend-certbot if is_certbot use_backend backend-certbot if is_certbot
``` ```
А также ещё один backend: А также ещё один backend:
``` ```
# Certbot backend # Certbot backend
# Contains certbot stand-alone webserver # Contains certbot stand-alone webserver
backend backend-certbot backend backend-certbot
mode http mode http
server certbot 127.0.0.1:9080 server certbot 127.0.0.1:9080
``` ```
Перезагрузить и выполнить команду: Перезагрузить и выполнить команду:
```sh ```sh
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d powerdns.geovizor.top --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d powerdns.geovizor.top --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d geovizor.top --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d geovizor.top --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d locust.kz --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d locust.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d gotify.locust.kz --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d gotify.locust.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d git.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d git.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d ru.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d ru.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d rug.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d rug.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d kz.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d kz.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d kzg.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d kzg.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d locust.kz --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d locust.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d test.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d test.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d data.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d data.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d geoserver2.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d geoserver2.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d geoserver.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d geoserver.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d stations.istt.kz --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d stations.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d uspdmanager.istt.kz --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d uspdmanager.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d tourist.istt.kz --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d tourist.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d project.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d monitoring.infracos.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d monitoring.infracos.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d aistransit.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d istransit.kz --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d aistransit.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d test.istransit.kz --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d istransit.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d main.istransit.kz --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d test.istransit.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d main.istransit.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d transit.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d transit.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d geovizor.com --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d mqtt.kz --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d geovizor.com --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d observer.kz --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d mqtt.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d rigor.kz --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d observer.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d pal.kz --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d rigor.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d elektronnaya-ochered.kz --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d pal.kz --email irigm@mail.ru --agree-tos --non-interactive
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d mcp.kz --email irigm@mail.ru --agree-tos --non-interactive certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d elektronnaya-ochered.kz --email irigm@mail.ru --agree-tos --non-interactive
``` certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d mcp.kz --email irigm@mail.ru --agree-tos --non-interactive
```
После генерации файлы будут в:
/etc/letsencrypt/live/geoserver2.ccalm.org/fullchain.pem После генерации файлы будут в:
/etc/letsencrypt/live/geoserver2.ccalm.org/privkey.pem /etc/letsencrypt/live/geoserver2.ccalm.org/fullchain.pem
/etc/letsencrypt/live/geoserver2.ccalm.org/privkey.pem
Для обновления создаём файл /etc/letsencrypt/renew.sh (по моему этот скрипт не нужен так как рабтает сервис certbot.timer):
#!/bin/bash Для обновления создаём файл /etc/letsencrypt/renew.sh (по моему этот скрипт не нужен так как рабтает сервис certbot.timer):
certbot renew --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 --post-hook "/etc/haproxy/prepare.sh" --quiet #!/bin/bash
certbot renew --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 --post-hook "/etc/haproxy/prepare.sh" --quiet
Но для HAProxy нужно чтобы 2 файла были объединены поэтому добавляю спец скрипт /etc/haproxy/prepare.sh:
#!/bin/bash Но для HAProxy нужно чтобы 2 файла были объединены поэтому добавляю спец скрипт /etc/haproxy/prepare.sh:
#!/bin/bash
# Loop through all Let's Encrypt certificates
for CERTIFICATE in `find /etc/letsencrypt/live/* -type d`; do # Loop through all Let's Encrypt certificates
for CERTIFICATE in `find /etc/letsencrypt/live/* -type d`; do
CERTIFICATE=`basename $CERTIFICATE`
CERTIFICATE=`basename $CERTIFICATE`
# Combine certificate and private key to single file
cat /etc/letsencrypt/live/$CERTIFICATE/fullchain.pem /etc/letsencrypt/live/$CERTIFICATE/privkey.pem > /etc/haproxy/ssl/$CERTIFICATE.pem # Combine certificate and private key to single file
cat /etc/letsencrypt/live/$CERTIFICATE/fullchain.pem /etc/letsencrypt/live/$CERTIFICATE/privkey.pem > /etc/haproxy/ssl/$CERTIFICATE.pem
done
systemctl reload haproxy.service done
systemctl reload haproxy.service
Обновляем конфигурацию HAProxy добавив в frontend:
bind *:443 ssl crt /etc/haproxy/ssl/mqtt.kz.pem Обновляем конфигурацию HAProxy добавив в frontend:
bind *:443 ssl crt /etc/haproxy/ssl/mqtt.kz.pem
Устанавливаем права
chmod +x /etc/haproxy/renew.sh Устанавливаем права
chmod +x /etc/haproxy/prepare.sh chmod +x /etc/haproxy/renew.sh
И добавляем задание в cron "crontab -e" ниже текст это раз в 24 часа в 00:00:00 ночи: chmod +x /etc/haproxy/prepare.sh
0 0 * * * /bin/sh /etc/letsencrypt/renew.sh И добавляем задание в cron "crontab -e" ниже текст это раз в 24 часа в 00:00:00 ночи:
0 0 * * * /bin/sh /etc/letsencrypt/renew.sh

View File

@ -1,8 +1,10 @@
С внешки во внутрянную инфраструктуру подключаемся через HAProxy а уже внутри использую Traefik
Открываю нужный сервер Открываю нужный сервер
```sh ```sh
wsl wsl
``` ```
Или такой: Открывает traefik на 192.168.200.85:
```sh ```sh
ssh igor@192.168.200.85 -p 22 ssh igor@192.168.200.85 -p 22
``` ```
@ -22,7 +24,7 @@ sudo apt install wget
Проверь актуальную версию на: [Traefik Releases](https://github.com/traefik/traefik/releases) Проверь актуальную версию на: [Traefik Releases](https://github.com/traefik/traefik/releases)
Пример для версии `v3.0.0`: Пример для версии `v3.0.0`:
```bash ```sh
cd ~ && cd ~ &&
wget https://github.com/traefik/traefik/releases/download/v3.3.4/traefik_v3.3.4_linux_amd64.tar.gz wget https://github.com/traefik/traefik/releases/download/v3.3.4/traefik_v3.3.4_linux_amd64.tar.gz
``` ```
@ -30,14 +32,14 @@ wget https://github.com/traefik/traefik/releases/download/v3.3.4/traefik_v3.3.4_
--- ---
## 📥 Шаг 3. Распаковка и установка ## 📥 Шаг 3. Распаковка и установка
```bash ```sh
cd ~ && cd ~ &&
tar -xvzf traefik_v3.3.4_linux_amd64.tar.gz && tar -xvzf traefik_v3.3.4_linux_amd64.tar.gz &&
sudo mv traefik /usr/local/bin/ sudo mv traefik /usr/local/bin/
``` ```
Проверь версию: Проверь версию:
```bash ```sh
traefik version traefik version
``` ```
@ -65,7 +67,7 @@ entryPoints:
websecure: websecure:
address: ":443" address: ":443"
traefik: traefik:
address: ":8080" address: ":8989"
api: api:
dashboard: true dashboard: true
@ -74,12 +76,13 @@ api:
providers: providers:
file: file:
filename: "/etc/traefik/dynamic.yml" filename: "/etc/traefik/dynamic.yml"
watch: true
# Настройка сертификатов (пример с Let's Encrypt) # Настройка сертификатов (пример с Let's Encrypt)
certificatesResolvers: certificatesResolvers:
myresolver: myresolver:
acme: acme:
email: "your-email@example.com" email: "irigm@mail.ru"
storage: "/etc/traefik/acme.json" storage: "/etc/traefik/acme.json"
httpChallenge: httpChallenge:
entryPoint: web entryPoint: web
@ -102,56 +105,70 @@ http:
service: api@internal service: api@internal
ccalm-api-auth: ccalm-api-auth:
rule: "Host(`ccalm.test`) && PathPrefix(`/api/authorization/v02/`)"
service: org_ccalm_api_authorization_v02
entryPoints: entryPoints:
- websecure - websecure
rule: "(Host(`ccalm.test`) || Host(`almaty.ccalm.test`)) && PathPrefix(`/api/authorization/v02/`)"
service: org_ccalm_api_authorization_v02
tls: tls:
certresolver: myresolver certresolver: myresolver
middlewares: middlewares:
- strip-auth-prefix - strip-auth-prefix
ccalm-dbms: ccalm-dbms:
rule: "Host(`ccalm.test`) && PathPrefix(`/api/dbms/v09/`)"
service: org_ccalm_dbms_v09
entryPoints: entryPoints:
- websecure - websecure
rule: "(Host(`ccalm.test`) || Host(`almaty.ccalm.test`)) && PathPrefix(`/api/dbms/v09/`)"
service: org_ccalm_dbms_v09
tls: tls:
certresolver: myresolver certresolver: myresolver
middlewares: middlewares:
- strip-dbms-prefix - strip-dbms-prefix
ccalm-translation: ccalm-translation:
rule: "Host(`ccalm.test`) && PathPrefix(`/api/translation/v01/`)"
service: org_ccalm_translation_v01
entryPoints: entryPoints:
- websecure - websecure
rule: "(Host(`ccalm.test`) || Host(`almaty.ccalm.test`)) && PathPrefix(`/api/translation/v01/`)"
service: org_ccalm_translation_v01
tls: tls:
certresolver: myresolver certresolver: myresolver
middlewares: #middlewares:
- strip-translation-prefix # - strip-translation-prefix
ccalm-login: ccalm-login:
rule: "Host(`ccalm.test`) && PathPrefix(`/login/`)"
service: org_ccalm_login_v01
entryPoints: entryPoints:
- websecure - websecure
rule: "(Host(`ccalm.test`) || Host(`almaty.ccalm.test`)) && PathPrefix(`/login/`)"
service: org_ccalm_login_v01
tls: tls:
certresolver: myresolver certresolver: myresolver
ccalm-default: ccalm-default:
rule: "Host(`ccalm.test`)"
service: org_ccalm
entryPoints: entryPoints:
- websecure - websecure
rule: "(Host(`ccalm.test`) || Host(`almaty.ccalm.test`))"
service: org_ccalm
tls: tls:
certresolver: myresolver certresolver: myresolver
powerdns: powerdns:
rule: "Host(`powerdns.local`)"
service: local_powerdns
entryPoints: entryPoints:
- websecure - websecure
rule: "Host(`powerdns.local`)"
service: local_powerdns
tls: {}
gotify:
entryPoints:
- websecure
rule: "Host(`gotify.local`)"
service: local_gotify
tls: {}
vault:
entryPoints:
- websecure
rule: "Host(`vault.local`)"
service: local_vault
tls: {} tls: {}
middlewares: middlewares:
@ -163,7 +180,7 @@ http:
stripPrefix: stripPrefix:
prefixes: prefixes:
- "/api/dbms/v09" - "/api/dbms/v09"
strip-dbms-prefix: strip-translation-prefix:
stripPrefix: stripPrefix:
prefixes: prefixes:
- "/api/translation/v01" - "/api/translation/v01"
@ -179,6 +196,26 @@ http:
path: "/" path: "/"
interval: "5s" interval: "5s"
# Бэкенд для local_gotify
local_gotify:
loadBalancer:
servers:
- url: "https://192.168.200.84:8080"
serversTransport: insecureTransport
healthCheck:
path: "/"
interval: "5s"
# Бэкенд для local_vault
local_vault:
loadBalancer:
servers:
- url: "https://192.168.200.85:8200"
serversTransport: insecureTransport
healthCheck:
path: "/"
interval: "5s"
# Бэкенд для org_ccalm_api_authorization_v02 (HTTPS с отключенной проверкой SSL) # Бэкенд для org_ccalm_api_authorization_v02 (HTTPS с отключенной проверкой SSL)
org_ccalm_api_authorization_v02: org_ccalm_api_authorization_v02:
loadBalancer: loadBalancer:
@ -203,10 +240,12 @@ http:
org_ccalm_translation_v01: org_ccalm_translation_v01:
loadBalancer: loadBalancer:
servers: servers:
- url: "https://192.168.200.184:8085" #- url: "https://192.168.200.184:8085"
- url: "https://ccalm.org"
passHostHeader: false
serversTransport: insecureTransport serversTransport: insecureTransport
healthCheck: healthCheck:
path: "/" path: ""
interval: "5s" interval: "5s"
# Бэкенд для org_ccalm_login_v01 (HTTP, без SSL) # Бэкенд для org_ccalm_login_v01 (HTTP, без SSL)
@ -240,6 +279,10 @@ tls:
keyFile: "/etc/traefik/certs/ccalm.test.key" keyFile: "/etc/traefik/certs/ccalm.test.key"
- certFile: "/etc/traefik/certs/powerdns.local.crt" - certFile: "/etc/traefik/certs/powerdns.local.crt"
keyFile: "/etc/traefik/certs/powerdns.local.key" keyFile: "/etc/traefik/certs/powerdns.local.key"
- certFile: "/etc/traefik/certs/gotify.local.crt"
keyFile: "/etc/traefik/certs/gotify.local.key"
- certFile: "/etc/traefik/certs/vault.local.crt"
keyFile: "/etc/traefik/certs/vault.local.key"
- certFile: "/etc/traefik/certs/wildcard.local.crt" - certFile: "/etc/traefik/certs/wildcard.local.crt"
keyFile: "/etc/traefik/certs/wildcard.local.key" keyFile: "/etc/traefik/certs/wildcard.local.key"
- certFile: "/etc/traefik/certs/wildcard.test.crt" - certFile: "/etc/traefik/certs/wildcard.test.crt"
@ -293,7 +336,7 @@ EOF
## 🔎 Шаг 6. Проверка работы ## 🔎 Шаг 6. Проверка работы
Откройте в браузере: Откройте в браузере:
```sh ```sh
open http://localhost:8080/dashboard/ open http://192.168.200.85:8080/dashboard/
``` ```
> ⚠️ Доступ к дашборду открыт только с localhost. Для удалённого доступа настройте правила. > ⚠️ Доступ к дашборду открыт только с localhost. Для удалённого доступа настройте правила.

View File

@ -1,7 +1,7 @@
# Устанавливаю Traefik на туречский сервер # Устанавливаю Traefik cервер в Астане
```sh ```sh
ssh igor@156.244.31.209 -p 2200 ssh ubuntu@194.32.140.11 -p 22
``` ```
# Установка Traefik на Linux Mint / Ubuntu # Установка Traefik на Linux Mint / Ubuntu
@ -24,6 +24,18 @@ cd ~ &&
wget https://github.com/traefik/traefik/releases/download/v3.3.4/traefik_v3.3.4_linux_amd64.tar.gz wget https://github.com/traefik/traefik/releases/download/v3.3.4/traefik_v3.3.4_linux_amd64.tar.gz
``` ```
## 📥 Создаём группу и пользователя под которым будет запускаться traefik
Создаём домашнюю директорию, группу и пользователя:
```sh
sudo mkdir -p /etc/traefik &&
cd /etc/traefik &&
sudo groupadd traefik &&
sudo useradd -s /bin/false -g traefik -d /etc/traefik traefik
```
--- ---
## 📥 Шаг 3. Распаковка и установка ## 📥 Шаг 3. Распаковка и установка
@ -38,6 +50,12 @@ wget https://github.com/traefik/traefik/releases/download/v3.3.4/traefik_v3.3.4_
traefik version traefik version
``` ```
Разрешаем занимать порты с номером меньше 1024
```sh
sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/traefik
```
```conf ```conf
Version: 3.3.4 Version: 3.3.4
Codename: saintnectaire Codename: saintnectaire
@ -48,12 +66,6 @@ OS/Arch: linux/amd64
--- ---
## 📁 Шаг 4. Создание директории и базового конфига
```sh
sudo mkdir -p /etc/traefik &&
cd /etc/traefik
```
### Пример `traefik.yml` ### Пример `traefik.yml`
```sh ```sh
cd /etc/traefik && cd /etc/traefik &&
@ -70,15 +82,11 @@ entryPoints:
websecure: websecure:
address: ":443" address: ":443"
traefik: traefik:
address: ":8080" address: ":8070"
api: api:
dashboard: true dashboard: true
insecure: true #insecure: true
providers:
file:
filename: "/etc/traefik/dynamic.yml"
# Настройка сертификатов (пример с Let's Encrypt) # Настройка сертификатов (пример с Let's Encrypt)
certificatesResolvers: certificatesResolvers:
@ -89,6 +97,11 @@ certificatesResolvers:
httpChallenge: httpChallenge:
entryPoint: web entryPoint: web
providers:
file:
filename: "/etc/traefik/dynamic.yml"
watch: true
log: log:
level: DEBUG level: DEBUG
EOF EOF
@ -98,61 +111,163 @@ EOF
```sh ```sh
cd /etc/traefik && cd /etc/traefik &&
sudo tee /etc/traefik/dynamic.yml > /dev/null <<'EOF' sudo tee /etc/traefik/dynamic.yml > /dev/null <<'EOF'
---
http: http:
routers: routers:
dashboard: dashboard:
entryPoints: entryPoints:
- traefik - traefik
rule: "Host(`localhost`)" rule: "Host(`194.32.140.11`)"
service: api@internal service: api@internal
middlewares:
- dashboard-auth
geovizor-api-zones: ccalm-api-auth:
rule: "Host(`geovizor.top`) && PathPrefix(`/api/v1/servers/localhost/zones/`)"
service: top_geovizor_api_zones_v01
entryPoints: entryPoints:
- websecure - websecure
rule: "(Host(`locust.ge`) || Host(`almaty.ccalm.org`) || Host(`ccalm.org`)) && PathPrefix(`/api/authorization/v02/`)"
service: org_ccalm_api_authorization_v02
tls:
certresolver: myresolver
middlewares:
- strip-auth-prefix
ccalm-dbms:
entryPoints:
- websecure
rule: "(Host(`locust.ge`) || Host(`almaty.ccalm.org`) || Host(`ccalm.org`)) && PathPrefix(`/api/dbms/v09/`)"
service: org_ccalm_dbms_v09
tls:
certresolver: myresolver
middlewares:
- strip-dbms-prefix
ccalm-translation:
entryPoints:
- websecure
rule: "(Host(`locust.ge`) || Host(`almaty.ccalm.org`) || Host(`ccalm.org`)) && PathPrefix(`/api/translation/v01/`)"
service: org_ccalm_translation_v01
tls:
certresolver: myresolver
middlewares:
- strip-translation-prefix
ccalm-login:
entryPoints:
- websecure
rule: "(Host(`locust.ge`) || Host(`almaty.ccalm.org`) || Host(`ccalm.org`)) && PathPrefix(`/login/`)"
service: org_ccalm_login_v01
tls: tls:
certresolver: myresolver certresolver: myresolver
geovizor-default: org-ccalm-main:
rule: "Host(`geovizor.top`)"
service: top_geovizor_default
entryPoints: entryPoints:
- websecure - websecure
rule: "Host(`locust.ge`) || Host(`almaty.ccalm.org`) || Host(`ccalm.org`)"
service: org_ccalm_main
tls: tls:
certresolver: myresolver certresolver: myresolver
acme-http:
rule: "PathPrefix(`/.well-known/acme-challenge/`)"
entryPoints:
- web
middlewares: []
service: noop
priority: 1000
services: services:
top_geovizor_api_zones_v01: # backend org_ccalm_api_authorization_v02
org_ccalm_api_authorization_v02:
loadBalancer: loadBalancer:
servers: servers:
- url: "http://156.244.31.209:8081" - url: "https://127.0.0.1:8082"
serversTransport: insecureTransport
healthCheck: healthCheck:
path: "/" path: "/"
interval: "5s" interval: "5s"
# Бэкенд по умолчанию top_geovizor # org_ccalm_dbms_v09 backend
top_geovizor_default: org_ccalm_dbms_v09:
loadBalancer: loadBalancer:
servers: servers:
- url: "http://127.0.0.1:8082" - url: "https://127.0.0.1:8084"
serversTransport: insecureTransport
healthCheck: healthCheck:
path: "/" path: "/"
interval: "5s" interval: "5s"
# Translation backend
org_ccalm_translation_v01:
loadBalancer:
servers:
- url: "https://127.0.0.1:8085"
passHostHeader: false
serversTransport: insecureTransport
healthCheck:
path: ""
interval: "5s"
# Backend for org_ccalm_login_v01 (HTTP, without SSL)
org_ccalm_login_v01:
loadBalancer:
servers:
- url: "https://127.0.0.1:8081"
healthCheck:
path: "/"
interval: "5s"
serversTransport: insecureTransport
# Default backend for ccalm.org
org_ccalm_main:
loadBalancer:
servers:
- url: "https://127.0.0.1:8083"
healthCheck:
path: "/"
interval: "5s"
serversTransport: insecureTransport
# Fake noop secvices
noop:
loadBalancer:
servers:
- url: "http://127.0.0.1"
# Определяем транспорт для отключения проверки SSL # Определяем транспорт для отключения проверки SSL
serversTransports: serversTransports:
insecureTransport: insecureTransport:
insecureSkipVerify: true insecureSkipVerify: true
# Добавляем сертификаты middlewares:
tls: strip-dbms-prefix:
certificates: stripPrefix:
prefixes:
- "/api/dbms/v09"
strip-auth-prefix:
stripPrefix:
prefixes:
- "/api/authorization/v02"
strip-translation-prefix:
stripPrefix:
prefixes:
- "/api/translation/v01"
dashboard-auth:
basicAuth:
users:
- "admin:$apr1$NUoqcU3I$O6VxeuGhsA6RSIyh6rNbo." # htpasswd -nb admin t745632746573t
EOF EOF
``` ```
For checking syntactic:
```sh
yamllint -d "{extends: default, rules: {line-length: disable}}" /etc/traefik/dynamic.yml
```
Для хранения сертификатов файл: Для хранения сертификатов файл:
```sh ```sh
sudo touch /etc/traefik/acme.json && sudo touch /etc/traefik/acme.json &&
@ -167,10 +282,12 @@ EOF
cd /etc/systemd/system && cd /etc/systemd/system &&
sudo tee /etc/systemd/system/traefik.service > /dev/null <<'EOF' sudo tee /etc/systemd/system/traefik.service > /dev/null <<'EOF'
[Unit] [Unit]
Description=Traefik Description=Reverse proxy Traefik
After=network.target After=network.target
[Service] [Service]
User=traefik
Group=traefik
ExecStart=/usr/local/bin/traefik --configFile=/etc/traefik/traefik.yml ExecStart=/usr/local/bin/traefik --configFile=/etc/traefik/traefik.yml
Restart=always Restart=always
@ -179,7 +296,6 @@ WantedBy=multi-user.target
EOF EOF
``` ```
Примените: Примените:
```sh ```sh
sudo systemctl daemon-reload && sudo systemctl daemon-reload &&
@ -193,14 +309,13 @@ EOF
``` ```
--- ---
ыгвщ куищще
## 🔎 Шаг 6. Проверка работы ## 🔎 Шаг 6. Проверка работы
Откройте в браузере: Откройте в браузере cпаролем что быше "":
```sh ```sh
open http://localhost:8080/dashboard/ open http://194.32.140.11:8070/dashboard
``` ```
> ⚠️ Доступ к дашборду открыт только с localhost. Для удалённого доступа настройте правила.
--- ---
@ -220,6 +335,9 @@ sudo journalctl -u traefik -f
## 🐳 Как вариант можно установить через Docker ## 🐳 Как вариант можно установить через Docker
@ -251,7 +369,7 @@ services:
ports: ports:
- "80:80" # HTTP - "80:80" # HTTP
- "443:443" # HTTPS - "443:443" # HTTPS
- "8080:8080" # Dashboard - "8070:8070" # Dashboard
volumes: volumes:
- /etc/traefik:/etc/traefik - /etc/traefik:/etc/traefik
- /var/run/docker.sock:/var/run/docker.sock:ro - /var/run/docker.sock:/var/run/docker.sock:ro
@ -277,7 +395,7 @@ EOF
Откройте в браузере: Откройте в браузере:
```sh ```sh
open http://192.168.200.85:8080/dashboard/ open http://192.168.200.85:8070/dashboard/
``` ```
```sh ```sh

201
Proxy/Traefik_plugin.md Normal file
View File

@ -0,0 +1,201 @@
Создание локального плагина для Traefik: Перенос куки jwt_a в заголовок Authorization: Bearer
Этот документ описывает, как создать и настроить локальный плагин для Traefik, который извлекает значение куки jwt_a и устанавливает его в заголовок Authorization: Bearer <token>, аналогично правилу HAProxy:
acl is_jwt_cookie hdr_sub(cookie) jwt_a=
http-request set-header Authorization "Bearer %[cook(jwt_a)]" if is_jwt_cookie
Плагин будет работать локально без публикации на GitHub.
📋 Требования
Go: Версия 1.21 или выше.
Traefik: Версия 3.3.4 (или совместимая).
Linux Mint/Ubuntu: ОС, на которой установлен Traefik.
Права доступа: Пользователь с правами на изменение конфигурации Traefik и запуск сервисов.
📥 Шаг 1: Подготовка окружения
Проверьте, установлен ли Go:
go version
Если Go не установлен, установите его:
sudo apt update
sudo apt install golang
Убедитесь, что Traefik установлен и работает. Проверьте версию:
traefik version
📂 Шаг 2: Создание плагина
Создайте директорию для плагина:
mkdir -p ~/traefik-jwt-cookie-plugin
cd ~/traefik-jwt-cookie-plugin
Инициализируйте Go-модуль:
go mod init traefik-jwt-cookie-plugin
Создайте файл plugin.go с кодом плагина:
package traefik_jwt_cookie_plugin
import (
"context"
"net/http"
)
// Config holds the plugin configuration.
type Config struct {
CookieName string `json:"cookieName"`
}
// CreateConfig creates and initializes the plugin configuration.
func CreateConfig() *Config {
return &Config{
CookieName: "jwt_a", // Имя куки по умолчанию
}
}
// JWTCookiePlugin is the plugin structure.
type JWTCookiePlugin struct {
next http.Handler
name string
cookieName string
}
// New creates a new instance of the plugin.
func New(_ context.Context, next http.Handler, config *Config, name string) (http.Handler, error) {
return &JWTCookiePlugin{
next: next,
name: name,
cookieName: config.CookieName,
}, nil
}
func (p *JWTCookiePlugin) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
// Извлекаем куки
cookie, err := req.Cookie(p.cookieName)
if err == nil && cookie != nil && cookie.Value != "" {
// Устанавливаем заголовок Authorization
req.Header.Set("Authorization", "Bearer "+cookie.Value)
}
// Передаем запрос дальше
p.next.ServeHTTP(rw, req)
}
Создайте файл go.mod (создается автоматически при инициализации модуля):
module traefik-jwt-cookie-plugin
go 1.21
Создайте файл plugin.yaml:
moduleName: traefik-jwt-cookie-plugin
displayName: JWT Cookie to Authorization Header
summary: Middleware to extract a cookie and set it as Authorization Bearer header
⚙️ Шаг 3: Настройка Traefik для локального плагина
Отредактируйте файл конфигурации Traefik (/etc/traefik/traefik.yml):
experimental:
localPlugins:
jwtCookiePlugin:
moduleName: traefik-jwt-cookie-plugin
sourcePath: /home/igor/traefik-jwt-cookie-plugin # Замените на ваш путь
http:
routers:
my-router:
rule: "Host(`example.com`)" # Замените на ваш домен
service: my-service
middlewares:
- jwt-cookie-middleware
entryPoints:
- web
middlewares:
jwt-cookie-middleware:
plugin:
jwtCookiePlugin:
cookieName: "jwt_a"
services:
my-service:
loadBalancer:
servers:
- url: "http://backend:8080" # Ваш бэкенд-сервис
Убедитесь, что путь /home/igor/traefik-jwt-cookie-plugin соответствует вашей директории. Проверьте путь:
echo $HOME
🔒 Шаг 4: Настройка прав доступа
Убедитесь, что Traefik имеет доступ к директории плагина:
sudo chown -R igor:igor ~/traefik-jwt-cookie-plugin
sudo chmod -R 755 ~/traefik-jwt-cookie-plugin
Если Traefik работает от другого пользователя (например, traefik), выполните:
sudo chown -R traefik:traefik ~/traefik-jwt-cookie-plugin
🚀 Шаг 5: Запуск Traefik
Перезапустите Traefik:sudo systemctl restart traefik
Если Traefik запущен вручную:traefik --configFile=/etc/traefik/traefik.yml
🧪 Шаг 6: Тестирование
Включите дебаг-логи в traefik.yml:log:
level: DEBUG
Отправьте тестовый запрос с куки jwt_a:curl -H "Host: example.com" -b "jwt_a=your_jwt_token_here" http://192.168.200.85
Проверьте логи Traefik:sudo journalctl -u traefik
Ищите записи, связанные с jwtCookiePlugin, чтобы подтвердить, что куки обрабатываются.
🌐 Шаг 7: Интеграция с HAProxy
Поскольку вы используете HAProxy перед Traefik, убедитесь, что HAProxy передает куки без изменений. Если вы хотите перенести логику обработки куки из HAProxy в Traefik, удалите следующее правило из HAProxy:
acl is_jwt_cookie hdr_sub(cookie) jwt_a=
http-request set-header Authorization "Bearer %[cook(jwt_a)]" if is_jwt_cookie
Обновленная конфигурация HAProxy:
frontend fe_main
bind *:80
mode http
default_backend be_traefik
backend be_traefik
mode http
server traefik 192.168.200.85:80
⚠️ Возможные проблемы
Ошибка загрузки плагина: Проверьте логи Traefik (journalctl -u traefik) и убедитесь, что sourcePath указан правильно.
Куки не извлекаются: Убедитесь, что куки jwt_a передаются в запросе (проверьте через curl или браузер).
Go-ошибки: Выполните go mod tidy для установки зависимостей.
✅ Преимущества
Работает локально без публикации на GitHub.
Заменяет функциональность HAProxy без внешнего сервиса.
Полная интеграция с Traefik.
❗ Недостатки
Требует базовых навыков Go.
Экспериментальная поддержка плагинов в Traefik может быть нестабильной.
🔄 Альтернатива
Если плагин не работает, оставьте обработку куки в HAProxy, а Traefik используйте только для маршрутизации. Это минимизирует изменения в вашей инфраструктуре.

View File

@ -0,0 +1,209 @@
Congif to first level proxy
Connecting to infrascructure
```sh
ssh igor@192.168.200.81
```
```sh
sudo apt update &&
sudo apt install wget
```
```sh
cd /etc/traefik &&
sudo tee /etc/traefik/traefik.yml > /dev/null <<'EOF'
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
http8080:
address: ":8080"
https8443:
address: ":8443"
traefik:
address: ":8989"
api:
dashboard: true
insecure: true
log:
level: DEBUG
filePath: "/var/log/traefik/traefik.log"
accessLog:
filePath: "/var/log/traefik/access.log"
providers:
file:
filename: "/etc/traefik/dynamic.yml"
watch: true
EOF
```
```sh
cd /etc/traefik &&
sudo tee /etc/traefik/dynamic.yml > /dev/null <<'EOF'
---
http:
routers:
dashboard:
rule: "Host(`192.168.200.81`) && Host(`localhost`)" # или другой домен
entryPoints:
- traefik
service: api@internal
middlewares:
- auth
redirect-to-https:
entryPoints:
- web
rule: "HostRegexp(`{any:.+}`)"
service: noop
middlewares:
- redirect-to-https-middleware
gotify:
entryPoints:
- websecure
- https8443
rule: "Host(`gotify.geovizor.top`)"
service: gotify
tls: true
webdav:
entryPoints:
- websecure
- https8443
rule: "Host(`webdav.geovizor.top`)"
service: webdav
tls: true
ccalm-auth:
entryPoints:
- websecure
rule: "Host(`ccalm.test`) && PathPrefix(`/api/authorization/v02`)"
service: ccalm-auth
middlewares:
- strip-api-authorization
tls: true
ccalm-dbms:
entryPoints:
- websecure
rule: "Host(`ccalm.test`) && PathPrefix(`/api/dbms/v09`)"
service: ccalm-dbms
middlewares:
- strip-api-dbms
tls: true
ccalm-login:
entryPoints:
- websecure
rule: "Host(`ccalm.test`) && PathPrefix(`/login`)"
service: ccalm-login
tls: true
ccalm-default:
entryPoints:
- websecure
rule: "Host(`ccalm.test`)"
service: ccalm-default
tls: true
certbot:
entryPoints:
- websecure
rule: "PathPrefix(`/.well-known/acme-challenge/`)"
service: certbot
tls: true
middlewares:
auth:
basicAuth:
users:
- "admin:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/" # admin/admin
redirect-to-https-middleware:
redirectScheme:
scheme: https
permanent: true
strip-api-authorization:
replacePathRegex:
regex: ^/api/authorization/v02/(.*)
replacement: /$1
strip-api-dbms:
replacePathRegex:
regex: ^/api/dbms/v09/(.*)
replacement: /$1
services:
gotify:
loadBalancer:
servers:
- url: "https://192.168.200.84:8080"
passHostHeader: true
healthCheck:
path: "/"
interval: "5s"
serversTransport: insecureTransport
webdav:
loadBalancer:
servers:
- url: "http://127.0.0.1:8085"
ccalm-auth:
loadBalancer:
servers:
- url: "https://192.168.200.184:8082"
ccalm-dbms:
loadBalancer:
servers:
- url: "https://192.168.200.184:8084"
ccalm-login:
loadBalancer:
servers:
- url: "http://192.168.200.184:3000"
ccalm-default:
loadBalancer:
servers:
- url: "https://192.168.200.184:8083"
certbot:
loadBalancer:
servers:
- url: "http://127.0.0.1:9080"
noop:
loadBalancer:
servers:
- url: "http://0.0.0.0" # placeholder
# Определяем транспорт для отключения проверки SSL
serversTransports:
insecureTransport:
insecureSkipVerify: true
EOF
```
```sh
sudo systemctl daemon-reload &&
sudo systemctl enable traefik &&
sudo systemctl start traefik &&
sudo systemctl status traefik
```

66
RClone/NFS_install.md Normal file
View File

@ -0,0 +1,66 @@
```sh
sudo apt update &&
sudo apt install nfs-kernel-server -y
```
```sh
sudo mkdir -p /mnt/data/org_ccalm_almaty &&
sudo chown nobody:nogroup /mnt/data/org_ccalm_almaty
```
Открой файл /etc/exports:
```sh
sudo mcedit /etc/exports
```
Добавь строку:
```config
/mnt/backups 192.168.200.0/24(rw,sync,no_subtree_check,no_root_squash)
```
Пояснение:
/mnt/backups — путь к расшариваемой папке
192.168.1.0/24 — подсеть, которой разрешён доступ
rw — чтение и запись
sync — синхронная запись (безопаснее)
no_subtree_check — оптимизация доступа
Применение изменений
```sh
sudo exportfs -ra
```
```sh
sudo systemctl restart nfs-kernel-server
```
(Необязательно) Разрешить доступ через firewall
```sh
sudo ufw allow from 192.168.200.0/24 to any port nfs
```
Проверка экспортируемых папок
```sh
sudo exportfs -v
```
## Подключение к NFS на клиенте (например, другая машина/VM)
```sh
sudo apt install nfs-common &&
sudo mount 192.168.200.80:/mnt/data/org_ccalm_almaty /mnt/nfs-backups
```
Чтобы монтировалось при загрузке, добавь строку в sudo mcedit /etc/fstab:
```sh
192.168.200.80:/mnt/data/org_ccalm_almaty /mnt/backups nfs defaults 0 0
```
On Windows run cmd not PowerShell:
```sh
mount -o anon \\192.168.200.80\mnt\data\org_ccalm_almaty Z:
```
Обновляем:
```sh
sudo mount -a
```

View File

@ -0,0 +1,69 @@
Connecting to infrasturture
```sh
sudo useradd -r -s /sbin/nologin -d /opt/backup -m rclone
```
```sh
ssh ubuntu@almaty.ccalm.org -p 22
```
```sh
sudo apt update &&
sudo apt install rclone
```
```sh
rclone version
```
Создаём настройку в ~/.config/rclone/rclone.conf
```sh
rclone config
```
При настройке для текущего пользователя задал такие параметры:
```conf
[mywebdav]
type = webdav
url = https://webdav.geovizor.top/
vendor = other
user = admin
pass = iV6-JPSK7UOcY8xYfvKs9MjZtVMR4pqdKKCoXXtCaw
```
Перемещаю все файлы с ранее созданным конфигом:
```sh
rclone move /opt/backups/data mywebdav:/backups --progress --no-check-certificate
```
Предварительно нужно настроить подключение а потом можно вызывать команду для копирования:
```sh
rclone move /путь/к/локальной/директории webdav:/путь/на/сервере
```
Копирую файлы с сервера:
```sh
rclone copy webdav:/ E:\webdav --no-check-certificate --progress
```
Инициация синхронизации со списком файлов
```sh
rclone bisync webdav:/ E:\webdav --no-check-certificate --resync --verbose --create-empty-src-dirs
```
Регулярная двусторонняя синхронизация
```sh
rclone bisync webdav:/ E:\webdav --no-check-certificate --modify-window 1s --progress --create-empty-src-dirs
```

136
RClone/WebDAV_install.md Normal file
View File

@ -0,0 +1,136 @@
https://github.com/hacdias/webdav
```sh
ssh igor@192.168.200.81 -p 22
```
```sh
sudo apt update &&
sudo apt install golang-go
```
```sh
git clone https://github.com/hacdias/webdav.git &&
cd webdav
```
```sh
go build -o webdav .
```
```sh
cd /opt/webdav &&
sudo tee config.yml > /dev/null <<'EOF'
address: "0.0.0.0"
port: 8085
directory: "."
permissions: "R"
debug: true
users:
- username: admin
password: "U8Z0a6YY7taZ965"
directory: "/mnt/backups"
permissions: "CRUD"
EOF
```
Пытаемся запустить
```sh
cd /opt/webdav &&
./webdav --config config.yml
```
Проверяем что работает:
```sh
open http://192.168.200.81:8085
```
Находим и убиваем процесс
```sh
ps aux | grep webdav
```
```sh
pkill -f 'webdav --config config.yml'
```
Создаю пользователя webdav
```sh
sudo useradd -r -s /sbin/nologin -d /opt/webdav -m webdav &&
sudo chown -R webdav:webdav /opt/webdav &&
sudo chmod -R 750 /opt/webdav
```
```sh
sudo nano /etc/systemd/system/webdav.service
```
```sh
cd /etc/systemd/system/ &&
sudo tee webdav.service > /dev/null <<'EOF'
[Unit]
Description=WebDAV Server
After=network.target
[Service]
WorkingDirectory=/opt/webdav
ExecStart=/opt/webdav/webdav --config config.yml
User=webdav
Group=webdav
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
```
```sh
sudo systemctl daemon-reexec &&
sudo systemctl enable webdav &&
sudo systemctl start webdav
```
```sh
sudo systemctl status webdav
```
```sh
sudo journalctl -u webdav -b
```
Теперь WebDAV доступен по адресу:
```sh
start https://yourdomain.com/webdav/
```
## Настройка HAProxy
Edit haproxy configuration file:
```sh
sudo mcedit /etc/haproxy/haproxy.cfg
```
frontend HTTPS:
```config
frontend https-in
bind *:443 ssl crt /etc/ssl/private/yourdomain.pem
acl is_webdav path_beg /webdav
use_backend webdav_backend if is_webdav
```
В backend:
```config
backend webdav_backend
server webdav1 127.0.0.1:8085
```
```sh
haproxy -f /etc/haproxy/haproxy.cfg -c
````
```sh
sudo systemctl restart haproxy
```
Для винды можно подключить диск при помощи:
```
open https://www.raidrive.com/
```

View File

@ -1,8 +0,0 @@
```sh
ssh administrator@10.101.1.37 -p 22
```
```sh
sudo rabbitmqctl change_password admin KGf4nxT8vxZWv3jqNasP
```

53
Redis_install.md Normal file
View File

@ -0,0 +1,53 @@
****************************************************************************************************
Подключаемся к инфраструктуре
```sh
ssh ubuntu@almaty.ccalm.org -p 22
```
****************************************************************************************************
Install Redis по мативам: https://timeweb.cloud/tutorials/redis/ustanovka-i-nastrojka-redis-dlya-raznyh-os
```sh
sudo apt-get update &&
sudo apt install redis -y &&
redis-cli --version
```
```sh
sudo systemctl restart redis
```
```sh
sudo systemctl status redis
```
Config:
```sh
sudo mcedit /etc/redis/redis.conf
```
И меняем в конфигурации на: supervised systemd
Также желательно проверить настройку чтобы слушался только IP: 127.0.0.1
```conf
bind 0.0.0.0
```
Также в поле SECURITY нужно установить пароль, сгенерированный при помощи:
```
openssl rand 25 | openssl base64 -A
```
Примерно такой должен быть получиться:
```
requirepass 9F3/NKWeOjd815vkadT2DcgVHf6fEpVQXw==
```
Перезагружаем:
```sh
sudo systemctl restart redis-server
```
Проверяем Redis:
```sh
redis-cli
```
Или так проверяем:
```sh
redis-cli -h 127.0.0.1 -p 6379 -a 9F3/NKWeOjd815vkadT2DcgVHf6fEpVQXw==
```
И пишем: ping
Проверяем какие порты прослушиваются на компе:
```sh
sudo netstat -lnp | grep redis
```

View File

@ -79,6 +79,28 @@ openssl x509 -in powerdns.local.crt -text -noout
``` ```
Создаём и подписываем одной группой команд:
```sh
openssl version &&
openssl genrsa -out gotify.local.key 2048 &&
openssl req -new -key gotify.local.key -out gotify.local.csr -subj "/CN=gotify.local" -addext "subjectAltName=DNS:gotify.local" &&
openssl x509 -req -in gotify.local.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out gotify.local.crt -days 365 -sha256 -copy_extensions copy &&
openssl x509 -in gotify.local.crt -text -noout &&
cat gotify.local.crt gotify.local.key > gotify.local.pem
```
Теперь можно устанавливать в HAProxy этот gotify.local.pem сертификат
Создаём и подписываем одной группой команд:
```sh
openssl version &&
openssl genrsa -out vault.local.key 2048 &&
openssl req -new -key vault.local.key -out vault.local.csr -subj "/CN=vault.local" -addext "subjectAltName=DNS:vault.local" &&
openssl x509 -req -in vault.local.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out vault.local.crt -days 365 -sha256 -copy_extensions copy &&
openssl x509 -in vault.local.crt -text -noout &&
cat vault.local.crt vault.local.key vault.local.csr > vault.local.pem
```
Подписать корневым CA: Подписать корневым CA:

View File

@ -1,361 +1,389 @@
# Установка HashiCorp Vault на Ubuntu # Установка HashiCorp Vault на Ubuntu
Vault — это инструмент от HashiCorp для безопасного хранения секретов и управления ими. Vault — это инструмент от HashiCorp для безопасного хранения секретов и управления ими.
## 1. Установка Vault ## 1. Установка Vault
Открываю нужный сервер Открываю нужный сервер
```sh ```sh
wsl wsl
``` ```
Похоже vault из Москвы недоступен: Connecting to infrastructure:
```sh ```sh
ssh root@45.144.64.218 -p 2200 ssh igor@192.168.200.85 -p 22
``` ```
### 1.1. Добавление репозитория HashiCorp ### 1.1. Добавление репозитория HashiCorp
1. Установите необходимые пакеты: 1. Установите необходимые пакеты:
```sh ```sh
sudo apt update && sudo apt install -y gnupg software-properties-common curl sudo apt update && sudo apt install -y gnupg software-properties-common curl
``` ```
2. Добавьте официальный GPG-ключ HashiCorp: 2. Добавьте официальный GPG-ключ HashiCorp:
```sh ```sh
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
``` ```
3. Добавьте репозиторий HashiCorp в систему: 3. Добавьте репозиторий HashiCorp в систему:
```sh ```sh
sudo mcedit /etc/apt/sources.list.d/hashicorp.list sudo mcedit /etc/apt/sources.list.d/hashicorp.list
``` ```
Заменяем на: Заменяем на:
```text ```text
deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com noble main deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com noble main
``` ```
Где noble это кодовое имя Ubuntu 24.04 Где noble это кодовое имя Ubuntu 24.04
4. Обновите списки пакетов: 4. Обновите списки пакетов:
```sh ```sh
sudo apt update sudo apt update
``` ```
5. Установите Vault: 5. Установите Vault:
```sh ```sh
sudo apt install -y vault sudo apt install -y vault
``` ```
6. Проверьте, что Vault установлен правильно: 6. Проверьте, что Vault установлен правильно:
```sh ```sh
vault --version vault --version
``` ```
Выдало: Vault v1.18.5 (2cb3755273dbd63f5b0f8ec50089b57ffd3fa330), built 2025-02-24T09:40:28Z Выдало: Vault v1.19.4 (322786e236e268532e4b189845971ba67b5cbb23), built 2025-05-14T13:04:47Z
## 2. Запуск Vault ## 2. Запуск Vault
### 2.1. Запуск в Dev-режиме (только для тестирования) ### 2.1. Запуск в Dev-режиме (только для тестирования)
If work stop it: If work stop it:
```sh ```sh
sudo pkill vault sudo pkill vault
``` ```
If need delete old data: If need delete old data:
```sh ```sh
sudo rm -rf ~/.vault-token ~/.vault/ sudo rm -rf ~/.vault-token ~/.vault/
``` ```
For find where stored data read file: For find where stored data read file:
```sh ```sh
sudo mcedit /etc/vault/config.hcl sudo mcedit /etc/vault/config.hcl
``` ```
In config file find this path: /opt/vault/data In config file find this path: /opt/vault/data
После удаления базы нужно инициализировать Vault заново: После удаления базы нужно инициализировать Vault заново:
```sh ```sh
sudo vault operator init sudo vault operator init
``` ```
Run in developer mode (in dev mode data stored in RAM): Run in developer mode (in dev mode data stored in RAM):
```sh ```sh
vault server -dev vault server -dev
``` ```
```text ```text
WARNING! dev mode is enabled! In this mode, Vault runs entirely in-memory WARNING! dev mode is enabled! In this mode, Vault runs entirely in-memory
and starts unsealed with a single unseal key. The root token is already and starts unsealed with a single unseal key. The root token is already
authenticated to the CLI, so you can immediately begin using Vault. authenticated to the CLI, so you can immediately begin using Vault.
You may need to set the following environment variables: You may need to set the following environment variables:
$ export VAULT_ADDR='http://127.0.0.1:8200' $ export VAULT_ADDR='http://127.0.0.1:8200'
The unseal key and root token are displayed below in case you want to The unseal key and root token are displayed below in case you want to
seal/unseal the Vault or re-authenticate. seal/unseal the Vault or re-authenticate.
Unseal Key: TMb6A3QI3wJ9kaEeTYo5wEviP23lugJ3Asek2la6V4s= Unseal Key: TMb6A3QI3wJ9kaEeTYo5wEviP23lugJ3Asek2la6V4s=
Root Token: hvs.GsWHRR7ne7gMTZhuPgZdh91w Root Token: hvs.GsWHRR7ne7gMTZhuPgZdh91w
Development mode should NOT be used in production installations! Development mode should NOT be used in production installations!
``` ```
Теперь Vault работает по адресу: Теперь Vault работает по адресу:
```sh ```sh
start http://127.0.0.1:8200 start http://127.0.0.1:8200
``` ```
Останавливаю нажатием Ctrl + C Останавливаю нажатием Ctrl + C
### 2.2. Настройка Vault в режиме сервера
### 2.2. Настройка Vault в режиме сервера
Creating sel signed sertificate:
1. Создайте конфигурационный файл: ```sh
```sh sudo openssl req -new -x509 -days 365 -nodes \
sudo mkdir -p /etc/vault && -out /etc/vault.d/vault.local.crt \
sudo mcedit /etc/vault/config.hcl -keyout /etc/vault.d/vault.local.key \
``` -subj "/CN=yourdomain.local"
```
2. Добавьте следующий конфиг:
```text Set file owner
storage "file" { ```sh
path = "/opt/vault/data" sudo chown -R vault:vault /etc/vault.d/
} ```
listener "tcp" { 1. Создайте конфигурационный файл, Добавьте следующий конфиг:
address = "127.0.0.1:8200" ```sh
tls_disable = 1 sudo mkdir -p /etc/vault &&
} cd /etc/vault &&
sudo tee config.hcl > /dev/null <<'EOF'
disable_mlock = true
ui = true storage "file" {
``` path = "/opt/vault/data"
}
3. Создайте папку для хранения данных:
```sh listener "tcp" {
sudo mkdir -p /opt/vault/data && address = "0.0.0.0:8200"
sudo chown vault:vault /opt/vault/data tls_cert_file = "/etc/vault.d/vault.local.crt"
``` tls_key_file = "/etc/vault.d/vault.local.key"
}
4. Создайте systemd-сервис для Vault:
```sh disable_mlock = true
sudo tee /etc/systemd/system/vault.service > /dev/null <<'EOF' ui = true
[Unit] EOF
Description=HashiCorp Vault ```
After=network-online.target
Requires=network-online.target 3. Создайте папку для хранения данных:
```sh
[Service] sudo mkdir -p /opt/vault/data &&
User=vault sudo chown vault:vault /opt/vault/data
Group=vault ```
ExecStart=/usr/bin/vault server -config=/etc/vault/config.hcl
ExecReload=/bin/kill --signal HUP \$MAINPID 4. Создайте systemd-сервис для Vault:
KillSignal=SIGTERM ```sh
Restart=on-failure sudo tee /etc/systemd/system/vault.service > /dev/null <<'EOF'
LimitMEMLOCK=infinity [Unit]
ProtectSystem=full Description=HashiCorp Vault
CapabilityBoundingSet=CAP_IPC_LOCK CAP_SETGID CAP_SETUID CAP_SYSLOG CAP_CHOWN After=network-online.target
NoNewPrivileges=yes Requires=network-online.target
[Install] [Service]
WantedBy=multi-user.target User=vault
EOF Group=vault
``` ExecStart=/usr/bin/vault server -config=/etc/vault/config.hcl
Проверяем всё ли записалось: ExecReload=/bin/kill --signal HUP \$MAINPID
```sh KillSignal=SIGTERM
sudo mcedit /etc/systemd/system/vault.service Restart=on-failure
``` LimitMEMLOCK=infinity
ProtectSystem=full
5. Перезапустите systemd и включите Vault: CapabilityBoundingSet=CAP_IPC_LOCK CAP_SETGID CAP_SETUID CAP_SYSLOG CAP_CHOWN
```sh NoNewPrivileges=yes
sudo systemctl daemon-reload &&
sudo systemctl enable vault && [Install]
sudo systemctl start vault WantedBy=multi-user.target
``` EOF
```
7. Проверьте статус: Проверяем всё ли записалось:
```sh ```sh
sudo systemctl status vault sudo mcedit /etc/systemd/system/vault.service
``` ```
--- 5. Перезапустите systemd и включите Vault:
```sh
## 3. Инициализация и разлочка Vault sudo systemctl daemon-reload &&
sudo systemctl enable vault &&
1. Экспортируйте переменную окружения: sudo systemctl start vault
```sh ```
export VAULT_ADDR='http://127.0.0.1:8200' ```sh
``` sudo systemctl restart vault
```
2. Инициализируйте хранилище (сохраните ключи!): 7. Проверьте статус:
```sh ```sh
vault operator init sudo systemctl status vault
``` ```
Выдало: ---
```text
Unseal Key 1: lQlJsb9RI8rSzLrc5iPnx1qJkWZbbXIkrEgnQGe5R6uO ## 3. Инициализация и разлочка Vault
Unseal Key 2: 0qJJXRo570jlH/0Qs/wodXHNI2SF5VgL4jE04JawSPSB
Unseal Key 3: VuYkOkQ8qmwofDmjqsTRQoMqGAH3Jv+nqQylL7Uibbtp 1. Экспортируйте переменную окружения:
Unseal Key 4: JJJ8Nqj00qzS9u5wNtTtExL/jWlJF9fgaBsiuaf0kFxC ```sh
Unseal Key 5: L6lZMp/l7s24EZJAFnWS4Py5jsWOuMioC41g5LhUJKWL export VAULT_ADDR='http://127.0.0.1:8200'
```
Initial Root Token: hvs.o07DY7tnSPcufxk60pjCXDzn
2. Инициализируйте хранилище (сохраните ключи!):
Vault initialized with 5 key shares and a key threshold of 3. Please securely ```sh
distribute the key shares printed above. When the Vault is re-sealed, vault operator init
restarted, or stopped, you must supply at least 3 of these keys to unseal it ```
before it can start servicing requests.
Выдало:
Vault does not store the generated root key. Without at least 3 keys to ```text
reconstruct the root key, Vault will remain permanently sealed! Unseal Key 1: lQlJsb9RI8rSzLrc5iPnx1qJkWZbbXIkrEgnQGe5R6uO
Unseal Key 2: 0qJJXRo570jlH/0Qs/wodXHNI2SF5VgL4jE04JawSPSB
It is possible to generate new unseal keys, provided you have a quorum of Unseal Key 3: VuYkOkQ8qmwofDmjqsTRQoMqGAH3Jv+nqQylL7Uibbtp
existing unseal keys shares. See "vault operator rekey" for more information. Unseal Key 4: JJJ8Nqj00qzS9u5wNtTtExL/jWlJF9fgaBsiuaf0kFxC
``` Unseal Key 5: L6lZMp/l7s24EZJAFnWS4Py5jsWOuMioC41g5LhUJKWL
3. Разблокируйте Vault, используя один из ключей (потом ещё 3 раза выполнить эту команду): Initial Root Token: hvs.o07DY7tnSPcufxk60pjCXDzn
```sh
vault operator unseal Vault initialized with 5 key shares and a key threshold of 3. Please securely
``` distribute the key shares printed above. When the Vault is re-sealed,
restarted, or stopped, you must supply at least 3 of these keys to unseal it
4. Авторизуйтесь с root-токеном: before it can start servicing requests.
```sh
vault login hvs.MTFV72PjKXCVh5ZL6yCVE3Yw Vault does not store the generated root key. Without at least 3 keys to
``` reconstruct the root key, Vault will remain permanently sealed!
5. Создаём(включаем) новое хранилище ключ-значение через ssh It is possible to generate new unseal keys, provided you have a quorum of
```sh existing unseal keys shares. See "vault operator rekey" for more information.
vault secrets enable -path=org-ccalm kv-v2 ```
```
3. Разблокируйте Vault, используя ключ (потом ещё 3 раза выполнить эту команду):
```sh
vault operator unseal
5. Writing to the kv storage (добавил префикс vault. чтобы значения самому подставлять в нужные места в spring) ```
Заменит(создаст) значение: 4. Авторизуйтесь с root-токеном:
```sh ```sh
vault kv put org-ccalm/jwt vault.server.ssl.key-store-password=MFNX344yh4 vault login hvs.MTFV72PjKXCVh5ZL6yCVE3Yw
``` ```
Добавит (обновит):
```sh 5. Создаём(включаем) новое хранилище ключ-значение через ssh
vault kv patch org-ccalm/jwt vault.test=test2 ```sh
``` export VAULT_TOKEN=hvs.FDMfGORUazCHm7jGrSofBVbx &&
```sh vault secrets enable -path=org-ccalm kv-v2
vault kv put org-ccalm/public vault.personal_data.key=7dd2Nek1 ```
```
6. Read data from the kv
```sh 5. Writing to the kv storage (добавил префикс vault. чтобы значения самому подставлять в нужные места в spring)
vault kv get org-ccalm/jwt
``` Заменит(создаст) значение:
```sh
Должно вывести: vault kv put org-ccalm/jwt vault.server.ssl.key-store-password=MFNX344yh4
```text ```
Key Value Добавит (обновит):
--- ----- ```sh
server.ssl.key-store-password M4yh4 vault kv patch org-ccalm/jwt vault.test=test2
``` ```
```sh
6. Включаем AppRole для доступа из приложения vault kv put org-ccalm/public vault.personal_data.key=7dd2Nek1
```sh ```
vault auth enable approle
``` 6. Read data from the kv
```sh
7. Добавляем политики потом создаём ключ для этой политикиполитики vault kv get org-ccalm/jwt
```
Создаю файл политик
```sh Должно вывести:
cd ~ && ```text
sudo tee jwt-policy.hcl > /dev/null <<'EOF' Key Value
path "org-ccalm/data/jwt" { --- -----
capabilities = ["create", "read", "update", "delete", "list"] server.ssl.key-store-password M4yh4
} ```
path "org-ccalm/data/public" {
capabilities = ["read", "list"] 6. Включаем AppRole для доступа из приложения
} ```sh
EOF vault auth enable approle
``` ```
Apply and delete configiration file:
```sh 7. Добавляем политики потом создаём ключ для этой политики
vault policy write jwt-policy ~/jwt-policy.hcl &&
rm -f jwt-policy.hcl Создаю файл политик
``` ```sh
cd ~ &&
Создаём AppRole (на 10 лет) sudo tee jwt-policy.hcl > /dev/null <<'EOF'
```sh path "org-ccalm/data/jwt" {
vault write auth/approle/role/org-ccalm-jwt \ capabilities = ["create", "read", "update", "delete", "list"]
secret_id_ttl=0 \ }
token_ttl=87600h \ path "org-ccalm/data/public" {
token_max_ttl=87600h \ capabilities = ["read", "list"]
policies="jwt-policy,another-policy,third-policy" }
``` EOF
```
Получаем role_id и secret_id Apply and delete configiration file:
```sh ```sh
vault read auth/approle/role/org-ccalm-jwt/role-id vault policy write jwt-policy ~/jwt-policy.hcl &&
``` rm -f jwt-policy.hcl
Выдало ```
```text
Key Value Создаём AppRole (на 10 лет)
--- ----- ```sh
role_id c0064fe2-8f0e-b317-7fe7-66f7405b45a1 vault write auth/approle/role/org-ccalm-jwt \
``` secret_id_ttl=0 \
На команду token_ttl=87600h \
```sh token_max_ttl=87600h \
vault write -f auth/approle/role/org-ccalm-jwt/secret-id policies="jwt-policy,another-policy,third-policy"
``` ```
Выдало:
```text Получаем role_id и secret_id
Key Value ```sh
--- ----- vault read auth/approle/role/org-ccalm-jwt/role-id
secret_id 24f31c88-7185-0d93-9a51-e221c2925265 ```
secret_id_accessor 22fa68e3-fc73-2008-0a34-3506630b6693 Выдало
secret_id_num_uses 0 ```text
secret_id_ttl 0s Key Value
``` --- -----
Сохрани role_id и secret_id, они понадобятся Spring Boot. role_id c0064fe2-8f0e-b317-7fe7-66f7405b45a1
```
Хранить ключи лучьше в переменных окружения На команду
```sh ```sh
export VAULT_ROLE_ID="your-role-id" && vault write -f auth/approle/role/org-ccalm-jwt/secret-id
export VAULT_SECRET_ID="your-secret-id" ```
``` Выдало:
```text
Key Value
Проверяем не больше какого значения можно задать время жизни кокена: --- -----
```sh secret_id 24f31c88-7185-0d93-9a51-e221c2925265
vault read sys/mounts/auth/token/tune secret_id_accessor 22fa68e3-fc73-2008-0a34-3506630b6693
``` secret_id_num_uses 0
По умолчанию max_lease_ttl равен 32 дня! secret_id_ttl 0s
```
На год можно увеличить так: Сохрани role_id и secret_id, они понадобятся Spring Boot.
```sh
vault write sys/mounts/auth/token/tune max_lease_ttl=8760h Хранить ключи лучьше в переменных окружения
``` ```sh
export VAULT_ROLE_ID="your-role-id" &&
Create data access token with set politics: export VAULT_SECRET_ID="your-secret-id"
```sh ```
vault token create -policy=jwt-policy -ttl=0
```
Проверяем не больше какого значения можно задать время жизни токена:
Продлевать токен можно так: ```sh
```sh vault read sys/mounts/auth/token/tune
vault token renew <твой-токен> ```
``` По умолчанию max_lease_ttl равен 32 дня!
Проверяем зранятся ли токены в хранилище а не в памяти На год можно увеличить так:
```sh ```sh
vault read sys/auth/token/tune vault write sys/mounts/auth/token/tune max_lease_ttl=8760h
``` ```
token_type = default-service, значит Vault не хранит токены
Create data access token with set politics:
Включаем хранение токенов: ```sh
```sh vault token create -policy=jwt-policy -ttl=0
vault write sys/auth/token/tune token_type=service ```
```
Продлевать токен можно так:
```sh
vault token renew <твой-токен>
--- ```
Теперь HashiCorp Vault установлен и готов к использованию! 🚀
Проверяем хранятся ли токены в хранилище а не в памяти
```sh
vault read sys/auth/token/tune
```
token_type = default-service, значит Vault не хранит токены
Включаем хранение токенов:
```sh
vault write sys/auth/token/tune token_type=service
```
---
Согласно уроку желательно корневой сертификат создавать на 10 лет допустим: https://www.youtube.com/watch?v=eSDpMUeV2lQ
Для полноценного использования pki нужно создать роль!
certstrap --depot-path root init \
--organization "GEOVizor" \
--organizational-unit "IT" \
--country "KZ" \
--province "ALM" \
--locality "Almaty" \
--common-name "DemoCA Root Certificate Authority v1" \
--expires "30 years" \
--curve P-256 \
--path-length 2 \
--passphrase "pace_icy_hum_ward"

View File

@ -1,136 +1,136 @@
Загрузить в HashiCorp Vault настройки можно так: Загрузить в HashiCorp Vault настройки можно так:
```sh ```sh
vault kv put secret/org-ccalm-jwt \ vault kv put secret/org-ccalm-jwt \
jwt.secret=my-secret-value \ jwt.secret=my-secret-value \
db.user=admin \ db.user=admin \
db.pass=123456 db.pass=123456
``` ```
Разбор параметров: Разбор параметров:
1. vault kv put команда для записи ключей и значений в KV-хранилище Vault. 1. vault kv put команда для записи ключей и значений в KV-хранилище Vault.
2. secret/org-ccalm-jwt путь к секрету. 2. secret/org-ccalm-jwt путь к секрету.
* secret/ это backend-хранилище (оно должно быть включено в Vault). * secret/ это backend-хранилище (оно должно быть включено в Vault).
* org-ccalm-jwt имя секрета, под которым сохраняются параметры. * org-ccalm-jwt имя секрета, под которым сохраняются параметры.
3. jwt.secret=my-secret-value ключ jwt.secret со значением my-secret-value. 3. jwt.secret=my-secret-value ключ jwt.secret со значением my-secret-value.
4. db.user=admin ключ db.user со значением admin. 4. db.user=admin ключ db.user со значением admin.
5. db.pass=123456 ключ db.pass со значением 123456. 5. db.pass=123456 ключ db.pass со значением 123456.
# 🚀 Установка и настройка HashiCorp Vault на Windows # 🚀 Установка и настройка HashiCorp Vault на Windows
## 📌 1. Установка HashiCorp Vault ## 📌 1. Установка HashiCorp Vault
1. **Скачайте Vault CLI** с официального сайта: 1. **Скачайте Vault CLI** с официального сайта:
🔗 [https://developer.hashicorp.com/vault/downloads](https://developer.hashicorp.com/vault/downloads) 🔗 [https://developer.hashicorp.com/vault/downloads](https://developer.hashicorp.com/vault/downloads)
2. Распакуйте архив и **добавьте путь к `vault.exe` в `PATH`**: 2. Распакуйте архив и **добавьте путь к `vault.exe` в `PATH`**:
- Кликните **ПКМ → Этот компьютер → Свойства → Дополнительные параметры системы**. - Кликните **ПКМ → Этот компьютер → Свойства → Дополнительные параметры системы**.
- В **Переменные среды** добавьте путь к папке с `vault.exe`. - В **Переменные среды** добавьте путь к папке с `vault.exe`.
3. Откройте **cmd** или **PowerShell** и проверьте установку командой: 3. Откройте **cmd** или **PowerShell** и проверьте установку командой:
```sh ```sh
vault --version vault --version
``` ```
Если всё ОК, увидите версию Vault. Примерно такую: Vault v1.18.4 (503be623a3697e8c10c254dc87d26492c46753e1), built 2025-01-29T13:57:54Z Если всё ОК, увидите версию Vault. Примерно такую: Vault v1.18.4 (503be623a3697e8c10c254dc87d26492c46753e1), built 2025-01-29T13:57:54Z
--- ---
## 📌 2. Запуск Vault-сервера (разработческий режим) ## 📌 2. Запуск Vault-сервера (разработческий режим)
Чтобы локально запустить Vault в **dev-режиме** (без авторизации), выполните: Чтобы локально запустить Vault в **dev-режиме** (без авторизации), выполните:
```sh ```sh
vault server -dev vault server -dev
``` ```
После запуска он покажет **root-токен** (сохраните его!): После запуска он покажет **root-токен** (сохраните его!):
```plaintext ```plaintext
Unseal Key: x1jUXpLJREI6M1+Qm6m/h3NLEhaEmBageqw0v+dSSKo= Unseal Key: x1jUXpLJREI6M1+Qm6m/h3NLEhaEmBageqw0v+dSSKo=
Root Token: hvs.V7Rc8uJ8YJ0AASKZfep6oYNe Root Token: hvs.V7Rc8uJ8YJ0AASKZfep6oYNe
``` ```
Теперь Vault работает по адресу: Теперь Vault работает по адресу:
```sh ```sh
start http://127.0.0.1:8200 start http://127.0.0.1:8200
``` ```
--- ---
## 📌 3. Экспорт токена (чтобы не вводить каждый раз) ## 📌 3. Экспорт токена (чтобы не вводить каждый раз)
Откройте **PowerShell** и выполните: Откройте **PowerShell** и выполните:
```sh ```sh
$env:VAULT_ADDR="http://127.0.0.1:8200" $env:VAULT_ADDR="http://127.0.0.1:8200"
$env:VAULT_TOKEN="hvs.JDIyKgDMagA0WyIhLFQ4mAjZ" $env:VAULT_TOKEN="hvs.JDIyKgDMagA0WyIhLFQ4mAjZ"
``` ```
(Замените `hvs.JDIyKgDMagA0WyIhLFQ4mAjZ` на свой токен.) (Замените `hvs.JDIyKgDMagA0WyIhLFQ4mAjZ` на свой токен.)
Теперь можно работать с Vault без ввода токена каждый раз. Теперь можно работать с Vault без ввода токена каждый раз.
--- ---
## 📌 4. Запись значений в Vault на Windows ## 📌 4. Запись значений в Vault на Windows
Значения разделенные пробелами можно записать в вольт так: Значения разделенные пробелами можно записать в вольт так:
```sh ```sh
vault kv put secret/kz-istransit-jwt server.ssl.key-store-password=MFNX344yh4 vault kv put secret/kz-istransit-jwt server.ssl.key-store-password=MFNX344yh4
``` ```
Выдаст примерно такое: Выдаст примерно такое:
======== Secret Path ======== ======== Secret Path ========
secret/data/kz-istransit-jwt secret/data/kz-istransit-jwt
======= Metadata ======= ======= Metadata =======
Key Value Key Value
--- ----- --- -----
created_time 2025-02-24T12:49:45.7630328Z created_time 2025-02-24T12:49:45.7630328Z
custom_metadata <nil> custom_metadata <nil>
deletion_time n/a deletion_time n/a
destroyed false destroyed false
version 1 version 1
--- ---
## 📌 5. Проверка сохранённых данных ## 📌 5. Проверка сохранённых данных
Чтобы посмотреть, что записано в Vault: Чтобы посмотреть, что записано в Vault:
```sh ```sh
vault kv get secret/kz-istransit-jwt vault kv get secret/kz-istransit-jwt
``` ```
Если всё настроено правильно, вы увидите примерно такой вывод: Если всё настроено правильно, вы увидите примерно такой вывод:
```plaintext ```plaintext
====== Metadata ====== ====== Metadata ======
Key Value Key Value
--- ----- --- -----
created_time 2025-02-24T12:00:00Z created_time 2025-02-24T12:00:00Z
version 1 version 1
====== Data ====== ====== Data ======
Key Value Key Value
--- ----- --- -----
db.pass 123456 db.pass 123456
db.user admin db.user admin
jwt.secret my-secret-value jwt.secret my-secret-value
``` ```
--- ---
## 📌 6. Удаление данных из Vault ## 📌 6. Удаление данных из Vault
Удаление данных: Удаление данных:
```sh ```sh
vault kv delete secret/org-ccalm-jwt vault kv delete secret/org-ccalm-jwt
``` ```
Полное уничтожение (без возможности восстановления): Полное уничтожение (без возможности восстановления):
```sh ```sh
vault kv destroy -versions=1 secret/org-ccalm-jwt vault kv destroy -versions=1 secret/org-ccalm-jwt
``` ```
--- ---
## 🎯 Итог ## 🎯 Итог
✅ Установили Vault CLI ✅ Установили Vault CLI
✅ Запустили Vault сервер (`vault server -dev`) ✅ Запустили Vault сервер (`vault server -dev`)
✅ Экспортировали `VAULT_ADDR` и `VAULT_TOKEN` ✅ Экспортировали `VAULT_ADDR` и `VAULT_TOKEN`
✅ Записали настройки в Vault ✅ Записали настройки в Vault
✅ Проверили данные ✅ Проверили данные
Теперь можно интегрировать Vault в Spring Boot 🚀 Теперь можно интегрировать Vault в Spring Boot 🚀

428
Ubuntu.md
View File

@ -434,6 +434,8 @@ sudo tar cvpzf /media/usb/backup.tgz --exclude=/var/www --exclude=/etc/fstab --e
0 1 * * * wget -O /dev/null -q 'http://locust.kz/get/list.php' 0 1 * * * wget -O /dev/null -q 'http://locust.kz/get/list.php'
0 1 * * * /opt/backups/backup.sh 0 1 * * * /opt/backups/backup.sh
/opt/backups/backup.sh
Проверяю таблицу: Проверяю таблицу:
sudo crontab -l -u www-data sudo crontab -l -u www-data
**************************************************************************************************** ****************************************************************************************************
@ -510,8 +512,8 @@ mysqldump -uu1109882_root -proot123456 -h127.0.0.1 db1109882_locust > /root/db11
``` ```
Включаем модули: Включаем модули:
```sh ```sh
sudo phpenmod imap sudo phpenmod imap &&
sudo phpenmod mbstring sudo phpenmod mbstring &&
sudo a2enmod rewrite sudo a2enmod rewrite
``` ```
@ -519,13 +521,14 @@ mysqldump -uu1109882_root -proot123456 -h127.0.0.1 db1109882_locust > /root/db11
```sh ```sh
sudo sed -i 's/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf sudo sed -i 's/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf
``` ```
Проверяем файл: Проверяем файл:
```sh ```sh
sudo mcedit /etc/apache2/apache2.conf sudo mcedit /etc/apache2/apache2.conf
``` ```
```sh ```sh
sudo a2enmod php8.0 sudo a2enmod php8.1
sudo a2enmod ssl #Так как в последнее время делаю через haproxy то SSL в апачи не использую sudo a2enmod ssl #Так как в последнее время делаю через haproxy то SSL в апачи не использую
sudo a2enmod headers sudo a2enmod headers
sudo a2enmod expires sudo a2enmod expires
@ -648,7 +651,7 @@ https://apache-windows.ru/apache-ssl-переход-apache-на-https/
sudo a2dissite jwt2.local.conf sudo a2dissite jwt2.local.conf
sudo a2dissite jwt.local.conf sudo a2dissite jwt.local.conf
sudo a2dissite aistransit.kz.conf
http://aistransit.kz/ http://aistransit.kz/
@ -969,6 +972,7 @@ DefaultRoot ~
ServerIdent on "FTP Server ready." ServerIdent on "FTP Server ready."
RequireValidShell off RequireValidShell off
AuthUserFile /etc/proftpd/ftpd.passwd AuthUserFile /etc/proftpd/ftpd.passwd
PassivePorts 40000 40100
Для создания нового виртуального пользователя "tester" "firsttester" в файле выполнить комманду (uid и gid должны быть как у пользователя www-data смотри: cat /etc/passwd и cat /etc/group) Для создания нового виртуального пользователя "tester" "firsttester" в файле выполнить комманду (uid и gid должны быть как у пользователя www-data смотри: cat /etc/passwd и cat /etc/group)
@ -979,8 +983,14 @@ AuthUserFile /etc/proftpd/ftpd.passwd
sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=apk --uid=33 --gid=33 --home=/var/www/istransit.kz/apk --shell=/bin/false sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=apk --uid=33 --gid=33 --home=/var/www/istransit.kz/apk --shell=/bin/false
sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=rebezov.a --uid=33 --gid=33 --home=/var/www/test2.istransit.kz --shell=/bin/false sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=rebezov.a --uid=33 --gid=33 --home=/var/www/test2.istransit.kz --shell=/bin/false
sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=rebezov.a --uid=33 --gid=33 --home=/opt/www/istransit.kz --shell=/bin/false sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=rebezov.a --uid=33 --gid=33 --home=/opt/www/istransit.kz --shell=/bin/false
sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=jointech --uid=33 --gid=33 --home=/opt/SServerJointech/ftp --shell=/bin/false
Задал пароль для apk пользователя: vooOtKBb7bckcNh Задал пароль для apk пользователя: vooOtKBb7bckcNh
Задал пароль для rebezov.a : BU39kb2 Задал пароль для rebezov.a : BU39kb2
Задал пароль для jointech : jointech
задал пароль: задал пароль:
zoto!23+ zoto!23+
@ -2011,388 +2021,6 @@ restart: always: Гарантирует, что контейнер будет а
Открываем: https://127.0.0.1:9443 Открываем: https://127.0.0.1:9443
После предложения задания пароля для пользователя admin задал такой пароль на дом компе: &b2C6nyN2,qUNM] После предложения задания пароля для пользователя admin задал такой пароль на дом компе: &b2C6nyN2,qUNM]
****************************************************************************************************
Собственный DynDNS на Linux для observer.kz для начала устанавливаем BIND 9.13 and later по этому мануалу https://www.dmosk.ru/miniinstruktions.php?mini=bind-ubuntu и по этому для новой версии https://www.netss.by/?p=26
sudo apt-get update
sudo apt-get install bind9 dnsutils
sudo apt-get install bind9utils
Добавляем сервис в автозапуск
systemctl enable bind9
Проверяем что сервис работает
nslookup dmosk.ru 127.0.0.1
Открываем настройки:
mcedit /etc/bind/named.conf.options
Для глобальных запросов добавляем строку: allow-query { any; };
Также добавляем в этот файл DNS сервера пересылки, на них будут перенаправляться запросы если локальный не содержит данных
//forwarders {
// 8.8.8.8;
// 8.8.4.4;
//};
Проверяем настройки командой (ответ должен быть пустым):
sudo named-checkconf
Перезагружаем:
sudo systemctl restart bind9
Проверяю версию BIND:
named -v
Выдало: BIND 9.16.1-Ubuntu (Stable Release) <id:d497c32>
Можно проверить какой IP выдаст на DNS запрос
dig locust.kz A
На этом базовая настройка закончена. Наш сервер готов принимать и отдавать запросы и работать, как кэширующий dns.
Далее создаём клиента согласно: https://help.ubuntu.ru/wiki/динамический_днс_своими_руками
Перейдем в него.
cd /etc/bind/
Генерируем пару ключь для обмена информацией между клиентом и сервером:
sudo tsig-keygen -a hmac-sha512 dirt.kz > dirt.kz.key
sudo tsig-keygen -a hmac-sha512 locust.kz > locust.kz.key
Для загрузки ключа добавляем его файл mcedit /etc/bind/named.conf строчку с указанием файла, где определен ключ.
include "/etc/bind/dirt.kz.key";
include "/etc/bind/locust.kz.key";
Следующим шагом необходимо в файл mcedit /etc/bind/named.conf.local прописать доменную зону, которой мы оперируем.
zone "dirt.kz" {
type master;
allow-update {key dirt.kz;};
file "/var/cache/bind/dirt.kz";
};
zone "locust.kz" {
type master;
allow-update {key locust.kz;};
file "/var/cache/bind/locust.kz";
};
В файле "mcedit /var/cache/bind/dirt.kz" должны быть прописанны записи домена где:
В файле "mcedit /var/cache/bind/locust.kz" должны быть прописанны записи домена где:
Поле $ORIGIN для подставки имени в знак @, поэтому знак @ не используется просто так в тексте
Если используется символ @ то он заменяется на то что было прописанно в $ORIGIN смотреть в: https://help.dyn.com/how-to-format-a-zone-file/
SOA — Начало полномочий подробней смотри в https://k.psu.ru/wiki/BIND9_(методическое_пособие)#SOA
NS — Сервер имён
A — рекорд
MX — Почта для обмена
CN — Каноническое имя
PTR — указатель
И таким содержимым:
$ORIGIN dirt.kz
$TTL 604800
@ IN SOA bigfoottrade.kz. root.bigfoottrade.kz. (
8 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS bigfoottrade.kz.
Второй файл для locust.kz:
$ORIGIN .
$TTL 604800 ; 1 week
locust.kz IN SOA bigfoottrade.kz. irigm.mail.ru. (
134 ; serial
604800 ; refresh (1 week)
86400 ; retry (1 day)
1419200 ; expire (2 weeks 2 days 10 hours 13 minutes 20 seconds)
604800 ; minimum (1 week)
)
NS bigfoottrade.kz.
$TTL 3600 ; 1 hour
A 5.76.254.182
$ORIGIN locust.kz.
* A 127.0.0.1
Правлю права доступа:
sudo chown -R bind:bind /etc/bind
Если настройки были первоначальными то стоит удалить файл /var/cache/bind/locust.kz.jnl и переинициализировать его командой:
sudo rndc reconfig
Потом следует вызвать:
sudo systemctl restart bind9
Команда выше также переписывет накопившиеся данные из /var/cache/bind/locust.kz.jnl в /var/cache/bind/locust.kz так что после обновления если охото быстрей взглянуть на текстовое значение следует повторно вызвать эту команду
После настроек сервера перезагружаем его:
sudo named-checkconf
sudo rndc reload
sudo systemctl restart bind9
sudo rndc status
journalctl | grep bind
sudo journalctl -u bind9 -n 50
Создаю скрипт /etc/ddns/ddns.sh для обновления доменных зон удалённо с доступом по ключу:
Файл из примера:
#!/bin/bash
TTL=3600
SERVER=ns.dyndns.my
HOSTNAME=dhost.dyndns.my
ZONE=dyndns.my
KEYFILE=Kdyndns.my.+157+48025.private
new_ip_address=`curl http://dyndns.my/ip.php` #Этот файлик создадим позднее на сервере!
cd /etc/ddns
nsupdate -v -k $KEYFILE << EOF
server $SERVER
zone $ZONE
update delete $HOSTNAME A
update add $HOSTNAME $TTL A $new_ip_address
send
EOF
Мой модифицированный файл для обновления IP в Bind9 DNS сервису по созданному файлу ip.txt, файл ip.txt создаётся в PHP скрипте который описан ниже:
#!/bin/bash
TTL=3600
SERVER=127.0.0.1
HOSTNAME=*.dirt.kz
ZONE=dirt.kz
KEYFILE=/etc/bind/dirt.kz.key
new_ip_address=
FILE=/etc/ddns/ip.txt
if test -f "$FILE"; then
new_ip_address=`cat $FILE`
rm $FILE
fi
len=${#new_ip_address}
if [ $len -gt 3 ]
then
echo "New IP address = $new_ip_address"
else
echo "Not find IP address"
exit
fi
cd /etc/ddns
sudo nsupdate -v -k $KEYFILE << EOF
server $SERVER
zone $ZONE
update delete $HOSTNAME A
update add $HOSTNAME $TTL A $new_ip_address
update delete dirt.kz A
update add dirt.kz $TTL A $new_ip_address
send
EOF
echo "OK"
Так как PHP работает за HAProxy то немного модифицировал скрипт который сохраняет IP обратившегося клиента в файл, а именно использую "x-forwarded-for" для передачи IP адреса клиента:
<?php
echo '<pre>'; print_r(getallheaders()); echo '</pre>';
// PROBLEM IS each browser has different "x-forwarder-for" some "X-Forwarder-for" and some browser gave you 2x ip "x.x.x.x, x.x.x.x"
foreach ( getallheaders() as $k => $v) {
if ( strtolower($k) == 'x-forwarded-for' ) {
$tmp = explode(', ', $v);
if ( $tmp[count($tmp)-1] != '' )
$_SERVER['REMOTE_ADDR'] = $tmp[count($tmp)-1];
}
}
if(isset($_GET["key"]) && $_GET["key"]=='4fygxNq539NFfUm6SOd2vn52GwL7o7NA'){
$myfile = fopen("/etc/ddns/ip.txt", "w");
fwrite($myfile, $_SERVER['REMOTE_ADDR']);
fclose($myfile);
}
echo $_SERVER['REMOTE_ADDR'];
?>
Проверяем что находит IP по доменному имени
nslookup dirt.kz 127.0.0.1
****************************************************************************************************
Установка сервиса обмена сообщениями RabbitMQ менеджер сообщений (message broker), написан на Erlang, ближайший аналог в AWS SQS. По документации из: https://rtfm.co.ua/ru/rabbitmq-zapusk-opisanie-primery/
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt install rabbitmq-server
Посмотреть список используемых плагинов:
sudo rabbitmq-plugins list
Активируем плагин rabbitmq_management для наблюдения за системой по HTTP https://www.rabbitmq.com/management.html https://thewebland.net/development/devops/chast-3-interfejs-upravleniya-rabbitmq/#:~:text=RabbitMQ%20Management%20%20это%20удобный%20интерфейс,и%20отправлять%20%2F%20получать%20сообщения%20вручную.
sudo rabbitmq-plugins enable rabbitmq_management
rabbitmq_management активирует поддержку API на порту 15672: http://192.168.0.144:15672 http://10.1.7.70:15672 http://192.168.0.83:15672
Но для активации нужно добавить пользователя, смотрим пользователей:
sudo rabbitmqctl list_users
sudo rabbitmqctl add_user admin paRabbit! или test test для локального тестового сервера
sudo rabbitmqctl set_user_tags admin administrator
sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
Также можно создать пользователя для публикации сообщений но уже это можно сделать через WEB интерфейс: producer lgGDWAJEwI для guest с паролем: efewG!4ev Александра: alex jefruf!43
Теперь можно логинется по test test поменять пароль можно: https://kb.vmware.com/s/article/323520#:~:text=Log%20in%20to%20the%20RabbitMQ,host%20where%20RabbitMQ%20is%20installed.
Или так можно поменять пароль: sudo rabbitmqctl change_password zenoss New-Password
producer: клиент, выполняющий отправку сообщения
queue: собственно очередь сообщений
consumer: клиент, получающий сообщения из очереди
exchange: получает сообщения от producer, и отправялет их в очереди в соответствии с его типом (см. тут https://www.rabbitmq.com/tutorials/tutorial-three-python.html)
Дальше можно пробовать отправлять данные в очередь используя допустим java библиотеку урок: https://www.youtube.com/watch?v=6lPK_LgTZ9Y
https://www.rabbitmq.com/devtools.html :
Создаю Maven проект в консоли:
cd O:\projects\Workspace_Java\
mvn archetype:generate -DgroupId=kz.istt.app -DartifactId=TransitToRabbitMQ -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
Открываю его в idea64 и добавляю в POM следующую зависемость из https://mvnrepository.com/artifact/com.rabbitmq/amqp-client:
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.14.2</version>
</dependency>
Также поставил C:\Program Files\Java\jdk-14.0.2 а то не запускалось, также просит рут права для IntelliJ IDEA.
Урок создания maven проекта: https://devcolibri.com/unit/урок-1-подготовка-и-создание-maven-проекта/
или https://www.jetbrains.com/idea/guide/tutorials/working-with-maven/creating-a-project/
Добавил в POM файл:
<repositories>
<repository>
<name>RabbitMQ</name>
<url>https://repo1.maven.org/maven2/com/rabbitmq/amqp-client/5.16.0</url>
<id>com.rabbitmq</id>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.16.0</version>
</dependency>
</dependencies>
Перезагружаем:
sudo service rabbitmq-server restart
****************************************************************************************************
Установка Shovels Plugin для RabbitMQ (лопата) по мотивам из: https://www.rabbitmq.com/docs/shovel
Активирую плагин командой:
sudo rabbitmq-plugins enable rabbitmq_shovel
sudo rabbitmq-plugins enable rabbitmq_shovel_management
Настраиваю Shovels Dynamic плагин в RabbitMQ через командную строку:
sudo rabbitmqctl set_parameter shovel kaz_to_kaz '{
"src-protocol": "amqp091",
"src-uri": "amqp://admin:paRabbit!@127.0.0.1:20000/transportation",
"src-queue": "TO_KAZ",
"dest-protocol": "amqp091",
"dest-uri": "amqp://admin:paRabbit!@10.101.1.11:20000/playground",
"dest-exchange": "swap",
"dest-exchange-key": ".KAZ.",
"ack-mode": "on-confirm",
"publish-properties": {
"delivery_mode": 2
}
}'
Для Росии такие настройки:
sudo rabbitmqctl set_parameter shovel kaz_to_rus '{
"src-protocol": "amqp091",
"src-uri": "amqp://admin:paRabbit!@127.0.0.1:20000/transportation_rus",
"src-queue": "TO_RUS",
"dest-protocol": "amqp091",
"dest-uri": "amqp://iktt_kaz:jkrjHL7xj7PrW1D@192.168.89.133:20000/playground",
"dest-exchange": "swap",
"dest-exchange-key": "KZ",
"ack-mode": "on-confirm",
"publish-properties": {
"delivery_mode": 2
}
}'
Для Беларусии такие настройки:
sudo rabbitmqctl set_parameter shovel kaz_to_blr '{
"src-protocol": "amqp091",
"src-uri": "amqp://admin:paRabbit!@127.0.0.1:20000/transportation_blr",
"src-queue": "TO_BLR",
"dest-protocol": "amqp091",
"dest-uri": "amqp://KZ_IKTT:DK34xDNlZQfQ551k@192.168.90.133:20000/plumber",
"dest-exchange": "eec.swap",
"dest-exchange-key": "KZ",
"ack-mode": "on-confirm",
"publish-properties": {
"delivery_mode": 2
}
}'
Для Армении такие настройки:
sudo rabbitmqctl set_parameter shovel kaz_to_arm '{
"src-protocol": "amqp091",
"src-uri": "amqp://admin:password@127.0.0.1:20000/transportation_arm",
"src-queue": "TO_ARM",
"dest-protocol": "amqp091",
"dest-uri": "amqp://kz_istt:password@192.168.89.158:20000/transportation",
"dest-exchange": "swap_kz",
"dest-exchange-key": "KZ_ISTT",
"ack-mode": "on-confirm",
"publish-properties": {
"delivery_mode": 2
}
}'
Для Кыргызстана (таможенная инфраструктура)
sudo rabbitmqctl set_parameter shovel kaz_to_kgz '{
"src-protocol": "amqp091",
"src-uri": "amqp://admin:paRabbit!@127.0.0.1:20000/transportation_kgz",
"src-queue": "TO_KGZ",
"dest-protocol": "amqp091",
"dest-uri": "amqp://kz_istt:uzZNYbVTElMDXnfwQx16@192.168.70.133:20000/transportation_kaz",
"dest-exchange": "swap",
"dest-exchange-key": "KAZ",
"ack-mode": "on-confirm",
"publish-properties": {
"delivery_mode": 2
}
}'
Удалять так:
sudo rabbitmqctl clear_parameter shovel kaz_to_kgz
Для отправки из Киргизии нам то такие настройки:
sudo rabbitmqctl set_parameter shovel kgz_to_kaz '{
"src-protocol": "amqp091",
"src-uri": "amqp://admin:pfta2OFt@127.0.0.1:20000/transportation_kaz",
"src-queue": "TO_KAZ",
"dest-protocol": "amqp091",
"dest-uri": "amqp://kg_amap:qrd2fjEjkegdi7bfb@192.168.70.134:20000/transportation_kgz",
"dest-exchange": "swap",
"dest-exchange-key": "KGZ",
"ack-mode": "on-confirm",
"publish-properties": {
"delivery_mode": 2
}
}'
Удалять так:
sudo rabbitmqctl clear_parameter shovel kgz_to_kaz
Чтобы проверить текущие параметры Shovel:
sudo rabbitmqctl list_parameters
А также можно взглянуть что создалось через WEB интерфейс
Не забывать что Exchange: swap должен быть не "direct" а как "topic" иначе маршрутизация не сработает.
**************************************************************************************************** ****************************************************************************************************
Установка wxWidgets на Linux mint, скачал 3.0.5 по инструкции из https://www.binarytides.com/install-wxwidgets-ubuntu/ Установка wxWidgets на Linux mint, скачал 3.0.5 по инструкции из https://www.binarytides.com/install-wxwidgets-ubuntu/
@ -2432,34 +2060,6 @@ admin admin поменял на admin deSert!123
Ошибка на мейке... Ошибка на мейке...
install install
**************************************************************************************************** ****************************************************************************************************
Install Redis по мативам: https://timeweb.cloud/tutorials/redis/ustanovka-i-nastrojka-redis-dlya-raznyh-os
sudo apt-get update
sudo apt install redis
redis-cli --version
sudo systemctl status redis
Config:
sudo mcedit /etc/redis/redis.conf
И меняем в конфигурации на: supervised systemd
Также желательно проверить настройку чтобы слушался только IP: 127.0.0.1
bind 0.0.0.0
Также в поле SECURITY нужно установить пароль, сгенерированный при помощи:
openssl rand 25 | openssl base64 -A
Примерно такой должен быть получиться:
requirepass 9F3/NKWeOjd815vkadT2DcgVHf6fEpVQXw==
Перезагружаем:
sudo systemctl restart redis-server
Проверяем Redis:
redis-cli
Или так проверяем:
redis-cli -h 127.0.0.1 -p 6379 -a 9F3/NKWeOjd815vkadT2DcgVHf6fEpVQXw==
И пишем: ping
Проверяем какие порты прослушиваются на компе:
sudo netstat -lnp | grep redis
****************************************************************************************************
Для настройки локального сервера имен DNS сервер в место Bind9 теперь Dnsmasq так как он проще, понадобилось для haproxy Для настройки локального сервера имен DNS сервер в место Bind9 теперь Dnsmasq так как он проще, понадобилось для haproxy
sudo apt-get install dnsmasq sudo apt-get install dnsmasq
sudo apt-get install resolvconf sudo apt-get install resolvconf

143
WireGuard_install.md Normal file
View File

@ -0,0 +1,143 @@
Окей 👍 Дам пошаговую инструкцию для **WireGuard** на Ubuntu Server.
```sh
ssh ubuntu@194.32.140.11 -p 22
```
Ок 👌 давай сделаем связку **Ubuntu Server (сервер VPN)****Windows 11 (клиент)** через **WireGuard**.
---
## 🔧 Установка WireGuard на Ubuntu (сервер)
1. Установи пакеты:
```sh
sudo apt update &&
sudo apt install wireguard -y
```
2. Сгенерируй ключи:
```sh
umask 077 &&
wg genkey | tee server_private.key | wg pubkey > server_public.key
```
3. Создай конфиг сервера:
```sh
sudo mcedit /etc/wireguard/wg0.conf
```
Пример (замени `xx.xx.xx.xx` на внешний IP твоего сервера и подсеть на свою):
```ini
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <тот что сгенерился на сервере>
SaveConfig = false
[Peer]
PublicKey = <тот что бкдкт генерится на клиенте>
AllowedIPs = 10.0.0.2/32
```
4. Разреши форвардинг трафика:
```sh
sudo mcedit /etc/sysctl.conf
```
раскомментируй:
```
net.ipv4.ip_forward=1
```
применить:
```sh
sudo sysctl -p
```
5. Настрой firewall (если используешь `ufw`):
```bash
sudo ufw allow 51820/udp
```
6. Запусти WireGuard:
```sh
sudo systemctl enable wg-quick@wg0 &&
sudo systemctl start wg-quick@wg0
```
---
## 💻 Установка WireGuard на Windows 11 (клиент)
1. Скачай официальный клиент:
👉 [WireGuard для Windows](https://www.wireguard.com/install/)
2. Установи и запусти WireGuard.
3. Создай ключи (можно прямо в приложении или на сервере):
```powershell
# если на сервере:
wg genkey | tee client_private.key | wg pubkey > client_public.key
```
4. Добавь конфиг клиента (в приложении "Add Tunnel → Add empty tunnel"):
```ini
[Interface]
PrivateKey = <client_private_key>
Address = 10.0.0.2/32
DNS = 1.1.1.1
[Peer]
PublicKey = <server_public_key>
Endpoint = xx.xx.xx.xx:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
```
⚠️ `xx.xx.xx.xx` → внешний IP твоего Ubuntu сервера.
Если хочешь только доступ к PostgreSQL, можно в `AllowedIPs` указать:
```
10.0.0.0/24, ccalm.org/32
```
5. Нажми **Activate** → VPN поднимется.
---
## ✅ Проверка
На Windows:
```powershell
ping 10.0.0.1
```
Должен отвечать сервер.
На Ubuntu:
```bash
ping 10.0.0.2
```
Должен отвечать клиент.
После этого JDBC строка будет работать так же, как если бы ты был внутри сети.
---
Хочешь, я соберу сразу готовые **два конфига (`wg0.conf` для сервера и client.conf для Windows)**, чтобы ты только ключи подставил?