+
This commit is contained in:
@ -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"
|
||||
|
||||
@ -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: ```text\n" + m + "```"
|
||||
}
|
||||
}
|
||||
level_str = ""
|
||||
icon_str = ""
|
||||
if exists(.level) {
|
||||
m, err = string(.level)
|
||||
if err == null {
|
||||
level_str = "level: ```text\n" + m + "```"
|
||||
}
|
||||
if m == "ERROR" {
|
||||
icon_str = "‼"
|
||||
}
|
||||
if m == "WARN" {
|
||||
icon_str = "⚠️"
|
||||
}
|
||||
}
|
||||
.message = "{\"chat_id\":\"-1002640082189\",\"message_thread_id\":2,\"text\":\"" + icon_str + " " + level_str + marker_str + "Message: ```text\n" + msg + "```\", \"parse_mode\":\"Markdown\"}"
|
||||
|
||||
format_telegram_json_translation:
|
||||
type: remap
|
||||
inputs:
|
||||
- filter_errors_translation
|
||||
source: |
|
||||
msg, err = string(.message)
|
||||
if err != null {
|
||||
msg = "Unable to parse message"
|
||||
}
|
||||
marker_str = ""
|
||||
if exists(.marker) {
|
||||
m, err = string(.marker)
|
||||
if err == null && length(m) > 0 {
|
||||
marker_str = "Marker: ```text\n" + m + "```"
|
||||
}
|
||||
}
|
||||
level_str = ""
|
||||
icon_str = ""
|
||||
if exists(.level) {
|
||||
m, err = string(.level)
|
||||
if err == null {
|
||||
level_str = "level: ```text\n" + m + "```"
|
||||
}
|
||||
if m == "ERROR" {
|
||||
icon_str = "‼"
|
||||
}
|
||||
if m == "WARN" {
|
||||
icon_str = "⚠️"
|
||||
}
|
||||
}
|
||||
.message = "{\"chat_id\":\"-1002640082189\",\"message_thread_id\":24,\"text\":\"" + icon_str + " " + level_str + marker_str + "Message: ```text\n" + msg + "```\", \"parse_mode\":\"Markdown\"}"
|
||||
|
||||
format_telegram_json_dbms:
|
||||
type: remap
|
||||
inputs:
|
||||
- filter_errors_dbms
|
||||
source: |
|
||||
msg, err = string(.message)
|
||||
if err != null {
|
||||
msg = "Unable to parse message"
|
||||
}
|
||||
marker_str = ""
|
||||
if exists(.marker) {
|
||||
m, err = string(.marker)
|
||||
if err == null && length(m) > 0 {
|
||||
marker_str = "Marker: ```text\n" + m + "```"
|
||||
}
|
||||
}
|
||||
level_str = ""
|
||||
icon_str = ""
|
||||
if exists(.level) {
|
||||
m, err = string(.level)
|
||||
if err == null {
|
||||
level_str = "level: ```text\n" + m + "```"
|
||||
}
|
||||
if m == "ERROR" {
|
||||
icon_str = "‼"
|
||||
}
|
||||
if m == "WARN" {
|
||||
icon_str = "⚠️"
|
||||
}
|
||||
}
|
||||
.message = "{\"chat_id\":\"-1002640082189\",\"message_thread_id\":9,\"text\":\"" + icon_str + " " + level_str + marker_str + "Message: ```text\n" + msg + "```\", \"parse_mode\":\"Markdown\"}"
|
||||
|
||||
format_telegram_json_jwt:
|
||||
type: remap
|
||||
inputs:
|
||||
- filter_errors_jwt
|
||||
source: |
|
||||
msg, err = string(.message)
|
||||
if err != null {
|
||||
msg = "Unable to parse message"
|
||||
}
|
||||
marker_str = ""
|
||||
if exists(.marker) {
|
||||
m, err = string(.marker)
|
||||
if err == null && length(m) > 0 {
|
||||
marker_str = "Marker: ```text\n" + m + "```"
|
||||
}
|
||||
}
|
||||
level_str = ""
|
||||
icon_str = ""
|
||||
if exists(.level) {
|
||||
m, err = string(.level)
|
||||
if err == null {
|
||||
level_str = "level: ```text\n" + m + "```"
|
||||
}
|
||||
if m == "ERROR" {
|
||||
icon_str = "‼"
|
||||
}
|
||||
if m == "WARN" {
|
||||
icon_str = "⚠️"
|
||||
}
|
||||
}
|
||||
.message = "{\"chat_id\":\"-1002640082189\",\"message_thread_id\":4,\"text\":\"" + icon_str + " " + level_str + marker_str + "Message: ```text\n" + msg + "```\", \"parse_mode\":\"Markdown\"}"
|
||||
|
||||
|
||||
sinks:
|
||||
telegram:
|
||||
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".
|
||||
|
||||
|
||||
@ -116,6 +116,8 @@ sudo mcedit /etc/postgresql/16/main/pg_hba.conf
|
||||
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
|
||||
@ -284,6 +286,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 +307,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 +325,9 @@ EOF
|
||||
sudo docker compose down
|
||||
```
|
||||
|
||||
|
||||
|
||||
```sh
|
||||
open http://localhost:5050
|
||||
```
|
||||
|
||||
|
||||
Проверить что не записан левый репозиторий для phppgadmin в /ect/opt/
|
||||
|
||||
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
|
||||
|
||||
@ -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"
|
||||
|
||||
60
RClone/NFS_install.md
Normal file
60
RClone/NFS_install.md
Normal file
@ -0,0 +1,60 @@
|
||||
```sh
|
||||
sudo apt update &&
|
||||
sudo apt install nfs-kernel-server -y
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo mkdir -p /mnt/data/org_ccalm_almaty &&
|
||||
sudo chown nobody:nogroup /mnt/data/org_ccalm_almaty
|
||||
```
|
||||
|
||||
Открой файл /etc/exports:
|
||||
|
||||
```sh
|
||||
sudo mcedit /etc/exports
|
||||
```
|
||||
Добавь строку:
|
||||
```config
|
||||
/mnt/backups 192.168.200.0/24(rw,sync,no_subtree_check,no_root_squash)
|
||||
```
|
||||
Пояснение:
|
||||
/mnt/backups — путь к расшариваемой папке
|
||||
192.168.1.0/24 — подсеть, которой разрешён доступ
|
||||
rw — чтение и запись
|
||||
sync — синхронная запись (безопаснее)
|
||||
no_subtree_check — оптимизация доступа
|
||||
|
||||
Применение изменений
|
||||
```sh
|
||||
sudo exportfs -ra
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl restart nfs-kernel-server
|
||||
```
|
||||
|
||||
(Необязательно) Разрешить доступ через firewall
|
||||
```sh
|
||||
sudo ufw allow from 192.168.200.0/24 to any port nfs
|
||||
```
|
||||
Проверка экспортируемых папок
|
||||
```sh
|
||||
sudo exportfs -v
|
||||
```
|
||||
|
||||
|
||||
## Подключение к NFS на клиенте (например, другая машина/VM)
|
||||
```sh
|
||||
sudo apt install nfs-common &&
|
||||
sudo mount 192.168.200.80:/mnt/data/org_ccalm_almaty /mnt/nfs-backups
|
||||
```
|
||||
|
||||
Чтобы монтировалось при загрузке, добавь строку в sudo mcedit /etc/fstab:
|
||||
```sh
|
||||
192.168.200.80:/mnt/data/org_ccalm_almaty /mnt/backups nfs defaults 0 0
|
||||
```
|
||||
|
||||
Обновляем:
|
||||
```sh
|
||||
sudo mount -a
|
||||
```
|
||||
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
|
||||
```
|
||||
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
|
||||
```
|
||||
|
||||
@ -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"
|
||||
|
||||
|
||||
30
Ubuntu.md
30
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
|
||||
****************************************************************************************************
|
||||
@ -2050,34 +2052,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
|
||||
|
||||
Reference in New Issue
Block a user