Compare commits
4 Commits
5745ef2cd6
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 2a29301db8 | |||
| fe5d348b65 | |||
| 162688fccd | |||
| b6111740e8 |
@ -172,16 +172,15 @@ sudo rabbitmqctl set_parameter shovel kaz_to_arm '{
|
|||||||
}'
|
}'
|
||||||
```
|
```
|
||||||
|
|
||||||
Для Кыргызстана (таможенная инфраструктура)
|
Для отправки в Кыргызстана (таможенная инфраструктура)
|
||||||
```sh
|
```sh
|
||||||
sudo rabbitmqctl set_parameter shovel kaz_to_kgz '{
|
sudo rabbitmqctl set_parameter shovel kaz_to_kgz '{
|
||||||
"src-protocol": "amqp091",
|
"src-protocol": "amqp091",
|
||||||
"src-uri": "amqp://admin:paRabbit!@127.0.0.1:20000/transportation_kgz",
|
"src-uri": "amqp://admin:paRabbit!@127.0.0.1:20000/transportation_kgz",
|
||||||
"src-queue": "TO_KGZ",
|
"src-queue": "TO_KGZ",
|
||||||
"dest-protocol": "amqp091",
|
"dest-protocol": "amqp091",
|
||||||
"dest-uri": "amqp://kz_istt:uzZNYbVTElMDXnfwQx16@192.168.70.133:20000/transportation_kaz",
|
"dest-uri": "amqp://kz_istt:kzistt123EX@192.168.70.133:20000/kaz_transportation",
|
||||||
"dest-exchange": "swap",
|
"dest-queue": "KAZ",
|
||||||
"dest-exchange-key": "KAZ",
|
|
||||||
"ack-mode": "on-confirm",
|
"ack-mode": "on-confirm",
|
||||||
"publish-properties": {
|
"publish-properties": {
|
||||||
"delivery_mode": 2
|
"delivery_mode": 2
|
||||||
@ -193,7 +192,7 @@ sudo rabbitmqctl set_parameter shovel kaz_to_kgz '{
|
|||||||
sudo rabbitmqctl clear_parameter shovel kaz_to_kgz
|
sudo rabbitmqctl clear_parameter shovel kaz_to_kgz
|
||||||
```
|
```
|
||||||
|
|
||||||
Для отправки из Киргизии нам то такие настройки:
|
НЕ ИСПОЛЬЗОВАТЬ Для отправки из Киргизии нам то такие настройки:
|
||||||
```sh
|
```sh
|
||||||
sudo rabbitmqctl set_parameter shovel kgz_to_kaz '{
|
sudo rabbitmqctl set_parameter shovel kgz_to_kaz '{
|
||||||
"src-protocol": "amqp091",
|
"src-protocol": "amqp091",
|
||||||
|
|||||||
@ -1,153 +1,83 @@
|
|||||||
|
```sh
|
||||||
# Установка Woodpecker CI на Ubuntu с Gitea
|
ssh igor@192.168.200.87 -p 22
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🛠️ Системные требования
|
|
||||||
|
|
||||||
- Ubuntu 20.04+ (работает и на 22.04)
|
|
||||||
- Docker и Docker Compose
|
|
||||||
- Установленный Gitea (можно локально или через Docker)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📦 Шаг 1: Установка Docker и Docker Compose
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo apt update
|
|
||||||
sudo apt install -y docker.io docker-compose
|
|
||||||
sudo systemctl enable docker
|
|
||||||
sudo usermod -aG docker $USER
|
|
||||||
```
|
```
|
||||||
|
|
||||||
> ⚠️ После добавления пользователя в группу `docker` нужно **перелогиниться**, чтобы изменения вступили в силу.
|
Install
|
||||||
|
```sh
|
||||||
---
|
sudo apt update &&
|
||||||
|
sudo apt upgrade -y &&
|
||||||
## 🧱 Шаг 2: Установка Gitea через Docker Compose
|
sudo apt-get install python3-venv python3-pip &&
|
||||||
|
sudo apt install docker.io -y &&
|
||||||
Создайте директорию `gitea`, и в ней файл `docker-compose.yml`:
|
sudo apt install -y docker-compose &&
|
||||||
|
sudo systemctl enable docker &&
|
||||||
```yaml
|
sudo systemctl start docker &&
|
||||||
version: "3"
|
sudo usermod -aG docker $USER &&
|
||||||
|
docker-compose --version
|
||||||
services:
|
|
||||||
gitea:
|
|
||||||
image: gitea/gitea:latest
|
|
||||||
container_name: gitea
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
- USER_UID=1000
|
|
||||||
- USER_GID=1000
|
|
||||||
volumes:
|
|
||||||
- ./gitea:/data
|
|
||||||
ports:
|
|
||||||
- "3000:3000"
|
|
||||||
- "2222:22"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
```bash
|
|
||||||
mkdir gitea && cd gitea
|
Create folder for Woodpecker
|
||||||
docker-compose up -d
|
```sh
|
||||||
|
sudo mkdir -p /opt/woodpecker &&
|
||||||
|
cd /opt/woodpecker
|
||||||
```
|
```
|
||||||
|
```sh
|
||||||
Теперь Gitea будет доступна по адресу: [http://localhost:3000](http://localhost:3000)
|
cd /opt/woodpecker
|
||||||
|
sudo tee docker-compose.yml <<'EOF'
|
||||||
---
|
|
||||||
|
|
||||||
## 🔐 Шаг 3: Настройка Gitea
|
|
||||||
|
|
||||||
1. Перейдите в браузере на `http://localhost:3000`
|
|
||||||
2. Пройдите установку:
|
|
||||||
- База данных: SQLite или PostgreSQL (по желанию)
|
|
||||||
- URL: `http://gitea:3000/`
|
|
||||||
- Включите регистрацию, если нужно
|
|
||||||
3. Создайте пользователя (например, `ci-user`)
|
|
||||||
4. Сгенерируйте **токен доступа** (access token), он будет нужен для Woodpecker
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 Шаг 4: Установка Woodpecker CI
|
|
||||||
|
|
||||||
Создайте директорию `woodpecker`, и в ней файл `docker-compose.yml`:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
version: "3"
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
woodpecker-server:
|
woodpecker-server:
|
||||||
image: woodpeckerci/woodpecker-server:latest
|
image: woodpeckerci/woodpecker-server:latest
|
||||||
container_name: woodpecker-server
|
|
||||||
restart: always
|
restart: always
|
||||||
environment:
|
|
||||||
- WOODPECKER_OPEN=true
|
|
||||||
- WOODPECKER_HOST=http://localhost:8000
|
|
||||||
- WOODPECKER_GITEA=true
|
|
||||||
- WOODPECKER_GITEA_URL=http://gitea:3000
|
|
||||||
- WOODPECKER_GITEA_CLIENT=your_client_id
|
|
||||||
- WOODPECKER_GITEA_SECRET=your_client_secret
|
|
||||||
- WOODPECKER_SECRET=supersecret
|
|
||||||
ports:
|
ports:
|
||||||
- "8000:8000"
|
- "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:
|
volumes:
|
||||||
- ./data:/var/lib/woodpecker/
|
- woodpecker-data:/var/lib/woodpecker
|
||||||
depends_on:
|
|
||||||
- gitea
|
|
||||||
|
|
||||||
woodpecker-agent:
|
woodpecker-agent:
|
||||||
image: woodpeckerci/woodpecker-agent:latest
|
image: woodpeckerci/woodpecker-agent:latest
|
||||||
container_name: woodpecker-agent
|
|
||||||
restart: always
|
restart: always
|
||||||
|
depends_on:
|
||||||
|
- woodpecker-server
|
||||||
environment:
|
environment:
|
||||||
- WOODPECKER_SERVER=woodpecker-server:9000
|
WOODPECKER_SERVER: "woodpecker-server:9000"
|
||||||
- WOODPECKER_SECRET=supersecret
|
WOODPECKER_SECRET: "supersecret"
|
||||||
volumes:
|
volumes:
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
woodpecker-data:
|
||||||
|
EOF
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
```sh
|
||||||
|
cd /opt/woodpecker &&
|
||||||
## ⚙️ Шаг 5: Создание OAuth App в Gitea
|
sudo docker-compose up -d
|
||||||
|
|
||||||
1. Перейдите в Gitea → `Settings` → `Applications`
|
|
||||||
2. Создайте новое приложение (OAuth2)
|
|
||||||
- Redirect URI: `http://localhost:8000/login`
|
|
||||||
3. Получите `Client ID` и `Client Secret`
|
|
||||||
4. Вставьте их в `WOODPECKER_GITEA_CLIENT` и `WOODPECKER_GITEA_SECRET`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ▶️ Шаг 6: Запуск Woodpecker
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose up -d
|
|
||||||
```
|
```
|
||||||
|
|
||||||
После запуска Woodpecker будет доступен по адресу: [http://localhost:8000](http://localhost:8000)
|
```sh
|
||||||
|
cd /opt/woodpecker &&
|
||||||
---
|
sudo docker-compose down
|
||||||
|
|
||||||
## 📁 Пример `.woodpecker.yml` файла
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
pipeline:
|
|
||||||
build:
|
|
||||||
image: node:alpine
|
|
||||||
commands:
|
|
||||||
- npm install
|
|
||||||
- npm test
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
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
|
||||||
|
```
|
||||||
|
|
||||||
Теперь вы можете подключать репозитории из Gitea и запускать CI-пайплайны в Woodpecker.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔗 Полезные ссылки
|
|
||||||
|
|
||||||
- Woodpecker CI: https://woodpecker-ci.org/
|
|
||||||
- Gitea: https://gitea.io/
|
|
||||||
- Документация Woodpecker: https://woodpecker-ci.org/docs/
|
|
||||||
|
|||||||
@ -224,7 +224,7 @@ Minimum = 3600 (1 час)
|
|||||||
Проверим список зон
|
Проверим список зон
|
||||||
```sh
|
```sh
|
||||||
sudo pdnsutil list-all-zones &&
|
sudo pdnsutil list-all-zones &&
|
||||||
sudo pdnsutil list-zone geovizor.top
|
sudo pdnsutil list-zone mesh.kz
|
||||||
```
|
```
|
||||||
Проверяем отвечалет ли:
|
Проверяем отвечалет ли:
|
||||||
```sh
|
```sh
|
||||||
|
|||||||
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:
|
Or coonect to need server:
|
||||||
```sh
|
```sh
|
||||||
ssh igor@ccalm.org -p 2200
|
ssh igor@192.168.200.88 -p 22
|
||||||
```
|
```
|
||||||
|
|
||||||
****************************************************************************************************
|
****************************************************************************************************
|
||||||
@ -19,7 +19,7 @@ O:\MyDocuments\DataBases\postgresql-10.13-1-windows-x64-binaries\pgsql\bin\initd
|
|||||||
****************************************************************************************************
|
****************************************************************************************************
|
||||||
Установка PostgreSQL 14 ubuntu 22.04 или 24.04
|
Установка PostgreSQL 14 ubuntu 22.04 или 24.04
|
||||||
```sh
|
```sh
|
||||||
sudo apt-get update
|
sudo apt-get update &&
|
||||||
sudo apt-get install postgresql postgresql-contrib -y
|
sudo apt-get install postgresql postgresql-contrib -y
|
||||||
```
|
```
|
||||||
Или так если нужно установить PostGIS
|
Или так если нужно установить PostGIS
|
||||||
@ -49,6 +49,9 @@ O:\MyDocuments\DataBases\postgresql-10.13-1-windows-x64-binaries\pgsql\bin\initd
|
|||||||
Для задания пароля в PostgreSQL выполнить:
|
Для задания пароля в PostgreSQL выполнить:
|
||||||
```sh
|
```sh
|
||||||
sudo -u postgres psql &&
|
sudo -u postgres psql &&
|
||||||
|
```
|
||||||
|
можно так поменять но лучьше SQL запросом что ниже
|
||||||
|
```sql
|
||||||
\password postgres
|
\password postgres
|
||||||
```
|
```
|
||||||
Или так можно поменять пароль через SQL скрипт
|
Или так можно поменять пароль через SQL скрипт
|
||||||
@ -56,7 +59,9 @@ O:\MyDocuments\DataBases\postgresql-10.13-1-windows-x64-binaries\pgsql\bin\initd
|
|||||||
ALTER ROLE postgres WITH PASSWORD 'SerTestSecrKey1' VALID UNTIL 'infinity';
|
ALTER ROLE postgres WITH PASSWORD 'SerTestSecrKey1' VALID UNTIL 'infinity';
|
||||||
```
|
```
|
||||||
Чтобы выйти нужно выпольнить команду: \q
|
Чтобы выйти нужно выпольнить команду: \q
|
||||||
|
```sql
|
||||||
|
\q
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
Роль входа по умолчанию: postgres пароль можно поменять когда в pg_hba.conf установить trust
|
Роль входа по умолчанию: postgres пароль можно поменять когда в pg_hba.conf установить trust
|
||||||
@ -110,16 +115,26 @@ sudo mcedit /etc/postgresql/16/main/pg_hba.conf
|
|||||||
Либо с одного конкретного то: host all all 92.46.48.37/24 md5
|
Либо с одного конкретного то: host all all 92.46.48.37/24 md5
|
||||||
А также поменять на listen_addresses = '*' в postgresql.conf
|
А также поменять на listen_addresses = '*' в postgresql.conf
|
||||||
Потом перезагрузить postgres:
|
Потом перезагрузить postgres:
|
||||||
sudo service postgresql restart
|
```sh
|
||||||
|
sudo systemctl restart postgresql
|
||||||
|
```
|
||||||
sudo /etc/init.d/postgresql stop
|
sudo /etc/init.d/postgresql stop
|
||||||
sudo /etc/init.d/postgresql restart
|
sudo /etc/init.d/postgresql restart
|
||||||
sudo /etc/init.d/postgresql start
|
sudo /etc/init.d/postgresql start
|
||||||
Проверить запущен или нет то:
|
Проверить запущен или нет то:
|
||||||
|
```sh
|
||||||
sudo /etc/init.d/postgresql status
|
sudo /etc/init.d/postgresql status
|
||||||
|
```
|
||||||
Посмотрель лог загрузки PostGreSQL:
|
Посмотрель лог загрузки PostGreSQL:
|
||||||
|
```sh
|
||||||
dmesg |grep pg
|
dmesg |grep pg
|
||||||
|
```
|
||||||
Чтобы посмотреть чем занят порт выполнить команду:
|
Чтобы посмотреть чем занят порт выполнить команду:
|
||||||
|
```sh
|
||||||
|
sudo apt-get update &&
|
||||||
|
sudo apt-get install net-tools &&
|
||||||
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 --host=192.168.200.17 --username=postgres salevizor > /home/igor/salevizor.sql
|
||||||
@ -183,8 +198,10 @@ sudo mcedit /etc/postgresql/16/main/pg_hba.conf
|
|||||||
По мотивам: https://www.youtube.com/watch?v=B_yz37CR1XU
|
По мотивам: https://www.youtube.com/watch?v=B_yz37CR1XU
|
||||||
****************************************************************************************************
|
****************************************************************************************************
|
||||||
Установка pgagent
|
Установка pgagent
|
||||||
sudo apt-get update
|
```sh
|
||||||
|
sudo apt-get update &&
|
||||||
sudo apt-get install pgagent
|
sudo apt-get install pgagent
|
||||||
|
```
|
||||||
Выполнить в консоли запрос:
|
Выполнить в консоли запрос:
|
||||||
psql -h localhost -U postgres
|
psql -h localhost -U postgres
|
||||||
create extension pgagent;
|
create extension pgagent;
|
||||||
@ -252,6 +269,7 @@ WantedBy=multi-user.target
|
|||||||
sudo apt install postgresql-12-postgis-2.4
|
sudo apt install postgresql-12-postgis-2.4
|
||||||
|
|
||||||
Создать базу данных и выполнть на ней следующие команды:
|
Создать базу данных и выполнть на ней следующие команды:
|
||||||
|
```sql
|
||||||
-- Enable PostGIS (includes raster)
|
-- Enable PostGIS (includes raster)
|
||||||
CREATE EXTENSION postgis;
|
CREATE EXTENSION postgis;
|
||||||
-- Enable Topology
|
-- Enable Topology
|
||||||
@ -264,14 +282,15 @@ WantedBy=multi-user.target
|
|||||||
CREATE EXTENSION address_standardizer_data_us;
|
CREATE EXTENSION address_standardizer_data_us;
|
||||||
-- Enable US Tiger Geocoder
|
-- Enable US Tiger Geocoder
|
||||||
CREATE EXTENSION postgis_tiger_geocoder;
|
CREATE EXTENSION postgis_tiger_geocoder;
|
||||||
|
```
|
||||||
У меня начало выдавать NOTICE: version "2.2.1" of extension "postgis_topology" is already installed и PostGIS перестал работать на моём PostgreSQL 9.5.17
|
У меня начало выдавать 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
|
sudo apt-get install postgresql-9.5-postgis-2.2
|
||||||
****************************************************************************************************
|
****************************************************************************************************
|
||||||
Для добавления TOTP авторизации в Postgresql выполнить:
|
Для добавления TOTP авторизации в Postgresql выполнить:
|
||||||
|
```sql
|
||||||
CREATE EXTENSION otp;
|
CREATE EXTENSION otp;
|
||||||
|
```
|
||||||
|
|
||||||
****************************************************************************************************
|
****************************************************************************************************
|
||||||
sudo apt-get install libpq-dev libpq-fe
|
sudo apt-get install libpq-dev libpq-fe
|
||||||
@ -353,9 +372,10 @@ open http://localhost:5050
|
|||||||
|
|
||||||
****************************************************************************************************
|
****************************************************************************************************
|
||||||
Балансировщик назрузки и потоковая репликация:
|
Балансировщик назрузки и потоковая репликация:
|
||||||
|
|
||||||
Pgpool-II https://www.youtube.com/watch?v=qpxKlH7DBjU сервер с высокой доступностью
|
Pgpool-II https://www.youtube.com/watch?v=qpxKlH7DBjU сервер с высокой доступностью
|
||||||
https://ritorika.com.ua/dokument/6/pgpool-chto-jeto
|
https://ritorika.com.ua/dokument/6/pgpool-chto-jeto
|
||||||
|
|
||||||
****************************************************************************************************
|
****************************************************************************************************
|
||||||
Мониторинг запросов postgresql
|
Мониторинг запросов postgresql
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -24,7 +24,7 @@ sudo apt install wget
|
|||||||
Проверь актуальную версию на: [Traefik Releases](https://github.com/traefik/traefik/releases)
|
Проверь актуальную версию на: [Traefik Releases](https://github.com/traefik/traefik/releases)
|
||||||
|
|
||||||
Пример для версии `v3.0.0`:
|
Пример для версии `v3.0.0`:
|
||||||
```bash
|
```sh
|
||||||
cd ~ &&
|
cd ~ &&
|
||||||
wget https://github.com/traefik/traefik/releases/download/v3.3.4/traefik_v3.3.4_linux_amd64.tar.gz
|
wget https://github.com/traefik/traefik/releases/download/v3.3.4/traefik_v3.3.4_linux_amd64.tar.gz
|
||||||
```
|
```
|
||||||
@ -32,7 +32,7 @@ wget https://github.com/traefik/traefik/releases/download/v3.3.4/traefik_v3.3.4_
|
|||||||
---
|
---
|
||||||
|
|
||||||
## 📥 Шаг 3. Распаковка и установка
|
## 📥 Шаг 3. Распаковка и установка
|
||||||
```bash
|
```sh
|
||||||
cd ~ &&
|
cd ~ &&
|
||||||
tar -xvzf traefik_v3.3.4_linux_amd64.tar.gz &&
|
tar -xvzf traefik_v3.3.4_linux_amd64.tar.gz &&
|
||||||
sudo mv traefik /usr/local/bin/
|
sudo mv traefik /usr/local/bin/
|
||||||
@ -67,7 +67,7 @@ entryPoints:
|
|||||||
websecure:
|
websecure:
|
||||||
address: ":443"
|
address: ":443"
|
||||||
traefik:
|
traefik:
|
||||||
address: ":8080"
|
address: ":8989"
|
||||||
|
|
||||||
api:
|
api:
|
||||||
dashboard: true
|
dashboard: true
|
||||||
|
|||||||
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
|
||||||
|
```
|
||||||
@ -54,6 +54,12 @@ sudo mount 192.168.200.80:/mnt/data/org_ccalm_almaty /mnt/nfs-backups
|
|||||||
192.168.200.80:/mnt/data/org_ccalm_almaty /mnt/backups nfs defaults 0 0
|
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
|
```sh
|
||||||
sudo mount -a
|
sudo mount -a
|
||||||
|
|||||||
@ -22,7 +22,7 @@ Config:
|
|||||||
```
|
```
|
||||||
И меняем в конфигурации на: supervised systemd
|
И меняем в конфигурации на: supervised systemd
|
||||||
Также желательно проверить настройку чтобы слушался только IP: 127.0.0.1
|
Также желательно проверить настройку чтобы слушался только IP: 127.0.0.1
|
||||||
```
|
```conf
|
||||||
bind 0.0.0.0
|
bind 0.0.0.0
|
||||||
```
|
```
|
||||||
Также в поле SECURITY нужно установить пароль, сгенерированный при помощи:
|
Также в поле SECURITY нужно установить пароль, сгенерированный при помощи:
|
||||||
|
|||||||
@ -276,7 +276,7 @@ server.ssl.key-store-password M4yh4
|
|||||||
vault auth enable approle
|
vault auth enable approle
|
||||||
```
|
```
|
||||||
|
|
||||||
7. Добавляем политики потом создаём ключ для этой политикиполитики
|
7. Добавляем политики потом создаём ключ для этой политики
|
||||||
|
|
||||||
Создаю файл политик
|
Создаю файл политик
|
||||||
```sh
|
```sh
|
||||||
@ -337,7 +337,7 @@ export VAULT_SECRET_ID="your-secret-id"
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
Проверяем не больше какого значения можно задать время жизни кокена:
|
Проверяем не больше какого значения можно задать время жизни токена:
|
||||||
```sh
|
```sh
|
||||||
vault read sys/mounts/auth/token/tune
|
vault read sys/mounts/auth/token/tune
|
||||||
```
|
```
|
||||||
@ -358,7 +358,7 @@ Create data access token with set politics:
|
|||||||
vault token renew <твой-токен>
|
vault token renew <твой-токен>
|
||||||
```
|
```
|
||||||
|
|
||||||
Проверяем зранятся ли токены в хранилище а не в памяти
|
Проверяем хранятся ли токены в хранилище а не в памяти
|
||||||
```sh
|
```sh
|
||||||
vault read sys/auth/token/tune
|
vault read sys/auth/token/tune
|
||||||
```
|
```
|
||||||
|
|||||||
@ -512,8 +512,8 @@ mysqldump -uu1109882_root -proot123456 -h127.0.0.1 db1109882_locust > /root/db11
|
|||||||
```
|
```
|
||||||
Включаем модули:
|
Включаем модули:
|
||||||
```sh
|
```sh
|
||||||
sudo phpenmod imap
|
sudo phpenmod imap &&
|
||||||
sudo phpenmod mbstring
|
sudo phpenmod mbstring &&
|
||||||
sudo a2enmod rewrite
|
sudo a2enmod rewrite
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -521,6 +521,7 @@ mysqldump -uu1109882_root -proot123456 -h127.0.0.1 db1109882_locust > /root/db11
|
|||||||
```sh
|
```sh
|
||||||
sudo sed -i 's/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf
|
sudo sed -i 's/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf
|
||||||
```
|
```
|
||||||
|
|
||||||
Проверяем файл:
|
Проверяем файл:
|
||||||
```sh
|
```sh
|
||||||
sudo mcedit /etc/apache2/apache2.conf
|
sudo mcedit /etc/apache2/apache2.conf
|
||||||
|
|||||||
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)**, чтобы ты только ключи подставил?
|
||||||
@ -1,74 +0,0 @@
|
|||||||
```sh
|
|
||||||
ssh igor@192.168.200.87 -p 22
|
|
||||||
```
|
|
||||||
|
|
||||||
Install
|
|
||||||
```sh
|
|
||||||
sudo apt update &&
|
|
||||||
sudo apt install -y docker.io docker-compose &&
|
|
||||||
sudo systemctl enable docker &&
|
|
||||||
sudo systemctl start docker &&
|
|
||||||
sudo usermod -aG docker $USER
|
|
||||||
```
|
|
||||||
|
|
||||||
```sh
|
|
||||||
sudo usermod -aG docker igor
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
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:
|
|
||||||
- "8080:8000" # Web UI
|
|
||||||
- "9000: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: "71a231bf-224c-48e7-ba1e-e9c2d4027c1b"
|
|
||||||
WOODPECKER_GITEA_SECRET: "gto_dg5ackwr4pq5uxn76lusqvgnhprc76cqtfotkgc5q3kgrtfaqogq"
|
|
||||||
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
|
|
||||||
open http://192.168.200.87:8000
|
|
||||||
```
|
|
||||||
Reference in New Issue
Block a user