+
This commit is contained in:
16
.idea/Ubuntu.iml
generated
16
.idea/Ubuntu.iml
generated
@ -1,9 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
10
.idea/misc.xml
generated
10
.idea/misc.xml
generated
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
14
.idea/modules.xml
generated
14
.idea/modules.xml
generated
@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/Ubuntu.iml" filepath="$PROJECT_DIR$/.idea/Ubuntu.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/Ubuntu.iml" filepath="$PROJECT_DIR$/.idea/Ubuntu.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
10
.idea/vcs.xml
generated
10
.idea/vcs.xml
generated
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
102
.idea/workspace.xml
generated
102
.idea/workspace.xml
generated
@ -1,26 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="AutoImportSettings">
|
||||
<option name="autoReloadType" value="SELECTIVE" />
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="e1fbeaad-6efe-4e4e-9cc3-db157d3cbbd0" name="Changes" comment="" />
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||
</component>
|
||||
<component name="Git.Settings">
|
||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||
</component>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="AutoImportSettings">
|
||||
<option name="autoReloadType" value="SELECTIVE" />
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="e1fbeaad-6efe-4e4e-9cc3-db157d3cbbd0" name="Changes" comment="" />
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||
</component>
|
||||
<component name="Git.Settings">
|
||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||
</component>
|
||||
<component name="ProjectColorInfo">{
|
||||
"associatedIndex": 2
|
||||
}</component>
|
||||
<component name="ProjectId" id="2t3w0yc2N4mk67dYNBrpPZpSXiI" />
|
||||
<component name="ProjectViewState">
|
||||
<option name="hideEmptyMiddlePackages" value="true" />
|
||||
<option name="showLibraryContents" value="true" />
|
||||
</component>
|
||||
}</component>
|
||||
<component name="ProjectId" id="2t3w0yc2N4mk67dYNBrpPZpSXiI" />
|
||||
<component name="ProjectViewState">
|
||||
<option name="hideEmptyMiddlePackages" value="true" />
|
||||
<option name="showLibraryContents" value="true" />
|
||||
</component>
|
||||
<component name="PropertiesComponent"><![CDATA[{
|
||||
"keyToString": {
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
@ -36,34 +36,34 @@
|
||||
"nodejs_package_manager_path": "npm",
|
||||
"vue.rearranger.settings.migration": "true"
|
||||
}
|
||||
}]]></component>
|
||||
<component name="SharedIndexes">
|
||||
<attachedChunks>
|
||||
<set>
|
||||
<option value="bundled-jdk-9823dce3aa75-fdfe4dae3a2d-intellij.indexing.shared.core-IU-243.21565.193" />
|
||||
<option value="bundled-js-predefined-d6986cc7102b-e768b9ed790e-JavaScript-IU-243.21565.193" />
|
||||
</set>
|
||||
</attachedChunks>
|
||||
</component>
|
||||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||
<component name="TaskManager">
|
||||
<task active="true" id="Default" summary="Default task">
|
||||
<changelist id="e1fbeaad-6efe-4e4e-9cc3-db157d3cbbd0" name="Changes" comment="" />
|
||||
<created>1739593846366</created>
|
||||
<option name="number" value="Default" />
|
||||
<option name="presentableId" value="Default" />
|
||||
<updated>1739593846366</updated>
|
||||
<workItem from="1739593847495" duration="18000" />
|
||||
<workItem from="1739594598328" duration="1702000" />
|
||||
<workItem from="1739615418937" duration="12348000" />
|
||||
<workItem from="1739638286710" duration="2801000" />
|
||||
<workItem from="1739696550212" duration="15168000" />
|
||||
<workItem from="1739987384678" duration="5000" />
|
||||
<workItem from="1739987550416" duration="37000" />
|
||||
</task>
|
||||
<servers />
|
||||
</component>
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
<option name="version" value="3" />
|
||||
</component>
|
||||
}]]></component>
|
||||
<component name="SharedIndexes">
|
||||
<attachedChunks>
|
||||
<set>
|
||||
<option value="bundled-jdk-9823dce3aa75-fdfe4dae3a2d-intellij.indexing.shared.core-IU-243.21565.193" />
|
||||
<option value="bundled-js-predefined-d6986cc7102b-e768b9ed790e-JavaScript-IU-243.21565.193" />
|
||||
</set>
|
||||
</attachedChunks>
|
||||
</component>
|
||||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||
<component name="TaskManager">
|
||||
<task active="true" id="Default" summary="Default task">
|
||||
<changelist id="e1fbeaad-6efe-4e4e-9cc3-db157d3cbbd0" name="Changes" comment="" />
|
||||
<created>1739593846366</created>
|
||||
<option name="number" value="Default" />
|
||||
<option name="presentableId" value="Default" />
|
||||
<updated>1739593846366</updated>
|
||||
<workItem from="1739593847495" duration="18000" />
|
||||
<workItem from="1739594598328" duration="1702000" />
|
||||
<workItem from="1739615418937" duration="12348000" />
|
||||
<workItem from="1739638286710" duration="2801000" />
|
||||
<workItem from="1739696550212" duration="15168000" />
|
||||
<workItem from="1739987384678" duration="5000" />
|
||||
<workItem from="1739987550416" duration="37000" />
|
||||
</task>
|
||||
<servers />
|
||||
</component>
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
<option name="version" value="3" />
|
||||
</component>
|
||||
</project>
|
||||
129
Certificates_config.md
Normal file
129
Certificates_config.md
Normal file
@ -0,0 +1,129 @@
|
||||
## Подключаемся к инфраструктуре
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
|
||||
```sh
|
||||
cd /mnt/o/MyDocuments/projects/_Doc/Certificates &&
|
||||
ls
|
||||
```
|
||||
|
||||
# Создадим корневой ключ и сертификат:
|
||||
Create root certificate
|
||||
```sh
|
||||
openssl genrsa -out rootCA.key 4096 &&
|
||||
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.crt
|
||||
```
|
||||
|
||||
Add root certificate to trusted
|
||||
```sh
|
||||
cd /mnt/o/MyDocuments/projects/_Doc/Certificates &&
|
||||
sudo cp rootCA.crt /usr/local/share/ca-certificates/ &&
|
||||
sudo update-ca-certificates
|
||||
```
|
||||
|
||||
## Отдельные сертификаты для каждого домена
|
||||
|
||||
Отдельно для домена "ccalm.test" можно создать сертификат так:
|
||||
```sh
|
||||
openssl genrsa -out ccalm.test.key 2048
|
||||
openssl req -new -key ccalm.test.key -out ccalm.test.csr -subj "/CN=ccalm.test"
|
||||
```
|
||||
|
||||
Подписать сертификат корневым CA
|
||||
```sh
|
||||
openssl x509 -req -in ccalm.test.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out ccalm.test.crt -days 365 -sha256
|
||||
```
|
||||
|
||||
## Если домены связаны то можно создать один wildcard-сертификат (*.test)
|
||||
|
||||
Так как это все мои домены для тестированя системы то мне легче создать единый сертификат
|
||||
***Внимание: для поддоменов не работает!***
|
||||
|
||||
Создать ключ и CSR для *.test
|
||||
|
||||
```sh
|
||||
openssl version &&
|
||||
openssl genrsa -out ccalm.test.key 2048 &&
|
||||
openssl req -new -key ccalm.test.key -out ccalm.test.csr -subj "/CN=ccalm.test" -addext "subjectAltName=DNS:ccalm.test" &&
|
||||
openssl x509 -req -in ccalm.test.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out ccalm.test.crt -days 365 -sha256 -copy_extensions copy
|
||||
openssl x509 -in ccalm.test.crt -text -noout
|
||||
```
|
||||
|
||||
```sh
|
||||
openssl version &&
|
||||
openssl genrsa -out wildcard.test.key 2048 &&
|
||||
openssl req -new -key wildcard.test.key -out wildcard.test.csr -subj "/CN=*.test" -addext "subjectAltName=DNS:*.test" &&
|
||||
openssl x509 -req -in wildcard.test.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out wildcard.test.crt -days 365 -sha256 -copy_extensions copy
|
||||
openssl x509 -in wildcard.test.crt -text -noout
|
||||
```
|
||||
|
||||
## Создаём ключ и сертификат для *.local потом подписываем корневым
|
||||
|
||||
Создаю:
|
||||
```sh
|
||||
openssl version &&
|
||||
openssl genrsa -out wildcard.local.key 2048 &&
|
||||
openssl req -new -key wildcard.local.key -out wildcard.local.csr -subj "/CN=*.local" -addext "subjectAltName=DNS:*.local" &&
|
||||
openssl x509 -req -in wildcard.local.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out wildcard.local.crt -days 365 -sha256 -copy_extensions copy
|
||||
openssl x509 -in wildcard.local.crt -text -noout
|
||||
```
|
||||
|
||||
Создаём и подписываем одной группой команд:
|
||||
```sh
|
||||
openssl version &&
|
||||
openssl genrsa -out powerdns.local.key 2048 &&
|
||||
openssl req -new -key powerdns.local.key -out powerdns.local.csr -subj "/CN=powerdns.local" -addext "subjectAltName=DNS:powerdns.local" &&
|
||||
openssl x509 -req -in powerdns.local.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out powerdns.local.crt -days 365 -sha256 -copy_extensions copy
|
||||
openssl x509 -in powerdns.local.crt -text -noout
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
Подписать корневым CA:
|
||||
```sh
|
||||
openssl x509 -req -in wildcard.local.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out wildcard.local.crt -days 365 -sha256
|
||||
```
|
||||
```sh
|
||||
openssl x509 -req -in powerdns.local.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out powerdns.local.crt -days 365 -sha256
|
||||
```
|
||||
|
||||
|
||||
## Один сертификат с SAN (Subject Alternative Names)
|
||||
|
||||
Написать san.cnf
|
||||
```conf
|
||||
[req]
|
||||
distinguished_name = req_distinguished_name
|
||||
req_extensions = v3_req
|
||||
[req_distinguished_name]
|
||||
[v3_req]
|
||||
subjectAltName = @alt_names
|
||||
[alt_names]
|
||||
DNS.1 = ccalm.test
|
||||
DNS.2 = git.test
|
||||
DNS.3 = geoserver.ccalm.test
|
||||
DNS.4 = another.domain
|
||||
```
|
||||
Генерировать CSR и подписать:
|
||||
```sh
|
||||
openssl req -new -key multi.test.key -out multi.test.csr -config san.cnf
|
||||
openssl x509 -req -in multi.test.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out multi.test.crt -days 365 -sha256 -extfile san.cnf -extensions v3_req
|
||||
```
|
||||
|
||||
Как использовать:
|
||||
Подходит, если у вас несколько несвязанных доменов.
|
||||
Можно защитить корневой домен и поддомены (example.com + www.example.com).
|
||||
|
||||
|
||||
|
||||
### Проверка
|
||||
|
||||
```sh
|
||||
openssl x509 -in rootCA.crt -text -noout
|
||||
```
|
||||
|
||||
```sh
|
||||
openssl x509 -in powerdns.local.crt -text -noout
|
||||
```
|
||||
11
ChatGPT_install.md
Normal file
11
ChatGPT_install.md
Normal file
@ -0,0 +1,11 @@
|
||||
Не стал устанавливать буду использовать WEB версию
|
||||
|
||||
Устанавливаем недостающие пакеты:
|
||||
```sh
|
||||
apt search libwebkit2gtk
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo apt update &&
|
||||
sudo apt install libwebkit2gtk-4.1-dev -y
|
||||
```
|
||||
216
Dahy_install.md
216
Dahy_install.md
@ -1,108 +1,108 @@
|
||||
# Устанавливаем дашборд Dashy на сервер
|
||||
|
||||
<div style="display: flex; align-items: flex-start;">
|
||||
<img src="./icons/dashy.png" alt="Dashy" width="64" height="64" style="margin-right: 10px;">
|
||||
<p>Dashy — это открытый (open-source) дашборд для удобного управления и организации ссылок на сервисы, приложения и веб-ресурсы. Он предназначен для домашнего использования (Home Lab) и DevOps-окружений.</p>
|
||||
</div>
|
||||
|
||||
|
||||
## 2. Подключаемся к нужному серверу
|
||||
```sh
|
||||
ssh igor@192.168.200.84 -p 22
|
||||
```
|
||||
|
||||
## 3. Создаём директории
|
||||
```sh
|
||||
sudo mkdir -p /opt/dashy &&
|
||||
sudo mkdir -p /opt/dashy/data &&
|
||||
sudo chmod -R 777 /opt/dashy &&
|
||||
sudo chown -R $USER:$USER /opt/dashy
|
||||
```
|
||||
|
||||
Создаём файл конфигурации
|
||||
```sh
|
||||
cd /opt/dashy/data &&
|
||||
tee conf.yml > /dev/null <<EOF
|
||||
pageInfo:
|
||||
title: Home Lab
|
||||
sections: # An array of sections
|
||||
- name: Example Section
|
||||
icon: far fa-rocket
|
||||
items:
|
||||
- title: GitHub
|
||||
description: Dashy source code and docs
|
||||
icon: fab fa-github
|
||||
url: https://github.com/Lissy93/dashy
|
||||
- title: Issues
|
||||
description: View open issues, or raise a new one
|
||||
icon: fas fa-bug
|
||||
url: https://github.com/Lissy93/dashy/issues
|
||||
- name: Local Services
|
||||
items:
|
||||
- title: ProxMox
|
||||
icon: https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/images/logo.png
|
||||
url: https://192.168.200.80:8006
|
||||
- title: Grafana
|
||||
icon: https://static-00.iconduck.com/assets.00/grafana-icon-942x1024-18c9p0yp.png
|
||||
url: http://192.168.200.84:3000
|
||||
- title: Uptime-kuma
|
||||
icon: https://raw.githubusercontent.com/louislam/uptime-kuma/b45dc6787db6530e8dda1388a37e8a80683da5a8/public/icon.svg
|
||||
url: http://192.168.200.84:3001
|
||||
- title: Gotify
|
||||
icon: https://192.168.200.84:8080/static/defaultapp.png
|
||||
url: https://192.168.200.84:8080
|
||||
- title: portainer.io
|
||||
icon: https://icon.icepanel.io/Technology/svg/Portainer.svg
|
||||
url: https://192.168.200.84:9443
|
||||
- title: Prometheus
|
||||
icon: https://static-00.iconduck.com/assets.00/prometheus-icon-511x512-1vmxbcxr.png
|
||||
url: http://192.168.200.84:9090
|
||||
- name: PowerDNS
|
||||
items:
|
||||
- title: PowerDNS-Admin
|
||||
icon: https://avatars.githubusercontent.com/u/1282630?s=200&v=4
|
||||
url: http://192.168.200.85:9191
|
||||
|
||||
EOF
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo chmod 666 /opt/dashy/data/conf.yml
|
||||
```
|
||||
|
||||
## 3. Создаём файл и записываем настройки:
|
||||
|
||||
```sh
|
||||
cd /opt/dashy &&
|
||||
cat > docker-compose.yml <<EOF
|
||||
services:
|
||||
dashy:
|
||||
image: lissy93/dashy:latest
|
||||
container_name: my-dashboard
|
||||
ports:
|
||||
- "3002:8080"
|
||||
volumes:
|
||||
- /opt/dashy/data/conf.yml:/app/user-data/conf.yml
|
||||
restart: always
|
||||
EOF
|
||||
```
|
||||
|
||||
|
||||
## 4. Запуск контейнера
|
||||
```sh
|
||||
cd /opt/dashy &&
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
```sh
|
||||
cd /opt/dashy &&
|
||||
sudo docker-compose down
|
||||
```
|
||||
|
||||
|
||||
|
||||
```sh
|
||||
exit
|
||||
```
|
||||
```sh
|
||||
start http://192.168.200.84:3002
|
||||
```
|
||||
# Устанавливаем дашборд Dashy на сервер
|
||||
|
||||
<div style="display: flex; align-items: flex-start;">
|
||||
<img src="./icons/dashy.png" alt="Dashy" width="64" height="64" style="margin-right: 10px;">
|
||||
<p>Dashy — это открытый (open-source) дашборд для удобного управления и организации ссылок на сервисы, приложения и веб-ресурсы. Он предназначен для домашнего использования (Home Lab) и DevOps-окружений.</p>
|
||||
</div>
|
||||
|
||||
|
||||
## 2. Подключаемся к нужному серверу
|
||||
```sh
|
||||
ssh igor@192.168.200.84 -p 22
|
||||
```
|
||||
|
||||
## 3. Создаём директории
|
||||
```sh
|
||||
sudo mkdir -p /opt/dashy &&
|
||||
sudo mkdir -p /opt/dashy/data &&
|
||||
sudo chmod -R 777 /opt/dashy &&
|
||||
sudo chown -R $USER:$USER /opt/dashy
|
||||
```
|
||||
|
||||
Создаём файл конфигурации
|
||||
```sh
|
||||
cd /opt/dashy/data &&
|
||||
tee conf.yml > /dev/null <<'EOF'
|
||||
pageInfo:
|
||||
title: Home Lab
|
||||
sections: # An array of sections
|
||||
- name: Example Section
|
||||
icon: far fa-rocket
|
||||
items:
|
||||
- title: GitHub
|
||||
description: Dashy source code and docs
|
||||
icon: fab fa-github
|
||||
url: https://github.com/Lissy93/dashy
|
||||
- title: Issues
|
||||
description: View open issues, or raise a new one
|
||||
icon: fas fa-bug
|
||||
url: https://github.com/Lissy93/dashy/issues
|
||||
- name: Local Services
|
||||
items:
|
||||
- title: ProxMox
|
||||
icon: https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/images/logo.png
|
||||
url: https://192.168.200.80:8006
|
||||
- title: Grafana
|
||||
icon: https://static-00.iconduck.com/assets.00/grafana-icon-942x1024-18c9p0yp.png
|
||||
url: http://192.168.200.84:3000
|
||||
- title: Uptime-kuma
|
||||
icon: https://raw.githubusercontent.com/louislam/uptime-kuma/b45dc6787db6530e8dda1388a37e8a80683da5a8/public/icon.svg
|
||||
url: http://192.168.200.84:3001
|
||||
- title: Gotify
|
||||
icon: https://192.168.200.84:8080/static/defaultapp.png
|
||||
url: https://192.168.200.84:8080
|
||||
- title: portainer.io
|
||||
icon: https://icon.icepanel.io/Technology/svg/Portainer.svg
|
||||
url: https://192.168.200.84:9443
|
||||
- title: Prometheus
|
||||
icon: https://static-00.iconduck.com/assets.00/prometheus-icon-511x512-1vmxbcxr.png
|
||||
url: http://192.168.200.84:9090
|
||||
- name: PowerDNS
|
||||
items:
|
||||
- title: PowerDNS-Admin
|
||||
icon: https://avatars.githubusercontent.com/u/1282630?s=200&v=4
|
||||
url: http://192.168.200.85:9191
|
||||
|
||||
EOF
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo chmod 666 /opt/dashy/data/conf.yml
|
||||
```
|
||||
|
||||
## 3. Создаём файл и записываем настройки:
|
||||
|
||||
```sh
|
||||
cd /opt/dashy &&
|
||||
cat > docker-compose.yml <<'EOF'
|
||||
services:
|
||||
dashy:
|
||||
image: lissy93/dashy:latest
|
||||
container_name: my-dashboard
|
||||
ports:
|
||||
- "3002:8080"
|
||||
volumes:
|
||||
- /opt/dashy/data/conf.yml:/app/user-data/conf.yml
|
||||
restart: always
|
||||
EOF
|
||||
```
|
||||
|
||||
## 4. Запуск контейнера
|
||||
```sh
|
||||
cd /opt/dashy &&
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
```sh
|
||||
cd /opt/dashy &&
|
||||
sudo docker-compose down
|
||||
```
|
||||
|
||||
```sh
|
||||
exit
|
||||
```
|
||||
```sh
|
||||
start http://192.168.200.84:3002
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
38
Docker_install.md
Normal file
38
Docker_install.md
Normal file
@ -0,0 +1,38 @@
|
||||
Добавьте официальный репозиторий Docker:
|
||||
```sh
|
||||
sudo apt-get update &&
|
||||
sudo apt-get install ca-certificates curl &&
|
||||
sudo install -m 0755 -d /etc/apt/keyrings &&
|
||||
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc &&
|
||||
sudo chmod a+r /etc/apt/keyrings/docker.asc &&
|
||||
echo \
|
||||
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
|
||||
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
|
||||
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null &&
|
||||
sudo apt-get update
|
||||
```
|
||||
Раз у тебя Linux Mint то нужно будет поменять:
|
||||
```conf
|
||||
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu xia stable
|
||||
```
|
||||
на
|
||||
```conf
|
||||
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stable
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo apt update &&
|
||||
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||
```
|
||||
|
||||
Если Docker не установлен, установим его:
|
||||
```sh
|
||||
sudo apt update && sudo apt upgrade -y &&
|
||||
sudo apt install -y docker.io docker-compose-plugin &&
|
||||
sudo systemctl enable --now docker
|
||||
```
|
||||
Проверим версию:
|
||||
```sh
|
||||
docker --version &&
|
||||
docker compose version
|
||||
```
|
||||
@ -1,138 +1,138 @@
|
||||
# 📌 Установка Gotify в Docker на Ubuntu 24.04
|
||||
|
||||
## 1. Установка Docker и Docker Compose
|
||||
Если Docker не установлен, установим его:
|
||||
```sh
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
sudo apt install -y docker.io docker-compose
|
||||
sudo systemctl enable --now docker
|
||||
```
|
||||
Проверим версию:
|
||||
```sh
|
||||
docker --version
|
||||
docker-compose --version
|
||||
```
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
|
||||
## 2. Создание директории для Gotify
|
||||
Лучшее место для сторонних сервисов — `/opt`:
|
||||
```sh
|
||||
sudo mkdir -p /opt/gotify
|
||||
cd /opt/gotify
|
||||
```
|
||||
|
||||
## 3. Создаём самоподписанный сертификат
|
||||
```sh
|
||||
sudo mkdir -p /opt/gotify/certs && cd /opt/gotify/certs
|
||||
openssl req -x509 -newkey rsa:4096 -keyout gotify.key -out gotify.crt -days 365 -nodes -subj "/CN=your.domain.com"
|
||||
```
|
||||
----------------------------------------------------------------------------------------------------
|
||||
|
||||
## 3. Создание `docker-compose.yml`
|
||||
Создадим конфигурацию:
|
||||
```sh
|
||||
sudo mcedit /opt/gotify/docker-compose.yml
|
||||
```
|
||||
Добавляем:
|
||||
```yaml
|
||||
services:
|
||||
gotify:
|
||||
image: gotify/server
|
||||
container_name: gotify
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- "./certs:/certs"
|
||||
- "./data:/app/data"
|
||||
ports:
|
||||
- "8080:443" # HTTPS
|
||||
environment:
|
||||
- GOTIFY_DEFAULTUSER_NAME=admin
|
||||
- GOTIFY_DEFAULTUSER_PASS=s23uBXreliGIAVOohXhW
|
||||
- TZ=Asia/Almaty
|
||||
- GOTIFY_SERVER_SSL_ENABLED=true
|
||||
- GOTIFY_SERVER_SSL_CERTFILE=/certs/gotify.crt
|
||||
- GOTIFY_SERVER_SSL_CERTKEY=/certs/gotify.key
|
||||
networks:
|
||||
- gotify-net
|
||||
|
||||
networks:
|
||||
gotify-net:
|
||||
driver: bridge
|
||||
```
|
||||
💡 **Что здесь важно?**
|
||||
- **`security_opt: - no-new-privileges:true`** → запрещает повышать привилегии в контейнере.
|
||||
- **`volumes: ./data:/app/data`** → сохраняет данные вне контейнера.
|
||||
- **`restart: unless-stopped`** → перезапускает Gotify, если он внезапно упадёт.
|
||||
- **`ports: - "8080:80"`** → Gotify будет доступен на порту `8080`.
|
||||
|
||||
🔑 **Замените пароль** (`supersecretpassword`) на свой!
|
||||
|
||||
---
|
||||
|
||||
## 4. Запуск Gotify
|
||||
Запускаем контейнер:
|
||||
```sh
|
||||
cd /opt/gotify
|
||||
sudo docker compose down
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
Проверяем статус:
|
||||
```sh
|
||||
sudo docker ps
|
||||
```
|
||||
Вы должны увидеть работающий контейнер `gotify`.
|
||||
|
||||
---
|
||||
|
||||
## 5. Проверка работы
|
||||
Открываем браузер и переходим:
|
||||
👉 **https://192.168.200.84:8080**
|
||||
👉 **https://gotify.locust.kz:8443**
|
||||
|
||||
Логинимся:
|
||||
- **Имя**: `admin`
|
||||
- **Пароль**: тот, что указан в `GOTIFY_DEFAULTUSER_PASS`
|
||||
|
||||
---
|
||||
|
||||
## 6. Автоматический запуск при загрузке
|
||||
Docker уже настроен на автозапуск, но проверим:
|
||||
```sh
|
||||
sudo systemctl enable --now docker
|
||||
```
|
||||
Чтобы Gotify запускался автоматически:
|
||||
```sh
|
||||
cd /opt/gotify
|
||||
sudo docker-compose restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. Логи и управление
|
||||
Просмотр логов:
|
||||
```sh
|
||||
sudo docker-compose logs -f
|
||||
```
|
||||
Перезапуск контейнера:
|
||||
```sh
|
||||
sudo docker-compose restart
|
||||
```
|
||||
Остановка:
|
||||
```sh
|
||||
sudo docker-compose down
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. Удаление Gotify (если потребуется)
|
||||
```sh
|
||||
cd /opt/gotify
|
||||
sudo docker-compose down
|
||||
sudo rm -rf /opt/gotify
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ Готово!
|
||||
Теперь Gotify работает на порту `80` с безопасными настройками (`no-new-privileges:true`). 🚀
|
||||
# 📌 Установка Gotify в Docker на Ubuntu 24.04
|
||||
|
||||
## 1. Установка Docker и Docker Compose
|
||||
Если Docker не установлен, установим его:
|
||||
```sh
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
sudo apt install -y docker.io docker-compose
|
||||
sudo systemctl enable --now docker
|
||||
```
|
||||
Проверим версию:
|
||||
```sh
|
||||
docker --version
|
||||
docker-compose --version
|
||||
```
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
|
||||
## 2. Создание директории для Gotify
|
||||
Лучшее место для сторонних сервисов — `/opt`:
|
||||
```sh
|
||||
sudo mkdir -p /opt/gotify
|
||||
cd /opt/gotify
|
||||
```
|
||||
|
||||
## 3. Создаём самоподписанный сертификат
|
||||
```sh
|
||||
sudo mkdir -p /opt/gotify/certs && cd /opt/gotify/certs
|
||||
openssl req -x509 -newkey rsa:4096 -keyout gotify.key -out gotify.crt -days 365 -nodes -subj "/CN=your.domain.com"
|
||||
```
|
||||
----------------------------------------------------------------------------------------------------
|
||||
|
||||
## 3. Создание `docker-compose.yml`
|
||||
Создадим конфигурацию:
|
||||
```sh
|
||||
sudo mcedit /opt/gotify/docker-compose.yml
|
||||
```
|
||||
Добавляем:
|
||||
```yaml
|
||||
services:
|
||||
gotify:
|
||||
image: gotify/server
|
||||
container_name: gotify
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- "./certs:/certs"
|
||||
- "./data:/app/data"
|
||||
ports:
|
||||
- "8080:443" # HTTPS
|
||||
environment:
|
||||
- GOTIFY_DEFAULTUSER_NAME=admin
|
||||
- GOTIFY_DEFAULTUSER_PASS=s23uBXreliGIAVOohXhW
|
||||
- TZ=Asia/Almaty
|
||||
- GOTIFY_SERVER_SSL_ENABLED=true
|
||||
- GOTIFY_SERVER_SSL_CERTFILE=/certs/gotify.crt
|
||||
- GOTIFY_SERVER_SSL_CERTKEY=/certs/gotify.key
|
||||
networks:
|
||||
- gotify-net
|
||||
|
||||
networks:
|
||||
gotify-net:
|
||||
driver: bridge
|
||||
```
|
||||
💡 **Что здесь важно?**
|
||||
- **`security_opt: - no-new-privileges:true`** → запрещает повышать привилегии в контейнере.
|
||||
- **`volumes: ./data:/app/data`** → сохраняет данные вне контейнера.
|
||||
- **`restart: unless-stopped`** → перезапускает Gotify, если он внезапно упадёт.
|
||||
- **`ports: - "8080:80"`** → Gotify будет доступен на порту `8080`.
|
||||
|
||||
🔑 **Замените пароль** (`supersecretpassword`) на свой!
|
||||
|
||||
---
|
||||
|
||||
## 4. Запуск Gotify
|
||||
Запускаем контейнер:
|
||||
```sh
|
||||
cd /opt/gotify
|
||||
sudo docker compose down
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
Проверяем статус:
|
||||
```sh
|
||||
sudo docker ps
|
||||
```
|
||||
Вы должны увидеть работающий контейнер `gotify`.
|
||||
|
||||
---
|
||||
|
||||
## 5. Проверка работы
|
||||
Открываем браузер и переходим:
|
||||
👉 **https://192.168.200.84:8080**
|
||||
👉 **https://gotify.locust.kz:8443**
|
||||
|
||||
Логинимся:
|
||||
- **Имя**: `admin`
|
||||
- **Пароль**: тот, что указан в `GOTIFY_DEFAULTUSER_PASS`
|
||||
|
||||
---
|
||||
|
||||
## 6. Автоматический запуск при загрузке
|
||||
Docker уже настроен на автозапуск, но проверим:
|
||||
```sh
|
||||
sudo systemctl enable --now docker
|
||||
```
|
||||
Чтобы Gotify запускался автоматически:
|
||||
```sh
|
||||
cd /opt/gotify
|
||||
sudo docker-compose restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. Логи и управление
|
||||
Просмотр логов:
|
||||
```sh
|
||||
sudo docker-compose logs -f
|
||||
```
|
||||
Перезапуск контейнера:
|
||||
```sh
|
||||
sudo docker-compose restart
|
||||
```
|
||||
Остановка:
|
||||
```sh
|
||||
sudo docker-compose down
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. Удаление Gotify (если потребуется)
|
||||
```sh
|
||||
cd /opt/gotify
|
||||
sudo docker-compose down
|
||||
sudo rm -rf /opt/gotify
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ Готово!
|
||||
Теперь Gotify работает на порту `80` с безопасными настройками (`no-new-privileges:true`). 🚀
|
||||
|
||||
@ -1,252 +1,257 @@
|
||||
# 📌 Установка HAProxy на Ubuntu 20.04
|
||||
****************************************************************************************************
|
||||
На основе инструкции из https://itsecforu.ru/2019/07/15/⏳-настройка-балансировщика-нагрузки-h/
|
||||
|
||||
Connect to the required server:
|
||||
```sh
|
||||
ssh administrator@10.101.1.3 -p 22
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo apt-get update && sudo apt-get install haproxy -y
|
||||
````
|
||||
Создаём резервную копию файла:
|
||||
```sh
|
||||
sudo cp /etc/haproxy/haproxy.cfg{,.bak}
|
||||
````
|
||||
Редактируем конфигурацию (Описание конфигурационного файла HAProxy https://habr.com/ru/sandbox/34354/)
|
||||
```sh
|
||||
mcedit /etc/haproxy/haproxy.cfg
|
||||
```
|
||||
В конец файла добавляем пока только для перенаправления (для балансироки больше IP адресов):
|
||||
|
||||
frontend frontend-http
|
||||
bind *:80
|
||||
mode http
|
||||
|
||||
# ACL для определения запросов на проверку Let's Encrypt
|
||||
acl is_certbot path_beg /.well-known/acme-challenge/
|
||||
|
||||
# Если это не запрос Let's Encrypt, перенаправляем на HTTPS
|
||||
http-request redirect scheme https code 301 unless is_certbot
|
||||
|
||||
# Отправляем запросы Let's Encrypt на backend-certbot
|
||||
use_backend backend-certbot if is_certbot
|
||||
|
||||
frontend LOADBALANCER-01
|
||||
bind *:80
|
||||
bind *:443 ssl crt /etc/haproxy/ssl/mqtt.kz.pem crt /etc/ssl/certs/bigfoottrade_kz.pem
|
||||
mode http #режим работы HAProxy, в http режиме происходит анализ Layer 7 трафика
|
||||
option httpclose #Закрывает пассивные соединения
|
||||
|
||||
http-request set-header x-Forwarded-for %[src]
|
||||
http-request set-header x-Forwarded-uri %[url]
|
||||
|
||||
acl v_geoserver2 hdr(host) -i geoserver2.ccalm.org
|
||||
use_backend geoserver2_ccalm_org if v_geoserver2
|
||||
|
||||
#Если различные нестандартные порты то так
|
||||
acl v_locust_kz hdr_reg(host) -i ^locust\.kz(:.*)?$
|
||||
use_backend b_locust_kz if v_locust_kz
|
||||
|
||||
#Перенаправление одной страницы по адресу http://geoserver2.ccalm.org/data/ на другой backend
|
||||
acl v_geo_data hdr(host) -i geoserver2.ccalm.org/data
|
||||
use_backend WEBSERVERS-01 if v_geo_data
|
||||
|
||||
|
||||
default_backend WEBSERVERS-01
|
||||
|
||||
backend WEBSERVERS-01
|
||||
balance roundrobin
|
||||
server web10 127.0.0.1:8081 check inter 5s ssl verify none
|
||||
option httpchk
|
||||
|
||||
backend geoserver2_ccalm_org
|
||||
balance roundrobin
|
||||
server web1 192.168.0.90:80 check
|
||||
option httpchk
|
||||
|
||||
listen stats
|
||||
bind *:8989
|
||||
stats enable
|
||||
stats uri /
|
||||
stats realm Haproxy\ Statistics
|
||||
stats auth igor:i123456
|
||||
|
||||
frontend f-RabbitMQ
|
||||
mode tcp
|
||||
bind 10.1.7.73:21000
|
||||
default_backend b-RabbitMQ
|
||||
|
||||
backend b-RabbitMQ
|
||||
mode tcp
|
||||
server srv1 10.10.16.21:20000
|
||||
|
||||
Для перенаправления незащищённого HTTP трафика можно: xxxxxxxxxxxxxxx
|
||||
|
||||
Для использования SSL и перенаправляние по обычному сокету для начала нужно настроить pem файл объеденив crt и key (и незабыть изменить порт Apache с 433)
|
||||
cat /etc/ssl/certs/bigfoottrade_kz.crt /etc/ssl/certs/bigfoottrade_kz_ca.crt /etc/ssl/private/bigfoottrade_kz.key > /etc/haproxy/ssl/bigfoottrade_kz.pem
|
||||
cat AAA_Certificate_Services.crt GoGetSSL_RSA_DV_CA.crt istransit_kz.crt istransit_kz.key > istransit_kz.pem
|
||||
|
||||
SSLCertificateFile
|
||||
SSLCertificateKeyFile
|
||||
|
||||
Для включения WEB статистики на 9000 порту добавить в конец конфигурации:
|
||||
listen stats
|
||||
bind *:8989
|
||||
stats enable
|
||||
stats uri /stats
|
||||
stats realm Haproxy\ Statistics
|
||||
stats auth igor:i123456
|
||||
Тестирую файл конфигурации:
|
||||
```sh
|
||||
haproxy -f /etc/haproxy/haproxy.cfg -c
|
||||
````
|
||||
Также можно в журнале посмотреть что написал HAProxy:
|
||||
```sh
|
||||
sudo journalctl -u haproxy --no-pager | tail -n 50
|
||||
````
|
||||
Перезагружаем:
|
||||
```sh
|
||||
sudo systemctl restart haproxy
|
||||
````
|
||||
|
||||
Посмотреть что в журнале можно так:
|
||||
Посмотреть что в журнале можно так:
|
||||
```sh
|
||||
journalctl -u haproxy --since "1 minutes ago"
|
||||
journalctl -u haproxy --since "30 minutes ago" | grep "backend"
|
||||
tail -f /var/log/haproxy.log
|
||||
```
|
||||
|
||||
|
||||
|
||||
administrator@app:~$ journalctl -u haproxy --since "30 minutes ago" | grep "backend"
|
||||
backend 'transit_acquiring_v01_kz' has no server available!
|
||||
backend 'transit_translation_v02_kz' has no server available!
|
||||
backend 'transit_mobile_kz' has no server available!
|
||||
backend 'transit_manager_kz' has no server available!
|
||||
backend 'transit_warehouse_kz' has no server available!
|
||||
backend 'transit_kgd_kz' has no server available!
|
||||
backend 'transit_monitoring_kz' has no server available!
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
И теперь должно открываться но адресу: http://data.ccalm.org:8989/
|
||||
Обязательно проверить как установился SSL чекером: https://www.leaderssl.ru/tools/ssl_checker
|
||||
|
||||
|
||||
# 📌 Бесплатный SSL сертификат Let’s Encrypt для HAPROXY
|
||||
****************************************************************************************************
|
||||
Бесплатный SSL сертификат Let’s Encrypt для HAPROXY https://serversforhackers.com/c/letsencrypt-with-haproxy
|
||||
```sh
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y certbot
|
||||
````
|
||||
Для удаления PPA нужно выполнить:
|
||||
```sh
|
||||
sudo apt-get remove certbot
|
||||
sudo add-apt-repository --remove ppa:certbot/certbot
|
||||
apt-get install -f
|
||||
apt autoremove
|
||||
```
|
||||
Если включён файрволл то разрешаем порт:
|
||||
```sh
|
||||
sudo ufw allow 9080/tcp
|
||||
```
|
||||
Проверяем что автообновление в certbot работает для этого выполняем команду:
|
||||
```sh
|
||||
sudo systemctl status certbot.timer
|
||||
```
|
||||
Затем пытаемся выполнить пробный прогон при помощи команды:
|
||||
```sh
|
||||
sudo certbot renew --dry-run
|
||||
```
|
||||
|
||||
Согласно инструкции модифицируем конфигурационный файл haproxy добавив во frontend это:
|
||||
```
|
||||
# ACL for detecting Let's Encrypt validtion requests
|
||||
acl is_certbot path_beg /.well-known/acme-challenge/
|
||||
use_backend backend-certbot if is_certbot
|
||||
```
|
||||
А также ещё один backend:
|
||||
```
|
||||
# Certbot backend
|
||||
# Contains certbot stand-alone webserver
|
||||
backend backend-certbot
|
||||
mode http
|
||||
server certbot 127.0.0.1:9080
|
||||
```
|
||||
Перезагрузить и выполнить команду:
|
||||
|
||||
```sh
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d locust.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d gotify.locust.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d git.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d ru.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d rug.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d kz.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d kzg.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d locust.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d test.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d data.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d geoserver2.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d geoserver.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d stations.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d uspdmanager.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d tourist.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d monitoring.infracos.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d aistransit.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d istransit.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d test.istransit.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d main.istransit.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d transit.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d geovizor.com --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d mqtt.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d observer.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d rigor.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d pal.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d elektronnaya-ochered.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d mcp.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
```
|
||||
|
||||
После генерации файлы будут в:
|
||||
/etc/letsencrypt/live/geoserver2.ccalm.org/fullchain.pem
|
||||
/etc/letsencrypt/live/geoserver2.ccalm.org/privkey.pem
|
||||
|
||||
Для обновления создаём файл /etc/letsencrypt/renew.sh (по моему этот скрипт не нужен так как рабтает сервис certbot.timer):
|
||||
#!/bin/bash
|
||||
certbot renew --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 --post-hook "/etc/haproxy/prepare.sh" --quiet
|
||||
|
||||
Но для HAProxy нужно чтобы 2 файла были объединены поэтому добавляю спец скрипт /etc/haproxy/prepare.sh:
|
||||
#!/bin/bash
|
||||
|
||||
# Loop through all Let's Encrypt certificates
|
||||
for CERTIFICATE in `find /etc/letsencrypt/live/* -type d`; do
|
||||
|
||||
CERTIFICATE=`basename $CERTIFICATE`
|
||||
|
||||
# Combine certificate and private key to single file
|
||||
cat /etc/letsencrypt/live/$CERTIFICATE/fullchain.pem /etc/letsencrypt/live/$CERTIFICATE/privkey.pem > /etc/haproxy/ssl/$CERTIFICATE.pem
|
||||
|
||||
done
|
||||
systemctl reload haproxy.service
|
||||
|
||||
Обновляем конфигурацию HAProxy добавив в frontend:
|
||||
bind *:443 ssl crt /etc/haproxy/ssl/mqtt.kz.pem
|
||||
|
||||
Устанавливаем права
|
||||
chmod +x /etc/haproxy/renew.sh
|
||||
chmod +x /etc/haproxy/prepare.sh
|
||||
И добавляем задание в cron "crontab -e" ниже текст это раз в 24 часа в 00:00:00 ночи:
|
||||
0 0 * * * /bin/sh /etc/letsencrypt/renew.sh
|
||||
# 📌 Установка HAProxy на Ubuntu 20.04
|
||||
****************************************************************************************************
|
||||
На основе инструкции из https://itsecforu.ru/2019/07/15/⏳-настройка-балансировщика-нагрузки-h/
|
||||
|
||||
Connect to the required server:
|
||||
```sh
|
||||
ssh administrator@10.101.1.3 -p 22
|
||||
```
|
||||
Connect to CCALM Turkish infrastructure:
|
||||
```sh
|
||||
ssh igor@156.244.31.209 -p 2200
|
||||
```
|
||||
----------------------------------------------------------------------------------------------------
|
||||
## Install haproxy
|
||||
```sh
|
||||
sudo apt-get update && sudo apt-get install haproxy -y
|
||||
````
|
||||
Создаём резервную копию файла:
|
||||
```sh
|
||||
sudo cp /etc/haproxy/haproxy.cfg{,.bak}
|
||||
````
|
||||
Редактируем конфигурацию (Описание конфигурационного файла HAProxy https://habr.com/ru/sandbox/34354/)
|
||||
```sh
|
||||
mcedit /etc/haproxy/haproxy.cfg
|
||||
```
|
||||
В конец файла добавляем пока только для перенаправления (для балансироки больше IP адресов):
|
||||
```conf
|
||||
frontend frontend-http
|
||||
bind *:80
|
||||
mode http
|
||||
|
||||
# ACL для определения запросов на проверку Let's Encrypt
|
||||
acl is_certbot path_beg /.well-known/acme-challenge/
|
||||
|
||||
# Если это не запрос Let's Encrypt, перенаправляем на HTTPS
|
||||
http-request redirect scheme https code 301 unless is_certbot
|
||||
|
||||
# Отправляем запросы Let's Encrypt на backend-certbot
|
||||
use_backend backend-certbot if is_certbot
|
||||
|
||||
frontend LOADBALANCER-01
|
||||
bind *:80
|
||||
bind *:443 ssl crt /etc/haproxy/ssl/mqtt.kz.pem crt /etc/ssl/certs/bigfoottrade_kz.pem
|
||||
mode http #режим работы HAProxy, в http режиме происходит анализ Layer 7 трафика
|
||||
option httpclose #Закрывает пассивные соединения
|
||||
|
||||
http-request set-header x-Forwarded-for %[src]
|
||||
http-request set-header x-Forwarded-uri %[url]
|
||||
|
||||
acl v_geoserver2 hdr(host) -i geoserver2.ccalm.org
|
||||
use_backend geoserver2_ccalm_org if v_geoserver2
|
||||
|
||||
#Если различные нестандартные порты то так
|
||||
acl v_locust_kz hdr_reg(host) -i ^locust\.kz(:.*)?$
|
||||
use_backend b_locust_kz if v_locust_kz
|
||||
|
||||
#Перенаправление одной страницы по адресу http://geoserver2.ccalm.org/data/ на другой backend
|
||||
acl v_geo_data hdr(host) -i geoserver2.ccalm.org/data
|
||||
use_backend WEBSERVERS-01 if v_geo_data
|
||||
|
||||
|
||||
default_backend WEBSERVERS-01
|
||||
|
||||
backend WEBSERVERS-01
|
||||
balance roundrobin
|
||||
server web10 127.0.0.1:8081 check inter 5s ssl verify none
|
||||
option httpchk
|
||||
|
||||
backend geoserver2_ccalm_org
|
||||
balance roundrobin
|
||||
server web1 192.168.0.90:80 check
|
||||
option httpchk
|
||||
|
||||
listen stats
|
||||
bind *:8989
|
||||
stats enable
|
||||
stats uri /
|
||||
stats realm Haproxy\ Statistics
|
||||
stats auth igor:i123456
|
||||
|
||||
frontend f-RabbitMQ
|
||||
mode tcp
|
||||
bind 10.1.7.73:21000
|
||||
default_backend b-RabbitMQ
|
||||
|
||||
backend b-RabbitMQ
|
||||
mode tcp
|
||||
server srv1 10.10.16.21:20000
|
||||
```
|
||||
Для перенаправления незащищённого HTTP трафика можно: xxxxxxxxxxxxxxx
|
||||
|
||||
Для использования SSL и перенаправляние по обычному сокету для начала нужно настроить pem файл объеденив crt и key (и незабыть изменить порт Apache с 433)
|
||||
cat /etc/ssl/certs/bigfoottrade_kz.crt /etc/ssl/certs/bigfoottrade_kz_ca.crt /etc/ssl/private/bigfoottrade_kz.key > /etc/haproxy/ssl/bigfoottrade_kz.pem
|
||||
cat AAA_Certificate_Services.crt GoGetSSL_RSA_DV_CA.crt istransit_kz.crt istransit_kz.key > istransit_kz.pem
|
||||
|
||||
SSLCertificateFile
|
||||
SSLCertificateKeyFile
|
||||
|
||||
Для включения WEB статистики на 9000 порту добавить в конец конфигурации:
|
||||
listen stats
|
||||
bind *:8989
|
||||
stats enable
|
||||
stats uri /stats
|
||||
stats realm Haproxy\ Statistics
|
||||
stats auth igor:i123456
|
||||
Тестирую файл конфигурации:
|
||||
```sh
|
||||
haproxy -f /etc/haproxy/haproxy.cfg -c
|
||||
````
|
||||
Также можно в журнале посмотреть что написал HAProxy:
|
||||
```sh
|
||||
sudo journalctl -u haproxy --no-pager | tail -n 50
|
||||
````
|
||||
Перезагружаем:
|
||||
```sh
|
||||
sudo systemctl restart haproxy
|
||||
````
|
||||
|
||||
Посмотреть что в журнале можно так:
|
||||
Посмотреть что в журнале можно так:
|
||||
```sh
|
||||
journalctl -u haproxy --since "1 minutes ago"
|
||||
journalctl -u haproxy --since "30 minutes ago" | grep "backend"
|
||||
tail -f /var/log/haproxy.log
|
||||
```
|
||||
|
||||
|
||||
|
||||
administrator@app:~$ journalctl -u haproxy --since "30 minutes ago" | grep "backend"
|
||||
backend 'transit_acquiring_v01_kz' has no server available!
|
||||
backend 'transit_translation_v02_kz' has no server available!
|
||||
backend 'transit_mobile_kz' has no server available!
|
||||
backend 'transit_manager_kz' has no server available!
|
||||
backend 'transit_warehouse_kz' has no server available!
|
||||
backend 'transit_kgd_kz' has no server available!
|
||||
backend 'transit_monitoring_kz' has no server available!
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
И теперь должно открываться но адресу: http://data.ccalm.org:8989/
|
||||
Обязательно проверить как установился SSL чекером: https://www.leaderssl.ru/tools/ssl_checker
|
||||
|
||||
|
||||
# 📌 Бесплатный SSL сертификат Let’s Encrypt для HAPROXY
|
||||
****************************************************************************************************
|
||||
Бесплатный SSL сертификат Let’s Encrypt для HAPROXY https://serversforhackers.com/c/letsencrypt-with-haproxy
|
||||
```sh
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y certbot
|
||||
````
|
||||
Для удаления PPA нужно выполнить:
|
||||
```sh
|
||||
sudo apt-get remove certbot
|
||||
sudo add-apt-repository --remove ppa:certbot/certbot
|
||||
apt-get install -f
|
||||
apt autoremove
|
||||
```
|
||||
Если включён файрволл то разрешаем порт:
|
||||
```sh
|
||||
sudo ufw allow 9080/tcp
|
||||
```
|
||||
Проверяем что автообновление в certbot работает для этого выполняем команду:
|
||||
```sh
|
||||
sudo systemctl status certbot.timer
|
||||
```
|
||||
Затем пытаемся выполнить пробный прогон при помощи команды:
|
||||
```sh
|
||||
sudo certbot renew --dry-run
|
||||
```
|
||||
|
||||
Согласно инструкции модифицируем конфигурационный файл haproxy добавив во frontend это:
|
||||
```
|
||||
# ACL for detecting Let's Encrypt validtion requests
|
||||
acl is_certbot path_beg /.well-known/acme-challenge/
|
||||
use_backend backend-certbot if is_certbot
|
||||
```
|
||||
А также ещё один backend:
|
||||
```
|
||||
# Certbot backend
|
||||
# Contains certbot stand-alone webserver
|
||||
backend backend-certbot
|
||||
mode http
|
||||
server certbot 127.0.0.1:9080
|
||||
```
|
||||
Перезагрузить и выполнить команду:
|
||||
|
||||
```sh
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d locust.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d gotify.locust.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d git.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d ru.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d rug.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d kz.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d kzg.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d locust.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d test.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d data.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d geoserver2.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d geoserver.ccalm.org --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d stations.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d uspdmanager.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d tourist.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d monitoring.infracos.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d aistransit.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d istransit.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d test.istransit.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d main.istransit.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d transit.istt.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d geovizor.com --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d mqtt.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d observer.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d rigor.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d pal.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d elektronnaya-ochered.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
certbot certonly --rsa-key-size 2048 --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d mcp.kz --email irigm@mail.ru --agree-tos --non-interactive
|
||||
```
|
||||
|
||||
После генерации файлы будут в:
|
||||
/etc/letsencrypt/live/geoserver2.ccalm.org/fullchain.pem
|
||||
/etc/letsencrypt/live/geoserver2.ccalm.org/privkey.pem
|
||||
|
||||
Для обновления создаём файл /etc/letsencrypt/renew.sh (по моему этот скрипт не нужен так как рабтает сервис certbot.timer):
|
||||
#!/bin/bash
|
||||
certbot renew --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 --post-hook "/etc/haproxy/prepare.sh" --quiet
|
||||
|
||||
Но для HAProxy нужно чтобы 2 файла были объединены поэтому добавляю спец скрипт /etc/haproxy/prepare.sh:
|
||||
#!/bin/bash
|
||||
|
||||
# Loop through all Let's Encrypt certificates
|
||||
for CERTIFICATE in `find /etc/letsencrypt/live/* -type d`; do
|
||||
|
||||
CERTIFICATE=`basename $CERTIFICATE`
|
||||
|
||||
# Combine certificate and private key to single file
|
||||
cat /etc/letsencrypt/live/$CERTIFICATE/fullchain.pem /etc/letsencrypt/live/$CERTIFICATE/privkey.pem > /etc/haproxy/ssl/$CERTIFICATE.pem
|
||||
|
||||
done
|
||||
systemctl reload haproxy.service
|
||||
|
||||
Обновляем конфигурацию HAProxy добавив в frontend:
|
||||
bind *:443 ssl crt /etc/haproxy/ssl/mqtt.kz.pem
|
||||
|
||||
Устанавливаем права
|
||||
chmod +x /etc/haproxy/renew.sh
|
||||
chmod +x /etc/haproxy/prepare.sh
|
||||
И добавляем задание в cron "crontab -e" ниже текст это раз в 24 часа в 00:00:00 ночи:
|
||||
0 0 * * * /bin/sh /etc/letsencrypt/renew.sh
|
||||
|
||||
144
HTTPTunnel.md
144
HTTPTunnel.md
@ -1,73 +1,73 @@
|
||||
# 📌 Туннелирование SSH через HTTP
|
||||
****************************************************************************************************
|
||||
Исходники тут: https://github.com/larsbrinkhoff/httptunnel:
|
||||
```sh
|
||||
sudo apt-get install httptunnel
|
||||
````
|
||||
Настроил HAProxy примерно так, чтобы проверялся параметр "mybiglogfile" для редиректа:
|
||||
```
|
||||
frontend frontend-http
|
||||
bind *:80
|
||||
mode http
|
||||
|
||||
acl v_tunnel url_param(mybiglogfile) -m found
|
||||
use_backend httptunnel_backend if v_tunnel
|
||||
|
||||
http-request redirect scheme https code 301 unless { ssl_fc } || v_tunnel
|
||||
```
|
||||
|
||||
Проверить нет ли редирект можно так:
|
||||
curl -I http://192.168.200.81/index.html?mybiglogfile=all
|
||||
curl -I http://locust.kz/index.html?mybiglogfile=all
|
||||
|
||||
На сервере запустил прослушку на 9999 и перенаправление на 22:
|
||||
```sh
|
||||
sudo hts -F 127.0.0.1:22 9999
|
||||
````
|
||||
Для остановки
|
||||
```sh
|
||||
ps aux | grep hts
|
||||
sudo kill 1854
|
||||
```
|
||||
Можно запустить как сервис так sudo mcedit /etc/systemd/system/httptunnel.service:
|
||||
```
|
||||
[Unit]
|
||||
Description=HTTP Tunnel Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=hts -F 127.0.0.1:22 9999
|
||||
Restart=always
|
||||
User=root
|
||||
RestartSec=10
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
Потом:
|
||||
```sh
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable httptunnel
|
||||
sudo systemctl stop httptunnel
|
||||
sudo systemctl start httptunnel
|
||||
sudo systemctl status httptunnel
|
||||
tail -f /var/log/syslog | grep --line-buffered "htc"
|
||||
```
|
||||
|
||||
На клиенте запускаем локальный порт также указал 9999 а ключь
|
||||
```sh
|
||||
htc -F 9999 --base-uri /index.html?mybiglogfile=all 192.168.200.81:80
|
||||
htc -F 9999 --base-uri /index.html?mybiglogfile=all locust.kz:80
|
||||
```
|
||||
|
||||
Для остановки
|
||||
```sh
|
||||
ps aux | grep htc
|
||||
Потом
|
||||
sudo kill 783
|
||||
```
|
||||
|
||||
Пробую подключиться после настройки тунеля:
|
||||
```sh
|
||||
ssh igor@127.0.0.1 -p 9999
|
||||
# 📌 Туннелирование SSH через HTTP
|
||||
****************************************************************************************************
|
||||
Исходники тут: https://github.com/larsbrinkhoff/httptunnel:
|
||||
```sh
|
||||
sudo apt-get install httptunnel
|
||||
````
|
||||
Настроил HAProxy примерно так, чтобы проверялся параметр "mybiglogfile" для редиректа:
|
||||
```
|
||||
frontend frontend-http
|
||||
bind *:80
|
||||
mode http
|
||||
|
||||
acl v_tunnel url_param(mybiglogfile) -m found
|
||||
use_backend httptunnel_backend if v_tunnel
|
||||
|
||||
http-request redirect scheme https code 301 unless { ssl_fc } || v_tunnel
|
||||
```
|
||||
|
||||
Проверить нет ли редирект можно так:
|
||||
curl -I http://192.168.200.81/index.html?mybiglogfile=all
|
||||
curl -I http://locust.kz/index.html?mybiglogfile=all
|
||||
|
||||
На сервере запустил прослушку на 9999 и перенаправление на 22:
|
||||
```sh
|
||||
sudo hts -F 127.0.0.1:22 9999
|
||||
````
|
||||
Для остановки
|
||||
```sh
|
||||
ps aux | grep hts
|
||||
sudo kill 1854
|
||||
```
|
||||
Можно запустить как сервис так sudo mcedit /etc/systemd/system/httptunnel.service:
|
||||
```
|
||||
[Unit]
|
||||
Description=HTTP Tunnel Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=hts -F 127.0.0.1:22 9999
|
||||
Restart=always
|
||||
User=root
|
||||
RestartSec=10
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
Потом:
|
||||
```sh
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable httptunnel
|
||||
sudo systemctl stop httptunnel
|
||||
sudo systemctl start httptunnel
|
||||
sudo systemctl status httptunnel
|
||||
tail -f /var/log/syslog | grep --line-buffered "htc"
|
||||
```
|
||||
|
||||
На клиенте запускаем локальный порт также указал 9999 а ключь
|
||||
```sh
|
||||
htc -F 9999 --base-uri /index.html?mybiglogfile=all 192.168.200.81:80
|
||||
htc -F 9999 --base-uri /index.html?mybiglogfile=all locust.kz:80
|
||||
```
|
||||
|
||||
Для остановки
|
||||
```sh
|
||||
ps aux | grep htc
|
||||
Потом
|
||||
sudo kill 783
|
||||
```
|
||||
|
||||
Пробую подключиться после настройки тунеля:
|
||||
```sh
|
||||
ssh igor@127.0.0.1 -p 9999
|
||||
```
|
||||
@ -1,361 +1,361 @@
|
||||
# Установка HashiCorp Vault на Ubuntu
|
||||
|
||||
Vault — это инструмент от HashiCorp для безопасного хранения секретов и управления ими.
|
||||
|
||||
## 1. Установка Vault
|
||||
|
||||
Открываю нужный сервер
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
Похоже vault из Москвы недоступен:
|
||||
```sh
|
||||
ssh root@45.144.64.218 -p 2200
|
||||
```
|
||||
|
||||
### 1.1. Добавление репозитория HashiCorp
|
||||
|
||||
1. Установите необходимые пакеты:
|
||||
```sh
|
||||
sudo apt update && sudo apt install -y gnupg software-properties-common curl
|
||||
```
|
||||
|
||||
2. Добавьте официальный GPG-ключ HashiCorp:
|
||||
```sh
|
||||
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
|
||||
```
|
||||
|
||||
3. Добавьте репозиторий HashiCorp в систему:
|
||||
```sh
|
||||
sudo mcedit /etc/apt/sources.list.d/hashicorp.list
|
||||
```
|
||||
|
||||
Заменяем на:
|
||||
```text
|
||||
deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com noble main
|
||||
```
|
||||
Где noble это кодовое имя Ubuntu 24.04
|
||||
|
||||
|
||||
4. Обновите списки пакетов:
|
||||
```sh
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
5. Установите Vault:
|
||||
```sh
|
||||
sudo apt install -y vault
|
||||
```
|
||||
|
||||
6. Проверьте, что Vault установлен правильно:
|
||||
```sh
|
||||
vault --version
|
||||
```
|
||||
Выдало: Vault v1.18.5 (2cb3755273dbd63f5b0f8ec50089b57ffd3fa330), built 2025-02-24T09:40:28Z
|
||||
|
||||
|
||||
## 2. Запуск Vault
|
||||
|
||||
### 2.1. Запуск в Dev-режиме (только для тестирования)
|
||||
|
||||
If work stop it:
|
||||
```sh
|
||||
sudo pkill vault
|
||||
```
|
||||
If need delete old data:
|
||||
```sh
|
||||
sudo rm -rf ~/.vault-token ~/.vault/
|
||||
```
|
||||
For find where stored data read file:
|
||||
```sh
|
||||
sudo mcedit /etc/vault/config.hcl
|
||||
```
|
||||
In config file find this path: /opt/vault/data
|
||||
|
||||
После удаления базы нужно инициализировать Vault заново:
|
||||
```sh
|
||||
sudo vault operator init
|
||||
```
|
||||
|
||||
Run in developer mode (in dev mode data stored in RAM):
|
||||
```sh
|
||||
vault server -dev
|
||||
```
|
||||
|
||||
```text
|
||||
WARNING! dev mode is enabled! In this mode, Vault runs entirely in-memory
|
||||
and starts unsealed with a single unseal key. The root token is already
|
||||
authenticated to the CLI, so you can immediately begin using Vault.
|
||||
|
||||
You may need to set the following environment variables:
|
||||
|
||||
$ export VAULT_ADDR='http://127.0.0.1:8200'
|
||||
|
||||
The unseal key and root token are displayed below in case you want to
|
||||
seal/unseal the Vault or re-authenticate.
|
||||
|
||||
Unseal Key: TMb6A3QI3wJ9kaEeTYo5wEviP23lugJ3Asek2la6V4s=
|
||||
Root Token: hvs.GsWHRR7ne7gMTZhuPgZdh91w
|
||||
|
||||
Development mode should NOT be used in production installations!
|
||||
```
|
||||
|
||||
Теперь Vault работает по адресу:
|
||||
```sh
|
||||
start http://127.0.0.1:8200
|
||||
```
|
||||
Останавливаю нажатием Ctrl + C
|
||||
|
||||
|
||||
### 2.2. Настройка Vault в режиме сервера
|
||||
|
||||
1. Создайте конфигурационный файл:
|
||||
```sh
|
||||
sudo mkdir -p /etc/vault &&
|
||||
sudo mcedit /etc/vault/config.hcl
|
||||
```
|
||||
|
||||
2. Добавьте следующий конфиг:
|
||||
```text
|
||||
storage "file" {
|
||||
path = "/opt/vault/data"
|
||||
}
|
||||
|
||||
listener "tcp" {
|
||||
address = "127.0.0.1:8200"
|
||||
tls_disable = 1
|
||||
}
|
||||
|
||||
disable_mlock = true
|
||||
ui = true
|
||||
```
|
||||
|
||||
3. Создайте папку для хранения данных:
|
||||
```sh
|
||||
sudo mkdir -p /opt/vault/data &&
|
||||
sudo chown vault:vault /opt/vault/data
|
||||
```
|
||||
|
||||
4. Создайте systemd-сервис для Vault:
|
||||
```sh
|
||||
sudo tee /etc/systemd/system/vault.service > /dev/null <<EOF
|
||||
[Unit]
|
||||
Description=HashiCorp Vault
|
||||
After=network-online.target
|
||||
Requires=network-online.target
|
||||
|
||||
[Service]
|
||||
User=vault
|
||||
Group=vault
|
||||
ExecStart=/usr/bin/vault server -config=/etc/vault/config.hcl
|
||||
ExecReload=/bin/kill --signal HUP \$MAINPID
|
||||
KillSignal=SIGTERM
|
||||
Restart=on-failure
|
||||
LimitMEMLOCK=infinity
|
||||
ProtectSystem=full
|
||||
CapabilityBoundingSet=CAP_IPC_LOCK CAP_SETGID CAP_SETUID CAP_SYSLOG CAP_CHOWN
|
||||
NoNewPrivileges=yes
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
```
|
||||
Проверяем всё ли записалось:
|
||||
```sh
|
||||
sudo mcedit /etc/systemd/system/vault.service
|
||||
```
|
||||
|
||||
5. Перезапустите systemd и включите Vault:
|
||||
```sh
|
||||
sudo systemctl daemon-reload &&
|
||||
sudo systemctl enable vault &&
|
||||
sudo systemctl start vault
|
||||
```
|
||||
|
||||
7. Проверьте статус:
|
||||
```sh
|
||||
sudo systemctl status vault
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Инициализация и разлочка Vault
|
||||
|
||||
1. Экспортируйте переменную окружения:
|
||||
```sh
|
||||
export VAULT_ADDR='http://127.0.0.1:8200'
|
||||
```
|
||||
|
||||
2. Инициализируйте хранилище (сохраните ключи!):
|
||||
```sh
|
||||
vault operator init
|
||||
```
|
||||
|
||||
Выдало:
|
||||
```text
|
||||
Unseal Key 1: lQlJsb9RI8rSzLrc5iPnx1qJkWZbbXIkrEgnQGe5R6uO
|
||||
Unseal Key 2: 0qJJXRo570jlH/0Qs/wodXHNI2SF5VgL4jE04JawSPSB
|
||||
Unseal Key 3: VuYkOkQ8qmwofDmjqsTRQoMqGAH3Jv+nqQylL7Uibbtp
|
||||
Unseal Key 4: JJJ8Nqj00qzS9u5wNtTtExL/jWlJF9fgaBsiuaf0kFxC
|
||||
Unseal Key 5: L6lZMp/l7s24EZJAFnWS4Py5jsWOuMioC41g5LhUJKWL
|
||||
|
||||
Initial Root Token: hvs.o07DY7tnSPcufxk60pjCXDzn
|
||||
|
||||
Vault initialized with 5 key shares and a key threshold of 3. Please securely
|
||||
distribute the key shares printed above. When the Vault is re-sealed,
|
||||
restarted, or stopped, you must supply at least 3 of these keys to unseal it
|
||||
before it can start servicing requests.
|
||||
|
||||
Vault does not store the generated root key. Without at least 3 keys to
|
||||
reconstruct the root key, Vault will remain permanently sealed!
|
||||
|
||||
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 раза выполнить эту команду):
|
||||
```sh
|
||||
vault operator unseal
|
||||
```
|
||||
|
||||
4. Авторизуйтесь с root-токеном:
|
||||
```sh
|
||||
vault login hvs.MTFV72PjKXCVh5ZL6yCVE3Yw
|
||||
```
|
||||
|
||||
5. Создаём(включаем) новое хранилище ключ-значение через ssh
|
||||
```sh
|
||||
vault secrets enable -path=org-ccalm kv-v2
|
||||
```
|
||||
|
||||
|
||||
|
||||
5. Writing to the kv storage (добавил префикс vault. чтобы значения самому подставлять в нужные места в spring)
|
||||
|
||||
Заменит(создаст) значение:
|
||||
```sh
|
||||
vault kv put org-ccalm/jwt vault.server.ssl.key-store-password=MFNX344yh4
|
||||
```
|
||||
Добавит (обновит):
|
||||
```sh
|
||||
vault kv patch org-ccalm/jwt vault.test=test2
|
||||
```
|
||||
```sh
|
||||
vault kv put org-ccalm/public vault.personal_data.key=7dd2Nek1
|
||||
```
|
||||
|
||||
6. Read data from the kv
|
||||
```sh
|
||||
vault kv get org-ccalm/jwt
|
||||
```
|
||||
|
||||
Должно вывести:
|
||||
```text
|
||||
Key Value
|
||||
--- -----
|
||||
server.ssl.key-store-password M4yh4
|
||||
```
|
||||
|
||||
6. Включаем AppRole для доступа из приложения
|
||||
```sh
|
||||
vault auth enable approle
|
||||
```
|
||||
|
||||
7. Добавляем политики потом создаём ключ для этой политикиполитики
|
||||
|
||||
Создаю файл политик
|
||||
```sh
|
||||
cd ~ &&
|
||||
sudo tee jwt-policy.hcl > /dev/null <<EOF
|
||||
path "org-ccalm/data/jwt" {
|
||||
capabilities = ["create", "read", "update", "delete", "list"]
|
||||
}
|
||||
path "org-ccalm/data/public" {
|
||||
capabilities = ["read", "list"]
|
||||
}
|
||||
EOF
|
||||
```
|
||||
Apply and delete configiration file:
|
||||
```sh
|
||||
vault policy write jwt-policy ~/jwt-policy.hcl &&
|
||||
rm -f jwt-policy.hcl
|
||||
```
|
||||
|
||||
Создаём AppRole (на 10 лет)
|
||||
```sh
|
||||
vault write auth/approle/role/org-ccalm-jwt \
|
||||
secret_id_ttl=0 \
|
||||
token_ttl=87600h \
|
||||
token_max_ttl=87600h \
|
||||
policies="jwt-policy,another-policy,third-policy"
|
||||
```
|
||||
|
||||
Получаем role_id и secret_id
|
||||
```sh
|
||||
vault read auth/approle/role/org-ccalm-jwt/role-id
|
||||
```
|
||||
Выдало
|
||||
```text
|
||||
Key Value
|
||||
--- -----
|
||||
role_id c0064fe2-8f0e-b317-7fe7-66f7405b45a1
|
||||
```
|
||||
На команду
|
||||
```sh
|
||||
vault write -f auth/approle/role/org-ccalm-jwt/secret-id
|
||||
```
|
||||
Выдало:
|
||||
```text
|
||||
Key Value
|
||||
--- -----
|
||||
secret_id 24f31c88-7185-0d93-9a51-e221c2925265
|
||||
secret_id_accessor 22fa68e3-fc73-2008-0a34-3506630b6693
|
||||
secret_id_num_uses 0
|
||||
secret_id_ttl 0s
|
||||
```
|
||||
Сохрани role_id и secret_id, они понадобятся Spring Boot.
|
||||
|
||||
Хранить ключи лучьше в переменных окружения
|
||||
```sh
|
||||
export VAULT_ROLE_ID="your-role-id" &&
|
||||
export VAULT_SECRET_ID="your-secret-id"
|
||||
```
|
||||
|
||||
|
||||
Проверяем не больше какого значения можно задать время жизни кокена:
|
||||
```sh
|
||||
vault read sys/mounts/auth/token/tune
|
||||
```
|
||||
По умолчанию max_lease_ttl равен 32 дня!
|
||||
|
||||
На год можно увеличить так:
|
||||
```sh
|
||||
vault write sys/mounts/auth/token/tune max_lease_ttl=8760h
|
||||
```
|
||||
|
||||
Create data access token with set politics:
|
||||
```sh
|
||||
vault token create -policy=jwt-policy -ttl=0
|
||||
```
|
||||
|
||||
Продлевать токен можно так:
|
||||
```sh
|
||||
vault token renew <твой-токен>
|
||||
```
|
||||
|
||||
Проверяем зранятся ли токены в хранилище а не в памяти
|
||||
```sh
|
||||
vault read sys/auth/token/tune
|
||||
```
|
||||
token_type = default-service, значит Vault не хранит токены
|
||||
|
||||
Включаем хранение токенов:
|
||||
```sh
|
||||
vault write sys/auth/token/tune token_type=service
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
Теперь HashiCorp Vault установлен и готов к использованию! 🚀
|
||||
|
||||
# Установка HashiCorp Vault на Ubuntu
|
||||
|
||||
Vault — это инструмент от HashiCorp для безопасного хранения секретов и управления ими.
|
||||
|
||||
## 1. Установка Vault
|
||||
|
||||
Открываю нужный сервер
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
Похоже vault из Москвы недоступен:
|
||||
```sh
|
||||
ssh root@45.144.64.218 -p 2200
|
||||
```
|
||||
|
||||
### 1.1. Добавление репозитория HashiCorp
|
||||
|
||||
1. Установите необходимые пакеты:
|
||||
```sh
|
||||
sudo apt update && sudo apt install -y gnupg software-properties-common curl
|
||||
```
|
||||
|
||||
2. Добавьте официальный GPG-ключ HashiCorp:
|
||||
```sh
|
||||
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
|
||||
```
|
||||
|
||||
3. Добавьте репозиторий HashiCorp в систему:
|
||||
```sh
|
||||
sudo mcedit /etc/apt/sources.list.d/hashicorp.list
|
||||
```
|
||||
|
||||
Заменяем на:
|
||||
```text
|
||||
deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com noble main
|
||||
```
|
||||
Где noble это кодовое имя Ubuntu 24.04
|
||||
|
||||
|
||||
4. Обновите списки пакетов:
|
||||
```sh
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
5. Установите Vault:
|
||||
```sh
|
||||
sudo apt install -y vault
|
||||
```
|
||||
|
||||
6. Проверьте, что Vault установлен правильно:
|
||||
```sh
|
||||
vault --version
|
||||
```
|
||||
Выдало: Vault v1.18.5 (2cb3755273dbd63f5b0f8ec50089b57ffd3fa330), built 2025-02-24T09:40:28Z
|
||||
|
||||
|
||||
## 2. Запуск Vault
|
||||
|
||||
### 2.1. Запуск в Dev-режиме (только для тестирования)
|
||||
|
||||
If work stop it:
|
||||
```sh
|
||||
sudo pkill vault
|
||||
```
|
||||
If need delete old data:
|
||||
```sh
|
||||
sudo rm -rf ~/.vault-token ~/.vault/
|
||||
```
|
||||
For find where stored data read file:
|
||||
```sh
|
||||
sudo mcedit /etc/vault/config.hcl
|
||||
```
|
||||
In config file find this path: /opt/vault/data
|
||||
|
||||
После удаления базы нужно инициализировать Vault заново:
|
||||
```sh
|
||||
sudo vault operator init
|
||||
```
|
||||
|
||||
Run in developer mode (in dev mode data stored in RAM):
|
||||
```sh
|
||||
vault server -dev
|
||||
```
|
||||
|
||||
```text
|
||||
WARNING! dev mode is enabled! In this mode, Vault runs entirely in-memory
|
||||
and starts unsealed with a single unseal key. The root token is already
|
||||
authenticated to the CLI, so you can immediately begin using Vault.
|
||||
|
||||
You may need to set the following environment variables:
|
||||
|
||||
$ export VAULT_ADDR='http://127.0.0.1:8200'
|
||||
|
||||
The unseal key and root token are displayed below in case you want to
|
||||
seal/unseal the Vault or re-authenticate.
|
||||
|
||||
Unseal Key: TMb6A3QI3wJ9kaEeTYo5wEviP23lugJ3Asek2la6V4s=
|
||||
Root Token: hvs.GsWHRR7ne7gMTZhuPgZdh91w
|
||||
|
||||
Development mode should NOT be used in production installations!
|
||||
```
|
||||
|
||||
Теперь Vault работает по адресу:
|
||||
```sh
|
||||
start http://127.0.0.1:8200
|
||||
```
|
||||
Останавливаю нажатием Ctrl + C
|
||||
|
||||
|
||||
### 2.2. Настройка Vault в режиме сервера
|
||||
|
||||
1. Создайте конфигурационный файл:
|
||||
```sh
|
||||
sudo mkdir -p /etc/vault &&
|
||||
sudo mcedit /etc/vault/config.hcl
|
||||
```
|
||||
|
||||
2. Добавьте следующий конфиг:
|
||||
```text
|
||||
storage "file" {
|
||||
path = "/opt/vault/data"
|
||||
}
|
||||
|
||||
listener "tcp" {
|
||||
address = "127.0.0.1:8200"
|
||||
tls_disable = 1
|
||||
}
|
||||
|
||||
disable_mlock = true
|
||||
ui = true
|
||||
```
|
||||
|
||||
3. Создайте папку для хранения данных:
|
||||
```sh
|
||||
sudo mkdir -p /opt/vault/data &&
|
||||
sudo chown vault:vault /opt/vault/data
|
||||
```
|
||||
|
||||
4. Создайте systemd-сервис для Vault:
|
||||
```sh
|
||||
sudo tee /etc/systemd/system/vault.service > /dev/null <<'EOF'
|
||||
[Unit]
|
||||
Description=HashiCorp Vault
|
||||
After=network-online.target
|
||||
Requires=network-online.target
|
||||
|
||||
[Service]
|
||||
User=vault
|
||||
Group=vault
|
||||
ExecStart=/usr/bin/vault server -config=/etc/vault/config.hcl
|
||||
ExecReload=/bin/kill --signal HUP \$MAINPID
|
||||
KillSignal=SIGTERM
|
||||
Restart=on-failure
|
||||
LimitMEMLOCK=infinity
|
||||
ProtectSystem=full
|
||||
CapabilityBoundingSet=CAP_IPC_LOCK CAP_SETGID CAP_SETUID CAP_SYSLOG CAP_CHOWN
|
||||
NoNewPrivileges=yes
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
```
|
||||
Проверяем всё ли записалось:
|
||||
```sh
|
||||
sudo mcedit /etc/systemd/system/vault.service
|
||||
```
|
||||
|
||||
5. Перезапустите systemd и включите Vault:
|
||||
```sh
|
||||
sudo systemctl daemon-reload &&
|
||||
sudo systemctl enable vault &&
|
||||
sudo systemctl start vault
|
||||
```
|
||||
|
||||
7. Проверьте статус:
|
||||
```sh
|
||||
sudo systemctl status vault
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Инициализация и разлочка Vault
|
||||
|
||||
1. Экспортируйте переменную окружения:
|
||||
```sh
|
||||
export VAULT_ADDR='http://127.0.0.1:8200'
|
||||
```
|
||||
|
||||
2. Инициализируйте хранилище (сохраните ключи!):
|
||||
```sh
|
||||
vault operator init
|
||||
```
|
||||
|
||||
Выдало:
|
||||
```text
|
||||
Unseal Key 1: lQlJsb9RI8rSzLrc5iPnx1qJkWZbbXIkrEgnQGe5R6uO
|
||||
Unseal Key 2: 0qJJXRo570jlH/0Qs/wodXHNI2SF5VgL4jE04JawSPSB
|
||||
Unseal Key 3: VuYkOkQ8qmwofDmjqsTRQoMqGAH3Jv+nqQylL7Uibbtp
|
||||
Unseal Key 4: JJJ8Nqj00qzS9u5wNtTtExL/jWlJF9fgaBsiuaf0kFxC
|
||||
Unseal Key 5: L6lZMp/l7s24EZJAFnWS4Py5jsWOuMioC41g5LhUJKWL
|
||||
|
||||
Initial Root Token: hvs.o07DY7tnSPcufxk60pjCXDzn
|
||||
|
||||
Vault initialized with 5 key shares and a key threshold of 3. Please securely
|
||||
distribute the key shares printed above. When the Vault is re-sealed,
|
||||
restarted, or stopped, you must supply at least 3 of these keys to unseal it
|
||||
before it can start servicing requests.
|
||||
|
||||
Vault does not store the generated root key. Without at least 3 keys to
|
||||
reconstruct the root key, Vault will remain permanently sealed!
|
||||
|
||||
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 раза выполнить эту команду):
|
||||
```sh
|
||||
vault operator unseal
|
||||
```
|
||||
|
||||
4. Авторизуйтесь с root-токеном:
|
||||
```sh
|
||||
vault login hvs.MTFV72PjKXCVh5ZL6yCVE3Yw
|
||||
```
|
||||
|
||||
5. Создаём(включаем) новое хранилище ключ-значение через ssh
|
||||
```sh
|
||||
vault secrets enable -path=org-ccalm kv-v2
|
||||
```
|
||||
|
||||
|
||||
|
||||
5. Writing to the kv storage (добавил префикс vault. чтобы значения самому подставлять в нужные места в spring)
|
||||
|
||||
Заменит(создаст) значение:
|
||||
```sh
|
||||
vault kv put org-ccalm/jwt vault.server.ssl.key-store-password=MFNX344yh4
|
||||
```
|
||||
Добавит (обновит):
|
||||
```sh
|
||||
vault kv patch org-ccalm/jwt vault.test=test2
|
||||
```
|
||||
```sh
|
||||
vault kv put org-ccalm/public vault.personal_data.key=7dd2Nek1
|
||||
```
|
||||
|
||||
6. Read data from the kv
|
||||
```sh
|
||||
vault kv get org-ccalm/jwt
|
||||
```
|
||||
|
||||
Должно вывести:
|
||||
```text
|
||||
Key Value
|
||||
--- -----
|
||||
server.ssl.key-store-password M4yh4
|
||||
```
|
||||
|
||||
6. Включаем AppRole для доступа из приложения
|
||||
```sh
|
||||
vault auth enable approle
|
||||
```
|
||||
|
||||
7. Добавляем политики потом создаём ключ для этой политикиполитики
|
||||
|
||||
Создаю файл политик
|
||||
```sh
|
||||
cd ~ &&
|
||||
sudo tee jwt-policy.hcl > /dev/null <<'EOF'
|
||||
path "org-ccalm/data/jwt" {
|
||||
capabilities = ["create", "read", "update", "delete", "list"]
|
||||
}
|
||||
path "org-ccalm/data/public" {
|
||||
capabilities = ["read", "list"]
|
||||
}
|
||||
EOF
|
||||
```
|
||||
Apply and delete configiration file:
|
||||
```sh
|
||||
vault policy write jwt-policy ~/jwt-policy.hcl &&
|
||||
rm -f jwt-policy.hcl
|
||||
```
|
||||
|
||||
Создаём AppRole (на 10 лет)
|
||||
```sh
|
||||
vault write auth/approle/role/org-ccalm-jwt \
|
||||
secret_id_ttl=0 \
|
||||
token_ttl=87600h \
|
||||
token_max_ttl=87600h \
|
||||
policies="jwt-policy,another-policy,third-policy"
|
||||
```
|
||||
|
||||
Получаем role_id и secret_id
|
||||
```sh
|
||||
vault read auth/approle/role/org-ccalm-jwt/role-id
|
||||
```
|
||||
Выдало
|
||||
```text
|
||||
Key Value
|
||||
--- -----
|
||||
role_id c0064fe2-8f0e-b317-7fe7-66f7405b45a1
|
||||
```
|
||||
На команду
|
||||
```sh
|
||||
vault write -f auth/approle/role/org-ccalm-jwt/secret-id
|
||||
```
|
||||
Выдало:
|
||||
```text
|
||||
Key Value
|
||||
--- -----
|
||||
secret_id 24f31c88-7185-0d93-9a51-e221c2925265
|
||||
secret_id_accessor 22fa68e3-fc73-2008-0a34-3506630b6693
|
||||
secret_id_num_uses 0
|
||||
secret_id_ttl 0s
|
||||
```
|
||||
Сохрани role_id и secret_id, они понадобятся Spring Boot.
|
||||
|
||||
Хранить ключи лучьше в переменных окружения
|
||||
```sh
|
||||
export VAULT_ROLE_ID="your-role-id" &&
|
||||
export VAULT_SECRET_ID="your-secret-id"
|
||||
```
|
||||
|
||||
|
||||
Проверяем не больше какого значения можно задать время жизни кокена:
|
||||
```sh
|
||||
vault read sys/mounts/auth/token/tune
|
||||
```
|
||||
По умолчанию max_lease_ttl равен 32 дня!
|
||||
|
||||
На год можно увеличить так:
|
||||
```sh
|
||||
vault write sys/mounts/auth/token/tune max_lease_ttl=8760h
|
||||
```
|
||||
|
||||
Create data access token with set politics:
|
||||
```sh
|
||||
vault token create -policy=jwt-policy -ttl=0
|
||||
```
|
||||
|
||||
Продлевать токен можно так:
|
||||
```sh
|
||||
vault token renew <твой-токен>
|
||||
```
|
||||
|
||||
Проверяем зранятся ли токены в хранилище а не в памяти
|
||||
```sh
|
||||
vault read sys/auth/token/tune
|
||||
```
|
||||
token_type = default-service, значит Vault не хранит токены
|
||||
|
||||
Включаем хранение токенов:
|
||||
```sh
|
||||
vault write sys/auth/token/tune token_type=service
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
Теперь HashiCorp Vault установлен и готов к использованию! 🚀
|
||||
|
||||
|
||||
@ -1,136 +1,136 @@
|
||||
|
||||
Загрузить в HashiCorp Vault настройки можно так:
|
||||
|
||||
```sh
|
||||
vault kv put secret/org-ccalm-jwt \
|
||||
jwt.secret=my-secret-value \
|
||||
db.user=admin \
|
||||
db.pass=123456
|
||||
```
|
||||
|
||||
Разбор параметров:
|
||||
1. vault kv put – команда для записи ключей и значений в KV-хранилище Vault.
|
||||
2. secret/org-ccalm-jwt – путь к секрету.
|
||||
* secret/ – это backend-хранилище (оно должно быть включено в Vault).
|
||||
* org-ccalm-jwt – имя секрета, под которым сохраняются параметры.
|
||||
3. jwt.secret=my-secret-value – ключ jwt.secret со значением my-secret-value.
|
||||
4. db.user=admin – ключ db.user со значением admin.
|
||||
5. db.pass=123456 – ключ db.pass со значением 123456.
|
||||
|
||||
|
||||
# 🚀 Установка и настройка HashiCorp Vault на Windows
|
||||
|
||||
## 📌 1. Установка HashiCorp Vault
|
||||
|
||||
1. **Скачайте Vault CLI** с официального сайта:
|
||||
🔗 [https://developer.hashicorp.com/vault/downloads](https://developer.hashicorp.com/vault/downloads)
|
||||
2. Распакуйте архив и **добавьте путь к `vault.exe` в `PATH`**:
|
||||
- Кликните **ПКМ → Этот компьютер → Свойства → Дополнительные параметры системы**.
|
||||
- В **Переменные среды** добавьте путь к папке с `vault.exe`.
|
||||
3. Откройте **cmd** или **PowerShell** и проверьте установку командой:
|
||||
```sh
|
||||
vault --version
|
||||
```
|
||||
Если всё ОК, увидите версию Vault. Примерно такую: Vault v1.18.4 (503be623a3697e8c10c254dc87d26492c46753e1), built 2025-01-29T13:57:54Z
|
||||
|
||||
---
|
||||
|
||||
## 📌 2. Запуск Vault-сервера (разработческий режим)
|
||||
|
||||
Чтобы локально запустить Vault в **dev-режиме** (без авторизации), выполните:
|
||||
```sh
|
||||
vault server -dev
|
||||
```
|
||||
После запуска он покажет **root-токен** (сохраните его!):
|
||||
```plaintext
|
||||
Unseal Key: x1jUXpLJREI6M1+Qm6m/h3NLEhaEmBageqw0v+dSSKo=
|
||||
Root Token: hvs.V7Rc8uJ8YJ0AASKZfep6oYNe
|
||||
```
|
||||
|
||||
Теперь Vault работает по адресу:
|
||||
```sh
|
||||
start http://127.0.0.1:8200
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📌 3. Экспорт токена (чтобы не вводить каждый раз)
|
||||
|
||||
Откройте **PowerShell** и выполните:
|
||||
```sh
|
||||
$env:VAULT_ADDR="http://127.0.0.1:8200"
|
||||
$env:VAULT_TOKEN="hvs.JDIyKgDMagA0WyIhLFQ4mAjZ"
|
||||
```
|
||||
(Замените `hvs.JDIyKgDMagA0WyIhLFQ4mAjZ` на свой токен.)
|
||||
|
||||
Теперь можно работать с Vault без ввода токена каждый раз.
|
||||
|
||||
---
|
||||
|
||||
## 📌 4. Запись значений в Vault на Windows
|
||||
|
||||
Значения разделенные пробелами можно записать в вольт так:
|
||||
```sh
|
||||
vault kv put secret/kz-istransit-jwt server.ssl.key-store-password=MFNX344yh4
|
||||
```
|
||||
Выдаст примерно такое:
|
||||
======== Secret Path ========
|
||||
secret/data/kz-istransit-jwt
|
||||
|
||||
======= Metadata =======
|
||||
Key Value
|
||||
--- -----
|
||||
created_time 2025-02-24T12:49:45.7630328Z
|
||||
custom_metadata <nil>
|
||||
deletion_time n/a
|
||||
destroyed false
|
||||
version 1
|
||||
|
||||
---
|
||||
|
||||
## 📌 5. Проверка сохранённых данных
|
||||
|
||||
Чтобы посмотреть, что записано в Vault:
|
||||
```sh
|
||||
vault kv get secret/kz-istransit-jwt
|
||||
```
|
||||
Если всё настроено правильно, вы увидите примерно такой вывод:
|
||||
```plaintext
|
||||
====== Metadata ======
|
||||
Key Value
|
||||
--- -----
|
||||
created_time 2025-02-24T12:00:00Z
|
||||
version 1
|
||||
|
||||
====== Data ======
|
||||
Key Value
|
||||
--- -----
|
||||
db.pass 123456
|
||||
db.user admin
|
||||
jwt.secret my-secret-value
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📌 6. Удаление данных из Vault
|
||||
|
||||
Удаление данных:
|
||||
```sh
|
||||
vault kv delete secret/org-ccalm-jwt
|
||||
```
|
||||
Полное уничтожение (без возможности восстановления):
|
||||
```sh
|
||||
vault kv destroy -versions=1 secret/org-ccalm-jwt
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Итог
|
||||
✅ Установили Vault CLI
|
||||
✅ Запустили Vault сервер (`vault server -dev`)
|
||||
✅ Экспортировали `VAULT_ADDR` и `VAULT_TOKEN`
|
||||
✅ Записали настройки в Vault
|
||||
✅ Проверили данные
|
||||
|
||||
Теперь можно интегрировать Vault в Spring Boot 🚀
|
||||
|
||||
|
||||
Загрузить в HashiCorp Vault настройки можно так:
|
||||
|
||||
```sh
|
||||
vault kv put secret/org-ccalm-jwt \
|
||||
jwt.secret=my-secret-value \
|
||||
db.user=admin \
|
||||
db.pass=123456
|
||||
```
|
||||
|
||||
Разбор параметров:
|
||||
1. vault kv put – команда для записи ключей и значений в KV-хранилище Vault.
|
||||
2. secret/org-ccalm-jwt – путь к секрету.
|
||||
* secret/ – это backend-хранилище (оно должно быть включено в Vault).
|
||||
* org-ccalm-jwt – имя секрета, под которым сохраняются параметры.
|
||||
3. jwt.secret=my-secret-value – ключ jwt.secret со значением my-secret-value.
|
||||
4. db.user=admin – ключ db.user со значением admin.
|
||||
5. db.pass=123456 – ключ db.pass со значением 123456.
|
||||
|
||||
|
||||
# 🚀 Установка и настройка HashiCorp Vault на Windows
|
||||
|
||||
## 📌 1. Установка HashiCorp Vault
|
||||
|
||||
1. **Скачайте Vault CLI** с официального сайта:
|
||||
🔗 [https://developer.hashicorp.com/vault/downloads](https://developer.hashicorp.com/vault/downloads)
|
||||
2. Распакуйте архив и **добавьте путь к `vault.exe` в `PATH`**:
|
||||
- Кликните **ПКМ → Этот компьютер → Свойства → Дополнительные параметры системы**.
|
||||
- В **Переменные среды** добавьте путь к папке с `vault.exe`.
|
||||
3. Откройте **cmd** или **PowerShell** и проверьте установку командой:
|
||||
```sh
|
||||
vault --version
|
||||
```
|
||||
Если всё ОК, увидите версию Vault. Примерно такую: Vault v1.18.4 (503be623a3697e8c10c254dc87d26492c46753e1), built 2025-01-29T13:57:54Z
|
||||
|
||||
---
|
||||
|
||||
## 📌 2. Запуск Vault-сервера (разработческий режим)
|
||||
|
||||
Чтобы локально запустить Vault в **dev-режиме** (без авторизации), выполните:
|
||||
```sh
|
||||
vault server -dev
|
||||
```
|
||||
После запуска он покажет **root-токен** (сохраните его!):
|
||||
```plaintext
|
||||
Unseal Key: x1jUXpLJREI6M1+Qm6m/h3NLEhaEmBageqw0v+dSSKo=
|
||||
Root Token: hvs.V7Rc8uJ8YJ0AASKZfep6oYNe
|
||||
```
|
||||
|
||||
Теперь Vault работает по адресу:
|
||||
```sh
|
||||
start http://127.0.0.1:8200
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📌 3. Экспорт токена (чтобы не вводить каждый раз)
|
||||
|
||||
Откройте **PowerShell** и выполните:
|
||||
```sh
|
||||
$env:VAULT_ADDR="http://127.0.0.1:8200"
|
||||
$env:VAULT_TOKEN="hvs.JDIyKgDMagA0WyIhLFQ4mAjZ"
|
||||
```
|
||||
(Замените `hvs.JDIyKgDMagA0WyIhLFQ4mAjZ` на свой токен.)
|
||||
|
||||
Теперь можно работать с Vault без ввода токена каждый раз.
|
||||
|
||||
---
|
||||
|
||||
## 📌 4. Запись значений в Vault на Windows
|
||||
|
||||
Значения разделенные пробелами можно записать в вольт так:
|
||||
```sh
|
||||
vault kv put secret/kz-istransit-jwt server.ssl.key-store-password=MFNX344yh4
|
||||
```
|
||||
Выдаст примерно такое:
|
||||
======== Secret Path ========
|
||||
secret/data/kz-istransit-jwt
|
||||
|
||||
======= Metadata =======
|
||||
Key Value
|
||||
--- -----
|
||||
created_time 2025-02-24T12:49:45.7630328Z
|
||||
custom_metadata <nil>
|
||||
deletion_time n/a
|
||||
destroyed false
|
||||
version 1
|
||||
|
||||
---
|
||||
|
||||
## 📌 5. Проверка сохранённых данных
|
||||
|
||||
Чтобы посмотреть, что записано в Vault:
|
||||
```sh
|
||||
vault kv get secret/kz-istransit-jwt
|
||||
```
|
||||
Если всё настроено правильно, вы увидите примерно такой вывод:
|
||||
```plaintext
|
||||
====== Metadata ======
|
||||
Key Value
|
||||
--- -----
|
||||
created_time 2025-02-24T12:00:00Z
|
||||
version 1
|
||||
|
||||
====== Data ======
|
||||
Key Value
|
||||
--- -----
|
||||
db.pass 123456
|
||||
db.user admin
|
||||
jwt.secret my-secret-value
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📌 6. Удаление данных из Vault
|
||||
|
||||
Удаление данных:
|
||||
```sh
|
||||
vault kv delete secret/org-ccalm-jwt
|
||||
```
|
||||
Полное уничтожение (без возможности восстановления):
|
||||
```sh
|
||||
vault kv destroy -versions=1 secret/org-ccalm-jwt
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Итог
|
||||
✅ Установили Vault CLI
|
||||
✅ Запустили Vault сервер (`vault server -dev`)
|
||||
✅ Экспортировали `VAULT_ADDR` и `VAULT_TOKEN`
|
||||
✅ Записали настройки в Vault
|
||||
✅ Проверили данные
|
||||
|
||||
Теперь можно интегрировать Vault в Spring Boot 🚀
|
||||
|
||||
|
||||
@ -1,87 +1,87 @@
|
||||
Install by docs from https://www.cherryservers.com/blog/install-jenkins-ubuntu
|
||||
|
||||
## Prepare installation
|
||||
|
||||
Открываю нужный сервер
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
```sh
|
||||
sudo apt update
|
||||
```
|
||||
```sh
|
||||
sudo apt upgrade
|
||||
```
|
||||
```sh
|
||||
sudo apt install openjdk-21-jdk openjdk-21-jre -y &&
|
||||
java -version
|
||||
```
|
||||
## Add Jenkins Repository
|
||||
|
||||
```sh
|
||||
sudo wget -O /usr/share/keyrings/jenkins-keyring.asc https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
|
||||
```
|
||||
Next, add the Jenkins repository to your system’s sources.list:
|
||||
```sh
|
||||
sudo sh -c 'echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo apt install jenkins -y
|
||||
```
|
||||
If the software was installed incorrectly, you can reinstall it after uninstalling it first.:
|
||||
```sh
|
||||
sudo apt remove --purge jenkins
|
||||
```
|
||||
|
||||
```sh
|
||||
jenkins --version
|
||||
```
|
||||
|
||||
Try run jenkins without service
|
||||
```sh
|
||||
sudo -u jenkins /usr/bin/jenkins --httpPort=8081 --httpListenAddress=0.0.0.0
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo mcedit /lib/systemd/system/jenkins.service
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl start jenkins &&
|
||||
sudo systemctl enable jenkins &&
|
||||
sudo systemctl status jenkins
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo journalctl -xeu jenkins.service | tail -n 50
|
||||
```
|
||||
Если порт занят, проверяем кем:
|
||||
```sh
|
||||
sudo lsof -i :8081
|
||||
```
|
||||
Переопределяем порт:
|
||||
```sh
|
||||
sudo mcedit /etc/default/jenkins
|
||||
```
|
||||
```conf
|
||||
HTTP_PORT=8081
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl restart jenkins
|
||||
```
|
||||
|
||||
```sh
|
||||
start http://127.0.0.1:8081
|
||||
```
|
||||
|
||||
|
||||
See what port in locked
|
||||
```sh
|
||||
netstat -tpln
|
||||
Install by docs from https://www.cherryservers.com/blog/install-jenkins-ubuntu
|
||||
|
||||
## Prepare installation
|
||||
|
||||
Открываю нужный сервер
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
```sh
|
||||
sudo apt update
|
||||
```
|
||||
```sh
|
||||
sudo apt upgrade
|
||||
```
|
||||
```sh
|
||||
sudo apt install openjdk-21-jdk openjdk-21-jre -y &&
|
||||
java -version
|
||||
```
|
||||
## Add Jenkins Repository
|
||||
|
||||
```sh
|
||||
sudo wget -O /usr/share/keyrings/jenkins-keyring.asc https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
|
||||
```
|
||||
Next, add the Jenkins repository to your system’s sources.list:
|
||||
```sh
|
||||
sudo sh -c 'echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo apt install jenkins -y
|
||||
```
|
||||
If the software was installed incorrectly, you can reinstall it after uninstalling it first.:
|
||||
```sh
|
||||
sudo apt remove --purge jenkins
|
||||
```
|
||||
|
||||
```sh
|
||||
jenkins --version
|
||||
```
|
||||
|
||||
Try run jenkins without service
|
||||
```sh
|
||||
sudo -u jenkins /usr/bin/jenkins --httpPort=8081 --httpListenAddress=0.0.0.0
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo mcedit /lib/systemd/system/jenkins.service
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl start jenkins &&
|
||||
sudo systemctl enable jenkins &&
|
||||
sudo systemctl status jenkins
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo journalctl -xeu jenkins.service | tail -n 50
|
||||
```
|
||||
Если порт занят, проверяем кем:
|
||||
```sh
|
||||
sudo lsof -i :8081
|
||||
```
|
||||
Переопределяем порт:
|
||||
```sh
|
||||
sudo mcedit /etc/default/jenkins
|
||||
```
|
||||
```conf
|
||||
HTTP_PORT=8081
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl restart jenkins
|
||||
```
|
||||
|
||||
```sh
|
||||
start http://127.0.0.1:8081
|
||||
```
|
||||
|
||||
|
||||
See what port in locked
|
||||
```sh
|
||||
netstat -tpln
|
||||
```
|
||||
412
POSTFIX_DOVECOT_install.md
Normal file
412
POSTFIX_DOVECOT_install.md
Normal file
@ -0,0 +1,412 @@
|
||||
Подключаемся к нужному серверу:
|
||||
```sh
|
||||
ssh root@bigfoottrade.kz -p 2222
|
||||
```
|
||||
|
||||
Настройка почты на POSTFIX(агент передачи почты) И DOVECOT на основе https://www.alex-math.ru/administrirovaniye/ustanovka-postfix-dovecot-posfixadmin-na-ubuntu-20-04/ и https://www.youtube.com/watch?v=_pbH7GsVTrw&t=649s и https://www.youtube.com/watch?v=VptKRBVeCMo
|
||||
****************************************************************************************************
|
||||
## Устанавливаю Postfixadmin
|
||||
Для начала создаю базу в PostgreSQL с базой mail и пользователем mailreader и паролем major!reader1
|
||||
```sh
|
||||
cd /var/www/html &&
|
||||
sudo wget https://yer.dl.sourceforge.net/project/postfixadmin/postfixadmin-3.3.8/PostfixAdmin%203.3.8.tar.gz &&
|
||||
sudo tar xzvf "PostfixAdmin 3.3.8.tar.gz"
|
||||
```
|
||||
Создаю временный каталог в /var/www/html/PostfixAdmin/templates_c
|
||||
правлю способ подключения к базе:
|
||||
```sh
|
||||
sudo mcedit /srv/http/PostfixAdmin/config.inc.php
|
||||
```
|
||||
На это:
|
||||
```conf
|
||||
$CONF['configured'] = true;
|
||||
|
||||
$CONF['database_type'] = 'pgsql';
|
||||
$CONF['database_host'] = 'localhost';
|
||||
$CONF['database_user'] = 'mailreader';
|
||||
$CONF['database_password'] = 'major!reader1';
|
||||
$CONF['database_name'] = 'mail';
|
||||
|
||||
$CONF['emailcheck_resolve_domain'] = 'NO';
|
||||
```
|
||||
Также нужно поднастроить апачи добавив следующтй код в: sudo mcedit /etc/apache2/apache2.conf ниже того что указывает на <Directory /var/www/>
|
||||
Alias /PostfixAdmin/ "/var/www/html/PostfixAdmin/public/"
|
||||
<Directory "/var/www/html/PostfixAdmin/public/">
|
||||
Options FollowSymLinks
|
||||
AllowOverride None
|
||||
Allow from all
|
||||
Order allow,deny
|
||||
</Directory>
|
||||
Перезагружаю:
|
||||
```sh
|
||||
systemctl restart apache2.service
|
||||
```
|
||||
На последок:
|
||||
```sh
|
||||
sudo chown www-data:www-data -R /var/www/ &&
|
||||
sudo chown www-data:www-data -R /opt/app_api_mobile_v2/mobile_v2
|
||||
```
|
||||
Теперь можно открывать сайт по IP:
|
||||
```sh
|
||||
start http://77.240.38.108/PostfixAdmin/setup.php
|
||||
```
|
||||
```sh
|
||||
start https://77.240.38.108/PostfixAdmin/login.php
|
||||
```
|
||||
|
||||
Просит задать пароль, задал такой: 11qazxsw22
|
||||
Результат генерации: $CONF['setup_password'] = '$2y$10$ySo40K0pOn0Q5jLcBoK1yua5JaGXI.NIzTmUVBn1dreTaP2RkZ2My';
|
||||
И добавляем эту стору в: sudo mcedit /srv/http/PostfixAdmin/config.inc.php
|
||||
Потом обновляем страницу.
|
||||
Добавляем администратора введя пароль 11qazxsw22 емайл в качестве логина irigm@mail.ru и пароль: 33edcvfr44
|
||||
Можно взглянуть базу там должны создаться таблицы
|
||||
|
||||
Теперь осталось пойти на Postfixadmin, завести сначала почтовый домен, потом ящик и протестировать нашу почтовую систему, например, с помощью Thunderbird. Отправляем письма себе, другому пользователю в нашей системе. Потом пробуем послать себе письма с Gmail, Yandex, Mail.ru и наблюдаем за поведением системы, изучая логи. Основная настройка почты завершена. Теперь необходимо настроить DKIM, SPF, чтобы другие почтовые системы воспринимали нас как доверенных отправителей. Но об этом я расскажу в другом посте.
|
||||
|
||||
******************************************************************************************
|
||||
## Устанавливаю Postfix популярный почтовый агент (MTA) с открытым исходным кодом, который можно использовать для маршрутизации и доставки почты в системе Linux.
|
||||
```sh
|
||||
sudo apt-get update &&
|
||||
sudo apt install postfix postfix-pgsql dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-pgsql mailutils postgresql
|
||||
```
|
||||
Ссохраняю оригинальный конфигурационный файл:
|
||||
```sh
|
||||
cp /etc/postfix/main.cf /etc/postfix/main.cf.orig
|
||||
```
|
||||
Конфигурирую:
|
||||
```sh
|
||||
sudo dpkg-reconfigure postfix
|
||||
```
|
||||
Настраиваю так:
|
||||
```conf
|
||||
General type of mail configuration?: Internet Site
|
||||
System mail name: example.com (не mail.example.com)
|
||||
Root and postmaster mail recipient: имя пользователя основной учетной записи Linux (в наших примерах sammy)
|
||||
Other destinations to accept mail for: $myhostname, example.com, mail.example.com, localhost.example.com, localhost
|
||||
Force synchronous updates on mail queue?: No
|
||||
Local networks: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
|
||||
Mailbox size limit: 0
|
||||
Local address extension character: +
|
||||
Internet protocols to use: all
|
||||
```
|
||||
Можно взглянуть на настройки так: sudo mcedit /etc/postfix/main.cf
|
||||
|
||||
Через pgAdmin создаю нового пользователя mailreader с паролем major!reader1
|
||||
CREATE DATABASE mail WITH OWNER mailreader;
|
||||
Добавляю: sudo mc edit /etc/postgresql/12/main/pg_hba.conf:
|
||||
local postfix postfix md5
|
||||
Перезагружаю базу данных:
|
||||
service postgresql reload
|
||||
|
||||
Создаём файл для обращения к базе с алиасами: sudo mcedit /etc/postfix/pgsql_virtual_alias_maps.cf https://www.alex-math.ru/administrirovaniye/ustanovka-postfix-dovecot-posfixadmin-na-ubuntu-20-04/
|
||||
```conf
|
||||
user = mailreader
|
||||
password = major!reader1
|
||||
hosts = localhost
|
||||
dbname = mail
|
||||
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
|
||||
```
|
||||
Создаём файл для получения информации по виртуальным доменам: sudo mcedit /etc/postfix/pgsql_virtual_domains_maps.cf
|
||||
```conf
|
||||
user = mailreader
|
||||
password = major!reader1
|
||||
hosts = localhost
|
||||
dbname = mail
|
||||
query = SELECT domain FROM domain WHERE domain='%u'
|
||||
```
|
||||
Создаём файл для получения информации о почтовых ящиках: sudo mcedit /etc/postfix/pgsql_virtual_mailbox_maps.cf
|
||||
```conf
|
||||
user = mailreader
|
||||
password = major!reader1
|
||||
hosts = localhost
|
||||
dbname = mail
|
||||
query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'
|
||||
```
|
||||
Прописываем ранее созданные файлы в: sudo mcedit /etc/postfix/main.cf добавив строчки:
|
||||
```conf
|
||||
virtual_mailbox_base = /home/mail
|
||||
virtual_alias_maps = proxy:pgsql:/etc/postfix/pgsql_virtual_alias_maps.cf
|
||||
virtual_mailbox_domains = proxy:pgsql:/etc/postfix/pgsql_virtual_domains_maps.cf
|
||||
virtual_mailbox_maps = proxy:pgsql:/etc/postfix/pgsql_virtual_mailbox_maps.cf
|
||||
virtual_minimum_uid = 1024
|
||||
virtual_uid_maps = static:1024
|
||||
virtual_gid_maps = static:1024
|
||||
virtual_transport = dovecot
|
||||
dovecot_destination_recipient_limit = 1
|
||||
```
|
||||
Настройки безопасного соединения (также просто вставил в конец файла):
|
||||
```conf
|
||||
smtpd_sasl_auth_enable = yes
|
||||
smtpd_sasl_exceptions_networks = $mynetworks
|
||||
smtpd_sasl_security_options = noanonymous
|
||||
broken_sasl_auth_clients = yes
|
||||
smtpd_sasl_type = dovecot
|
||||
smtpd_sasl_path = private/auth
|
||||
smtpd_tls_cert_file = /etc/ssl/certs/bigfoottrade_kz.crt
|
||||
smtpd_tls_key_file = /etc/ssl/private/bigfoottrade_kz.key
|
||||
|
||||
smtpd_tls_security_level = encrypt
|
||||
```
|
||||
Похоже опции что ниже устарели:
|
||||
```conf
|
||||
smtpd_use_tls = yes
|
||||
smtp_use_tls = yes
|
||||
smtp_tls_security_level = encrypt
|
||||
smtp_enforce_tls=yes
|
||||
|
||||
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
|
||||
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
|
||||
smtp_tls_protocols = !SSLv2, !SSLv3
|
||||
smtpd_tls_protocols = !SSLv2, !SSLv3
|
||||
|
||||
tls_preempt_cipherlist = yes
|
||||
smtpd_tls_mandatory_ciphers = high
|
||||
tls_high_cipherlist = ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA256:ADH-AES256-GCM-SHA384:ADH-AES256-SHA256:ECDH-RSA-AES256-GCM-SHA384:ECDH-ECDSA-AES256-GCM-SHA384:ECDH-RSA-AES256-SHA384:ECDH-ECDSA-AES256-SHA384:AES256-GCM-SHA384:AES256-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256:ADH-AES128-GCM-SHA256:ADH-AES128-SHA256:ECDH-RSA-AES128-GCM-SHA256:ECDH-ECDSA-AES128-GCM-SHA256:ECDH-RSA-AES128-SHA256:ECDH-ECDSA-AES128-SHA256:AES128-GCM-SHA256:AES128-SHA256:NULL-SHA256
|
||||
|
||||
smtpd_tls_auth_only = yes
|
||||
smtpd_helo_required = yes
|
||||
smtp_tls_security_level = may
|
||||
smtp_tls_ciphers = export
|
||||
smtp_tls_loglevel = 1
|
||||
smtp_tls_CApath = /etc/ssl/certs
|
||||
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
|
||||
```
|
||||
Снимаем комментарии со следующих строк, или дописываем их при необходимости: sudo mcedit /etc/postfix/master.cf (просто добавил в конец файла)
|
||||
```conf
|
||||
submission inet n - n - - smtpd
|
||||
-o syslog_name=postfix/submission
|
||||
-o smtpd_tls_security_level=may
|
||||
-o smtpd_sasl_auth_enable=yes
|
||||
-o smtpd_sasl_type=dovecot
|
||||
-o smtpd_sasl_path=/var/spool/postfix/private/auth
|
||||
-o smtpd_sasl_security_options=noanonymous
|
||||
-o smtpd_sasl_local_domain=$myhostname
|
||||
-o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
|
||||
-o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,defer_unauth_destination
|
||||
-o milter_macro_daemon_name=ORIGINATING
|
||||
|
||||
smtps inet n - n - - smtpd
|
||||
-o syslog_name=postfix/smtps
|
||||
-o smtpd_tls_wrappermode=yes
|
||||
-o smtpd_sasl_auth_enable=yes
|
||||
-o smtpd_client_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
|
||||
|
||||
dovecot unix - n n - - pipe
|
||||
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}
|
||||
```
|
||||
Проверяю на наличие ошибок:
|
||||
```sh
|
||||
sudo postfix check
|
||||
```
|
||||
В конфигурационном файле прописывается список дорменов которых обслуживает данный агент доставки.
|
||||
```sh
|
||||
sudo mcedit /etc/postfix/main.cf
|
||||
```
|
||||
Примерно таокое:
|
||||
mydestination = $myhostname, your_domain, localhost.com, , localhost
|
||||
|
||||
Перезапускаем:
|
||||
```sh
|
||||
sudo systemctl restart postfix
|
||||
```
|
||||
******************************************************************************************
|
||||
## Настройка dovecot the Secure IMAP server
|
||||
Теперь устанавливаю и настраиваю Dovecot:
|
||||
sudo apt install -y dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd
|
||||
Создаю пользователя и каталог
|
||||
sudo adduser --system --no-create-home --uid 1024 --group --disabled-password --disabled-login --gecos 'dovecot virtual mail user' vmail
|
||||
mkdir /home/mail
|
||||
chown vmail:vmail /home/mail
|
||||
chmod 700 /home/mail
|
||||
Смотрим что мы создали:
|
||||
groups vmail
|
||||
|
||||
Настраиваем способ хранения сообщений: sudo mcedit /etc/dovecot/conf.d/10-mail.conf
|
||||
mail_location = maildir:/home/mail/%d/%u/
|
||||
|
||||
|
||||
Настраиваем слушателя аутентификации: sudo mcedit /etc/dovecot/conf.d/10-master.conf
|
||||
service auth {
|
||||
unix_listener auth-userdb {
|
||||
mode = 0600
|
||||
user = vmail
|
||||
group = vmail
|
||||
}
|
||||
unix_listener /var/spool/postfix/private/auth {
|
||||
mode = 0666
|
||||
user = postfix
|
||||
group = postfix
|
||||
}
|
||||
}
|
||||
|
||||
Настраиваем аутентификацию в Dovecot: sudo mcedit /etc/dovecot/conf.d/10-auth.conf
|
||||
Комментируем одну строку, снимаем комментарий с другой.
|
||||
#!include auth-system.conf.ext
|
||||
!include auth-sql.conf.ext
|
||||
|
||||
Настраиваем шифрование Dovecot: sudo mcedit /etc/dovecot/conf.d/10-ssl.conf
|
||||
ssl = required
|
||||
ssl_cert = </etc/haproxy/ssl/bigfoottrade_kz.pem
|
||||
ssl_key = </etc/haproxy/ssl/bigfoottrade_kz.pem
|
||||
|
||||
|
||||
Указываем Dovecot автоматически создавать каталоги при первом подключении клиента: sudo mcedit /etc/dovecot/conf.d/15-lda.conf
|
||||
lda_mailbox_autocreate = yes
|
||||
|
||||
Теперь настройка подключения к базе данных. Открываем файл: sudo mcedit /etc/dovecot/conf.d/auth-sql.conf.ext
|
||||
|
||||
passdb {
|
||||
driver = sql
|
||||
args = /etc/dovecot/dovecot-sql.conf.ext
|
||||
}
|
||||
userdb {
|
||||
driver = sql
|
||||
args = /etc/dovecot/dovecot-sql.conf.ext
|
||||
}
|
||||
|
||||
|
||||
Создаём файл с настройками для работы с PostgreSQL: sudo mcedit /etc/dovecot/dovecot-sql.conf.ext
|
||||
driver = pgsql
|
||||
connect = host=localhost dbname=mail user=mailreader password=major!reader1
|
||||
default_pass_scheme = MD5-CRYPT
|
||||
password_query = SELECT password FROM mailbox WHERE username = '%u'
|
||||
user_query = SELECT maildir, 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u'
|
||||
user_query = SELECT CONCAT('/home/mail/',LOWER(domain),'/',LOWER(maildir)),1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u'
|
||||
|
||||
Наконец, указываем интерфейсы, на которых будет слушать наш Dovecot: sudo mcedit /etc/dovecot/dovecot.conf
|
||||
listen = *
|
||||
|
||||
Также добавить в этот файл следующую настройку:
|
||||
service stats {
|
||||
unix_listener stats-reader {
|
||||
user = vmail
|
||||
group = vmail
|
||||
mode = 0660
|
||||
}
|
||||
|
||||
unix_listener stats-writer {
|
||||
user = vmail
|
||||
group = vmail
|
||||
mode = 0660
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Настройка Dovecot завершена. Осталось сгенерировать сертификаты или получить их с помощью Let's Encrypt. Для тестовых целей сгенерируем самоподписанные сертификаты. Мы их положим в /etc/postfix:
|
||||
openssl req -new -x509 -days 730 -nodes -out /etc/postfix/public.pem -keyout /etc/postfix/private.pem -subj "/C=RU/ST=Msk/L=Msk/O=Local/OU=Mail/CN=fedor.bigfoottrade.kz"
|
||||
|
||||
Добавляем пользователю "dovecot" группу "mail":
|
||||
usermod -a -G dovecot mail
|
||||
usermod -a -G vmail mail
|
||||
|
||||
sudo systemctl enable dovecot
|
||||
sudo systemctl start dovecot
|
||||
|
||||
Теперь можно тестировать:
|
||||
Сначала необходимо убедиться в том, что почта доходит до нового ящика. Сделать это можно с помощью тестового письма:
|
||||
echo "Test mail" | mail -s "Test mail" admin@mqtt.kz
|
||||
Сообщение должно появиться в папке /home/mail/mqtt.kz/admin/new/. Если письма нет, проверьте лог Postfix:
|
||||
tail -f /var/log/mail.log
|
||||
|
||||
В настройках DNS настроил А запись на только что настроенный сервер:
|
||||
mail.mqtt.kz
|
||||
Также нужно настроить dkim чтобы почта не попадала в спам, записав открытый ключ шифрования в TXT запсь
|
||||
|
||||
|
||||
****************************************************************************************************
|
||||
## Настройка dkim для проверки что письмо действительно было отправлено с заявленного домена
|
||||
Созданно по этой инструкции:
|
||||
```sh
|
||||
start https://fornex.com/ru/help/dkim-postfix/
|
||||
```
|
||||
```sh
|
||||
sudo apt-get install opendkim opendkim-tools
|
||||
```
|
||||
mkdir -p /etc/postfix/dkim && cd /etc/postfix/dkim
|
||||
opendkim-genkey -D /etc/postfix/dkim/ -d mqtt.kz -s mail
|
||||
opendkim-genkey -D /etc/postfix/dkim/ -d geovizor.com -s mail
|
||||
|
||||
mv mail.private mail.mqtt.kz.private
|
||||
mv mail.private mail.geovizor.com.private
|
||||
|
||||
mv mail.txt mail.mqtt.kz.txt
|
||||
mv mail.txt mail.geovizor.com.txt
|
||||
|
||||
Создаём файл mcedit keytable и записываем в него ключи
|
||||
#имя_ключа домен:селектор:/путь/до/ключа
|
||||
mail._domainkey.mqtt.kz mqtt.kz:mail:/etc/postfix/dkim/mail.mqtt.kz.private
|
||||
mail._domainkey.geovizor.com geovizor.com:mail:/etc/postfix/dkim/mail.geovizor.com.private
|
||||
Создаём файл mcedit signingtable и записывает что чем подписывать
|
||||
#домен имя ключа
|
||||
*@mqtt.kz mail._domainkey.mqtt.kz
|
||||
*@geovizor.com mail._domainkey.geovizor.com
|
||||
Задаю права доступа:
|
||||
chown root:opendkim *
|
||||
chmod u=rw,g=r,o= *
|
||||
chmod g+r /etc/postfix/dkim/
|
||||
Смотрим содержимое TXT файла для записи в домен
|
||||
cat /etc/postfix/dkim/mail.mqtt.kz.txt
|
||||
cat /etc/postfix/dkim/mail.geovizor.com.txt
|
||||
И добавляю в DNS на хостинг:
|
||||
Name: mail._domainkey.mqtt.kz
|
||||
Text: v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtrObJxHaUBVtR4XzNuFzoa449K3l1z6+Mi4e83rFbBYmBZRYjiJn5h2PeiK1i2IpSaEKn32AlPy5gB7Ej41Fhg6LXswwRhhfvz8vClhRbUKT4I8oPBj9WZr7+4aohG1Vcks1q9cgmwdcGN+6qhKq/DJ+AC1TirNrEpSvR6JAqd4G70aJazI9su0bY5cbIv0pZGezvt+2pwJw6xpb501KudTFE8FTHxB51aLkgYS257MkovSu+qlVzPjoOsZcOY7hQtF8WB/Czod0QN05Ob/N3Qc/k2E4tpvxgokLXdYl/8KBMLMX9cRfIVbv+atuo59VFKHYIGD8Kom6akORkFeIlQIDAQAB
|
||||
|
||||
Заменяем все настройки на то что ниже: sudo mcedit /etc/opendkim.conf
|
||||
AutoRestart Yes
|
||||
AutoRestartRate 10/1h
|
||||
PidFile /var/run/opendkim/opendkim.pid
|
||||
Mode sv
|
||||
Syslog yes
|
||||
SyslogSuccess yes
|
||||
LogWhy yes
|
||||
UserID opendkim:opendkim
|
||||
Socket inet:8891@localhost
|
||||
Umask 022
|
||||
Canonicalization relaxed/relaxed
|
||||
Selector default
|
||||
MinimumKeyBits 1024
|
||||
KeyFile /etc/postfix/dkim/${MAIL_DOMAIN}.private
|
||||
KeyTable /etc/postfix/dkim/keytable
|
||||
SigningTable refile:/etc/postfix/dkim/signingtable
|
||||
|
||||
|
||||
Добавляем в конец: sudo mcedit /etc/postfix/main.cf
|
||||
milter_default_action = accept
|
||||
milter_protocol = 2
|
||||
smtpd_milters = inet:localhost:8891
|
||||
non_smtpd_milters = inet:localhost:8891
|
||||
|
||||
sudo systemctl start opendkim
|
||||
sudo systemctl enable opendkim
|
||||
service opendkim restart
|
||||
service postfix restart
|
||||
|
||||
********** Настройка SPF **********
|
||||
Например, SPF-запись «example.com. TXT «v=spf1 +a +mx -all»» говорит о том, что отправлять письма от имени домена «example.com» могут сервера, указанные в A и MX-записях этого домена, а письма, отправленные от других серверов должны быть удалены (Fail).
|
||||
Содержимое TXT файла для записи в домен
|
||||
Имя домена пустое:
|
||||
Содержимое: v=spf1 +a +mx -all
|
||||
|
||||
|
||||
********** Настройка DMARC https://www.unisender.com/ru/glossary/dmarc/**********
|
||||
Содержимое TXT файла для записи в домен
|
||||
Имя домена: _dmarc
|
||||
Содержимое: v=DMARC1; p=none;
|
||||
|
||||
!!! Для тестирования сервера на прохождение спам фильтра пишем письмо на https://www.mail-tester.com/ или https://spamtest.smtp.bz !!!
|
||||
********** web интерфейс для postfix — Roundcube **********
|
||||
cd /var/www/html
|
||||
wget https://github.com/roundcube/roundcubemail/releases/download/1.6.5/roundcubemail-1.6.5-complete.tar.gz
|
||||
tar xzvf roundcubemail-1.6.5-complete.tar.gz
|
||||
chown -R www-data:www-data /var/www/html/Roundcube
|
||||
sudo apt-get install aspell aspell-en dbconfig-common fonts-glyphicons-halflings javascript-common libaspell15 libjs-bootstrap libjs-bootstrap4 libjs-codemirror libjs-jquery libjs-jquery-minicolors libjs-jquery-ui libjs-jstimezonedetect libjs-popper.js libjs-sizzle node-jquery php-auth-sasl php-mail-mime php-masterminds-html5 php-net-sieve php-net-smtp php-net-socket php-pspell php7.4-pspell
|
||||
https://bigfoottrade.kz/Roundcube/installer/
|
||||
language — ru_RU
|
||||
Предварительно создать базу:
|
||||
```sh
|
||||
start https://bigfoottrade.kz/Roundcube
|
||||
```
|
||||
|
||||
```sh
|
||||
start http://77.240.38.108/Roundcube
|
||||
```
|
||||
@ -1,71 +1,71 @@
|
||||
# Установка Portainer.io в Docker на Ubuntu 24.04
|
||||
|
||||
Пробую установить в ProxMox в контейнер созданный на основе Ubuntu, незабыть убрать галочку: Unprivileged container
|
||||
|
||||
Подключаюсь к нужной машине
|
||||
```sh
|
||||
ssh igor@192.168.200.84 -p 22
|
||||
```
|
||||
|
||||
## Шаг 1: Обновление системы и установка Docker
|
||||
Перед установкой Portainer убедитесь, что Docker установлен и запущен.
|
||||
|
||||
```bash
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
sudo apt-get install python3-venv python3-pip
|
||||
sudo apt install docker.io -y
|
||||
sudo systemctl enable --now docker
|
||||
sudo systemctl start docker
|
||||
sudo systemctl status docker
|
||||
sudo apt install -y docker-compose
|
||||
docker-compose --version
|
||||
```
|
||||
|
||||
Добавляем текущего пользователя в группу докера
|
||||
```sh
|
||||
sudo usermod -aG docker $USER
|
||||
````
|
||||
|
||||
## Шаг 2: Создание директории для Portainer
|
||||
Создадим папку для хранения данных Portainer в `/opt`:
|
||||
|
||||
```bash
|
||||
sudo mkdir -p /opt/portainer/data
|
||||
sudo chmod -R 777 /opt/portainer
|
||||
```
|
||||
|
||||
## Шаг 3: Создание docker-compose.yml
|
||||
|
||||
```sh
|
||||
cd /opt/portainer
|
||||
sudo mcedit docker-compose.yml
|
||||
```
|
||||
|
||||
```yaml
|
||||
services:
|
||||
portainer:
|
||||
image: portainer/portainer-ce:latest
|
||||
container_name: portainer
|
||||
restart: always
|
||||
ports:
|
||||
- "8000:8000"
|
||||
- "9443:9443"
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- ./data:/data
|
||||
```
|
||||
|
||||
## Шаг 4: Запуск контейнера Portainer
|
||||
|
||||
```sh
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
|
||||
```sh
|
||||
start https://192.168.200.84:9443
|
||||
```
|
||||
|
||||
## Шаг 5: Начальная настройка
|
||||
1. Создайте учетную запись администратора.
|
||||
2. Подключите локальный Docker-движок.
|
||||
3. Начните управлять контейнерами через Portainer!
|
||||
# Установка Portainer.io в Docker на Ubuntu 24.04
|
||||
|
||||
Пробую установить в ProxMox в контейнер созданный на основе Ubuntu, незабыть убрать галочку: Unprivileged container
|
||||
|
||||
Подключаюсь к нужной машине
|
||||
```sh
|
||||
ssh igor@192.168.200.84 -p 22
|
||||
```
|
||||
|
||||
## Шаг 1: Обновление системы и установка Docker
|
||||
Перед установкой Portainer убедитесь, что Docker установлен и запущен.
|
||||
|
||||
```bash
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
sudo apt-get install python3-venv python3-pip
|
||||
sudo apt install docker.io -y
|
||||
sudo systemctl enable --now docker
|
||||
sudo systemctl start docker
|
||||
sudo systemctl status docker
|
||||
sudo apt install -y docker-compose
|
||||
docker-compose --version
|
||||
```
|
||||
|
||||
Добавляем текущего пользователя в группу докера
|
||||
```sh
|
||||
sudo usermod -aG docker $USER
|
||||
````
|
||||
|
||||
## Шаг 2: Создание директории для Portainer
|
||||
Создадим папку для хранения данных Portainer в `/opt`:
|
||||
|
||||
```bash
|
||||
sudo mkdir -p /opt/portainer/data
|
||||
sudo chmod -R 777 /opt/portainer
|
||||
```
|
||||
|
||||
## Шаг 3: Создание docker-compose.yml
|
||||
|
||||
```sh
|
||||
cd /opt/portainer
|
||||
sudo mcedit docker-compose.yml
|
||||
```
|
||||
|
||||
```yaml
|
||||
services:
|
||||
portainer:
|
||||
image: portainer/portainer-ce:latest
|
||||
container_name: portainer
|
||||
restart: always
|
||||
ports:
|
||||
- "8000:8000"
|
||||
- "9443:9443"
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- ./data:/data
|
||||
```
|
||||
|
||||
## Шаг 4: Запуск контейнера Portainer
|
||||
|
||||
```sh
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
|
||||
```sh
|
||||
start https://192.168.200.84:9443
|
||||
```
|
||||
|
||||
## Шаг 5: Начальная настройка
|
||||
1. Создайте учетную запись администратора.
|
||||
2. Подключите локальный Docker-движок.
|
||||
3. Начните управлять контейнерами через Portainer!
|
||||
|
||||
@ -1,141 +1,141 @@
|
||||
Устанавливаю согласно инструкции из:
|
||||
|
||||
https://github.com/prometheus-community/postgres_exporter
|
||||
|
||||
Подключаюсь к нужной машине
|
||||
```sh
|
||||
ssh igor@ccalm.org -p 2200
|
||||
```
|
||||
|
||||
Configure postgresql.conf
|
||||
```conf
|
||||
shared_preload_libraries = 'pg_stat_statements'
|
||||
pg_stat_statements.track = all
|
||||
```
|
||||
|
||||
## 1. Установка Docker и Docker Compose
|
||||
Если Docker не установлен, установим его:
|
||||
```sh
|
||||
sudo apt update && sudo apt upgrade -y &&
|
||||
sudo apt install -y docker.io docker-compose &&
|
||||
sudo systemctl enable --now docker
|
||||
```
|
||||
|
||||
## 2. Установка postgres-exporter в докере из заранее подготовленного образа
|
||||
|
||||
```sh
|
||||
sudo mkdir -p /opt/postgres-exporter &&
|
||||
sudo chown $USER:$USER /opt/postgres-exporter &&
|
||||
cd /opt/postgres-exporter
|
||||
```
|
||||
|
||||
Создаю файл с настройками
|
||||
```sh
|
||||
cd /opt/postgres-exporter/ &&
|
||||
cat > docker-compose.yml <<EOF
|
||||
services:
|
||||
postgres-exporter:
|
||||
image: quay.io/prometheuscommunity/postgres-exporter
|
||||
container_name: postgres-exporter
|
||||
restart: unless-stopped
|
||||
network_mode: "host"
|
||||
environment:
|
||||
DATA_SOURCE_URI: "postgresql://postgres:309A86FF65A78FB428F4E38DFE35F730@localhost:5432/postgres?sslmode=disable"
|
||||
volumes:
|
||||
- ./postgres_exporter.yml:/etc/postgres_exporter.yml
|
||||
command:
|
||||
- "--config.file=/etc/postgres_exporter.yml"
|
||||
|
||||
EOF
|
||||
```
|
||||
|
||||
Создаём файл с настройками
|
||||
```sh
|
||||
cd /opt/postgres-exporter/ &&
|
||||
cat > postgres_exporter.yml <<EOF
|
||||
collectors:
|
||||
- database
|
||||
- index
|
||||
- query
|
||||
- table
|
||||
EOF
|
||||
```
|
||||
Запускаю:
|
||||
```sh
|
||||
cd /opt/postgres-exporter &&
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
|
||||
Проверяю запущен ли докер
|
||||
```sh
|
||||
sudo docker ps
|
||||
```
|
||||
|
||||
Testing with:
|
||||
```sh
|
||||
curl "http://127.0.0.1:9187/metrics"
|
||||
```
|
||||
|
||||
Посмотреть журнал за сегодня:
|
||||
```sh
|
||||
journalctl --since today
|
||||
```
|
||||
|
||||
Настраиваем простую авторизацию при помощи HAProxy для скачивания при помощи удаленного сервера
|
||||
|
||||
```sh
|
||||
sudo mcedit /etc/haproxy/haproxy.cfg
|
||||
```
|
||||
Настраиваем:
|
||||
```text
|
||||
acl v_metrics_nd path_beg /metrics_nd
|
||||
acl v_basic_auth http_auth(prometheus_list)
|
||||
http-request auth realm Metrics_org_ccalm_nd if v_metrics_nd !v_basic_auth
|
||||
use_backend b_metrics_nd if v_metrics_nd v_basic_auth
|
||||
|
||||
backend b_metrics_nd
|
||||
mode http
|
||||
option http-keep-alive
|
||||
http-request replace-path .* /metrics
|
||||
server web1 127.0.0.1:9100 check
|
||||
```
|
||||
|
||||
Проверяем
|
||||
```sh
|
||||
haproxy -f /etc/haproxy/haproxy.cfg -c
|
||||
````
|
||||
Перезагружаем:
|
||||
```sh
|
||||
sudo systemctl restart haproxy
|
||||
````
|
||||
|
||||
|
||||
|
||||
Подключаюсь к машине где Prometeus:
|
||||
|
||||
```sh
|
||||
ssh igor@192.168.200.84 -p 22
|
||||
```
|
||||
|
||||
Перезагружаем prometheus чтобы он начал собирать метрики
|
||||
```sh
|
||||
sudo systemctl restart prometheus
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
Теперь можно настраивать графану, вот готовыдашбоард
|
||||
Открыть Grafana
|
||||
Перейти в Dashboards → Import
|
||||
Вставить ID: 9628
|
||||
Выбрать источник данных Prometheus (с PostgreSQL Exporter)
|
||||
Нажать Import
|
||||
|
||||
|
||||
Теперь можно настраивать графану, вот готовыдашбоард
|
||||
Открыть Grafana
|
||||
Перейти в Dashboards → Import
|
||||
Вставить ID: 12273
|
||||
Выбрать источник данных Prometheus (с PostgreSQL Exporter)
|
||||
Устанавливаю согласно инструкции из:
|
||||
|
||||
https://github.com/prometheus-community/postgres_exporter
|
||||
|
||||
Подключаюсь к нужной машине
|
||||
```sh
|
||||
ssh igor@ccalm.org -p 2200
|
||||
```
|
||||
|
||||
Configure postgresql.conf
|
||||
```conf
|
||||
shared_preload_libraries = 'pg_stat_statements'
|
||||
pg_stat_statements.track = all
|
||||
```
|
||||
|
||||
## 1. Установка Docker и Docker Compose
|
||||
Если Docker не установлен, установим его:
|
||||
```sh
|
||||
sudo apt update && sudo apt upgrade -y &&
|
||||
sudo apt install -y docker.io docker-compose &&
|
||||
sudo systemctl enable --now docker
|
||||
```
|
||||
|
||||
## 2. Установка postgres-exporter в докере из заранее подготовленного образа
|
||||
|
||||
```sh
|
||||
sudo mkdir -p /opt/postgres-exporter &&
|
||||
sudo chown $USER:$USER /opt/postgres-exporter &&
|
||||
cd /opt/postgres-exporter
|
||||
```
|
||||
|
||||
Создаю файл с настройками
|
||||
```sh
|
||||
cd /opt/postgres-exporter/ &&
|
||||
cat > docker-compose.yml <<'EOF'
|
||||
services:
|
||||
postgres-exporter:
|
||||
image: quay.io/prometheuscommunity/postgres-exporter
|
||||
container_name: postgres-exporter
|
||||
restart: unless-stopped
|
||||
network_mode: "host"
|
||||
environment:
|
||||
DATA_SOURCE_URI: "postgresql://postgres:309A86FF65A78FB428F4E38DFE35F730@localhost:5432/postgres?sslmode=disable"
|
||||
volumes:
|
||||
- ./postgres_exporter.yml:/etc/postgres_exporter.yml
|
||||
command:
|
||||
- "--config.file=/etc/postgres_exporter.yml"
|
||||
|
||||
EOF
|
||||
```
|
||||
|
||||
Создаём файл с настройками
|
||||
```sh
|
||||
cd /opt/postgres-exporter/ &&
|
||||
cat > postgres_exporter.yml <<'EOF'
|
||||
collectors:
|
||||
- database
|
||||
- index
|
||||
- query
|
||||
- table
|
||||
EOF
|
||||
```
|
||||
Запускаю:
|
||||
```sh
|
||||
cd /opt/postgres-exporter &&
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
|
||||
Проверяю запущен ли докер
|
||||
```sh
|
||||
sudo docker ps
|
||||
```
|
||||
|
||||
Testing with:
|
||||
```sh
|
||||
curl "http://127.0.0.1:9187/metrics"
|
||||
```
|
||||
|
||||
Посмотреть журнал за сегодня:
|
||||
```sh
|
||||
journalctl --since today
|
||||
```
|
||||
|
||||
Настраиваем простую авторизацию при помощи HAProxy для скачивания при помощи удаленного сервера
|
||||
|
||||
```sh
|
||||
sudo mcedit /etc/haproxy/haproxy.cfg
|
||||
```
|
||||
Настраиваем:
|
||||
```text
|
||||
acl v_metrics_nd path_beg /metrics_nd
|
||||
acl v_basic_auth http_auth(prometheus_list)
|
||||
http-request auth realm Metrics_org_ccalm_nd if v_metrics_nd !v_basic_auth
|
||||
use_backend b_metrics_nd if v_metrics_nd v_basic_auth
|
||||
|
||||
backend b_metrics_nd
|
||||
mode http
|
||||
option http-keep-alive
|
||||
http-request replace-path .* /metrics
|
||||
server web1 127.0.0.1:9100 check
|
||||
```
|
||||
|
||||
Проверяем
|
||||
```sh
|
||||
haproxy -f /etc/haproxy/haproxy.cfg -c
|
||||
````
|
||||
Перезагружаем:
|
||||
```sh
|
||||
sudo systemctl restart haproxy
|
||||
````
|
||||
|
||||
|
||||
|
||||
Подключаюсь к машине где Prometeus:
|
||||
|
||||
```sh
|
||||
ssh igor@192.168.200.84 -p 22
|
||||
```
|
||||
|
||||
Перезагружаем prometheus чтобы он начал собирать метрики
|
||||
```sh
|
||||
sudo systemctl restart prometheus
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
Теперь можно настраивать графану, вот готовыдашбоард
|
||||
Открыть Grafana
|
||||
Перейти в Dashboards → Import
|
||||
Вставить ID: 9628
|
||||
Выбрать источник данных Prometheus (с PostgreSQL Exporter)
|
||||
Нажать Import
|
||||
|
||||
|
||||
Теперь можно настраивать графану, вот готовыдашбоард
|
||||
Открыть Grafana
|
||||
Перейти в Dashboards → Import
|
||||
Вставить ID: 12273
|
||||
Выбрать источник данных Prometheus (с PostgreSQL Exporter)
|
||||
Нажать Import
|
||||
@ -1,61 +1,61 @@
|
||||
****************************************************************************************************
|
||||
Установка и настройка проверяльщик паролей credcheck
|
||||
PostgreSQL https://www.postgresql.org/about/news/credcheck-v200-released-2654/
|
||||
|
||||
Тестовая база
|
||||
```sh
|
||||
ssh administrator@10.201.3.36 -p 22
|
||||
```
|
||||
|
||||
Похоже в официальном репозитории нет credcheck, так что если будем искать то не найдём:
|
||||
```sh
|
||||
apt search credcheck
|
||||
```
|
||||
|
||||
Поэтому устанавливаем из репозиториев (компилируем на тестовой машине потом устанавливаем на продакшен):
|
||||
```sh
|
||||
sudo apt-get install postgresql-server-dev-16 &&
|
||||
sudo apt-get install build-essential &&
|
||||
git clone https://github.com/HexaCluster/credcheck.git &&
|
||||
cd credcheck &&
|
||||
make &&
|
||||
sudo make install
|
||||
```
|
||||
|
||||
Подключаемся к базе данных для выполнения запросов
|
||||
```sh
|
||||
psql -h 127.0.0.1 -U postgres -d transit
|
||||
```
|
||||
Проверяем что настройки имеются:
|
||||
```sh
|
||||
SELECT name, setting, unit, source, sourcefile, sourceline
|
||||
FROM pg_settings
|
||||
WHERE name LIKE 'credcheck%';
|
||||
```
|
||||
|
||||
Читаем текущие настройки
|
||||
```sh
|
||||
SHOW ALL;
|
||||
```
|
||||
|
||||
Создаём расширение в базе postgres:
|
||||
```sh
|
||||
CREATE EXTENSION credcheck;
|
||||
```
|
||||
|
||||
Теперь можно настроить расширение по https://tembo.io/docs/getting-started/postgres_guides/extensions/credcheck:
|
||||
-- Configure credential policies to enforce username and password standards and reload configuration files
|
||||
ALTER SYSTEM SET credcheck.username_min_length = 4;
|
||||
ALTER SYSTEM SET credcheck.password_min_length = 8;
|
||||
ALTER SYSTEM SET credcheck.password_min_special = 1;
|
||||
SELECT pg_reload_conf();
|
||||
|
||||
-- Attempt to create a user for a new park ranger, which does not meet the credential policies
|
||||
CREATE USER ranger_ WITH PASSWORD 'forest';
|
||||
ERROR: password length should match the configured credcheck.password_min_length
|
||||
|
||||
Для пароля установить:
|
||||
ALTER SYSTEM SET credcheck.password_expiration_days = 90;
|
||||
SELECT pg_reload_conf();
|
||||
|
||||
Для приложений нужно изменить политику паролей (менять не автоматически а по расписанию у администратора):
|
||||
****************************************************************************************************
|
||||
Установка и настройка проверяльщик паролей credcheck
|
||||
PostgreSQL https://www.postgresql.org/about/news/credcheck-v200-released-2654/
|
||||
|
||||
Тестовая база
|
||||
```sh
|
||||
ssh administrator@10.201.3.36 -p 22
|
||||
```
|
||||
|
||||
Похоже в официальном репозитории нет credcheck, так что если будем искать то не найдём:
|
||||
```sh
|
||||
apt search credcheck
|
||||
```
|
||||
|
||||
Поэтому устанавливаем из репозиториев (компилируем на тестовой машине потом устанавливаем на продакшен):
|
||||
```sh
|
||||
sudo apt-get install postgresql-server-dev-16 &&
|
||||
sudo apt-get install build-essential &&
|
||||
git clone https://github.com/HexaCluster/credcheck.git &&
|
||||
cd credcheck &&
|
||||
make &&
|
||||
sudo make install
|
||||
```
|
||||
|
||||
Подключаемся к базе данных для выполнения запросов
|
||||
```sh
|
||||
psql -h 127.0.0.1 -U postgres -d transit
|
||||
```
|
||||
Проверяем что настройки имеются:
|
||||
```sh
|
||||
SELECT name, setting, unit, source, sourcefile, sourceline
|
||||
FROM pg_settings
|
||||
WHERE name LIKE 'credcheck%';
|
||||
```
|
||||
|
||||
Читаем текущие настройки
|
||||
```sh
|
||||
SHOW ALL;
|
||||
```
|
||||
|
||||
Создаём расширение в базе postgres:
|
||||
```sh
|
||||
CREATE EXTENSION credcheck;
|
||||
```
|
||||
|
||||
Теперь можно настроить расширение по https://tembo.io/docs/getting-started/postgres_guides/extensions/credcheck:
|
||||
-- Configure credential policies to enforce username and password standards and reload configuration files
|
||||
ALTER SYSTEM SET credcheck.username_min_length = 4;
|
||||
ALTER SYSTEM SET credcheck.password_min_length = 8;
|
||||
ALTER SYSTEM SET credcheck.password_min_special = 1;
|
||||
SELECT pg_reload_conf();
|
||||
|
||||
-- Attempt to create a user for a new park ranger, which does not meet the credential policies
|
||||
CREATE USER ranger_ WITH PASSWORD 'forest';
|
||||
ERROR: password length should match the configured credcheck.password_min_length
|
||||
|
||||
Для пароля установить:
|
||||
ALTER SYSTEM SET credcheck.password_expiration_days = 90;
|
||||
SELECT pg_reload_conf();
|
||||
|
||||
Для приложений нужно изменить политику паролей (менять не автоматически а по расписанию у администратора):
|
||||
|
||||
@ -1,299 +1,342 @@
|
||||
# Install PostgreSQL database
|
||||
|
||||
Coonect lto need server:
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
Or coonect to need server:
|
||||
```sh
|
||||
ssh igor@ccalm.org -p 2200
|
||||
```
|
||||
|
||||
****************************************************************************************************
|
||||
Установка PostgreSQL 11.5 windows10 из https://www.enterprisedb.com/download-postgresql-binaries:
|
||||
Скачал, создаю дирректорию хранения данных:
|
||||
O:\MyDocuments\DataBases\postgresql-12.3-1-windows-x64-binaries\pgsql\bin\initdb.exe -D O:\MyDocuments\DataBases\Data_PostgreSQL_12.3
|
||||
O:\MyDocuments\DataBases\postgresql-10.13-1-windows-x64-binaries\pgsql\bin\initdb.exe -D O:\MyDocuments\DataBases\Data_PostgreSQL_10.13
|
||||
Потом создать BAT файл с тем текстом что отобразится при создании каталога базы
|
||||
База данных создаётся не под пользователем postgres а под локальным пользователем igor
|
||||
****************************************************************************************************
|
||||
Установка PostgreSQL 14 ubuntu 22.04 или 24.04
|
||||
```sh
|
||||
sudo apt-get update
|
||||
sudo apt-get install postgresql postgresql-contrib -y
|
||||
```
|
||||
Или так если нужно установить PostGIS
|
||||
```sh
|
||||
sudo apt-get install postgis
|
||||
```
|
||||
Для удаления PostGIS в месте с зависимыми пакетами:
|
||||
```sh
|
||||
sudo apt-get remove --auto-remove postgis &&
|
||||
sudo apt-get purge postgis
|
||||
```
|
||||
Добавить русскую локаль если её нет:
|
||||
```sh
|
||||
sudo locale-gen ru_RU &&
|
||||
sudo locale-gen ru_RU.UTF-8 &&
|
||||
sudo locale-gen kk_KZ &&
|
||||
sudo locale-gen kk_KZ.UTF-8
|
||||
```
|
||||
Проверить какая локаль по умолчанию:
|
||||
```sh
|
||||
localectl status
|
||||
```
|
||||
И переконфигурировать локаль по умолчанию в ru_RU.UTF-8 (а то в mc могут быть кракозябры):
|
||||
```sh
|
||||
sudo dpkg-reconfigure locales
|
||||
```
|
||||
Для задания пароля в PostgreSQL выполнить:
|
||||
```sh
|
||||
sudo -u postgres psql &&
|
||||
\password postgres
|
||||
```
|
||||
Чтобы выйти нужно выпольнить команду: \q
|
||||
|
||||
Роль входа по умолчанию: postgres пароль можно поменять когда в pg_hba.conf установить trust
|
||||
Задать пароль:
|
||||
sudo -u postgres psql
|
||||
postgres=> SELECT usename FROM pg_user;
|
||||
postgres=> alter user postgres password 'PasSecrKey1';
|
||||
postgres=> \q
|
||||
|
||||
Настройка postgresql.conf: http://www.lissyara.su/archive/1c_8.2+postgresql/
|
||||
Создаём базу данных выполнив функцию:
|
||||
CREATE DATABASE CCALM
|
||||
WITH OWNER = postgres
|
||||
TEMPLATE = template0
|
||||
ENCODING = 'UTF8'
|
||||
TABLESPACE = pg_default
|
||||
LC_COLLATE = 'ru_RU.UTF-8'
|
||||
LC_CTYPE = 'ru_RU.UTF-8'
|
||||
CONNECTION LIMIT = -1;
|
||||
|
||||
Файл настроек postgresql: sudo mcedit /etc/postgresql/16/main/postgresql.conf
|
||||
listen_addresses='*' #Разрешить подключение с внешки
|
||||
#Для 9й версии разрешаем экранирующие символы \' и другие без спец символа "E" перед строкой
|
||||
backslash_quote = on
|
||||
escape_string_warning = off
|
||||
standard_conforming_strings = off
|
||||
Чтобы воводил двоичные данные по старому изменить на:
|
||||
bytea_output = 'escape'
|
||||
|
||||
Настраиваю лимиты а то в саранче не выполняло большой запрос "Ошибка ввода/ввывода при отправке бэкенду"
|
||||
|
||||
Для создания нового пользователя выполнить:
|
||||
sudo -u postgres psql
|
||||
CREATE ROLE zholak LOGIN ENCRYPTED PASSWORD 'md5c0029083b93a3b16207a83b45e8a324a' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE REPLICATION;
|
||||
|
||||
Для подключения к определённой базе данных выполнить команду:
|
||||
sudo -u postgres psql
|
||||
\list or \l: для отображения всех баз
|
||||
\connect zholak zholak
|
||||
\dt для отображения всех таблиц
|
||||
|
||||
или написать со своим IP: host all all 2.133.238.240/24 trust
|
||||
Для подключения с любых IP адресов в "sudo mcedit /etc/postgresql/16/main/pg_hba.conf" прописать:
|
||||
host all all 0.0.0.0/0 md5
|
||||
Либо с одного конкретного то: host all all 92.46.48.37/24 md5
|
||||
А также поменять на listen_addresses = '*' в postgresql.conf
|
||||
Потом перезагрузить postgres:
|
||||
sudo service postgresql restart
|
||||
sudo /etc/init.d/postgresql stop
|
||||
sudo /etc/init.d/postgresql restart
|
||||
sudo /etc/init.d/postgresql start
|
||||
Проверить запущен или нет то:
|
||||
sudo /etc/init.d/postgresql status
|
||||
Посмотрель лог загрузки PostGreSQL:
|
||||
dmesg |grep pg
|
||||
Чтобы посмотреть чем занят порт выполнить команду:
|
||||
sudo netstat -tap | grep 5432
|
||||
|
||||
Создать Backup (при переносе со старой на новую версию может быть не совместим для этого нужно делать бакам в текстовом формате: plain):
|
||||
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
|
||||
pg_dump stations>/home/administrator/pg_dump.sql --host=127.0.0.1 --username=postgres --format=custom
|
||||
pg_dump transit>/home/administrator/transit.sql --host=127.0.0.1 --username=postgres
|
||||
pg_dump weather>weather.backup --host=127.0.0.1 --username=postgres --format=custom
|
||||
pg_dump transit>transit.backup --host=127.0.0.1 --username=postgres --format=custom
|
||||
|
||||
pg_dump CCALM>CCALM.backup --host=127.0.0.1 --username=postgres --format=custom
|
||||
|
||||
pg_dump weather_ru>weather_ru.backup --host=127.0.0.1 --username=postgres --format=custom
|
||||
pg_dump -d CCALM -h 192.168.0.161 -U postgres -f O:\dumps\CCALM.sql
|
||||
pg_dump --dbname=postgresql://postgres:PostPas1key@127.0.0.1:5432/ShopMaster | gzip > /mnt/disk1/backup/$(date +%Y-%m-%d).ShopMaster.gz
|
||||
|
||||
Востановить Dump из текстового файла:
|
||||
psql ASDC_Locust < /home/igor/ASDC_Locustfcron.backup
|
||||
psql -h 127.0.0.1 -U bigfoott_root -d bigfoott_shop_old2 < E:\dumps\bigfoottrade\dump.sql
|
||||
psql -h 127.0.0.1 -U postgres -d monitoring < /home/igor/pg_dump.sql
|
||||
psql -h 127.0.0.1 -U postgres -d transit_2024 < /home/administrator/transit.sql
|
||||
psql -h 127.0.0.1 -U postgres -d bigfoot_shop < /home/igor/goods.sql
|
||||
|
||||
Создание SH скрипта для ежедневного бакапирования и архивации в ZIP файл:
|
||||
/mnt/O_DRIVE/MyDocuments/DataBases/dumps/run.sh
|
||||
#!/bin/sh
|
||||
pg_dump --dbname=postgresql://postgres:A6dCgeDDWHbC@127.0.0.1:5432/Queue | gzip > /mnt/disk1/backup/$(date +%Y-%m-%d).Queue.gz
|
||||
|
||||
Для востановления через pg_restore (версии баз должны совпадать а то может не восстановиться):
|
||||
su - postgres
|
||||
pg_restore -U <username> -d <dbname> -1 <filename>.dump
|
||||
pg_restore -U postgres -d zholak -1 /home/zholak/zholak_16.01.2019.backup
|
||||
pg_restore -U postgres -d monitoring -1 /home/igor/stations_20200626.backup
|
||||
pg_restore -U postgres -d transit_new -1 /home/administrator/temp/transit.backup
|
||||
pg_restore -U postgres -d transit -1 /home/administrator/transit.backup
|
||||
pg_restore --host=127.0.0.1 --username=postgres --dbname=transit_2024 --verbose /home/administrator/transit.backup
|
||||
|
||||
sudo -u postgres psql -d transit -f /tmp/transit.backup
|
||||
|
||||
Или из архива (первоначально задать trust на 127.0.0.1) так:
|
||||
gunzip -c /var/www/dump.sql.gz | psql -h 127.0.0.1 -U bigfoott_root -d bigfoott_shop
|
||||
|
||||
****************************************************************************************************
|
||||
Настройка отображения статистики для PostgreSQL:
|
||||
https://habr.com/ru/articles/488968/
|
||||
|
||||
SELECT * FROM pg_stat_statements ORDER BY total_exec_time DESC;
|
||||
SELECT * FROM pg_stat_activity
|
||||
SELECT * FROM pg_stat_replication
|
||||
SELECT * FROM pg_stat_all_tables
|
||||
|
||||
Полный список: https://postgrespro.ru/docs/postgrespro/9.5/monitoring-stats
|
||||
|
||||
Установить Prometheus сграфаной Grafana для PostgreSQL там по умолчанию есть набор настроек для сбора статистики с PostgreSQL
|
||||
По мотивам: https://grafana.com/oss/prometheus/exporters/postgres-exporter/
|
||||
По мотивам: https://www.youtube.com/watch?v=B_yz37CR1XU
|
||||
****************************************************************************************************
|
||||
Установка pgagent
|
||||
sudo apt-get update
|
||||
sudo apt-get install pgagent
|
||||
Выполнить в консоли запрос:
|
||||
psql -h localhost -U postgres
|
||||
create extension pgagent;
|
||||
\q
|
||||
Для разрешения подключения откройте файл pg_hba.conf и замените строку на:
|
||||
host all all 127.0.0.1/32 md5
|
||||
|
||||
Можно для теста запустить pgagent с повышенным уровнем логирования:
|
||||
/usr/bin/pgagent -f -l 2 hostaddr=127.0.0.1 dbname=postgres user=postgres password=lelPfAtgQWhHYfy1SsHk
|
||||
|
||||
Если файла нет то пытаюсь его создать:
|
||||
sudo mcedit /lib/systemd/system/pgagent.service
|
||||
|
||||
[Unit]
|
||||
Description=PostgreSQL PgAgent Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=postgres
|
||||
ExecStart=/usr/bin/pgagent -f hostaddr=127.0.0.1 dbname=postgres user=postgres password=PasSecrKey1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
Проверяю что сервис был запущен:
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable pgagent
|
||||
sudo service pgagent start
|
||||
sudo systemctl status pgagent
|
||||
|
||||
|
||||
Для проверки пробуем подключиться к базе данных
|
||||
sudo -u postgres psql -h 127.0.0.1 -U postgres -d postgres
|
||||
\q
|
||||
|
||||
Похоже что нужно ещё создать файл паролей так как агент не знает как подключаться:
|
||||
sudo -u postgres touch /var/lib/postgresql/.pgpass
|
||||
sudo -u postgres chmod 600 /var/lib/postgresql/.pgpass
|
||||
sudo -u postgres mcedit /var/lib/postgresql/.pgpass
|
||||
И прописать в него:
|
||||
127.0.0.1:5432:postgres:postgres:PasSecrKey1
|
||||
Где используется такой формат: hostname:port:database:username:password
|
||||
Затем:
|
||||
sudo systemctl enable pgagent
|
||||
sudo service pgagent start
|
||||
sudo service pgagent status
|
||||
Посмотреть логи:
|
||||
sudo journalctl -u pgagent
|
||||
|
||||
****************************************************************************************************
|
||||
Для добавления автоматического бакапирования Postgresql базы *.backup создать скрипт:
|
||||
|
||||
|
||||
****************************************************************************************************
|
||||
Перенос базы PostgreSQL на другой диск: https://internet-lab.ru/postgresql_ubuntu_move
|
||||
|
||||
****************************************************************************************************
|
||||
Установка PostGIS на PostgreSQL выше 9.0 версии:
|
||||
sudo apt-get install postgis postgresql-9.3-postgis-2.1
|
||||
Для 10й версии:
|
||||
sudo apt install postgresql-10-postgis-2.4
|
||||
sudo apt install postgresql-10-postgis-scripts
|
||||
Для 12й версии:
|
||||
sudo apt install postgresql-12-postgis-2.4
|
||||
|
||||
Создать базу данных и выполнть на ней следующие команды:
|
||||
-- Enable PostGIS (includes raster)
|
||||
CREATE EXTENSION postgis;
|
||||
-- Enable Topology
|
||||
CREATE EXTENSION postgis_topology;
|
||||
-- fuzzy matching needed for Tiger
|
||||
CREATE EXTENSION fuzzystrmatch;
|
||||
-- rule based standardizer
|
||||
CREATE EXTENSION address_standardizer;
|
||||
-- example rule data set
|
||||
CREATE EXTENSION address_standardizer_data_us;
|
||||
-- Enable US Tiger Geocoder
|
||||
CREATE EXTENSION postgis_tiger_geocoder;
|
||||
|
||||
У меня начало выдавать NOTICE: version "2.2.1" of extension "postgis_topology" is already installed и PostGIS перестал работать на моём PostgreSQL 9.5.17
|
||||
Аказывается расширение кудато делось установил:
|
||||
sudo apt-get install postgresql-9.5-postgis-2.2
|
||||
****************************************************************************************************
|
||||
Для добавления TOTP авторизации в Postgresql выполнить:
|
||||
CREATE EXTENSION otp;
|
||||
|
||||
|
||||
****************************************************************************************************
|
||||
sudo apt-get install libpq-dev libpq-fe
|
||||
Если есть несовместимость libpq-dev : Зависит: libpq5 (= 14.3-0ubuntu0.22.04.1) но 14.3-1.pgdg22.04+1 должен быть установлен
|
||||
То удали ранее добавленный репозиторий: /etc/apt/sources.list.d/pgadmin4.list и обнови а потом попробуй установить заново libpq-dev
|
||||
apt update
|
||||
****************************************************************************************************
|
||||
Установка phpPgAdmin через репозиторий:
|
||||
sudo apt-get install phppgadmin
|
||||
Можно открыть так: http://localhost/phppgadmin
|
||||
Для доступа с любых ip адресов в файле: /etc/phppgadmin/apache.conf изменить на allow from all
|
||||
Чтоб можно было залогинется под пользователем postgres меняем в:
|
||||
/etc/phppgadmin/config.inc.php extra_login_security в false
|
||||
Если phpphadmin не дает залогиниться и пишет "Неверный логин", нужно в postgresql.conf прописать $conf['servers'][0]['host'] = 'localhost';
|
||||
|
||||
Другой вариант скачать с сайта последнюю версию с "http://phppgadmin.sourceforge.net/doku.php".
|
||||
****************************************************************************************************
|
||||
Установка pgAdmin4 в Linux Mint 20.04 (inxi -S) Проверить версию линукса: cat /etc/os-release у меня выдало: NAME="Linux Mint" VERSION="20.3 (Una)"
|
||||
|
||||
Проверить что не записан левый репозиторий для phppgadmin в /ect/opt/
|
||||
curl https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo apt-key add
|
||||
sudo sh -c 'echo "deb https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/bionic pgadmin4 main" > /etc/apt/sources.list.d/pgadmin4.list && apt update'
|
||||
sudo apt install pgadmin4
|
||||
|
||||
И не запустился сервер оболочка пытается стартануть а сервер нет...
|
||||
|
||||
sudo curl https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo apt-key add
|
||||
sudo sh -c 'echo "deb https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/focal pgadmin4 main" > /etc/apt/sources.list.d/pgadmin4.list && apt update'
|
||||
sudo apt install pgadmin4
|
||||
|
||||
Тоже не заработал
|
||||
|
||||
Попробовать так: https://www.tecmint.com/install-postgresql-with-pgadmin4-on-linux-mint/
|
||||
|
||||
****************************************************************************************************
|
||||
Балансировщик назрузки и потоковая репликация:
|
||||
Pgpool-II https://www.youtube.com/watch?v=qpxKlH7DBjU сервер с высокой доступностью
|
||||
https://ritorika.com.ua/dokument/6/pgpool-chto-jeto
|
||||
****************************************************************************************************
|
||||
Мониторинг запросов postgresql
|
||||
|
||||
|
||||
# Install PostgreSQL database
|
||||
|
||||
Coonect lto need server:
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
Or coonect to need server:
|
||||
```sh
|
||||
ssh igor@ccalm.org -p 2200
|
||||
```
|
||||
|
||||
****************************************************************************************************
|
||||
Установка PostgreSQL 11.5 windows10 из https://www.enterprisedb.com/download-postgresql-binaries:
|
||||
Скачал, создаю дирректорию хранения данных:
|
||||
O:\MyDocuments\DataBases\postgresql-12.3-1-windows-x64-binaries\pgsql\bin\initdb.exe -D O:\MyDocuments\DataBases\Data_PostgreSQL_12.3
|
||||
O:\MyDocuments\DataBases\postgresql-10.13-1-windows-x64-binaries\pgsql\bin\initdb.exe -D O:\MyDocuments\DataBases\Data_PostgreSQL_10.13
|
||||
Потом создать BAT файл с тем текстом что отобразится при создании каталога базы
|
||||
База данных создаётся не под пользователем postgres а под локальным пользователем igor
|
||||
****************************************************************************************************
|
||||
Установка PostgreSQL 14 ubuntu 22.04 или 24.04
|
||||
```sh
|
||||
sudo apt-get update
|
||||
sudo apt-get install postgresql postgresql-contrib -y
|
||||
```
|
||||
Или так если нужно установить PostGIS
|
||||
```sh
|
||||
sudo apt-get install postgis
|
||||
```
|
||||
Для удаления PostGIS в месте с зависимыми пакетами:
|
||||
```sh
|
||||
sudo apt-get remove --auto-remove postgis &&
|
||||
sudo apt-get purge postgis
|
||||
```
|
||||
Добавить русскую локаль если её нет:
|
||||
```sh
|
||||
sudo locale-gen ru_RU &&
|
||||
sudo locale-gen ru_RU.UTF-8 &&
|
||||
sudo locale-gen kk_KZ &&
|
||||
sudo locale-gen kk_KZ.UTF-8
|
||||
```
|
||||
Проверить какая локаль по умолчанию:
|
||||
```sh
|
||||
localectl status
|
||||
```
|
||||
И переконфигурировать локаль по умолчанию в ru_RU.UTF-8 (а то в mc могут быть кракозябры):
|
||||
```sh
|
||||
sudo dpkg-reconfigure locales
|
||||
```
|
||||
Для задания пароля в PostgreSQL выполнить:
|
||||
```sh
|
||||
sudo -u postgres psql &&
|
||||
\password postgres
|
||||
```
|
||||
Чтобы выйти нужно выпольнить команду: \q
|
||||
|
||||
Роль входа по умолчанию: postgres пароль можно поменять когда в pg_hba.conf установить trust
|
||||
Задать пароль:
|
||||
sudo -u postgres psql
|
||||
postgres=> SELECT usename FROM pg_user;
|
||||
postgres=> alter user postgres password 'PasSecrKey1';
|
||||
postgres=> \q
|
||||
|
||||
Настройка postgresql.conf: http://www.lissyara.su/archive/1c_8.2+postgresql/
|
||||
Создаём базу данных выполнив функцию:
|
||||
CREATE DATABASE CCALM
|
||||
WITH OWNER = postgres
|
||||
TEMPLATE = template0
|
||||
ENCODING = 'UTF8'
|
||||
TABLESPACE = pg_default
|
||||
LC_COLLATE = 'ru_RU.UTF-8'
|
||||
LC_CTYPE = 'ru_RU.UTF-8'
|
||||
CONNECTION LIMIT = -1;
|
||||
|
||||
Файл настроек postgresql: sudo mcedit /etc/postgresql/16/main/postgresql.conf
|
||||
listen_addresses='*' #Разрешить подключение с внешки
|
||||
#Для 9й версии разрешаем экранирующие символы \' и другие без спец символа "E" перед строкой
|
||||
backslash_quote = on
|
||||
escape_string_warning = off
|
||||
standard_conforming_strings = off
|
||||
Чтобы воводил двоичные данные по старому изменить на:
|
||||
bytea_output = 'escape'
|
||||
|
||||
Настраиваю лимиты а то в саранче не выполняло большой запрос "Ошибка ввода/ввывода при отправке бэкенду"
|
||||
|
||||
Для создания нового пользователя выполнить:
|
||||
sudo -u postgres psql
|
||||
CREATE ROLE zholak LOGIN ENCRYPTED PASSWORD 'md5c0029083b93a3b16207a83b45e8a324a' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE REPLICATION;
|
||||
|
||||
Для подключения к определённой базе данных выполнить команду:
|
||||
sudo -u postgres psql
|
||||
\list or \l: для отображения всех баз
|
||||
\connect zholak zholak
|
||||
\dt для отображения всех таблиц
|
||||
|
||||
или написать со своим IP: host all all 2.133.238.240/24 trust
|
||||
Для подключения с любых IP адресов в "sudo mcedit /etc/postgresql/16/main/pg_hba.conf" прописать:
|
||||
host all all 0.0.0.0/0 md5
|
||||
Либо с одного конкретного то: host all all 92.46.48.37/24 md5
|
||||
А также поменять на listen_addresses = '*' в postgresql.conf
|
||||
Потом перезагрузить postgres:
|
||||
sudo service postgresql restart
|
||||
sudo /etc/init.d/postgresql stop
|
||||
sudo /etc/init.d/postgresql restart
|
||||
sudo /etc/init.d/postgresql start
|
||||
Проверить запущен или нет то:
|
||||
sudo /etc/init.d/postgresql status
|
||||
Посмотрель лог загрузки PostGreSQL:
|
||||
dmesg |grep pg
|
||||
Чтобы посмотреть чем занят порт выполнить команду:
|
||||
sudo netstat -tap | grep 5432
|
||||
|
||||
Создать Backup (при переносе со старой на новую версию может быть не совместим для этого нужно делать бакам в текстовом формате: plain):
|
||||
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
|
||||
pg_dump stations>/home/administrator/pg_dump.sql --host=127.0.0.1 --username=postgres --format=custom
|
||||
pg_dump transit>/home/administrator/transit.sql --host=127.0.0.1 --username=postgres
|
||||
pg_dump weather>weather.backup --host=127.0.0.1 --username=postgres --format=custom
|
||||
pg_dump transit>transit.backup --host=127.0.0.1 --username=postgres --format=custom
|
||||
|
||||
pg_dump CCALM>CCALM.backup --host=127.0.0.1 --username=postgres --format=custom
|
||||
|
||||
pg_dump weather_ru>weather_ru.backup --host=127.0.0.1 --username=postgres --format=custom
|
||||
pg_dump -d CCALM -h 192.168.0.161 -U postgres -f O:\dumps\CCALM.sql
|
||||
pg_dump --dbname=postgresql://postgres:PostPas1key@127.0.0.1:5432/ShopMaster | gzip > /mnt/disk1/backup/$(date +%Y-%m-%d).ShopMaster.gz
|
||||
|
||||
Востановить Dump из текстового файла:
|
||||
psql ASDC_Locust < /home/igor/ASDC_Locustfcron.backup
|
||||
psql -h 127.0.0.1 -U bigfoott_root -d bigfoott_shop_old2 < E:\dumps\bigfoottrade\dump.sql
|
||||
psql -h 127.0.0.1 -U postgres -d monitoring < /home/igor/pg_dump.sql
|
||||
psql -h 127.0.0.1 -U postgres -d transit_2024 < /home/administrator/transit.sql
|
||||
psql -h 127.0.0.1 -U postgres -d bigfoot_shop < /home/igor/goods.sql
|
||||
|
||||
Создание SH скрипта для ежедневного бакапирования и архивации в ZIP файл:
|
||||
/mnt/O_DRIVE/MyDocuments/DataBases/dumps/run.sh
|
||||
#!/bin/sh
|
||||
pg_dump --dbname=postgresql://postgres:A6dCgeDDWHbC@127.0.0.1:5432/Queue | gzip > /mnt/disk1/backup/$(date +%Y-%m-%d).Queue.gz
|
||||
|
||||
Для востановления через pg_restore (версии баз должны совпадать а то может не восстановиться):
|
||||
su - postgres
|
||||
pg_restore -U <username> -d <dbname> -1 <filename>.dump
|
||||
pg_restore -U postgres -d zholak -1 /home/zholak/zholak_16.01.2019.backup
|
||||
pg_restore -U postgres -d monitoring -1 /home/igor/stations_20200626.backup
|
||||
pg_restore -U postgres -d transit_new -1 /home/administrator/temp/transit.backup
|
||||
pg_restore -U postgres -d transit -1 /home/administrator/transit.backup
|
||||
pg_restore --host=127.0.0.1 --username=postgres --dbname=transit_2024 --verbose /home/administrator/transit.backup
|
||||
|
||||
sudo -u postgres psql -d transit -f /tmp/transit.backup
|
||||
|
||||
Или из архива (первоначально задать trust на 127.0.0.1) так:
|
||||
gunzip -c /var/www/dump.sql.gz | psql -h 127.0.0.1 -U bigfoott_root -d bigfoott_shop
|
||||
|
||||
****************************************************************************************************
|
||||
Настройка отображения статистики для PostgreSQL:
|
||||
https://habr.com/ru/articles/488968/
|
||||
|
||||
SELECT * FROM pg_stat_statements ORDER BY total_exec_time DESC;
|
||||
SELECT * FROM pg_stat_activity
|
||||
SELECT * FROM pg_stat_replication
|
||||
SELECT * FROM pg_stat_all_tables
|
||||
|
||||
Полный список: https://postgrespro.ru/docs/postgrespro/9.5/monitoring-stats
|
||||
|
||||
Установить Prometheus сграфаной Grafana для PostgreSQL там по умолчанию есть набор настроек для сбора статистики с PostgreSQL
|
||||
По мотивам: https://grafana.com/oss/prometheus/exporters/postgres-exporter/
|
||||
По мотивам: https://www.youtube.com/watch?v=B_yz37CR1XU
|
||||
****************************************************************************************************
|
||||
Установка pgagent
|
||||
sudo apt-get update
|
||||
sudo apt-get install pgagent
|
||||
Выполнить в консоли запрос:
|
||||
psql -h localhost -U postgres
|
||||
create extension pgagent;
|
||||
\q
|
||||
Для разрешения подключения откройте файл pg_hba.conf и замените строку на:
|
||||
host all all 127.0.0.1/32 md5
|
||||
|
||||
Можно для теста запустить pgagent с повышенным уровнем логирования:
|
||||
/usr/bin/pgagent -f -l 2 hostaddr=127.0.0.1 dbname=postgres user=postgres password=lelPfAtgQWhHYfy1SsHk
|
||||
|
||||
Если файла нет то пытаюсь его создать:
|
||||
sudo mcedit /lib/systemd/system/pgagent.service
|
||||
|
||||
[Unit]
|
||||
Description=PostgreSQL PgAgent Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=postgres
|
||||
ExecStart=/usr/bin/pgagent -f hostaddr=127.0.0.1 dbname=postgres user=postgres password=PasSecrKey1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
Проверяю что сервис был запущен:
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable pgagent
|
||||
sudo service pgagent start
|
||||
sudo systemctl status pgagent
|
||||
|
||||
|
||||
Для проверки пробуем подключиться к базе данных
|
||||
sudo -u postgres psql -h 127.0.0.1 -U postgres -d postgres
|
||||
\q
|
||||
|
||||
Похоже что нужно ещё создать файл паролей так как агент не знает как подключаться:
|
||||
sudo -u postgres touch /var/lib/postgresql/.pgpass
|
||||
sudo -u postgres chmod 600 /var/lib/postgresql/.pgpass
|
||||
sudo -u postgres mcedit /var/lib/postgresql/.pgpass
|
||||
И прописать в него:
|
||||
127.0.0.1:5432:postgres:postgres:PasSecrKey1
|
||||
Где используется такой формат: hostname:port:database:username:password
|
||||
Затем:
|
||||
sudo systemctl enable pgagent
|
||||
sudo service pgagent start
|
||||
sudo service pgagent status
|
||||
Посмотреть логи:
|
||||
sudo journalctl -u pgagent
|
||||
|
||||
****************************************************************************************************
|
||||
Для добавления автоматического бакапирования Postgresql базы *.backup создать скрипт:
|
||||
|
||||
|
||||
****************************************************************************************************
|
||||
Перенос базы PostgreSQL на другой диск: https://internet-lab.ru/postgresql_ubuntu_move
|
||||
|
||||
****************************************************************************************************
|
||||
Установка PostGIS на PostgreSQL выше 9.0 версии:
|
||||
sudo apt-get install postgis postgresql-9.3-postgis-2.1
|
||||
Для 10й версии:
|
||||
sudo apt install postgresql-10-postgis-2.4
|
||||
sudo apt install postgresql-10-postgis-scripts
|
||||
Для 12й версии:
|
||||
sudo apt install postgresql-12-postgis-2.4
|
||||
|
||||
Создать базу данных и выполнть на ней следующие команды:
|
||||
-- Enable PostGIS (includes raster)
|
||||
CREATE EXTENSION postgis;
|
||||
-- Enable Topology
|
||||
CREATE EXTENSION postgis_topology;
|
||||
-- fuzzy matching needed for Tiger
|
||||
CREATE EXTENSION fuzzystrmatch;
|
||||
-- rule based standardizer
|
||||
CREATE EXTENSION address_standardizer;
|
||||
-- example rule data set
|
||||
CREATE EXTENSION address_standardizer_data_us;
|
||||
-- Enable US Tiger Geocoder
|
||||
CREATE EXTENSION postgis_tiger_geocoder;
|
||||
|
||||
У меня начало выдавать NOTICE: version "2.2.1" of extension "postgis_topology" is already installed и PostGIS перестал работать на моём PostgreSQL 9.5.17
|
||||
Аказывается расширение кудато делось установил:
|
||||
sudo apt-get install postgresql-9.5-postgis-2.2
|
||||
****************************************************************************************************
|
||||
Для добавления TOTP авторизации в Postgresql выполнить:
|
||||
CREATE EXTENSION otp;
|
||||
|
||||
|
||||
****************************************************************************************************
|
||||
sudo apt-get install libpq-dev libpq-fe
|
||||
Если есть несовместимость libpq-dev : Зависит: libpq5 (= 14.3-0ubuntu0.22.04.1) но 14.3-1.pgdg22.04+1 должен быть установлен
|
||||
То удали ранее добавленный репозиторий: /etc/apt/sources.list.d/pgadmin4.list и обнови а потом попробуй установить заново libpq-dev
|
||||
apt update
|
||||
****************************************************************************************************
|
||||
Установка phpPgAdmin через репозиторий:
|
||||
sudo apt-get install phppgadmin
|
||||
Можно открыть так: http://localhost/phppgadmin
|
||||
Для доступа с любых ip адресов в файле: /etc/phppgadmin/apache.conf изменить на allow from all
|
||||
Чтоб можно было залогинется под пользователем postgres меняем в:
|
||||
/etc/phppgadmin/config.inc.php extra_login_security в false
|
||||
Если phpphadmin не дает залогиниться и пишет "Неверный логин", нужно в postgresql.conf прописать $conf['servers'][0]['host'] = 'localhost';
|
||||
|
||||
Другой вариант скачать с сайта последнюю версию с "http://phppgadmin.sourceforge.net/doku.php".
|
||||
****************************************************************************************************
|
||||
Установка pgAdmin4 через докер контейнер
|
||||
|
||||
```sh
|
||||
sudo mkdir -p /opt/pgAdmin4 &&
|
||||
sudo chmod -R 777 /opt/pgAdmin4 &&
|
||||
sudo chown -R $USER:$USER /opt/pgAdmin4
|
||||
```
|
||||
|
||||
```sh
|
||||
cd /opt/pgAdmin4 &&
|
||||
cat > docker-compose.yml <<'EOF'
|
||||
services:
|
||||
pgadmin:
|
||||
image: dpage/pgadmin4
|
||||
container_name: pgadmin4
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "5050:80"
|
||||
environment:
|
||||
PGADMIN_DEFAULT_EMAIL: irigm@mail.ru
|
||||
PGADMIN_DEFAULT_PASSWORD: 123456
|
||||
volumes:
|
||||
- pgadmin_data:/var/lib/pgadmin
|
||||
|
||||
volumes:
|
||||
pgadmin_data:
|
||||
EOF
|
||||
```
|
||||
|
||||
## 4. Запуск контейнера
|
||||
|
||||
```sh
|
||||
cd /opt/pgAdmin4 &&
|
||||
sudo docker compose up -d
|
||||
```
|
||||
|
||||
```sh
|
||||
cd /opt/pgAdmin4 &&
|
||||
sudo docker compose down
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Проверить что не записан левый репозиторий для phppgadmin в /ect/opt/
|
||||
curl https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo apt-key add
|
||||
sudo sh -c 'echo "deb https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/bionic pgadmin4 main" > /etc/apt/sources.list.d/pgadmin4.list && apt update'
|
||||
sudo apt install pgadmin4
|
||||
|
||||
И не запустился сервер оболочка пытается стартануть а сервер нет...
|
||||
|
||||
sudo curl https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo apt-key add
|
||||
sudo sh -c 'echo "deb https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/focal pgadmin4 main" > /etc/apt/sources.list.d/pgadmin4.list && apt update'
|
||||
sudo apt install pgadmin4
|
||||
|
||||
Тоже не заработал
|
||||
|
||||
Попробовать так: https://www.tecmint.com/install-postgresql-with-pgadmin4-on-linux-mint/
|
||||
|
||||
****************************************************************************************************
|
||||
Балансировщик назрузки и потоковая репликация:
|
||||
Pgpool-II https://www.youtube.com/watch?v=qpxKlH7DBjU сервер с высокой доступностью
|
||||
https://ritorika.com.ua/dokument/6/pgpool-chto-jeto
|
||||
****************************************************************************************************
|
||||
Мониторинг запросов postgresql
|
||||
|
||||
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
|
||||
Создано на основе https://www.cherryservers.com/blog/how-to-set-up-postgresql-database-replication
|
||||
|
||||
Подключаюсь к нужной машине
|
||||
```sh
|
||||
ssh igor@192.168.200.84 -p 22
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Создано на основе https://www.cherryservers.com/blog/how-to-set-up-postgresql-database-replication
|
||||
|
||||
Подключаюсь к нужной машине
|
||||
```sh
|
||||
ssh igor@192.168.200.84 -p 22
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1,137 +1,137 @@
|
||||
# Настройка PostgreSQL в синхронном режиме репликации
|
||||
|
||||
Синхронная репликация в PostgreSQL гарантирует, что данные записываются на реплику перед подтверждением транзакции на основном сервере (Primary). Это повышает надежность, но может замедлить запись из-за необходимости ожидания отклика реплики.
|
||||
|
||||
---
|
||||
|
||||
## **1. Подготовка серверов**
|
||||
Допустим, у нас есть:
|
||||
- **Основной сервер (Primary):** `192.168.1.1`
|
||||
- **Реплика (Standby):** `192.168.1.2`
|
||||
|
||||
Убедитесь, что PostgreSQL установлен на обоих серверах.
|
||||
|
||||
---
|
||||
|
||||
## **2. Настройка основного сервера (Primary)**
|
||||
|
||||
### **2.1 Разрешаем подключение реплики**
|
||||
Редактируем `postgresql.conf`:
|
||||
```sh
|
||||
sudo nano /etc/postgresql/15/main/postgresql.conf
|
||||
```
|
||||
Добавляем/изменяем параметры:
|
||||
```conf
|
||||
wal_level = replica
|
||||
synchronous_commit = on
|
||||
synchronous_standby_names = 'replica1'
|
||||
max_wal_senders = 3
|
||||
wal_keep_size = 256MB
|
||||
hot_standby = on
|
||||
```
|
||||
Редактируем `pg_hba.conf`, добавляя доступ для реплики:
|
||||
```sh
|
||||
sudo nano /etc/postgresql/15/main/pg_hba.conf
|
||||
```
|
||||
Добавляем строку:
|
||||
```conf
|
||||
host replication replicator 192.168.1.2/32 md5
|
||||
```
|
||||
|
||||
### **2.2 Создаем пользователя для репликации**
|
||||
```sql
|
||||
CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'your_password';
|
||||
```
|
||||
|
||||
### **2.3 Перезапускаем PostgreSQL**
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **3. Настройка реплики (Standby)**
|
||||
|
||||
### **3.1 Останавливаем PostgreSQL на реплике**
|
||||
```sh
|
||||
sudo systemctl stop postgresql
|
||||
```
|
||||
|
||||
### **3.2 Копируем данные с основного сервера**
|
||||
На реплике выполняем:
|
||||
```sh
|
||||
sudo -u postgres pg_basebackup -h 192.168.1.1 -U replicator -D /var/lib/postgresql/15/main -Fp -Xs -R -P
|
||||
```
|
||||
|
||||
### **3.3 Указываем `application_name` вручную**
|
||||
Файл `postgresql.auto.conf`, создаваемый `pg_basebackup`, не добавляет `application_name`, поэтому задаем его вручную:
|
||||
```sh
|
||||
sudo su postgres -c "psql -c \"ALTER SYSTEM SET primary_conninfo TO 'host=192.168.1.1 user=replicator password=your_password application_name=replica1';\""
|
||||
```
|
||||
Затем перезапускаем PostgreSQL на реплике:
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
### **3.4 Проверяем `primary_conninfo`**
|
||||
```sh
|
||||
cat /var/lib/postgresql/15/main/postgresql.auto.conf | grep primary_conninfo
|
||||
```
|
||||
Ожидаемый результат:
|
||||
```ini
|
||||
primary_conninfo = 'host=192.168.1.1 user=replicator password=your_password application_name=replica1'
|
||||
```
|
||||
Если строка отсутствует, редактируем файл вручную:
|
||||
```sh
|
||||
sudo nano /var/lib/postgresql/15/main/postgresql.auto.conf
|
||||
```
|
||||
Добавляем строку:
|
||||
```ini
|
||||
primary_conninfo = 'host=192.168.1.1 user=replicator password=your_password application_name=replica1'
|
||||
```
|
||||
Сохраняем и перезапускаем PostgreSQL:
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **4. Обновляем настройки Primary для работы с репликой**
|
||||
|
||||
На основном сервере (Primary) выполняем:
|
||||
```sh
|
||||
sudo su postgres -c "psql -c \"ALTER SYSTEM SET synchronous_standby_names TO 'replica1';\""
|
||||
```
|
||||
Перезапускаем PostgreSQL на Primary:
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **5. Проверка работы синхронной репликации**
|
||||
|
||||
### **5.1 Проверяем статус репликации**
|
||||
На **основном сервере (Primary)** выполняем:
|
||||
```sql
|
||||
SELECT application_name, sync_state FROM pg_stat_replication;
|
||||
```
|
||||
Ожидаемый результат:
|
||||
```
|
||||
application_name | sync_state
|
||||
-----------------+------------
|
||||
replica1 | sync
|
||||
```
|
||||
Если `sync_state = 'sync'`, значит синхронная репликация работает.
|
||||
|
||||
---
|
||||
|
||||
## **6. Итоговая проверка**
|
||||
✅ **Задали `primary_conninfo` вручную на реплике**
|
||||
✅ **Перезапустили PostgreSQL на реплике**
|
||||
✅ **Обновили `synchronous_standby_names` на основном сервере**
|
||||
✅ **Перезапустили PostgreSQL на основном сервере**
|
||||
✅ **Проверили `pg_stat_replication` на Primary**
|
||||
|
||||
Готово! 🎉
|
||||
|
||||
# Настройка PostgreSQL в синхронном режиме репликации
|
||||
|
||||
Синхронная репликация в PostgreSQL гарантирует, что данные записываются на реплику перед подтверждением транзакции на основном сервере (Primary). Это повышает надежность, но может замедлить запись из-за необходимости ожидания отклика реплики.
|
||||
|
||||
---
|
||||
|
||||
## **1. Подготовка серверов**
|
||||
Допустим, у нас есть:
|
||||
- **Основной сервер (Primary):** `192.168.1.1`
|
||||
- **Реплика (Standby):** `192.168.1.2`
|
||||
|
||||
Убедитесь, что PostgreSQL установлен на обоих серверах.
|
||||
|
||||
---
|
||||
|
||||
## **2. Настройка основного сервера (Primary)**
|
||||
|
||||
### **2.1 Разрешаем подключение реплики**
|
||||
Редактируем `postgresql.conf`:
|
||||
```sh
|
||||
sudo nano /etc/postgresql/15/main/postgresql.conf
|
||||
```
|
||||
Добавляем/изменяем параметры:
|
||||
```conf
|
||||
wal_level = replica
|
||||
synchronous_commit = on
|
||||
synchronous_standby_names = 'replica1'
|
||||
max_wal_senders = 3
|
||||
wal_keep_size = 256MB
|
||||
hot_standby = on
|
||||
```
|
||||
Редактируем `pg_hba.conf`, добавляя доступ для реплики:
|
||||
```sh
|
||||
sudo nano /etc/postgresql/15/main/pg_hba.conf
|
||||
```
|
||||
Добавляем строку:
|
||||
```conf
|
||||
host replication replicator 192.168.1.2/32 md5
|
||||
```
|
||||
|
||||
### **2.2 Создаем пользователя для репликации**
|
||||
```sql
|
||||
CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'your_password';
|
||||
```
|
||||
|
||||
### **2.3 Перезапускаем PostgreSQL**
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **3. Настройка реплики (Standby)**
|
||||
|
||||
### **3.1 Останавливаем PostgreSQL на реплике**
|
||||
```sh
|
||||
sudo systemctl stop postgresql
|
||||
```
|
||||
|
||||
### **3.2 Копируем данные с основного сервера**
|
||||
На реплике выполняем:
|
||||
```sh
|
||||
sudo -u postgres pg_basebackup -h 192.168.1.1 -U replicator -D /var/lib/postgresql/15/main -Fp -Xs -R -P
|
||||
```
|
||||
|
||||
### **3.3 Указываем `application_name` вручную**
|
||||
Файл `postgresql.auto.conf`, создаваемый `pg_basebackup`, не добавляет `application_name`, поэтому задаем его вручную:
|
||||
```sh
|
||||
sudo su postgres -c "psql -c \"ALTER SYSTEM SET primary_conninfo TO 'host=192.168.1.1 user=replicator password=your_password application_name=replica1';\""
|
||||
```
|
||||
Затем перезапускаем PostgreSQL на реплике:
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
### **3.4 Проверяем `primary_conninfo`**
|
||||
```sh
|
||||
cat /var/lib/postgresql/15/main/postgresql.auto.conf | grep primary_conninfo
|
||||
```
|
||||
Ожидаемый результат:
|
||||
```ini
|
||||
primary_conninfo = 'host=192.168.1.1 user=replicator password=your_password application_name=replica1'
|
||||
```
|
||||
Если строка отсутствует, редактируем файл вручную:
|
||||
```sh
|
||||
sudo nano /var/lib/postgresql/15/main/postgresql.auto.conf
|
||||
```
|
||||
Добавляем строку:
|
||||
```ini
|
||||
primary_conninfo = 'host=192.168.1.1 user=replicator password=your_password application_name=replica1'
|
||||
```
|
||||
Сохраняем и перезапускаем PostgreSQL:
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **4. Обновляем настройки Primary для работы с репликой**
|
||||
|
||||
На основном сервере (Primary) выполняем:
|
||||
```sh
|
||||
sudo su postgres -c "psql -c \"ALTER SYSTEM SET synchronous_standby_names TO 'replica1';\""
|
||||
```
|
||||
Перезапускаем PostgreSQL на Primary:
|
||||
```sh
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **5. Проверка работы синхронной репликации**
|
||||
|
||||
### **5.1 Проверяем статус репликации**
|
||||
На **основном сервере (Primary)** выполняем:
|
||||
```sql
|
||||
SELECT application_name, sync_state FROM pg_stat_replication;
|
||||
```
|
||||
Ожидаемый результат:
|
||||
```
|
||||
application_name | sync_state
|
||||
-----------------+------------
|
||||
replica1 | sync
|
||||
```
|
||||
Если `sync_state = 'sync'`, значит синхронная репликация работает.
|
||||
|
||||
---
|
||||
|
||||
## **6. Итоговая проверка**
|
||||
✅ **Задали `primary_conninfo` вручную на реплике**
|
||||
✅ **Перезапустили PostgreSQL на реплике**
|
||||
✅ **Обновили `synchronous_standby_names` на основном сервере**
|
||||
✅ **Перезапустили PostgreSQL на основном сервере**
|
||||
✅ **Проверили `pg_stat_replication` на Primary**
|
||||
|
||||
Готово! 🎉
|
||||
|
||||
|
||||
1213
PowerDNS_install.md
1213
PowerDNS_install.md
File diff suppressed because it is too large
Load Diff
145
PowerDNS_install_MarinaDB.md
Normal file
145
PowerDNS_install_MarinaDB.md
Normal file
@ -0,0 +1,145 @@
|
||||
```sh
|
||||
sudo apt-get install pdns-backend-mysql -y
|
||||
```
|
||||
|
||||
Create database to MarinaDB
|
||||
```sh
|
||||
sudo mysql -u root -p
|
||||
```
|
||||
Create new user into MarinaDB
|
||||
```sh
|
||||
CREATE USER 'poweruser'@'%' IDENTIFIED BY 'uFqqXQEQwErjkQga6rcz';
|
||||
GRANT ALL PRIVILEGES ON *.* TO 'poweruser'@'%';
|
||||
FLUSH PRIVILEGES;
|
||||
REVOKE ALL PRIVILEGES ON *.* FROM 'powerdns'@'%';
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON poweruser.* TO 'poweruser'@'%';
|
||||
FLUSH PRIVILEGES;
|
||||
```
|
||||
```sh
|
||||
SELECT User, Host FROM mysql.user WHERE User = 'poweruser';
|
||||
```
|
||||
|
||||
Create database
|
||||
```sh
|
||||
CREATE DATABASE powerdns;
|
||||
GRANT ALL PRIVILEGES ON powerdns.* TO 'poweruser'@'%';
|
||||
FLUSH PRIVILEGES;
|
||||
```
|
||||
|
||||
Create file with SQL to create database, text from https://doc.powerdns.com/authoritative/backends/generic-mysql.html
|
||||
```sql
|
||||
sudo mysql -u poweruser -p powerdns <<'EOF'
|
||||
|
||||
CREATE TABLE domains (
|
||||
id INT AUTO_INCREMENT,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
master VARCHAR(128) DEFAULT NULL,
|
||||
last_check INT DEFAULT NULL,
|
||||
type VARCHAR(8) NOT NULL,
|
||||
notified_serial INT UNSIGNED DEFAULT NULL,
|
||||
account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
|
||||
options VARCHAR(64000) DEFAULT NULL,
|
||||
catalog VARCHAR(255) DEFAULT NULL,
|
||||
PRIMARY KEY (id)
|
||||
) Engine=InnoDB CHARACTER SET 'latin1';
|
||||
|
||||
CREATE UNIQUE INDEX name_index ON domains(name);
|
||||
CREATE INDEX catalog_idx ON domains(catalog);
|
||||
|
||||
CREATE TABLE records (
|
||||
id BIGINT AUTO_INCREMENT,
|
||||
domain_id INT DEFAULT NULL,
|
||||
name VARCHAR(255) DEFAULT NULL,
|
||||
type VARCHAR(10) DEFAULT NULL,
|
||||
content VARCHAR(64000) DEFAULT NULL,
|
||||
ttl INT DEFAULT NULL,
|
||||
prio INT DEFAULT NULL,
|
||||
disabled TINYINT(1) DEFAULT 0,
|
||||
ordername VARCHAR(255) BINARY DEFAULT NULL,
|
||||
auth TINYINT(1) DEFAULT 1,
|
||||
PRIMARY KEY (id)
|
||||
) Engine=InnoDB CHARACTER SET 'latin1';
|
||||
|
||||
CREATE INDEX nametype_index ON records(name,type);
|
||||
CREATE INDEX domain_id ON records(domain_id);
|
||||
CREATE INDEX ordername ON records (ordername);
|
||||
|
||||
CREATE TABLE supermasters (
|
||||
ip VARCHAR(64) NOT NULL,
|
||||
nameserver VARCHAR(255) NOT NULL,
|
||||
account VARCHAR(40) CHARACTER SET 'utf8' NOT NULL,
|
||||
PRIMARY KEY (ip, nameserver)
|
||||
) Engine=InnoDB CHARACTER SET 'latin1';
|
||||
|
||||
CREATE TABLE comments (
|
||||
id INT AUTO_INCREMENT,
|
||||
domain_id INT NOT NULL,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
type VARCHAR(10) NOT NULL,
|
||||
modified_at INT NOT NULL,
|
||||
account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
|
||||
comment TEXT CHARACTER SET 'utf8' NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
) Engine=InnoDB CHARACTER SET 'latin1';
|
||||
|
||||
CREATE INDEX comments_name_type_idx ON comments (name, type);
|
||||
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);
|
||||
|
||||
CREATE TABLE domainmetadata (
|
||||
id INT AUTO_INCREMENT,
|
||||
domain_id INT NOT NULL,
|
||||
kind VARCHAR(32),
|
||||
content TEXT,
|
||||
PRIMARY KEY (id)
|
||||
) Engine=InnoDB CHARACTER SET 'latin1';
|
||||
|
||||
CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind);
|
||||
|
||||
CREATE TABLE cryptokeys (
|
||||
id INT AUTO_INCREMENT,
|
||||
domain_id INT NOT NULL,
|
||||
flags INT NOT NULL,
|
||||
active BOOL,
|
||||
published BOOL DEFAULT 1,
|
||||
content TEXT,
|
||||
PRIMARY KEY(id)
|
||||
) Engine=InnoDB CHARACTER SET 'latin1';
|
||||
|
||||
CREATE INDEX domainidindex ON cryptokeys(domain_id);
|
||||
|
||||
CREATE TABLE tsigkeys (
|
||||
id INT AUTO_INCREMENT,
|
||||
name VARCHAR(255),
|
||||
algorithm VARCHAR(50),
|
||||
secret VARCHAR(255),
|
||||
PRIMARY KEY (id)
|
||||
) Engine=InnoDB CHARACTER SET 'latin1';
|
||||
|
||||
CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);
|
||||
|
||||
EOF
|
||||
```
|
||||
Проверяем создалась ли таблицы в базе
|
||||
```sh
|
||||
mysql -u poweruser -p -e "SHOW TABLES FROM powerdns;"
|
||||
```
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
Configure database connection from PowerDNS to SQLIte
|
||||
```sh
|
||||
sudo tee /etc/powerdns/pdns.d/pdns.local.mysql.conf <<'EOF'
|
||||
launch=gmysql
|
||||
gmysql-host=127.0.0.1
|
||||
gmysql-port=3306
|
||||
gmysql-user=poweruser
|
||||
gmysql-password=uFqqXQEQwErjkQga6rcz
|
||||
gmysql-dbname=powerdns
|
||||
gmysql-dnssec=yes
|
||||
EOF
|
||||
```
|
||||
|
||||
Set access level to file
|
||||
```sh
|
||||
sudo chown pdns: /etc/powerdns/pdns.d/pdns.local.mysql.conf &&
|
||||
sudo chmod 640 /etc/powerdns/pdns.d/pdns.local.mysql.conf
|
||||
```
|
||||
25
PowerDNS_install_PostgreSQL.md
Normal file
25
PowerDNS_install_PostgreSQL.md
Normal file
@ -0,0 +1,25 @@
|
||||
```sh
|
||||
sudo apt-get install pdns-backend-pgsql -y
|
||||
```
|
||||
----------------------------------------------------------------------------------------------------
|
||||
Подключаюсь к базе и создаю схему базу со схемой из: https://doc.powerdns.com/authoritative/backends/generic-postgresql.html
|
||||
Настраиваю соединение с базой данных в:
|
||||
```sh
|
||||
sudo tee /etc/powerdns/pdns.d/pdns.local.gpgsql.conf <<'EOF'
|
||||
launch+=gpgsql
|
||||
# gmysql parameters
|
||||
gpgsql-host=127.0.0.1
|
||||
gpgsql-port=5432
|
||||
gpgsql-dbname=powerdns
|
||||
gpgsql-user=powerdns
|
||||
gpgsql-password=y7HMHi0ATxx1VC3UU5WG
|
||||
gpgsql-dnssec=no
|
||||
EOF
|
||||
```
|
||||
|
||||
Set access level to file:
|
||||
```sh
|
||||
sudo chown pdns: /etc/powerdns/pdns.d/pdns.local.gpgsql.conf &&
|
||||
sudo chmod 640 /etc/powerdns/pdns.d/pdns.local.gpgsql.conf
|
||||
```
|
||||
----------------------------------------------------------------------------------------------------
|
||||
133
PowerDNS_install_SQIite3.md
Normal file
133
PowerDNS_install_SQIite3.md
Normal file
@ -0,0 +1,133 @@
|
||||
```sh
|
||||
sudo apt-get install pdns-backend-sqlite3 -y
|
||||
```
|
||||
|
||||
Для использования SQLIte копируем схему из https://doc.powerdns.com/authoritative/backends/generic-sqlite3.html
|
||||
```sh
|
||||
sudo apt-get install pdns-backend-sqlite3 -y
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo apt install sqlite3 -y
|
||||
```
|
||||
|
||||
Create database:
|
||||
```sh
|
||||
sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 ".databases" &&
|
||||
sudo chown pdns:pdns /var/lib/powerdns/pdns.sqlite3
|
||||
```
|
||||
Create database structure
|
||||
```sql
|
||||
sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 <<'EOF'
|
||||
|
||||
PRAGMA foreign_keys = 1;
|
||||
|
||||
CREATE TABLE domains (
|
||||
id INTEGER PRIMARY KEY,
|
||||
name VARCHAR(255) NOT NULL COLLATE NOCASE,
|
||||
master VARCHAR(128) DEFAULT NULL,
|
||||
last_check INTEGER DEFAULT NULL,
|
||||
type VARCHAR(8) NOT NULL,
|
||||
notified_serial INTEGER DEFAULT NULL,
|
||||
account VARCHAR(40) DEFAULT NULL,
|
||||
options VARCHAR(65535) DEFAULT NULL,
|
||||
catalog VARCHAR(255) DEFAULT NULL
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX name_index ON domains(name);
|
||||
CREATE INDEX catalog_idx ON domains(catalog);
|
||||
|
||||
|
||||
CREATE TABLE records (
|
||||
id INTEGER PRIMARY KEY,
|
||||
domain_id INTEGER DEFAULT NULL,
|
||||
name VARCHAR(255) DEFAULT NULL,
|
||||
type VARCHAR(10) DEFAULT NULL,
|
||||
content VARCHAR(65535) DEFAULT NULL,
|
||||
ttl INTEGER DEFAULT NULL,
|
||||
prio INTEGER DEFAULT NULL,
|
||||
disabled BOOLEAN DEFAULT 0,
|
||||
ordername VARCHAR(255),
|
||||
auth BOOL DEFAULT 1,
|
||||
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
CREATE INDEX records_lookup_idx ON records(name, type);
|
||||
CREATE INDEX records_lookup_id_idx ON records(domain_id, name, type);
|
||||
CREATE INDEX records_order_idx ON records(domain_id, ordername);
|
||||
|
||||
|
||||
CREATE TABLE supermasters (
|
||||
ip VARCHAR(64) NOT NULL,
|
||||
nameserver VARCHAR(255) NOT NULL COLLATE NOCASE,
|
||||
account VARCHAR(40) NOT NULL
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX ip_nameserver_pk ON supermasters(ip, nameserver);
|
||||
|
||||
|
||||
CREATE TABLE comments (
|
||||
id INTEGER PRIMARY KEY,
|
||||
domain_id INTEGER NOT NULL,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
type VARCHAR(10) NOT NULL,
|
||||
modified_at INT NOT NULL,
|
||||
account VARCHAR(40) DEFAULT NULL,
|
||||
comment VARCHAR(65535) NOT NULL,
|
||||
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
CREATE INDEX comments_idx ON comments(domain_id, name, type);
|
||||
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);
|
||||
|
||||
|
||||
CREATE TABLE domainmetadata (
|
||||
id INTEGER PRIMARY KEY,
|
||||
domain_id INT NOT NULL,
|
||||
kind VARCHAR(32) COLLATE NOCASE,
|
||||
content TEXT,
|
||||
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
CREATE INDEX domainmetaidindex ON domainmetadata(domain_id);
|
||||
|
||||
|
||||
CREATE TABLE cryptokeys (
|
||||
id INTEGER PRIMARY KEY,
|
||||
domain_id INT NOT NULL,
|
||||
flags INT NOT NULL,
|
||||
active BOOL,
|
||||
published BOOL DEFAULT 1,
|
||||
content TEXT,
|
||||
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
CREATE INDEX domainidindex ON cryptokeys(domain_id);
|
||||
|
||||
|
||||
CREATE TABLE tsigkeys (
|
||||
id INTEGER PRIMARY KEY,
|
||||
name VARCHAR(255) COLLATE NOCASE,
|
||||
algorithm VARCHAR(50) COLLATE NOCASE,
|
||||
secret VARCHAR(255)
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);
|
||||
|
||||
EOF
|
||||
```
|
||||
|
||||
Configure database connection from PowerDNS to SQLIte
|
||||
```sh
|
||||
sudo tee /etc/powerdns/pdns.d/pdns.local.sqlite.conf <<'EOF'
|
||||
launch=gsqlite3
|
||||
gsqlite3-database=/var/lib/powerdns/pdns.sqlite3
|
||||
EOF
|
||||
```
|
||||
Set access level to file
|
||||
```sh
|
||||
sudo chown pdns: /etc/powerdns/pdns.d/pdns.local.sqlite.conf &&
|
||||
sudo chmod 640 /etc/powerdns/pdns.d/pdns.local.sqlite.conf
|
||||
```
|
||||
|
||||
In PowerDNS configured to auto read config from dir /etc/powerdns/pdns.d/
|
||||
@ -1,7 +1,14 @@
|
||||
Устанавливаем PowerDNS через Docker Compose в директорию /opt/powerdnsa
|
||||
# Устанавливаем авторитативный PowerDNS через Docker Compose в директорию /opt/powerdnsa
|
||||
|
||||
Эту версию пробовал: https://hub.docker.com/r/powerdns/pdns-auth-48
|
||||
PowerDNS Authoritative
|
||||
|
||||
Connect to CCALM Turkish infrastructure:
|
||||
```sh
|
||||
ssh igor@156.244.31.209 -p 2200
|
||||
```
|
||||
|
||||
|
||||
```sh
|
||||
ssh-keygen -R 192.168.200.85
|
||||
```
|
||||
@ -22,6 +29,94 @@ ssh igor@192.168.200.85 -p 22
|
||||
cd /opt/powerdnsa/data
|
||||
```
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
Как настроить MariaDB базу для использования в PowerDNS смотри:
|
||||
[Установка PowerDNS с MariaDB](./PowerDNS_install_MarinaDB.md)
|
||||
----------------------------------------------------------------------------------------------------
|
||||
|
||||
Похоже что environment не работаею и нужно конфигурить через
|
||||
```sh
|
||||
cd /opt/powerdnsa
|
||||
sudo tee docker-compose.yml > /dev/null <<'EOF'
|
||||
services:
|
||||
powerdns:
|
||||
image: powerdns/pdns-auth-48
|
||||
container_name: powerdns
|
||||
restart: unless-stopped
|
||||
network_mode: "host"
|
||||
environment:
|
||||
- PDNS_LOCAL_ADDRESS=127.0.0.1,156.244.31.209
|
||||
- PDNS_LAUNCH=gmysql
|
||||
- PDNS_API=yes
|
||||
- PDNS_API_KEY=0aa08433-52a9-4611-9eed-5c5a08a508f0
|
||||
- PDNS_MASTER=yes
|
||||
- PDNS_ALLOW_AXFR_IPS=127.0.0.1
|
||||
- PDNS_WEBSERVER=yes
|
||||
- PDNS_WEBSERVER_ADDRESS=127.0.0.1,156.244.31.209
|
||||
- PDNS_WEBSERVER_PORT=8081
|
||||
# MariaDB connection settings
|
||||
- PDNS_GMYSQL_HOST=127.0.0.1 # MariaDB на localhost хоста
|
||||
- PDNS_GMYSQL_PORT=3306
|
||||
- PDNS_GMYSQL_USER=poweruser
|
||||
- PDNS_GMYSQL_PASSWORD=uFqqXQEQwErjkQga6rcz
|
||||
- PDNS_GMYSQL_DBNAME=powerdns
|
||||
- PDNS_GMYSQL_DNSSEC=yes
|
||||
EOF
|
||||
```
|
||||
|
||||
```sh
|
||||
cd /opt/powerdnsa &&
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
```sh
|
||||
cd /opt/powerdnsa &&
|
||||
sudo docker-compose down
|
||||
```
|
||||
Проверяем какие порты открыты:
|
||||
```sh
|
||||
sudo netstat -tuln
|
||||
```
|
||||
Проверяем что страница работает
|
||||
```sh
|
||||
curl -v http://localhost:8081
|
||||
```
|
||||
|
||||
Смотрим что в логе
|
||||
```sh
|
||||
sudo docker logs powerdns
|
||||
```
|
||||
```sh
|
||||
curl -H "X-API-Key: 0aa08433-52a9-4611-9eed-5c5a08a508f0" http://localhost:8081/api/v1
|
||||
```
|
||||
|
||||
|
||||
пробуем добавить тестовую зону по ключу
|
||||
```sh
|
||||
curl -X POST -H "X-API-Key: 0aa08433-52a9-4611-9eed-5c5a08a508f0" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"name": "localhost.", "kind": "Master", "dnssec": false, "soa_edit": "", "soa_edit_api": "DEFAULT"}' \
|
||||
http://localhost:8081/api/v1/servers/localhost/zones
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Инициализируем базу данных так как сам контейнер её не создаёт
|
||||
```sh
|
||||
sudo apt install sqlite3 -y
|
||||
@ -34,7 +129,7 @@ sudo sqlite3 /opt/powerdnsa/data/pdns.sqlite3 ".databases"
|
||||
|
||||
Create database structure
|
||||
```sql
|
||||
sudo sqlite3 /opt/powerdnsa/data/pdns.sqlite3 <<EOF
|
||||
sudo sqlite3 /opt/powerdnsa/data/pdns.sqlite3 <<'EOF'
|
||||
|
||||
PRAGMA foreign_keys = 1;
|
||||
|
||||
@ -147,7 +242,7 @@ sudo chmod -R 777 /opt/powerdnsa/data
|
||||
|
||||
```sh
|
||||
cd /opt/powerdnsa
|
||||
sudo tee docker-compose.yml > /dev/null <<EOF
|
||||
sudo tee docker-compose.yml > /dev/null <<'EOF'
|
||||
services:
|
||||
powerdns:
|
||||
image: powerdns/pdns-auth-48
|
||||
@ -1,3 +1,3 @@
|
||||
# Ubuntu_docs
|
||||
|
||||
# Ubuntu_docs
|
||||
|
||||
Установка различных программ в Ubuntu
|
||||
@ -1,159 +1,159 @@
|
||||
****************************************************************************************************
|
||||
Установка TomCat на Ubuntu 23.04 по руководству из https://www.digitalocean.com/community/tutorials/install-tomcat-9-ubuntu-1804
|
||||
|
||||
```sh
|
||||
ssh administrator@10.101.1.3 -p 22
|
||||
```
|
||||
|
||||
Обновляем пакеты:
|
||||
```sh
|
||||
sudo apt-get update
|
||||
```
|
||||
Устанавливаем Java Development Kit 8 (не ниже 8й версии) (так старая установиться: sudo apt-get install default-jdk)
|
||||
```sh
|
||||
sudo apt install openjdk-21-jdk openjdk-21-jre -y &&
|
||||
java -version
|
||||
```
|
||||
Создаём группу для томкат пользователя:
|
||||
```sh
|
||||
sudo groupadd tomcat
|
||||
```
|
||||
Создаём пользователя:
|
||||
```sh
|
||||
sudo useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat
|
||||
```
|
||||
Скачиваю tomcat:
|
||||
```sh
|
||||
cd /tmp &&
|
||||
curl -O https://archive.apache.org/dist/tomcat/tomcat-10/v10.1.30/bin/apache-tomcat-10.1.30.tar.gz
|
||||
```
|
||||
Извлекаю tomcat:
|
||||
```sh
|
||||
sudo mkdir /opt/tomcat &&
|
||||
sudo tar xzvf apache-tomcat-10*.tar.gz -C /opt/tomcat --strip-components=1
|
||||
```
|
||||
Обновляю владельца папки:
|
||||
```sh
|
||||
cd /opt/tomcat &&
|
||||
sudo chown tomcat:tomcat -R /opt/tomcat &&
|
||||
sudo chgrp -R tomcat /opt/tomcat &&
|
||||
sudo chmod -R g+r conf &&
|
||||
sudo chmod g+x conf &&
|
||||
sudo chown -R tomcat webapps/ work/ temp/ logs/
|
||||
```
|
||||
Указываем где находится java:
|
||||
```sh
|
||||
sudo update-java-alternatives -l
|
||||
Выдаст: /usr/lib/jvm/java-1.21.0-openjdk-amd64
|
||||
sudo mcedit /etc/environment
|
||||
Записать: JAVA_HOME="/usr/lib/jvm/java-1.21.0-openjdk-amd64"
|
||||
echo $JAVA_HOME
|
||||
```
|
||||
Пропишу на всяк случай и $CATALINA_HOME (не обязательно)
|
||||
```sh
|
||||
sudo mcedit /etc/environment
|
||||
Записать: CATALINA_HOME="/opt/tomcat"
|
||||
echo $CATALINA_HOME
|
||||
```
|
||||
Создаём сервис для автозапуска в Ubuntu 16: https://www.digitalocean.com/community/tutorials/how-to-install-apache-tomcat-8-on-ubuntu-16-04):
|
||||
```sh
|
||||
sudo mcedit /etc/systemd/system/tomcat.service
|
||||
```
|
||||
И записываем в него следующее содержимое:
|
||||
```conf
|
||||
[Unit]
|
||||
Description=Apache Tomcat Web Application Container
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
|
||||
Environment=JAVA_HOME=/usr/lib/jvm/java-1.21.0-openjdk-amd64
|
||||
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
|
||||
Environment=CATALINA_HOME=/opt/tomcat
|
||||
Environment=CATALINA_BASE=/opt/tomcat
|
||||
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
|
||||
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'
|
||||
|
||||
ExecStart=/opt/tomcat/bin/startup.sh
|
||||
ExecStop=/opt/tomcat/bin/shutdown.sh
|
||||
|
||||
User=tomcat
|
||||
Group=tomcat
|
||||
UMask=0007
|
||||
RestartSec=10
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
Затем:
|
||||
```sh
|
||||
sudo systemctl daemon-reload &&
|
||||
sudo systemctl start tomcat &&
|
||||
sudo systemctl status tomcat
|
||||
```
|
||||
Для автозапуска сервиса томката выполнить команду:
|
||||
```sh
|
||||
sudo systemctl enable tomcat
|
||||
```
|
||||
Разрешаем порт в фаерволе:
|
||||
```sh
|
||||
sudo ufw allow 8080
|
||||
```
|
||||
Для использования менеджера веб. приложений томката настраиваем пользователя:
|
||||
```sh
|
||||
sudo mcedit /opt/tomcat/conf/tomcat-users.xml
|
||||
```
|
||||
В этот файл добавить роли в раздел <tomcat-users>...</tomcat-users> запихнуть:
|
||||
```xml
|
||||
<role rolename="tomcat"/>
|
||||
<role rolename="manager-gui"/>
|
||||
<role rolename="manager-script"/>
|
||||
<role rolename="manager"/>
|
||||
<role rolename="admin-gui"/>
|
||||
<role rolename="admin"/>
|
||||
<user username="tomcat" password="igareb0s" roles="admin-gui, tomcat, manager-gui, manager-script, manager,admin"/>
|
||||
```
|
||||
Также закоментить содержимое тега Context в sudo mcedit $CATALINA_HOME/webapps/manager/META-INF/context.xml см.: http://tomcat.apache.org/tomcat-8.0-doc/manager-howto.html#Configuring_Manager_Application_Access
|
||||
```xml
|
||||
<Context antiResourceLocking="false" privileged="true" >
|
||||
<!--<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />-->
|
||||
</Context>
|
||||
```
|
||||
Для того чтобы поменять порт на 80 нужно в: sudo mcedit /opt/tomcat/conf/server.xml
|
||||
```xml
|
||||
<Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443"/>
|
||||
```
|
||||
Также при помощи authbind разрешить не-root программе быть назначенными младшим портам:
|
||||
```sh
|
||||
sudo apt-get install authbind &&
|
||||
sudo touch /etc/authbind/byport/80 &&
|
||||
sudo chmod 500 /etc/authbind/byport/80 &&
|
||||
sudo chown tomcat /etc/authbind/byport/80
|
||||
```
|
||||
Создать файл $CATALINA_HOME/bin/setenv.sh и добавить строку:
|
||||
```conf
|
||||
CATALINA_OPTS="-Djava.net.preferIPv4Stack=true"
|
||||
AUTHBIND=yes
|
||||
```
|
||||
Также заменить в $CATALINA_HOME/bin/startup.sh заменить: exec "$PRGDIR"/"$EXECUTABLE" start "$@" на
|
||||
```conf
|
||||
exec authbind --deep "$PRGDIR"/"$EXECUTABLE" start "$@"
|
||||
```
|
||||
|
||||
Так как размер WAR архива может быть большим чем 52428800 байт то в файле sudo mcedit /opt/tomcat/webapps/manager/WEB-INF/web.xml увеличиваем параметр "max-file-size" до 100000000 байт.
|
||||
|
||||
Перезагружаю томкат:
|
||||
```sh
|
||||
sudo service tomcat restart
|
||||
```
|
||||
Останавливаю томкат:
|
||||
```sh
|
||||
sudo service tomcat stop
|
||||
```
|
||||
Теперь можно запускать WEB интерфейс и деплоить проект:
|
||||
```sh
|
||||
start http://91.215.138.115:8090
|
||||
****************************************************************************************************
|
||||
Установка TomCat на Ubuntu 23.04 по руководству из https://www.digitalocean.com/community/tutorials/install-tomcat-9-ubuntu-1804
|
||||
|
||||
```sh
|
||||
ssh administrator@10.101.1.3 -p 22
|
||||
```
|
||||
|
||||
Обновляем пакеты:
|
||||
```sh
|
||||
sudo apt-get update
|
||||
```
|
||||
Устанавливаем Java Development Kit 8 (не ниже 8й версии) (так старая установиться: sudo apt-get install default-jdk)
|
||||
```sh
|
||||
sudo apt install openjdk-21-jdk openjdk-21-jre -y &&
|
||||
java -version
|
||||
```
|
||||
Создаём группу для томкат пользователя:
|
||||
```sh
|
||||
sudo groupadd tomcat
|
||||
```
|
||||
Создаём пользователя:
|
||||
```sh
|
||||
sudo useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat
|
||||
```
|
||||
Скачиваю tomcat:
|
||||
```sh
|
||||
cd /tmp &&
|
||||
curl -O https://archive.apache.org/dist/tomcat/tomcat-10/v10.1.30/bin/apache-tomcat-10.1.30.tar.gz
|
||||
```
|
||||
Извлекаю tomcat:
|
||||
```sh
|
||||
sudo mkdir /opt/tomcat &&
|
||||
sudo tar xzvf apache-tomcat-10*.tar.gz -C /opt/tomcat --strip-components=1
|
||||
```
|
||||
Обновляю владельца папки:
|
||||
```sh
|
||||
cd /opt/tomcat &&
|
||||
sudo chown tomcat:tomcat -R /opt/tomcat &&
|
||||
sudo chgrp -R tomcat /opt/tomcat &&
|
||||
sudo chmod -R g+r conf &&
|
||||
sudo chmod g+x conf &&
|
||||
sudo chown -R tomcat webapps/ work/ temp/ logs/
|
||||
```
|
||||
Указываем где находится java:
|
||||
```sh
|
||||
sudo update-java-alternatives -l
|
||||
Выдаст: /usr/lib/jvm/java-1.21.0-openjdk-amd64
|
||||
sudo mcedit /etc/environment
|
||||
Записать: JAVA_HOME="/usr/lib/jvm/java-1.21.0-openjdk-amd64"
|
||||
echo $JAVA_HOME
|
||||
```
|
||||
Пропишу на всяк случай и $CATALINA_HOME (не обязательно)
|
||||
```sh
|
||||
sudo mcedit /etc/environment
|
||||
Записать: CATALINA_HOME="/opt/tomcat"
|
||||
echo $CATALINA_HOME
|
||||
```
|
||||
Создаём сервис для автозапуска в Ubuntu 16: https://www.digitalocean.com/community/tutorials/how-to-install-apache-tomcat-8-on-ubuntu-16-04):
|
||||
```sh
|
||||
sudo mcedit /etc/systemd/system/tomcat.service
|
||||
```
|
||||
И записываем в него следующее содержимое:
|
||||
```conf
|
||||
[Unit]
|
||||
Description=Apache Tomcat Web Application Container
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
|
||||
Environment=JAVA_HOME=/usr/lib/jvm/java-1.21.0-openjdk-amd64
|
||||
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
|
||||
Environment=CATALINA_HOME=/opt/tomcat
|
||||
Environment=CATALINA_BASE=/opt/tomcat
|
||||
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
|
||||
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'
|
||||
|
||||
ExecStart=/opt/tomcat/bin/startup.sh
|
||||
ExecStop=/opt/tomcat/bin/shutdown.sh
|
||||
|
||||
User=tomcat
|
||||
Group=tomcat
|
||||
UMask=0007
|
||||
RestartSec=10
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
Затем:
|
||||
```sh
|
||||
sudo systemctl daemon-reload &&
|
||||
sudo systemctl start tomcat &&
|
||||
sudo systemctl status tomcat
|
||||
```
|
||||
Для автозапуска сервиса томката выполнить команду:
|
||||
```sh
|
||||
sudo systemctl enable tomcat
|
||||
```
|
||||
Разрешаем порт в фаерволе:
|
||||
```sh
|
||||
sudo ufw allow 8080
|
||||
```
|
||||
Для использования менеджера веб. приложений томката настраиваем пользователя:
|
||||
```sh
|
||||
sudo mcedit /opt/tomcat/conf/tomcat-users.xml
|
||||
```
|
||||
В этот файл добавить роли в раздел <tomcat-users>...</tomcat-users> запихнуть:
|
||||
```xml
|
||||
<role rolename="tomcat"/>
|
||||
<role rolename="manager-gui"/>
|
||||
<role rolename="manager-script"/>
|
||||
<role rolename="manager"/>
|
||||
<role rolename="admin-gui"/>
|
||||
<role rolename="admin"/>
|
||||
<user username="tomcat" password="igareb0s" roles="admin-gui, tomcat, manager-gui, manager-script, manager,admin"/>
|
||||
```
|
||||
Также закоментить содержимое тега Context в sudo mcedit $CATALINA_HOME/webapps/manager/META-INF/context.xml см.: http://tomcat.apache.org/tomcat-8.0-doc/manager-howto.html#Configuring_Manager_Application_Access
|
||||
```xml
|
||||
<Context antiResourceLocking="false" privileged="true" >
|
||||
<!--<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />-->
|
||||
</Context>
|
||||
```
|
||||
Для того чтобы поменять порт на 80 нужно в: sudo mcedit /opt/tomcat/conf/server.xml
|
||||
```xml
|
||||
<Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443"/>
|
||||
```
|
||||
Также при помощи authbind разрешить не-root программе быть назначенными младшим портам:
|
||||
```sh
|
||||
sudo apt-get install authbind &&
|
||||
sudo touch /etc/authbind/byport/80 &&
|
||||
sudo chmod 500 /etc/authbind/byport/80 &&
|
||||
sudo chown tomcat /etc/authbind/byport/80
|
||||
```
|
||||
Создать файл $CATALINA_HOME/bin/setenv.sh и добавить строку:
|
||||
```conf
|
||||
CATALINA_OPTS="-Djava.net.preferIPv4Stack=true"
|
||||
AUTHBIND=yes
|
||||
```
|
||||
Также заменить в $CATALINA_HOME/bin/startup.sh заменить: exec "$PRGDIR"/"$EXECUTABLE" start "$@" на
|
||||
```conf
|
||||
exec authbind --deep "$PRGDIR"/"$EXECUTABLE" start "$@"
|
||||
```
|
||||
|
||||
Так как размер WAR архива может быть большим чем 52428800 байт то в файле sudo mcedit /opt/tomcat/webapps/manager/WEB-INF/web.xml увеличиваем параметр "max-file-size" до 100000000 байт.
|
||||
|
||||
Перезагружаю томкат:
|
||||
```sh
|
||||
sudo service tomcat restart
|
||||
```
|
||||
Останавливаю томкат:
|
||||
```sh
|
||||
sudo service tomcat stop
|
||||
```
|
||||
Теперь можно запускать WEB интерфейс и деплоить проект:
|
||||
```sh
|
||||
start http://91.215.138.115:8090
|
||||
```
|
||||
357
Traefik_install.md
Normal file
357
Traefik_install.md
Normal file
@ -0,0 +1,357 @@
|
||||
Открываю нужный сервер
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
Или такой:
|
||||
```sh
|
||||
ssh igor@192.168.200.85 -p 22
|
||||
```
|
||||
|
||||
# Установка Traefik на Linux Mint / Ubuntu
|
||||
|
||||
## 📥 Шаг 1. Установка зависимостей
|
||||
Убедитесь, что установлены `wget` и `systemd`:
|
||||
```sh
|
||||
sudo apt update &&
|
||||
sudo apt install wget
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📥 Шаг 2. Скачать последнюю версию Traefik
|
||||
Проверь актуальную версию на: [Traefik Releases](https://github.com/traefik/traefik/releases)
|
||||
|
||||
Пример для версии `v3.0.0`:
|
||||
```bash
|
||||
cd ~ &&
|
||||
wget https://github.com/traefik/traefik/releases/download/v3.3.4/traefik_v3.3.4_linux_amd64.tar.gz
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📥 Шаг 3. Распаковка и установка
|
||||
```bash
|
||||
cd ~ &&
|
||||
tar -xvzf traefik_v3.3.4_linux_amd64.tar.gz &&
|
||||
sudo mv traefik /usr/local/bin/
|
||||
```
|
||||
|
||||
Проверь версию:
|
||||
```bash
|
||||
traefik version
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📁 Шаг 4. Создание директории и базового конфига
|
||||
```sh
|
||||
sudo mkdir -p /etc/traefik &&
|
||||
cd /etc/traefik
|
||||
```
|
||||
|
||||
### Пример `traefik.yml`
|
||||
```sh
|
||||
cd /etc/traefik &&
|
||||
sudo tee /etc/traefik/traefik.yml > /dev/null <<'EOF'
|
||||
entryPoints:
|
||||
web:
|
||||
address: ":80"
|
||||
http:
|
||||
redirections:
|
||||
entryPoint:
|
||||
to: websecure
|
||||
scheme: https
|
||||
permanent: true
|
||||
websecure:
|
||||
address: ":443"
|
||||
traefik:
|
||||
address: ":8080"
|
||||
|
||||
api:
|
||||
dashboard: true
|
||||
insecure: true
|
||||
|
||||
providers:
|
||||
file:
|
||||
filename: "/etc/traefik/dynamic.yml"
|
||||
|
||||
# Настройка сертификатов (пример с Let's Encrypt)
|
||||
certificatesResolvers:
|
||||
myresolver:
|
||||
acme:
|
||||
email: "your-email@example.com"
|
||||
storage: "/etc/traefik/acme.json"
|
||||
httpChallenge:
|
||||
entryPoint: web
|
||||
|
||||
log:
|
||||
level: DEBUG
|
||||
EOF
|
||||
```
|
||||
|
||||
### Пример `dynamic.yml`
|
||||
```sh
|
||||
cd /etc/traefik &&
|
||||
sudo tee /etc/traefik/dynamic.yml > /dev/null <<'EOF'
|
||||
http:
|
||||
routers:
|
||||
dashboard:
|
||||
entryPoints:
|
||||
- traefik
|
||||
rule: "Host(`localhost`)"
|
||||
service: api@internal
|
||||
|
||||
ccalm-api-auth:
|
||||
rule: "Host(`ccalm.test`) && PathPrefix(`/api/authorization/v02/`)"
|
||||
service: org_ccalm_api_authorization_v02
|
||||
entryPoints:
|
||||
- websecure
|
||||
tls:
|
||||
certresolver: myresolver
|
||||
middlewares:
|
||||
- strip-auth-prefix
|
||||
|
||||
ccalm-dbms:
|
||||
rule: "Host(`ccalm.test`) && PathPrefix(`/api/dbms/v09/`)"
|
||||
service: org_ccalm_dbms_v09
|
||||
entryPoints:
|
||||
- websecure
|
||||
tls:
|
||||
certresolver: myresolver
|
||||
middlewares:
|
||||
- strip-dbms-prefix
|
||||
|
||||
ccalm-login:
|
||||
rule: "Host(`ccalm.test`) && PathPrefix(`/login/`)"
|
||||
service: org_ccalm_login_v01
|
||||
entryPoints:
|
||||
- websecure
|
||||
tls:
|
||||
certresolver: myresolver
|
||||
|
||||
ccalm-default:
|
||||
rule: "Host(`ccalm.test`)"
|
||||
service: org_ccalm
|
||||
entryPoints:
|
||||
- websecure
|
||||
tls:
|
||||
certresolver: myresolver
|
||||
|
||||
powerdns:
|
||||
rule: "Host(`powerdns.local`)"
|
||||
service: local_powerdns
|
||||
entryPoints:
|
||||
- websecure
|
||||
tls: {}
|
||||
|
||||
middlewares:
|
||||
strip-auth-prefix:
|
||||
stripPrefix:
|
||||
prefixes:
|
||||
- "/api/authorization/v02"
|
||||
strip-dbms-prefix:
|
||||
stripPrefix:
|
||||
prefixes:
|
||||
- "/api/dbms/v09"
|
||||
|
||||
services:
|
||||
|
||||
# Бэкенд для local_powerdns
|
||||
local_powerdns:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://192.168.200.85:9191"
|
||||
healthCheck:
|
||||
path: "/"
|
||||
interval: "5s"
|
||||
|
||||
# Бэкенд для org_ccalm_api_authorization_v02 (HTTPS с отключенной проверкой SSL)
|
||||
org_ccalm_api_authorization_v02:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "https://192.168.200.184:8082"
|
||||
serversTransport: insecureTransport # Ссылка на транспорт с отключенной проверкой
|
||||
healthCheck:
|
||||
path: "/"
|
||||
interval: "5s"
|
||||
|
||||
# Бэкенд для org_ccalm_dbms_v09 (HTTPS с отключенной проверкой SSL)
|
||||
org_ccalm_dbms_v09:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "https://192.168.200.184:8084"
|
||||
serversTransport: insecureTransport
|
||||
healthCheck:
|
||||
path: "/"
|
||||
interval: "5s"
|
||||
|
||||
# Бэкенд для org_ccalm_login_v01 (HTTP, без SSL)
|
||||
org_ccalm_login_v01:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://192.168.200.184:3000"
|
||||
healthCheck:
|
||||
path: "/"
|
||||
interval: "5s"
|
||||
|
||||
# Бэкенд по умолчанию org_ccalm (HTTPS с отключенной проверкой SSL)
|
||||
org_ccalm:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "https://192.168.200.184:8083"
|
||||
serversTransport: insecureTransport
|
||||
healthCheck:
|
||||
path: "/"
|
||||
interval: "5s"
|
||||
|
||||
# Определяем транспорт для отключения проверки SSL
|
||||
serversTransports:
|
||||
insecureTransport:
|
||||
insecureSkipVerify: true
|
||||
|
||||
# Добавляем сертификаты
|
||||
tls:
|
||||
certificates:
|
||||
- certFile: "/etc/traefik/certs/ccalm.test.crt"
|
||||
keyFile: "/etc/traefik/certs/ccalm.test.key"
|
||||
- certFile: "/etc/traefik/certs/powerdns.local.crt"
|
||||
keyFile: "/etc/traefik/certs/powerdns.local.key"
|
||||
- certFile: "/etc/traefik/certs/wildcard.local.crt"
|
||||
keyFile: "/etc/traefik/certs/wildcard.local.key"
|
||||
- certFile: "/etc/traefik/certs/wildcard.test.crt"
|
||||
keyFile: "/etc/traefik/certs/wildcard.test.key"
|
||||
|
||||
EOF
|
||||
```
|
||||
|
||||
Для хранения сертификатов файл:
|
||||
```sh
|
||||
sudo touch /etc/traefik/acme.json &&
|
||||
sudo chmod 600 /etc/traefik/acme.json
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
## ⚙️ Шаг 5. Настройка systemd для автозапуска
|
||||
Создайте файл сервиса:
|
||||
```sh
|
||||
cd /etc/systemd/system &&
|
||||
sudo tee /etc/systemd/system/traefik.service > /dev/null <<'EOF'
|
||||
[Unit]
|
||||
Description=Traefik
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/local/bin/traefik --configFile=/etc/traefik/traefik.yml
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
```
|
||||
|
||||
|
||||
Примените:
|
||||
```sh
|
||||
sudo systemctl daemon-reload &&
|
||||
sudo systemctl enable traefik &&
|
||||
sudo systemctl start traefik &&
|
||||
sudo systemctl status traefik
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl restart traefik
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔎 Шаг 6. Проверка работы
|
||||
Откройте в браузере:
|
||||
```sh
|
||||
open http://localhost:8080/dashboard/
|
||||
```
|
||||
|
||||
> ⚠️ Доступ к дашборду открыт только с localhost. Для удалённого доступа настройте правила.
|
||||
|
||||
---
|
||||
|
||||
## ✅ Готово!
|
||||
Traefik установлен, запущен как сервис и готов к работе.
|
||||
|
||||
Проверяем какие порты слушает:
|
||||
```sh
|
||||
sudo lsof -i -P -n | grep traefik
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo journalctl -u traefik -f
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
## 🐳 Как вариант можно установить через Docker
|
||||
|
||||
|
||||
Если Docker не установлен, установим его:
|
||||
```sh
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
sudo apt install -y docker.io docker-compose
|
||||
sudo systemctl enable --now docker
|
||||
```
|
||||
Проверим версию:
|
||||
```sh
|
||||
docker --version
|
||||
docker-compose --version
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo mkdir -p /opt/traefik
|
||||
cd /opt/traefik
|
||||
```
|
||||
|
||||
```sh
|
||||
cd /opt/traefik &&
|
||||
sudo tee docker-compose.yml > /dev/null <<'EOF'
|
||||
services:
|
||||
traefik:
|
||||
image: traefik:latest
|
||||
container_name: traefik
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "80:80" # HTTP
|
||||
- "443:443" # HTTPS
|
||||
- "8080:8080" # Dashboard
|
||||
volumes:
|
||||
- /etc/traefik:/etc/traefik
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
command:
|
||||
- "--configFile=/etc/traefik/traefik.yml"
|
||||
networks:
|
||||
- traefik-net
|
||||
networks:
|
||||
traefik-net:
|
||||
driver: bridge
|
||||
EOF
|
||||
```
|
||||
|
||||
## Запуск контейнера
|
||||
```sh
|
||||
cd /opt/traefik &&
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
```sh
|
||||
cd /opt/traefik &&
|
||||
sudo docker-compose down
|
||||
```
|
||||
|
||||
Откройте в браузере:
|
||||
```sh
|
||||
open http://192.168.200.85:8080/dashboard/
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo docker logs traefik
|
||||
```
|
||||
285
Traefik_install_CCALM.md
Normal file
285
Traefik_install_CCALM.md
Normal file
@ -0,0 +1,285 @@
|
||||
# Устанавливаю Traefik на туречский сервер
|
||||
|
||||
```sh
|
||||
ssh igor@156.244.31.209 -p 2200
|
||||
```
|
||||
|
||||
# Установка Traefik на Linux Mint / Ubuntu
|
||||
|
||||
## 📥 Шаг 1. Установка зависимостей
|
||||
Убедитесь, что установлены `wget` и `systemd`:
|
||||
```sh
|
||||
sudo apt update &&
|
||||
sudo apt install wget
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📥 Шаг 2. Скачать последнюю версию Traefik
|
||||
Проверь актуальную версию на: [Traefik Releases](https://github.com/traefik/traefik/releases)
|
||||
|
||||
Пример для версии `v3.0.0`:sudo mc
|
||||
```sh
|
||||
cd ~ &&
|
||||
wget https://github.com/traefik/traefik/releases/download/v3.3.4/traefik_v3.3.4_linux_amd64.tar.gz
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📥 Шаг 3. Распаковка и установка
|
||||
```sh
|
||||
cd ~ &&
|
||||
tar -xvzf traefik_v3.3.4_linux_amd64.tar.gz &&
|
||||
sudo mv traefik /usr/local/bin/
|
||||
```
|
||||
|
||||
Проверь версию:
|
||||
```sh
|
||||
traefik version
|
||||
```
|
||||
|
||||
```conf
|
||||
Version: 3.3.4
|
||||
Codename: saintnectaire
|
||||
Go version: go1.23.6
|
||||
Built: 2025-02-25T10:11:01Z
|
||||
OS/Arch: linux/amd64
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📁 Шаг 4. Создание директории и базового конфига
|
||||
```sh
|
||||
sudo mkdir -p /etc/traefik &&
|
||||
cd /etc/traefik
|
||||
```
|
||||
|
||||
### Пример `traefik.yml`
|
||||
```sh
|
||||
cd /etc/traefik &&
|
||||
sudo tee /etc/traefik/traefik.yml > /dev/null <<'EOF'
|
||||
entryPoints:
|
||||
web:
|
||||
address: ":80"
|
||||
http:
|
||||
redirections:
|
||||
entryPoint:
|
||||
to: websecure
|
||||
scheme: https
|
||||
permanent: true
|
||||
websecure:
|
||||
address: ":443"
|
||||
traefik:
|
||||
address: ":8080"
|
||||
|
||||
api:
|
||||
dashboard: true
|
||||
insecure: true
|
||||
|
||||
providers:
|
||||
file:
|
||||
filename: "/etc/traefik/dynamic.yml"
|
||||
|
||||
# Настройка сертификатов (пример с Let's Encrypt)
|
||||
certificatesResolvers:
|
||||
myresolver:
|
||||
acme:
|
||||
email: "irigm@mail.ru"
|
||||
storage: "/etc/traefik/acme.json"
|
||||
httpChallenge:
|
||||
entryPoint: web
|
||||
|
||||
log:
|
||||
level: DEBUG
|
||||
EOF
|
||||
```
|
||||
|
||||
### Пример `dynamic.yml`
|
||||
```sh
|
||||
cd /etc/traefik &&
|
||||
sudo tee /etc/traefik/dynamic.yml > /dev/null <<'EOF'
|
||||
http:
|
||||
routers:
|
||||
dashboard:
|
||||
entryPoints:
|
||||
- traefik
|
||||
rule: "Host(`localhost`)"
|
||||
service: api@internal
|
||||
|
||||
geovizor-api-zones:
|
||||
rule: "Host(`geovizor.top`) && PathPrefix(`/api/v1/servers/localhost/zones/`)"
|
||||
service: top_geovizor_api_zones_v01
|
||||
entryPoints:
|
||||
- websecure
|
||||
tls:
|
||||
certresolver: myresolver
|
||||
|
||||
geovizor-default:
|
||||
rule: "Host(`geovizor.top`)"
|
||||
service: top_geovizor_default
|
||||
entryPoints:
|
||||
- websecure
|
||||
tls:
|
||||
certresolver: myresolver
|
||||
|
||||
services:
|
||||
|
||||
top_geovizor_api_zones_v01:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://156.244.31.209:8081"
|
||||
healthCheck:
|
||||
path: "/"
|
||||
interval: "5s"
|
||||
|
||||
# Бэкенд по умолчанию top_geovizor
|
||||
top_geovizor_default:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://127.0.0.1:8082"
|
||||
healthCheck:
|
||||
path: "/"
|
||||
interval: "5s"
|
||||
|
||||
# Определяем транспорт для отключения проверки SSL
|
||||
serversTransports:
|
||||
insecureTransport:
|
||||
insecureSkipVerify: true
|
||||
|
||||
# Добавляем сертификаты
|
||||
tls:
|
||||
certificates:
|
||||
|
||||
EOF
|
||||
```
|
||||
|
||||
Для хранения сертификатов файл:
|
||||
```sh
|
||||
sudo touch /etc/traefik/acme.json &&
|
||||
sudo chmod 600 /etc/traefik/acme.json
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
## ⚙️ Шаг 5. Настройка systemd для автозапуска
|
||||
Создайте файл сервиса:
|
||||
```sh
|
||||
cd /etc/systemd/system &&
|
||||
sudo tee /etc/systemd/system/traefik.service > /dev/null <<'EOF'
|
||||
[Unit]
|
||||
Description=Traefik
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/local/bin/traefik --configFile=/etc/traefik/traefik.yml
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
```
|
||||
|
||||
|
||||
Примените:
|
||||
```sh
|
||||
sudo systemctl daemon-reload &&
|
||||
sudo systemctl enable traefik &&
|
||||
sudo systemctl start traefik &&
|
||||
sudo systemctl status traefik
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl restart traefik
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔎 Шаг 6. Проверка работы
|
||||
Откройте в браузере:
|
||||
```sh
|
||||
open http://localhost:8080/dashboard/
|
||||
```
|
||||
|
||||
> ⚠️ Доступ к дашборду открыт только с localhost. Для удалённого доступа настройте правила.
|
||||
|
||||
---
|
||||
|
||||
## ✅ Готово!
|
||||
Traefik установлен, запущен как сервис и готов к работе.
|
||||
|
||||
Проверяем какие порты слушает:
|
||||
```sh
|
||||
sudo lsof -i -P -n | grep traefik
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo journalctl -u traefik -f
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
## 🐳 Как вариант можно установить через Docker
|
||||
|
||||
|
||||
Если Docker не установлен, установим его:
|
||||
```sh
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
sudo apt install -y docker.io docker-compose
|
||||
sudo systemctl enable --now docker
|
||||
```
|
||||
Проверим версию:
|
||||
```sh
|
||||
docker --version
|
||||
docker-compose --version
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo mkdir -p /opt/traefik
|
||||
cd /opt/traefik
|
||||
```
|
||||
|
||||
```sh
|
||||
cd /opt/traefik &&
|
||||
sudo tee docker-compose.yml > /dev/null <<'EOF'
|
||||
services:
|
||||
traefik:
|
||||
image: traefik:latest
|
||||
container_name: traefik
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "80:80" # HTTP
|
||||
- "443:443" # HTTPS
|
||||
- "8080:8080" # Dashboard
|
||||
volumes:
|
||||
- /etc/traefik:/etc/traefik
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
command:
|
||||
- "--configFile=/etc/traefik/traefik.yml"
|
||||
networks:
|
||||
- traefik-net
|
||||
networks:
|
||||
traefik-net:
|
||||
driver: bridge
|
||||
EOF
|
||||
```
|
||||
|
||||
## Запуск контейнера
|
||||
```sh
|
||||
cd /opt/traefik &&
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
```sh
|
||||
cd /opt/traefik &&
|
||||
sudo docker-compose down
|
||||
```
|
||||
|
||||
Откройте в браузере:
|
||||
```sh
|
||||
open http://192.168.200.85:8080/dashboard/
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo docker logs traefik
|
||||
```
|
||||
94
Unbound_install.md
Normal file
94
Unbound_install.md
Normal file
@ -0,0 +1,94 @@
|
||||
```sh
|
||||
sudo apt update &&
|
||||
sudo apt install unbound -y &&
|
||||
unbound -V
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl start unbound &&
|
||||
sudo systemctl enable unbound &&
|
||||
sudo systemctl status unbound
|
||||
```
|
||||
On Windows configuration is:
|
||||
|
||||
```yaml
|
||||
server:
|
||||
verbosity: 4
|
||||
qname-minimisation: no
|
||||
interface: 127.0.0.1
|
||||
do-ip6: no
|
||||
do-ip4: yes
|
||||
logfile: "C:\unbound.log"
|
||||
domain-insecure: "test."
|
||||
domain-insecure: "local."
|
||||
domain-insecure: "pizza."
|
||||
auto-trust-anchor-file: "C:\Program Files\Unbound\root.key"
|
||||
private-address: ::/0
|
||||
harden-dnssec-stripped: no
|
||||
harden-referral-path: no
|
||||
|
||||
# Явно указываем, что зона "test." не локальная
|
||||
local-zone: "test." transparent
|
||||
|
||||
forward-zone:
|
||||
name: "test."
|
||||
forward-addr: 192.168.200.85@5300
|
||||
|
||||
forward-zone:
|
||||
name: "local."
|
||||
forward-addr: 192.168.200.85@5300
|
||||
|
||||
forward-zone:
|
||||
name: "pizza."
|
||||
forward-addr: 10.101.1.31@53
|
||||
|
||||
forward-zone:
|
||||
name: "srv."
|
||||
forward-addr: 10.101.1.31@53
|
||||
|
||||
remote-control:
|
||||
control-enable: yes
|
||||
control-interface: 127.0.0.1
|
||||
control-use-cert: no
|
||||
```
|
||||
|
||||
On Linux conf file devide on anoter files
|
||||
```sh
|
||||
sudo mcedit /etc/unbound/unbound.conf
|
||||
```
|
||||
|
||||
```sh
|
||||
cd /etc/unbound/ &&
|
||||
sudo mc
|
||||
```
|
||||
|
||||
Получить полный список локальных зон можно так: unbound-control
|
||||
```sh
|
||||
unbound-control list_local_zones
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl restart unbound
|
||||
```
|
||||
|
||||
```sh
|
||||
sudo systemctl status unbound.service
|
||||
```
|
||||
```sh
|
||||
sudo journalctl -xeu unbound.service
|
||||
```
|
||||
|
||||
Check on errors:
|
||||
```sh
|
||||
sudo unbound-checkconf /etc/unbound/unbound.conf
|
||||
```
|
||||
|
||||
|
||||
Прописываем для определенного интерфейса:
|
||||
```sh
|
||||
sudo resolvectl dns wlp14s0 127.0.0.1
|
||||
```
|
||||
Проверяем что стоит в качестве NDS резольвера
|
||||
```sh
|
||||
resolvectl status
|
||||
```
|
||||
@ -1,66 +1,66 @@
|
||||
# Установка Uptime Kuma в Ubuntu 24.04 с помощью Docker Compose
|
||||
|
||||
## 1. Установка необходимых пакетов
|
||||
Обновите систему и установите Docker и Docker Compose:
|
||||
|
||||
```sh
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
sudo apt install -y docker.io docker-compose
|
||||
```
|
||||
|
||||
## 2. Создание директории для Uptime Kuma
|
||||
```sh
|
||||
sudo mkdir -p /opt/uptime-kuma
|
||||
cd /opt/uptime-kuma
|
||||
```
|
||||
|
||||
## 3. Создание `docker-compose.yml`
|
||||
Создайте файл `docker-compose.yml`:
|
||||
|
||||
```sh
|
||||
sudo mcedit /opt/uptime-kuma/docker-compose.yml
|
||||
```
|
||||
|
||||
Вставьте следующий конфигурационный файл:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
uptime-kuma:
|
||||
image: louislam/uptime-kuma:latest
|
||||
container_name: uptime-kuma
|
||||
restart: always
|
||||
ports:
|
||||
- "3001:3001"
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
```
|
||||
|
||||
## 4. Запуск контейнера
|
||||
```sh
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
|
||||
## 5. Проверка работы Uptime Kuma
|
||||
Откройте браузер и перейдите по адресу:
|
||||
|
||||
```sh
|
||||
start http://192.168.200.84:3001
|
||||
```
|
||||
|
||||
## 6. Управление контейнером
|
||||
- **Остановить Uptime Kuma:**
|
||||
```sh
|
||||
sudo docker-compose down
|
||||
```
|
||||
- **Перезапустить контейнер:**
|
||||
```sh
|
||||
sudo docker-compose restart
|
||||
```
|
||||
- **Просмотреть логи:**
|
||||
|
||||
```sh
|
||||
sudo docker-compose logs -f
|
||||
```
|
||||
|
||||
Готово! Uptime Kuma установлен и запущен в Docker на Ubuntu 24.04. 🚀
|
||||
|
||||
# Установка Uptime Kuma в Ubuntu 24.04 с помощью Docker Compose
|
||||
|
||||
## 1. Установка необходимых пакетов
|
||||
Обновите систему и установите Docker и Docker Compose:
|
||||
|
||||
```sh
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
sudo apt install -y docker.io docker-compose
|
||||
```
|
||||
|
||||
## 2. Создание директории для Uptime Kuma
|
||||
```sh
|
||||
sudo mkdir -p /opt/uptime-kuma
|
||||
cd /opt/uptime-kuma
|
||||
```
|
||||
|
||||
## 3. Создание `docker-compose.yml`
|
||||
Создайте файл `docker-compose.yml`:
|
||||
|
||||
```sh
|
||||
sudo mcedit /opt/uptime-kuma/docker-compose.yml
|
||||
```
|
||||
|
||||
Вставьте следующий конфигурационный файл:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
uptime-kuma:
|
||||
image: louislam/uptime-kuma:latest
|
||||
container_name: uptime-kuma
|
||||
restart: always
|
||||
ports:
|
||||
- "3001:3001"
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
```
|
||||
|
||||
## 4. Запуск контейнера
|
||||
```sh
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
|
||||
## 5. Проверка работы Uptime Kuma
|
||||
Откройте браузер и перейдите по адресу:
|
||||
|
||||
```sh
|
||||
start http://192.168.200.84:3001
|
||||
```
|
||||
|
||||
## 6. Управление контейнером
|
||||
- **Остановить Uptime Kuma:**
|
||||
```sh
|
||||
sudo docker-compose down
|
||||
```
|
||||
- **Перезапустить контейнер:**
|
||||
```sh
|
||||
sudo docker-compose restart
|
||||
```
|
||||
- **Просмотреть логи:**
|
||||
|
||||
```sh
|
||||
sudo docker-compose logs -f
|
||||
```
|
||||
|
||||
Готово! Uptime Kuma установлен и запущен в Docker на Ubuntu 24.04. 🚀
|
||||
|
||||
|
||||
@ -1,38 +1,38 @@
|
||||
Открываю нужный сервер
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
|
||||
```sh
|
||||
curl -sSX POST https://istt-kz.zulipchat.com/api/v1/fetch_api_key \
|
||||
--data-urlencode username=ivanov.i@istt.kz \
|
||||
--data-urlencode password=fsUHb3hf3QCdpBLsKyhL
|
||||
```
|
||||
Выдало:
|
||||
```json
|
||||
{
|
||||
"result":"success",
|
||||
"msg":"",
|
||||
"api_key":"91kQqr13HCwFP2HeARWPHxrfksYPH82p",
|
||||
"email":"ivanov.i@istt.kz",
|
||||
"user_id":880555
|
||||
}
|
||||
```
|
||||
|
||||
```sh
|
||||
curl -X POST https://istt-kz.zulipchat.com/api/v1/messages \
|
||||
-u "ivanov.i@istt.kz:91kQqr13HCwFP2HeARWPHxrfksYPH82p" \
|
||||
-d "type=stream" \
|
||||
-d "to=general" \
|
||||
-d "topic=Тест5" \
|
||||
-d "content=Привет из консоли!"
|
||||
```
|
||||
|
||||
```sh
|
||||
curl -X POST https://istt-kz.zulipchat.com/api/v1/messages \
|
||||
-u "ivanov.i@istt.kz:91kQqr13HCwFP2HeARWPHxrfksYPH82p" \
|
||||
-d "type=private" \
|
||||
-d "to=ivanov.i@istt.kz" \
|
||||
-d "topic=Тест5" \
|
||||
-d "content=Привет из консоли!"
|
||||
```
|
||||
Открываю нужный сервер
|
||||
```sh
|
||||
wsl
|
||||
```
|
||||
|
||||
```sh
|
||||
curl -sSX POST https://istt-kz.zulipchat.com/api/v1/fetch_api_key \
|
||||
--data-urlencode username=ivanov.i@istt.kz \
|
||||
--data-urlencode password=fsUHb3hf3QCdpBLsKyhL
|
||||
```
|
||||
Выдало:
|
||||
```json
|
||||
{
|
||||
"result":"success",
|
||||
"msg":"",
|
||||
"api_key":"91kQqr13HCwFP2HeARWPHxrfksYPH82p",
|
||||
"email":"ivanov.i@istt.kz",
|
||||
"user_id":880555
|
||||
}
|
||||
```
|
||||
|
||||
```sh
|
||||
curl -X POST https://istt-kz.zulipchat.com/api/v1/messages \
|
||||
-u "ivanov.i@istt.kz:91kQqr13HCwFP2HeARWPHxrfksYPH82p" \
|
||||
-d "type=stream" \
|
||||
-d "to=general" \
|
||||
-d "topic=Тест5" \
|
||||
-d "content=Привет из консоли!"
|
||||
```
|
||||
|
||||
```sh
|
||||
curl -X POST https://istt-kz.zulipchat.com/api/v1/messages \
|
||||
-u "ivanov.i@istt.kz:91kQqr13HCwFP2HeARWPHxrfksYPH82p" \
|
||||
-d "type=private" \
|
||||
-d "to=ivanov.i@istt.kz" \
|
||||
-d "topic=Тест5" \
|
||||
-d "content=Привет из консоли!"
|
||||
```
|
||||
|
||||
@ -1,341 +1,341 @@
|
||||
Here’s a step-by-step guide to setting up a **RabbitMQ cluster with replication** correctly:
|
||||
|
||||
---
|
||||
|
||||
## **Step 1: Prepare the Servers**
|
||||
|
||||
Ensure you have at least **three** nodes (recommended for HA) with:
|
||||
|
||||
- Ubuntu 22.04 (or a supported OS)
|
||||
- Sufficient CPU/RAM based on workload
|
||||
- Open necessary firewall ports (**5672, 15672, 25672**)
|
||||
|
||||
Set hostnames for clarity:
|
||||
|
||||
```bash
|
||||
sudo hostnamectl set-hostname rabbitmq-node1 # Change for each node
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Step 2: Install Erlang and RabbitMQ**
|
||||
|
||||
Run the following on **all nodes**:
|
||||
|
||||
### **1. Add the RabbitMQ Repository**
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y curl gnupg
|
||||
curl -fsSL https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey | sudo tee /usr/share/keyrings/rabbitmq-key.asc
|
||||
echo "deb [signed-by=/usr/share/keyrings/rabbitmq-key.asc] https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list
|
||||
```
|
||||
|
||||
### **2. Install Erlang and RabbitMQ**
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y rabbitmq-server
|
||||
```
|
||||
|
||||
### **3. Enable RabbitMQ**
|
||||
|
||||
```bash
|
||||
sudo systemctl enable --now rabbitmq-server
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Step 3: Configure Clustering**
|
||||
|
||||
### **1. Stop RabbitMQ on All Nodes**
|
||||
|
||||
```bash
|
||||
sudo systemctl stop rabbitmq-server
|
||||
```
|
||||
|
||||
### **2. Configure Cookie for Clustering**
|
||||
|
||||
Run on **all nodes** (same cookie ensures clustering works):
|
||||
|
||||
```bash
|
||||
echo "MY_CLUSTER_COOKIE" | sudo tee /var/lib/rabbitmq/.erlang.cookie
|
||||
sudo chmod 600 /var/lib/rabbitmq/.erlang.cookie
|
||||
```
|
||||
|
||||
Replace `"MY_CLUSTER_COOKIE"` with a strong, identical value on all nodes.
|
||||
|
||||
---
|
||||
|
||||
## **Step 4: Join Nodes to the Cluster**
|
||||
|
||||
Perform this on **nodes 2 and 3**, joining them to **node1**:
|
||||
|
||||
```bash
|
||||
sudo rabbitmqctl stop_app
|
||||
sudo rabbitmqctl join_cluster rabbit@rabbitmq-node1
|
||||
sudo rabbitmqctl start_app
|
||||
```
|
||||
|
||||
Check cluster status:
|
||||
|
||||
```bash
|
||||
sudo rabbitmqctl cluster_status
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Step 5: Enable High Availability (HA) Mirroring**
|
||||
|
||||
To replicate all queues, run on **any one node**:
|
||||
|
||||
```bash
|
||||
rabbitmqctl set_policy ha-all "^.*" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
|
||||
```
|
||||
|
||||
This ensures all queues are **replicated across all nodes**.
|
||||
|
||||
---
|
||||
|
||||
## **Step 6: Enable Management UI**
|
||||
|
||||
Run on **each node** to enable the web interface:
|
||||
|
||||
```bash
|
||||
sudo rabbitmq-plugins enable rabbitmq_management
|
||||
```
|
||||
|
||||
Access at:
|
||||
**http://[NODE_IP]:15672**
|
||||
(Default login: `guest/guest`, change this for security.)
|
||||
|
||||
---
|
||||
|
||||
## **Step 7: Test the Cluster**
|
||||
|
||||
Run on **each node**:
|
||||
|
||||
```bash
|
||||
rabbitmqctl list_queues
|
||||
```
|
||||
|
||||
Queues should be visible and synchronized.
|
||||
|
||||
---
|
||||
|
||||
## **Step 8: Enable Auto-Recovery** (Optional)
|
||||
|
||||
Edit `/etc/rabbitmq/rabbitmq.conf` on **each node** and add:
|
||||
|
||||
```ini
|
||||
cluster_formation.peer_discovery_backend = classic_config
|
||||
cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-node1
|
||||
cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-node2
|
||||
cluster_formation.classic_config.nodes.3 = rabbit@rabbitmq-node3
|
||||
```
|
||||
|
||||
Then restart RabbitMQ:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart rabbitmq-server
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Step 9: Secure the Cluster** (Recommended)
|
||||
|
||||
### **1. Create an Admin User**
|
||||
|
||||
```bash
|
||||
rabbitmqctl add_user admin StrongPassword123!
|
||||
rabbitmqctl set_user_tags admin administrator
|
||||
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
|
||||
```
|
||||
|
||||
Then **disable the guest account**:
|
||||
|
||||
```bash
|
||||
rabbitmqctl delete_user guest
|
||||
```
|
||||
|
||||
### **2. Enable TLS (Optional)**
|
||||
|
||||
For security, configure TLS in `/etc/rabbitmq/rabbitmq.conf`. Refer to RabbitMQ’s [TLS guide](https://www.rabbitmq.com/ssl.html).
|
||||
|
||||
---
|
||||
|
||||
## **Step 10: Setup Monitoring (Optional)**
|
||||
|
||||
Install **Prometheus & Grafana** or use **RabbitMQ Prometheus plugin**:
|
||||
|
||||
```bash
|
||||
sudo rabbitmq-plugins enable rabbitmq_prometheus
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Now your RabbitMQ cluster is fully set up with **replication and high availability**! 🚀
|
||||
|
||||
---
|
||||
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
# Instructions to fix **unexpected** configuration errors
|
||||
|
||||
If you can't find the RabbitMQ config file under `/etc/rabbitmq`, it may not exist by default. You need to **create it manually**. Here's how:
|
||||
|
||||
## **1️⃣ Create the Configuration File**
|
||||
|
||||
RabbitMQ uses either a **`.conf` file** (modern format) or a **`.config` file** (legacy format). The recommended format is `.conf`.
|
||||
|
||||
Create the file if it doesn't exist:
|
||||
|
||||
```bash
|
||||
sudo nano /etc/rabbitmq/rabbitmq.conf
|
||||
```
|
||||
|
||||
Then add the following cluster configuration:
|
||||
|
||||
```
|
||||
cluster_formation.peer_discovery_backend = classic_config
|
||||
cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-main
|
||||
cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-replica
|
||||
```
|
||||
|
||||
Save and exit (`CTRL+X`, then `Y`, then `Enter`).
|
||||
|
||||
---
|
||||
|
||||
## **2️⃣ Set Correct Permissions**
|
||||
|
||||
Ensure the RabbitMQ user can read it:
|
||||
|
||||
```bash
|
||||
sudo chown rabbitmq:rabbitmq /etc/rabbitmq/rabbitmq.conf
|
||||
sudo chmod 644 /etc/rabbitmq/rabbitmq.conf
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **3️⃣ Restart RabbitMQ**
|
||||
|
||||
After modifying the configuration, restart the RabbitMQ service:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart rabbitmq-server
|
||||
```
|
||||
|
||||
Check the status:
|
||||
|
||||
```bash
|
||||
sudo systemctl status rabbitmq-server
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **4️⃣ Verify the Cluster Configuration**
|
||||
|
||||
After restarting, verify that clustering is working:
|
||||
|
||||
```bash
|
||||
rabbitmqctl cluster_status
|
||||
```
|
||||
|
||||
If the nodes are listed correctly, your setup is working.
|
||||
|
||||
---
|
||||
|
||||
## **5️⃣ If Using the Legacy `.config` Format**
|
||||
|
||||
Some older installations use an **Erlang-based configuration file** (`rabbitmq.config`). If you prefer that, create:
|
||||
|
||||
```bash
|
||||
sudo nano /etc/rabbitmq/rabbitmq.config
|
||||
```
|
||||
|
||||
Add this:
|
||||
|
||||
```erlang
|
||||
[
|
||||
{rabbit, [
|
||||
{cluster_formation, [
|
||||
{peer_discovery_backend, classic_config},
|
||||
{classic_config, [
|
||||
{nodes, ['rabbit@rabbitmq-main', 'rabbit@rabbitmq-replica']}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
].
|
||||
```
|
||||
|
||||
Then restart RabbitMQ:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart rabbitmq-server
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### **🔍 Troubleshooting**
|
||||
|
||||
❌ **RabbitMQ doesn't restart?**
|
||||
Check logs for errors:
|
||||
|
||||
```bash
|
||||
sudo journalctl -u rabbitmq-server --no-pager | tail -50
|
||||
```
|
||||
|
||||
❌ **Cluster not forming?**
|
||||
Try forcing a node to join manually:
|
||||
|
||||
```bash
|
||||
rabbitmqctl stop_app
|
||||
rabbitmqctl join_cluster rabbit@rabbitmq-main
|
||||
rabbitmqctl start_app
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
# Instructions to fix **unexpected** management UI authentication errors
|
||||
|
||||
stackoverflow answer [link](https://stackoverflow.com/a/40845332/27251837)
|
||||
|
||||
## Answer
|
||||
|
||||
### ❌ **Cannot login with guest/guest credentials**
|
||||
|
||||
I had the same Problem..
|
||||
|
||||
I installed RabbitMQ and Enabled Web Interface also but still couldn't sign in with any user i newly created, this is because you need to be administrator to access this.
|
||||
|
||||
Do not create any config file and mess with it..
|
||||
|
||||
This is what i did then,
|
||||
|
||||
1. Add a new/fresh user, say user test and password test:
|
||||
|
||||
```bash
|
||||
rabbitmqctl add_user test test
|
||||
```
|
||||
|
||||
2. Give administrative access to the new user:
|
||||
|
||||
```bash
|
||||
rabbitmqctl set_user_tags test administrator
|
||||
```
|
||||
|
||||
3. Set permission to newly created user:
|
||||
|
||||
```bash
|
||||
rabbitmqctl set_permissions -p / test ".*" ".*" ".*"
|
||||
```
|
||||
|
||||
That's it, enjoy :)
|
||||
Here’s a step-by-step guide to setting up a **RabbitMQ cluster with replication** correctly:
|
||||
|
||||
---
|
||||
|
||||
## **Step 1: Prepare the Servers**
|
||||
|
||||
Ensure you have at least **three** nodes (recommended for HA) with:
|
||||
|
||||
- Ubuntu 22.04 (or a supported OS)
|
||||
- Sufficient CPU/RAM based on workload
|
||||
- Open necessary firewall ports (**5672, 15672, 25672**)
|
||||
|
||||
Set hostnames for clarity:
|
||||
|
||||
```bash
|
||||
sudo hostnamectl set-hostname rabbitmq-node1 # Change for each node
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Step 2: Install Erlang and RabbitMQ**
|
||||
|
||||
Run the following on **all nodes**:
|
||||
|
||||
### **1. Add the RabbitMQ Repository**
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y curl gnupg
|
||||
curl -fsSL https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey | sudo tee /usr/share/keyrings/rabbitmq-key.asc
|
||||
echo "deb [signed-by=/usr/share/keyrings/rabbitmq-key.asc] https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list
|
||||
```
|
||||
|
||||
### **2. Install Erlang and RabbitMQ**
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y rabbitmq-server
|
||||
```
|
||||
|
||||
### **3. Enable RabbitMQ**
|
||||
|
||||
```bash
|
||||
sudo systemctl enable --now rabbitmq-server
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Step 3: Configure Clustering**
|
||||
|
||||
### **1. Stop RabbitMQ on All Nodes**
|
||||
|
||||
```bash
|
||||
sudo systemctl stop rabbitmq-server
|
||||
```
|
||||
|
||||
### **2. Configure Cookie for Clustering**
|
||||
|
||||
Run on **all nodes** (same cookie ensures clustering works):
|
||||
|
||||
```bash
|
||||
echo "MY_CLUSTER_COOKIE" | sudo tee /var/lib/rabbitmq/.erlang.cookie
|
||||
sudo chmod 600 /var/lib/rabbitmq/.erlang.cookie
|
||||
```
|
||||
|
||||
Replace `"MY_CLUSTER_COOKIE"` with a strong, identical value on all nodes.
|
||||
|
||||
---
|
||||
|
||||
## **Step 4: Join Nodes to the Cluster**
|
||||
|
||||
Perform this on **nodes 2 and 3**, joining them to **node1**:
|
||||
|
||||
```bash
|
||||
sudo rabbitmqctl stop_app
|
||||
sudo rabbitmqctl join_cluster rabbit@rabbitmq-node1
|
||||
sudo rabbitmqctl start_app
|
||||
```
|
||||
|
||||
Check cluster status:
|
||||
|
||||
```bash
|
||||
sudo rabbitmqctl cluster_status
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Step 5: Enable High Availability (HA) Mirroring**
|
||||
|
||||
To replicate all queues, run on **any one node**:
|
||||
|
||||
```bash
|
||||
rabbitmqctl set_policy ha-all "^.*" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
|
||||
```
|
||||
|
||||
This ensures all queues are **replicated across all nodes**.
|
||||
|
||||
---
|
||||
|
||||
## **Step 6: Enable Management UI**
|
||||
|
||||
Run on **each node** to enable the web interface:
|
||||
|
||||
```bash
|
||||
sudo rabbitmq-plugins enable rabbitmq_management
|
||||
```
|
||||
|
||||
Access at:
|
||||
**http://[NODE_IP]:15672**
|
||||
(Default login: `guest/guest`, change this for security.)
|
||||
|
||||
---
|
||||
|
||||
## **Step 7: Test the Cluster**
|
||||
|
||||
Run on **each node**:
|
||||
|
||||
```bash
|
||||
rabbitmqctl list_queues
|
||||
```
|
||||
|
||||
Queues should be visible and synchronized.
|
||||
|
||||
---
|
||||
|
||||
## **Step 8: Enable Auto-Recovery** (Optional)
|
||||
|
||||
Edit `/etc/rabbitmq/rabbitmq.conf` on **each node** and add:
|
||||
|
||||
```ini
|
||||
cluster_formation.peer_discovery_backend = classic_config
|
||||
cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-node1
|
||||
cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-node2
|
||||
cluster_formation.classic_config.nodes.3 = rabbit@rabbitmq-node3
|
||||
```
|
||||
|
||||
Then restart RabbitMQ:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart rabbitmq-server
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Step 9: Secure the Cluster** (Recommended)
|
||||
|
||||
### **1. Create an Admin User**
|
||||
|
||||
```bash
|
||||
rabbitmqctl add_user admin StrongPassword123!
|
||||
rabbitmqctl set_user_tags admin administrator
|
||||
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
|
||||
```
|
||||
|
||||
Then **disable the guest account**:
|
||||
|
||||
```bash
|
||||
rabbitmqctl delete_user guest
|
||||
```
|
||||
|
||||
### **2. Enable TLS (Optional)**
|
||||
|
||||
For security, configure TLS in `/etc/rabbitmq/rabbitmq.conf`. Refer to RabbitMQ’s [TLS guide](https://www.rabbitmq.com/ssl.html).
|
||||
|
||||
---
|
||||
|
||||
## **Step 10: Setup Monitoring (Optional)**
|
||||
|
||||
Install **Prometheus & Grafana** or use **RabbitMQ Prometheus plugin**:
|
||||
|
||||
```bash
|
||||
sudo rabbitmq-plugins enable rabbitmq_prometheus
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Now your RabbitMQ cluster is fully set up with **replication and high availability**! 🚀
|
||||
|
||||
---
|
||||
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
# Instructions to fix **unexpected** configuration errors
|
||||
|
||||
If you can't find the RabbitMQ config file under `/etc/rabbitmq`, it may not exist by default. You need to **create it manually**. Here's how:
|
||||
|
||||
## **1️⃣ Create the Configuration File**
|
||||
|
||||
RabbitMQ uses either a **`.conf` file** (modern format) or a **`.config` file** (legacy format). The recommended format is `.conf`.
|
||||
|
||||
Create the file if it doesn't exist:
|
||||
|
||||
```bash
|
||||
sudo nano /etc/rabbitmq/rabbitmq.conf
|
||||
```
|
||||
|
||||
Then add the following cluster configuration:
|
||||
|
||||
```
|
||||
cluster_formation.peer_discovery_backend = classic_config
|
||||
cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-main
|
||||
cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-replica
|
||||
```
|
||||
|
||||
Save and exit (`CTRL+X`, then `Y`, then `Enter`).
|
||||
|
||||
---
|
||||
|
||||
## **2️⃣ Set Correct Permissions**
|
||||
|
||||
Ensure the RabbitMQ user can read it:
|
||||
|
||||
```bash
|
||||
sudo chown rabbitmq:rabbitmq /etc/rabbitmq/rabbitmq.conf
|
||||
sudo chmod 644 /etc/rabbitmq/rabbitmq.conf
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **3️⃣ Restart RabbitMQ**
|
||||
|
||||
After modifying the configuration, restart the RabbitMQ service:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart rabbitmq-server
|
||||
```
|
||||
|
||||
Check the status:
|
||||
|
||||
```bash
|
||||
sudo systemctl status rabbitmq-server
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **4️⃣ Verify the Cluster Configuration**
|
||||
|
||||
After restarting, verify that clustering is working:
|
||||
|
||||
```bash
|
||||
rabbitmqctl cluster_status
|
||||
```
|
||||
|
||||
If the nodes are listed correctly, your setup is working.
|
||||
|
||||
---
|
||||
|
||||
## **5️⃣ If Using the Legacy `.config` Format**
|
||||
|
||||
Some older installations use an **Erlang-based configuration file** (`rabbitmq.config`). If you prefer that, create:
|
||||
|
||||
```bash
|
||||
sudo nano /etc/rabbitmq/rabbitmq.config
|
||||
```
|
||||
|
||||
Add this:
|
||||
|
||||
```erlang
|
||||
[
|
||||
{rabbit, [
|
||||
{cluster_formation, [
|
||||
{peer_discovery_backend, classic_config},
|
||||
{classic_config, [
|
||||
{nodes, ['rabbit@rabbitmq-main', 'rabbit@rabbitmq-replica']}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
].
|
||||
```
|
||||
|
||||
Then restart RabbitMQ:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart rabbitmq-server
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### **🔍 Troubleshooting**
|
||||
|
||||
❌ **RabbitMQ doesn't restart?**
|
||||
Check logs for errors:
|
||||
|
||||
```bash
|
||||
sudo journalctl -u rabbitmq-server --no-pager | tail -50
|
||||
```
|
||||
|
||||
❌ **Cluster not forming?**
|
||||
Try forcing a node to join manually:
|
||||
|
||||
```bash
|
||||
rabbitmqctl stop_app
|
||||
rabbitmqctl join_cluster rabbit@rabbitmq-main
|
||||
rabbitmqctl start_app
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
# Instructions to fix **unexpected** management UI authentication errors
|
||||
|
||||
stackoverflow answer [link](https://stackoverflow.com/a/40845332/27251837)
|
||||
|
||||
## Answer
|
||||
|
||||
### ❌ **Cannot login with guest/guest credentials**
|
||||
|
||||
I had the same Problem..
|
||||
|
||||
I installed RabbitMQ and Enabled Web Interface also but still couldn't sign in with any user i newly created, this is because you need to be administrator to access this.
|
||||
|
||||
Do not create any config file and mess with it..
|
||||
|
||||
This is what i did then,
|
||||
|
||||
1. Add a new/fresh user, say user test and password test:
|
||||
|
||||
```bash
|
||||
rabbitmqctl add_user test test
|
||||
```
|
||||
|
||||
2. Give administrative access to the new user:
|
||||
|
||||
```bash
|
||||
rabbitmqctl set_user_tags test administrator
|
||||
```
|
||||
|
||||
3. Set permission to newly created user:
|
||||
|
||||
```bash
|
||||
rabbitmqctl set_permissions -p / test ".*" ".*" ".*"
|
||||
```
|
||||
|
||||
That's it, enjoy :)
|
||||
|
||||
Reference in New Issue
Block a user