Compare commits
12 Commits
3f831b68ab
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 2a29301db8 | |||
| fe5d348b65 | |||
| 162688fccd | |||
| b6111740e8 | |||
| 5745ef2cd6 | |||
| 5d40bb271d | |||
| 3ca998f1cf | |||
| 09241fc5c6 | |||
| f8c995bd43 | |||
| ba1914f646 | |||
| c2f357fae1 | |||
| 91672d99ee |
@ -172,16 +172,15 @@ sudo rabbitmqctl set_parameter shovel kaz_to_arm '{
|
||||
}'
|
||||
```
|
||||
|
||||
Для Кыргызстана (таможенная инфраструктура)
|
||||
Для отправки в Кыргызстана (таможенная инфраструктура)
|
||||
```sh
|
||||
sudo rabbitmqctl set_parameter shovel kaz_to_kgz '{
|
||||
"src-protocol": "amqp091",
|
||||
"src-uri": "amqp://admin:paRabbit!@127.0.0.1:20000/transportation_kgz",
|
||||
"src-queue": "TO_KGZ",
|
||||
"dest-protocol": "amqp091",
|
||||
"dest-uri": "amqp://kz_istt:uzZNYbVTElMDXnfwQx16@192.168.70.133:20000/transportation_kaz",
|
||||
"dest-exchange": "swap",
|
||||
"dest-exchange-key": "KAZ",
|
||||
"dest-uri": "amqp://kz_istt:kzistt123EX@192.168.70.133:20000/kaz_transportation",
|
||||
"dest-queue": "KAZ",
|
||||
"ack-mode": "on-confirm",
|
||||
"publish-properties": {
|
||||
"delivery_mode": 2
|
||||
@ -193,7 +192,7 @@ sudo rabbitmqctl set_parameter shovel kaz_to_kgz '{
|
||||
sudo rabbitmqctl clear_parameter shovel kaz_to_kgz
|
||||
```
|
||||
|
||||
Для отправки из Киргизии нам то такие настройки:
|
||||
НЕ ИСПОЛЬЗОВАТЬ Для отправки из Киргизии нам то такие настройки:
|
||||
```sh
|
||||
sudo rabbitmqctl set_parameter shovel kgz_to_kaz '{
|
||||
"src-protocol": "amqp091",
|
||||
|
||||
83
CI_CD/Woodpecker_CI.md
Normal file
83
CI_CD/Woodpecker_CI.md
Normal file
@ -0,0 +1,83 @@
|
||||
```sh
|
||||
ssh igor@192.168.200.87 -p 22
|
||||
```
|
||||
|
||||
Install
|
||||
```sh
|
||||
sudo apt update &&
|
||||
sudo apt upgrade -y &&
|
||||
sudo apt-get install python3-venv python3-pip &&
|
||||
sudo apt install docker.io -y &&
|
||||
sudo apt install -y docker-compose &&
|
||||
sudo systemctl enable docker &&
|
||||
sudo systemctl start docker &&
|
||||
sudo usermod -aG docker $USER &&
|
||||
docker-compose --version
|
||||
```
|
||||
|
||||
|
||||
Create folder for Woodpecker
|
||||
```sh
|
||||
sudo mkdir -p /opt/woodpecker &&
|
||||
cd /opt/woodpecker
|
||||
```
|
||||
```sh
|
||||
cd /opt/woodpecker
|
||||
sudo tee docker-compose.yml <<'EOF'
|
||||
services:
|
||||
woodpecker-server:
|
||||
image: woodpeckerci/woodpecker-server:latest
|
||||
restart: always
|
||||
ports:
|
||||
- "8000:8000" # Web UI
|
||||
- "8081:9000" # RPC
|
||||
environment:
|
||||
WOODPECKER_OPEN: "true" # Открытый доступ, можно отключить позже
|
||||
WOODPECKER_HOST: "http://192.168.200.87:8000"
|
||||
WOODPECKER_GITEA: "true"
|
||||
WOODPECKER_GITEA_URL: "https://git.mesh.kz"
|
||||
WOODPECKER_GITEA_CLIENT: "e38fdb9c-2878-4e12-9f9a-f75cc7e7e7e3"
|
||||
WOODPECKER_GITEA_SECRET: "gto_gapgutecxrghq4sgbv5lrhoht3h5vfgo6ewidf7uxawkn7fhpuma"
|
||||
WOODPECKER_ADMIN: "your-admin-username"
|
||||
volumes:
|
||||
- woodpecker-data:/var/lib/woodpecker
|
||||
|
||||
woodpecker-agent:
|
||||
image: woodpeckerci/woodpecker-agent:latest
|
||||
restart: always
|
||||
depends_on:
|
||||
- woodpecker-server
|
||||
environment:
|
||||
WOODPECKER_SERVER: "woodpecker-server:9000"
|
||||
WOODPECKER_SECRET: "supersecret"
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
|
||||
volumes:
|
||||
woodpecker-data:
|
||||
EOF
|
||||
```
|
||||
|
||||
```sh
|
||||
cd /opt/woodpecker &&
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
|
||||
```sh
|
||||
cd /opt/woodpecker &&
|
||||
sudo docker-compose down
|
||||
```
|
||||
|
||||
Open URL in browser
|
||||
```sh
|
||||
start http://192.168.200.87:8000
|
||||
```
|
||||
|
||||
Create OAuth2 Application in:
|
||||
```conf
|
||||
https://git.mesh.kz/user/settings/applications
|
||||
https://git.mesh.kz/org/ccalm.org/settings/applications
|
||||
http://192.168.200.87:8000/authorize
|
||||
```
|
||||
|
||||
|
||||
@ -224,7 +224,7 @@ Minimum = 3600 (1 час)
|
||||
Проверим список зон
|
||||
```sh
|
||||
sudo pdnsutil list-all-zones &&
|
||||
sudo pdnsutil list-zone geovizor.top
|
||||
sudo pdnsutil list-zone mesh.kz
|
||||
```
|
||||
Проверяем отвечалет ли:
|
||||
```sh
|
||||
@ -246,6 +246,22 @@ dig @88.218.94.134 -p 53 powerdns.geovizor.top A
|
||||
### Теперь можно настроить HTTPS для взаимодействия через API с сервером для динамического задания IP адресов
|
||||
|
||||
```sh
|
||||
new_ip_address=
|
||||
FILE=/etc/ddns/mesh.txt
|
||||
if test -f "$FILE"; then
|
||||
new_ip_address=`cat $FILE`
|
||||
rm $FILE
|
||||
fi
|
||||
|
||||
len=${#new_ip_address}
|
||||
if [ $len -gt 3 ]
|
||||
then
|
||||
echo "New IP address = $new_ip_address"
|
||||
else
|
||||
echo "Not find IP address"
|
||||
exit
|
||||
fi
|
||||
|
||||
API_KEY="40c89f2a-e2f3-4ff8-a245-3547111f6677"
|
||||
SERVER="156.244.31.209"
|
||||
ZONE="geovizor.top"
|
||||
|
||||
218
Keycloak_install.md
Normal file
218
Keycloak_install.md
Normal file
@ -0,0 +1,218 @@
|
||||
# Установка и базовая настройка Keycloak на Ubuntu
|
||||
|
||||
Это руководство описывает процесс установки Keycloak на Ubuntu (20.04 или 22.04) и его базовую настройку для использования в микросервисной архитектуре.
|
||||
|
||||
## Требования
|
||||
- Ubuntu 20.04 или 22.04.
|
||||
- Java Development Kit (JDK) версии 17 или выше.
|
||||
- Доступ к интернету.
|
||||
- (Опционально) PostgreSQL для продакшен-использования.
|
||||
|
||||
## Шаг 1: Установка Java
|
||||
Keycloak требует Java. Установим OpenJDK 17:
|
||||
|
||||
```sh
|
||||
sudo apt update &&
|
||||
sudo apt install openjdk-21-jdk openjdk-21-jre -y
|
||||
```
|
||||
|
||||
Проверьте версию Java:
|
||||
```sh
|
||||
java -version
|
||||
```
|
||||
|
||||
Ожидаемый вывод:
|
||||
```
|
||||
openjdk 17.0.9 ...
|
||||
```
|
||||
|
||||
## Шаг 2: Загрузка и установка Keycloak
|
||||
1. **Скачайте последнюю версию Keycloak**:
|
||||
```sh
|
||||
wget https://github.com/keycloak/keycloak/releases/download/26.3.0/keycloak-26.3.0.tar.gz
|
||||
```
|
||||
|
||||
2. **Распакуйте архив**:
|
||||
```sh
|
||||
tar -xvzf keycloak-26.3.0.tar.gz
|
||||
sudo mv keycloak-26.3.0 /opt/keycloak
|
||||
```
|
||||
|
||||
3. **Создайте пользователя для Keycloak**:
|
||||
```sh
|
||||
sudo useradd -r -s /bin/false keycloak
|
||||
sudo chown -R keycloak:keycloak /opt/keycloak
|
||||
```
|
||||
|
||||
## Шаг 3: Настройка базы данных (опционально, для продакшена)
|
||||
По умолчанию используется встроенная база H2, но для продакшена рекомендуется PostgreSQL.
|
||||
|
||||
1. **Установите PostgreSQL**:
|
||||
```sh
|
||||
sudo apt install -y postgresql postgresql-contrib
|
||||
```
|
||||
|
||||
2. **Создайте базу данных и пользователя**:
|
||||
```sh
|
||||
sudo -u postgres psql
|
||||
```
|
||||
|
||||
Внутри psql:
|
||||
```sql
|
||||
CREATE DATABASE keycloak;
|
||||
CREATE USER keycloak WITH PASSWORD 'your_secure_password';
|
||||
GRANT ALL PRIVILEGES ON DATABASE keycloak TO keycloak;
|
||||
\q
|
||||
```
|
||||
|
||||
3. **Настройте Keycloak для PostgreSQL**:
|
||||
Отредактируйте `/opt/keycloak/conf/keycloak.conf`:
|
||||
```sh
|
||||
sudo nano /opt/keycloak/conf/keycloak.conf
|
||||
```
|
||||
|
||||
Добавьте:
|
||||
```ini
|
||||
db=postgres
|
||||
db-url=jdbc:postgresql://localhost:5432/keycloak
|
||||
db-username=keycloak
|
||||
db-password=your_secure_password
|
||||
```
|
||||
|
||||
4. **Установите JDBC-драйвер PostgreSQL**:
|
||||
```sh
|
||||
wget https://jdbc.postgresql.org/download/postgresql-42.7.3.jar
|
||||
sudo mv postgresql-42.7.3.jar /opt/keycloak/providers/
|
||||
```
|
||||
|
||||
## Шаг 4: Запуск Keycloak
|
||||
1. **Соберите и настройте Keycloak**:
|
||||
```sh
|
||||
/opt/keycloak/bin/kc.sh build
|
||||
```
|
||||
|
||||
2. **Запустите Keycloak в режиме разработки**:
|
||||
```sh
|
||||
/opt/keycloak/bin/kc.sh start-dev
|
||||
```
|
||||
|
||||
- Работает на `http://localhost:8080`.
|
||||
- Для продакшена используйте `kc.sh start` с HTTPS.
|
||||
|
||||
3. **Проверьте доступ**:
|
||||
Откройте браузер и перейдите по `http://localhost:8080`.
|
||||
|
||||
## Шаг 5: Базовая настройка Keycloak
|
||||
1. **Создайте администратора**:
|
||||
При первом запуске задайте логин и пароль администратора:
|
||||
```sh
|
||||
/opt/keycloak/bin/kc.sh start-dev
|
||||
```
|
||||
|
||||
2. **Войдите в админ-консоль**:
|
||||
- Перейдите по `http://localhost:8080/admin`.
|
||||
- Используйте учетные данные администратора.
|
||||
|
||||
3. **Создайте Realm**:
|
||||
- В админ-консоли выберите **Create Realm**.
|
||||
- Задайте имя, например, `myapp-realm`.
|
||||
|
||||
4. **Создайте клиента**:
|
||||
- В разделе **Clients** выберите **Create client**.
|
||||
- Настройки:
|
||||
- **Client ID**: `myapp-client`.
|
||||
- **Client type**: `OpenID Connect`.
|
||||
- **Client authentication**: Включите для конфиденциального клиента.
|
||||
- **Root URL**: Например, `http://localhost:3000`.
|
||||
- **Valid redirect URIs**: Например, `http://localhost:3000/*`.
|
||||
- Скопируйте **Client Secret**.
|
||||
|
||||
5. **Создайте пользователя**:
|
||||
- В разделе **Users** выберите **Add user**.
|
||||
- Задайте имя, например, `testuser`.
|
||||
- Установите пароль в **Credentials** (например, `testpassword`).
|
||||
|
||||
6. **Настройте роли**:
|
||||
- В разделе **Roles** создайте роль, например, `user`.
|
||||
- Назначьте роль пользователю в **Role Mapping**.
|
||||
|
||||
## Шаг 6: Интеграция с микросервисом
|
||||
1. **Получите OpenID Connect конфигурацию**:
|
||||
- В **Realm Settings** → **General** → **OpenID Endpoint Configuration**.
|
||||
- URL: `http://localhost:8080/realms/myapp-realm/.well-known/openid-configuration`.
|
||||
|
||||
2. **Пример для Spring Boot**:
|
||||
Добавьте зависимость:
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>org.keycloak</groupId>
|
||||
<artifactId>keycloak-spring-boot-starter</artifactId>
|
||||
<version>24.0.5</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
Настройте `application.properties`:
|
||||
```properties
|
||||
keycloak.realm=myapp-realm
|
||||
keycloak.auth-server-url=http://localhost:8080
|
||||
keycloak.resource=myapp-client
|
||||
keycloak.credentials.secret=your-client-secret
|
||||
Elders keycloak.use-resource-role-mappings=true
|
||||
```
|
||||
|
||||
3. **Тестирование**:
|
||||
- Перейдите по:
|
||||
```
|
||||
http://localhost:8080/realms/myapp-realm/protocol/openid-connect/auth?client_id=myapp-client&response_type=code&redirect_uri=http://localhost:3000
|
||||
```
|
||||
- Войдите как `testuser` с паролем `testpassword`.
|
||||
|
||||
## Шаг 7: Настройка Keycloak как службы
|
||||
1. Создайте systemd-сервис:
|
||||
```sh
|
||||
sudo nano /etc/systemd/system/keycloak.service
|
||||
```
|
||||
|
||||
Добавьте:
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Keycloak
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
User=keycloak
|
||||
Group=keycloak
|
||||
WorkingDirectory=/opt/keycloak
|
||||
ExecStart=/opt/keycloak/bin/kc.sh start --hostname=your-domain.com --https-certificate-file=/path/to/cert.pem --https-certificate-key-file=/path/to/key.pem
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
2. Активируйте сервис:
|
||||
```sh
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable keycloak
|
||||
sudo systemctl start keycloak
|
||||
```
|
||||
|
||||
3. Проверьте статус:
|
||||
```sh
|
||||
sudo systemctl status keycloak
|
||||
```
|
||||
|
||||
## Полезные советы
|
||||
- **HTTPS**: Настройте SSL/TLS в `keycloak.conf`:
|
||||
```ini
|
||||
https-certificate-file=/path/to/cert.pem
|
||||
https-certificate-key-file=/path/to/key.pem
|
||||
hostname=your-domain.com
|
||||
```
|
||||
- **Резервное копирование**: Сохраняйте базу данных и настройки realm.
|
||||
- **Логирование**: Включите в `keycloak.conf`:
|
||||
```ini
|
||||
log-level=info
|
||||
```
|
||||
|
||||
Теперь Keycloak установлен, настроен и готов к использованию в вашей микросервисной архитектуре. Вы можете интегрировать его с API Gateway или микросервисами, используя JWT-токены для аутентификации и авторизации. Если нужны дополнительные детали или помощь с конкретным сценарием, дайте знать!
|
||||
@ -10,11 +10,6 @@
|
||||
После создания вы получите токен (например, 8007457609:AAGnrXOSaoxODMSh4yCzUEIp0uxfH3Hk8ws). Сохраните его, он понадобится для API.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Настройка Vector для отправки логов в Gotify
|
||||
|
||||
Эта инструкция описывает, как установить Vector, настроить его для чтения JSON-логов из файла `/opt/org_ccalm_main/logs/ccalm.log`, фильтрации строк с уровнем `ERROR` и отправки уведомлений в Gotify.
|
||||
@ -23,7 +18,7 @@
|
||||
## 0. ✅ Подключаемся к инфраструктуре
|
||||
|
||||
```sh
|
||||
ssh igor@ccalm.org -p 2200
|
||||
ssh ubuntu@almaty.ccalm.org -p 22
|
||||
```
|
||||
|
||||
## Предварительные требования
|
||||
@ -64,11 +59,29 @@ sources:
|
||||
ccalm_logs:
|
||||
type: file
|
||||
include:
|
||||
- /opt/org_ccalm_main/logs/ccalm.log
|
||||
- /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:
|
||||
parse_json_ccalm:
|
||||
type: remap
|
||||
inputs:
|
||||
- ccalm_logs
|
||||
@ -83,28 +96,209 @@ transforms:
|
||||
}
|
||||
. = merged
|
||||
|
||||
filter_errors:
|
||||
type: filter
|
||||
inputs:
|
||||
- parse_json
|
||||
condition: '.level == "ERROR"'
|
||||
|
||||
format_telegram_json:
|
||||
parse_json_translation:
|
||||
type: remap
|
||||
inputs:
|
||||
- filter_errors
|
||||
- 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"
|
||||
}
|
||||
.message = "{\"chat_id\":\"307675888\",\"text\":\"ERROR: " + msg + "\"}"
|
||||
marker_str = ""
|
||||
if exists(.marker) {
|
||||
m, err = string(.marker)
|
||||
if err == null && length(m) > 0 {
|
||||
marker_str = "Marker: \n```text\n" + m + "\n```\n"
|
||||
}
|
||||
}
|
||||
level_str = ""
|
||||
icon_str = ""
|
||||
if exists(.level) {
|
||||
m, err = string(.level)
|
||||
if err == null {
|
||||
level_str = "level: \n```text\n" + m + "\n```\n"
|
||||
}
|
||||
if m == "ERROR" {
|
||||
icon_str = "‼"
|
||||
}
|
||||
if m == "WARN" {
|
||||
icon_str = "⚠️"
|
||||
}
|
||||
}
|
||||
.message = "{\"chat_id\":\"-1002640082189\",\"message_thread_id\":2,\"text\":\"" + icon_str + " " + level_str + marker_str + "Message: \n```text\n" + msg + "\n```\", \"parse_mode\":\"Markdown\"}"
|
||||
|
||||
format_telegram_json_translation:
|
||||
type: remap
|
||||
inputs:
|
||||
- filter_errors_translation
|
||||
source: |
|
||||
msg, err = string(.message)
|
||||
if err != null {
|
||||
msg = "Unable to parse message"
|
||||
}
|
||||
marker_str = ""
|
||||
if exists(.marker) {
|
||||
m, err = string(.marker)
|
||||
if err == null && length(m) > 0 {
|
||||
marker_str = "Marker: \n```text\n" + m + "\n```\n"
|
||||
}
|
||||
}
|
||||
level_str = ""
|
||||
icon_str = ""
|
||||
if exists(.level) {
|
||||
m, err = string(.level)
|
||||
if err == null {
|
||||
level_str = "level: \n```text\n" + m + "\n```\n"
|
||||
}
|
||||
if m == "ERROR" {
|
||||
icon_str = "‼"
|
||||
}
|
||||
if m == "WARN" {
|
||||
icon_str = "⚠️"
|
||||
}
|
||||
}
|
||||
.message = "{\"chat_id\":\"-1002640082189\",\"message_thread_id\":24,\"text\":\"" + icon_str + " " + level_str + marker_str + "Message: \n```text\n" + msg + "\n```\", \"parse_mode\":\"Markdown\"}"
|
||||
|
||||
format_telegram_json_dbms:
|
||||
type: remap
|
||||
inputs:
|
||||
- filter_errors_dbms
|
||||
source: |
|
||||
msg, err = string(.message)
|
||||
if err != null {
|
||||
msg = "Unable to parse message"
|
||||
}
|
||||
marker_str = ""
|
||||
if exists(.marker) {
|
||||
m, err = string(.marker)
|
||||
if err == null && length(m) > 0 {
|
||||
marker_str = "Marker: \n```text\n" + m + "\n```\n"
|
||||
}
|
||||
}
|
||||
level_str = ""
|
||||
icon_str = ""
|
||||
if exists(.level) {
|
||||
m, err = string(.level)
|
||||
if err == null {
|
||||
level_str = "level: \n```text\n" + m + "\n```\n"
|
||||
}
|
||||
if m == "ERROR" {
|
||||
icon_str = "‼"
|
||||
}
|
||||
if m == "WARN" {
|
||||
icon_str = "⚠️"
|
||||
}
|
||||
}
|
||||
.message = "{\"chat_id\":\"-1002640082189\",\"message_thread_id\":9,\"text\":\"" + icon_str + " " + level_str + marker_str + "Message: \n```text\n" + msg + "\n```\", \"parse_mode\":\"Markdown\"}"
|
||||
|
||||
format_telegram_json_jwt:
|
||||
type: remap
|
||||
inputs:
|
||||
- filter_errors_jwt
|
||||
source: |
|
||||
msg, err = string(.message)
|
||||
if err != null {
|
||||
msg = "Unable to parse message"
|
||||
}
|
||||
marker_str = ""
|
||||
if exists(.marker) {
|
||||
m, err = string(.marker)
|
||||
if err == null && length(m) > 0 {
|
||||
marker_str = "Marker: \n```text\n" + m + "\n```\n"
|
||||
}
|
||||
}
|
||||
level_str = ""
|
||||
icon_str = ""
|
||||
if exists(.level) {
|
||||
m, err = string(.level)
|
||||
if err == null {
|
||||
level_str = "level: \n```text\n" + m + "\n```\n"
|
||||
}
|
||||
if m == "ERROR" {
|
||||
icon_str = "‼"
|
||||
}
|
||||
if m == "WARN" {
|
||||
icon_str = "⚠️"
|
||||
}
|
||||
}
|
||||
.message = "{\"chat_id\":\"-1002640082189\",\"message_thread_id\":4,\"text\":\"" + icon_str + " " + level_str + marker_str + "Message: \n```text\n" + msg + "\n```\", \"parse_mode\":\"Markdown\"}"
|
||||
|
||||
|
||||
sinks:
|
||||
telegram:
|
||||
telegram_ccalm:
|
||||
type: http
|
||||
inputs:
|
||||
- format_telegram_json
|
||||
- format_telegram_json_ccalm
|
||||
uri: "https://api.telegram.org/bot8007457609:AAGnrXOSaoxODMSh4yCzUEIp0uxfH3Hk8ws/sendMessage"
|
||||
method: post
|
||||
encoding:
|
||||
@ -115,6 +309,47 @@ sinks:
|
||||
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
|
||||
```
|
||||
|
||||
@ -156,6 +391,8 @@ sudo vector --config /etc/vector/vector.yaml
|
||||
1. Включите и запустите сервис:
|
||||
```sh
|
||||
sudo systemctl enable vector
|
||||
```
|
||||
```sh
|
||||
sudo systemctl start vector
|
||||
```
|
||||
2. Проверьте статус:
|
||||
@ -171,7 +408,7 @@ sudo vector --config /etc/vector/vector.yaml
|
||||
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
|
||||
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".
|
||||
|
||||
|
||||
158
PostgreSQL/PostgreSQL_Vault_Database_Secrets_Engine.md
Normal file
158
PostgreSQL/PostgreSQL_Vault_Database_Secrets_Engine.md
Normal file
@ -0,0 +1,158 @@
|
||||
Думаю что данный механизм будет лучше чем PAM но WAZUH будет ругаться на создание пользователей, наверно не стоит создавать пользователей чаще чем раз в месяц.
|
||||
|
||||
# 🔐 Использование PostgreSQL с Vault Database Secrets Engine
|
||||
|
||||
Vault от HashiCorp предоставляет [**Database Secrets Engine**](https://developer.hashicorp.com/vault/docs/secrets/databases) — мощный инструмент для **динамической выдачи учетных данных** к базам данных, включая PostgreSQL.
|
||||
|
||||
## Что делает Vault с PostgreSQL
|
||||
|
||||
Vault может:
|
||||
- Создавать **временных пользователей** в PostgreSQL
|
||||
- Ограничивать **время жизни (TTL)** учетных записей
|
||||
- Автоматически **удалять пользователей** после TTL
|
||||
- Выдавать **роли с разными правами**
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Настройка Vault с PostgreSQL
|
||||
|
||||
### 1. Включить Secret Engine
|
||||
|
||||
```bash
|
||||
vault secrets enable database
|
||||
```
|
||||
|
||||
### 2. Настроить подключение к PostgreSQL
|
||||
|
||||
```bash
|
||||
vault write database/config/my-postgresql-db \
|
||||
plugin_name=postgresql-database-plugin \
|
||||
allowed_roles="readonly,readwrite" \
|
||||
connection_url="postgresql://{{username}}:{{password}}@db.example.com:5432/mydb?sslmode=disable" \
|
||||
username="vaultadmin" \
|
||||
password="adminpassword"
|
||||
```
|
||||
|
||||
```bash
|
||||
vault write database/roles/app_billing \
|
||||
db_name=my-postgresql-db \
|
||||
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION NOBYPASSRLS CONNECTION LIMIT 100; GRANT app_billing TO \"{{name}}\";" \
|
||||
default_ttl="1h" \
|
||||
max_ttl="24h"
|
||||
```
|
||||
|
||||
|
||||
```bash
|
||||
vault write database/roles/app_company \
|
||||
db_name=my-postgresql-db \
|
||||
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION NOBYPASSRLS CONNECTION LIMIT 100; GRANT app_company TO \"{{name}}\";" \
|
||||
default_ttl="1h" \
|
||||
max_ttl="24h"
|
||||
```
|
||||
> `vaultadmin` должен иметь привилегии на создание пользователей и назначение прав.
|
||||
|
||||
---
|
||||
|
||||
### 3. Создать роли Vault → PostgreSQL
|
||||
|
||||
#### Роль readonly:
|
||||
|
||||
```bash
|
||||
vault write database/roles/readonly \
|
||||
db_name=my-postgresql-db \
|
||||
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
|
||||
default_ttl="1h" \
|
||||
max_ttl="24h"
|
||||
```
|
||||
|
||||
#### Роль readwrite:
|
||||
|
||||
```bash
|
||||
vault write database/roles/readwrite \
|
||||
db_name=my-postgresql-db \
|
||||
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
|
||||
default_ttl="1h" \
|
||||
max_ttl="24h"
|
||||
```
|
||||
|
||||
2. Создаем два AppRole логина
|
||||
```
|
||||
vault auth enable approle
|
||||
```
|
||||
```conf
|
||||
vault write auth/approle/role/app_billing_role \
|
||||
token_policies="app-billing" \
|
||||
token_ttl=1h \
|
||||
token_max_ttl=4h
|
||||
```
|
||||
|
||||
```conf
|
||||
vault write auth/approle/role/app_company_role \
|
||||
token_policies="app-company" \
|
||||
token_ttl=1h \
|
||||
token_max_ttl=4h
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 4. Получение динамического пользователя
|
||||
|
||||
```bash
|
||||
vault read database/creds/readonly
|
||||
vault read database/creds/app_billing
|
||||
vault read database/creds/app_company
|
||||
```
|
||||
|
||||
Ответ:
|
||||
|
||||
```json
|
||||
{
|
||||
"data": {
|
||||
"username": "v-token-readonly-3HeNkcQZ",
|
||||
"password": "D8uJKv2sO7VvXJ5yMwG1",
|
||||
"ttl": 3600
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Удаление пользователя:
|
||||
|
||||
```bash
|
||||
vault lease revoke <lease_id>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔁 Использование существующих пользователей (Static Roles)
|
||||
|
||||
```bash
|
||||
vault write database/static-roles/my-static-role \
|
||||
db_name=my-postgresql-db \
|
||||
rotation_statements="ALTER USER readonly WITH PASSWORD '{{password}}';" \
|
||||
username="readonly" \
|
||||
rotation_period="24h"
|
||||
```
|
||||
|
||||
> Vault будет менять пароль у существующего пользователя.
|
||||
|
||||
---
|
||||
|
||||
## 🔐 Привилегии PostgreSQL пользователя `vaultadmin`
|
||||
|
||||
```sql
|
||||
CREATE ROLE;
|
||||
GRANT ...;
|
||||
ALTER DEFAULT PRIVILEGES ...;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Применение
|
||||
|
||||
- CI/CD пайплайны: временные креды с TTL
|
||||
- Разработчики: автоматическая выдача доступов
|
||||
- Безопасность: без хранения логинов в `.env`
|
||||
|
||||
---
|
||||
|
||||
145
PostgreSQL/PostgreSQL_Vault_PAM_python.md
Normal file
145
PostgreSQL/PostgreSQL_Vault_PAM_python.md
Normal file
@ -0,0 +1,145 @@
|
||||
Настройка авторизации через Vault при помощи PAM (Пароль для каждого из пользователей храняться в Vault)
|
||||
|
||||
------------------------------------------------------------------------------------------
|
||||
Шаг 1: Настройка Vault для хранения паролей
|
||||
Vault будет хранить пароли существующих пользователей PostgreSQL в KV Secrets Engine.
|
||||
|
||||
Включите KV Secrets Engine
|
||||
```sh
|
||||
vault secrets enable -path=secret kv
|
||||
```
|
||||
|
||||
Сохраните пароли пользователей:
|
||||
Для каждого пользователя PostgreSQL сохраните пароль в Vault. Например:
|
||||
|
||||
```sh
|
||||
vault kv put secret/postgres-users/user1 password="securepassword123"
|
||||
vault kv put secret/postgres-users/user2 password="anotherpassword456"
|
||||
```
|
||||
Здесь:
|
||||
|
||||
secret/postgres-users/<username> — путь к секрету.
|
||||
password — поле, содержащее пароль.
|
||||
|
||||
Настройте политики Vault:
|
||||
Создайте политику, которая позволяет Python-скрипту читать пароли:
|
||||
|
||||
```conf
|
||||
path "secret/data/postgres-users/*" {
|
||||
capabilities = ["read"]
|
||||
}
|
||||
```
|
||||
|
||||
Примените политику:
|
||||
```sh
|
||||
vault policy write postgres-auth postgres-auth-policy.hcl
|
||||
```
|
||||
|
||||
Создайте токен Vault:
|
||||
Создайте токен для скрипта с доступом к политике:
|
||||
```sh
|
||||
vault token create -policy=postgres-auth
|
||||
```
|
||||
Сохраните токен (например, в /etc/vault-token), чтобы скрипт мог его использовать.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------------------
|
||||
Шаг 1: Настройка PostgreSQL для PAM
|
||||
|
||||
Редактируем pg_hba.conf:
|
||||
В файле /etc/postgresql/<version>/main/pg_hba.conf добавьте строку:
|
||||
|
||||
```text
|
||||
host all all 0.0.0.0/0 pam pamservice=postgresql
|
||||
```
|
||||
|
||||
Создаем PAM-конфигурацию:
|
||||
Создайте файл /etc/pam.d/postgresql:
|
||||
```
|
||||
auth required pam_exec.so /path/to/vault_auth.py
|
||||
account required pam_permit.so
|
||||
```
|
||||
|
||||
Перезапустите PostgreSQL:
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
Создайте Python-скрипт (vault_auth.py), который будет вызываться PAM для проверки учетных данных через Vault. Пример:
|
||||
|
||||
```py
|
||||
#!/usr/bin/env python3
|
||||
import os
|
||||
import sys
|
||||
import hvac
|
||||
|
||||
def authenticate_with_vault(username, password):
|
||||
try:
|
||||
# Чтение токена Vault
|
||||
vault_token = os.getenv('VAULT_TOKEN')
|
||||
if vault_token is None or vault_token == "":
|
||||
try:
|
||||
with open('/etc/vault-token', 'r') as f:
|
||||
vault_token = f.read().strip()
|
||||
except FileNotFoundError:
|
||||
print("Error: Vault token file /etc/vault-token not found", file=sys.stderr)
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"Error reading vault token file: {e}", file=sys.stderr)
|
||||
return False
|
||||
|
||||
if not vault_token:
|
||||
print("Error: Vault token is empty", file=sys.stderr)
|
||||
return False
|
||||
|
||||
# Инициализация клиента Vault
|
||||
client = hvac.Client(url='http://127.0.0.1:8200', token=vault_token)
|
||||
|
||||
# Запрашиваем пароль из Vault
|
||||
secret_path = f"secret/data/postgres-users/{username}"
|
||||
response = client.secrets.kv.v2.read_secret_version(path=secret_path)
|
||||
|
||||
# Получаем хранимый пароль
|
||||
stored_password = response['data']['data']['password']
|
||||
|
||||
# Сравниваем введенный пароль с хранимым
|
||||
return stored_password == password
|
||||
except Exception as e:
|
||||
print(f"Authentication failed: {e}", file=sys.stderr)
|
||||
return False
|
||||
|
||||
def main():
|
||||
# PAM передает имя пользователя через переменную окружения
|
||||
username = os.getenv('PAM_USER')
|
||||
# Пароль читается из стандартного ввода
|
||||
password = sys.stdin.readline().strip()
|
||||
|
||||
if authenticate_with_vault(username, password):
|
||||
sys.exit(0) # Успешная аутентификация
|
||||
else:
|
||||
sys.exit(1) # Ошибка аутентификации
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
```
|
||||
|
||||
|
||||
Сделайте скрипт исполняемым:
|
||||
|
||||
|
||||
```sh
|
||||
chmod +x /path/to/vault_auth.py
|
||||
```
|
||||
|
||||
```sh
|
||||
pip install hvac
|
||||
```
|
||||
|
||||
Или передайте токен безопасно через файл (например, /etc/vault-token) и считывайте его в скрипте:
|
||||
```
|
||||
with open('/etc/vault-token', 'r') as f:
|
||||
vault_token = f.read().strip()
|
||||
```
|
||||
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
@ -6,7 +6,7 @@ wsl
|
||||
```
|
||||
Or coonect to need server:
|
||||
```sh
|
||||
ssh igor@ccalm.org -p 2200
|
||||
ssh igor@192.168.200.88 -p 22
|
||||
```
|
||||
|
||||
****************************************************************************************************
|
||||
@ -19,12 +19,12 @@ O:\MyDocuments\DataBases\postgresql-10.13-1-windows-x64-binaries\pgsql\bin\initd
|
||||
****************************************************************************************************
|
||||
Установка PostgreSQL 14 ubuntu 22.04 или 24.04
|
||||
```sh
|
||||
sudo apt-get update
|
||||
sudo apt-get update &&
|
||||
sudo apt-get install postgresql postgresql-contrib -y
|
||||
```
|
||||
Или так если нужно установить PostGIS
|
||||
```sh
|
||||
sudo apt-get install postgis
|
||||
sudo apt-get install postgis -y
|
||||
```
|
||||
Для удаления PostGIS в месте с зависимыми пакетами:
|
||||
```sh
|
||||
@ -49,9 +49,20 @@ O:\MyDocuments\DataBases\postgresql-10.13-1-windows-x64-binaries\pgsql\bin\initd
|
||||
Для задания пароля в PostgreSQL выполнить:
|
||||
```sh
|
||||
sudo -u postgres psql &&
|
||||
```
|
||||
можно так поменять но лучьше SQL запросом что ниже
|
||||
```sql
|
||||
\password postgres
|
||||
```
|
||||
Или так можно поменять пароль через SQL скрипт
|
||||
```sql
|
||||
ALTER ROLE postgres WITH PASSWORD 'SerTestSecrKey1' VALID UNTIL 'infinity';
|
||||
```
|
||||
Чтобы выйти нужно выпольнить команду: \q
|
||||
```sql
|
||||
\q
|
||||
```
|
||||
|
||||
|
||||
Роль входа по умолчанию: postgres пароль можно поменять когда в pg_hba.conf установить trust
|
||||
Задать пароль:
|
||||
@ -104,18 +115,30 @@ sudo mcedit /etc/postgresql/16/main/pg_hba.conf
|
||||
Либо с одного конкретного то: host all all 92.46.48.37/24 md5
|
||||
А также поменять на listen_addresses = '*' в postgresql.conf
|
||||
Потом перезагрузить postgres:
|
||||
sudo service postgresql restart
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
sudo /etc/init.d/postgresql stop
|
||||
sudo /etc/init.d/postgresql restart
|
||||
sudo /etc/init.d/postgresql start
|
||||
Проверить запущен или нет то:
|
||||
```sh
|
||||
sudo /etc/init.d/postgresql status
|
||||
```
|
||||
Посмотрель лог загрузки PostGreSQL:
|
||||
```sh
|
||||
dmesg |grep pg
|
||||
```
|
||||
Чтобы посмотреть чем занят порт выполнить команду:
|
||||
```sh
|
||||
sudo apt-get update &&
|
||||
sudo apt-get install net-tools &&
|
||||
sudo netstat -tap | grep 5432
|
||||
```
|
||||
|
||||
Создать Backup (при переносе со старой на новую версию может быть не совместим для этого нужно делать бакам в текстовом формате: plain):
|
||||
pg_dump --host=192.168.200.17 --username=postgres salevizor > /home/igor/salevizor.sql
|
||||
|
||||
pg_dump bigfoott_shop>/home/igor/bigfoott_shop.sql --host=127.0.0.1 --username=bigfoott_root
|
||||
pg_dump ASDC_Locust>/home/igor/ASDC_Locust.sql --host=127.0.0.1 --username=postgres
|
||||
pg_dump zholak>/home/zholak/zholak.sql --host=127.0.0.1 --username=postgres
|
||||
@ -175,8 +198,10 @@ sudo mcedit /etc/postgresql/16/main/pg_hba.conf
|
||||
По мотивам: https://www.youtube.com/watch?v=B_yz37CR1XU
|
||||
****************************************************************************************************
|
||||
Установка pgagent
|
||||
sudo apt-get update
|
||||
```sh
|
||||
sudo apt-get update &&
|
||||
sudo apt-get install pgagent
|
||||
```
|
||||
Выполнить в консоли запрос:
|
||||
psql -h localhost -U postgres
|
||||
create extension pgagent;
|
||||
@ -244,6 +269,7 @@ WantedBy=multi-user.target
|
||||
sudo apt install postgresql-12-postgis-2.4
|
||||
|
||||
Создать базу данных и выполнть на ней следующие команды:
|
||||
```sql
|
||||
-- Enable PostGIS (includes raster)
|
||||
CREATE EXTENSION postgis;
|
||||
-- Enable Topology
|
||||
@ -256,14 +282,15 @@ WantedBy=multi-user.target
|
||||
CREATE EXTENSION address_standardizer_data_us;
|
||||
-- Enable US Tiger Geocoder
|
||||
CREATE EXTENSION postgis_tiger_geocoder;
|
||||
|
||||
```
|
||||
У меня начало выдавать NOTICE: version "2.2.1" of extension "postgis_topology" is already installed и PostGIS перестал работать на моём PostgreSQL 9.5.17
|
||||
Аказывается расширение кудато делось установил:
|
||||
sudo apt-get install postgresql-9.5-postgis-2.2
|
||||
****************************************************************************************************
|
||||
Для добавления TOTP авторизации в Postgresql выполнить:
|
||||
```sql
|
||||
CREATE EXTENSION otp;
|
||||
|
||||
```
|
||||
|
||||
****************************************************************************************************
|
||||
sudo apt-get install libpq-dev libpq-fe
|
||||
@ -284,6 +311,7 @@ sudo apt-get install phppgadmin
|
||||
Установка pgAdmin4 через докер контейнер
|
||||
|
||||
```sh
|
||||
sudo mkdir -p /opt/pgAdmin4/backups &&
|
||||
sudo mkdir -p /opt/pgAdmin4 &&
|
||||
sudo chmod -R 777 /opt/pgAdmin4 &&
|
||||
sudo chown -R $USER:$USER /opt/pgAdmin4
|
||||
@ -304,7 +332,7 @@ services:
|
||||
PGADMIN_DEFAULT_PASSWORD: 123456
|
||||
volumes:
|
||||
- pgadmin_data:/var/lib/pgadmin
|
||||
|
||||
- /opt/pgAdmin4/backups:/var/lib/pgadmin/storage
|
||||
volumes:
|
||||
pgadmin_data:
|
||||
EOF
|
||||
@ -322,8 +350,9 @@ EOF
|
||||
sudo docker compose down
|
||||
```
|
||||
|
||||
|
||||
|
||||
```sh
|
||||
open http://localhost:5050
|
||||
```
|
||||
|
||||
|
||||
Проверить что не записан левый репозиторий для phppgadmin в /ect/opt/
|
||||
@ -343,9 +372,10 @@ EOF
|
||||
|
||||
****************************************************************************************************
|
||||
Балансировщик назрузки и потоковая репликация:
|
||||
|
||||
Pgpool-II https://www.youtube.com/watch?v=qpxKlH7DBjU сервер с высокой доступностью
|
||||
https://ritorika.com.ua/dokument/6/pgpool-chto-jeto
|
||||
|
||||
****************************************************************************************************
|
||||
Мониторинг запросов postgresql
|
||||
|
||||
|
||||
|
||||
@ -8,13 +8,13 @@ ssh ivanov_i@10.101.1.3
|
||||
ssh ivanov_i@10.201.1.3 -p 22
|
||||
```
|
||||
|
||||
```sh
|
||||
```shsudo mc
|
||||
psql -h 10.101.1.6 -U user_developer_igor_i -d transit
|
||||
```
|
||||
|
||||
|
||||
```sh
|
||||
psql -h 10.201.1.6 -U postgres -d transit
|
||||
psql -h 10.201.3.36 -U postgres -d transit
|
||||
```
|
||||
|
||||
## Логи по Базе
|
||||
|
||||
53
PostgreSQL/backup/backup.sh
Normal file
53
PostgreSQL/backup/backup.sh
Normal file
@ -0,0 +1,53 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Конфигурация
|
||||
DB_NAME="CCALM"
|
||||
DB_HOST="127.0.0.1"
|
||||
DB_USER="postgres"
|
||||
BACKUP_DIR="/opt/backups/data"
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M)
|
||||
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_${TIMESTAMP}.backup"
|
||||
|
||||
# Проверка существования директории для бэкапов
|
||||
if [ ! -d "$BACKUP_DIR" ]; then
|
||||
echo "Ошибка: Директория $BACKUP_DIR не существует. Создаю..."
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Ошибка: Не удалось создать директорию $BACKUP_DIR"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Установка прав для пользователя webdav
|
||||
chown rclone:rclone "$BACKUP_DIR"
|
||||
chmod 755 "$BACKUP_DIR"
|
||||
|
||||
# Экспорт пароля (если не используется .pgpass)
|
||||
# Замените 'your_password' на реальный пароль или настройте .pgpass
|
||||
export PGPASSWORD='309A86FF65A78FB428F4E38DFE35F730'
|
||||
|
||||
# Выполнение pg_dump
|
||||
echo "Создание резервной копии базы данных $DB_NAME в $BACKUP_FILE..."
|
||||
pg_dump "$DB_NAME" \
|
||||
--host="$DB_HOST" \
|
||||
--username="$DB_USER" \
|
||||
--format=custom \
|
||||
--file="$BACKUP_FILE"
|
||||
|
||||
# Проверка успешности выполнения
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Резервная копия успешно создана: $BACKUP_FILE"
|
||||
# Установка прав для пользователя webdav
|
||||
chown webdav:webdav "$BACKUP_FILE"
|
||||
chmod 644 "$BACKUP_FILE"
|
||||
else
|
||||
echo "Ошибка: Не удалось создать резервную копию"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Очистка старых бэкапов (например, старше 7 дней)
|
||||
find "$BACKUP_DIR" -name "${DB_NAME}_*.backup" -mtime +7 -delete
|
||||
echo "Старые бэкапы (старше 7 дней) удалены"
|
||||
|
||||
# Перемещаю на другой сервер
|
||||
rclone move /opt/backups/data mywebdav:/backups --progress --no-check-certificate
|
||||
@ -6,9 +6,9 @@ Connect to the required server:
|
||||
```sh
|
||||
ssh administrator@10.101.1.3 -p 22
|
||||
```
|
||||
Connect to CCALM Turkish infrastructure:
|
||||
Home server
|
||||
```sh
|
||||
ssh igor@88.218.94.134 -p 2200
|
||||
ssh igor@192.168.200.81 -p 22
|
||||
```
|
||||
----------------------------------------------------------------------------------------------------
|
||||
## Install haproxy
|
||||
@ -209,6 +209,7 @@ backend 'transit_monitoring_kz' has no server available!
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d stations.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d uspdmanager.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d tourist.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d project.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d monitoring.infracos.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
|
||||
|
||||
@ -24,7 +24,7 @@ sudo apt install wget
|
||||
Проверь актуальную версию на: [Traefik Releases](https://github.com/traefik/traefik/releases)
|
||||
|
||||
Пример для версии `v3.0.0`:
|
||||
```bash
|
||||
```sh
|
||||
cd ~ &&
|
||||
wget https://github.com/traefik/traefik/releases/download/v3.3.4/traefik_v3.3.4_linux_amd64.tar.gz
|
||||
```
|
||||
@ -32,7 +32,7 @@ wget https://github.com/traefik/traefik/releases/download/v3.3.4/traefik_v3.3.4_
|
||||
---
|
||||
|
||||
## 📥 Шаг 3. Распаковка и установка
|
||||
```bash
|
||||
```sh
|
||||
cd ~ &&
|
||||
tar -xvzf traefik_v3.3.4_linux_amd64.tar.gz &&
|
||||
sudo mv traefik /usr/local/bin/
|
||||
@ -67,7 +67,7 @@ entryPoints:
|
||||
websecure:
|
||||
address: ":443"
|
||||
traefik:
|
||||
address: ":8080"
|
||||
address: ":8989"
|
||||
|
||||
api:
|
||||
dashboard: true
|
||||
@ -107,7 +107,7 @@ http:
|
||||
ccalm-api-auth:
|
||||
entryPoints:
|
||||
- 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
|
||||
tls:
|
||||
certresolver: myresolver
|
||||
@ -117,7 +117,7 @@ http:
|
||||
ccalm-dbms:
|
||||
entryPoints:
|
||||
- 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
|
||||
tls:
|
||||
certresolver: myresolver
|
||||
@ -127,7 +127,7 @@ http:
|
||||
ccalm-translation:
|
||||
entryPoints:
|
||||
- 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
|
||||
tls:
|
||||
certresolver: myresolver
|
||||
@ -137,7 +137,7 @@ http:
|
||||
ccalm-login:
|
||||
entryPoints:
|
||||
- websecure
|
||||
rule: "Host(`ccalm.test`) && PathPrefix(`/login/`)"
|
||||
rule: "(Host(`ccalm.test`) || Host(`almaty.ccalm.test`)) && PathPrefix(`/login/`)"
|
||||
service: org_ccalm_login_v01
|
||||
tls:
|
||||
certresolver: myresolver
|
||||
@ -145,7 +145,7 @@ http:
|
||||
ccalm-default:
|
||||
entryPoints:
|
||||
- websecure
|
||||
rule: "Host(`ccalm.test`)"
|
||||
rule: "(Host(`ccalm.test`) || Host(`almaty.ccalm.test`))"
|
||||
service: org_ccalm
|
||||
tls:
|
||||
certresolver: myresolver
|
||||
@ -164,6 +164,13 @@ http:
|
||||
service: local_gotify
|
||||
tls: {}
|
||||
|
||||
vault:
|
||||
entryPoints:
|
||||
- websecure
|
||||
rule: "Host(`vault.local`)"
|
||||
service: local_vault
|
||||
tls: {}
|
||||
|
||||
middlewares:
|
||||
strip-auth-prefix:
|
||||
stripPrefix:
|
||||
@ -199,6 +206,16 @@ http:
|
||||
path: "/"
|
||||
interval: "5s"
|
||||
|
||||
# Бэкенд для local_vault
|
||||
local_vault:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "https://192.168.200.85:8200"
|
||||
serversTransport: insecureTransport
|
||||
healthCheck:
|
||||
path: "/"
|
||||
interval: "5s"
|
||||
|
||||
# Бэкенд для org_ccalm_api_authorization_v02 (HTTPS с отключенной проверкой SSL)
|
||||
org_ccalm_api_authorization_v02:
|
||||
loadBalancer:
|
||||
@ -264,6 +281,8 @@ tls:
|
||||
keyFile: "/etc/traefik/certs/powerdns.local.key"
|
||||
- certFile: "/etc/traefik/certs/gotify.local.crt"
|
||||
keyFile: "/etc/traefik/certs/gotify.local.key"
|
||||
- certFile: "/etc/traefik/certs/vault.local.crt"
|
||||
keyFile: "/etc/traefik/certs/vault.local.key"
|
||||
- certFile: "/etc/traefik/certs/wildcard.local.crt"
|
||||
keyFile: "/etc/traefik/certs/wildcard.local.key"
|
||||
- certFile: "/etc/traefik/certs/wildcard.test.crt"
|
||||
|
||||
201
Proxy/Traefik_plugin.md
Normal file
201
Proxy/Traefik_plugin.md
Normal file
@ -0,0 +1,201 @@
|
||||
Создание локального плагина для Traefik: Перенос куки jwt_a в заголовок Authorization: Bearer
|
||||
Этот документ описывает, как создать и настроить локальный плагин для Traefik, который извлекает значение куки jwt_a и устанавливает его в заголовок Authorization: Bearer <token>, аналогично правилу HAProxy:
|
||||
acl is_jwt_cookie hdr_sub(cookie) jwt_a=
|
||||
http-request set-header Authorization "Bearer %[cook(jwt_a)]" if is_jwt_cookie
|
||||
|
||||
Плагин будет работать локально без публикации на GitHub.
|
||||
📋 Требования
|
||||
|
||||
Go: Версия 1.21 или выше.
|
||||
Traefik: Версия 3.3.4 (или совместимая).
|
||||
Linux Mint/Ubuntu: ОС, на которой установлен Traefik.
|
||||
Права доступа: Пользователь с правами на изменение конфигурации Traefik и запуск сервисов.
|
||||
|
||||
📥 Шаг 1: Подготовка окружения
|
||||
|
||||
Проверьте, установлен ли Go:
|
||||
go version
|
||||
|
||||
Если Go не установлен, установите его:
|
||||
sudo apt update
|
||||
sudo apt install golang
|
||||
|
||||
|
||||
Убедитесь, что Traefik установлен и работает. Проверьте версию:
|
||||
traefik version
|
||||
|
||||
|
||||
|
||||
📂 Шаг 2: Создание плагина
|
||||
|
||||
Создайте директорию для плагина:
|
||||
mkdir -p ~/traefik-jwt-cookie-plugin
|
||||
cd ~/traefik-jwt-cookie-plugin
|
||||
|
||||
|
||||
Инициализируйте Go-модуль:
|
||||
go mod init traefik-jwt-cookie-plugin
|
||||
|
||||
|
||||
Создайте файл plugin.go с кодом плагина:
|
||||
package traefik_jwt_cookie_plugin
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// Config holds the plugin configuration.
|
||||
type Config struct {
|
||||
CookieName string `json:"cookieName"`
|
||||
}
|
||||
|
||||
// CreateConfig creates and initializes the plugin configuration.
|
||||
func CreateConfig() *Config {
|
||||
return &Config{
|
||||
CookieName: "jwt_a", // Имя куки по умолчанию
|
||||
}
|
||||
}
|
||||
|
||||
// JWTCookiePlugin is the plugin structure.
|
||||
type JWTCookiePlugin struct {
|
||||
next http.Handler
|
||||
name string
|
||||
cookieName string
|
||||
}
|
||||
|
||||
// New creates a new instance of the plugin.
|
||||
func New(_ context.Context, next http.Handler, config *Config, name string) (http.Handler, error) {
|
||||
return &JWTCookiePlugin{
|
||||
next: next,
|
||||
name: name,
|
||||
cookieName: config.CookieName,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (p *JWTCookiePlugin) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
||||
// Извлекаем куки
|
||||
cookie, err := req.Cookie(p.cookieName)
|
||||
if err == nil && cookie != nil && cookie.Value != "" {
|
||||
// Устанавливаем заголовок Authorization
|
||||
req.Header.Set("Authorization", "Bearer "+cookie.Value)
|
||||
}
|
||||
// Передаем запрос дальше
|
||||
p.next.ServeHTTP(rw, req)
|
||||
}
|
||||
|
||||
|
||||
Создайте файл go.mod (создается автоматически при инициализации модуля):
|
||||
module traefik-jwt-cookie-plugin
|
||||
|
||||
go 1.21
|
||||
|
||||
|
||||
Создайте файл plugin.yaml:
|
||||
moduleName: traefik-jwt-cookie-plugin
|
||||
displayName: JWT Cookie to Authorization Header
|
||||
summary: Middleware to extract a cookie and set it as Authorization Bearer header
|
||||
|
||||
|
||||
|
||||
⚙️ Шаг 3: Настройка Traefik для локального плагина
|
||||
|
||||
Отредактируйте файл конфигурации Traefik (/etc/traefik/traefik.yml):
|
||||
experimental:
|
||||
localPlugins:
|
||||
jwtCookiePlugin:
|
||||
moduleName: traefik-jwt-cookie-plugin
|
||||
sourcePath: /home/igor/traefik-jwt-cookie-plugin # Замените на ваш путь
|
||||
|
||||
http:
|
||||
routers:
|
||||
my-router:
|
||||
rule: "Host(`example.com`)" # Замените на ваш домен
|
||||
service: my-service
|
||||
middlewares:
|
||||
- jwt-cookie-middleware
|
||||
entryPoints:
|
||||
- web
|
||||
|
||||
middlewares:
|
||||
jwt-cookie-middleware:
|
||||
plugin:
|
||||
jwtCookiePlugin:
|
||||
cookieName: "jwt_a"
|
||||
|
||||
services:
|
||||
my-service:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://backend:8080" # Ваш бэкенд-сервис
|
||||
|
||||
|
||||
Убедитесь, что путь /home/igor/traefik-jwt-cookie-plugin соответствует вашей директории. Проверьте путь:
|
||||
echo $HOME
|
||||
|
||||
|
||||
|
||||
🔒 Шаг 4: Настройка прав доступа
|
||||
Убедитесь, что Traefik имеет доступ к директории плагина:
|
||||
sudo chown -R igor:igor ~/traefik-jwt-cookie-plugin
|
||||
sudo chmod -R 755 ~/traefik-jwt-cookie-plugin
|
||||
|
||||
Если Traefik работает от другого пользователя (например, traefik), выполните:
|
||||
sudo chown -R traefik:traefik ~/traefik-jwt-cookie-plugin
|
||||
|
||||
🚀 Шаг 5: Запуск Traefik
|
||||
|
||||
Перезапустите Traefik:sudo systemctl restart traefik
|
||||
|
||||
|
||||
Если Traefik запущен вручную:traefik --configFile=/etc/traefik/traefik.yml
|
||||
|
||||
|
||||
|
||||
🧪 Шаг 6: Тестирование
|
||||
|
||||
Включите дебаг-логи в traefik.yml:log:
|
||||
level: DEBUG
|
||||
|
||||
|
||||
Отправьте тестовый запрос с куки jwt_a:curl -H "Host: example.com" -b "jwt_a=your_jwt_token_here" http://192.168.200.85
|
||||
|
||||
|
||||
Проверьте логи Traefik:sudo journalctl -u traefik
|
||||
|
||||
Ищите записи, связанные с jwtCookiePlugin, чтобы подтвердить, что куки обрабатываются.
|
||||
|
||||
🌐 Шаг 7: Интеграция с HAProxy
|
||||
Поскольку вы используете HAProxy перед Traefik, убедитесь, что HAProxy передает куки без изменений. Если вы хотите перенести логику обработки куки из HAProxy в Traefik, удалите следующее правило из HAProxy:
|
||||
acl is_jwt_cookie hdr_sub(cookie) jwt_a=
|
||||
http-request set-header Authorization "Bearer %[cook(jwt_a)]" if is_jwt_cookie
|
||||
|
||||
Обновленная конфигурация HAProxy:
|
||||
frontend fe_main
|
||||
bind *:80
|
||||
mode http
|
||||
default_backend be_traefik
|
||||
|
||||
backend be_traefik
|
||||
mode http
|
||||
server traefik 192.168.200.85:80
|
||||
|
||||
⚠️ Возможные проблемы
|
||||
|
||||
Ошибка загрузки плагина: Проверьте логи Traefik (journalctl -u traefik) и убедитесь, что sourcePath указан правильно.
|
||||
Куки не извлекаются: Убедитесь, что куки jwt_a передаются в запросе (проверьте через curl или браузер).
|
||||
Go-ошибки: Выполните go mod tidy для установки зависимостей.
|
||||
|
||||
✅ Преимущества
|
||||
|
||||
Работает локально без публикации на GitHub.
|
||||
Заменяет функциональность HAProxy без внешнего сервиса.
|
||||
Полная интеграция с Traefik.
|
||||
|
||||
❗ Недостатки
|
||||
|
||||
Требует базовых навыков Go.
|
||||
Экспериментальная поддержка плагинов в Traefik может быть нестабильной.
|
||||
|
||||
🔄 Альтернатива
|
||||
Если плагин не работает, оставьте обработку куки в HAProxy, а Traefik используйте только для маршрутизации. Это минимизирует изменения в вашей инфраструктуре.
|
||||
209
Proxy/top.geovizor.traefik_first.md
Normal file
209
Proxy/top.geovizor.traefik_first.md
Normal file
@ -0,0 +1,209 @@
|
||||
Congif to first level proxy
|
||||
|
||||
Connecting to infrascructure
|
||||
```sh
|
||||
ssh igor@192.168.200.81
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo apt update &&
|
||||
sudo apt install wget
|
||||
```
|
||||
|
||||
```sh
|
||||
cd /etc/traefik &&
|
||||
sudo tee /etc/traefik/traefik.yml > /dev/null <<'EOF'
|
||||
entryPoints:
|
||||
web:
|
||||
address: ":80"
|
||||
websecure:
|
||||
address: ":443"
|
||||
http8080:
|
||||
address: ":8080"
|
||||
https8443:
|
||||
address: ":8443"
|
||||
traefik:
|
||||
address: ":8989"
|
||||
|
||||
api:
|
||||
dashboard: true
|
||||
insecure: true
|
||||
|
||||
log:
|
||||
level: DEBUG
|
||||
filePath: "/var/log/traefik/traefik.log"
|
||||
|
||||
accessLog:
|
||||
filePath: "/var/log/traefik/access.log"
|
||||
|
||||
providers:
|
||||
file:
|
||||
filename: "/etc/traefik/dynamic.yml"
|
||||
watch: true
|
||||
EOF
|
||||
```
|
||||
|
||||
|
||||
|
||||
```sh
|
||||
cd /etc/traefik &&
|
||||
sudo tee /etc/traefik/dynamic.yml > /dev/null <<'EOF'
|
||||
---
|
||||
http:
|
||||
routers:
|
||||
|
||||
dashboard:
|
||||
rule: "Host(`192.168.200.81`) && Host(`localhost`)" # или другой домен
|
||||
entryPoints:
|
||||
- traefik
|
||||
service: api@internal
|
||||
middlewares:
|
||||
- auth
|
||||
|
||||
redirect-to-https:
|
||||
entryPoints:
|
||||
- web
|
||||
rule: "HostRegexp(`{any:.+}`)"
|
||||
service: noop
|
||||
middlewares:
|
||||
- redirect-to-https-middleware
|
||||
|
||||
gotify:
|
||||
entryPoints:
|
||||
- websecure
|
||||
- https8443
|
||||
rule: "Host(`gotify.geovizor.top`)"
|
||||
service: gotify
|
||||
tls: true
|
||||
|
||||
webdav:
|
||||
entryPoints:
|
||||
- websecure
|
||||
- https8443
|
||||
rule: "Host(`webdav.geovizor.top`)"
|
||||
service: webdav
|
||||
tls: true
|
||||
|
||||
ccalm-auth:
|
||||
entryPoints:
|
||||
- websecure
|
||||
rule: "Host(`ccalm.test`) && PathPrefix(`/api/authorization/v02`)"
|
||||
service: ccalm-auth
|
||||
middlewares:
|
||||
- strip-api-authorization
|
||||
tls: true
|
||||
|
||||
ccalm-dbms:
|
||||
entryPoints:
|
||||
- websecure
|
||||
rule: "Host(`ccalm.test`) && PathPrefix(`/api/dbms/v09`)"
|
||||
service: ccalm-dbms
|
||||
middlewares:
|
||||
- strip-api-dbms
|
||||
tls: true
|
||||
|
||||
ccalm-login:
|
||||
entryPoints:
|
||||
- websecure
|
||||
rule: "Host(`ccalm.test`) && PathPrefix(`/login`)"
|
||||
service: ccalm-login
|
||||
tls: true
|
||||
|
||||
ccalm-default:
|
||||
entryPoints:
|
||||
- websecure
|
||||
rule: "Host(`ccalm.test`)"
|
||||
service: ccalm-default
|
||||
tls: true
|
||||
|
||||
certbot:
|
||||
entryPoints:
|
||||
- websecure
|
||||
rule: "PathPrefix(`/.well-known/acme-challenge/`)"
|
||||
service: certbot
|
||||
tls: true
|
||||
|
||||
middlewares:
|
||||
|
||||
auth:
|
||||
basicAuth:
|
||||
users:
|
||||
- "admin:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/" # admin/admin
|
||||
|
||||
redirect-to-https-middleware:
|
||||
redirectScheme:
|
||||
scheme: https
|
||||
permanent: true
|
||||
|
||||
strip-api-authorization:
|
||||
replacePathRegex:
|
||||
regex: ^/api/authorization/v02/(.*)
|
||||
replacement: /$1
|
||||
|
||||
strip-api-dbms:
|
||||
replacePathRegex:
|
||||
regex: ^/api/dbms/v09/(.*)
|
||||
replacement: /$1
|
||||
|
||||
services:
|
||||
gotify:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "https://192.168.200.84:8080"
|
||||
passHostHeader: true
|
||||
healthCheck:
|
||||
path: "/"
|
||||
interval: "5s"
|
||||
serversTransport: insecureTransport
|
||||
|
||||
webdav:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://127.0.0.1:8085"
|
||||
|
||||
ccalm-auth:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "https://192.168.200.184:8082"
|
||||
|
||||
ccalm-dbms:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "https://192.168.200.184:8084"
|
||||
|
||||
ccalm-login:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://192.168.200.184:3000"
|
||||
|
||||
ccalm-default:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "https://192.168.200.184:8083"
|
||||
|
||||
certbot:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://127.0.0.1:9080"
|
||||
|
||||
noop:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://0.0.0.0" # placeholder
|
||||
|
||||
# Определяем транспорт для отключения проверки SSL
|
||||
serversTransports:
|
||||
insecureTransport:
|
||||
insecureSkipVerify: true
|
||||
|
||||
EOF
|
||||
```
|
||||
|
||||
|
||||
|
||||
```sh
|
||||
sudo systemctl daemon-reload &&
|
||||
sudo systemctl enable traefik &&
|
||||
sudo systemctl start traefik &&
|
||||
sudo systemctl status traefik
|
||||
```
|
||||
66
RClone/NFS_install.md
Normal file
66
RClone/NFS_install.md
Normal file
@ -0,0 +1,66 @@
|
||||
```sh
|
||||
sudo apt update &&
|
||||
sudo apt install nfs-kernel-server -y
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo mkdir -p /mnt/data/org_ccalm_almaty &&
|
||||
sudo chown nobody:nogroup /mnt/data/org_ccalm_almaty
|
||||
```
|
||||
|
||||
Открой файл /etc/exports:
|
||||
|
||||
```sh
|
||||
sudo mcedit /etc/exports
|
||||
```
|
||||
Добавь строку:
|
||||
```config
|
||||
/mnt/backups 192.168.200.0/24(rw,sync,no_subtree_check,no_root_squash)
|
||||
```
|
||||
Пояснение:
|
||||
/mnt/backups — путь к расшариваемой папке
|
||||
192.168.1.0/24 — подсеть, которой разрешён доступ
|
||||
rw — чтение и запись
|
||||
sync — синхронная запись (безопаснее)
|
||||
no_subtree_check — оптимизация доступа
|
||||
|
||||
Применение изменений
|
||||
```sh
|
||||
sudo exportfs -ra
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl restart nfs-kernel-server
|
||||
```
|
||||
|
||||
(Необязательно) Разрешить доступ через firewall
|
||||
```sh
|
||||
sudo ufw allow from 192.168.200.0/24 to any port nfs
|
||||
```
|
||||
Проверка экспортируемых папок
|
||||
```sh
|
||||
sudo exportfs -v
|
||||
```
|
||||
|
||||
|
||||
## Подключение к NFS на клиенте (например, другая машина/VM)
|
||||
```sh
|
||||
sudo apt install nfs-common &&
|
||||
sudo mount 192.168.200.80:/mnt/data/org_ccalm_almaty /mnt/nfs-backups
|
||||
```
|
||||
|
||||
Чтобы монтировалось при загрузке, добавь строку в sudo mcedit /etc/fstab:
|
||||
```sh
|
||||
192.168.200.80:/mnt/data/org_ccalm_almaty /mnt/backups nfs defaults 0 0
|
||||
```
|
||||
|
||||
On Windows run cmd not PowerShell:
|
||||
```sh
|
||||
mount -o anon \\192.168.200.80\mnt\data\org_ccalm_almaty Z:
|
||||
```
|
||||
|
||||
|
||||
Обновляем:
|
||||
```sh
|
||||
sudo mount -a
|
||||
```
|
||||
69
RClone/RClone_install_linux.md
Normal file
69
RClone/RClone_install_linux.md
Normal file
@ -0,0 +1,69 @@
|
||||
Connecting to infrasturture
|
||||
|
||||
```sh
|
||||
sudo useradd -r -s /sbin/nologin -d /opt/backup -m rclone
|
||||
```
|
||||
|
||||
|
||||
```sh
|
||||
ssh ubuntu@almaty.ccalm.org -p 22
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo apt update &&
|
||||
sudo apt install rclone
|
||||
```
|
||||
|
||||
```sh
|
||||
rclone version
|
||||
```
|
||||
|
||||
Создаём настройку в ~/.config/rclone/rclone.conf
|
||||
```sh
|
||||
rclone config
|
||||
```
|
||||
|
||||
При настройке для текущего пользователя задал такие параметры:
|
||||
```conf
|
||||
[mywebdav]
|
||||
type = webdav
|
||||
url = https://webdav.geovizor.top/
|
||||
vendor = other
|
||||
user = admin
|
||||
pass = iV6-JPSK7UOcY8xYfvKs9MjZtVMR4pqdKKCoXXtCaw
|
||||
```
|
||||
|
||||
|
||||
Перемещаю все файлы с ранее созданным конфигом:
|
||||
```sh
|
||||
rclone move /opt/backups/data mywebdav:/backups --progress --no-check-certificate
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Предварительно нужно настроить подключение а потом можно вызывать команду для копирования:
|
||||
```sh
|
||||
rclone move /путь/к/локальной/директории webdav:/путь/на/сервере
|
||||
```
|
||||
|
||||
|
||||
Копирую файлы с сервера:
|
||||
```sh
|
||||
rclone copy webdav:/ E:\webdav --no-check-certificate --progress
|
||||
```
|
||||
|
||||
Инициация синхронизации со списком файлов
|
||||
```sh
|
||||
rclone bisync webdav:/ E:\webdav --no-check-certificate --resync --verbose --create-empty-src-dirs
|
||||
```
|
||||
|
||||
Регулярная двусторонняя синхронизация
|
||||
```sh
|
||||
rclone bisync webdav:/ E:\webdav --no-check-certificate --modify-window 1s --progress --create-empty-src-dirs
|
||||
```
|
||||
136
RClone/WebDAV_install.md
Normal file
136
RClone/WebDAV_install.md
Normal file
@ -0,0 +1,136 @@
|
||||
https://github.com/hacdias/webdav
|
||||
|
||||
```sh
|
||||
ssh igor@192.168.200.81 -p 22
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo apt update &&
|
||||
sudo apt install golang-go
|
||||
```
|
||||
|
||||
```sh
|
||||
git clone https://github.com/hacdias/webdav.git &&
|
||||
cd webdav
|
||||
```
|
||||
|
||||
```sh
|
||||
go build -o webdav .
|
||||
```
|
||||
|
||||
```sh
|
||||
cd /opt/webdav &&
|
||||
sudo tee config.yml > /dev/null <<'EOF'
|
||||
address: "0.0.0.0"
|
||||
port: 8085
|
||||
directory: "."
|
||||
permissions: "R"
|
||||
debug: true
|
||||
users:
|
||||
- username: admin
|
||||
password: "U8Z0a6YY7taZ965"
|
||||
directory: "/mnt/backups"
|
||||
permissions: "CRUD"
|
||||
EOF
|
||||
```
|
||||
|
||||
Пытаемся запустить
|
||||
```sh
|
||||
cd /opt/webdav &&
|
||||
./webdav --config config.yml
|
||||
```
|
||||
Проверяем что работает:
|
||||
```sh
|
||||
open http://192.168.200.81:8085
|
||||
```
|
||||
|
||||
Находим и убиваем процесс
|
||||
```sh
|
||||
ps aux | grep webdav
|
||||
```
|
||||
|
||||
```sh
|
||||
pkill -f 'webdav --config config.yml'
|
||||
```
|
||||
|
||||
Создаю пользователя webdav
|
||||
```sh
|
||||
sudo useradd -r -s /sbin/nologin -d /opt/webdav -m webdav &&
|
||||
sudo chown -R webdav:webdav /opt/webdav &&
|
||||
sudo chmod -R 750 /opt/webdav
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo nano /etc/systemd/system/webdav.service
|
||||
```
|
||||
|
||||
```sh
|
||||
cd /etc/systemd/system/ &&
|
||||
sudo tee webdav.service > /dev/null <<'EOF'
|
||||
[Unit]
|
||||
Description=WebDAV Server
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
WorkingDirectory=/opt/webdav
|
||||
ExecStart=/opt/webdav/webdav --config config.yml
|
||||
User=webdav
|
||||
Group=webdav
|
||||
Restart=on-failure
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl daemon-reexec &&
|
||||
sudo systemctl enable webdav &&
|
||||
sudo systemctl start webdav
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl status webdav
|
||||
```
|
||||
```sh
|
||||
sudo journalctl -u webdav -b
|
||||
```
|
||||
|
||||
Теперь WebDAV доступен по адресу:
|
||||
```sh
|
||||
start https://yourdomain.com/webdav/
|
||||
```
|
||||
|
||||
|
||||
## Настройка HAProxy
|
||||
|
||||
Edit haproxy configuration file:
|
||||
```sh
|
||||
sudo mcedit /etc/haproxy/haproxy.cfg
|
||||
```
|
||||
|
||||
frontend HTTPS:
|
||||
```config
|
||||
frontend https-in
|
||||
bind *:443 ssl crt /etc/ssl/private/yourdomain.pem
|
||||
acl is_webdav path_beg /webdav
|
||||
use_backend webdav_backend if is_webdav
|
||||
```
|
||||
|
||||
В backend:
|
||||
```config
|
||||
backend webdav_backend
|
||||
server webdav1 127.0.0.1:8085
|
||||
```
|
||||
|
||||
```sh
|
||||
haproxy -f /etc/haproxy/haproxy.cfg -c
|
||||
````
|
||||
```sh
|
||||
sudo systemctl restart haproxy
|
||||
```
|
||||
|
||||
Для винды можно подключить диск при помощи:
|
||||
```
|
||||
open https://www.raidrive.com/
|
||||
```
|
||||
53
Redis_install.md
Normal file
53
Redis_install.md
Normal file
@ -0,0 +1,53 @@
|
||||
****************************************************************************************************
|
||||
Подключаемся к инфраструктуре
|
||||
```sh
|
||||
ssh ubuntu@almaty.ccalm.org -p 22
|
||||
```
|
||||
****************************************************************************************************
|
||||
Install Redis по мативам: https://timeweb.cloud/tutorials/redis/ustanovka-i-nastrojka-redis-dlya-raznyh-os
|
||||
```sh
|
||||
sudo apt-get update &&
|
||||
sudo apt install redis -y &&
|
||||
redis-cli --version
|
||||
```
|
||||
```sh
|
||||
sudo systemctl restart redis
|
||||
```
|
||||
```sh
|
||||
sudo systemctl status redis
|
||||
```
|
||||
Config:
|
||||
```sh
|
||||
sudo mcedit /etc/redis/redis.conf
|
||||
```
|
||||
И меняем в конфигурации на: supervised systemd
|
||||
Также желательно проверить настройку чтобы слушался только IP: 127.0.0.1
|
||||
```conf
|
||||
bind 0.0.0.0
|
||||
```
|
||||
Также в поле SECURITY нужно установить пароль, сгенерированный при помощи:
|
||||
```
|
||||
openssl rand 25 | openssl base64 -A
|
||||
```
|
||||
Примерно такой должен быть получиться:
|
||||
```
|
||||
requirepass 9F3/NKWeOjd815vkadT2DcgVHf6fEpVQXw==
|
||||
```
|
||||
Перезагружаем:
|
||||
```sh
|
||||
sudo systemctl restart redis-server
|
||||
```
|
||||
Проверяем Redis:
|
||||
```sh
|
||||
redis-cli
|
||||
```
|
||||
Или так проверяем:
|
||||
```sh
|
||||
redis-cli -h 127.0.0.1 -p 6379 -a 9F3/NKWeOjd815vkadT2DcgVHf6fEpVQXw==
|
||||
```
|
||||
И пишем: ping
|
||||
|
||||
Проверяем какие порты прослушиваются на компе:
|
||||
```sh
|
||||
sudo netstat -lnp | grep redis
|
||||
```
|
||||
@ -90,6 +90,17 @@ 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:
|
||||
|
||||
@ -8,9 +8,9 @@ Vault — это инструмент от HashiCorp для безопасног
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
Похоже vault из Москвы недоступен:
|
||||
Connecting to infrastructure:
|
||||
```sh
|
||||
ssh root@45.144.64.218 -p 2200
|
||||
ssh igor@192.168.200.85 -p 22
|
||||
```
|
||||
|
||||
### 1.1. Добавление репозитория HashiCorp
|
||||
@ -51,7 +51,7 @@ ssh root@45.144.64.218 -p 2200
|
||||
```sh
|
||||
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
|
||||
@ -106,28 +106,40 @@ start http://127.0.0.1:8200
|
||||
```
|
||||
Останавливаю нажатием Ctrl + C
|
||||
|
||||
|
||||
### 2.2. Настройка Vault в режиме сервера
|
||||
|
||||
1. Создайте конфигурационный файл:
|
||||
Creating sel signed sertificate:
|
||||
```sh
|
||||
sudo mkdir -p /etc/vault &&
|
||||
sudo mcedit /etc/vault/config.hcl
|
||||
sudo openssl req -new -x509 -days 365 -nodes \
|
||||
-out /etc/vault.d/vault.local.crt \
|
||||
-keyout /etc/vault.d/vault.local.key \
|
||||
-subj "/CN=yourdomain.local"
|
||||
```
|
||||
|
||||
2. Добавьте следующий конфиг:
|
||||
```text
|
||||
Set file owner
|
||||
```sh
|
||||
sudo chown -R vault:vault /etc/vault.d/
|
||||
```
|
||||
|
||||
1. Создайте конфигурационный файл, Добавьте следующий конфиг:
|
||||
```sh
|
||||
sudo mkdir -p /etc/vault &&
|
||||
cd /etc/vault &&
|
||||
sudo tee config.hcl > /dev/null <<'EOF'
|
||||
|
||||
storage "file" {
|
||||
path = "/opt/vault/data"
|
||||
}
|
||||
|
||||
listener "tcp" {
|
||||
address = "127.0.0.1:8200"
|
||||
tls_disable = 1
|
||||
address = "0.0.0.0:8200"
|
||||
tls_cert_file = "/etc/vault.d/vault.local.crt"
|
||||
tls_key_file = "/etc/vault.d/vault.local.key"
|
||||
}
|
||||
|
||||
disable_mlock = true
|
||||
ui = true
|
||||
EOF
|
||||
```
|
||||
|
||||
3. Создайте папку для хранения данных:
|
||||
@ -171,7 +183,9 @@ sudo mcedit /etc/systemd/system/vault.service
|
||||
sudo systemctl enable vault &&
|
||||
sudo systemctl start vault
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl restart vault
|
||||
```
|
||||
7. Проверьте статус:
|
||||
```sh
|
||||
sudo systemctl status vault
|
||||
@ -213,7 +227,7 @@ It is possible to generate new unseal keys, provided you have a quorum of
|
||||
existing unseal keys shares. See "vault operator rekey" for more information.
|
||||
```
|
||||
|
||||
3. Разблокируйте Vault, используя один из ключей (потом ещё 3 раза выполнить эту команду):
|
||||
3. Разблокируйте Vault, используя ключ (потом ещё 3 раза выполнить эту команду):
|
||||
```sh
|
||||
vault operator unseal
|
||||
```
|
||||
@ -225,6 +239,7 @@ existing unseal keys shares. See "vault operator rekey" for more information.
|
||||
|
||||
5. Создаём(включаем) новое хранилище ключ-значение через ssh
|
||||
```sh
|
||||
export VAULT_TOKEN=hvs.FDMfGORUazCHm7jGrSofBVbx &&
|
||||
vault secrets enable -path=org-ccalm kv-v2
|
||||
```
|
||||
|
||||
@ -261,7 +276,7 @@ server.ssl.key-store-password M4yh4
|
||||
vault auth enable approle
|
||||
```
|
||||
|
||||
7. Добавляем политики потом создаём ключ для этой политикиполитики
|
||||
7. Добавляем политики потом создаём ключ для этой политики
|
||||
|
||||
Создаю файл политик
|
||||
```sh
|
||||
@ -322,7 +337,7 @@ export VAULT_SECRET_ID="your-secret-id"
|
||||
```
|
||||
|
||||
|
||||
Проверяем не больше какого значения можно задать время жизни кокена:
|
||||
Проверяем не больше какого значения можно задать время жизни токена:
|
||||
```sh
|
||||
vault read sys/mounts/auth/token/tune
|
||||
```
|
||||
@ -343,7 +358,7 @@ Create data access token with set politics:
|
||||
vault token renew <твой-токен>
|
||||
```
|
||||
|
||||
Проверяем зранятся ли токены в хранилище а не в памяти
|
||||
Проверяем хранятся ли токены в хранилище а не в памяти
|
||||
```sh
|
||||
vault read sys/auth/token/tune
|
||||
```
|
||||
@ -357,5 +372,18 @@ token_type = default-service, значит Vault не хранит токены
|
||||
|
||||
|
||||
---
|
||||
Теперь HashiCorp Vault установлен и готов к использованию! 🚀
|
||||
Согласно уроку желательно корневой сертификат создавать на 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"
|
||||
|
||||
|
||||
46
Ubuntu.md
46
Ubuntu.md
@ -434,6 +434,8 @@ sudo tar cvpzf /media/usb/backup.tgz --exclude=/var/www --exclude=/etc/fstab --e
|
||||
0 1 * * * wget -O /dev/null -q 'http://locust.kz/get/list.php'
|
||||
0 1 * * * /opt/backups/backup.sh
|
||||
|
||||
/opt/backups/backup.sh
|
||||
|
||||
Проверяю таблицу:
|
||||
sudo crontab -l -u www-data
|
||||
****************************************************************************************************
|
||||
@ -510,8 +512,8 @@ mysqldump -uu1109882_root -proot123456 -h127.0.0.1 db1109882_locust > /root/db11
|
||||
```
|
||||
Включаем модули:
|
||||
```sh
|
||||
sudo phpenmod imap
|
||||
sudo phpenmod mbstring
|
||||
sudo phpenmod imap &&
|
||||
sudo phpenmod mbstring &&
|
||||
sudo a2enmod rewrite
|
||||
```
|
||||
|
||||
@ -519,13 +521,14 @@ mysqldump -uu1109882_root -proot123456 -h127.0.0.1 db1109882_locust > /root/db11
|
||||
```sh
|
||||
sudo sed -i 's/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf
|
||||
```
|
||||
|
||||
Проверяем файл:
|
||||
```sh
|
||||
sudo mcedit /etc/apache2/apache2.conf
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo a2enmod php8.0
|
||||
sudo a2enmod php8.1
|
||||
sudo a2enmod ssl #Так как в последнее время делаю через haproxy то SSL в апачи не использую
|
||||
sudo a2enmod headers
|
||||
sudo a2enmod expires
|
||||
@ -648,7 +651,7 @@ https://apache-windows.ru/apache-ssl-переход-apache-на-https/
|
||||
sudo a2dissite jwt2.local.conf
|
||||
sudo a2dissite jwt.local.conf
|
||||
|
||||
|
||||
sudo a2dissite aistransit.kz.conf
|
||||
|
||||
http://aistransit.kz/
|
||||
|
||||
@ -969,6 +972,7 @@ DefaultRoot ~
|
||||
ServerIdent on "FTP Server ready."
|
||||
RequireValidShell off
|
||||
AuthUserFile /etc/proftpd/ftpd.passwd
|
||||
PassivePorts 40000 40100
|
||||
|
||||
Для создания нового виртуального пользователя "tester" "firsttester" в файле выполнить комманду (uid и gid должны быть как у пользователя www-data смотри: cat /etc/passwd и cat /etc/group)
|
||||
|
||||
@ -979,8 +983,14 @@ AuthUserFile /etc/proftpd/ftpd.passwd
|
||||
sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=apk --uid=33 --gid=33 --home=/var/www/istransit.kz/apk --shell=/bin/false
|
||||
sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=rebezov.a --uid=33 --gid=33 --home=/var/www/test2.istransit.kz --shell=/bin/false
|
||||
sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=rebezov.a --uid=33 --gid=33 --home=/opt/www/istransit.kz --shell=/bin/false
|
||||
|
||||
sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=jointech --uid=33 --gid=33 --home=/opt/SServerJointech/ftp --shell=/bin/false
|
||||
|
||||
|
||||
Задал пароль для apk пользователя: vooOtKBb7bckcNh
|
||||
Задал пароль для rebezov.a : BU39kb2
|
||||
Задал пароль для jointech : jointech
|
||||
|
||||
|
||||
задал пароль:
|
||||
zoto!23+
|
||||
@ -2050,34 +2060,6 @@ admin admin поменял на admin deSert!123
|
||||
Ошибка на мейке...
|
||||
install
|
||||
****************************************************************************************************
|
||||
Install Redis по мативам: https://timeweb.cloud/tutorials/redis/ustanovka-i-nastrojka-redis-dlya-raznyh-os
|
||||
sudo apt-get update
|
||||
sudo apt install redis
|
||||
redis-cli --version
|
||||
sudo systemctl status redis
|
||||
Config:
|
||||
sudo mcedit /etc/redis/redis.conf
|
||||
И меняем в конфигурации на: supervised systemd
|
||||
Также желательно проверить настройку чтобы слушался только IP: 127.0.0.1
|
||||
bind 0.0.0.0
|
||||
|
||||
Также в поле SECURITY нужно установить пароль, сгенерированный при помощи:
|
||||
openssl rand 25 | openssl base64 -A
|
||||
Примерно такой должен быть получиться:
|
||||
requirepass 9F3/NKWeOjd815vkadT2DcgVHf6fEpVQXw==
|
||||
|
||||
Перезагружаем:
|
||||
sudo systemctl restart redis-server
|
||||
Проверяем Redis:
|
||||
redis-cli
|
||||
Или так проверяем:
|
||||
redis-cli -h 127.0.0.1 -p 6379 -a 9F3/NKWeOjd815vkadT2DcgVHf6fEpVQXw==
|
||||
И пишем: ping
|
||||
|
||||
Проверяем какие порты прослушиваются на компе:
|
||||
sudo netstat -lnp | grep redis
|
||||
|
||||
****************************************************************************************************
|
||||
Для настройки локального сервера имен DNS сервер в место Bind9 теперь Dnsmasq так как он проще, понадобилось для haproxy
|
||||
sudo apt-get install dnsmasq
|
||||
sudo apt-get install resolvconf
|
||||
|
||||
143
WireGuard_install.md
Normal file
143
WireGuard_install.md
Normal file
@ -0,0 +1,143 @@
|
||||
Окей 👍 Дам пошаговую инструкцию для **WireGuard** на Ubuntu Server.
|
||||
|
||||
|
||||
```sh
|
||||
ssh ubuntu@194.32.140.11 -p 22
|
||||
```
|
||||
|
||||
Ок 👌 давай сделаем связку **Ubuntu Server (сервер VPN)** ↔ **Windows 11 (клиент)** через **WireGuard**.
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Установка WireGuard на Ubuntu (сервер)
|
||||
|
||||
1. Установи пакеты:
|
||||
|
||||
```sh
|
||||
sudo apt update &&
|
||||
sudo apt install wireguard -y
|
||||
```
|
||||
|
||||
2. Сгенерируй ключи:
|
||||
|
||||
```sh
|
||||
umask 077 &&
|
||||
wg genkey | tee server_private.key | wg pubkey > server_public.key
|
||||
```
|
||||
|
||||
3. Создай конфиг сервера:
|
||||
|
||||
```sh
|
||||
sudo mcedit /etc/wireguard/wg0.conf
|
||||
```
|
||||
|
||||
Пример (замени `xx.xx.xx.xx` на внешний IP твоего сервера и подсеть на свою):
|
||||
|
||||
```ini
|
||||
[Interface]
|
||||
Address = 10.0.0.1/24
|
||||
ListenPort = 51820
|
||||
PrivateKey = <тот что сгенерился на сервере>
|
||||
SaveConfig = false
|
||||
|
||||
[Peer]
|
||||
PublicKey = <тот что бкдкт генерится на клиенте>
|
||||
AllowedIPs = 10.0.0.2/32
|
||||
```
|
||||
|
||||
4. Разреши форвардинг трафика:
|
||||
|
||||
```sh
|
||||
sudo mcedit /etc/sysctl.conf
|
||||
```
|
||||
|
||||
раскомментируй:
|
||||
|
||||
```
|
||||
net.ipv4.ip_forward=1
|
||||
```
|
||||
|
||||
применить:
|
||||
|
||||
```sh
|
||||
sudo sysctl -p
|
||||
```
|
||||
|
||||
5. Настрой firewall (если используешь `ufw`):
|
||||
|
||||
```bash
|
||||
sudo ufw allow 51820/udp
|
||||
```
|
||||
|
||||
6. Запусти WireGuard:
|
||||
|
||||
```sh
|
||||
sudo systemctl enable wg-quick@wg0 &&
|
||||
sudo systemctl start wg-quick@wg0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💻 Установка WireGuard на Windows 11 (клиент)
|
||||
|
||||
1. Скачай официальный клиент:
|
||||
👉 [WireGuard для Windows](https://www.wireguard.com/install/)
|
||||
|
||||
2. Установи и запусти WireGuard.
|
||||
|
||||
3. Создай ключи (можно прямо в приложении или на сервере):
|
||||
|
||||
```powershell
|
||||
# если на сервере:
|
||||
wg genkey | tee client_private.key | wg pubkey > client_public.key
|
||||
```
|
||||
|
||||
4. Добавь конфиг клиента (в приложении "Add Tunnel → Add empty tunnel"):
|
||||
|
||||
```ini
|
||||
[Interface]
|
||||
PrivateKey = <client_private_key>
|
||||
Address = 10.0.0.2/32
|
||||
DNS = 1.1.1.1
|
||||
|
||||
[Peer]
|
||||
PublicKey = <server_public_key>
|
||||
Endpoint = xx.xx.xx.xx:51820
|
||||
AllowedIPs = 0.0.0.0/0, ::/0
|
||||
PersistentKeepalive = 25
|
||||
```
|
||||
|
||||
⚠️ `xx.xx.xx.xx` → внешний IP твоего Ubuntu сервера.
|
||||
Если хочешь только доступ к PostgreSQL, можно в `AllowedIPs` указать:
|
||||
|
||||
```
|
||||
10.0.0.0/24, ccalm.org/32
|
||||
```
|
||||
|
||||
5. Нажми **Activate** → VPN поднимется.
|
||||
|
||||
---
|
||||
|
||||
## ✅ Проверка
|
||||
|
||||
На Windows:
|
||||
|
||||
```powershell
|
||||
ping 10.0.0.1
|
||||
```
|
||||
|
||||
Должен отвечать сервер.
|
||||
|
||||
На Ubuntu:
|
||||
|
||||
```bash
|
||||
ping 10.0.0.2
|
||||
```
|
||||
|
||||
Должен отвечать клиент.
|
||||
|
||||
После этого JDBC строка будет работать так же, как если бы ты был внутри сети.
|
||||
|
||||
---
|
||||
|
||||
Хочешь, я соберу сразу готовые **два конфига (`wg0.conf` для сервера и client.conf для Windows)**, чтобы ты только ключи подставил?
|
||||
Reference in New Issue
Block a user