Compare commits

..

4 Commits

Author SHA1 Message Date
2a29301db8 Vault 2025-10-07 08:51:28 +05:00
fe5d348b65 RabbitMQ 2025-10-02 18:16:29 +05:00
162688fccd Merge branch 'master' of https://git.mesh.kz/igor/Ubuntu_docs 2025-08-25 07:41:12 +05:00
b6111740e8 + 2025-08-25 07:41:03 +05:00
15 changed files with 962 additions and 224 deletions

View File

@ -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",

View File

@ -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/

View File

@ -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

View File

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

View File

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

View File

@ -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,14 +49,19 @@ 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 &&
\password postgres ```
можно так поменять но лучьше SQL запросом что ниже
```sql
\password postgres
``` ```
Или так можно поменять пароль через SQL скрипт Или так можно поменять пароль через SQL скрипт
```sql ```sql
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

View File

@ -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
View File

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

View File

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

View File

@ -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

View File

@ -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 нужно установить пароль, сгенерированный при помощи:

View File

@ -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
``` ```

View File

@ -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
View File

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

View File

@ -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
```