This commit is contained in:
Igor I
2025-06-26 17:18:11 +05:00
25 changed files with 2641 additions and 1506 deletions

View File

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

View File

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

View File

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

View File

@ -206,7 +206,8 @@ sudo pdnsutil add-record locust.ge @ NS 3600 ns2.geovizor.top
For deleting record please run command: For deleting record please run command:
```sh ```sh
pdnsutil delete-rrset locust.ge locust.ge.locust.ge NS sudo pdnsutil delete-rrset locust.ge locust.ge.locust.ge NS
sudo pdnsutil delete-rrset geovizor.top gotify A
``` ```
@ -223,7 +224,7 @@ Minimum = 3600 (1 час)
Проверим список зон Проверим список зон
```sh ```sh
sudo pdnsutil list-all-zones && sudo pdnsutil list-all-zones &&
sudo pdnsutil list-zone locust.kz sudo pdnsutil list-zone geovizor.top
``` ```
Проверяем отвечалет ли: Проверяем отвечалет ли:
```sh ```sh
@ -245,6 +246,22 @@ dig @88.218.94.134 -p 53 powerdns.geovizor.top A
### Теперь можно настроить HTTPS для взаимодействия через API с сервером для динамического задания IP адресов ### Теперь можно настроить HTTPS для взаимодействия через API с сервером для динамического задания IP адресов
```sh ```sh
new_ip_address=
FILE=/etc/ddns/mesh.txt
if test -f "$FILE"; then
new_ip_address=`cat $FILE`
rm $FILE
fi
len=${#new_ip_address}
if [ $len -gt 3 ]
then
echo "New IP address = $new_ip_address"
else
echo "Not find IP address"
exit
fi
API_KEY="40c89f2a-e2f3-4ff8-a245-3547111f6677" API_KEY="40c89f2a-e2f3-4ff8-a245-3547111f6677"
SERVER="156.244.31.209" SERVER="156.244.31.209"
ZONE="geovizor.top" ZONE="geovizor.top"
@ -364,7 +381,7 @@ journalctl -u pdns-recursor --no-pager | tail -n 50
``` ```
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
## ********** По идее отключать не нужно так как systemd-resolved использует другой IP: 127.0.0.54:53 (Отключаю systemd-resolved иначе он будет конфликтовать с PowerDNS) ********** ## ********** По идее systemd-resolved отключать не нужно так как он использует другой IP: 127.0.0.54:53 **********
Редактирую /etc/netplan/ для того чтобы прописать поднятый DNS сервер на 127.0.0.1 (не знаю сработает ли так как отключу systemd-resolved) Редактирую /etc/netplan/ для того чтобы прописать поднятый DNS сервер на 127.0.0.1 (не знаю сработает ли так как отключу systemd-resolved)
```sh ```sh
@ -613,7 +630,7 @@ open http://192.168.200.85:9191/login
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
Настраиваем запус на постоянную работу через Gunicorn и systemd Настраиваем запуск на постоянную работу через Gunicorn и systemd
```sh ```sh
cd /opt/web/powerdns-admin && cd /opt/web/powerdns-admin &&

52
DNS/Ubuntu_config.md Normal file
View File

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

View File

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

171
Logs/Vector_dev_install.md Normal file
View File

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

View File

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

View File

@ -19,8 +19,9 @@ sudo apt-get install nginx -y
``` ```
Самой важной строкой является Common Name (введите FQDN или свое имя). Как правило, в эту строку вносят доменное имя, с которым нужно связать сервер. В случае если доменного имени нет, внесите в эту строку IP-адрес сервера. Самой важной строкой является Common Name (введите FQDN или свое имя). Как правило, в эту строку вносят доменное имя, с которым нужно связать сервер. В случае если доменного имени нет, внесите в эту строку IP-адрес сервера.
```sh ```sh
sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096 sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048
``` ```
И вписываем в него: И вписываем в него:
```sh ```sh
cd /etc/nginx/sites-available/ && cd /etc/nginx/sites-available/ &&
@ -29,17 +30,26 @@ server {
listen 8081 ssl http2; listen 8081 ssl http2;
listen [::]:8081 ssl http2; listen [::]:8081 ssl http2;
server_name ccalm.org; root /opt/www/org_ccalm;
index index.html;
server_name ccalm.org www.ccalm.org;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key; ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
ssl_dhparam /etc/nginx/dhparam.pem; ssl_dhparam /etc/nginx/dhparam.pem;
root /opt/www/org_ccalm;
index index.html index.htm;
location / { location / {
try_files $uri $uri/ =404; # Попытка найти файл или возвращение 404 try_files $uri $uri/ =404;
# Оптимизация для быстрой отдачи статики
sendfile on; # Использует sendfile() ядра Linux для ускорения
tcp_nopush off; # Отключает задержку Nagle (если нужна мгновенная отправка)
}
location ~ /index\.html$ {
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate";
add_header Pragma "no-cache";
add_header Expires 0;
} }
} }
EOF EOF
@ -50,8 +60,6 @@ EOF
sudo ln -s /etc/nginx/sites-available/ccalm.org /etc/nginx/sites-enabled/ sudo ln -s /etc/nginx/sites-available/ccalm.org /etc/nginx/sites-enabled/
``` ```
```sh ```sh
sudo systemctl restart nginx sudo systemctl restart nginx
``` ```
@ -79,17 +87,17 @@ journalctl -u nginx.service -n 50
cd /etc/nginx/sites-available/ && cd /etc/nginx/sites-available/ &&
sudo tee geovizor.top > /dev/null <<'EOF' sudo tee geovizor.top > /dev/null <<'EOF'
server { server {
listen 8081; listen 8081;
listen [::]:8081; listen [::]:8081;
root /opt/www/istransit.kz; root /opt/www/istransit.kz;
index index.html; index index.html;
server_name istransit.kz www.istransit.kz; server_name istransit.kz www.istransit.kz;
location / { location / {
try_files $uri $uri/ =404; try_files $uri $uri/ =404;
} }
location ~ /index\.html$ { location ~ /index\.html$ {
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate"; add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate";
add_header Pragma "no-cache"; add_header Pragma "no-cache";

View File

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

View File

@ -122,6 +122,8 @@ sudo mcedit /etc/postgresql/16/main/pg_hba.conf
sudo netstat -tap | grep 5432 sudo netstat -tap | grep 5432
Создать Backup (при переносе со старой на новую версию может быть не совместим для этого нужно делать бакам в текстовом формате: plain): Создать 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 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 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 zholak>/home/zholak/zholak.sql --host=127.0.0.1 --username=postgres
@ -156,8 +158,11 @@ sudo mcedit /etc/postgresql/16/main/pg_hba.conf
pg_restore -U postgres -d transit_new -1 /home/administrator/temp/transit.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 -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=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 sudo -u postgres psql -d transit -f /tmp/transit.backup
Или из архива (первоначально задать trust на 127.0.0.1) так: Или из архива (первоначально задать trust на 127.0.0.1) так:
gunzip -c /var/www/dump.sql.gz | psql -h 127.0.0.1 -U bigfoott_root -d bigfoott_shop gunzip -c /var/www/dump.sql.gz | psql -h 127.0.0.1 -U bigfoott_root -d bigfoott_shop
@ -287,6 +292,7 @@ sudo apt-get install phppgadmin
Установка pgAdmin4 через докер контейнер Установка pgAdmin4 через докер контейнер
```sh ```sh
sudo mkdir -p /opt/pgAdmin4/backups &&
sudo mkdir -p /opt/pgAdmin4 && sudo mkdir -p /opt/pgAdmin4 &&
sudo chmod -R 777 /opt/pgAdmin4 && sudo chmod -R 777 /opt/pgAdmin4 &&
sudo chown -R $USER:$USER /opt/pgAdmin4 sudo chown -R $USER:$USER /opt/pgAdmin4
@ -307,7 +313,7 @@ services:
PGADMIN_DEFAULT_PASSWORD: 123456 PGADMIN_DEFAULT_PASSWORD: 123456
volumes: volumes:
- pgadmin_data:/var/lib/pgadmin - pgadmin_data:/var/lib/pgadmin
- /opt/pgAdmin4/backups:/var/lib/pgadmin/storage
volumes: volumes:
pgadmin_data: pgadmin_data:
EOF EOF
@ -325,8 +331,9 @@ EOF
sudo docker compose down sudo docker compose down
``` ```
```sh
open http://localhost:5050
```
Проверить что не записан левый репозиторий для phppgadmin в /ect/opt/ Проверить что не записан левый репозиторий для phppgadmin в /ect/opt/

View File

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

View File

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

View File

@ -1,8 +1,10 @@
С внешки во внутрянную инфраструктуру подключаемся через HAProxy а уже внутри использую Traefik
Открываю нужный сервер Открываю нужный сервер
```sh ```sh
wsl wsl
``` ```
Или такой: Открывает traefik на 192.168.200.85:
```sh ```sh
ssh igor@192.168.200.85 -p 22 ssh igor@192.168.200.85 -p 22
``` ```
@ -105,7 +107,7 @@ http:
ccalm-api-auth: ccalm-api-auth:
entryPoints: entryPoints:
- websecure - websecure
rule: "Host(`ccalm.test`) && PathPrefix(`/api/authorization/v02/`)" rule: "(Host(`ccalm.test`) || Host(`almaty.ccalm.test`)) && PathPrefix(`/api/authorization/v02/`)"
service: org_ccalm_api_authorization_v02 service: org_ccalm_api_authorization_v02
tls: tls:
certresolver: myresolver certresolver: myresolver
@ -115,7 +117,7 @@ http:
ccalm-dbms: ccalm-dbms:
entryPoints: entryPoints:
- websecure - websecure
rule: "Host(`ccalm.test`) && PathPrefix(`/api/dbms/v09/`)" rule: "(Host(`ccalm.test`) || Host(`almaty.ccalm.test`)) && PathPrefix(`/api/dbms/v09/`)"
service: org_ccalm_dbms_v09 service: org_ccalm_dbms_v09
tls: tls:
certresolver: myresolver certresolver: myresolver
@ -125,7 +127,7 @@ http:
ccalm-translation: ccalm-translation:
entryPoints: entryPoints:
- websecure - websecure
rule: "Host(`ccalm.test`) && PathPrefix(`/api/translation/v01/`)" rule: "(Host(`ccalm.test`) || Host(`almaty.ccalm.test`)) && PathPrefix(`/api/translation/v01/`)"
service: org_ccalm_translation_v01 service: org_ccalm_translation_v01
tls: tls:
certresolver: myresolver certresolver: myresolver
@ -135,7 +137,7 @@ http:
ccalm-login: ccalm-login:
entryPoints: entryPoints:
- websecure - websecure
rule: "Host(`ccalm.test`) && PathPrefix(`/login/`)" rule: "(Host(`ccalm.test`) || Host(`almaty.ccalm.test`)) && PathPrefix(`/login/`)"
service: org_ccalm_login_v01 service: org_ccalm_login_v01
tls: tls:
certresolver: myresolver certresolver: myresolver
@ -143,7 +145,7 @@ http:
ccalm-default: ccalm-default:
entryPoints: entryPoints:
- websecure - websecure
rule: "Host(`ccalm.test`)" rule: "(Host(`ccalm.test`) || Host(`almaty.ccalm.test`))"
service: org_ccalm service: org_ccalm
tls: tls:
certresolver: myresolver certresolver: myresolver
@ -155,6 +157,20 @@ http:
service: local_powerdns service: local_powerdns
tls: {} tls: {}
gotify:
entryPoints:
- websecure
rule: "Host(`gotify.local`)"
service: local_gotify
tls: {}
vault:
entryPoints:
- websecure
rule: "Host(`vault.local`)"
service: local_vault
tls: {}
middlewares: middlewares:
strip-auth-prefix: strip-auth-prefix:
stripPrefix: stripPrefix:
@ -180,6 +196,26 @@ http:
path: "/" path: "/"
interval: "5s" interval: "5s"
# Бэкенд для local_gotify
local_gotify:
loadBalancer:
servers:
- url: "https://192.168.200.84:8080"
serversTransport: insecureTransport
healthCheck:
path: "/"
interval: "5s"
# Бэкенд для local_vault
local_vault:
loadBalancer:
servers:
- url: "https://192.168.200.85:8200"
serversTransport: insecureTransport
healthCheck:
path: "/"
interval: "5s"
# Бэкенд для org_ccalm_api_authorization_v02 (HTTPS с отключенной проверкой SSL) # Бэкенд для org_ccalm_api_authorization_v02 (HTTPS с отключенной проверкой SSL)
org_ccalm_api_authorization_v02: org_ccalm_api_authorization_v02:
loadBalancer: loadBalancer:
@ -243,6 +279,10 @@ tls:
keyFile: "/etc/traefik/certs/ccalm.test.key" keyFile: "/etc/traefik/certs/ccalm.test.key"
- certFile: "/etc/traefik/certs/powerdns.local.crt" - certFile: "/etc/traefik/certs/powerdns.local.crt"
keyFile: "/etc/traefik/certs/powerdns.local.key" keyFile: "/etc/traefik/certs/powerdns.local.key"
- certFile: "/etc/traefik/certs/gotify.local.crt"
keyFile: "/etc/traefik/certs/gotify.local.key"
- certFile: "/etc/traefik/certs/vault.local.crt"
keyFile: "/etc/traefik/certs/vault.local.key"
- certFile: "/etc/traefik/certs/wildcard.local.crt" - certFile: "/etc/traefik/certs/wildcard.local.crt"
keyFile: "/etc/traefik/certs/wildcard.local.key" keyFile: "/etc/traefik/certs/wildcard.local.key"
- certFile: "/etc/traefik/certs/wildcard.test.crt" - certFile: "/etc/traefik/certs/wildcard.test.crt"

View File

@ -1,7 +1,7 @@
# Устанавливаю Traefik cервер в Астане # Устанавливаю Traefik cервер в Астане
```sh ```sh
ssh igor@5.180.46.11 -p 2200 ssh ubuntu@194.32.140.11 -p 22
``` ```
# Установка Traefik на Linux Mint / Ubuntu # Установка Traefik на Linux Mint / Ubuntu
@ -82,11 +82,11 @@ entryPoints:
websecure: websecure:
address: ":443" address: ":443"
traefik: traefik:
address: ":8080" address: ":8070"
api: api:
dashboard: true dashboard: true
insecure: true #insecure: true
# Настройка сертификатов (пример с Let's Encrypt) # Настройка сертификатов (пример с Let's Encrypt)
certificatesResolvers: certificatesResolvers:
@ -118,13 +118,15 @@ http:
dashboard: dashboard:
entryPoints: entryPoints:
- traefik - traefik
rule: "Host(`localhost`)" rule: "Host(`194.32.140.11`)"
service: api@internal service: api@internal
middlewares:
- dashboard-auth
ccalm-api-auth: ccalm-api-auth:
entryPoints: entryPoints:
- websecure - websecure
rule: "(Host(`locust.ge`) || Host(`test.ccalm.org`)) && PathPrefix(`/api/authorization/v02/`)" rule: "(Host(`locust.ge`) || Host(`almaty.ccalm.org`) || Host(`ccalm.org`)) && PathPrefix(`/api/authorization/v02/`)"
service: org_ccalm_api_authorization_v02 service: org_ccalm_api_authorization_v02
tls: tls:
certresolver: myresolver certresolver: myresolver
@ -134,7 +136,7 @@ http:
ccalm-dbms: ccalm-dbms:
entryPoints: entryPoints:
- websecure - websecure
rule: "(Host(`locust.ge`) || Host(`test.ccalm.org`)) && PathPrefix(`/api/dbms/v09/`)" rule: "(Host(`locust.ge`) || Host(`almaty.ccalm.org`) || Host(`ccalm.org`)) && PathPrefix(`/api/dbms/v09/`)"
service: org_ccalm_dbms_v09 service: org_ccalm_dbms_v09
tls: tls:
certresolver: myresolver certresolver: myresolver
@ -144,15 +146,17 @@ http:
ccalm-translation: ccalm-translation:
entryPoints: entryPoints:
- websecure - websecure
rule: "(Host(`locust.ge`) || Host(`test.ccalm.org`)) && PathPrefix(`/api/translation/v01/`)" rule: "(Host(`locust.ge`) || Host(`almaty.ccalm.org`) || Host(`ccalm.org`)) && PathPrefix(`/api/translation/v01/`)"
service: org_ccalm_translation_v01 service: org_ccalm_translation_v01
tls: tls:
certresolver: myresolver certresolver: myresolver
middlewares:
- strip-translation-prefix
ccalm-login: ccalm-login:
entryPoints: entryPoints:
- websecure - websecure
rule: "(Host(`locust.ge`) || Host(`test.ccalm.org`)) && PathPrefix(`/login/`)" rule: "(Host(`locust.ge`) || Host(`almaty.ccalm.org`) || Host(`ccalm.org`)) && PathPrefix(`/login/`)"
service: org_ccalm_login_v01 service: org_ccalm_login_v01
tls: tls:
certresolver: myresolver certresolver: myresolver
@ -160,7 +164,7 @@ http:
org-ccalm-main: org-ccalm-main:
entryPoints: entryPoints:
- websecure - websecure
rule: "Host(`locust.ge`) || Host(`test.ccalm.org`)" rule: "Host(`locust.ge`) || Host(`almaty.ccalm.org`) || Host(`ccalm.org`)"
service: org_ccalm_main service: org_ccalm_main
tls: tls:
certresolver: myresolver certresolver: myresolver
@ -199,7 +203,7 @@ http:
org_ccalm_translation_v01: org_ccalm_translation_v01:
loadBalancer: loadBalancer:
servers: servers:
- url: "https://ccalm.org" - url: "https://127.0.0.1:8085"
passHostHeader: false passHostHeader: false
serversTransport: insecureTransport serversTransport: insecureTransport
healthCheck: healthCheck:
@ -246,10 +250,14 @@ http:
stripPrefix: stripPrefix:
prefixes: prefixes:
- "/api/authorization/v02" - "/api/authorization/v02"
strip-translation-prefix:
stripPrefix:
prefixes:
- "/api/translation/v01"
dashboard-auth: dashboard-auth:
basicAuth: basicAuth:
users: users:
- "admin:$apr1$NUoqcU3I$O6VxeuGhsA6RSIyh6rNbo." # Пароль хешируется так: htpasswd -nb admin t745632746573t - "admin:$apr1$NUoqcU3I$O6VxeuGhsA6RSIyh6rNbo." # htpasswd -nb admin t745632746573t
EOF EOF
``` ```
@ -301,11 +309,11 @@ EOF
``` ```
--- ---
ыгвщ куищще
## 🔎 Шаг 6. Проверка работы ## 🔎 Шаг 6. Проверка работы
Откройте в браузере cпаролем что быше "": Откройте в браузере cпаролем что быше "":
```sh ```sh
open https://5.180.46.11:8080/dashboard open http://194.32.140.11:8070/dashboard
``` ```
@ -361,7 +369,7 @@ services:
ports: ports:
- "80:80" # HTTP - "80:80" # HTTP
- "443:443" # HTTPS - "443:443" # HTTPS
- "8080:8080" # Dashboard - "8070:8070" # Dashboard
volumes: volumes:
- /etc/traefik:/etc/traefik - /etc/traefik:/etc/traefik
- /var/run/docker.sock:/var/run/docker.sock:ro - /var/run/docker.sock:/var/run/docker.sock:ro
@ -387,7 +395,7 @@ EOF
Откройте в браузере: Откройте в браузере:
```sh ```sh
open http://192.168.200.85:8080/dashboard/ open http://192.168.200.85:8070/dashboard/
``` ```
```sh ```sh

60
RClone/NFS_install.md Normal file
View File

@ -0,0 +1,60 @@
```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
```
Обновляем:
```sh
sudo mount -a
```

View File

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

136
RClone/WebDAV_install.md Normal file
View File

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

53
Redis_install.md Normal file
View File

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

View File

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

View File

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

View File

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

View File

@ -434,6 +434,8 @@ sudo tar cvpzf /media/usb/backup.tgz --exclude=/var/www --exclude=/etc/fstab --e
0 1 * * * wget -O /dev/null -q 'http://locust.kz/get/list.php' 0 1 * * * wget -O /dev/null -q 'http://locust.kz/get/list.php'
0 1 * * * /opt/backups/backup.sh 0 1 * * * /opt/backups/backup.sh
/opt/backups/backup.sh
Проверяю таблицу: Проверяю таблицу:
sudo crontab -l -u www-data sudo crontab -l -u www-data
**************************************************************************************************** ****************************************************************************************************
@ -2057,34 +2059,6 @@ admin admin поменял на admin deSert!123
Ошибка на мейке... Ошибка на мейке...
install install
**************************************************************************************************** ****************************************************************************************************
Install Redis по мативам: https://timeweb.cloud/tutorials/redis/ustanovka-i-nastrojka-redis-dlya-raznyh-os
sudo apt-get update
sudo apt install redis
redis-cli --version
sudo systemctl status redis
Config:
sudo mcedit /etc/redis/redis.conf
И меняем в конфигурации на: supervised systemd
Также желательно проверить настройку чтобы слушался только IP: 127.0.0.1
bind 0.0.0.0
Также в поле SECURITY нужно установить пароль, сгенерированный при помощи:
openssl rand 25 | openssl base64 -A
Примерно такой должен быть получиться:
requirepass 9F3/NKWeOjd815vkadT2DcgVHf6fEpVQXw==
Перезагружаем:
sudo systemctl restart redis-server
Проверяем Redis:
redis-cli
Или так проверяем:
redis-cli -h 127.0.0.1 -p 6379 -a 9F3/NKWeOjd815vkadT2DcgVHf6fEpVQXw==
И пишем: ping
Проверяем какие порты прослушиваются на компе:
sudo netstat -lnp | grep redis
****************************************************************************************************
Для настройки локального сервера имен DNS сервер в место Bind9 теперь Dnsmasq так как он проще, понадобилось для haproxy Для настройки локального сервера имен DNS сервер в место Bind9 теперь Dnsmasq так как он проще, понадобилось для haproxy
sudo apt-get install dnsmasq sudo apt-get install dnsmasq
sudo apt-get install resolvconf sudo apt-get install resolvconf