Compare commits
22 Commits
2b092dd67d
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 2a29301db8 | |||
| fe5d348b65 | |||
| 162688fccd | |||
| b6111740e8 | |||
| 5745ef2cd6 | |||
| 5d40bb271d | |||
| 3ca998f1cf | |||
| 09241fc5c6 | |||
| f8c995bd43 | |||
| ba1914f646 | |||
| c2f357fae1 | |||
| 91672d99ee | |||
| 3f831b68ab | |||
| 332e1b84e9 | |||
| cab906cff1 | |||
| 19407be225 | |||
| 1d99814706 | |||
| 7380add41d | |||
| aa0179f6c0 | |||
| 2d79601c7a | |||
| 3bbdd7e866 | |||
| 72ba8986d4 |
223
Brokers/RabbitMQ_install.md
Normal file
223
Brokers/RabbitMQ_install.md
Normal 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" иначе маршрутизация не сработает.
|
||||
@ -1,341 +1,341 @@
|
||||
Here’s a step-by-step guide to setting up a **RabbitMQ cluster with replication** correctly:
|
||||
|
||||
---
|
||||
|
||||
## **Step 1: Prepare the Servers**
|
||||
|
||||
Ensure you have at least **three** nodes (recommended for HA) with:
|
||||
|
||||
- Ubuntu 22.04 (or a supported OS)
|
||||
- Sufficient CPU/RAM based on workload
|
||||
- Open necessary firewall ports (**5672, 15672, 25672**)
|
||||
|
||||
Set hostnames for clarity:
|
||||
|
||||
```bash
|
||||
sudo hostnamectl set-hostname rabbitmq-node1 # Change for each node
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Step 2: Install Erlang and RabbitMQ**
|
||||
|
||||
Run the following on **all nodes**:
|
||||
|
||||
### **1. Add the RabbitMQ Repository**
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y curl gnupg
|
||||
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
|
||||
```
|
||||
|
||||
### **2. Install Erlang and RabbitMQ**
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y rabbitmq-server
|
||||
```
|
||||
|
||||
### **3. Enable RabbitMQ**
|
||||
|
||||
```bash
|
||||
sudo systemctl enable --now rabbitmq-server
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Step 3: Configure Clustering**
|
||||
|
||||
### **1. Stop RabbitMQ on All Nodes**
|
||||
|
||||
```bash
|
||||
sudo systemctl stop rabbitmq-server
|
||||
```
|
||||
|
||||
### **2. Configure Cookie for Clustering**
|
||||
|
||||
Run on **all nodes** (same cookie ensures clustering works):
|
||||
|
||||
```bash
|
||||
echo "MY_CLUSTER_COOKIE" | sudo tee /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.
|
||||
|
||||
---
|
||||
|
||||
## **Step 4: Join Nodes to the Cluster**
|
||||
|
||||
Perform this on **nodes 2 and 3**, joining them to **node1**:
|
||||
|
||||
```bash
|
||||
sudo rabbitmqctl stop_app
|
||||
sudo rabbitmqctl join_cluster rabbit@rabbitmq-node1
|
||||
sudo rabbitmqctl start_app
|
||||
```
|
||||
|
||||
Check cluster status:
|
||||
|
||||
```bash
|
||||
sudo rabbitmqctl cluster_status
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Step 5: Enable High Availability (HA) Mirroring**
|
||||
|
||||
To replicate all queues, run on **any one node**:
|
||||
|
||||
```bash
|
||||
rabbitmqctl set_policy ha-all "^.*" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
|
||||
```
|
||||
|
||||
This ensures all queues are **replicated across all nodes**.
|
||||
|
||||
---
|
||||
|
||||
## **Step 6: Enable Management UI**
|
||||
|
||||
Run on **each node** to enable the web interface:
|
||||
|
||||
```bash
|
||||
sudo rabbitmq-plugins enable rabbitmq_management
|
||||
```
|
||||
|
||||
Access at:
|
||||
**http://[NODE_IP]:15672**
|
||||
(Default login: `guest/guest`, change this for security.)
|
||||
|
||||
---
|
||||
|
||||
## **Step 7: Test the Cluster**
|
||||
|
||||
Run on **each node**:
|
||||
|
||||
```bash
|
||||
rabbitmqctl list_queues
|
||||
```
|
||||
|
||||
Queues should be visible and synchronized.
|
||||
|
||||
---
|
||||
|
||||
## **Step 8: Enable Auto-Recovery** (Optional)
|
||||
|
||||
Edit `/etc/rabbitmq/rabbitmq.conf` on **each node** and add:
|
||||
|
||||
```ini
|
||||
cluster_formation.peer_discovery_backend = classic_config
|
||||
cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-node1
|
||||
cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-node2
|
||||
cluster_formation.classic_config.nodes.3 = rabbit@rabbitmq-node3
|
||||
```
|
||||
|
||||
Then restart RabbitMQ:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart rabbitmq-server
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Step 9: Secure the Cluster** (Recommended)
|
||||
|
||||
### **1. Create an Admin User**
|
||||
|
||||
```bash
|
||||
rabbitmqctl add_user admin StrongPassword123!
|
||||
rabbitmqctl set_user_tags admin administrator
|
||||
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
|
||||
```
|
||||
|
||||
Then **disable the guest account**:
|
||||
|
||||
```bash
|
||||
rabbitmqctl delete_user guest
|
||||
```
|
||||
|
||||
### **2. Enable TLS (Optional)**
|
||||
|
||||
For security, configure TLS in `/etc/rabbitmq/rabbitmq.conf`. Refer to RabbitMQ’s [TLS guide](https://www.rabbitmq.com/ssl.html).
|
||||
|
||||
---
|
||||
|
||||
## **Step 10: Setup Monitoring (Optional)**
|
||||
|
||||
Install **Prometheus & Grafana** or use **RabbitMQ Prometheus plugin**:
|
||||
|
||||
```bash
|
||||
sudo rabbitmq-plugins enable rabbitmq_prometheus
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Now your RabbitMQ cluster is fully set up with **replication and high availability**! 🚀
|
||||
|
||||
---
|
||||
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
# 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:
|
||||
|
||||
## **1️⃣ Create the Configuration File**
|
||||
|
||||
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:
|
||||
|
||||
```bash
|
||||
sudo nano /etc/rabbitmq/rabbitmq.conf
|
||||
```
|
||||
|
||||
Then add the following cluster configuration:
|
||||
|
||||
```
|
||||
cluster_formation.peer_discovery_backend = classic_config
|
||||
cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-main
|
||||
cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-replica
|
||||
```
|
||||
|
||||
Save and exit (`CTRL+X`, then `Y`, then `Enter`).
|
||||
|
||||
---
|
||||
|
||||
## **2️⃣ Set Correct Permissions**
|
||||
|
||||
Ensure the RabbitMQ user can read it:
|
||||
|
||||
```bash
|
||||
sudo chown rabbitmq:rabbitmq /etc/rabbitmq/rabbitmq.conf
|
||||
sudo chmod 644 /etc/rabbitmq/rabbitmq.conf
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **3️⃣ Restart RabbitMQ**
|
||||
|
||||
After modifying the configuration, restart the RabbitMQ service:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart rabbitmq-server
|
||||
```
|
||||
|
||||
Check the status:
|
||||
|
||||
```bash
|
||||
sudo systemctl status rabbitmq-server
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **4️⃣ Verify the Cluster Configuration**
|
||||
|
||||
After restarting, verify that clustering is working:
|
||||
|
||||
```bash
|
||||
rabbitmqctl cluster_status
|
||||
```
|
||||
|
||||
If the nodes are listed correctly, your setup is working.
|
||||
|
||||
---
|
||||
|
||||
## **5️⃣ If Using the Legacy `.config` Format**
|
||||
|
||||
Some older installations use an **Erlang-based configuration file** (`rabbitmq.config`). If you prefer that, create:
|
||||
|
||||
```bash
|
||||
sudo nano /etc/rabbitmq/rabbitmq.config
|
||||
```
|
||||
|
||||
Add this:
|
||||
|
||||
```erlang
|
||||
[
|
||||
{rabbit, [
|
||||
{cluster_formation, [
|
||||
{peer_discovery_backend, classic_config},
|
||||
{classic_config, [
|
||||
{nodes, ['rabbit@rabbitmq-main', 'rabbit@rabbitmq-replica']}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
].
|
||||
```
|
||||
|
||||
Then restart RabbitMQ:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart rabbitmq-server
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### **🔍 Troubleshooting**
|
||||
|
||||
❌ **RabbitMQ doesn't restart?**
|
||||
Check logs for errors:
|
||||
|
||||
```bash
|
||||
sudo journalctl -u rabbitmq-server --no-pager | tail -50
|
||||
```
|
||||
|
||||
❌ **Cluster not forming?**
|
||||
Try forcing a node to join manually:
|
||||
|
||||
```bash
|
||||
rabbitmqctl stop_app
|
||||
rabbitmqctl join_cluster rabbit@rabbitmq-main
|
||||
rabbitmqctl start_app
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
# Instructions to fix **unexpected** management UI authentication errors
|
||||
|
||||
stackoverflow answer [link](https://stackoverflow.com/a/40845332/27251837)
|
||||
|
||||
## Answer
|
||||
|
||||
### ❌ **Cannot login with guest/guest credentials**
|
||||
|
||||
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.
|
||||
|
||||
Do not create any config file and mess with it..
|
||||
|
||||
This is what i did then,
|
||||
|
||||
1. Add a new/fresh user, say user test and password test:
|
||||
|
||||
```bash
|
||||
rabbitmqctl add_user test test
|
||||
```
|
||||
|
||||
2. Give administrative access to the new user:
|
||||
|
||||
```bash
|
||||
rabbitmqctl set_user_tags test administrator
|
||||
```
|
||||
|
||||
3. Set permission to newly created user:
|
||||
|
||||
```bash
|
||||
rabbitmqctl set_permissions -p / test ".*" ".*" ".*"
|
||||
```
|
||||
|
||||
That's it, enjoy :)
|
||||
Here’s a step-by-step guide to setting up a **RabbitMQ cluster with replication** correctly:
|
||||
|
||||
---
|
||||
|
||||
## **Step 1: Prepare the Servers**
|
||||
|
||||
Ensure you have at least **three** nodes (recommended for HA) with:
|
||||
|
||||
- Ubuntu 22.04 (or a supported OS)
|
||||
- Sufficient CPU/RAM based on workload
|
||||
- Open necessary firewall ports (**5672, 15672, 25672**)
|
||||
|
||||
Set hostnames for clarity:
|
||||
|
||||
```bash
|
||||
sudo hostnamectl set-hostname rabbitmq-node1 # Change for each node
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Step 2: Install Erlang and RabbitMQ**
|
||||
|
||||
Run the following on **all nodes**:
|
||||
|
||||
### **1. Add the RabbitMQ Repository**
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y curl gnupg
|
||||
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
|
||||
```
|
||||
|
||||
### **2. Install Erlang and RabbitMQ**
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y rabbitmq-server
|
||||
```
|
||||
|
||||
### **3. Enable RabbitMQ**
|
||||
|
||||
```bash
|
||||
sudo systemctl enable --now rabbitmq-server
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Step 3: Configure Clustering**
|
||||
|
||||
### **1. Stop RabbitMQ on All Nodes**
|
||||
|
||||
```bash
|
||||
sudo systemctl stop rabbitmq-server
|
||||
```
|
||||
|
||||
### **2. Configure Cookie for Clustering**
|
||||
|
||||
Run on **all nodes** (same cookie ensures clustering works):
|
||||
|
||||
```bash
|
||||
echo "MY_CLUSTER_COOKIE" | sudo tee /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.
|
||||
|
||||
---
|
||||
|
||||
## **Step 4: Join Nodes to the Cluster**
|
||||
|
||||
Perform this on **nodes 2 and 3**, joining them to **node1**:
|
||||
|
||||
```bash
|
||||
sudo rabbitmqctl stop_app
|
||||
sudo rabbitmqctl join_cluster rabbit@rabbitmq-node1
|
||||
sudo rabbitmqctl start_app
|
||||
```
|
||||
|
||||
Check cluster status:
|
||||
|
||||
```bash
|
||||
sudo rabbitmqctl cluster_status
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Step 5: Enable High Availability (HA) Mirroring**
|
||||
|
||||
To replicate all queues, run on **any one node**:
|
||||
|
||||
```bash
|
||||
rabbitmqctl set_policy ha-all "^.*" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
|
||||
```
|
||||
|
||||
This ensures all queues are **replicated across all nodes**.
|
||||
|
||||
---
|
||||
|
||||
## **Step 6: Enable Management UI**
|
||||
|
||||
Run on **each node** to enable the web interface:
|
||||
|
||||
```bash
|
||||
sudo rabbitmq-plugins enable rabbitmq_management
|
||||
```
|
||||
|
||||
Access at:
|
||||
**http://[NODE_IP]:15672**
|
||||
(Default login: `guest/guest`, change this for security.)
|
||||
|
||||
---
|
||||
|
||||
## **Step 7: Test the Cluster**
|
||||
|
||||
Run on **each node**:
|
||||
|
||||
```bash
|
||||
rabbitmqctl list_queues
|
||||
```
|
||||
|
||||
Queues should be visible and synchronized.
|
||||
|
||||
---
|
||||
|
||||
## **Step 8: Enable Auto-Recovery** (Optional)
|
||||
|
||||
Edit `/etc/rabbitmq/rabbitmq.conf` on **each node** and add:
|
||||
|
||||
```ini
|
||||
cluster_formation.peer_discovery_backend = classic_config
|
||||
cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-node1
|
||||
cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-node2
|
||||
cluster_formation.classic_config.nodes.3 = rabbit@rabbitmq-node3
|
||||
```
|
||||
|
||||
Then restart RabbitMQ:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart rabbitmq-server
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Step 9: Secure the Cluster** (Recommended)
|
||||
|
||||
### **1. Create an Admin User**
|
||||
|
||||
```bash
|
||||
rabbitmqctl add_user admin StrongPassword123!
|
||||
rabbitmqctl set_user_tags admin administrator
|
||||
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
|
||||
```
|
||||
|
||||
Then **disable the guest account**:
|
||||
|
||||
```bash
|
||||
rabbitmqctl delete_user guest
|
||||
```
|
||||
|
||||
### **2. Enable TLS (Optional)**
|
||||
|
||||
For security, configure TLS in `/etc/rabbitmq/rabbitmq.conf`. Refer to RabbitMQ’s [TLS guide](https://www.rabbitmq.com/ssl.html).
|
||||
|
||||
---
|
||||
|
||||
## **Step 10: Setup Monitoring (Optional)**
|
||||
|
||||
Install **Prometheus & Grafana** or use **RabbitMQ Prometheus plugin**:
|
||||
|
||||
```bash
|
||||
sudo rabbitmq-plugins enable rabbitmq_prometheus
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Now your RabbitMQ cluster is fully set up with **replication and high availability**! 🚀
|
||||
|
||||
---
|
||||
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
# 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:
|
||||
|
||||
## **1️⃣ Create the Configuration File**
|
||||
|
||||
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:
|
||||
|
||||
```bash
|
||||
sudo nano /etc/rabbitmq/rabbitmq.conf
|
||||
```
|
||||
|
||||
Then add the following cluster configuration:
|
||||
|
||||
```
|
||||
cluster_formation.peer_discovery_backend = classic_config
|
||||
cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-main
|
||||
cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-replica
|
||||
```
|
||||
|
||||
Save and exit (`CTRL+X`, then `Y`, then `Enter`).
|
||||
|
||||
---
|
||||
|
||||
## **2️⃣ Set Correct Permissions**
|
||||
|
||||
Ensure the RabbitMQ user can read it:
|
||||
|
||||
```bash
|
||||
sudo chown rabbitmq:rabbitmq /etc/rabbitmq/rabbitmq.conf
|
||||
sudo chmod 644 /etc/rabbitmq/rabbitmq.conf
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **3️⃣ Restart RabbitMQ**
|
||||
|
||||
After modifying the configuration, restart the RabbitMQ service:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart rabbitmq-server
|
||||
```
|
||||
|
||||
Check the status:
|
||||
|
||||
```bash
|
||||
sudo systemctl status rabbitmq-server
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **4️⃣ Verify the Cluster Configuration**
|
||||
|
||||
After restarting, verify that clustering is working:
|
||||
|
||||
```bash
|
||||
rabbitmqctl cluster_status
|
||||
```
|
||||
|
||||
If the nodes are listed correctly, your setup is working.
|
||||
|
||||
---
|
||||
|
||||
## **5️⃣ If Using the Legacy `.config` Format**
|
||||
|
||||
Some older installations use an **Erlang-based configuration file** (`rabbitmq.config`). If you prefer that, create:
|
||||
|
||||
```bash
|
||||
sudo nano /etc/rabbitmq/rabbitmq.config
|
||||
```
|
||||
|
||||
Add this:
|
||||
|
||||
```erlang
|
||||
[
|
||||
{rabbit, [
|
||||
{cluster_formation, [
|
||||
{peer_discovery_backend, classic_config},
|
||||
{classic_config, [
|
||||
{nodes, ['rabbit@rabbitmq-main', 'rabbit@rabbitmq-replica']}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
].
|
||||
```
|
||||
|
||||
Then restart RabbitMQ:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart rabbitmq-server
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### **🔍 Troubleshooting**
|
||||
|
||||
❌ **RabbitMQ doesn't restart?**
|
||||
Check logs for errors:
|
||||
|
||||
```bash
|
||||
sudo journalctl -u rabbitmq-server --no-pager | tail -50
|
||||
```
|
||||
|
||||
❌ **Cluster not forming?**
|
||||
Try forcing a node to join manually:
|
||||
|
||||
```bash
|
||||
rabbitmqctl stop_app
|
||||
rabbitmqctl join_cluster rabbit@rabbitmq-main
|
||||
rabbitmqctl start_app
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
# Instructions to fix **unexpected** management UI authentication errors
|
||||
|
||||
stackoverflow answer [link](https://stackoverflow.com/a/40845332/27251837)
|
||||
|
||||
## Answer
|
||||
|
||||
### ❌ **Cannot login with guest/guest credentials**
|
||||
|
||||
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.
|
||||
|
||||
Do not create any config file and mess with it..
|
||||
|
||||
This is what i did then,
|
||||
|
||||
1. Add a new/fresh user, say user test and password test:
|
||||
|
||||
```bash
|
||||
rabbitmqctl add_user test test
|
||||
```
|
||||
|
||||
2. Give administrative access to the new user:
|
||||
|
||||
```bash
|
||||
rabbitmqctl set_user_tags test administrator
|
||||
```
|
||||
|
||||
3. Set permission to newly created user:
|
||||
|
||||
```bash
|
||||
rabbitmqctl set_permissions -p / test ".*" ".*" ".*"
|
||||
```
|
||||
|
||||
That's it, enjoy :)
|
||||
@ -1,87 +1,87 @@
|
||||
Install by docs from https://www.cherryservers.com/blog/install-jenkins-ubuntu
|
||||
|
||||
## Prepare installation
|
||||
|
||||
Открываю нужный сервер
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
```sh
|
||||
sudo apt update
|
||||
```
|
||||
```sh
|
||||
sudo apt upgrade
|
||||
```
|
||||
```sh
|
||||
sudo apt install openjdk-21-jdk openjdk-21-jre -y &&
|
||||
java -version
|
||||
```
|
||||
## Add Jenkins Repository
|
||||
|
||||
```sh
|
||||
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 system’s sources.list:
|
||||
```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'
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo apt install jenkins -y
|
||||
```
|
||||
If the software was installed incorrectly, you can reinstall it after uninstalling it first.:
|
||||
```sh
|
||||
sudo apt remove --purge jenkins
|
||||
```
|
||||
|
||||
```sh
|
||||
jenkins --version
|
||||
```
|
||||
|
||||
Try run jenkins without service
|
||||
```sh
|
||||
sudo -u jenkins /usr/bin/jenkins --httpPort=8081 --httpListenAddress=0.0.0.0
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo mcedit /lib/systemd/system/jenkins.service
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl start jenkins &&
|
||||
sudo systemctl enable jenkins &&
|
||||
sudo systemctl status jenkins
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo journalctl -xeu jenkins.service | tail -n 50
|
||||
```
|
||||
Если порт занят, проверяем кем:
|
||||
```sh
|
||||
sudo lsof -i :8081
|
||||
```
|
||||
Переопределяем порт:
|
||||
```sh
|
||||
sudo mcedit /etc/default/jenkins
|
||||
```
|
||||
```conf
|
||||
HTTP_PORT=8081
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl restart jenkins
|
||||
```
|
||||
|
||||
```sh
|
||||
start http://127.0.0.1:8081
|
||||
```
|
||||
|
||||
|
||||
See what port in locked
|
||||
```sh
|
||||
netstat -tpln
|
||||
Install by docs from https://www.cherryservers.com/blog/install-jenkins-ubuntu
|
||||
|
||||
## Prepare installation
|
||||
|
||||
Открываю нужный сервер
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
```sh
|
||||
sudo apt update
|
||||
```
|
||||
```sh
|
||||
sudo apt upgrade
|
||||
```
|
||||
```sh
|
||||
sudo apt install openjdk-21-jdk openjdk-21-jre -y &&
|
||||
java -version
|
||||
```
|
||||
## Add Jenkins Repository
|
||||
|
||||
```sh
|
||||
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 system’s sources.list:
|
||||
```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'
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo apt install jenkins -y
|
||||
```
|
||||
If the software was installed incorrectly, you can reinstall it after uninstalling it first.:
|
||||
```sh
|
||||
sudo apt remove --purge jenkins
|
||||
```
|
||||
|
||||
```sh
|
||||
jenkins --version
|
||||
```
|
||||
|
||||
Try run jenkins without service
|
||||
```sh
|
||||
sudo -u jenkins /usr/bin/jenkins --httpPort=8081 --httpListenAddress=0.0.0.0
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo mcedit /lib/systemd/system/jenkins.service
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl start jenkins &&
|
||||
sudo systemctl enable jenkins &&
|
||||
sudo systemctl status jenkins
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo journalctl -xeu jenkins.service | tail -n 50
|
||||
```
|
||||
Если порт занят, проверяем кем:
|
||||
```sh
|
||||
sudo lsof -i :8081
|
||||
```
|
||||
Переопределяем порт:
|
||||
```sh
|
||||
sudo mcedit /etc/default/jenkins
|
||||
```
|
||||
```conf
|
||||
HTTP_PORT=8081
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl restart jenkins
|
||||
```
|
||||
|
||||
```sh
|
||||
start http://127.0.0.1:8081
|
||||
```
|
||||
|
||||
|
||||
See what port in locked
|
||||
```sh
|
||||
netstat -tpln
|
||||
```
|
||||
83
CI_CD/Woodpecker_CI.md
Normal file
83
CI_CD/Woodpecker_CI.md
Normal 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
|
||||
```
|
||||
|
||||
|
||||
@ -1,138 +1,139 @@
|
||||
# 📌 Установка Gotify в Docker на Ubuntu 24.04
|
||||
|
||||
## 1. Установка Docker и Docker Compose
|
||||
Если Docker не установлен, установим его:
|
||||
```sh
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
sudo apt install -y docker.io docker-compose
|
||||
sudo systemctl enable --now docker
|
||||
```
|
||||
Проверим версию:
|
||||
```sh
|
||||
docker --version
|
||||
docker-compose --version
|
||||
```
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
|
||||
## 2. Создание директории для Gotify
|
||||
Лучшее место для сторонних сервисов — `/opt`:
|
||||
```sh
|
||||
sudo mkdir -p /opt/gotify
|
||||
cd /opt/gotify
|
||||
```
|
||||
|
||||
## 3. Создаём самоподписанный сертификат
|
||||
```sh
|
||||
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"
|
||||
```
|
||||
----------------------------------------------------------------------------------------------------
|
||||
|
||||
## 3. Создание `docker-compose.yml`
|
||||
Создадим конфигурацию:
|
||||
```sh
|
||||
sudo mcedit /opt/gotify/docker-compose.yml
|
||||
```
|
||||
Добавляем:
|
||||
```yaml
|
||||
services:
|
||||
gotify:
|
||||
image: gotify/server
|
||||
container_name: gotify
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- "./certs:/certs"
|
||||
- "./data:/app/data"
|
||||
ports:
|
||||
- "8080:443" # HTTPS
|
||||
environment:
|
||||
- GOTIFY_DEFAULTUSER_NAME=admin
|
||||
- GOTIFY_DEFAULTUSER_PASS=s23uBXreliGIAVOohXhW
|
||||
- TZ=Asia/Almaty
|
||||
- GOTIFY_SERVER_SSL_ENABLED=true
|
||||
- GOTIFY_SERVER_SSL_CERTFILE=/certs/gotify.crt
|
||||
- GOTIFY_SERVER_SSL_CERTKEY=/certs/gotify.key
|
||||
networks:
|
||||
- gotify-net
|
||||
|
||||
networks:
|
||||
gotify-net:
|
||||
driver: bridge
|
||||
```
|
||||
💡 **Что здесь важно?**
|
||||
- **`security_opt: - no-new-privileges:true`** → запрещает повышать привилегии в контейнере.
|
||||
- **`volumes: ./data:/app/data`** → сохраняет данные вне контейнера.
|
||||
- **`restart: unless-stopped`** → перезапускает Gotify, если он внезапно упадёт.
|
||||
- **`ports: - "8080:80"`** → Gotify будет доступен на порту `8080`.
|
||||
|
||||
🔑 **Замените пароль** (`supersecretpassword`) на свой!
|
||||
|
||||
---
|
||||
|
||||
## 4. Запуск Gotify
|
||||
Запускаем контейнер:
|
||||
```sh
|
||||
cd /opt/gotify
|
||||
sudo docker compose down
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
Проверяем статус:
|
||||
```sh
|
||||
sudo docker ps
|
||||
```
|
||||
Вы должны увидеть работающий контейнер `gotify`.
|
||||
|
||||
---
|
||||
|
||||
## 5. Проверка работы
|
||||
Открываем браузер и переходим:
|
||||
👉 **https://192.168.200.84:8080**
|
||||
👉 **https://gotify.locust.kz:8443**
|
||||
|
||||
Логинимся:
|
||||
- **Имя**: `admin`
|
||||
- **Пароль**: тот, что указан в `GOTIFY_DEFAULTUSER_PASS`
|
||||
|
||||
---
|
||||
|
||||
## 6. Автоматический запуск при загрузке
|
||||
Docker уже настроен на автозапуск, но проверим:
|
||||
```sh
|
||||
sudo systemctl enable --now docker
|
||||
```
|
||||
Чтобы Gotify запускался автоматически:
|
||||
```sh
|
||||
cd /opt/gotify
|
||||
sudo docker-compose restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. Логи и управление
|
||||
Просмотр логов:
|
||||
```sh
|
||||
sudo docker-compose logs -f
|
||||
```
|
||||
Перезапуск контейнера:
|
||||
```sh
|
||||
sudo docker-compose restart
|
||||
```
|
||||
Остановка:
|
||||
```sh
|
||||
sudo docker-compose down
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. Удаление Gotify (если потребуется)
|
||||
```sh
|
||||
cd /opt/gotify
|
||||
sudo docker-compose down
|
||||
sudo rm -rf /opt/gotify
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ Готово!
|
||||
Теперь Gotify работает на порту `80` с безопасными настройками (`no-new-privileges:true`). 🚀
|
||||
# 📌 Установка Gotify в Docker на Ubuntu 24.04
|
||||
|
||||
## 1. Установка Docker и Docker Compose
|
||||
Если Docker не установлен, установим его:
|
||||
```sh
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
sudo apt install -y docker.io docker-compose
|
||||
sudo systemctl enable --now docker
|
||||
```
|
||||
Проверим версию:
|
||||
```sh
|
||||
docker --version
|
||||
docker-compose --version
|
||||
```
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
|
||||
## 2. Создание директории для Gotify
|
||||
Лучшее место для сторонних сервисов — `/opt`:
|
||||
```sh
|
||||
sudo mkdir -p /opt/gotify
|
||||
cd /opt/gotify
|
||||
```
|
||||
|
||||
## 3. Создаём самоподписанный сертификат
|
||||
```sh
|
||||
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"
|
||||
```
|
||||
----------------------------------------------------------------------------------------------------
|
||||
|
||||
## 3. Создание `docker-compose.yml`
|
||||
Создадим конфигурацию:
|
||||
```sh
|
||||
sudo mcedit /opt/gotify/docker-compose.yml
|
||||
```
|
||||
Добавляем:
|
||||
```yaml
|
||||
services:
|
||||
gotify:
|
||||
image: gotify/server
|
||||
container_name: gotify
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- "./certs:/certs"
|
||||
- "./data:/app/data"
|
||||
ports:
|
||||
- "8080:443" # HTTPS
|
||||
environment:
|
||||
- GOTIFY_DEFAULTUSER_NAME=admin
|
||||
- GOTIFY_DEFAULTUSER_PASS=s23uBXreliGIAVOohXhW
|
||||
- TZ=Asia/Almaty
|
||||
- GOTIFY_SERVER_SSL_ENABLED=true
|
||||
- GOTIFY_SERVER_SSL_CERTFILE=/certs/gotify.crt
|
||||
- GOTIFY_SERVER_SSL_CERTKEY=/certs/gotify.key
|
||||
- GIN_MODE=debug
|
||||
networks:
|
||||
- gotify-net
|
||||
|
||||
networks:
|
||||
gotify-net:
|
||||
driver: bridge
|
||||
```
|
||||
💡 **Что здесь важно?**
|
||||
- **`security_opt: - no-new-privileges:true`** → запрещает повышать привилегии в контейнере.
|
||||
- **`volumes: ./data:/app/data`** → сохраняет данные вне контейнера.
|
||||
- **`restart: unless-stopped`** → перезапускает Gotify, если он внезапно упадёт.
|
||||
- **`ports: - "8080:80"`** → Gotify будет доступен на порту `8080`.
|
||||
|
||||
🔑 **Замените пароль** (`supersecretpassword`) на свой!
|
||||
|
||||
---
|
||||
|
||||
## 4. Запуск Gotify
|
||||
Запускаем контейнер:
|
||||
```sh
|
||||
cd /opt/gotify
|
||||
sudo docker compose down
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
Проверяем статус:
|
||||
```sh
|
||||
sudo docker ps
|
||||
```
|
||||
Вы должны увидеть работающий контейнер `gotify`.
|
||||
|
||||
---
|
||||
|
||||
## 5. Проверка работы
|
||||
Открываем браузер и переходим:
|
||||
👉 **https://192.168.200.84:8080**
|
||||
👉 **https://gotify.locust.kz:8443**
|
||||
|
||||
Логинимся:
|
||||
- **Имя**: `admin`
|
||||
- **Пароль**: тот, что указан в `GOTIFY_DEFAULTUSER_PASS`
|
||||
|
||||
---
|
||||
|
||||
## 6. Автоматический запуск при загрузке
|
||||
Docker уже настроен на автозапуск, но проверим:
|
||||
```sh
|
||||
sudo systemctl enable --now docker
|
||||
```
|
||||
Чтобы Gotify запускался автоматически:
|
||||
```sh
|
||||
cd /opt/gotify
|
||||
sudo docker-compose restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. Логи и управление
|
||||
Просмотр логов:
|
||||
```sh
|
||||
sudo docker-compose logs -f
|
||||
```
|
||||
Перезапуск контейнера:
|
||||
```sh
|
||||
sudo docker-compose restart
|
||||
```
|
||||
Остановка:
|
||||
```sh
|
||||
sudo docker-compose down
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. Удаление Gotify (если потребуется)
|
||||
```sh
|
||||
cd /opt/gotify
|
||||
sudo docker-compose down
|
||||
sudo rm -rf /opt/gotify
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ Готово!
|
||||
Теперь Gotify работает на порту `80` с безопасными настройками (`no-new-privileges:true`). 🚀
|
||||
@ -1,38 +1,38 @@
|
||||
Открываю нужный сервер
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
|
||||
```sh
|
||||
curl -sSX POST https://istt-kz.zulipchat.com/api/v1/fetch_api_key \
|
||||
--data-urlencode username=ivanov.i@istt.kz \
|
||||
--data-urlencode password=fsUHb3hf3QCdpBLsKyhL
|
||||
```
|
||||
Выдало:
|
||||
```json
|
||||
{
|
||||
"result":"success",
|
||||
"msg":"",
|
||||
"api_key":"91kQqr13HCwFP2HeARWPHxrfksYPH82p",
|
||||
"email":"ivanov.i@istt.kz",
|
||||
"user_id":880555
|
||||
}
|
||||
```
|
||||
|
||||
```sh
|
||||
curl -X POST https://istt-kz.zulipchat.com/api/v1/messages \
|
||||
-u "ivanov.i@istt.kz:91kQqr13HCwFP2HeARWPHxrfksYPH82p" \
|
||||
-d "type=stream" \
|
||||
-d "to=general" \
|
||||
-d "topic=Тест5" \
|
||||
-d "content=Привет из консоли!"
|
||||
```
|
||||
|
||||
```sh
|
||||
curl -X POST https://istt-kz.zulipchat.com/api/v1/messages \
|
||||
-u "ivanov.i@istt.kz:91kQqr13HCwFP2HeARWPHxrfksYPH82p" \
|
||||
-d "type=private" \
|
||||
-d "to=ivanov.i@istt.kz" \
|
||||
-d "topic=Тест5" \
|
||||
-d "content=Привет из консоли!"
|
||||
```
|
||||
Открываю нужный сервер
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
|
||||
```sh
|
||||
curl -sSX POST https://istt-kz.zulipchat.com/api/v1/fetch_api_key \
|
||||
--data-urlencode username=ivanov.i@istt.kz \
|
||||
--data-urlencode password=fsUHb3hf3QCdpBLsKyhL
|
||||
```
|
||||
Выдало:
|
||||
```json
|
||||
{
|
||||
"result":"success",
|
||||
"msg":"",
|
||||
"api_key":"91kQqr13HCwFP2HeARWPHxrfksYPH82p",
|
||||
"email":"ivanov.i@istt.kz",
|
||||
"user_id":880555
|
||||
}
|
||||
```
|
||||
|
||||
```sh
|
||||
curl -X POST https://istt-kz.zulipchat.com/api/v1/messages \
|
||||
-u "ivanov.i@istt.kz:91kQqr13HCwFP2HeARWPHxrfksYPH82p" \
|
||||
-d "type=stream" \
|
||||
-d "to=general" \
|
||||
-d "topic=Тест5" \
|
||||
-d "content=Привет из консоли!"
|
||||
```
|
||||
|
||||
```sh
|
||||
curl -X POST https://istt-kz.zulipchat.com/api/v1/messages \
|
||||
-u "ivanov.i@istt.kz:91kQqr13HCwFP2HeARWPHxrfksYPH82p" \
|
||||
-d "type=private" \
|
||||
-d "to=ivanov.i@istt.kz" \
|
||||
-d "topic=Тест5" \
|
||||
-d "content=Привет из консоли!"
|
||||
```
|
||||
215
DNS/BIND_install.md
Normal file
215
DNS/BIND_install.md
Normal 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
|
||||
@ -2,7 +2,7 @@
|
||||
****************************************************************************************************
|
||||
## 2. Подключаемся к нужному серверу
|
||||
```sh
|
||||
ssh igor@192.168.200.85 -p 22
|
||||
ssh root@bigfoottrade.kz -p 2222
|
||||
```
|
||||
Connect to CCALM Georgia infrastructure:
|
||||
```sh
|
||||
@ -15,31 +15,32 @@ DNS на Ubuntu 24.04 согласно инстркции https://phoenixnap.com
|
||||
Можно было-бы использовать не 53 порт, но провайдер не даёт указывать порт при настройке DNS серверов (не знаю какие локальные проблемы могут возникнуть если задать не 53 порт)
|
||||
Устанавливаем сам 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
|
||||
sudo apt-get update &&
|
||||
sudo apt-get upgrade -y
|
||||
```
|
||||
|
||||
Install PowerDNS server
|
||||
```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 смотри:
|
||||
[Установка PowerDNS с MariaDB](./PowerDNS_install_MarinaDB.md)
|
||||
----------------------------------------------------------------------------------------------------
|
||||
Как настроить SQLite3 базу для использования в PowerDNS смотри:
|
||||
[Установка PowerDNS с MariaDB](./PowerDNS_install_SQIite3.md)
|
||||
[Установка PowerDNS с SQIite3](./PowerDNS_install_SQIite3.md)
|
||||
----------------------------------------------------------------------------------------------------
|
||||
Как настроить 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й табуляции):
|
||||
@ -48,6 +49,12 @@ sudo cp pdns.conf pdns.conf.bak
|
||||
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
|
||||
```sh
|
||||
cd /etc/powerdns/ &&
|
||||
@ -57,9 +64,10 @@ allow-axfr-ips=127.0.0.1
|
||||
also-notify=127.0.0.1
|
||||
|
||||
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
|
||||
|
||||
log-dns-details=on
|
||||
@ -68,9 +76,9 @@ log-timestamp=yes
|
||||
loglevel=4
|
||||
|
||||
webserver=yes
|
||||
webserver-address=127.0.0.1
|
||||
webserver-address=0.0.0.0
|
||||
webserver-allow-from=::/0, 0.0.0.0/0
|
||||
webserver-port=8091
|
||||
webserver-port=8070
|
||||
|
||||
master=yes
|
||||
slave=no
|
||||
@ -80,14 +88,28 @@ api=yes
|
||||
api-key=40c89f2a-e2f3-4ff8-a245-3547111f6677
|
||||
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:
|
||||
```sh
|
||||
sudo systemctl stop pdns &&
|
||||
sudo pdns_server --daemon=no --guardian=no --loglevel=9
|
||||
```
|
||||
|
||||
|
||||
|
||||
Пытаемся открыть WEB интерфейс
|
||||
```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 add-record test ccalm A 192.168.200.184
|
||||
```
|
||||
Добавляем зону и две записи
|
||||
Добавляем зону и записи
|
||||
|
||||
```sh
|
||||
sudo pdnsutil create-zone geovizor.top ns1.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 ns1 A 88.218.94.134 &&
|
||||
sudo pdnsutil add-record geovizor.top ns2 A 88.218.94.134 &&
|
||||
sudo pdnsutil add-record geovizor.top @ A 88.218.94.134 &&
|
||||
sudo pdnsutil add-record geovizor.top * A 88.218.94.134 &&
|
||||
sudo pdnsutil add-record geovizor.top @ CAA 3600 "0 issue \"letsencrypt.org\"" &&
|
||||
sudo pdnsutil add-record geovizor.top @ TXT 3600 "\"v=spf1 ip4:88.218.94.134 -all\"" &&
|
||||
sudo pdnsutil add-record geovizor.top @ MX 3600 "10 mail.geovizor.top." &&
|
||||
sudo pdnsutil add-record geovizor.top mail A 3600 88.218.94.134 &&
|
||||
sudo pdnsutil add-record geovizor.top powerdns A 3600 88.218.94.134
|
||||
sudo pdnsutil create-zone mesh.kz &&
|
||||
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 mesh.kz @ A 5.251.150.30 &&
|
||||
sudo pdnsutil add-record mesh.kz "*" A 5.251.150.30 &&
|
||||
sudo pdnsutil add-record mesh.kz @ CAA 3600 "0 issue \"letsencrypt.org\"" &&
|
||||
sudo pdnsutil add-record mesh.kz @ TXT 3600 "\"v=spf1 ip4:77.240.38.108 -all\"" &&
|
||||
sudo pdnsutil add-record mesh.kz @ MX 3600 "10 mail.mesh.kz." &&
|
||||
sudo pdnsutil add-record mesh.kz mail A 3600 77.240.38.108
|
||||
sudo pdnsutil add-record mesh.kz @ NS 3600 ns1.mesh.kz
|
||||
sudo pdnsutil add-record mesh.kz @ NS 3600 ns2.mesh.kz
|
||||
```
|
||||
|
||||
```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
|
||||
Refresh = 10800 (3 часа)
|
||||
@ -137,12 +224,15 @@ Minimum = 3600 (1 час)
|
||||
Проверим список зон
|
||||
```sh
|
||||
sudo pdnsutil list-all-zones &&
|
||||
sudo pdnsutil list-zone geovizor.top
|
||||
sudo pdnsutil list-zone mesh.kz
|
||||
```
|
||||
Проверяем отвечалет ли:
|
||||
```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
|
||||
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 адресов
|
||||
|
||||
```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"
|
||||
SERVER="156.244.31.209"
|
||||
ZONE="geovizor.top"
|
||||
@ -182,8 +288,6 @@ curl -X PATCH \
|
||||
}'
|
||||
```
|
||||
|
||||
|
||||
|
||||
## ********** Настройка рекурсивного DNS от PowerDNS Recursor 4.9.3 порту 53 будет обрабатывать запросы с локальной машины **********
|
||||
Документация: https://doc.powerdns.com/recursor/index.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)
|
||||
```sh
|
||||
@ -526,7 +630,7 @@ open http://192.168.200.85:9191/login
|
||||
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
Настраиваем запус на постоянную работу через Gunicorn и systemd
|
||||
Настраиваем запуск на постоянную работу через Gunicorn и systemd
|
||||
|
||||
```sh
|
||||
cd /opt/web/powerdns-admin &&
|
||||
@ -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/
|
||||
|
||||
|
||||
|
||||
|
||||
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
52
DNS/Ubuntu_config.md
Normal 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
|
||||
```
|
||||
@ -1,94 +1,94 @@
|
||||
```sh
|
||||
sudo apt update &&
|
||||
sudo apt install unbound -y &&
|
||||
unbound -V
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl start unbound &&
|
||||
sudo systemctl enable unbound &&
|
||||
sudo systemctl status unbound
|
||||
```
|
||||
On Windows configuration is:
|
||||
|
||||
```yaml
|
||||
server:
|
||||
verbosity: 4
|
||||
qname-minimisation: no
|
||||
interface: 127.0.0.1
|
||||
do-ip6: no
|
||||
do-ip4: yes
|
||||
logfile: "C:\unbound.log"
|
||||
domain-insecure: "test."
|
||||
domain-insecure: "local."
|
||||
domain-insecure: "pizza."
|
||||
auto-trust-anchor-file: "C:\Program Files\Unbound\root.key"
|
||||
private-address: ::/0
|
||||
harden-dnssec-stripped: no
|
||||
harden-referral-path: no
|
||||
|
||||
# Явно указываем, что зона "test." не локальная
|
||||
local-zone: "test." transparent
|
||||
|
||||
forward-zone:
|
||||
name: "test."
|
||||
forward-addr: 192.168.200.85@5300
|
||||
|
||||
forward-zone:
|
||||
name: "local."
|
||||
forward-addr: 192.168.200.85@5300
|
||||
|
||||
forward-zone:
|
||||
name: "pizza."
|
||||
forward-addr: 10.101.1.31@53
|
||||
|
||||
forward-zone:
|
||||
name: "srv."
|
||||
forward-addr: 10.101.1.31@53
|
||||
|
||||
remote-control:
|
||||
control-enable: yes
|
||||
control-interface: 127.0.0.1
|
||||
control-use-cert: no
|
||||
```
|
||||
|
||||
On Linux conf file devide on anoter files
|
||||
```sh
|
||||
sudo mcedit /etc/unbound/unbound.conf
|
||||
```
|
||||
|
||||
```sh
|
||||
cd /etc/unbound/ &&
|
||||
sudo mc
|
||||
```
|
||||
|
||||
Получить полный список локальных зон можно так: unbound-control
|
||||
```sh
|
||||
unbound-control list_local_zones
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl restart unbound
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl status unbound.service
|
||||
```
|
||||
```sh
|
||||
sudo journalctl -xeu unbound.service
|
||||
```
|
||||
|
||||
Check on errors:
|
||||
```sh
|
||||
sudo unbound-checkconf /etc/unbound/unbound.conf
|
||||
```
|
||||
|
||||
|
||||
Прописываем для определенного интерфейса:
|
||||
```sh
|
||||
sudo resolvectl dns wlp14s0 127.0.0.1
|
||||
```
|
||||
Проверяем что стоит в качестве NDS резольвера
|
||||
```sh
|
||||
resolvectl status
|
||||
```
|
||||
```sh
|
||||
sudo apt update &&
|
||||
sudo apt install unbound -y &&
|
||||
unbound -V
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl start unbound &&
|
||||
sudo systemctl enable unbound &&
|
||||
sudo systemctl status unbound
|
||||
```
|
||||
On Windows configuration is:
|
||||
|
||||
```yaml
|
||||
server:
|
||||
verbosity: 4
|
||||
qname-minimisation: no
|
||||
interface: 127.0.0.1
|
||||
do-ip6: no
|
||||
do-ip4: yes
|
||||
logfile: "C:\unbound.log"
|
||||
domain-insecure: "test."
|
||||
domain-insecure: "local."
|
||||
domain-insecure: "pizza."
|
||||
auto-trust-anchor-file: "C:\Program Files\Unbound\root.key"
|
||||
private-address: ::/0
|
||||
harden-dnssec-stripped: no
|
||||
harden-referral-path: no
|
||||
|
||||
# Явно указываем, что зона "test." не локальная
|
||||
local-zone: "test." transparent
|
||||
|
||||
forward-zone:
|
||||
name: "test."
|
||||
forward-addr: 192.168.200.85@5300
|
||||
|
||||
forward-zone:
|
||||
name: "local."
|
||||
forward-addr: 192.168.200.85@5300
|
||||
|
||||
forward-zone:
|
||||
name: "pizza."
|
||||
forward-addr: 10.101.1.31@53
|
||||
|
||||
forward-zone:
|
||||
name: "srv."
|
||||
forward-addr: 10.101.1.31@53
|
||||
|
||||
remote-control:
|
||||
control-enable: yes
|
||||
control-interface: 127.0.0.1
|
||||
control-use-cert: no
|
||||
```
|
||||
|
||||
On Linux conf file devide on anoter files
|
||||
```sh
|
||||
sudo mcedit /etc/unbound/unbound.conf
|
||||
```
|
||||
|
||||
```sh
|
||||
cd /etc/unbound/ &&
|
||||
sudo mc
|
||||
```
|
||||
|
||||
Получить полный список локальных зон можно так: unbound-control
|
||||
```sh
|
||||
unbound-control list_local_zones
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl restart unbound
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl status unbound.service
|
||||
```
|
||||
```sh
|
||||
sudo journalctl -xeu unbound.service
|
||||
```
|
||||
|
||||
Check on errors:
|
||||
```sh
|
||||
sudo unbound-checkconf /etc/unbound/unbound.conf
|
||||
```
|
||||
|
||||
|
||||
Прописываем для определенного интерфейса:
|
||||
```sh
|
||||
sudo resolvectl dns wlp14s0 127.0.0.1
|
||||
```
|
||||
Проверяем что стоит в качестве NDS резольвера
|
||||
```sh
|
||||
resolvectl status
|
||||
```
|
||||
@ -57,7 +57,7 @@ WantedBy=multi-user.target
|
||||
На клиенте запускаем локальный порт также указал 9999 а ключь
|
||||
```sh
|
||||
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
218
Keycloak_install.md
Normal 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
171
Logs/Vector_dev_install.md
Normal 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` в конфигурации.
|
||||
434
Logs/Vector_dev_install_telegram.md
Normal file
434
Logs/Vector_dev_install_telegram.md
Normal 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` в конфигурации.
|
||||
@ -11,7 +11,7 @@ ssh igor@88.218.94.134 -p 2200
|
||||
----------------------------------------------------------------------------------------------------
|
||||
```sh
|
||||
sudo apt-get update &&
|
||||
sudo apt-get install nginx
|
||||
sudo apt-get install nginx -y
|
||||
```
|
||||
Настройка самоподписанного сертификата для SSL nginx
|
||||
```sh
|
||||
@ -19,36 +19,56 @@ sudo apt-get install nginx
|
||||
```
|
||||
Самой важной строкой является Common Name (введите FQDN или свое имя). Как правило, в эту строку вносят доменное имя, с которым нужно связать сервер. В случае если доменного имени нет, внесите в эту строку IP-адрес сервера.
|
||||
```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_key /etc/ssl/private/nginx-selfsigned.key;
|
||||
ssl_dhparam /etc/nginx/dhparam.pem;
|
||||
|
||||
root /opt/www/istransit.kg;
|
||||
index index.html index.htm;
|
||||
|
||||
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
|
||||
sudo systemctl restart nginx
|
||||
```
|
||||
|
||||
Журнал последних 50 записей
|
||||
```sh
|
||||
journalctl -u nginx.service -n 50
|
||||
```
|
||||
|
||||
Также есть такие команды:
|
||||
nginx -s stop — быстрое завершение
|
||||
nginx -s quit — плавное завершение
|
||||
@ -67,24 +87,36 @@ server {
|
||||
cd /etc/nginx/sites-available/ &&
|
||||
sudo tee geovizor.top > /dev/null <<'EOF'
|
||||
server {
|
||||
listen 8081;
|
||||
listen [::]:8081;
|
||||
listen 8081;
|
||||
listen [::]:8081;
|
||||
|
||||
root /opt/www/istransit.kz;
|
||||
index index.html;
|
||||
root /opt/www/istransit.kz;
|
||||
index index.html;
|
||||
|
||||
server_name istransit.kz www.istransit.kz;
|
||||
server_name istransit.kz www.istransit.kz;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ =404;
|
||||
}
|
||||
location / {
|
||||
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
|
||||
```
|
||||
|
||||
|
||||
Теперь можно включить виртуальный хост:
|
||||
```sh
|
||||
sudo ln -s /etc/nginx/sites-available/istransit.kz /etc/nginx/sites-enabled/
|
||||
```
|
||||
Проверяем правильность конфигурации:
|
||||
```sh
|
||||
sudo nginx -t
|
||||
```
|
||||
Перезапускаем:
|
||||
sudo systemctl restart nginx
|
||||
```sh
|
||||
sudo systemctl restart nginx
|
||||
```
|
||||
@ -1,66 +1,68 @@
|
||||
# Установка Uptime Kuma в Ubuntu 24.04 с помощью Docker Compose
|
||||
|
||||
## 1. Установка необходимых пакетов
|
||||
Обновите систему и установите Docker и Docker Compose:
|
||||
|
||||
```sh
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
sudo apt install -y docker.io docker-compose
|
||||
```
|
||||
|
||||
## 2. Создание директории для Uptime Kuma
|
||||
```sh
|
||||
sudo mkdir -p /opt/uptime-kuma
|
||||
cd /opt/uptime-kuma
|
||||
```
|
||||
|
||||
## 3. Создание `docker-compose.yml`
|
||||
Создайте файл `docker-compose.yml`:
|
||||
|
||||
```sh
|
||||
sudo mcedit /opt/uptime-kuma/docker-compose.yml
|
||||
```
|
||||
|
||||
Вставьте следующий конфигурационный файл:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
uptime-kuma:
|
||||
image: louislam/uptime-kuma:latest
|
||||
container_name: uptime-kuma
|
||||
restart: always
|
||||
ports:
|
||||
- "3001:3001"
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
```
|
||||
|
||||
## 4. Запуск контейнера
|
||||
```sh
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
|
||||
## 5. Проверка работы Uptime Kuma
|
||||
Откройте браузер и перейдите по адресу:
|
||||
|
||||
```sh
|
||||
start http://192.168.200.84:3001
|
||||
```
|
||||
|
||||
## 6. Управление контейнером
|
||||
- **Остановить Uptime Kuma:**
|
||||
```sh
|
||||
sudo docker-compose down
|
||||
```
|
||||
- **Перезапустить контейнер:**
|
||||
```sh
|
||||
sudo docker-compose restart
|
||||
```
|
||||
- **Просмотреть логи:**
|
||||
|
||||
```sh
|
||||
sudo docker-compose logs -f
|
||||
```
|
||||
|
||||
Готово! Uptime Kuma установлен и запущен в Docker на Ubuntu 24.04. 🚀
|
||||
|
||||
# Установка Uptime Kuma в Ubuntu 24.04 с помощью Docker Compose
|
||||
|
||||
## 1. Установка необходимых пакетов
|
||||
Обновите систему и установите Docker и Docker Compose:
|
||||
|
||||
```sh
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
sudo apt install -y docker.io docker-compose
|
||||
```
|
||||
|
||||
## 2. Создание директории для Uptime Kuma
|
||||
```sh
|
||||
sudo mkdir -p /opt/uptime-kuma
|
||||
cd /opt/uptime-kuma
|
||||
```
|
||||
|
||||
## 3. Создание `docker-compose.yml`
|
||||
Создайте файл `docker-compose.yml`:
|
||||
|
||||
```sh
|
||||
sudo mcedit /opt/uptime-kuma/docker-compose.yml
|
||||
```
|
||||
|
||||
Вставьте следующий конфигурационный файл:
|
||||
В кодфиге прописан корневой сертификат чтобы node.js ему доверял
|
||||
```yaml
|
||||
services:
|
||||
uptime-kuma:
|
||||
image: louislam/uptime-kuma:latest
|
||||
container_name: uptime-kuma
|
||||
restart: always
|
||||
ports:
|
||||
- "3001:3001"
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
- /usr/local/share/ca-certificates:/usr/local/share/ca-certificates:ro
|
||||
environment:
|
||||
- NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/rootCA.crt
|
||||
```
|
||||
|
||||
## 4. Запуск контейнера
|
||||
```sh
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
|
||||
## 5. Проверка работы Uptime Kuma
|
||||
Откройте браузер и перейдите по адресу:
|
||||
|
||||
```sh
|
||||
start http://192.168.200.84:3001
|
||||
```
|
||||
|
||||
## 6. Управление контейнером
|
||||
- **Остановить Uptime Kuma:**
|
||||
```sh
|
||||
sudo docker-compose down
|
||||
```
|
||||
- **Перезапустить контейнер:**
|
||||
```sh
|
||||
sudo docker-compose restart
|
||||
```
|
||||
- **Просмотреть логи:**
|
||||
|
||||
```sh
|
||||
sudo docker-compose logs -f
|
||||
```
|
||||
|
||||
Готово! Uptime Kuma установлен и запущен в Docker на Ubuntu 24.04. 🚀
|
||||
@ -1,18 +1,27 @@
|
||||
|
||||
https://documentation.wazuh.com/current/installation-guide/wazuh-server/installation-assistant.html
|
||||
|
||||
Подключаемся к нужному серверу:
|
||||
Connectiong to server:
|
||||
```sh
|
||||
ssh igor@192.168.200.86
|
||||
```
|
||||
|
||||
Execute installation commman:
|
||||
```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
|
||||
```
|
||||
|
||||
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
|
||||
start https://192.168.200.86:443
|
||||
open https://127.0.0.1:443
|
||||
```
|
||||
Компонент Порт по умолчанию Доступ
|
||||
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
|
||||
```
|
||||
|
||||
Инициализируем кластер безопасности:
|
||||
|
||||
|
||||
|
||||
Временно отключаю аудит:
|
||||
```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/ \
|
||||
-icl -nhnv \
|
||||
-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
|
||||
```
|
||||
|
||||
Перезагружаем после применения настроек
|
||||
```sh
|
||||
sudo systemctl restart wazuh-indexer
|
||||
```
|
||||
|
||||
|
||||
Проверьте конфигурацию аудита в файле /etc/wazuh-indexer/opensearch.yml:
|
||||
```sh
|
||||
@ -102,3 +124,6 @@ opensearch_security.audit.enable_transport: true
|
||||
```sh
|
||||
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
|
||||
@ -1,141 +1,141 @@
|
||||
Устанавливаю согласно инструкции из:
|
||||
|
||||
https://github.com/prometheus-community/postgres_exporter
|
||||
|
||||
Подключаюсь к нужной машине
|
||||
```sh
|
||||
ssh igor@ccalm.org -p 2200
|
||||
```
|
||||
|
||||
Configure postgresql.conf
|
||||
```conf
|
||||
shared_preload_libraries = 'pg_stat_statements'
|
||||
pg_stat_statements.track = all
|
||||
```
|
||||
|
||||
## 1. Установка Docker и Docker Compose
|
||||
Если Docker не установлен, установим его:
|
||||
```sh
|
||||
sudo apt update && sudo apt upgrade -y &&
|
||||
sudo apt install -y docker.io docker-compose &&
|
||||
sudo systemctl enable --now docker
|
||||
```
|
||||
|
||||
## 2. Установка postgres-exporter в докере из заранее подготовленного образа
|
||||
|
||||
```sh
|
||||
sudo mkdir -p /opt/postgres-exporter &&
|
||||
sudo chown $USER:$USER /opt/postgres-exporter &&
|
||||
cd /opt/postgres-exporter
|
||||
```
|
||||
|
||||
Создаю файл с настройками
|
||||
```sh
|
||||
cd /opt/postgres-exporter/ &&
|
||||
cat > docker-compose.yml <<'EOF'
|
||||
services:
|
||||
postgres-exporter:
|
||||
image: quay.io/prometheuscommunity/postgres-exporter
|
||||
container_name: postgres-exporter
|
||||
restart: unless-stopped
|
||||
network_mode: "host"
|
||||
environment:
|
||||
DATA_SOURCE_URI: "postgresql://postgres:309A86FF65A78FB428F4E38DFE35F730@localhost:5432/postgres?sslmode=disable"
|
||||
volumes:
|
||||
- ./postgres_exporter.yml:/etc/postgres_exporter.yml
|
||||
command:
|
||||
- "--config.file=/etc/postgres_exporter.yml"
|
||||
|
||||
EOF
|
||||
```
|
||||
|
||||
Создаём файл с настройками
|
||||
```sh
|
||||
cd /opt/postgres-exporter/ &&
|
||||
cat > postgres_exporter.yml <<'EOF'
|
||||
collectors:
|
||||
- database
|
||||
- index
|
||||
- query
|
||||
- table
|
||||
EOF
|
||||
```
|
||||
Запускаю:
|
||||
```sh
|
||||
cd /opt/postgres-exporter &&
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
|
||||
Проверяю запущен ли докер
|
||||
```sh
|
||||
sudo docker ps
|
||||
```
|
||||
|
||||
Testing with:
|
||||
```sh
|
||||
curl "http://127.0.0.1:9187/metrics"
|
||||
```
|
||||
|
||||
Посмотреть журнал за сегодня:
|
||||
```sh
|
||||
journalctl --since today
|
||||
```
|
||||
|
||||
Настраиваем простую авторизацию при помощи HAProxy для скачивания при помощи удаленного сервера
|
||||
|
||||
```sh
|
||||
sudo mcedit /etc/haproxy/haproxy.cfg
|
||||
```
|
||||
Настраиваем:
|
||||
```text
|
||||
acl v_metrics_nd path_beg /metrics_nd
|
||||
acl v_basic_auth http_auth(prometheus_list)
|
||||
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
|
||||
|
||||
backend b_metrics_nd
|
||||
mode http
|
||||
option http-keep-alive
|
||||
http-request replace-path .* /metrics
|
||||
server web1 127.0.0.1:9100 check
|
||||
```
|
||||
|
||||
Проверяем
|
||||
```sh
|
||||
haproxy -f /etc/haproxy/haproxy.cfg -c
|
||||
````
|
||||
Перезагружаем:
|
||||
```sh
|
||||
sudo systemctl restart haproxy
|
||||
````
|
||||
|
||||
|
||||
|
||||
Подключаюсь к машине где Prometeus:
|
||||
|
||||
```sh
|
||||
ssh igor@192.168.200.84 -p 22
|
||||
```
|
||||
|
||||
Перезагружаем prometheus чтобы он начал собирать метрики
|
||||
```sh
|
||||
sudo systemctl restart prometheus
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
Теперь можно настраивать графану, вот готовыдашбоард
|
||||
Открыть Grafana
|
||||
Перейти в Dashboards → Import
|
||||
Вставить ID: 9628
|
||||
Выбрать источник данных Prometheus (с PostgreSQL Exporter)
|
||||
Нажать Import
|
||||
|
||||
|
||||
Теперь можно настраивать графану, вот готовыдашбоард
|
||||
Открыть Grafana
|
||||
Перейти в Dashboards → Import
|
||||
Вставить ID: 12273
|
||||
Выбрать источник данных Prometheus (с PostgreSQL Exporter)
|
||||
Устанавливаю согласно инструкции из:
|
||||
|
||||
https://github.com/prometheus-community/postgres_exporter
|
||||
|
||||
Подключаюсь к нужной машине
|
||||
```sh
|
||||
ssh igor@ccalm.org -p 2200
|
||||
```
|
||||
|
||||
Configure postgresql.conf
|
||||
```conf
|
||||
shared_preload_libraries = 'pg_stat_statements'
|
||||
pg_stat_statements.track = all
|
||||
```
|
||||
|
||||
## 1. Установка Docker и Docker Compose
|
||||
Если Docker не установлен, установим его:
|
||||
```sh
|
||||
sudo apt update && sudo apt upgrade -y &&
|
||||
sudo apt install -y docker.io docker-compose &&
|
||||
sudo systemctl enable --now docker
|
||||
```
|
||||
|
||||
## 2. Установка postgres-exporter в докере из заранее подготовленного образа
|
||||
|
||||
```sh
|
||||
sudo mkdir -p /opt/postgres-exporter &&
|
||||
sudo chown $USER:$USER /opt/postgres-exporter &&
|
||||
cd /opt/postgres-exporter
|
||||
```
|
||||
|
||||
Создаю файл с настройками
|
||||
```sh
|
||||
cd /opt/postgres-exporter/ &&
|
||||
cat > docker-compose.yml <<'EOF'
|
||||
services:
|
||||
postgres-exporter:
|
||||
image: quay.io/prometheuscommunity/postgres-exporter
|
||||
container_name: postgres-exporter
|
||||
restart: unless-stopped
|
||||
network_mode: "host"
|
||||
environment:
|
||||
DATA_SOURCE_URI: "postgresql://postgres:309A86FF65A78FB428F4E38DFE35F730@localhost:5432/postgres?sslmode=disable"
|
||||
volumes:
|
||||
- ./postgres_exporter.yml:/etc/postgres_exporter.yml
|
||||
command:
|
||||
- "--config.file=/etc/postgres_exporter.yml"
|
||||
|
||||
EOF
|
||||
```
|
||||
|
||||
Создаём файл с настройками
|
||||
```sh
|
||||
cd /opt/postgres-exporter/ &&
|
||||
cat > postgres_exporter.yml <<'EOF'
|
||||
collectors:
|
||||
- database
|
||||
- index
|
||||
- query
|
||||
- table
|
||||
EOF
|
||||
```
|
||||
Запускаю:
|
||||
```sh
|
||||
cd /opt/postgres-exporter &&
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
|
||||
Проверяю запущен ли докер
|
||||
```sh
|
||||
sudo docker ps
|
||||
```
|
||||
|
||||
Testing with:
|
||||
```sh
|
||||
curl "http://127.0.0.1:9187/metrics"
|
||||
```
|
||||
|
||||
Посмотреть журнал за сегодня:
|
||||
```sh
|
||||
journalctl --since today
|
||||
```
|
||||
|
||||
Настраиваем простую авторизацию при помощи HAProxy для скачивания при помощи удаленного сервера
|
||||
|
||||
```sh
|
||||
sudo mcedit /etc/haproxy/haproxy.cfg
|
||||
```
|
||||
Настраиваем:
|
||||
```text
|
||||
acl v_metrics_nd path_beg /metrics_nd
|
||||
acl v_basic_auth http_auth(prometheus_list)
|
||||
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
|
||||
|
||||
backend b_metrics_nd
|
||||
mode http
|
||||
option http-keep-alive
|
||||
http-request replace-path .* /metrics
|
||||
server web1 127.0.0.1:9100 check
|
||||
```
|
||||
|
||||
Проверяем
|
||||
```sh
|
||||
haproxy -f /etc/haproxy/haproxy.cfg -c
|
||||
````
|
||||
Перезагружаем:
|
||||
```sh
|
||||
sudo systemctl restart haproxy
|
||||
````
|
||||
|
||||
|
||||
|
||||
Подключаюсь к машине где Prometeus:
|
||||
|
||||
```sh
|
||||
ssh igor@192.168.200.84 -p 22
|
||||
```
|
||||
|
||||
Перезагружаем prometheus чтобы он начал собирать метрики
|
||||
```sh
|
||||
sudo systemctl restart prometheus
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
Теперь можно настраивать графану, вот готовыдашбоард
|
||||
Открыть Grafana
|
||||
Перейти в Dashboards → Import
|
||||
Вставить ID: 9628
|
||||
Выбрать источник данных Prometheus (с PostgreSQL Exporter)
|
||||
Нажать Import
|
||||
|
||||
|
||||
Теперь можно настраивать графану, вот готовыдашбоард
|
||||
Открыть Grafana
|
||||
Перейти в Dashboards → Import
|
||||
Вставить ID: 12273
|
||||
Выбрать источник данных Prometheus (с PostgreSQL Exporter)
|
||||
Нажать Import
|
||||
158
PostgreSQL/PostgreSQL_Vault_Database_Secrets_Engine.md
Normal file
158
PostgreSQL/PostgreSQL_Vault_Database_Secrets_Engine.md
Normal 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`
|
||||
|
||||
---
|
||||
|
||||
145
PostgreSQL/PostgreSQL_Vault_PAM_python.md
Normal file
145
PostgreSQL/PostgreSQL_Vault_PAM_python.md
Normal 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()
|
||||
```
|
||||
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
@ -1,61 +1,61 @@
|
||||
****************************************************************************************************
|
||||
Установка и настройка проверяльщик паролей credcheck
|
||||
PostgreSQL https://www.postgresql.org/about/news/credcheck-v200-released-2654/
|
||||
|
||||
Тестовая база
|
||||
```sh
|
||||
ssh administrator@10.201.3.36 -p 22
|
||||
```
|
||||
|
||||
Похоже в официальном репозитории нет credcheck, так что если будем искать то не найдём:
|
||||
```sh
|
||||
apt search credcheck
|
||||
```
|
||||
|
||||
Поэтому устанавливаем из репозиториев (компилируем на тестовой машине потом устанавливаем на продакшен):
|
||||
```sh
|
||||
sudo apt-get install postgresql-server-dev-16 &&
|
||||
sudo apt-get install build-essential &&
|
||||
git clone https://github.com/HexaCluster/credcheck.git &&
|
||||
cd credcheck &&
|
||||
make &&
|
||||
sudo make install
|
||||
```
|
||||
|
||||
Подключаемся к базе данных для выполнения запросов
|
||||
```sh
|
||||
psql -h 127.0.0.1 -U postgres -d transit
|
||||
```
|
||||
Проверяем что настройки имеются:
|
||||
```sh
|
||||
SELECT name, setting, unit, source, sourcefile, sourceline
|
||||
FROM pg_settings
|
||||
WHERE name LIKE 'credcheck%';
|
||||
```
|
||||
|
||||
Читаем текущие настройки
|
||||
```sh
|
||||
SHOW ALL;
|
||||
```
|
||||
|
||||
Создаём расширение в базе postgres:
|
||||
```sh
|
||||
CREATE EXTENSION credcheck;
|
||||
```
|
||||
|
||||
Теперь можно настроить расширение по https://tembo.io/docs/getting-started/postgres_guides/extensions/credcheck:
|
||||
-- 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.password_min_length = 8;
|
||||
ALTER SYSTEM SET credcheck.password_min_special = 1;
|
||||
SELECT pg_reload_conf();
|
||||
|
||||
-- Attempt to create a user for a new park ranger, which does not meet the credential policies
|
||||
CREATE USER ranger_ WITH PASSWORD 'forest';
|
||||
ERROR: password length should match the configured credcheck.password_min_length
|
||||
|
||||
Для пароля установить:
|
||||
ALTER SYSTEM SET credcheck.password_expiration_days = 90;
|
||||
SELECT pg_reload_conf();
|
||||
|
||||
Для приложений нужно изменить политику паролей (менять не автоматически а по расписанию у администратора):
|
||||
****************************************************************************************************
|
||||
Установка и настройка проверяльщик паролей credcheck
|
||||
PostgreSQL https://www.postgresql.org/about/news/credcheck-v200-released-2654/
|
||||
|
||||
Тестовая база
|
||||
```sh
|
||||
ssh administrator@10.201.3.36 -p 22
|
||||
```
|
||||
|
||||
Похоже в официальном репозитории нет credcheck, так что если будем искать то не найдём:
|
||||
```sh
|
||||
apt search credcheck
|
||||
```
|
||||
|
||||
Поэтому устанавливаем из репозиториев (компилируем на тестовой машине потом устанавливаем на продакшен):
|
||||
```sh
|
||||
sudo apt-get install postgresql-server-dev-16 &&
|
||||
sudo apt-get install build-essential &&
|
||||
git clone https://github.com/HexaCluster/credcheck.git &&
|
||||
cd credcheck &&
|
||||
make &&
|
||||
sudo make install
|
||||
```
|
||||
|
||||
Подключаемся к базе данных для выполнения запросов
|
||||
```sh
|
||||
psql -h 127.0.0.1 -U postgres -d transit
|
||||
```
|
||||
Проверяем что настройки имеются:
|
||||
```sh
|
||||
SELECT name, setting, unit, source, sourcefile, sourceline
|
||||
FROM pg_settings
|
||||
WHERE name LIKE 'credcheck%';
|
||||
```
|
||||
|
||||
Читаем текущие настройки
|
||||
```sh
|
||||
SHOW ALL;
|
||||
```
|
||||
|
||||
Создаём расширение в базе postgres:
|
||||
```sh
|
||||
CREATE EXTENSION credcheck;
|
||||
```
|
||||
|
||||
Теперь можно настроить расширение по https://tembo.io/docs/getting-started/postgres_guides/extensions/credcheck:
|
||||
-- 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.password_min_length = 8;
|
||||
ALTER SYSTEM SET credcheck.password_min_special = 1;
|
||||
SELECT pg_reload_conf();
|
||||
|
||||
-- Attempt to create a user for a new park ranger, which does not meet the credential policies
|
||||
CREATE USER ranger_ WITH PASSWORD 'forest';
|
||||
ERROR: password length should match the configured credcheck.password_min_length
|
||||
|
||||
Для пароля установить:
|
||||
ALTER SYSTEM SET credcheck.password_expiration_days = 90;
|
||||
SELECT pg_reload_conf();
|
||||
|
||||
Для приложений нужно изменить политику паролей (менять не автоматически а по расписанию у администратора):
|
||||
@ -1,348 +1,381 @@
|
||||
# Install PostgreSQL database
|
||||
|
||||
Coonect lto need server:
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
Or coonect to need server:
|
||||
```sh
|
||||
ssh igor@ccalm.org -p 2200
|
||||
```
|
||||
|
||||
****************************************************************************************************
|
||||
Установка 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-10.13-1-windows-x64-binaries\pgsql\bin\initdb.exe -D O:\MyDocuments\DataBases\Data_PostgreSQL_10.13
|
||||
Потом создать BAT файл с тем текстом что отобразится при создании каталога базы
|
||||
База данных создаётся не под пользователем postgres а под локальным пользователем igor
|
||||
****************************************************************************************************
|
||||
Установка PostgreSQL 14 ubuntu 22.04 или 24.04
|
||||
```sh
|
||||
sudo apt-get update
|
||||
sudo apt-get install postgresql postgresql-contrib -y
|
||||
```
|
||||
Или так если нужно установить PostGIS
|
||||
```sh
|
||||
sudo apt-get install postgis
|
||||
```
|
||||
Для удаления PostGIS в месте с зависимыми пакетами:
|
||||
```sh
|
||||
sudo apt-get remove --auto-remove postgis &&
|
||||
sudo apt-get purge postgis
|
||||
```
|
||||
Добавить русскую локаль если её нет:
|
||||
```sh
|
||||
sudo locale-gen ru_RU &&
|
||||
sudo locale-gen ru_RU.UTF-8 &&
|
||||
sudo locale-gen kk_KZ &&
|
||||
sudo locale-gen kk_KZ.UTF-8
|
||||
```
|
||||
Проверить какая локаль по умолчанию:
|
||||
```sh
|
||||
localectl status
|
||||
```
|
||||
И переконфигурировать локаль по умолчанию в ru_RU.UTF-8 (а то в mc могут быть кракозябры):
|
||||
```sh
|
||||
sudo dpkg-reconfigure locales
|
||||
```
|
||||
Для задания пароля в PostgreSQL выполнить:
|
||||
```sh
|
||||
sudo -u postgres psql &&
|
||||
\password postgres
|
||||
```
|
||||
Чтобы выйти нужно выпольнить команду: \q
|
||||
|
||||
Роль входа по умолчанию: postgres пароль можно поменять когда в pg_hba.conf установить trust
|
||||
Задать пароль:
|
||||
sudo -u postgres psql
|
||||
postgres=> SELECT usename FROM pg_user;
|
||||
postgres=> alter user postgres password 'PasSecrKey1';
|
||||
postgres=> \q
|
||||
|
||||
Настройка postgresql.conf: http://www.lissyara.su/archive/1c_8.2+postgresql/
|
||||
Создаём базу данных выполнив функцию:
|
||||
CREATE DATABASE CCALM
|
||||
WITH OWNER = postgres
|
||||
TEMPLATE = template0
|
||||
ENCODING = 'UTF8'
|
||||
TABLESPACE = pg_default
|
||||
LC_COLLATE = 'ru_RU.UTF-8'
|
||||
LC_CTYPE = 'ru_RU.UTF-8'
|
||||
CONNECTION LIMIT = -1;
|
||||
|
||||
Файл настроек postgresql:
|
||||
```sh
|
||||
sudo mcedit /etc/postgresql/16/main/postgresql.conf
|
||||
```
|
||||
listen_addresses='*' #Разрешить подключение с внешки
|
||||
#Для 9й версии разрешаем экранирующие символы \' и другие без спец символа "E" перед строкой
|
||||
backslash_quote = on
|
||||
escape_string_warning = off
|
||||
standard_conforming_strings = off
|
||||
Чтобы воводил двоичные данные по старому изменить на:
|
||||
bytea_output = 'escape'
|
||||
|
||||
Настраиваю лимиты а то в саранче не выполняло большой запрос "Ошибка ввода/ввывода при отправке бэкенду"
|
||||
|
||||
Для создания нового пользователя выполнить:
|
||||
sudo -u postgres psql
|
||||
CREATE ROLE zholak LOGIN ENCRYPTED PASSWORD 'md5c0029083b93a3b16207a83b45e8a324a' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE REPLICATION;
|
||||
|
||||
Для подключения к определённой базе данных выполнить команду:
|
||||
sudo -u postgres psql
|
||||
\list or \l: для отображения всех баз
|
||||
\connect zholak zholak
|
||||
\dt для отображения всех таблиц
|
||||
|
||||
или написать со своим IP: host all all 2.133.238.240/24 trust
|
||||
Для подключения с любых IP адресов в "
|
||||
```sh
|
||||
sudo mcedit /etc/postgresql/16/main/pg_hba.conf
|
||||
```
|
||||
host all all 0.0.0.0/0 md5
|
||||
Либо с одного конкретного то: host all all 92.46.48.37/24 md5
|
||||
А также поменять на listen_addresses = '*' в postgresql.conf
|
||||
Потом перезагрузить postgres:
|
||||
sudo service postgresql restart
|
||||
sudo /etc/init.d/postgresql stop
|
||||
sudo /etc/init.d/postgresql restart
|
||||
sudo /etc/init.d/postgresql start
|
||||
Проверить запущен или нет то:
|
||||
sudo /etc/init.d/postgresql status
|
||||
Посмотрель лог загрузки PostGreSQL:
|
||||
dmesg |grep pg
|
||||
Чтобы посмотреть чем занят порт выполнить команду:
|
||||
sudo netstat -tap | grep 5432
|
||||
|
||||
Создать Backup (при переносе со старой на новую версию может быть не совместим для этого нужно делать бакам в текстовом формате: plain):
|
||||
pg_dump bigfoott_shop>/home/igor/bigfoott_shop.sql --host=127.0.0.1 --username=bigfoott_root
|
||||
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_dump stations>/home/administrator/pg_dump.sql --host=127.0.0.1 --username=postgres --format=custom
|
||||
pg_dump transit>/home/administrator/transit.sql --host=127.0.0.1 --username=postgres
|
||||
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
|
||||
|
||||
pg_dump CCALM>CCALM.backup --host=127.0.0.1 --username=postgres --format=custom
|
||||
|
||||
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
|
||||
pg_dump --dbname=postgresql://postgres:PostPas1key@127.0.0.1:5432/ShopMaster | gzip > /mnt/disk1/backup/$(date +%Y-%m-%d).ShopMaster.gz
|
||||
|
||||
Востановить Dump из текстового файла:
|
||||
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
|
||||
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
|
||||
|
||||
Создание SH скрипта для ежедневного бакапирования и архивации в ZIP файл:
|
||||
/mnt/O_DRIVE/MyDocuments/DataBases/dumps/run.sh
|
||||
#!/bin/sh
|
||||
pg_dump --dbname=postgresql://postgres:A6dCgeDDWHbC@127.0.0.1:5432/Queue | gzip > /mnt/disk1/backup/$(date +%Y-%m-%d).Queue.gz
|
||||
|
||||
Для востановления через pg_restore (версии баз должны совпадать а то может не восстановиться):
|
||||
su - postgres
|
||||
pg_restore -U <username> -d <dbname> -1 <filename>.dump
|
||||
pg_restore -U postgres -d zholak -1 /home/zholak/zholak_16.01.2019.backup
|
||||
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_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
|
||||
|
||||
sudo -u postgres psql -d transit -f /tmp/transit.backup
|
||||
|
||||
Или из архива (первоначально задать trust на 127.0.0.1) так:
|
||||
gunzip -c /var/www/dump.sql.gz | psql -h 127.0.0.1 -U bigfoott_root -d bigfoott_shop
|
||||
|
||||
****************************************************************************************************
|
||||
Настройка отображения статистики для PostgreSQL:
|
||||
https://habr.com/ru/articles/488968/
|
||||
|
||||
SELECT * FROM pg_stat_statements ORDER BY total_exec_time DESC;
|
||||
SELECT * FROM pg_stat_activity
|
||||
SELECT * FROM pg_stat_replication
|
||||
SELECT * FROM pg_stat_all_tables
|
||||
|
||||
Полный список: https://postgrespro.ru/docs/postgrespro/9.5/monitoring-stats
|
||||
|
||||
Установить Prometheus сграфаной Grafana для PostgreSQL там по умолчанию есть набор настроек для сбора статистики с PostgreSQL
|
||||
По мотивам: https://grafana.com/oss/prometheus/exporters/postgres-exporter/
|
||||
По мотивам: https://www.youtube.com/watch?v=B_yz37CR1XU
|
||||
****************************************************************************************************
|
||||
Установка pgagent
|
||||
sudo apt-get update
|
||||
sudo apt-get install pgagent
|
||||
Выполнить в консоли запрос:
|
||||
psql -h localhost -U postgres
|
||||
create extension pgagent;
|
||||
\q
|
||||
Для разрешения подключения откройте файл pg_hba.conf и замените строку на:
|
||||
host all all 127.0.0.1/32 md5
|
||||
|
||||
Можно для теста запустить pgagent с повышенным уровнем логирования:
|
||||
/usr/bin/pgagent -f -l 2 hostaddr=127.0.0.1 dbname=postgres user=postgres password=lelPfAtgQWhHYfy1SsHk
|
||||
|
||||
Если файла нет то пытаюсь его создать:
|
||||
sudo mcedit /lib/systemd/system/pgagent.service
|
||||
|
||||
[Unit]
|
||||
Description=PostgreSQL PgAgent Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=postgres
|
||||
ExecStart=/usr/bin/pgagent -f hostaddr=127.0.0.1 dbname=postgres user=postgres password=PasSecrKey1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
Проверяю что сервис был запущен:
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable pgagent
|
||||
sudo service pgagent start
|
||||
sudo systemctl status pgagent
|
||||
|
||||
|
||||
Для проверки пробуем подключиться к базе данных
|
||||
sudo -u postgres psql -h 127.0.0.1 -U postgres -d postgres
|
||||
\q
|
||||
|
||||
Похоже что нужно ещё создать файл паролей так как агент не знает как подключаться:
|
||||
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
|
||||
И прописать в него:
|
||||
127.0.0.1:5432:postgres:postgres:PasSecrKey1
|
||||
Где используется такой формат: hostname:port:database:username:password
|
||||
Затем:
|
||||
sudo systemctl enable pgagent
|
||||
sudo service pgagent start
|
||||
sudo service pgagent status
|
||||
Посмотреть логи:
|
||||
sudo journalctl -u pgagent
|
||||
|
||||
****************************************************************************************************
|
||||
Для добавления автоматического бакапирования Postgresql базы *.backup создать скрипт:
|
||||
|
||||
|
||||
****************************************************************************************************
|
||||
Перенос базы PostgreSQL на другой диск: https://internet-lab.ru/postgresql_ubuntu_move
|
||||
|
||||
****************************************************************************************************
|
||||
Установка 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 apt install postgresql-10-postgis-scripts
|
||||
Для 12й версии:
|
||||
sudo apt install postgresql-12-postgis-2.4
|
||||
|
||||
Создать базу данных и выполнть на ней следующие команды:
|
||||
-- Enable PostGIS (includes raster)
|
||||
CREATE EXTENSION postgis;
|
||||
-- Enable Topology
|
||||
CREATE EXTENSION postgis_topology;
|
||||
-- fuzzy matching needed for Tiger
|
||||
CREATE EXTENSION fuzzystrmatch;
|
||||
-- rule based standardizer
|
||||
CREATE EXTENSION address_standardizer;
|
||||
-- example rule data set
|
||||
CREATE EXTENSION address_standardizer_data_us;
|
||||
-- Enable US Tiger Geocoder
|
||||
CREATE EXTENSION postgis_tiger_geocoder;
|
||||
|
||||
У меня начало выдавать 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
|
||||
****************************************************************************************************
|
||||
Для добавления TOTP авторизации в Postgresql выполнить:
|
||||
CREATE EXTENSION otp;
|
||||
|
||||
|
||||
****************************************************************************************************
|
||||
sudo apt-get install libpq-dev libpq-fe
|
||||
Если есть несовместимость libpq-dev : Зависит: libpq5 (= 14.3-0ubuntu0.22.04.1) но 14.3-1.pgdg22.04+1 должен быть установлен
|
||||
То удали ранее добавленный репозиторий: /etc/apt/sources.list.d/pgadmin4.list и обнови а потом попробуй установить заново libpq-dev
|
||||
apt update
|
||||
****************************************************************************************************
|
||||
Установка phpPgAdmin через репозиторий:
|
||||
sudo apt-get install phppgadmin
|
||||
Можно открыть так: http://localhost/phppgadmin
|
||||
Для доступа с любых ip адресов в файле: /etc/phppgadmin/apache.conf изменить на allow from all
|
||||
Чтоб можно было залогинется под пользователем postgres меняем в:
|
||||
/etc/phppgadmin/config.inc.php extra_login_security в false
|
||||
Если phpphadmin не дает залогиниться и пишет "Неверный логин", нужно в postgresql.conf прописать $conf['servers'][0]['host'] = 'localhost';
|
||||
|
||||
Другой вариант скачать с сайта последнюю версию с "http://phppgadmin.sourceforge.net/doku.php".
|
||||
****************************************************************************************************
|
||||
Установка pgAdmin4 через докер контейнер
|
||||
|
||||
```sh
|
||||
sudo mkdir -p /opt/pgAdmin4 &&
|
||||
sudo chmod -R 777 /opt/pgAdmin4 &&
|
||||
sudo chown -R $USER:$USER /opt/pgAdmin4
|
||||
```
|
||||
|
||||
```sh
|
||||
cd /opt/pgAdmin4 &&
|
||||
cat > docker-compose.yml <<'EOF'
|
||||
services:
|
||||
pgadmin:
|
||||
image: dpage/pgadmin4
|
||||
container_name: pgadmin4
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "5050:80"
|
||||
environment:
|
||||
PGADMIN_DEFAULT_EMAIL: irigm@mail.ru
|
||||
PGADMIN_DEFAULT_PASSWORD: 123456
|
||||
volumes:
|
||||
- pgadmin_data:/var/lib/pgadmin
|
||||
|
||||
volumes:
|
||||
pgadmin_data:
|
||||
EOF
|
||||
```
|
||||
|
||||
## 4. Запуск контейнера
|
||||
|
||||
```sh
|
||||
cd /opt/pgAdmin4 &&
|
||||
sudo docker compose up -d
|
||||
```
|
||||
|
||||
```sh
|
||||
cd /opt/pgAdmin4 &&
|
||||
sudo docker compose down
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Проверить что не записан левый репозиторий для 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
|
||||
|
||||
|
||||
# Install PostgreSQL database
|
||||
|
||||
Coonect lto need server:
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
Or coonect to need server:
|
||||
```sh
|
||||
ssh igor@192.168.200.88 -p 22
|
||||
```
|
||||
|
||||
****************************************************************************************************
|
||||
Установка 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-10.13-1-windows-x64-binaries\pgsql\bin\initdb.exe -D O:\MyDocuments\DataBases\Data_PostgreSQL_10.13
|
||||
Потом создать BAT файл с тем текстом что отобразится при создании каталога базы
|
||||
База данных создаётся не под пользователем postgres а под локальным пользователем igor
|
||||
****************************************************************************************************
|
||||
Установка PostgreSQL 14 ubuntu 22.04 или 24.04
|
||||
```sh
|
||||
sudo apt-get update &&
|
||||
sudo apt-get install postgresql postgresql-contrib -y
|
||||
```
|
||||
Или так если нужно установить PostGIS
|
||||
```sh
|
||||
sudo apt-get install postgis -y
|
||||
```
|
||||
Для удаления PostGIS в месте с зависимыми пакетами:
|
||||
```sh
|
||||
sudo apt-get remove --auto-remove postgis &&
|
||||
sudo apt-get purge postgis
|
||||
```
|
||||
Добавить русскую локаль если её нет:
|
||||
```sh
|
||||
sudo locale-gen ru_RU &&
|
||||
sudo locale-gen ru_RU.UTF-8 &&
|
||||
sudo locale-gen kk_KZ &&
|
||||
sudo locale-gen kk_KZ.UTF-8
|
||||
```
|
||||
Проверить какая локаль по умолчанию:
|
||||
```sh
|
||||
localectl status
|
||||
```
|
||||
И переконфигурировать локаль по умолчанию в ru_RU.UTF-8 (а то в mc могут быть кракозябры):
|
||||
```sh
|
||||
sudo dpkg-reconfigure locales
|
||||
```
|
||||
Для задания пароля в PostgreSQL выполнить:
|
||||
```sh
|
||||
sudo -u postgres psql &&
|
||||
```
|
||||
можно так поменять но лучьше SQL запросом что ниже
|
||||
```sql
|
||||
\password postgres
|
||||
```
|
||||
Или так можно поменять пароль через SQL скрипт
|
||||
```sql
|
||||
ALTER ROLE postgres WITH PASSWORD 'SerTestSecrKey1' VALID UNTIL 'infinity';
|
||||
```
|
||||
Чтобы выйти нужно выпольнить команду: \q
|
||||
```sql
|
||||
\q
|
||||
```
|
||||
|
||||
|
||||
Роль входа по умолчанию: postgres пароль можно поменять когда в pg_hba.conf установить trust
|
||||
Задать пароль:
|
||||
sudo -u postgres psql
|
||||
postgres=> SELECT usename FROM pg_user;
|
||||
postgres=> alter user postgres password 'PasSecrKey1';
|
||||
postgres=> \q
|
||||
|
||||
Настройка postgresql.conf: http://www.lissyara.su/archive/1c_8.2+postgresql/
|
||||
Создаём базу данных выполнив функцию:
|
||||
CREATE DATABASE CCALM
|
||||
WITH OWNER = postgres
|
||||
TEMPLATE = template0
|
||||
ENCODING = 'UTF8'
|
||||
TABLESPACE = pg_default
|
||||
LC_COLLATE = 'ru_RU.UTF-8'
|
||||
LC_CTYPE = 'ru_RU.UTF-8'
|
||||
CONNECTION LIMIT = -1;
|
||||
|
||||
Файл настроек postgresql:
|
||||
```sh
|
||||
sudo mcedit /etc/postgresql/16/main/postgresql.conf
|
||||
```
|
||||
listen_addresses='*' #Разрешить подключение с внешки
|
||||
#Для 9й версии разрешаем экранирующие символы \' и другие без спец символа "E" перед строкой
|
||||
backslash_quote = on
|
||||
escape_string_warning = off
|
||||
standard_conforming_strings = off
|
||||
Чтобы воводил двоичные данные по старому изменить на:
|
||||
bytea_output = 'escape'
|
||||
|
||||
Настраиваю лимиты а то в саранче не выполняло большой запрос "Ошибка ввода/ввывода при отправке бэкенду"
|
||||
|
||||
Для создания нового пользователя выполнить:
|
||||
sudo -u postgres psql
|
||||
CREATE ROLE zholak LOGIN ENCRYPTED PASSWORD 'md5c0029083b93a3b16207a83b45e8a324a' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE REPLICATION;
|
||||
|
||||
Для подключения к определённой базе данных выполнить команду:
|
||||
sudo -u postgres psql
|
||||
\list or \l: для отображения всех баз
|
||||
\connect zholak zholak
|
||||
\dt для отображения всех таблиц
|
||||
|
||||
или написать со своим IP: host all all 2.133.238.240/24 trust
|
||||
Для подключения с любых IP адресов в "
|
||||
```sh
|
||||
sudo mcedit /etc/postgresql/16/main/pg_hba.conf
|
||||
```
|
||||
host all all 0.0.0.0/0 md5
|
||||
Либо с одного конкретного то: host all all 92.46.48.37/24 md5
|
||||
А также поменять на listen_addresses = '*' в postgresql.conf
|
||||
Потом перезагрузить postgres:
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
sudo /etc/init.d/postgresql stop
|
||||
sudo /etc/init.d/postgresql restart
|
||||
sudo /etc/init.d/postgresql start
|
||||
Проверить запущен или нет то:
|
||||
```sh
|
||||
sudo /etc/init.d/postgresql status
|
||||
```
|
||||
Посмотрель лог загрузки PostGreSQL:
|
||||
```sh
|
||||
dmesg |grep pg
|
||||
```
|
||||
Чтобы посмотреть чем занят порт выполнить команду:
|
||||
```sh
|
||||
sudo apt-get update &&
|
||||
sudo apt-get install net-tools &&
|
||||
sudo netstat -tap | grep 5432
|
||||
```
|
||||
|
||||
Создать Backup (при переносе со старой на новую версию может быть не совместим для этого нужно делать бакам в текстовом формате: plain):
|
||||
pg_dump --host=192.168.200.17 --username=postgres salevizor > /home/igor/salevizor.sql
|
||||
|
||||
pg_dump bigfoott_shop>/home/igor/bigfoott_shop.sql --host=127.0.0.1 --username=bigfoott_root
|
||||
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_dump stations>/home/administrator/pg_dump.sql --host=127.0.0.1 --username=postgres --format=custom
|
||||
pg_dump transit>/home/administrator/transit.sql --host=127.0.0.1 --username=postgres
|
||||
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
|
||||
|
||||
pg_dump CCALM>CCALM.backup --host=127.0.0.1 --username=postgres --format=custom
|
||||
|
||||
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
|
||||
pg_dump --dbname=postgresql://postgres:PostPas1key@127.0.0.1:5432/ShopMaster | gzip > /mnt/disk1/backup/$(date +%Y-%m-%d).ShopMaster.gz
|
||||
|
||||
Востановить Dump из текстового файла:
|
||||
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
|
||||
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
|
||||
|
||||
Создание SH скрипта для ежедневного бакапирования и архивации в ZIP файл:
|
||||
/mnt/O_DRIVE/MyDocuments/DataBases/dumps/run.sh
|
||||
#!/bin/sh
|
||||
pg_dump --dbname=postgresql://postgres:A6dCgeDDWHbC@127.0.0.1:5432/Queue | gzip > /mnt/disk1/backup/$(date +%Y-%m-%d).Queue.gz
|
||||
|
||||
Для востановления через pg_restore (версии баз должны совпадать а то может не восстановиться):
|
||||
su - postgres
|
||||
pg_restore -U <username> -d <dbname> -1 <filename>.dump
|
||||
pg_restore -U postgres -d zholak -1 /home/zholak/zholak_16.01.2019.backup
|
||||
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_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_restore --host=127.0.0.1 --username=postgres --dbname=CCALM --verbose /tmp/CCALM.backup
|
||||
|
||||
sudo -u postgres psql -d transit -f /tmp/transit.backup
|
||||
|
||||
|
||||
|
||||
Или из архива (первоначально задать trust на 127.0.0.1) так:
|
||||
gunzip -c /var/www/dump.sql.gz | psql -h 127.0.0.1 -U bigfoott_root -d bigfoott_shop
|
||||
|
||||
****************************************************************************************************
|
||||
Настройка отображения статистики для PostgreSQL:
|
||||
https://habr.com/ru/articles/488968/
|
||||
|
||||
SELECT * FROM pg_stat_statements ORDER BY total_exec_time DESC;
|
||||
SELECT * FROM pg_stat_activity
|
||||
SELECT * FROM pg_stat_replication
|
||||
SELECT * FROM pg_stat_all_tables
|
||||
|
||||
Полный список: https://postgrespro.ru/docs/postgrespro/9.5/monitoring-stats
|
||||
|
||||
Установить Prometheus сграфаной Grafana для PostgreSQL там по умолчанию есть набор настроек для сбора статистики с PostgreSQL
|
||||
По мотивам: https://grafana.com/oss/prometheus/exporters/postgres-exporter/
|
||||
По мотивам: https://www.youtube.com/watch?v=B_yz37CR1XU
|
||||
****************************************************************************************************
|
||||
Установка pgagent
|
||||
```sh
|
||||
sudo apt-get update &&
|
||||
sudo apt-get install pgagent
|
||||
```
|
||||
Выполнить в консоли запрос:
|
||||
psql -h localhost -U postgres
|
||||
create extension pgagent;
|
||||
\q
|
||||
Для разрешения подключения откройте файл pg_hba.conf и замените строку на:
|
||||
host all all 127.0.0.1/32 md5
|
||||
|
||||
Можно для теста запустить pgagent с повышенным уровнем логирования:
|
||||
/usr/bin/pgagent -f -l 2 hostaddr=127.0.0.1 dbname=postgres user=postgres password=lelPfAtgQWhHYfy1SsHk
|
||||
|
||||
Если файла нет то пытаюсь его создать:
|
||||
sudo mcedit /lib/systemd/system/pgagent.service
|
||||
|
||||
[Unit]
|
||||
Description=PostgreSQL PgAgent Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=postgres
|
||||
ExecStart=/usr/bin/pgagent -f hostaddr=127.0.0.1 dbname=postgres user=postgres password=PasSecrKey1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
Проверяю что сервис был запущен:
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable pgagent
|
||||
sudo service pgagent start
|
||||
sudo systemctl status pgagent
|
||||
|
||||
|
||||
Для проверки пробуем подключиться к базе данных
|
||||
sudo -u postgres psql -h 127.0.0.1 -U postgres -d postgres
|
||||
\q
|
||||
|
||||
Похоже что нужно ещё создать файл паролей так как агент не знает как подключаться:
|
||||
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
|
||||
И прописать в него:
|
||||
127.0.0.1:5432:postgres:postgres:PasSecrKey1
|
||||
Где используется такой формат: hostname:port:database:username:password
|
||||
Затем:
|
||||
sudo systemctl enable pgagent
|
||||
sudo service pgagent start
|
||||
sudo service pgagent status
|
||||
Посмотреть логи:
|
||||
sudo journalctl -u pgagent
|
||||
|
||||
****************************************************************************************************
|
||||
Для добавления автоматического бакапирования Postgresql базы *.backup создать скрипт:
|
||||
|
||||
|
||||
****************************************************************************************************
|
||||
Перенос базы PostgreSQL на другой диск: https://internet-lab.ru/postgresql_ubuntu_move
|
||||
|
||||
****************************************************************************************************
|
||||
Установка 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 apt install postgresql-10-postgis-scripts
|
||||
Для 12й версии:
|
||||
sudo apt install postgresql-12-postgis-2.4
|
||||
|
||||
Создать базу данных и выполнть на ней следующие команды:
|
||||
```sql
|
||||
-- Enable PostGIS (includes raster)
|
||||
CREATE EXTENSION postgis;
|
||||
-- Enable Topology
|
||||
CREATE EXTENSION postgis_topology;
|
||||
-- fuzzy matching needed for Tiger
|
||||
CREATE EXTENSION fuzzystrmatch;
|
||||
-- rule based standardizer
|
||||
CREATE EXTENSION address_standardizer;
|
||||
-- example rule data set
|
||||
CREATE EXTENSION address_standardizer_data_us;
|
||||
-- Enable US Tiger Geocoder
|
||||
CREATE EXTENSION postgis_tiger_geocoder;
|
||||
```
|
||||
У меня начало выдавать 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
|
||||
****************************************************************************************************
|
||||
Для добавления TOTP авторизации в Postgresql выполнить:
|
||||
```sql
|
||||
CREATE EXTENSION otp;
|
||||
```
|
||||
|
||||
****************************************************************************************************
|
||||
sudo apt-get install libpq-dev libpq-fe
|
||||
Если есть несовместимость libpq-dev : Зависит: libpq5 (= 14.3-0ubuntu0.22.04.1) но 14.3-1.pgdg22.04+1 должен быть установлен
|
||||
То удали ранее добавленный репозиторий: /etc/apt/sources.list.d/pgadmin4.list и обнови а потом попробуй установить заново libpq-dev
|
||||
apt update
|
||||
****************************************************************************************************
|
||||
Установка phpPgAdmin через репозиторий:
|
||||
sudo apt-get install phppgadmin
|
||||
Можно открыть так: http://localhost/phppgadmin
|
||||
Для доступа с любых ip адресов в файле: /etc/phppgadmin/apache.conf изменить на allow from all
|
||||
Чтоб можно было залогинется под пользователем postgres меняем в:
|
||||
/etc/phppgadmin/config.inc.php extra_login_security в false
|
||||
Если phpphadmin не дает залогиниться и пишет "Неверный логин", нужно в postgresql.conf прописать $conf['servers'][0]['host'] = 'localhost';
|
||||
|
||||
Другой вариант скачать с сайта последнюю версию с "http://phppgadmin.sourceforge.net/doku.php".
|
||||
****************************************************************************************************
|
||||
Установка pgAdmin4 через докер контейнер
|
||||
|
||||
```sh
|
||||
sudo mkdir -p /opt/pgAdmin4/backups &&
|
||||
sudo mkdir -p /opt/pgAdmin4 &&
|
||||
sudo chmod -R 777 /opt/pgAdmin4 &&
|
||||
sudo chown -R $USER:$USER /opt/pgAdmin4
|
||||
```
|
||||
|
||||
```sh
|
||||
cd /opt/pgAdmin4 &&
|
||||
cat > docker-compose.yml <<'EOF'
|
||||
services:
|
||||
pgadmin:
|
||||
image: dpage/pgadmin4
|
||||
container_name: pgadmin4
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "5050:80"
|
||||
environment:
|
||||
PGADMIN_DEFAULT_EMAIL: irigm@mail.ru
|
||||
PGADMIN_DEFAULT_PASSWORD: 123456
|
||||
volumes:
|
||||
- pgadmin_data:/var/lib/pgadmin
|
||||
- /opt/pgAdmin4/backups:/var/lib/pgadmin/storage
|
||||
volumes:
|
||||
pgadmin_data:
|
||||
EOF
|
||||
```
|
||||
|
||||
## 4. Запуск контейнера
|
||||
|
||||
```sh
|
||||
cd /opt/pgAdmin4 &&
|
||||
sudo docker compose up -d
|
||||
```
|
||||
|
||||
```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
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
|
||||
Создано на основе https://www.cherryservers.com/blog/how-to-set-up-postgresql-database-replication
|
||||
|
||||
Подключаюсь к нужной машине
|
||||
```sh
|
||||
ssh igor@192.168.200.84 -p 22
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Создано на основе https://www.cherryservers.com/blog/how-to-set-up-postgresql-database-replication
|
||||
|
||||
Подключаюсь к нужной машине
|
||||
```sh
|
||||
ssh igor@192.168.200.84 -p 22
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1,137 +1,137 @@
|
||||
# Настройка PostgreSQL в синхронном режиме репликации
|
||||
|
||||
Синхронная репликация в PostgreSQL гарантирует, что данные записываются на реплику перед подтверждением транзакции на основном сервере (Primary). Это повышает надежность, но может замедлить запись из-за необходимости ожидания отклика реплики.
|
||||
|
||||
---
|
||||
|
||||
## **1. Подготовка серверов**
|
||||
Допустим, у нас есть:
|
||||
- **Основной сервер (Primary):** `192.168.1.1`
|
||||
- **Реплика (Standby):** `192.168.1.2`
|
||||
|
||||
Убедитесь, что PostgreSQL установлен на обоих серверах.
|
||||
|
||||
---
|
||||
|
||||
## **2. Настройка основного сервера (Primary)**
|
||||
|
||||
### **2.1 Разрешаем подключение реплики**
|
||||
Редактируем `postgresql.conf`:
|
||||
```sh
|
||||
sudo nano /etc/postgresql/15/main/postgresql.conf
|
||||
```
|
||||
Добавляем/изменяем параметры:
|
||||
```conf
|
||||
wal_level = replica
|
||||
synchronous_commit = on
|
||||
synchronous_standby_names = 'replica1'
|
||||
max_wal_senders = 3
|
||||
wal_keep_size = 256MB
|
||||
hot_standby = on
|
||||
```
|
||||
Редактируем `pg_hba.conf`, добавляя доступ для реплики:
|
||||
```sh
|
||||
sudo nano /etc/postgresql/15/main/pg_hba.conf
|
||||
```
|
||||
Добавляем строку:
|
||||
```conf
|
||||
host replication replicator 192.168.1.2/32 md5
|
||||
```
|
||||
|
||||
### **2.2 Создаем пользователя для репликации**
|
||||
```sql
|
||||
CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'your_password';
|
||||
```
|
||||
|
||||
### **2.3 Перезапускаем PostgreSQL**
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **3. Настройка реплики (Standby)**
|
||||
|
||||
### **3.1 Останавливаем PostgreSQL на реплике**
|
||||
```sh
|
||||
sudo systemctl stop postgresql
|
||||
```
|
||||
|
||||
### **3.2 Копируем данные с основного сервера**
|
||||
На реплике выполняем:
|
||||
```sh
|
||||
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` вручную**
|
||||
Файл `postgresql.auto.conf`, создаваемый `pg_basebackup`, не добавляет `application_name`, поэтому задаем его вручную:
|
||||
```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';\""
|
||||
```
|
||||
Затем перезапускаем PostgreSQL на реплике:
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
### **3.4 Проверяем `primary_conninfo`**
|
||||
```sh
|
||||
cat /var/lib/postgresql/15/main/postgresql.auto.conf | grep primary_conninfo
|
||||
```
|
||||
Ожидаемый результат:
|
||||
```ini
|
||||
primary_conninfo = 'host=192.168.1.1 user=replicator password=your_password application_name=replica1'
|
||||
```
|
||||
Если строка отсутствует, редактируем файл вручную:
|
||||
```sh
|
||||
sudo nano /var/lib/postgresql/15/main/postgresql.auto.conf
|
||||
```
|
||||
Добавляем строку:
|
||||
```ini
|
||||
primary_conninfo = 'host=192.168.1.1 user=replicator password=your_password application_name=replica1'
|
||||
```
|
||||
Сохраняем и перезапускаем PostgreSQL:
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **4. Обновляем настройки Primary для работы с репликой**
|
||||
|
||||
На основном сервере (Primary) выполняем:
|
||||
```sh
|
||||
sudo su postgres -c "psql -c \"ALTER SYSTEM SET synchronous_standby_names TO 'replica1';\""
|
||||
```
|
||||
Перезапускаем PostgreSQL на Primary:
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **5. Проверка работы синхронной репликации**
|
||||
|
||||
### **5.1 Проверяем статус репликации**
|
||||
На **основном сервере (Primary)** выполняем:
|
||||
```sql
|
||||
SELECT application_name, sync_state FROM pg_stat_replication;
|
||||
```
|
||||
Ожидаемый результат:
|
||||
```
|
||||
application_name | sync_state
|
||||
-----------------+------------
|
||||
replica1 | sync
|
||||
```
|
||||
Если `sync_state = 'sync'`, значит синхронная репликация работает.
|
||||
|
||||
---
|
||||
|
||||
## **6. Итоговая проверка**
|
||||
✅ **Задали `primary_conninfo` вручную на реплике**
|
||||
✅ **Перезапустили PostgreSQL на реплике**
|
||||
✅ **Обновили `synchronous_standby_names` на основном сервере**
|
||||
✅ **Перезапустили PostgreSQL на основном сервере**
|
||||
✅ **Проверили `pg_stat_replication` на Primary**
|
||||
|
||||
Готово! 🎉
|
||||
|
||||
# Настройка PostgreSQL в синхронном режиме репликации
|
||||
|
||||
Синхронная репликация в PostgreSQL гарантирует, что данные записываются на реплику перед подтверждением транзакции на основном сервере (Primary). Это повышает надежность, но может замедлить запись из-за необходимости ожидания отклика реплики.
|
||||
|
||||
---
|
||||
|
||||
## **1. Подготовка серверов**
|
||||
Допустим, у нас есть:
|
||||
- **Основной сервер (Primary):** `192.168.1.1`
|
||||
- **Реплика (Standby):** `192.168.1.2`
|
||||
|
||||
Убедитесь, что PostgreSQL установлен на обоих серверах.
|
||||
|
||||
---
|
||||
|
||||
## **2. Настройка основного сервера (Primary)**
|
||||
|
||||
### **2.1 Разрешаем подключение реплики**
|
||||
Редактируем `postgresql.conf`:
|
||||
```sh
|
||||
sudo nano /etc/postgresql/15/main/postgresql.conf
|
||||
```
|
||||
Добавляем/изменяем параметры:
|
||||
```conf
|
||||
wal_level = replica
|
||||
synchronous_commit = on
|
||||
synchronous_standby_names = 'replica1'
|
||||
max_wal_senders = 3
|
||||
wal_keep_size = 256MB
|
||||
hot_standby = on
|
||||
```
|
||||
Редактируем `pg_hba.conf`, добавляя доступ для реплики:
|
||||
```sh
|
||||
sudo nano /etc/postgresql/15/main/pg_hba.conf
|
||||
```
|
||||
Добавляем строку:
|
||||
```conf
|
||||
host replication replicator 192.168.1.2/32 md5
|
||||
```
|
||||
|
||||
### **2.2 Создаем пользователя для репликации**
|
||||
```sql
|
||||
CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'your_password';
|
||||
```
|
||||
|
||||
### **2.3 Перезапускаем PostgreSQL**
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **3. Настройка реплики (Standby)**
|
||||
|
||||
### **3.1 Останавливаем PostgreSQL на реплике**
|
||||
```sh
|
||||
sudo systemctl stop postgresql
|
||||
```
|
||||
|
||||
### **3.2 Копируем данные с основного сервера**
|
||||
На реплике выполняем:
|
||||
```sh
|
||||
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` вручную**
|
||||
Файл `postgresql.auto.conf`, создаваемый `pg_basebackup`, не добавляет `application_name`, поэтому задаем его вручную:
|
||||
```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';\""
|
||||
```
|
||||
Затем перезапускаем PostgreSQL на реплике:
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
### **3.4 Проверяем `primary_conninfo`**
|
||||
```sh
|
||||
cat /var/lib/postgresql/15/main/postgresql.auto.conf | grep primary_conninfo
|
||||
```
|
||||
Ожидаемый результат:
|
||||
```ini
|
||||
primary_conninfo = 'host=192.168.1.1 user=replicator password=your_password application_name=replica1'
|
||||
```
|
||||
Если строка отсутствует, редактируем файл вручную:
|
||||
```sh
|
||||
sudo nano /var/lib/postgresql/15/main/postgresql.auto.conf
|
||||
```
|
||||
Добавляем строку:
|
||||
```ini
|
||||
primary_conninfo = 'host=192.168.1.1 user=replicator password=your_password application_name=replica1'
|
||||
```
|
||||
Сохраняем и перезапускаем PostgreSQL:
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **4. Обновляем настройки Primary для работы с репликой**
|
||||
|
||||
На основном сервере (Primary) выполняем:
|
||||
```sh
|
||||
sudo su postgres -c "psql -c \"ALTER SYSTEM SET synchronous_standby_names TO 'replica1';\""
|
||||
```
|
||||
Перезапускаем PostgreSQL на Primary:
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **5. Проверка работы синхронной репликации**
|
||||
|
||||
### **5.1 Проверяем статус репликации**
|
||||
На **основном сервере (Primary)** выполняем:
|
||||
```sql
|
||||
SELECT application_name, sync_state FROM pg_stat_replication;
|
||||
```
|
||||
Ожидаемый результат:
|
||||
```
|
||||
application_name | sync_state
|
||||
-----------------+------------
|
||||
replica1 | sync
|
||||
```
|
||||
Если `sync_state = 'sync'`, значит синхронная репликация работает.
|
||||
|
||||
---
|
||||
|
||||
## **6. Итоговая проверка**
|
||||
✅ **Задали `primary_conninfo` вручную на реплике**
|
||||
✅ **Перезапустили PostgreSQL на реплике**
|
||||
✅ **Обновили `synchronous_standby_names` на основном сервере**
|
||||
✅ **Перезапустили PostgreSQL на основном сервере**
|
||||
✅ **Проверили `pg_stat_replication` на Primary**
|
||||
|
||||
Готово! 🎉
|
||||
|
||||
91
PostgreSQL/PostgreSQL_select.md
Normal file
91
PostgreSQL/PostgreSQL_select.md
Normal 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) Проведение оплаты
|
||||
|
||||
|
||||
|
||||
53
PostgreSQL/backup/backup.sh
Normal file
53
PostgreSQL/backup/backup.sh
Normal 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
|
||||
@ -1,260 +1,261 @@
|
||||
# 📌 Установка HAProxy на Ubuntu 20.04
|
||||
****************************************************************************************************
|
||||
На основе инструкции из https://itsecforu.ru/2019/07/15/⏳-настройка-балансировщика-нагрузки-h/
|
||||
|
||||
Connect to the required server:
|
||||
```sh
|
||||
ssh administrator@10.101.1.3 -p 22
|
||||
```
|
||||
Connect to CCALM Turkish infrastructure:
|
||||
```sh
|
||||
ssh igor@88.218.94.134 -p 2200
|
||||
```
|
||||
----------------------------------------------------------------------------------------------------
|
||||
## Install haproxy
|
||||
```sh
|
||||
sudo apt-get update && sudo apt-get install haproxy -y
|
||||
````
|
||||
Создаём резервную копию файла:
|
||||
```sh
|
||||
sudo cp /etc/haproxy/haproxy.cfg{,.bak}
|
||||
````
|
||||
Редактируем конфигурацию (Описание конфигурационного файла HAProxy https://habr.com/ru/sandbox/34354/)
|
||||
```sh
|
||||
mcedit /etc/haproxy/haproxy.cfg
|
||||
```
|
||||
В конец файла добавляем пока только для перенаправления (для балансироки больше IP адресов):
|
||||
```conf
|
||||
frontend frontend-http
|
||||
bind *:80
|
||||
mode http
|
||||
|
||||
# ACL для определения запросов на проверку Let's Encrypt
|
||||
acl is_certbot path_beg /.well-known/acme-challenge/
|
||||
|
||||
# Если это не запрос Let's Encrypt, перенаправляем на HTTPS
|
||||
http-request redirect scheme https code 301 unless is_certbot
|
||||
|
||||
# Отправляем запросы Let's Encrypt на backend-certbot
|
||||
use_backend backend-certbot if is_certbot
|
||||
|
||||
frontend LOADBALANCER-01
|
||||
bind *:80
|
||||
bind *:443 ssl crt /etc/haproxy/ssl/mqtt.kz.pem crt /etc/ssl/certs/bigfoottrade_kz.pem
|
||||
mode http #режим работы HAProxy, в http режиме происходит анализ Layer 7 трафика
|
||||
option httpclose #Закрывает пассивные соединения
|
||||
|
||||
http-request set-header x-Forwarded-for %[src]
|
||||
http-request set-header x-Forwarded-uri %[url]
|
||||
|
||||
acl v_geoserver2 hdr(host) -i geoserver2.ccalm.org
|
||||
use_backend geoserver2_ccalm_org if v_geoserver2
|
||||
|
||||
#Если различные нестандартные порты то так
|
||||
acl v_locust_kz hdr_reg(host) -i ^locust\.kz(:.*)?$
|
||||
use_backend b_locust_kz if v_locust_kz
|
||||
|
||||
#Перенаправление одной страницы по адресу http://geoserver2.ccalm.org/data/ на другой backend
|
||||
acl v_geo_data hdr(host) -i geoserver2.ccalm.org/data
|
||||
use_backend WEBSERVERS-01 if v_geo_data
|
||||
|
||||
default_backend WEBSERVER
|
||||
|
||||
backend WEBSERVER
|
||||
balance roundrobin
|
||||
server web1 127.0.0.1:8080 check inter 5s ssl verify none
|
||||
option httpchk GET /index.html
|
||||
|
||||
|
||||
backend geoserver2_ccalm_org
|
||||
balance roundrobin
|
||||
server web1 192.168.0.90:80 check
|
||||
option httpchk
|
||||
|
||||
listen stats
|
||||
bind *:8989
|
||||
stats enable
|
||||
stats uri /
|
||||
stats realm Haproxy\ Statistics
|
||||
stats auth igor:i123456
|
||||
|
||||
frontend f-RabbitMQ
|
||||
mode tcp
|
||||
bind 10.1.7.73:21000
|
||||
default_backend b-RabbitMQ
|
||||
|
||||
backend b-RabbitMQ
|
||||
mode tcp
|
||||
server srv1 10.10.16.21:20000
|
||||
```
|
||||
Для перенаправления незащищённого HTTP трафика можно: xxxxxxxxxxxxxxx
|
||||
|
||||
Для использования 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 AAA_Certificate_Services.crt GoGetSSL_RSA_DV_CA.crt istransit_kz.crt istransit_kz.key > istransit_kz.pem
|
||||
|
||||
SSLCertificateFile
|
||||
SSLCertificateKeyFile
|
||||
|
||||
Для включения WEB статистики на 9000 порту добавить в конец конфигурации:
|
||||
listen stats
|
||||
bind *:8989
|
||||
stats enable
|
||||
stats uri /stats
|
||||
stats realm Haproxy\ Statistics
|
||||
stats auth igor:i123456
|
||||
Тестирую файл конфигурации:
|
||||
```sh
|
||||
haproxy -f /etc/haproxy/haproxy.cfg -c
|
||||
````
|
||||
Также можно в журнале посмотреть что написал HAProxy:
|
||||
```sh
|
||||
sudo journalctl -u haproxy --no-pager | tail -n 50
|
||||
````
|
||||
Перезагружаем:
|
||||
```sh
|
||||
sudo systemctl restart haproxy
|
||||
````
|
||||
|
||||
Посмотреть что в журнале можно так:
|
||||
Посмотреть что в журнале можно так:
|
||||
```sh
|
||||
journalctl -u haproxy --since "1 minutes ago"
|
||||
journalctl -u haproxy --since "30 minutes ago" | grep "backend"
|
||||
tail -f /var/log/haproxy.log
|
||||
```
|
||||
|
||||
|
||||
|
||||
administrator@app:~$ journalctl -u haproxy --since "30 minutes ago" | grep "backend"
|
||||
backend 'transit_acquiring_v01_kz' has no server available!
|
||||
backend 'transit_translation_v02_kz' has no server available!
|
||||
backend 'transit_mobile_kz' has no server available!
|
||||
backend 'transit_manager_kz' has no server available!
|
||||
backend 'transit_warehouse_kz' has no server available!
|
||||
backend 'transit_kgd_kz' has no server available!
|
||||
backend 'transit_monitoring_kz' has no server available!
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
И теперь должно открываться но адресу: http://data.ccalm.org:8989/
|
||||
Обязательно проверить как установился SSL чекером: https://www.leaderssl.ru/tools/ssl_checker
|
||||
|
||||
|
||||
# 📌 Бесплатный SSL сертификат Let’s Encrypt для HAPROXY
|
||||
****************************************************************************************************
|
||||
Бесплатный SSL сертификат Let’s Encrypt для HAPROXY https://serversforhackers.com/c/letsencrypt-with-haproxy
|
||||
```sh
|
||||
sudo apt-get update
|
||||
sudo apt-get install certbot -y
|
||||
````
|
||||
Для удаления PPA нужно выполнить:
|
||||
```sh
|
||||
sudo apt-get remove certbot
|
||||
sudo add-apt-repository --remove ppa:certbot/certbot
|
||||
apt-get install -f
|
||||
apt autoremove
|
||||
```
|
||||
Если включён файрволл то разрешаем порт:
|
||||
```sh
|
||||
sudo ufw allow 9080/tcp
|
||||
```
|
||||
Проверяем что автообновление в certbot работает для этого выполняем команду:
|
||||
```sh
|
||||
sudo systemctl status certbot.timer
|
||||
```
|
||||
Затем пытаемся выполнить пробный прогон при помощи команды:
|
||||
```sh
|
||||
sudo certbot renew --dry-run
|
||||
```
|
||||
|
||||
Согласно инструкции модифицируем конфигурационный файл haproxy добавив во frontend это:
|
||||
```
|
||||
# ACL for detecting Let's Encrypt validtion requests
|
||||
acl is_certbot path_beg /.well-known/acme-challenge/
|
||||
use_backend backend-certbot if is_certbot
|
||||
```
|
||||
А также ещё один backend:
|
||||
```
|
||||
# Certbot backend
|
||||
# Contains certbot stand-alone webserver
|
||||
backend backend-certbot
|
||||
mode http
|
||||
server certbot 127.0.0.1:9080
|
||||
```
|
||||
Перезагрузить и выполнить команду:
|
||||
|
||||
```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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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/renew.sh (по моему этот скрипт не нужен так как рабтает сервис certbot.timer):
|
||||
#!/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
|
||||
|
||||
# Loop through all Let's Encrypt certificates
|
||||
for CERTIFICATE in `find /etc/letsencrypt/live/* -type d`; do
|
||||
|
||||
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
|
||||
|
||||
done
|
||||
systemctl reload haproxy.service
|
||||
|
||||
Обновляем конфигурацию HAProxy добавив в frontend:
|
||||
bind *:443 ssl crt /etc/haproxy/ssl/mqtt.kz.pem
|
||||
|
||||
Устанавливаем права
|
||||
chmod +x /etc/haproxy/renew.sh
|
||||
chmod +x /etc/haproxy/prepare.sh
|
||||
И добавляем задание в cron "crontab -e" ниже текст это раз в 24 часа в 00:00:00 ночи:
|
||||
0 0 * * * /bin/sh /etc/letsencrypt/renew.sh
|
||||
# 📌 Установка HAProxy на Ubuntu 20.04
|
||||
****************************************************************************************************
|
||||
На основе инструкции из https://itsecforu.ru/2019/07/15/⏳-настройка-балансировщика-нагрузки-h/
|
||||
|
||||
Connect to the required server:
|
||||
```sh
|
||||
ssh administrator@10.101.1.3 -p 22
|
||||
```
|
||||
Home server
|
||||
```sh
|
||||
ssh igor@192.168.200.81 -p 22
|
||||
```
|
||||
----------------------------------------------------------------------------------------------------
|
||||
## Install haproxy
|
||||
```sh
|
||||
sudo apt-get update && sudo apt-get install haproxy -y
|
||||
````
|
||||
Создаём резервную копию файла:
|
||||
```sh
|
||||
sudo cp /etc/haproxy/haproxy.cfg{,.bak}
|
||||
````
|
||||
Редактируем конфигурацию (Описание конфигурационного файла HAProxy https://habr.com/ru/sandbox/34354/)
|
||||
```sh
|
||||
mcedit /etc/haproxy/haproxy.cfg
|
||||
```
|
||||
В конец файла добавляем пока только для перенаправления (для балансироки больше IP адресов):
|
||||
```conf
|
||||
frontend frontend-http
|
||||
bind *:80
|
||||
mode http
|
||||
|
||||
# ACL для определения запросов на проверку Let's Encrypt
|
||||
acl is_certbot path_beg /.well-known/acme-challenge/
|
||||
|
||||
# Если это не запрос Let's Encrypt, перенаправляем на HTTPS
|
||||
http-request redirect scheme https code 301 unless is_certbot
|
||||
|
||||
# Отправляем запросы Let's Encrypt на backend-certbot
|
||||
use_backend backend-certbot if is_certbot
|
||||
|
||||
frontend LOADBALANCER-01
|
||||
bind *:80
|
||||
bind *:443 ssl crt /etc/haproxy/ssl/mqtt.kz.pem crt /etc/ssl/certs/bigfoottrade_kz.pem
|
||||
mode http #режим работы HAProxy, в http режиме происходит анализ Layer 7 трафика
|
||||
option httpclose #Закрывает пассивные соединения
|
||||
|
||||
http-request set-header x-Forwarded-for %[src]
|
||||
http-request set-header x-Forwarded-uri %[url]
|
||||
|
||||
acl v_geoserver2 hdr(host) -i geoserver2.ccalm.org
|
||||
use_backend geoserver2_ccalm_org if v_geoserver2
|
||||
|
||||
#Если различные нестандартные порты то так
|
||||
acl v_locust_kz hdr_reg(host) -i ^locust\.kz(:.*)?$
|
||||
use_backend b_locust_kz if v_locust_kz
|
||||
|
||||
#Перенаправление одной страницы по адресу http://geoserver2.ccalm.org/data/ на другой backend
|
||||
acl v_geo_data hdr(host) -i geoserver2.ccalm.org/data
|
||||
use_backend WEBSERVERS-01 if v_geo_data
|
||||
|
||||
default_backend WEBSERVER
|
||||
|
||||
backend WEBSERVER
|
||||
balance roundrobin
|
||||
server web1 127.0.0.1:8080 check inter 5s ssl verify none
|
||||
option httpchk GET /index.html
|
||||
|
||||
|
||||
backend geoserver2_ccalm_org
|
||||
balance roundrobin
|
||||
server web1 192.168.0.90:80 check
|
||||
option httpchk
|
||||
|
||||
listen stats
|
||||
bind *:8989
|
||||
stats enable
|
||||
stats uri /
|
||||
stats realm Haproxy\ Statistics
|
||||
stats auth igor:i123456
|
||||
|
||||
frontend f-RabbitMQ
|
||||
mode tcp
|
||||
bind 10.1.7.73:21000
|
||||
default_backend b-RabbitMQ
|
||||
|
||||
backend b-RabbitMQ
|
||||
mode tcp
|
||||
server srv1 10.10.16.21:20000
|
||||
```
|
||||
Для перенаправления незащищённого HTTP трафика можно: xxxxxxxxxxxxxxx
|
||||
|
||||
Для использования 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 AAA_Certificate_Services.crt GoGetSSL_RSA_DV_CA.crt istransit_kz.crt istransit_kz.key > istransit_kz.pem
|
||||
|
||||
SSLCertificateFile
|
||||
SSLCertificateKeyFile
|
||||
|
||||
Для включения WEB статистики на 9000 порту добавить в конец конфигурации:
|
||||
listen stats
|
||||
bind *:8989
|
||||
stats enable
|
||||
stats uri /stats
|
||||
stats realm Haproxy\ Statistics
|
||||
stats auth igor:i123456
|
||||
Тестирую файл конфигурации:
|
||||
```sh
|
||||
haproxy -f /etc/haproxy/haproxy.cfg -c
|
||||
````
|
||||
Также можно в журнале посмотреть что написал HAProxy:
|
||||
```sh
|
||||
sudo journalctl -u haproxy --no-pager -n 50 -f
|
||||
````
|
||||
Перезагружаем:
|
||||
```sh
|
||||
sudo systemctl restart haproxy
|
||||
````
|
||||
|
||||
Посмотреть что в журнале можно так:
|
||||
Посмотреть что в журнале можно так:
|
||||
```sh
|
||||
journalctl -u haproxy --since "1 minutes ago"
|
||||
journalctl -u haproxy --since "30 minutes ago" | grep "backend"
|
||||
tail -f /var/log/haproxy.log
|
||||
```
|
||||
|
||||
|
||||
|
||||
administrator@app:~$ journalctl -u haproxy --since "30 minutes ago" | grep "backend"
|
||||
backend 'transit_acquiring_v01_kz' has no server available!
|
||||
backend 'transit_translation_v02_kz' has no server available!
|
||||
backend 'transit_mobile_kz' has no server available!
|
||||
backend 'transit_manager_kz' has no server available!
|
||||
backend 'transit_warehouse_kz' has no server available!
|
||||
backend 'transit_kgd_kz' has no server available!
|
||||
backend 'transit_monitoring_kz' has no server available!
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
И теперь должно открываться но адресу: http://data.ccalm.org:8989/
|
||||
Обязательно проверить как установился SSL чекером: https://www.leaderssl.ru/tools/ssl_checker
|
||||
|
||||
|
||||
# 📌 Бесплатный SSL сертификат Let’s Encrypt для HAPROXY
|
||||
****************************************************************************************************
|
||||
Бесплатный SSL сертификат Let’s Encrypt для HAPROXY https://serversforhackers.com/c/letsencrypt-with-haproxy
|
||||
```sh
|
||||
sudo apt-get update
|
||||
sudo apt-get install certbot -y
|
||||
````
|
||||
Для удаления PPA нужно выполнить:
|
||||
```sh
|
||||
sudo apt-get remove certbot
|
||||
sudo add-apt-repository --remove ppa:certbot/certbot
|
||||
apt-get install -f
|
||||
apt autoremove
|
||||
```
|
||||
Если включён файрволл то разрешаем порт:
|
||||
```sh
|
||||
sudo ufw allow 9080/tcp
|
||||
```
|
||||
Проверяем что автообновление в certbot работает для этого выполняем команду:
|
||||
```sh
|
||||
sudo systemctl status certbot.timer
|
||||
```
|
||||
Затем пытаемся выполнить пробный прогон при помощи команды:
|
||||
```sh
|
||||
sudo certbot renew --dry-run
|
||||
```
|
||||
|
||||
Согласно инструкции модифицируем конфигурационный файл haproxy добавив во frontend это:
|
||||
```
|
||||
# ACL for detecting Let's Encrypt validtion requests
|
||||
acl is_certbot path_beg /.well-known/acme-challenge/
|
||||
use_backend backend-certbot if is_certbot
|
||||
```
|
||||
А также ещё один backend:
|
||||
```
|
||||
# Certbot backend
|
||||
# Contains certbot stand-alone webserver
|
||||
backend backend-certbot
|
||||
mode http
|
||||
server certbot 127.0.0.1:9080
|
||||
```
|
||||
Перезагрузить и выполнить команду:
|
||||
|
||||
```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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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/renew.sh (по моему этот скрипт не нужен так как рабтает сервис certbot.timer):
|
||||
#!/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
|
||||
|
||||
# Loop through all Let's Encrypt certificates
|
||||
for CERTIFICATE in `find /etc/letsencrypt/live/* -type d`; do
|
||||
|
||||
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
|
||||
|
||||
done
|
||||
systemctl reload haproxy.service
|
||||
|
||||
Обновляем конфигурацию HAProxy добавив в frontend:
|
||||
bind *:443 ssl crt /etc/haproxy/ssl/mqtt.kz.pem
|
||||
|
||||
Устанавливаем права
|
||||
chmod +x /etc/haproxy/renew.sh
|
||||
chmod +x /etc/haproxy/prepare.sh
|
||||
И добавляем задание в cron "crontab -e" ниже текст это раз в 24 часа в 00:00:00 ночи:
|
||||
0 0 * * * /bin/sh /etc/letsencrypt/renew.sh
|
||||
@ -1,8 +1,10 @@
|
||||
С внешки во внутрянную инфраструктуру подключаемся через HAProxy а уже внутри использую Traefik
|
||||
|
||||
Открываю нужный сервер
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
Или такой:
|
||||
Открывает traefik на 192.168.200.85:
|
||||
```sh
|
||||
ssh igor@192.168.200.85 -p 22
|
||||
```
|
||||
@ -22,7 +24,7 @@ sudo apt install wget
|
||||
Проверь актуальную версию на: [Traefik Releases](https://github.com/traefik/traefik/releases)
|
||||
|
||||
Пример для версии `v3.0.0`:
|
||||
```bash
|
||||
```sh
|
||||
cd ~ &&
|
||||
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. Распаковка и установка
|
||||
```bash
|
||||
```sh
|
||||
cd ~ &&
|
||||
tar -xvzf traefik_v3.3.4_linux_amd64.tar.gz &&
|
||||
sudo mv traefik /usr/local/bin/
|
||||
```
|
||||
|
||||
Проверь версию:
|
||||
```bash
|
||||
```sh
|
||||
traefik version
|
||||
```
|
||||
|
||||
@ -65,7 +67,7 @@ entryPoints:
|
||||
websecure:
|
||||
address: ":443"
|
||||
traefik:
|
||||
address: ":8080"
|
||||
address: ":8989"
|
||||
|
||||
api:
|
||||
dashboard: true
|
||||
@ -74,12 +76,13 @@ api:
|
||||
providers:
|
||||
file:
|
||||
filename: "/etc/traefik/dynamic.yml"
|
||||
watch: true
|
||||
|
||||
# Настройка сертификатов (пример с Let's Encrypt)
|
||||
certificatesResolvers:
|
||||
myresolver:
|
||||
acme:
|
||||
email: "your-email@example.com"
|
||||
email: "irigm@mail.ru"
|
||||
storage: "/etc/traefik/acme.json"
|
||||
httpChallenge:
|
||||
entryPoint: web
|
||||
@ -102,56 +105,70 @@ http:
|
||||
service: api@internal
|
||||
|
||||
ccalm-api-auth:
|
||||
rule: "Host(`ccalm.test`) && PathPrefix(`/api/authorization/v02/`)"
|
||||
service: org_ccalm_api_authorization_v02
|
||||
entryPoints:
|
||||
- websecure
|
||||
rule: "(Host(`ccalm.test`) || Host(`almaty.ccalm.test`)) && PathPrefix(`/api/authorization/v02/`)"
|
||||
service: org_ccalm_api_authorization_v02
|
||||
tls:
|
||||
certresolver: myresolver
|
||||
middlewares:
|
||||
- strip-auth-prefix
|
||||
|
||||
ccalm-dbms:
|
||||
rule: "Host(`ccalm.test`) && PathPrefix(`/api/dbms/v09/`)"
|
||||
service: org_ccalm_dbms_v09
|
||||
entryPoints:
|
||||
- websecure
|
||||
rule: "(Host(`ccalm.test`) || Host(`almaty.ccalm.test`)) && PathPrefix(`/api/dbms/v09/`)"
|
||||
service: org_ccalm_dbms_v09
|
||||
tls:
|
||||
certresolver: myresolver
|
||||
middlewares:
|
||||
- strip-dbms-prefix
|
||||
|
||||
ccalm-translation:
|
||||
rule: "Host(`ccalm.test`) && PathPrefix(`/api/translation/v01/`)"
|
||||
service: org_ccalm_translation_v01
|
||||
entryPoints:
|
||||
- websecure
|
||||
rule: "(Host(`ccalm.test`) || Host(`almaty.ccalm.test`)) && PathPrefix(`/api/translation/v01/`)"
|
||||
service: org_ccalm_translation_v01
|
||||
tls:
|
||||
certresolver: myresolver
|
||||
middlewares:
|
||||
- strip-translation-prefix
|
||||
#middlewares:
|
||||
# - strip-translation-prefix
|
||||
|
||||
ccalm-login:
|
||||
rule: "Host(`ccalm.test`) && PathPrefix(`/login/`)"
|
||||
service: org_ccalm_login_v01
|
||||
entryPoints:
|
||||
- websecure
|
||||
rule: "(Host(`ccalm.test`) || Host(`almaty.ccalm.test`)) && PathPrefix(`/login/`)"
|
||||
service: org_ccalm_login_v01
|
||||
tls:
|
||||
certresolver: myresolver
|
||||
|
||||
ccalm-default:
|
||||
rule: "Host(`ccalm.test`)"
|
||||
service: org_ccalm
|
||||
entryPoints:
|
||||
- websecure
|
||||
rule: "(Host(`ccalm.test`) || Host(`almaty.ccalm.test`))"
|
||||
service: org_ccalm
|
||||
tls:
|
||||
certresolver: myresolver
|
||||
|
||||
powerdns:
|
||||
rule: "Host(`powerdns.local`)"
|
||||
service: local_powerdns
|
||||
entryPoints:
|
||||
- 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: {}
|
||||
|
||||
middlewares:
|
||||
@ -163,7 +180,7 @@ http:
|
||||
stripPrefix:
|
||||
prefixes:
|
||||
- "/api/dbms/v09"
|
||||
strip-dbms-prefix:
|
||||
strip-translation-prefix:
|
||||
stripPrefix:
|
||||
prefixes:
|
||||
- "/api/translation/v01"
|
||||
@ -179,6 +196,26 @@ http:
|
||||
path: "/"
|
||||
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:
|
||||
loadBalancer:
|
||||
@ -203,10 +240,12 @@ http:
|
||||
org_ccalm_translation_v01:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "https://192.168.200.184:8085"
|
||||
#- url: "https://192.168.200.184:8085"
|
||||
- url: "https://ccalm.org"
|
||||
passHostHeader: false
|
||||
serversTransport: insecureTransport
|
||||
healthCheck:
|
||||
path: "/"
|
||||
path: ""
|
||||
interval: "5s"
|
||||
|
||||
# Бэкенд для org_ccalm_login_v01 (HTTP, без SSL)
|
||||
@ -240,6 +279,10 @@ tls:
|
||||
keyFile: "/etc/traefik/certs/ccalm.test.key"
|
||||
- certFile: "/etc/traefik/certs/powerdns.local.crt"
|
||||
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"
|
||||
keyFile: "/etc/traefik/certs/wildcard.local.key"
|
||||
- certFile: "/etc/traefik/certs/wildcard.test.crt"
|
||||
@ -293,7 +336,7 @@ EOF
|
||||
## 🔎 Шаг 6. Проверка работы
|
||||
Откройте в браузере:
|
||||
```sh
|
||||
open http://localhost:8080/dashboard/
|
||||
open http://192.168.200.85:8080/dashboard/
|
||||
```
|
||||
|
||||
> ⚠️ Доступ к дашборду открыт только с localhost. Для удалённого доступа настройте правила.
|
||||
@ -1,7 +1,7 @@
|
||||
# Устанавливаю Traefik на туречский сервер
|
||||
# Устанавливаю Traefik cервер в Астане
|
||||
|
||||
```sh
|
||||
ssh igor@156.244.31.209 -p 2200
|
||||
ssh ubuntu@194.32.140.11 -p 22
|
||||
```
|
||||
|
||||
# Установка 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
|
||||
```
|
||||
|
||||
|
||||
## 📥 Создаём группу и пользователя под которым будет запускаться 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. Распаковка и установка
|
||||
@ -38,6 +50,12 @@ wget https://github.com/traefik/traefik/releases/download/v3.3.4/traefik_v3.3.4_
|
||||
traefik version
|
||||
```
|
||||
|
||||
Разрешаем занимать порты с номером меньше 1024
|
||||
```sh
|
||||
sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/traefik
|
||||
```
|
||||
|
||||
|
||||
```conf
|
||||
Version: 3.3.4
|
||||
Codename: saintnectaire
|
||||
@ -48,12 +66,6 @@ OS/Arch: linux/amd64
|
||||
|
||||
---
|
||||
|
||||
## 📁 Шаг 4. Создание директории и базового конфига
|
||||
```sh
|
||||
sudo mkdir -p /etc/traefik &&
|
||||
cd /etc/traefik
|
||||
```
|
||||
|
||||
### Пример `traefik.yml`
|
||||
```sh
|
||||
cd /etc/traefik &&
|
||||
@ -70,15 +82,11 @@ entryPoints:
|
||||
websecure:
|
||||
address: ":443"
|
||||
traefik:
|
||||
address: ":8080"
|
||||
address: ":8070"
|
||||
|
||||
api:
|
||||
dashboard: true
|
||||
insecure: true
|
||||
|
||||
providers:
|
||||
file:
|
||||
filename: "/etc/traefik/dynamic.yml"
|
||||
#insecure: true
|
||||
|
||||
# Настройка сертификатов (пример с Let's Encrypt)
|
||||
certificatesResolvers:
|
||||
@ -89,6 +97,11 @@ certificatesResolvers:
|
||||
httpChallenge:
|
||||
entryPoint: web
|
||||
|
||||
providers:
|
||||
file:
|
||||
filename: "/etc/traefik/dynamic.yml"
|
||||
watch: true
|
||||
|
||||
log:
|
||||
level: DEBUG
|
||||
EOF
|
||||
@ -98,61 +111,163 @@ EOF
|
||||
```sh
|
||||
cd /etc/traefik &&
|
||||
sudo tee /etc/traefik/dynamic.yml > /dev/null <<'EOF'
|
||||
---
|
||||
http:
|
||||
routers:
|
||||
|
||||
dashboard:
|
||||
entryPoints:
|
||||
- traefik
|
||||
rule: "Host(`localhost`)"
|
||||
rule: "Host(`194.32.140.11`)"
|
||||
service: api@internal
|
||||
middlewares:
|
||||
- dashboard-auth
|
||||
|
||||
geovizor-api-zones:
|
||||
rule: "Host(`geovizor.top`) && PathPrefix(`/api/v1/servers/localhost/zones/`)"
|
||||
service: top_geovizor_api_zones_v01
|
||||
ccalm-api-auth:
|
||||
entryPoints:
|
||||
- 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:
|
||||
certresolver: myresolver
|
||||
|
||||
geovizor-default:
|
||||
rule: "Host(`geovizor.top`)"
|
||||
service: top_geovizor_default
|
||||
org-ccalm-main:
|
||||
entryPoints:
|
||||
- websecure
|
||||
rule: "Host(`locust.ge`) || Host(`almaty.ccalm.org`) || Host(`ccalm.org`)"
|
||||
service: org_ccalm_main
|
||||
tls:
|
||||
certresolver: myresolver
|
||||
|
||||
acme-http:
|
||||
rule: "PathPrefix(`/.well-known/acme-challenge/`)"
|
||||
entryPoints:
|
||||
- web
|
||||
middlewares: []
|
||||
service: noop
|
||||
priority: 1000
|
||||
|
||||
services:
|
||||
|
||||
top_geovizor_api_zones_v01:
|
||||
|
||||
# backend org_ccalm_api_authorization_v02
|
||||
org_ccalm_api_authorization_v02:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://156.244.31.209:8081"
|
||||
- url: "https://127.0.0.1:8082"
|
||||
serversTransport: insecureTransport
|
||||
healthCheck:
|
||||
path: "/"
|
||||
interval: "5s"
|
||||
|
||||
# Бэкенд по умолчанию top_geovizor
|
||||
top_geovizor_default:
|
||||
# org_ccalm_dbms_v09 backend
|
||||
org_ccalm_dbms_v09:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://127.0.0.1:8082"
|
||||
- url: "https://127.0.0.1:8084"
|
||||
serversTransport: insecureTransport
|
||||
healthCheck:
|
||||
path: "/"
|
||||
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
|
||||
serversTransports:
|
||||
insecureTransport:
|
||||
insecureSkipVerify: true
|
||||
|
||||
# Добавляем сертификаты
|
||||
tls:
|
||||
certificates:
|
||||
middlewares:
|
||||
strip-dbms-prefix:
|
||||
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
|
||||
```
|
||||
|
||||
For checking syntactic:
|
||||
```sh
|
||||
yamllint -d "{extends: default, rules: {line-length: disable}}" /etc/traefik/dynamic.yml
|
||||
```
|
||||
|
||||
|
||||
Для хранения сертификатов файл:
|
||||
```sh
|
||||
sudo touch /etc/traefik/acme.json &&
|
||||
@ -167,10 +282,12 @@ EOF
|
||||
cd /etc/systemd/system &&
|
||||
sudo tee /etc/systemd/system/traefik.service > /dev/null <<'EOF'
|
||||
[Unit]
|
||||
Description=Traefik
|
||||
Description=Reverse proxy Traefik
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
User=traefik
|
||||
Group=traefik
|
||||
ExecStart=/usr/local/bin/traefik --configFile=/etc/traefik/traefik.yml
|
||||
Restart=always
|
||||
|
||||
@ -179,7 +296,6 @@ WantedBy=multi-user.target
|
||||
EOF
|
||||
```
|
||||
|
||||
|
||||
Примените:
|
||||
```sh
|
||||
sudo systemctl daemon-reload &&
|
||||
@ -193,14 +309,13 @@ EOF
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
ыгвщ куищще
|
||||
## 🔎 Шаг 6. Проверка работы
|
||||
Откройте в браузере:
|
||||
Откройте в браузере cпаролем что быше "":
|
||||
```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
|
||||
|
||||
|
||||
@ -251,7 +369,7 @@ services:
|
||||
ports:
|
||||
- "80:80" # HTTP
|
||||
- "443:443" # HTTPS
|
||||
- "8080:8080" # Dashboard
|
||||
- "8070:8070" # Dashboard
|
||||
volumes:
|
||||
- /etc/traefik:/etc/traefik
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
@ -277,7 +395,7 @@ EOF
|
||||
|
||||
Откройте в браузере:
|
||||
```sh
|
||||
open http://192.168.200.85:8080/dashboard/
|
||||
open http://192.168.200.85:8070/dashboard/
|
||||
```
|
||||
|
||||
```sh
|
||||
201
Proxy/Traefik_plugin.md
Normal file
201
Proxy/Traefik_plugin.md
Normal 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 используйте только для маршрутизации. Это минимизирует изменения в вашей инфраструктуре.
|
||||
209
Proxy/top.geovizor.traefik_first.md
Normal file
209
Proxy/top.geovizor.traefik_first.md
Normal 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
66
RClone/NFS_install.md
Normal 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
|
||||
```
|
||||
69
RClone/RClone_install_linux.md
Normal file
69
RClone/RClone_install_linux.md
Normal 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
136
RClone/WebDAV_install.md
Normal 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/
|
||||
```
|
||||
@ -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
53
Redis_install.md
Normal 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
|
||||
```
|
||||
@ -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:
|
||||
@ -1,361 +1,389 @@
|
||||
# Установка HashiCorp Vault на Ubuntu
|
||||
|
||||
Vault — это инструмент от HashiCorp для безопасного хранения секретов и управления ими.
|
||||
|
||||
## 1. Установка Vault
|
||||
|
||||
Открываю нужный сервер
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
Похоже vault из Москвы недоступен:
|
||||
```sh
|
||||
ssh root@45.144.64.218 -p 2200
|
||||
```
|
||||
|
||||
### 1.1. Добавление репозитория HashiCorp
|
||||
|
||||
1. Установите необходимые пакеты:
|
||||
```sh
|
||||
sudo apt update && sudo apt install -y gnupg software-properties-common curl
|
||||
```
|
||||
|
||||
2. Добавьте официальный GPG-ключ HashiCorp:
|
||||
```sh
|
||||
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
|
||||
```
|
||||
|
||||
3. Добавьте репозиторий HashiCorp в систему:
|
||||
```sh
|
||||
sudo mcedit /etc/apt/sources.list.d/hashicorp.list
|
||||
```
|
||||
|
||||
Заменяем на:
|
||||
```text
|
||||
deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com noble main
|
||||
```
|
||||
Где noble это кодовое имя Ubuntu 24.04
|
||||
|
||||
|
||||
4. Обновите списки пакетов:
|
||||
```sh
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
5. Установите Vault:
|
||||
```sh
|
||||
sudo apt install -y vault
|
||||
```
|
||||
|
||||
6. Проверьте, что Vault установлен правильно:
|
||||
```sh
|
||||
vault --version
|
||||
```
|
||||
Выдало: Vault v1.18.5 (2cb3755273dbd63f5b0f8ec50089b57ffd3fa330), built 2025-02-24T09:40:28Z
|
||||
|
||||
|
||||
## 2. Запуск Vault
|
||||
|
||||
### 2.1. Запуск в Dev-режиме (только для тестирования)
|
||||
|
||||
If work stop it:
|
||||
```sh
|
||||
sudo pkill vault
|
||||
```
|
||||
If need delete old data:
|
||||
```sh
|
||||
sudo rm -rf ~/.vault-token ~/.vault/
|
||||
```
|
||||
For find where stored data read file:
|
||||
```sh
|
||||
sudo mcedit /etc/vault/config.hcl
|
||||
```
|
||||
In config file find this path: /opt/vault/data
|
||||
|
||||
После удаления базы нужно инициализировать Vault заново:
|
||||
```sh
|
||||
sudo vault operator init
|
||||
```
|
||||
|
||||
Run in developer mode (in dev mode data stored in RAM):
|
||||
```sh
|
||||
vault server -dev
|
||||
```
|
||||
|
||||
```text
|
||||
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
|
||||
authenticated to the CLI, so you can immediately begin using Vault.
|
||||
|
||||
You may need to set the following environment variables:
|
||||
|
||||
$ export VAULT_ADDR='http://127.0.0.1:8200'
|
||||
|
||||
The unseal key and root token are displayed below in case you want to
|
||||
seal/unseal the Vault or re-authenticate.
|
||||
|
||||
Unseal Key: TMb6A3QI3wJ9kaEeTYo5wEviP23lugJ3Asek2la6V4s=
|
||||
Root Token: hvs.GsWHRR7ne7gMTZhuPgZdh91w
|
||||
|
||||
Development mode should NOT be used in production installations!
|
||||
```
|
||||
|
||||
Теперь Vault работает по адресу:
|
||||
```sh
|
||||
start http://127.0.0.1:8200
|
||||
```
|
||||
Останавливаю нажатием Ctrl + C
|
||||
|
||||
|
||||
### 2.2. Настройка Vault в режиме сервера
|
||||
|
||||
1. Создайте конфигурационный файл:
|
||||
```sh
|
||||
sudo mkdir -p /etc/vault &&
|
||||
sudo mcedit /etc/vault/config.hcl
|
||||
```
|
||||
|
||||
2. Добавьте следующий конфиг:
|
||||
```text
|
||||
storage "file" {
|
||||
path = "/opt/vault/data"
|
||||
}
|
||||
|
||||
listener "tcp" {
|
||||
address = "127.0.0.1:8200"
|
||||
tls_disable = 1
|
||||
}
|
||||
|
||||
disable_mlock = true
|
||||
ui = true
|
||||
```
|
||||
|
||||
3. Создайте папку для хранения данных:
|
||||
```sh
|
||||
sudo mkdir -p /opt/vault/data &&
|
||||
sudo chown vault:vault /opt/vault/data
|
||||
```
|
||||
|
||||
4. Создайте systemd-сервис для Vault:
|
||||
```sh
|
||||
sudo tee /etc/systemd/system/vault.service > /dev/null <<'EOF'
|
||||
[Unit]
|
||||
Description=HashiCorp Vault
|
||||
After=network-online.target
|
||||
Requires=network-online.target
|
||||
|
||||
[Service]
|
||||
User=vault
|
||||
Group=vault
|
||||
ExecStart=/usr/bin/vault server -config=/etc/vault/config.hcl
|
||||
ExecReload=/bin/kill --signal HUP \$MAINPID
|
||||
KillSignal=SIGTERM
|
||||
Restart=on-failure
|
||||
LimitMEMLOCK=infinity
|
||||
ProtectSystem=full
|
||||
CapabilityBoundingSet=CAP_IPC_LOCK CAP_SETGID CAP_SETUID CAP_SYSLOG CAP_CHOWN
|
||||
NoNewPrivileges=yes
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
```
|
||||
Проверяем всё ли записалось:
|
||||
```sh
|
||||
sudo mcedit /etc/systemd/system/vault.service
|
||||
```
|
||||
|
||||
5. Перезапустите systemd и включите Vault:
|
||||
```sh
|
||||
sudo systemctl daemon-reload &&
|
||||
sudo systemctl enable vault &&
|
||||
sudo systemctl start vault
|
||||
```
|
||||
|
||||
7. Проверьте статус:
|
||||
```sh
|
||||
sudo systemctl status vault
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Инициализация и разлочка Vault
|
||||
|
||||
1. Экспортируйте переменную окружения:
|
||||
```sh
|
||||
export VAULT_ADDR='http://127.0.0.1:8200'
|
||||
```
|
||||
|
||||
2. Инициализируйте хранилище (сохраните ключи!):
|
||||
```sh
|
||||
vault operator init
|
||||
```
|
||||
|
||||
Выдало:
|
||||
```text
|
||||
Unseal Key 1: lQlJsb9RI8rSzLrc5iPnx1qJkWZbbXIkrEgnQGe5R6uO
|
||||
Unseal Key 2: 0qJJXRo570jlH/0Qs/wodXHNI2SF5VgL4jE04JawSPSB
|
||||
Unseal Key 3: VuYkOkQ8qmwofDmjqsTRQoMqGAH3Jv+nqQylL7Uibbtp
|
||||
Unseal Key 4: JJJ8Nqj00qzS9u5wNtTtExL/jWlJF9fgaBsiuaf0kFxC
|
||||
Unseal Key 5: L6lZMp/l7s24EZJAFnWS4Py5jsWOuMioC41g5LhUJKWL
|
||||
|
||||
Initial Root Token: hvs.o07DY7tnSPcufxk60pjCXDzn
|
||||
|
||||
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
|
||||
before it can start servicing requests.
|
||||
|
||||
Vault does not store the generated root key. Without at least 3 keys to
|
||||
reconstruct the root key, Vault will remain permanently sealed!
|
||||
|
||||
It is possible to generate new unseal keys, provided you have a quorum of
|
||||
existing unseal keys shares. See "vault operator rekey" for more information.
|
||||
```
|
||||
|
||||
3. Разблокируйте Vault, используя один из ключей (потом ещё 3 раза выполнить эту команду):
|
||||
```sh
|
||||
vault operator unseal
|
||||
```
|
||||
|
||||
4. Авторизуйтесь с root-токеном:
|
||||
```sh
|
||||
vault login hvs.MTFV72PjKXCVh5ZL6yCVE3Yw
|
||||
```
|
||||
|
||||
5. Создаём(включаем) новое хранилище ключ-значение через ssh
|
||||
```sh
|
||||
vault secrets enable -path=org-ccalm kv-v2
|
||||
```
|
||||
|
||||
|
||||
|
||||
5. Writing to the kv storage (добавил префикс vault. чтобы значения самому подставлять в нужные места в spring)
|
||||
|
||||
Заменит(создаст) значение:
|
||||
```sh
|
||||
vault kv put org-ccalm/jwt vault.server.ssl.key-store-password=MFNX344yh4
|
||||
```
|
||||
Добавит (обновит):
|
||||
```sh
|
||||
vault kv patch org-ccalm/jwt vault.test=test2
|
||||
```
|
||||
```sh
|
||||
vault kv put org-ccalm/public vault.personal_data.key=7dd2Nek1
|
||||
```
|
||||
|
||||
6. Read data from the kv
|
||||
```sh
|
||||
vault kv get org-ccalm/jwt
|
||||
```
|
||||
|
||||
Должно вывести:
|
||||
```text
|
||||
Key Value
|
||||
--- -----
|
||||
server.ssl.key-store-password M4yh4
|
||||
```
|
||||
|
||||
6. Включаем AppRole для доступа из приложения
|
||||
```sh
|
||||
vault auth enable approle
|
||||
```
|
||||
|
||||
7. Добавляем политики потом создаём ключ для этой политикиполитики
|
||||
|
||||
Создаю файл политик
|
||||
```sh
|
||||
cd ~ &&
|
||||
sudo tee jwt-policy.hcl > /dev/null <<'EOF'
|
||||
path "org-ccalm/data/jwt" {
|
||||
capabilities = ["create", "read", "update", "delete", "list"]
|
||||
}
|
||||
path "org-ccalm/data/public" {
|
||||
capabilities = ["read", "list"]
|
||||
}
|
||||
EOF
|
||||
```
|
||||
Apply and delete configiration file:
|
||||
```sh
|
||||
vault policy write jwt-policy ~/jwt-policy.hcl &&
|
||||
rm -f jwt-policy.hcl
|
||||
```
|
||||
|
||||
Создаём AppRole (на 10 лет)
|
||||
```sh
|
||||
vault write auth/approle/role/org-ccalm-jwt \
|
||||
secret_id_ttl=0 \
|
||||
token_ttl=87600h \
|
||||
token_max_ttl=87600h \
|
||||
policies="jwt-policy,another-policy,third-policy"
|
||||
```
|
||||
|
||||
Получаем role_id и secret_id
|
||||
```sh
|
||||
vault read auth/approle/role/org-ccalm-jwt/role-id
|
||||
```
|
||||
Выдало
|
||||
```text
|
||||
Key Value
|
||||
--- -----
|
||||
role_id c0064fe2-8f0e-b317-7fe7-66f7405b45a1
|
||||
```
|
||||
На команду
|
||||
```sh
|
||||
vault write -f auth/approle/role/org-ccalm-jwt/secret-id
|
||||
```
|
||||
Выдало:
|
||||
```text
|
||||
Key Value
|
||||
--- -----
|
||||
secret_id 24f31c88-7185-0d93-9a51-e221c2925265
|
||||
secret_id_accessor 22fa68e3-fc73-2008-0a34-3506630b6693
|
||||
secret_id_num_uses 0
|
||||
secret_id_ttl 0s
|
||||
```
|
||||
Сохрани role_id и secret_id, они понадобятся Spring Boot.
|
||||
|
||||
Хранить ключи лучьше в переменных окружения
|
||||
```sh
|
||||
export VAULT_ROLE_ID="your-role-id" &&
|
||||
export VAULT_SECRET_ID="your-secret-id"
|
||||
```
|
||||
|
||||
|
||||
Проверяем не больше какого значения можно задать время жизни кокена:
|
||||
```sh
|
||||
vault read sys/mounts/auth/token/tune
|
||||
```
|
||||
По умолчанию max_lease_ttl равен 32 дня!
|
||||
|
||||
На год можно увеличить так:
|
||||
```sh
|
||||
vault write sys/mounts/auth/token/tune max_lease_ttl=8760h
|
||||
```
|
||||
|
||||
Create data access token with set politics:
|
||||
```sh
|
||||
vault token create -policy=jwt-policy -ttl=0
|
||||
```
|
||||
|
||||
Продлевать токен можно так:
|
||||
```sh
|
||||
vault token renew <твой-токен>
|
||||
```
|
||||
|
||||
Проверяем зранятся ли токены в хранилище а не в памяти
|
||||
```sh
|
||||
vault read sys/auth/token/tune
|
||||
```
|
||||
token_type = default-service, значит Vault не хранит токены
|
||||
|
||||
Включаем хранение токенов:
|
||||
```sh
|
||||
vault write sys/auth/token/tune token_type=service
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
Теперь HashiCorp Vault установлен и готов к использованию! 🚀
|
||||
|
||||
# Установка HashiCorp Vault на Ubuntu
|
||||
|
||||
Vault — это инструмент от HashiCorp для безопасного хранения секретов и управления ими.
|
||||
|
||||
## 1. Установка Vault
|
||||
|
||||
Открываю нужный сервер
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
Connecting to infrastructure:
|
||||
```sh
|
||||
ssh igor@192.168.200.85 -p 22
|
||||
```
|
||||
|
||||
### 1.1. Добавление репозитория HashiCorp
|
||||
|
||||
1. Установите необходимые пакеты:
|
||||
```sh
|
||||
sudo apt update && sudo apt install -y gnupg software-properties-common curl
|
||||
```
|
||||
|
||||
2. Добавьте официальный GPG-ключ HashiCorp:
|
||||
```sh
|
||||
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
|
||||
```
|
||||
|
||||
3. Добавьте репозиторий HashiCorp в систему:
|
||||
```sh
|
||||
sudo mcedit /etc/apt/sources.list.d/hashicorp.list
|
||||
```
|
||||
|
||||
Заменяем на:
|
||||
```text
|
||||
deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com noble main
|
||||
```
|
||||
Где noble это кодовое имя Ubuntu 24.04
|
||||
|
||||
|
||||
4. Обновите списки пакетов:
|
||||
```sh
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
5. Установите Vault:
|
||||
```sh
|
||||
sudo apt install -y vault
|
||||
```
|
||||
|
||||
6. Проверьте, что Vault установлен правильно:
|
||||
```sh
|
||||
vault --version
|
||||
```
|
||||
Выдало: Vault v1.19.4 (322786e236e268532e4b189845971ba67b5cbb23), built 2025-05-14T13:04:47Z
|
||||
|
||||
|
||||
## 2. Запуск Vault
|
||||
|
||||
### 2.1. Запуск в Dev-режиме (только для тестирования)
|
||||
|
||||
If work stop it:
|
||||
```sh
|
||||
sudo pkill vault
|
||||
```
|
||||
If need delete old data:
|
||||
```sh
|
||||
sudo rm -rf ~/.vault-token ~/.vault/
|
||||
```
|
||||
For find where stored data read file:
|
||||
```sh
|
||||
sudo mcedit /etc/vault/config.hcl
|
||||
```
|
||||
In config file find this path: /opt/vault/data
|
||||
|
||||
После удаления базы нужно инициализировать Vault заново:
|
||||
```sh
|
||||
sudo vault operator init
|
||||
```
|
||||
|
||||
Run in developer mode (in dev mode data stored in RAM):
|
||||
```sh
|
||||
vault server -dev
|
||||
```
|
||||
|
||||
```text
|
||||
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
|
||||
authenticated to the CLI, so you can immediately begin using Vault.
|
||||
|
||||
You may need to set the following environment variables:
|
||||
|
||||
$ export VAULT_ADDR='http://127.0.0.1:8200'
|
||||
|
||||
The unseal key and root token are displayed below in case you want to
|
||||
seal/unseal the Vault or re-authenticate.
|
||||
|
||||
Unseal Key: TMb6A3QI3wJ9kaEeTYo5wEviP23lugJ3Asek2la6V4s=
|
||||
Root Token: hvs.GsWHRR7ne7gMTZhuPgZdh91w
|
||||
|
||||
Development mode should NOT be used in production installations!
|
||||
```
|
||||
|
||||
Теперь Vault работает по адресу:
|
||||
```sh
|
||||
start http://127.0.0.1:8200
|
||||
```
|
||||
Останавливаю нажатием Ctrl + C
|
||||
|
||||
### 2.2. Настройка Vault в режиме сервера
|
||||
|
||||
Creating sel signed sertificate:
|
||||
```sh
|
||||
sudo openssl req -new -x509 -days 365 -nodes \
|
||||
-out /etc/vault.d/vault.local.crt \
|
||||
-keyout /etc/vault.d/vault.local.key \
|
||||
-subj "/CN=yourdomain.local"
|
||||
```
|
||||
|
||||
Set file owner
|
||||
```sh
|
||||
sudo chown -R vault:vault /etc/vault.d/
|
||||
```
|
||||
|
||||
1. Создайте конфигурационный файл, Добавьте следующий конфиг:
|
||||
```sh
|
||||
sudo mkdir -p /etc/vault &&
|
||||
cd /etc/vault &&
|
||||
sudo tee config.hcl > /dev/null <<'EOF'
|
||||
|
||||
storage "file" {
|
||||
path = "/opt/vault/data"
|
||||
}
|
||||
|
||||
listener "tcp" {
|
||||
address = "0.0.0.0:8200"
|
||||
tls_cert_file = "/etc/vault.d/vault.local.crt"
|
||||
tls_key_file = "/etc/vault.d/vault.local.key"
|
||||
}
|
||||
|
||||
disable_mlock = true
|
||||
ui = true
|
||||
EOF
|
||||
```
|
||||
|
||||
3. Создайте папку для хранения данных:
|
||||
```sh
|
||||
sudo mkdir -p /opt/vault/data &&
|
||||
sudo chown vault:vault /opt/vault/data
|
||||
```
|
||||
|
||||
4. Создайте systemd-сервис для Vault:
|
||||
```sh
|
||||
sudo tee /etc/systemd/system/vault.service > /dev/null <<'EOF'
|
||||
[Unit]
|
||||
Description=HashiCorp Vault
|
||||
After=network-online.target
|
||||
Requires=network-online.target
|
||||
|
||||
[Service]
|
||||
User=vault
|
||||
Group=vault
|
||||
ExecStart=/usr/bin/vault server -config=/etc/vault/config.hcl
|
||||
ExecReload=/bin/kill --signal HUP \$MAINPID
|
||||
KillSignal=SIGTERM
|
||||
Restart=on-failure
|
||||
LimitMEMLOCK=infinity
|
||||
ProtectSystem=full
|
||||
CapabilityBoundingSet=CAP_IPC_LOCK CAP_SETGID CAP_SETUID CAP_SYSLOG CAP_CHOWN
|
||||
NoNewPrivileges=yes
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
```
|
||||
Проверяем всё ли записалось:
|
||||
```sh
|
||||
sudo mcedit /etc/systemd/system/vault.service
|
||||
```
|
||||
|
||||
5. Перезапустите systemd и включите Vault:
|
||||
```sh
|
||||
sudo systemctl daemon-reload &&
|
||||
sudo systemctl enable vault &&
|
||||
sudo systemctl start vault
|
||||
```
|
||||
```sh
|
||||
sudo systemctl restart vault
|
||||
```
|
||||
7. Проверьте статус:
|
||||
```sh
|
||||
sudo systemctl status vault
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Инициализация и разлочка Vault
|
||||
|
||||
1. Экспортируйте переменную окружения:
|
||||
```sh
|
||||
export VAULT_ADDR='http://127.0.0.1:8200'
|
||||
```
|
||||
|
||||
2. Инициализируйте хранилище (сохраните ключи!):
|
||||
```sh
|
||||
vault operator init
|
||||
```
|
||||
|
||||
Выдало:
|
||||
```text
|
||||
Unseal Key 1: lQlJsb9RI8rSzLrc5iPnx1qJkWZbbXIkrEgnQGe5R6uO
|
||||
Unseal Key 2: 0qJJXRo570jlH/0Qs/wodXHNI2SF5VgL4jE04JawSPSB
|
||||
Unseal Key 3: VuYkOkQ8qmwofDmjqsTRQoMqGAH3Jv+nqQylL7Uibbtp
|
||||
Unseal Key 4: JJJ8Nqj00qzS9u5wNtTtExL/jWlJF9fgaBsiuaf0kFxC
|
||||
Unseal Key 5: L6lZMp/l7s24EZJAFnWS4Py5jsWOuMioC41g5LhUJKWL
|
||||
|
||||
Initial Root Token: hvs.o07DY7tnSPcufxk60pjCXDzn
|
||||
|
||||
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
|
||||
before it can start servicing requests.
|
||||
|
||||
Vault does not store the generated root key. Without at least 3 keys to
|
||||
reconstruct the root key, Vault will remain permanently sealed!
|
||||
|
||||
It is possible to generate new unseal keys, provided you have a quorum of
|
||||
existing unseal keys shares. See "vault operator rekey" for more information.
|
||||
```
|
||||
|
||||
3. Разблокируйте Vault, используя ключ (потом ещё 3 раза выполнить эту команду):
|
||||
```sh
|
||||
vault operator unseal
|
||||
```
|
||||
|
||||
4. Авторизуйтесь с root-токеном:
|
||||
```sh
|
||||
vault login hvs.MTFV72PjKXCVh5ZL6yCVE3Yw
|
||||
```
|
||||
|
||||
5. Создаём(включаем) новое хранилище ключ-значение через ssh
|
||||
```sh
|
||||
export VAULT_TOKEN=hvs.FDMfGORUazCHm7jGrSofBVbx &&
|
||||
vault secrets enable -path=org-ccalm kv-v2
|
||||
```
|
||||
|
||||
|
||||
|
||||
5. Writing to the kv storage (добавил префикс vault. чтобы значения самому подставлять в нужные места в spring)
|
||||
|
||||
Заменит(создаст) значение:
|
||||
```sh
|
||||
vault kv put org-ccalm/jwt vault.server.ssl.key-store-password=MFNX344yh4
|
||||
```
|
||||
Добавит (обновит):
|
||||
```sh
|
||||
vault kv patch org-ccalm/jwt vault.test=test2
|
||||
```
|
||||
```sh
|
||||
vault kv put org-ccalm/public vault.personal_data.key=7dd2Nek1
|
||||
```
|
||||
|
||||
6. Read data from the kv
|
||||
```sh
|
||||
vault kv get org-ccalm/jwt
|
||||
```
|
||||
|
||||
Должно вывести:
|
||||
```text
|
||||
Key Value
|
||||
--- -----
|
||||
server.ssl.key-store-password M4yh4
|
||||
```
|
||||
|
||||
6. Включаем AppRole для доступа из приложения
|
||||
```sh
|
||||
vault auth enable approle
|
||||
```
|
||||
|
||||
7. Добавляем политики потом создаём ключ для этой политики
|
||||
|
||||
Создаю файл политик
|
||||
```sh
|
||||
cd ~ &&
|
||||
sudo tee jwt-policy.hcl > /dev/null <<'EOF'
|
||||
path "org-ccalm/data/jwt" {
|
||||
capabilities = ["create", "read", "update", "delete", "list"]
|
||||
}
|
||||
path "org-ccalm/data/public" {
|
||||
capabilities = ["read", "list"]
|
||||
}
|
||||
EOF
|
||||
```
|
||||
Apply and delete configiration file:
|
||||
```sh
|
||||
vault policy write jwt-policy ~/jwt-policy.hcl &&
|
||||
rm -f jwt-policy.hcl
|
||||
```
|
||||
|
||||
Создаём AppRole (на 10 лет)
|
||||
```sh
|
||||
vault write auth/approle/role/org-ccalm-jwt \
|
||||
secret_id_ttl=0 \
|
||||
token_ttl=87600h \
|
||||
token_max_ttl=87600h \
|
||||
policies="jwt-policy,another-policy,third-policy"
|
||||
```
|
||||
|
||||
Получаем role_id и secret_id
|
||||
```sh
|
||||
vault read auth/approle/role/org-ccalm-jwt/role-id
|
||||
```
|
||||
Выдало
|
||||
```text
|
||||
Key Value
|
||||
--- -----
|
||||
role_id c0064fe2-8f0e-b317-7fe7-66f7405b45a1
|
||||
```
|
||||
На команду
|
||||
```sh
|
||||
vault write -f auth/approle/role/org-ccalm-jwt/secret-id
|
||||
```
|
||||
Выдало:
|
||||
```text
|
||||
Key Value
|
||||
--- -----
|
||||
secret_id 24f31c88-7185-0d93-9a51-e221c2925265
|
||||
secret_id_accessor 22fa68e3-fc73-2008-0a34-3506630b6693
|
||||
secret_id_num_uses 0
|
||||
secret_id_ttl 0s
|
||||
```
|
||||
Сохрани role_id и secret_id, они понадобятся Spring Boot.
|
||||
|
||||
Хранить ключи лучьше в переменных окружения
|
||||
```sh
|
||||
export VAULT_ROLE_ID="your-role-id" &&
|
||||
export VAULT_SECRET_ID="your-secret-id"
|
||||
```
|
||||
|
||||
|
||||
Проверяем не больше какого значения можно задать время жизни токена:
|
||||
```sh
|
||||
vault read sys/mounts/auth/token/tune
|
||||
```
|
||||
По умолчанию max_lease_ttl равен 32 дня!
|
||||
|
||||
На год можно увеличить так:
|
||||
```sh
|
||||
vault write sys/mounts/auth/token/tune max_lease_ttl=8760h
|
||||
```
|
||||
|
||||
Create data access token with set politics:
|
||||
```sh
|
||||
vault token create -policy=jwt-policy -ttl=0
|
||||
```
|
||||
|
||||
Продлевать токен можно так:
|
||||
```sh
|
||||
vault token renew <твой-токен>
|
||||
```
|
||||
|
||||
Проверяем хранятся ли токены в хранилище а не в памяти
|
||||
```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"
|
||||
|
||||
@ -1,136 +1,136 @@
|
||||
|
||||
Загрузить в HashiCorp Vault настройки можно так:
|
||||
|
||||
```sh
|
||||
vault kv put secret/org-ccalm-jwt \
|
||||
jwt.secret=my-secret-value \
|
||||
db.user=admin \
|
||||
db.pass=123456
|
||||
```
|
||||
|
||||
Разбор параметров:
|
||||
1. vault kv put – команда для записи ключей и значений в KV-хранилище Vault.
|
||||
2. secret/org-ccalm-jwt – путь к секрету.
|
||||
* secret/ – это backend-хранилище (оно должно быть включено в Vault).
|
||||
* org-ccalm-jwt – имя секрета, под которым сохраняются параметры.
|
||||
3. jwt.secret=my-secret-value – ключ jwt.secret со значением my-secret-value.
|
||||
4. db.user=admin – ключ db.user со значением admin.
|
||||
5. db.pass=123456 – ключ db.pass со значением 123456.
|
||||
|
||||
|
||||
# 🚀 Установка и настройка HashiCorp Vault на Windows
|
||||
|
||||
## 📌 1. Установка HashiCorp Vault
|
||||
|
||||
1. **Скачайте Vault CLI** с официального сайта:
|
||||
🔗 [https://developer.hashicorp.com/vault/downloads](https://developer.hashicorp.com/vault/downloads)
|
||||
2. Распакуйте архив и **добавьте путь к `vault.exe` в `PATH`**:
|
||||
- Кликните **ПКМ → Этот компьютер → Свойства → Дополнительные параметры системы**.
|
||||
- В **Переменные среды** добавьте путь к папке с `vault.exe`.
|
||||
3. Откройте **cmd** или **PowerShell** и проверьте установку командой:
|
||||
```sh
|
||||
vault --version
|
||||
```
|
||||
Если всё ОК, увидите версию Vault. Примерно такую: Vault v1.18.4 (503be623a3697e8c10c254dc87d26492c46753e1), built 2025-01-29T13:57:54Z
|
||||
|
||||
---
|
||||
|
||||
## 📌 2. Запуск Vault-сервера (разработческий режим)
|
||||
|
||||
Чтобы локально запустить Vault в **dev-режиме** (без авторизации), выполните:
|
||||
```sh
|
||||
vault server -dev
|
||||
```
|
||||
После запуска он покажет **root-токен** (сохраните его!):
|
||||
```plaintext
|
||||
Unseal Key: x1jUXpLJREI6M1+Qm6m/h3NLEhaEmBageqw0v+dSSKo=
|
||||
Root Token: hvs.V7Rc8uJ8YJ0AASKZfep6oYNe
|
||||
```
|
||||
|
||||
Теперь Vault работает по адресу:
|
||||
```sh
|
||||
start http://127.0.0.1:8200
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📌 3. Экспорт токена (чтобы не вводить каждый раз)
|
||||
|
||||
Откройте **PowerShell** и выполните:
|
||||
```sh
|
||||
$env:VAULT_ADDR="http://127.0.0.1:8200"
|
||||
$env:VAULT_TOKEN="hvs.JDIyKgDMagA0WyIhLFQ4mAjZ"
|
||||
```
|
||||
(Замените `hvs.JDIyKgDMagA0WyIhLFQ4mAjZ` на свой токен.)
|
||||
|
||||
Теперь можно работать с Vault без ввода токена каждый раз.
|
||||
|
||||
---
|
||||
|
||||
## 📌 4. Запись значений в Vault на Windows
|
||||
|
||||
Значения разделенные пробелами можно записать в вольт так:
|
||||
```sh
|
||||
vault kv put secret/kz-istransit-jwt server.ssl.key-store-password=MFNX344yh4
|
||||
```
|
||||
Выдаст примерно такое:
|
||||
======== Secret Path ========
|
||||
secret/data/kz-istransit-jwt
|
||||
|
||||
======= Metadata =======
|
||||
Key Value
|
||||
--- -----
|
||||
created_time 2025-02-24T12:49:45.7630328Z
|
||||
custom_metadata <nil>
|
||||
deletion_time n/a
|
||||
destroyed false
|
||||
version 1
|
||||
|
||||
---
|
||||
|
||||
## 📌 5. Проверка сохранённых данных
|
||||
|
||||
Чтобы посмотреть, что записано в Vault:
|
||||
```sh
|
||||
vault kv get secret/kz-istransit-jwt
|
||||
```
|
||||
Если всё настроено правильно, вы увидите примерно такой вывод:
|
||||
```plaintext
|
||||
====== Metadata ======
|
||||
Key Value
|
||||
--- -----
|
||||
created_time 2025-02-24T12:00:00Z
|
||||
version 1
|
||||
|
||||
====== Data ======
|
||||
Key Value
|
||||
--- -----
|
||||
db.pass 123456
|
||||
db.user admin
|
||||
jwt.secret my-secret-value
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📌 6. Удаление данных из Vault
|
||||
|
||||
Удаление данных:
|
||||
```sh
|
||||
vault kv delete secret/org-ccalm-jwt
|
||||
```
|
||||
Полное уничтожение (без возможности восстановления):
|
||||
```sh
|
||||
vault kv destroy -versions=1 secret/org-ccalm-jwt
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Итог
|
||||
✅ Установили Vault CLI
|
||||
✅ Запустили Vault сервер (`vault server -dev`)
|
||||
✅ Экспортировали `VAULT_ADDR` и `VAULT_TOKEN`
|
||||
✅ Записали настройки в Vault
|
||||
✅ Проверили данные
|
||||
|
||||
Теперь можно интегрировать Vault в Spring Boot 🚀
|
||||
|
||||
|
||||
Загрузить в HashiCorp Vault настройки можно так:
|
||||
|
||||
```sh
|
||||
vault kv put secret/org-ccalm-jwt \
|
||||
jwt.secret=my-secret-value \
|
||||
db.user=admin \
|
||||
db.pass=123456
|
||||
```
|
||||
|
||||
Разбор параметров:
|
||||
1. vault kv put – команда для записи ключей и значений в KV-хранилище Vault.
|
||||
2. secret/org-ccalm-jwt – путь к секрету.
|
||||
* secret/ – это backend-хранилище (оно должно быть включено в Vault).
|
||||
* org-ccalm-jwt – имя секрета, под которым сохраняются параметры.
|
||||
3. jwt.secret=my-secret-value – ключ jwt.secret со значением my-secret-value.
|
||||
4. db.user=admin – ключ db.user со значением admin.
|
||||
5. db.pass=123456 – ключ db.pass со значением 123456.
|
||||
|
||||
|
||||
# 🚀 Установка и настройка HashiCorp Vault на Windows
|
||||
|
||||
## 📌 1. Установка HashiCorp Vault
|
||||
|
||||
1. **Скачайте Vault CLI** с официального сайта:
|
||||
🔗 [https://developer.hashicorp.com/vault/downloads](https://developer.hashicorp.com/vault/downloads)
|
||||
2. Распакуйте архив и **добавьте путь к `vault.exe` в `PATH`**:
|
||||
- Кликните **ПКМ → Этот компьютер → Свойства → Дополнительные параметры системы**.
|
||||
- В **Переменные среды** добавьте путь к папке с `vault.exe`.
|
||||
3. Откройте **cmd** или **PowerShell** и проверьте установку командой:
|
||||
```sh
|
||||
vault --version
|
||||
```
|
||||
Если всё ОК, увидите версию Vault. Примерно такую: Vault v1.18.4 (503be623a3697e8c10c254dc87d26492c46753e1), built 2025-01-29T13:57:54Z
|
||||
|
||||
---
|
||||
|
||||
## 📌 2. Запуск Vault-сервера (разработческий режим)
|
||||
|
||||
Чтобы локально запустить Vault в **dev-режиме** (без авторизации), выполните:
|
||||
```sh
|
||||
vault server -dev
|
||||
```
|
||||
После запуска он покажет **root-токен** (сохраните его!):
|
||||
```plaintext
|
||||
Unseal Key: x1jUXpLJREI6M1+Qm6m/h3NLEhaEmBageqw0v+dSSKo=
|
||||
Root Token: hvs.V7Rc8uJ8YJ0AASKZfep6oYNe
|
||||
```
|
||||
|
||||
Теперь Vault работает по адресу:
|
||||
```sh
|
||||
start http://127.0.0.1:8200
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📌 3. Экспорт токена (чтобы не вводить каждый раз)
|
||||
|
||||
Откройте **PowerShell** и выполните:
|
||||
```sh
|
||||
$env:VAULT_ADDR="http://127.0.0.1:8200"
|
||||
$env:VAULT_TOKEN="hvs.JDIyKgDMagA0WyIhLFQ4mAjZ"
|
||||
```
|
||||
(Замените `hvs.JDIyKgDMagA0WyIhLFQ4mAjZ` на свой токен.)
|
||||
|
||||
Теперь можно работать с Vault без ввода токена каждый раз.
|
||||
|
||||
---
|
||||
|
||||
## 📌 4. Запись значений в Vault на Windows
|
||||
|
||||
Значения разделенные пробелами можно записать в вольт так:
|
||||
```sh
|
||||
vault kv put secret/kz-istransit-jwt server.ssl.key-store-password=MFNX344yh4
|
||||
```
|
||||
Выдаст примерно такое:
|
||||
======== Secret Path ========
|
||||
secret/data/kz-istransit-jwt
|
||||
|
||||
======= Metadata =======
|
||||
Key Value
|
||||
--- -----
|
||||
created_time 2025-02-24T12:49:45.7630328Z
|
||||
custom_metadata <nil>
|
||||
deletion_time n/a
|
||||
destroyed false
|
||||
version 1
|
||||
|
||||
---
|
||||
|
||||
## 📌 5. Проверка сохранённых данных
|
||||
|
||||
Чтобы посмотреть, что записано в Vault:
|
||||
```sh
|
||||
vault kv get secret/kz-istransit-jwt
|
||||
```
|
||||
Если всё настроено правильно, вы увидите примерно такой вывод:
|
||||
```plaintext
|
||||
====== Metadata ======
|
||||
Key Value
|
||||
--- -----
|
||||
created_time 2025-02-24T12:00:00Z
|
||||
version 1
|
||||
|
||||
====== Data ======
|
||||
Key Value
|
||||
--- -----
|
||||
db.pass 123456
|
||||
db.user admin
|
||||
jwt.secret my-secret-value
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📌 6. Удаление данных из Vault
|
||||
|
||||
Удаление данных:
|
||||
```sh
|
||||
vault kv delete secret/org-ccalm-jwt
|
||||
```
|
||||
Полное уничтожение (без возможности восстановления):
|
||||
```sh
|
||||
vault kv destroy -versions=1 secret/org-ccalm-jwt
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Итог
|
||||
✅ Установили Vault CLI
|
||||
✅ Запустили Vault сервер (`vault server -dev`)
|
||||
✅ Экспортировали `VAULT_ADDR` и `VAULT_TOKEN`
|
||||
✅ Записали настройки в Vault
|
||||
✅ Проверили данные
|
||||
|
||||
Теперь можно интегрировать Vault в Spring Boot 🚀
|
||||
|
||||
428
Ubuntu.md
428
Ubuntu.md
@ -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 * * * /opt/backups/backup.sh
|
||||
|
||||
/opt/backups/backup.sh
|
||||
|
||||
Проверяю таблицу:
|
||||
sudo crontab -l -u www-data
|
||||
****************************************************************************************************
|
||||
@ -510,8 +512,8 @@ mysqldump -uu1109882_root -proot123456 -h127.0.0.1 db1109882_locust > /root/db11
|
||||
```
|
||||
Включаем модули:
|
||||
```sh
|
||||
sudo phpenmod imap
|
||||
sudo phpenmod mbstring
|
||||
sudo phpenmod imap &&
|
||||
sudo phpenmod mbstring &&
|
||||
sudo a2enmod rewrite
|
||||
```
|
||||
|
||||
@ -519,13 +521,14 @@ mysqldump -uu1109882_root -proot123456 -h127.0.0.1 db1109882_locust > /root/db11
|
||||
```sh
|
||||
sudo sed -i 's/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf
|
||||
```
|
||||
|
||||
Проверяем файл:
|
||||
```sh
|
||||
sudo mcedit /etc/apache2/apache2.conf
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo a2enmod php8.0
|
||||
sudo a2enmod php8.1
|
||||
sudo a2enmod ssl #Так как в последнее время делаю через haproxy то SSL в апачи не использую
|
||||
sudo a2enmod headers
|
||||
sudo a2enmod expires
|
||||
@ -648,7 +651,7 @@ https://apache-windows.ru/apache-ssl-переход-apache-на-https/
|
||||
sudo a2dissite jwt2.local.conf
|
||||
sudo a2dissite jwt.local.conf
|
||||
|
||||
|
||||
sudo a2dissite aistransit.kz.conf
|
||||
|
||||
http://aistransit.kz/
|
||||
|
||||
@ -969,6 +972,7 @@ DefaultRoot ~
|
||||
ServerIdent on "FTP Server ready."
|
||||
RequireValidShell off
|
||||
AuthUserFile /etc/proftpd/ftpd.passwd
|
||||
PassivePorts 40000 40100
|
||||
|
||||
Для создания нового виртуального пользователя "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=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=jointech --uid=33 --gid=33 --home=/opt/SServerJointech/ftp --shell=/bin/false
|
||||
|
||||
|
||||
Задал пароль для apk пользователя: vooOtKBb7bckcNh
|
||||
Задал пароль для rebezov.a : BU39kb2
|
||||
Задал пароль для jointech : jointech
|
||||
|
||||
|
||||
задал пароль:
|
||||
zoto!23+
|
||||
@ -2011,388 +2021,6 @@ restart: always: Гарантирует, что контейнер будет а
|
||||
|
||||
Открываем: https://127.0.0.1:9443
|
||||
После предложения задания пароля для пользователя 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/
|
||||
@ -2432,34 +2060,6 @@ admin admin поменял на admin deSert!123
|
||||
Ошибка на мейке...
|
||||
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
|
||||
sudo apt-get install dnsmasq
|
||||
sudo apt-get install resolvconf
|
||||
|
||||
143
WireGuard_install.md
Normal file
143
WireGuard_install.md
Normal 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)**, чтобы ты только ключи подставил?
|
||||
Reference in New Issue
Block a user