Compare commits

...

99 Commits

Author SHA1 Message Date
TheSt1tch 7cde0d8820 update docker version 7 days ago
TheSt1tch 93fd9a5778 add oidc-login 7 days ago
TheSt1tch 5fe604ff0b clean canonical "q" 7 days ago
TheSt1tch d1e527ac6e add picture
continuous-integration/drone/push Build is passing Details
2 months ago
TheSt1tch d257ecaca3 add btop
continuous-integration/drone/push Build is passing Details
2 months ago
TheSt1tch cb2b67b4ed add wirenboard
continuous-integration/drone/push Build is passing Details
2 months ago
TheSt1tch 297f2b9886 add change-id
continuous-integration/drone/push Build is passing Details
2 months ago
TheSt1tch 619e692280 add google analytics
continuous-integration/drone/push Build is passing Details
3 months ago
TheSt1tch 2b36b12528 add mariadb
continuous-integration/drone/push Build is passing Details
4 months ago
TheSt1tch e8998d8d0e проблемы призмы
continuous-integration/drone/push Build is passing Details
4 months ago
TheSt1tch de8735039d fix
continuous-integration/drone/push Build is passing Details
5 months ago
TheSt1tch 634a37a594 add disk vm
continuous-integration/drone/push Build is passing Details
5 months ago
TheSt1tch d999b77188 fix page
continuous-integration/drone/push Build is passing Details
5 months ago
TheSt1tch 193087ba7a add secure linux 5 months ago
TheSt1tch 9d0bff8ea1 add helpfull links 5 months ago
TheSt1tch b990a80182 fix
continuous-integration/drone/push Build is passing Details
5 months ago
TheSt1tch 06bdcf1237 fix
continuous-integration/drone/push Build is passing Details
5 months ago
TheSt1tch 24619b7a1b add disable apparmor
continuous-integration/drone/push Build is passing Details
5 months ago
TheSt1tch 30b154c8ec add locale russian
continuous-integration/drone/push Build is passing Details
5 months ago
TheSt1tch bbb783228e fix
continuous-integration/drone/push Build is passing Details
5 months ago
TheSt1tch 3bd9e53841 update
continuous-integration/drone/push Build is passing Details
5 months ago
thest1tch 715627d6b8 Merge pull request 'states/2024.07' (#18) from states/2024.07 into main
Reviewed-on: #18
5 months ago
TheSt1tch 5d90e07d15 add dockge 5 months ago
TheSt1tch b1d0f3fb64 remove page 5 months ago
TheSt1tch 1b830e48cd add mark traffik page 5 months ago
TheSt1tch 6ee61a110e add ebgp page 5 months ago
TheSt1tch 99f75d82e2 update 5 months ago
thest1tch dd13eb9833 Merge pull request 'states/2024.06' (#17) from states/2024.06 into main
continuous-integration/drone/push Build is passing Details
Reviewed-on: #17
7 months ago
TheSt1tch a1edb4ea4b add woodpacker ci file
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/pr Build is passing Details
7 months ago
TheSt1tch 3c2e3e7790 Со мной связался РКН и пригрозил 7 months ago
thest1tch 35795a1e08 Merge pull request 'Страницы за 2024.05' (#16) from states/2024.05 into main
Reviewed-on: #16
8 months ago
TheSt1tch 95cdfb078f add rsync 8 months ago
thest1tch c9e604d7e4 Merge pull request 'states/2024.04' (#15) from states/2024.04 into main
continuous-integration/drone/push Build is passing Details
Reviewed-on: #15
9 months ago
TheSt1tch 9e1500a70a 1
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/pr Build is passing Details
9 months ago
TheSt1tch a79543fe20 update
continuous-integration/drone/push Build is passing Details
9 months ago
TheSt1tch 2283f15cc5 Настройка новых устройств по Nodbus шине
continuous-integration/drone/push Build is passing Details
9 months ago
TheSt1tch 382deed6cf Новая страница решения проблем с Plex 9 months ago
TheSt1tch a7870fb348 Ползеные команды перенесены на отдельную страницу 9 months ago
TheSt1tch a3b590af57 Обновление версии в инструкции 9 months ago
TheSt1tch 4fe1c4478f fix
continuous-integration/drone/push Build is passing Details
9 months ago
TheSt1tch 700091c351 Добавлена статья по входу в Synology через SSO
continuous-integration/drone/push Build is passing Details
9 months ago
TheSt1tch 9ca6b107ab Обновление Traefik install
continuous-integration/drone/push Build is passing Details
9 months ago
TheSt1tch bc5925c5c4 Добавление страницы по Synology для обновления корневых сертификатов
continuous-integration/drone/push Build is passing Details
9 months ago
TheSt1tch 9a344d9521 fix WARNING
continuous-integration/drone/push Build is passing Details
9 months ago
TheSt1tch a1f679a1f1 fix
continuous-integration/drone/push Build is passing Details
9 months ago
TheSt1tch 298b8fbd40 test
continuous-integration/drone/push Build is passing Details
9 months ago
TheSt1tch 119386dcdb fix WARNING
continuous-integration/drone/push Build is passing Details
9 months ago
TheSt1tch 229b866064 update nav
continuous-integration/drone/push Build is passing Details
9 months ago
TheSt1tch 3fb2be97f0 Новая структура (перенос hardware на верхний уровень)
continuous-integration/drone/push Build is passing Details
9 months ago
TheSt1tch 521586e758 add dev mkdocs
continuous-integration/drone/push Build is passing Details
9 months ago
TheSt1tch 3e00c57072 add homarr and homepage
continuous-integration/drone/push Build is passing Details
10 months ago
TheSt1tch 017d45ade6 update pictshare page
continuous-integration/drone/push Build is passing Details
10 months ago
TheSt1tch af887bae7d fix
continuous-integration/drone/push Build is passing Details
10 months ago
TheSt1tch 11e91bc977 1
continuous-integration/drone/push Build is passing Details
10 months ago
TheSt1tch 132671e490 ?
continuous-integration/drone/push Build is failing Details
10 months ago
TheSt1tch 31eb002e95 Merge branch 'main' of https://git.st1t.ru/thest1tch/docs
continuous-integration/drone/push Build is passing Details
10 months ago
TheSt1tch 2a8496efe7 Merge branch 'states/2024.01' 10 months ago
TheSt1tch 678c83bd4b remove build main
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/pr Build is passing Details
10 months ago
TheSt1tch 3651fe2d47 add
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/pr Build is failing Details
10 months ago
TheSt1tch 0c8be9f9a3 add examples
continuous-integration/drone/push Build is passing Details
10 months ago
TheSt1tch 16d5b6f104 update drone ci
continuous-integration/drone/push Build is passing Details
10 months ago
TheSt1tch 0711a24883 add
continuous-integration/drone/push Build is passing Details
10 months ago
TheSt1tch 4a04b3d4da add jacket and prowlarr
continuous-integration/drone/push Build is passing Details
10 months ago
TheSt1tch 920c24b1dc move from blog
continuous-integration/drone/push Build is passing Details
10 months ago
TheSt1tch 74d400c6a5 update modlist
continuous-integration/drone/push Build is passing Details
10 months ago
TheSt1tch 602d02ad91 fix
continuous-integration/drone/push Build is passing Details
10 months ago
TheSt1tch 4bff243739 update
continuous-integration/drone/push Build is passing Details
10 months ago
TheSt1tch 06c076d651 fix line number code
continuous-integration/drone/push Build is passing Details
11 months ago
TheSt1tch 2e35a35eb9 add Proxmox LXC Nvidia
continuous-integration/drone/push Build is passing Details
11 months ago
TheSt1tch fb15f3b2ec add plex
continuous-integration/drone/push Build is passing Details
11 months ago
TheSt1tch 2915ea31ca смена пути
continuous-integration/drone/push Build is passing Details
11 months ago
TheSt1tch b0f8159608 add plex pages
continuous-integration/drone/push Build is passing Details
11 months ago
TheSt1tch 6368802cd0 add jackett.md
continuous-integration/drone/push Build is passing Details
11 months ago
TheSt1tch 6a66859ad9 fixed
continuous-integration/drone/push Build is passing Details
11 months ago
TheSt1tch b5f0c9080f fix path
continuous-integration/drone/push Build is passing Details
11 months ago
TheSt1tch f9d2c49899 update and fixes
continuous-integration/drone/push Build is passing Details
11 months ago
TheSt1tch e81e358ffb update
continuous-integration/drone/push Build is passing Details
11 months ago
TheSt1tch a0693d8502 add ark se server yml
continuous-integration/drone/push Build is passing Details
11 months ago
TheSt1tch cc4d5ce811 fix
continuous-integration/drone/push Build is passing Details
12 months ago
TheSt1tch 00efd1c84b update
continuous-integration/drone/push Build is passing Details
12 months ago
TheSt1tch b5e439a951 rename docker to install
continuous-integration/drone/push Build is passing Details
12 months ago
TheSt1tch a0d03037fd fix
continuous-integration/drone/push Build is passing Details
12 months ago
TheSt1tch 1a60ff8e97 fixes
continuous-integration/drone/push Build is passing Details
12 months ago
TheSt1tch 047f4ea54a fix profiles docker compose
continuous-integration/drone/push Build is passing Details
12 months ago
TheSt1tch 0f576bee1d add Syncthing
continuous-integration/drone/push Build is passing Details
1 year ago
TheSt1tch 70f9c99926 исправление структуры
continuous-integration/drone/push Build is passing Details
1 year ago
TheSt1tch 053d69c8b2 обновление структуры
continuous-integration/drone/push Build is passing Details
1 year ago
TheSt1tch 0d18201b5e fix m
continuous-integration/drone/push Build is passing Details
1 year ago
TheSt1tch 0f4c7589a0 переработал страницу по traefik forward auth
continuous-integration/drone/push Build is passing Details
1 year ago
TheSt1tch b295d7b1b6 update
continuous-integration/drone/push Build is passing Details
1 year ago
TheSt1tch ae9f581b96 добавил установку hass на debian
continuous-integration/drone/push Build is passing Details
1 year ago
TheSt1tch 5de11dacd2 фикс отображения
continuous-integration/drone/push Build is passing Details
1 year ago
TheSt1tch a5737485f8 добавил настройку футера
continuous-integration/drone/push Build is passing Details
1 year ago
TheSt1tch 5d998fc2d3 фикс статьи
continuous-integration/drone/push Build is passing Details
1 year ago
TheSt1tch 1882948bbf добавил статьи
continuous-integration/drone/push Build is passing Details
1 year ago
TheSt1tch e2ed143d39 обновил структуру страниц в Docker - по алфавиту
continuous-integration/drone/push Build is passing Details
1 year ago
TheSt1tch a8fd8b2a76 update name docker socket proxy
continuous-integration/drone/push Build is passing Details
1 year ago
TheSt1tch f4a6ab8a46 add docker socket proxy
continuous-integration/drone/push Build is passing Details
1 year ago
thest1tch e4fb1f9a06 Merge pull request 'states/2023.12' (#10) from states/2023.12 into main
continuous-integration/drone/push Build is passing Details
Reviewed-on: #10
1 year ago

@ -5,13 +5,12 @@ name: build-home-docs
steps:
- name: build main
image: squidfunk/mkdocs-material:9.4.6
image: git.st1t.ru/thest1tch/mkdocs-material:latest
pull: if-not-exists
volumes:
- name: site
- name: site-st1tru
path: /site
commands:
- pip install -U -r ./requirements.txt
- mkdocs build
- cp -r site/ /site
- chown 1000:1000 /site
@ -23,10 +22,10 @@ steps:
- main
- name: build states
image: git.st1t.ru/thest1tch/mkdocs-material:v9.4.6
image: git.st1t.ru/thest1tch/mkdocs-material:latest
pull: if-not-exists
volumes:
- name: site
- name: site-dev
path: /site
commands:
- mkdocs build
@ -39,40 +38,10 @@ steps:
branch:
- states/*
- name: telgram_notify
image: appleboy/drone-telegram
when:
status:
#- success
- failure
settings:
# The secrets below can be entered from the Drone UI for this repo
token:
from_secret: telegram_token
to:
from_secret: telegram_chat_id
format: markdown
message: >
{{#success build.status}}
✅ Build #{{build.number}} of `{{repo.name}}` succeeded.
📝 Commit by {{commit.author}} on `{{commit.branch}}`:
```
{{commit.message}}
```
🌐 {{ build.link }}
{{else}}
❌ Build #{{build.number}} of `{{repo.name}}` failed.
📝 Commit by {{commit.author}} on `{{commit.branch}}`:
```
{{commit.message}}
```
🌐 {{ build.link }}
{{/success}}
volumes:
- name: site
host:
path: /opt/appdata/mkdocswiki
- name: site-st1tru
host:
path: /opt/appdata/nginx/st1t.ru
- name: site-dev
host:
path: /opt/appdata/nginx/dev.thest1tch.ru

@ -0,0 +1,18 @@
# docker pull squidfunk/mkdocs-material:latest
# docker build -t git.st1t.ru/thest1tch/mkdocs-material:latest -t git.st1t.ru/thest1tch/mkdocs-material:latest .
# docker push git.st1t.ru/thest1tch/mkdocs-material:latest
FROM squidfunk/mkdocs-material:latest
RUN apk add --no-cache py3-pip py3-pillow py3-cffi py3-brotli gcc musl-dev python3-dev pango build-base libffi-dev jpeg-dev libxslt-dev pngquant py3-cairosvg
RUN pip install \
mkdocs-material \
mkdocs-material-extensions>=1.1 \
mkdocs-minify-plugin>=0.2 \
mkdocs-git-revision-date-plugin==0.3.1 \
pymdown-extensions>=9.9.1 \
mkdocs-git-revision-date-localized-plugin \
mkdocs-glightbox \
mkdocs-blogging-plugin \
livereload

@ -1,367 +0,0 @@
---
draft: false
date: 2023-10-17
---
# Руководство по Traefik Forward Auth Простая защита через Google SSO
Хотите защитить свой стек Docker чем-то более надежным, чем обычная HTTP-аутентификация? Google OAuth2 SSO с Traefik Forward Auth — ваш выбор.
Я был очень удивлен, узнав, что образ Thomseddon [Traefik Forward Auth](https://github.com/thomseddon/traefik-forward-auth) может защитить мои службы в Docker. Этот образ обеспечивает вход и аутентификацию OAuth/SSO для обратного прокси-сервера Traefik с использованием Traefik.
<!-- more -->
> Почему Traefik Google OAuth2 для служб Docker?
>
> Google OAuth2 позволяет вам использовать свою учетную запись Google для входа в свои службы. Использование **Google OAuth с Traefik** позволит вам добавлять учетные записи в белый список, внедрять двухфакторную аутентификацию Google, а также обеспечивать единый вход (SSO) для ваших служб. Это не только обеспечивает удобство, поскольку вам не нужно часто входить в систему, но и повышает безопасность.
Добавление Traefik OAuth2 для ваших служб Docker будет простым шагом и важным дополнением к вашему стеку Docker Traefik.
## НАСТРОЙКА TRAEFIK FORWARD AUTH ПРИ ПОМОЩИ GOOGLE OAUTH2
Добавление базовой аутентификации, предоставляемой Traefik, — это самый простой способ защитить ваш Docker и другие службы.
В нашем предыдущем руководстве мы рассмотрели, как использовать учетные данные для входа .htpasswd и промежуточное ПО **Traefik auth middleware** для добавления базовой аутентификации с использованием меток.
Для одной службы это может быть полезно, но это быстро становится неудобным и утомительным, когда приходится входить в несколько служб и для каждого сеанса браузера.
После внедрения **Traefik forward authentication** теперь нужно войти в систему только один раз. И внедрив _Traefik OAuth2 с Google_, можно добавить двухфакторную аутентификацию (2FA), что делает этот метод намного более безопасным и удобным, чем использование обычной аутентификации.
Если вы предпочитаете частную self-hosted систему многофакторной аутентификации (а не полагаться на Google), обратите внимание на Authelia или Keycloak. Я использовал Authelia для ранее, а сейчас перешел на Keyсloak для управления несколькими пользователями. Traefik OAuth2 я использую для домашних проектов.
> ### Что такое OAuth?
>
> **OAuth** — открытый протокол (схема) [авторизации](https://ru.wikipedia.org/wiki/%D0%90%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F "Авторизация"), обеспечивающий предоставление третьей стороне ограниченный доступ к защищённым ресурсам пользователя без передачи ей (третьей стороне) логина и пароля [ Wikipedia](https://ru.wikipedia.org/wiki/OAuth)
Прежде чем настраивать Traefik Forward Auth с Google OAuth2, давайте посмотрим, как все это сочетается друг с другом.
### Как работает Google OAuth2 с Traefik?
Вход и аутентификация Google OAuth для Traefik действует как посредник для ваших служб, разрешая или запрещая доступ после проверки авторизованного файла cookie в вашем браузере. Подводя итог, процесс выглядит примерно так:
1. Для нашего хоста сделан **запрос** (например, https://traefik.example.com)
2. Запрос направляется нашим провайдером DNS на наш IP-адрес WAN, где порты 80 и 443 перенаправляются в контейнер Traefik.
3. Traefik видит входящий запрос и распознает, что **Forward Auth** определен в **метках** для этого хоста, поэтому запрос перенаправляется в контейнер **Traefik Forward Auth**.
4. Затем контейнер проверяет, есть ли в браузере авторизованный файл cookie. Если файл cookie отсутствует, запрос отправляется на **сервер авторизации Google OAuth2**.
5. После успешного входа в Google запрос отправляется на **URI перенаправления**, указанный для **веб-приложения** (https://oauth.example.com/_oauth).
6. Затем авторизованный файл cookie сохраняется в браузере, и пользователь отправляется во внутреннюю службу.
В следующий раз, когда этот браузер попытается получить доступ к службе, защищенной входом и аутентификацией на основе OAuth, файл cookie будет распознан, и пользователь будет перенаправлен на их службу без запроса на вход!
![](https://st1t.ru/wp-content/uploads/2022/11/traefik-forward-auth-google-flow-1024x654.png)
Этот процесс происходит очень быстро, и как только ваш браузер получит файл cookie, вы забудете, что даже включили Google OAuth с Traefik!
**Примечание.** Образ Traefik Forward Auth использует [**OpenID** **Connect**](https://en.wikipedia.org/wiki/OpenID_Connect) (**OIDC**),который представляет собой уровень аутентификации поверх протокола [OAuth 2.0](https://en.wikipedia.org/wiki/OAuth#OAuth_2.0 "OAuth"). Образ Docker, представленный в этом руководстве, поддерживает Google, а также [других поставщиков OIDC](https://github.com/thomseddon/traefik-forward-auth/wiki/Provider-Setup).
Позаботившись об основах, давайте перейдем к настройке прямой аутентификации Google OAuth Traefik для наших сервисов Docker.
> ### Как настроить OAuth?
>
> Настройка Google OAuth для Docker с помощью Traefik включает в себя 3 этапа:
>
> 1. создание записей DNS,
> 2. настройку службы Google OAuth2 и
> 3. изменение файлов компоновки Docker и добавление меток Traefik для активации прямой аутентификации.
Итак, во-первых, нам нужно настроить службу Traefik OAuth2. Давайте настроим все предварительные условия сейчас:
### Шаг 1. Создайте записи DNS
Начните с создания новой DNS-записи CNAME для нашей службы OAuth (Google перенаправит на этот адрес после аутентификации). В этом руководстве мы будем использовать доменное имя **example.com**.
Установите запись DNS как **oauth.example.com**. На рисунках ниже показан скриншот из Cloudflare. В зависимости от вашего провайдера DNS, для вас все может выглядеть по-разному, но по сути иметь одно и то же содержание.
![](https://st1t.ru/wp-content/uploads/2022/11/01-clouldflare-dns-for-google-oauth-1024x367.png)
Обратите внимание, что для распространения и активации записей DNS может потребоваться несколько часов.
В качестве альтернативы, если вы включили запись CNAME с подстановочными знаками, указывающую на ваш корневой домен, вы можете пропустить этот шаг.
### Шаг 2. Настройте службу Google OAuth2
Создав записи DNS, давайте перейдем к настройке Google OAuth.
#### Шаг 2.1. Создайте проект Google.
Нам нужно создать **проект Google**, который будет содержать наше **веб-приложение**, **экран согласия** и **учетные данные**.
Перейдите в [Google Cloud Developers Console](https://console.developers.google.com/) и убедитесь, что вы вошли в правильный аккаунт Google, который хотите использовать (обычно это будет ваш адрес электронной почты).
**Примечание.** Выйдите из других активных аккаунтов Google, чтобы убедиться, что на каждом этапе используется правильный аккаунт.
При появлении запроса вам нужно будет согласиться с **Условиями использования Google Cloud Platform**, чтобы использовать их API.
Сервис OAuth от Google можно использовать бесплатно, поэтому пока мы можем **отказаться** от бесплатной пробной версии. Нажмите «**Select a project**» и «**New project**».
![](https://st1t.ru/wp-content/uploads/2022/11/02-google-cloud-oauth-create-new-project-1024x498.png)
Введите уникальное имя для идентификации проекта, например **“Traefik Authentication”**. Нажмите **Create**.
![](https://st1t.ru/wp-content/uploads/2022/11/03-google-cloud-oauth-new-project-details.png)
#### Шаг 2.2. Создайте учетные данные OAuth
Теперь, когда наш проект создан, нам нужно создать идентификатор клиента и секрет клиента, чтобы пройти аутентификацию в Google. Выберите наш проект **Traefik Authentication** и в меню навигации выберите **APIs & Services > Credentials**. Нажмите **Create Credentials > OAuth client ID**.
![](https://st1t.ru/wp-content/uploads/2022/11/04-google-cloud-oauth-create-oauth-client-id.png)
#### Шаг 2.3: Настройте Consent Screen
После того, как вы нажмете Идентификатор клиента OAuth, вы увидите примечание о настройке consent screen, как показано ниже. Перед продолжением необходимо настроить consent screen.
После того, как вы нажмете **OAuth Client ID**, вы увидите примечание о настройке consent screen, как показано ниже. Перед продолжением необходимо настроить consent screen.
![](https://st1t.ru/wp-content/uploads/2022/11/05-google-cloud-oauth-configure-consent-screen.png)
Если автоматический запрос не появится, выберите **OAuth consent screen** на левой панели.
Далее выберите тип пользователей приложения. Выбираем тип **External** и нажимаем **Create**.
![](https://st1t.ru/wp-content/uploads/2022/11/06-google-cloud-oauth-consent-screen-type.png)
Выберите имя для своего приложения, например **Traefik Auth**, затем в разделе **Authorized domains** введите свой домен, например **example.com**. Убедитесь, что вы нажимаете **Enter**, чтобы добавить его, а затем нажмите **Save**.
![](https://st1t.ru/wp-content/uploads/2022/11/07-google-cloud-oauth-consent-screen.png)
После нажатия кнопки **Save** вы перейдете на следующий шаг. Везде нажимаем снизу **Save and Continue**.
#### **Шаг 2.4. Создайте идентификатор клиента OAuth.**
Выберите наш проект **Traefik Authentication** и в меню навигации выберите **APIs & Services > Credentials**. Нажмите **Create Credentials > OAuth client ID**.
Теперь выберите тип **Web Application** и введите имя для своего веб-приложения, например, **Traefik**. Кроме того, вам потребуется ввести **Authorized redirect URI** в виде _https://oauth.example.com/_oauth_. Убедитесь, что вы нажимаете **Enter**, чтобы добавить его, а затем нажмите **Save**.
**Примечание.** Вам разрешено добавлять только **URI перенаправления**, которые ведут на ваши **авторизованные домены**. Вернитесь к экрану согласия OAuth, если вам нужно их отредактировать.
![](https://st1t.ru/wp-content/uploads/2022/11/08-oauth-authorized-redirect-uris.png)
Учетные данные для нашего единого входа для Docker созданы! Скопируйте и сохраните **client ID** и **client secret**; нам нужно будет использовать их на следующем шаге.
![](https://st1t.ru/wp-content/uploads/2022/11/09-oauth-client-id-and-secret.png)
### Шаг 3. Настройте прямую аутентификацию Traefik с помощью OAuth2
Теперь, когда учетные данные OAuth настроены, осталось настроить контейнер OAuth. Войдите на свой локальный компьютер или используйте SSH-клиен для удаленного входа.
Обязательно остановите Traefik (при необходимости) и отредактируйте файл docker-compose, добавив метки Traefik и контейнер OAuth, как описано ниже.
Предполагается, что вы уже прочитали и выполнили большую часть моего руководства по Traefik 2 и читаете этот пост только для того, чтобы внедрить Google OAuth.
#### Шаг 3.1. Создайте промежуточное ПО Traefik Auth и цепочку
Давайте теперь укажем промежуточное ПО для аутентификации Traefik для OAuth2. Создайте новый файл middlewares-oauth.yml и добавьте следующие строки:
```yaml
http:
middlewares:
middlewares-oauth:
forwardAuth:
address: "http://oauth:4181" # Make sure you have the OAuth service in docker-compose.yml
trustForwardHeader: true
authResponseHeaders:
- "X-Forwarded-User"
```
Кроме того, давайте создадим новую цепочку промежуточного программного обеспечения для сервисов, которые будут использовать Google OAuth. Откройте файл **middleware-chains.yml**, созданный в моем руководстве по Traefik, и добавьте следующие строки ниже того, что уже есть:
```yaml
http:
middlewares:
chain-oauth:
chain:
middlewares:
- middlewares-rate-limit
- middlewares-https-redirectscheme
- middlewares-secure-headers
- middlewares-oauth
- middlewares-compress
```
**Примечание:** Промежуточное ПО для ограничения скорости, перенаправления HTTPS, заголовков безопасности и сжатия должно быть определено в соответствии с моим руководством Traefik. В противном случае Traefik не запустится.
Сохраните файлы и выйдите из редактирования.
#### Шаг 3.2: Добавьте секреты прямой аутентификации Traefik
Вместо того, чтобы создавать несколько секретов, мы создадим один секретный файл для прямой аутентификации Traefik, который будет содержать все учетные данные.
Создайте файл с именем **traefik_forward_auth** в папке **secrets** ($DOCKERDIR\secrets, если ваша установка основана на моих руководствах) и добавьте в него следующее содержимое:
```
providers.google.client-id=yourGOOGLEclientID
providers.google.client-secret=yourCLIENTsecret
secret=yourOAUTHsecret
whitelist=yourEMAILaddress1
whitelist=yourEMAILaddress2
```
Настройте вышеуказанное, используя информацию ниже:
- **yourGOOGLEclientID** и **yourCLIENTsecret**: полученные ранее в этом руководстве по Traefik Oauth2.
- **yourOAUTHsecret**: используется для подписи файла cookie и должен быть случайным. Создайте случайный секрет с помощью:
`openssl rand -hex 16`
Кроме того, вы можете использовать [онлайн-сервис, подобный этому](https://www.browserling.com/tools/random-string), для создания случайного секрета.
![](https://st1t.ru/wp-content/uploads/2022/11/10-random-secret.png)
- **yourEMAILAddress1**: идентификатор электронной почты Google, который будет использоваться для аутентификации. При желании вы можете добавить дополнительные адреса электронной почты, которым разрешено проходить аутентификацию (например, **yourEMAILAddress2**; удалите эту строку, если вы хотите разрешить только один идентификатор электронной почты).
Сохранить и выйти.
Обратите внимание, что папка **secrets** и файл **traefik_forward_auth** должны иметь разрешение **600** и принадлежать пользователю **root**.
Далее давайте настроим контейнер OAuth Forwarder.
#### Шаг 3.3: Добавляем OAuth Forwarder контейнер
Откройте файл docker-compose, который был создан на основе нашего предыдущего руководства по Traefik 2, и добавьте в него следующее.
# Google OAuth - Single Sign On using OAuth 2.0
```yaml
version: '3.7'
services:
oauth:
container_name: oauth
image: thomseddon/traefik-forward-auth:latest
restart: unless-stopped
security_opt:
- no-new-privileges:true
environment:
- CONFIG=/config
- COOKIE_DOMAIN=$DOMAINNAME_CLOUD_SERVER
- INSECURE_COOKIE=false
- AUTH_HOST=oauth.$DOMAINNAME_CLOUD_SERVER
- URL_PATH=/_oauth
- LOG_LEVEL=info
- LOG_FORMAT=text
- LIFETIME=86400 # 1 day
- DEFAULT_ACTION=auth
- DEFAULT_PROVIDER=google
secrets:
- source: traefik_forward_auth
target: /config
labels:
- "traefik.enable=true"
## HTTP Routers
- "traefik.http.routers.oauth-rtr.tls=true"
- "traefik.http.routers.oauth-rtr.entrypoints=https"
- "traefik.http.routers.oauth-rtr.rule=Host(`oauth.$DOMAINNAME_CLOUD_SERVER`)"
## Middlewares
- "traefik.http.routers.oauth-rtr.middlewares=chain-oauth@file"
## HTTP Services
- "traefik.http.routers.oauth-rtr.service=oauth-svc"
- "traefik.http.services.oauth-svc.loadbalancer.server.port=4181"
```
**$DOMAINNAME_CLOUD_SERVER** = имя вашего домена в файле .env
Обратите внимание, что мы используем цепочку промежуточного программного обеспечения аутентификации Traefik (**chain-oauth**) для аутентификации вместо базовой аутентификации. Используйте правильный образ для архитектуры вашей системы.
Вы также можете изменить продолжительность (**LIFETIME**), в течение которой аутентификация действительна, с 1 дня, указанного в секундах, на другую продолжительность. Сначала установите **LOG_LEVEL** для **trace** или **debug**. Когда все заработает, вы можете изменить его на **warn**.
При желании остальные переменные среды, определенные для oauth , можно настроить по своему вкусу (если вы знаете, что делаете).
После этого используйте команду docker-compose up. Теперь вы должны быть перенаправлены на страницу входа в систему Google OAuth перед доступом к службе.
#### Шаг 3.4. Добавление Google OAuth для служб Docker
Возьмем пример панели инструментов Traefik 2. Если вы следовали моему руководству по Traefik, теперь у вас должна быть базовая аутентификация с использованием промежуточного программного обеспечения:
```
## Middlewares
- "traefik.http.routers.traefik-rtr.middlewares=middlewares-basic-auth@file"
```
Или цепочка промежуточного программного обеспечения:
```
- "traefik.http.routers.traefik-rtr.middlewares=chain-basic-auth@file"
```
Мы уже определили цепочку промежуточного программного обеспечения для Traefik oauth (**chain-oauth**) выше.
Перейти с базовой аутентификации на oauth теперь так же просто, как изменить **chain-basic-auth** на **chain-oauth** в файле **docker-compose** (показано ниже).
```
- "traefik.http.routers.traefik-rtr.middlewares=chain-oauth@file"
```
Итак, вот и все, вход и аутентификация на основе OAuth для стека обратного прокси-сервера Traefik.
После этого используйте команду **docker-compose up**.
#### Шаг 3.5. Добавление OAuth в другие (не Docker) службы
Приложениями, не относящимися к Docker, могут быть любые службы, находящиеся в хост-системе или в удаленной системе.
Поставщик файлов Traefik позволяет нам добавлять динамические маршрутизаторы, промежуточное ПО и службы. Раньше мы использовали наш каталог rules только для добавления промежуточного программного обеспечения, но мы можем легко добавить внешний хост, добавив новый файл в этот каталог. Traefik автоматически обнаружит и обновит свои конфигурации.
Давайте для примера возьмем сервис ex1, работающий на другом хосте (192.168.1.100).
Чтобы добавить к сервису возможность аутентификации Traefik OAuth2, вам нужно всего лишь создать промежуточное ПО маршрутизатора, как показано ниже.
```
http:
routers:
ex1-rtr:
rule: "Host(`ex1.{{env "DOMAINNAME_CLOUD_SERVER"}}`)"
entryPoints:
- https
middlewares:
- chain-oauth
service: ex1-svc
tls:
certResolver: dns-cloudflare
services:
ex1-svc:
loadBalancer:
servers:
- url: "http://192.168.1.100:80" # or whatever your external host's IP:port is
```
Интерфейс ex1 будет доступен по адресу **ex1.example.com**, при условии, что для переменной среды **DOMAINNAME_CLOUD_SERVER** установлено значение **example.com** и она передается в контейнер Traefik.
Поскольку каталог rules является динамическим, просто добавив этот файл в этот каталог, мы создали маршрут. Вы должны иметь возможность подключиться к ex1 через Google OAuth2 без перезапуска Traefik!
## ОБХОД OAUTH / ВЫБОРОЧНАЯ АУТЕНТИФИКАЦИЯ
Некоторые приложения не могут аутентифицировать себя и пройти через авторизацию Oauth. Для этого есть обход Oauth на основе правил [Auth Forwarder GitHub](https://github.com/thomseddon/traefik-forward-auth).
Вы можете обойти аутентификацию на основе определенных ключей в заголовках, регулярных выражениях, хосте, пути, запросе и многом другом.
**Примечание.** Используя неправильно указанное правило, вы можете легко отключить аутентификацию, когда не собираетесь этого делать. Поэтому я настоятельно рекомендую конкретные и узкие правила обхода аутентификации.
### Определение правила обхода
Как мы можем выяснить, какие конкретные правила использовать?
Это может быть довольно сложно. Как указано в приведенной ниже ссылке, общий способ обхода аутентификации — использование пути.
Но это может ослабить безопасность, и я рекомендую установить определенные правила. Например, если в заголовке запроса содержится ключ API, аутентификация будет пропущена.
Проверьте журналы Docker для контейнера OAuth (основные команды Docker). Это выдаст почти все, что происходит в этом контейнере, что может быть ошеломляющим. Вы можете сократить это до интересующего вас приложения, введя команду grep ****.
### Указание правила обхода OAuth
Обратите внимание, что **uri** в логах может содержать ключ API (X-Api-Key:[apikey]). Таким образом, вы можете установить использование обхода на основе этого следующим образом. На примере файла middleware сервиса ex1:
В строчку
```
rule: "Host(`ex1.{{env "DOMAINNAME_CLOUD_SERVER"}}`)"
```
Дописываем
```
rule: "Host(`ex1.{{env "DOMAINNAME_CLOUD_SERVER"}}`) && Headers(`X-Api-Key`, `$API_KEY`)"
```
Перезапустите контейнер OAuth и попробуйте сейчас получить доступ к ex1 через приложение и браузер. Браузер должен представить логин OAuth, а приложение должно направить вас напрямую к сервису.
### Использование пользовательских заголовков
Некоторые приложения позволяют добавлять собственные заголовки. Поэтому, когда приложение пытается связаться с вашим Radarr, Sonarr и т. д., может быть отправлен собственный заголовок.
Затем этот настраиваемый заголовок можно отслеживать и, если он присутствует, можно использовать для запуска обхода. Это альтернатива поиску ключей API. Вы можете установить один стандартный заголовок для всех приложений и использовать для всех одно и то же правило обхода. Это также устраняет догадки и пробы и ошибки, описанные выше.
## OAUTH И ЗАГОЛОВКИ БЕЗОПАСНОСТИ
Одна вещь, которую следует отметить при использовании службы **Traefik OAuth2**, — это ваши заголовки безопасности. Если служба использует **OAuth** и вы пытаетесь проверить, применяются ли ваши заголовки безопасности, вы, вероятно, получите более низкую оценку.
## FAQ
### **Что такое traefik-forward-auth-provider?**
Прямая аутентификация Traefik — это служба, которая интегрируется со сторонним поставщиком аутентификации (например, Google, Microsoft, Authelia и т. д.) для защиты ваших служб и веб-приложений.
### **В чем разница между OIDC и OAuth?**
OIDC или OpenID Connect (OIDC) — это протокол аутентификации. Это набор спецификаций, основанный на OAuth 2.0, который добавляет дополнительные функции. По сути, OIDC — это аутентичный протокол, а OAuth — набор спецификаций для доступа к ресурсам и их совместного использования.
### Существуют ли другие (более частные) альтернативы Google OAuth?
Да. [Authelia](https://github.com/authelia/authelia) и [Keycloak](https://github.com/keycloak/keycloak) два, о которых я могу вспомнить. ИМХО, Authelia была намного проще в настройке, чем Keycloak. Существует также [Authentik](https://goauthentik.io/).

@ -1,14 +1,15 @@
# Docker Compose Profile - профили
Те, кто юзает docker-compose, обычно делятся на 2 типа:
- пихаем все в 1 файл на каждый хост
- пихаем в разные файлы с какой-то логикой
Что, если я напишу, что можно совместить эти 2 типа людей. 1 файл, но с разбивкой по профилям с какой-то логикой. Звучи правда классно?
А что если я напишу, что можно совместить эти 2 типа людей. Один файл, но с разбивкой по профилям с какой-то логикой. Звучит правда классно?
Возьмем классический монолитный файл docker-compose:
```yaml title="docker-compose.yaml"
```yaml title="docker-compose.yml"
version: "3.9"
services:
nginx1:
@ -38,12 +39,11 @@ user@test tmp % docker-compose --profile test up -d
⠿ Container nginx3 Started
```
Пример выше показывает, что были запущены только сервисы, с профилем `test`. Больше информации можно найти в [документации Docker](https://blog.ktz.me/monolithic-docker-compose-files-filtered-by-labels/#:~:text=%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D0%B8%20Docker%20.) .
!!! note
Пример выше показывает, что были запущены только сервисы, с профилем `test`. Больше информации можно найти в [документации Docker](https://docs.docker.com/compose/profiles/) .
Eсли включаем профиль, то простой вариант docker-compose up -d не выполнится:
!!! note
Eсли включаем профиль, то простой вариант `docker-compose up -d` не выполнится:
```bash
user@test tmp % docker-compose up -d
no service selected

@ -0,0 +1,107 @@
# Dockge
![](../images/docker/dockge.svg){: style="height:150px;width:150px"}
[![](https://img.shields.io/github/stars/louislam/dockge?label=%E2%AD%90%20Stars&style=flat-square)](https://github.com/louislam/dockge)
[![](https://img.shields.io/github/v/release/louislam/dockge?label=%F0%9F%9A%80%20Release&style=flat-square)](https://github.com/louislam/dockge/releases/latest)
[![Docker Pulls](https://img.shields.io/docker/pulls/louislam/dockge.svg?maxAge=60&style=flat-square)](https://hub.docker.com/r/louislam/dockge/)
Стильный, простой и быстрый self-hosted менеджер Docker Compose менеджер.
![](../images/docker/dockge01.png)
## ⭐ Возможности
- 🧑‍💼 Управление `compose.yaml` файлом
- Создание/Редактирование/Запуск/Остановка/Перезапуск/Удаление
- Обновление Docker образов
- ⌨️ Интерактивный редактор для `compose.yaml`
- 🦦 Интерактивный Web-терминал
- 🕷️ (1.4.0 🆕) Поддержка нескольких инстансов - Можно управлять несколькими стаками на разных Docker хостах через один интерфейс
- 🏪 Преобразование `docker run ...` команд в `compose.yaml`
- 📙 Файловая структура - Dockge не меняет изначальные файлы, они хранятся на диске как обычно. Можно взаимодействовать с ними, используя обычные `docker compose` команды
- 🚄 Быстрый - Прогресс (Pull/Up/Down) и вывод терминала в режиме реального времени
- 🐣 Простой в использовании и стильный пользовательский интерфейс.
## 🔧 Установка
Требования:
- [Docker](https://docs.docker.com/engine/install/) 20+ / Podman
- (Podman only) podman-docker (Debian: `apt install podman-docker`)
- OS:
- Основные дистрибутивы Linux могут запускать Docker/Podman, например:
- ✅ Ubuntu
- ✅ Debian (Bullseye или новее)
- ✅ Raspbian (Bullseye или новее)
- ✅ CentOS
- ✅ Fedora
- ✅ ArchLinux
- Arch: armv7, arm64, amd64 (a.k.a x86_64)
### Основы
- Папка хранения стеков: `/opt/stacks`
- Порт: 5001
```
# Create directories that store your stacks and stores Dockge's stack
mkdir -p /opt/stacks /opt/dockge
cd /opt/dockge
# Download the compose.yaml
curl https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml --output compose.yaml
# Start the server
docker compose up -d
# If you are using docker-compose V1 or Podman
# docker-compose up -d
```
Dockge будет запущен по адресу http://localhost:5001
### Углубленный
```yaml
services:
dockge:
image: louislam/dockge:1
restart: unless-stopped
ports:
# Host Port : Container Port
- 5001:5001
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data:/app/data
# If you want to use private registries, you need to share the auth file with Dockge:
# - /root/.docker/:/root/.docker
# Stacks Directory
# ⚠️ READ IT CAREFULLY. If you did it wrong, your data could end up writing into a WRONG PATH.
# ⚠️ 1. FULL path only. No relative path (MUST)
# ⚠️ 2. Left Stacks Path === Right Stacks Path (MUST)
- /opt/stacks:/opt/stacks
environment:
# Tell Dockge where is your stacks directory
- DOCKGE_STACKS_DIR=/opt/stacks
```
## Обновление
```bash
cd /opt/dockge
docker compose pull && docker compose up -d
```
## Скриншоты
![](https://github.com/louislam/dockge/assets/1336778/e7ff0222-af2e-405c-b533-4eab04791b40)
![](https://github.com/louislam/dockge/assets/1336778/7139e88c-77ed-4d45-96e3-00b66d36d871)
![](https://github.com/louislam/dockge/assets/1336778/f019944c-0e87-405b-a1b8-625b35de1eeb)
![](https://github.com/louislam/dockge/assets/1336778/a4478d23-b1c4-4991-8768-1a7cad3472e3)

@ -33,3 +33,65 @@ services:
- DRONE_RUNNER_NAME=whatsinaname
restart: unless-stopped
```
## Примеры
### Нотификация в telegram
```yaml
- name: telgram_notify
image: appleboy/drone-telegram
when:
status:
#- success
- failure
settings:
# The secrets below can be entered from the Drone UI for this repo
token:
from_secret: telegram_token
to:
from_secret: telegram_chat_id
format: markdown
message: >
{{#success build.status}}
✅ Build #{{build.number}} of `{{repo.name}}` succeeded.
📝 Commit by {{commit.author}} on `{{commit.branch}}`:
```
{{commit.message}}
```
🌐 {{ build.link }}
{{else}}
❌ Build #{{build.number}} of `{{repo.name}}` failed.
📝 Commit by {{commit.author}} on `{{commit.branch}}`:
```
{{commit.message}}
```
🌐 {{ build.link }}
{{/success}}
```
### Сборка mcdocs
```yaml
- name: build states
image: squidfunk/mkdocs-material:latest:latest
pull: if-not-exists
volumes:
- name: site
path: /site
commands:
- mkdocs build
- cp -r site/ /site
- chown 1000:1000 /site
- chmod -R 777 /site
when:
event:
- push
branch:
- states/*
volumes:
- name: site
host:
path: /opt/appdata/mkdocswiki
```

@ -0,0 +1,21 @@
# Ошибки в Docker
## WARNING: Error loading config file
При выполнении любой команды, например `docker run --rm -ti ubuntu:14.04 /bin/bash` выдаетс ошибка
```
WARNING: Error loading config file:/home/username/.docker/config.json - stat /home/username/.docker/config.json: permission denied
```
Причина: нарушена пренадлежность файла `config.json`
Решение: восстановить принадлежность файла:
```
sudo chown $USER /home/username/.docker/config.json
```
или каталога:
```
sudo chown -R $USER /home/username/.docker
```

@ -0,0 +1,50 @@
# ARK: Survival Evolved - Dedicated Server
```yaml title="docker-compose.yml"
version: '3.7'
services:
ark-server:
restart: always
container_name: ark-server
image: hermsi/ark-server:latest
volumes:
- ./ark-server:/app #main location for game server
- ./ark-server-backups:/home/steam/ARK-Backups # folder for backup
environment:
- SESSION_NAME=$SESSION_NAME
- SERVER_MAP=$SERVER_MAP
- SERVER_PASSWORD=$SERVER_PASSWORD
- ADMIN_PASSWORD=$ADMIN_PASSWORD
- MAX_PLAYERS=$MAX_PLAYERS
- UPDATE_ON_START=$UPDATE_ON_START
- BACKUP_ON_STOP=$BACKUP_ON_STOP
- PRE_UPDATE_BACKUP=$PRE_UPDATE_BACKUP
- WARN_ON_STOP=$WARN_ON_STOP
- GAME_MOD_IDS=$GAME_MOD_IDS
ports:
# Port for connections from ARK game client
- "7777:7777/udp"
# Raw UDP socket port (always Game client port +1)
- "7778:7778/udp"
# RCON management port
- "27020:27020/tcp"
# Steam's server-list port
- "27015:27015/udp"
```
```env title=".env"
SESSION_NAME="ark server"
SERVER_MAP=Viking_P
SERVER_PASSWORD=
ADMIN_PASSWORD=strong-password
MAX_PLAYERS=10
UPDATE_ON_START=true
BACKUP_ON_STOP=true
PRE_UPDATE_BACKUP=false
WARN_ON_STOP=true
GAME_MOD_IDS="id_mods_1,id_mods_2"
```
ссылки на моды, что я юзаю на своем сервере:
1838617463,520879363,889745138,1404697612,1814953878,731604991,2804332920,2718221803,1762210129,2765267311,1251632107,1565015734,821530042,2121156303,702828089,741203089,898049820

@ -0,0 +1,232 @@
# Grafana
Для запуска будет использовать Docker Compose. Я предпологаю, что уже есть настроенное окружение с Docker Compose, если нет, то сделать можно в [инструкции](../install.md).
Grafana — один из самых популярных инструментов мониторинга. В сочетании с Prometheus, Grafana предлагает мощный инструмент визуализации данных временных рядов.
Чтобы запустить Prometheus и Grafana с помощью docker compose, нам нужно создать файл docker compose, определяющий отдельные сервисы (Prometheus и Grafana), используемые образы, запущенные порты и все остальное необходимое.
Использование постоянных томов с Docker Compose
Нам нужно учитывать тот факт, что для Grafana требуется файл конфигурации и файл источника данных. Promemetheus также требует файла конфигурации. Для этого мы будем использовать смонтированные тома (постоянные тома), чтобы можно было легко вносить изменения в файлы, когда это необходимо.
Создайте рабочий каталог с именем prometheus-grafana и внутри него создайте каталоги для хранения файлов конфигурации Prometheus и Grafana.
mkdir -p ~/prometheus-grafana/{grafana,prometheus}
Теперь перейдите в каталог grafana и создайте файлы конфигурации. Файл конфигурации Grafana по умолчанию предоставляется в официальном репозитории Github. Создайте файл с именем grafana.ini, скопируйте и вставьте конфигурацию grafana по умолчанию в этот файл и сохраните.
Контент для конфигурации Grafana по умолчанию можно найти по адресу https://github.com/grafana/grafana/blob/master/conf/defaults.ini . Обратите внимание, что вы можете вносить изменения в файл конфигурации по умолчанию в соответствии с вашими потребностями.
wget https://raw.githubusercontent.com/grafana/grafana/main/conf/defaults.ini -O ~/prometheus-grafana/grafana/grafana.ini vim ~/prometheus-grafana/grafana/grafana.ini
После этого перейдите в папку Prometheus и создайте файл конфигурации prometheus, чтобы указать Prometheus, где брать метрики. Поскольку у меня нет отдельного сервера для мониторинга, отображаемые метрики относятся к самому серверу prometheus (localhost:9090)
```bash
nano ~/prometheus-grafana/prometheus/prometheus.yml
```
```yaml
global:
scrape_interval: 15s
scrape_timeout: 10s
evaluation_interval: 15s
alerting:
alertmanagers:
static_configs:
targets: []
scheme: http
timeout: 10s
api_version: v1
scrape_configs:
job_name: prometheus
honor_timestamps: true
scrape_interval: 15s
scrape_timeout: 10s
metrics_path: /metrics
scheme: http
static_configs:
targets:
localhost:9090
```
Вы можете открыть и изменить файл в соответствии с вашим вариантом использования.
nano ~/prometheus-grafana/prometheus/prometheus.yml
На данный момент Grafana не показывает, откуда брать данные. Нам нужно сказать ему, чтобы он достался от Прометея. Создайте файл с именем datasource.yml в каталоге grafana.
nano ~/prometheus-grafana/grafana/datasource.yml
apiVersion: 1
datasources:
name: Prometheus
type: prometheus
url: http://localhost:9090
isDefault: true
access: proxy
editable: true
Дальнейшая модификация может быть выполнена:
nano ~/prometheus-grafana/grafana/datasource.yml
К настоящему времени у нас готовы все тома. Давайте продолжим, чтобы создать файл docker-compose.
nano ~/prometheus-grafana/docker-compose.yml
Содержимое должно выглядеть так, как показано ниже. Убедитесь, что вы изменили путь к файлам конфигурации в соответствии с путями в вашей системе.
version: "3.7"
networks:
direct_net:
name: direct_net
driver: bridge
ipam:
config:
subnet: 192.168.200.0/24
services:
prometheus:
user: "$PUID:$PGID"
container_name: prometheus
image: prom/prometheus:latest
restart: always
networks:
direct_net
ulimits:
nofile:
soft: 200000
hard: 200000
command:
--config.file=/data/prometheus.yml
--storage.tsdb.path=/data
--storage.tsdb.retention.time=180d
--web.enable-admin-api
volumes:
$DOCKER_APP/prometheus:/data
/etc/timezone:/etc/timezone:ro
/etc/localtime:/etc/localtime:ro
grafana:
user: "$PUID:$PGID"
container_name: grafana
image: grafana/grafana:latest
restart: always
networks:
direct_net
security_opt:
no-new-privileges:true
environment:
GF_INSTALL_PLUGINS: "grafana-clock-panel,grafana-simple-json-datasource,grafana-worldmap-panel,grafana-piechart-panel"
volumes:
~/prometheus-grafana/grafana/data:/var/lib/grafana
/etc/timezone:/etc/timezone:ro
/etc/localtime:/etc/localtime:ro
Если вам нужно указать конкретную версию Prometheus или Grafana, вы можете добавить номер версии, чтобы он выглядел так:
services:
prometheus:
image: prom/prometheus:#get tag https://hub.docker.com/r/prom/prometheus/tags
grafana:
image: grafana/grafana:# Tags https://hub.docker.com/r/grafana/grafana/tags
Также целью создания стека Prometheus/Grafana является мониторинг других сервисов, работающих, возможно, на разных серверах. Prometheus использует разные экспортеры для предоставления метрик, связанных с аппаратным обеспечением и ядром, в зависимости от отслеживаемого вами сервиса, наиболее распространенным из которых является node-exporter. Экспортеры устанавливаются на хостах, за которыми нужно следить.
Поскольку у меня нет другого внешнего сервера, я собираюсь установить экспортер узлов на локальном компьютере. Для этого в конец файла ~/prometheus-grafana/docker-compose.yml добавляем:
node-exporter:
image: prom/node-exporter:latest
container_name: monitoring_node_exporter
restart: unless-stopped
expose:
9100
Также я должен обновить файл prometheus.yml, чтобы добавить node-exporter в качестве цели.
static_configs:
targets: ['localhost:9090','node-exporter:9100']
Или формат:
static_configs:
targets:
localhost:9090
node-exporter:9100
Если у вас есть другие экспортеры из других сервисов, вы можете добавить в массив по подобию.
Запуск контейнеров с помощью docker-compose
Перейдите в каталог данных:
cd ~/prometheus-grafana
Теперь все готово для запуска наших контейнеров. Чтобы запустить контейнеры, выполните команду, как показано ниже:
docker compose up -d
Проверте запуск контейнеров:
docker compose ps
Получите доступ к Prometheus и grafana из браузера, используя порты по умолчанию. Для Прометея мы используем http://serverip_or_hostname:9090. Если вы перейдете к status -> target , вы сможете увидеть статус своих целей, как показано ниже :
Для Grafana зайдите http://serverip_or_hostname:3000и войдите в систему, используя имя пользователя и пароль, указанные в .ini файле конфигурации. Учетные данные по умолчанию: admin:admin
Теперь вы можете продолжить и создать информационную панель для мониторинга. Одна вещь, которую я отметил, заключается в том, что я не мог получить метрики для использования при создании графиков, когда «доступ» в разделе «HTTP» источников данных был установлен на «сервер». Мне пришлось установить его как «браузер», как показано ниже:

@ -0,0 +1,3 @@
# Prometheus
Prometheus — это база данных временных рядов, использующая экспортеры для мониторинга различных серверов/сервисов

@ -1,12 +1,12 @@
# Homarr - дашборд для быстрого доступа к сервисам.
[![](https://img.shields.io/github/stars/ajnart/homarr?label=%E2%AD%90%20Stars)](https://github.com/ajnart/homarr)
[![](https://img.shields.io/github/v/release/ajnart/homarr?label=%F0%9F%9A%80%20Release)](https://github.com/ajnart/homarr/releases/latest)
[![](https://img.shields.io/github/stars/ajnart/homarr?label=%E2%AD%90%20Stars&style=flat-square)](https://github.com/ajnart/homarr)
[![](https://img.shields.io/github/v/release/ajnart/homarr?label=%F0%9F%9A%80%20Release&style=flat-square)](https://github.com/ajnart/homarr/releases/latest)
[![](https://img.shields.io/badge/Demo-purple)](https://demo.homarr.dev/ru)
Современная панель управления домашней лабой. Позваоляет видеть все, что поднято.
Современная панель управления домашней лабой. Позволяет видеть все, что поднято.
![](../images/docker/homarr.png)
## Запуск через Docker

@ -0,0 +1,27 @@
# Homepage
[![](https://img.shields.io/github/stars/gethomepage/homepage?label=%E2%AD%90%20Stars&style=flat-square)](https://github.com/gethomepage/homepage)
[![](https://img.shields.io/github/v/release/gethomepage/homepage?label=%F0%9F%9A%80%20Release&style=flat-square)](https://github.com/gethomepage/homepage/releases/latest)
Современная, полностью статичная, быстрая, безопасная, полностью прокси-серверная, легко настраиваемая панель управления приложениями с интеграцией более чем 100 сервисов и переводом на несколько языков. Легко настраивается с помощью файлов YAML или с помощью обнаружения меток Docker.
![](../images/docker/homepage-1.png)
## Запуск через Docker Compose
```yaml
version: "3.3"
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
environment:
PUID: 1000 #-- optional, your user id
PGID: 1000 #-- optional, your group id
ports:
- 3000:3000
volumes:
- /path/to/config:/app/config # Make sure your local config directory exists
- /var/run/docker.sock:/var/run/docker.sock:ro # optional, for docker integrations
restart: unless-stopped
```

@ -6,15 +6,26 @@ Docker , также известный как Docker Engine, представл
На материнских платах AMD AMD-V включен по умолчанию. Однако на материнских платах Intel вам нужно будет вручную включить VT-x из BIOS/UEFI.
!!! tip "Скрипт для автоустановки Docker и Docker Compose"
```bash
curl -fsSL get.docker.com | sh
```
Установится последняя версия. После этого, дальнейшие шаги можно не делать.
## Шаг 1. Обновите и установите зависимости Docker
Во-первых, давайте обновим список наших пакетов и установим необходимые зависимости Docker.
`sudo apt update`
```bash
sudo apt update
```
Затем используйте следующую команду для установки зависимостей или необходимых пакетов.
`sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release`
```bash
sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release
```
## Шаг 2. Добавьте репозиторий Docker в источники APT
@ -59,7 +70,9 @@ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin
Есть много способов проверить, работает ли Docker в Ubuntu. Один из способов — использовать следующую команду:
`sudo systemctl status docker`
```bash
sudo systemctl status docker
```
Вы должны увидеть вывод, который говорит, что активен для статуса.
@ -67,19 +80,29 @@ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin
Для запуска контейнеров Docker и управления ими требуются привилегии sudo. Это означает, что вам придется вводить sudo для каждой команды или переключаться на учетную запись пользователя root. Но вы можете обойти это, добавив текущего пользователя в группу **докеров** с помощью следующей команды:
`sudo usermod -aG docker ${USER}`
```bash
sudo usermod -aG docker ${USER}
```
Вы можете заменить **${USER}** своим именем пользователя или просто запустить команду как есть, пока вы вошли в систему.
Хотя это может быть незначительным риском для безопасности, все должно быть в порядке, если применяются другие [меры безопасности Docker](https://www.smarthomebeginner.com/traefik-docker-security-best-practices/) .
Хотя это может быть незначительным риском для безопасности, все должно быть в порядке, если применяются другие [меры безопасности Docker](https://www.smarthomebeginner.com/traefik-docker-security-best-practices/).
## Шаг 6. Установим таймзону
`sudo timedatectl set-timezone America/New\_York`
Установим таймзону, чтобы в будущем было удобнее использовать. По умолчанию, установлена таймзона UTC+0. Поставим Московскую:
```bash
sudo timedatectl set-timezone Europa/Moscow
timedatectl status
```
# Команды Docker
Существует множество команд docker и docker compose, и их описание не является целью этого поста. Вы можете увидеть все возможные команды, используя следующую команду:
`docker`
```bash
docker
```
Но вот несколько команд **docker** и **docker compose** для начала:

@ -0,0 +1,23 @@
# MariaDB
```yaml
services:
mariadb:
container_name: mariadb
image: mariadb:latest #11.5.2
restart: unless-stopped
stop_grace_period: 5s
security_opt: # see https://github.com/MariaDB/mariadb-docker/issues/434#issuecomment-1136151239
- seccomp:unconfined
- apparmor:unconfined
command: --innodb-buffer-pool-size=512M --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=120
volumes:
- "./database:/var/lib/mysql"
environment:
MARIADB_AUTO_UPGRADE: "1"
MARIADB_INITDB_SKIP_TZINFO: "1"
MARIADB_DATABASE: "name_db"
MARIADB_USER: "username"
MARIADB_PASSWORD: "pass_user"
MARIADB_ROOT_PASSWORD: "root_pass"
```

@ -1,14 +1,11 @@
# Nextcloud - свое облако для файлов
Запуск через docker-compose. Для начала создадим файл `.env` со следующим содержанием:
```env title=".env"
PUID=
PGID=
TZ=
DOCKER_APP=
SECRETSDIR=
NEXTCLOUD_DOMAIN_NAME=
REDIS_PASSWORD=
```
@ -21,15 +18,14 @@ version: "3.7"
services:
# Nextcloud Docker Application
nextcloud:
image: nextcloud:25.0.4
image: nextcloud:28
container_name: nextcloud
restart: always
volumes:
- $DOCKER_APP/nextcloud:/var/www/html
- $DOCKER_APP/nextcloud/apps:/var/www/html/custom_apps
- $DOCKER_APP/nextcloud/config:/var/www/html/config
- /mnt/NAS/Nextcloud:/var/www/html/data
- /mnt:/mnt
- ./nextcloud:/var/www/html
- ./nextcloud/apps:/var/www/html/custom_apps
- ./nextcloud/config:/var/www/html/config
- ./nextcloud/data:/var/www/html/data
environment:
- POSTGRES_HOST=192.168.1.12
- POSTGRES_DB_FILE=/run/secrets/nextcloud_postgres_db
@ -37,8 +33,8 @@ services:
- POSTGRES_PASSWORD_FILE=/run/secrets/nextcloud_postgres_password
- NEXTCLOUD_ADMIN_PASSWORD_FILE=/run/secrets/nextcloud_admin_password
- NEXTCLOUD_ADMIN_USER_FILE=/run/secrets/nextcloud_admin_user
- REDIS_HOST=172.18.3.249
- REDIS_HOST_PASSWORD=$REDIS_PASSWORD
#- REDIS_HOST=
#- REDIS_HOST_PASSWORD=
- PUID=$PUID
- PGID=$PGID
- TZ=$TZ

@ -0,0 +1,12 @@
# occ files-scan
Запуск команды occ. иногда бывает так, что веб интерфейс выдает ошибку или предупреждение о необходимости выполнить сканировние, используя `occ`. При установе вне докера, ясно как это сделать - запустить то что указано в предупреждении, используя терминал. Но при работе в докере, нужно запускать команду, используя контейнер докера.
Например:
```bash
sudo docker exec -ti --user www-data nextcloud-app /var/www/html/occ files:scan --all
```
- `nextcloud-app` - имя контейнера докера
- `/var/www/html/occ` - путь до **occ**

@ -0,0 +1,12 @@
# OIDC логин через Authentik
Добавил авторизацию через Authentik, но потребовалось сделать так, чтобы формы входа не было. Чтобы сразу шел редирект на страницу авторизации Authentik.
Для этого нужно выолпнить команду (nextcloud в докере):
```
docker exec -ti --user 1000 nextcloud_app php occ config:app:set --value=0 user_oidc allow_multiple_user_backends
```
где `nextcloud_app` - имя контейнера
Применимо только для приложения nextcloud: **user_oidc** (https://github.com/nextcloud/user_oidc)

@ -0,0 +1,150 @@
# Photoprism
[![](https://img.shields.io/github/stars/Prowlarr/Prowlarr?label=%E2%AD%90%20Stars&style=flat-square)](https://github.com/photoprism/photoprism)
[![](https://img.shields.io/github/v/release/Prowlarr/Prowlarr?label=%F0%9F%9A%80%20Release&style=flat-square)](https://github.com/photoprism/photoprism/releases/latest)
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/prowlarr.svg?maxAge=60&style=flat-square)](https://hub.docker.com/r/photoprism/photoprism)
PhotoPrism® — это приложение для фотографий на базе искусственного интеллекта для [децентрализованной сети](https://en.wikipedia.org/wiki/Decentralized_web). Он использует новейшие технологии для автоматического пометки и поиска изображений, не мешая вам. Вы можете запустить его дома, на частном сервере или в облаке.
![](../images/docker/photoprism.png)
Чтобы получить первое впечатление, можно поиграться в [демо-версию](https://try.photoprism.app/).
## Установка
Устанавливать будем через Docker. Как обычно.
!!! tip
Настройка докера описывается в статье: [Установка Docker](install.md)
Создаем файл `docker-compose.yml`, используя команду:
```bash
nano docker-compose.yml
```
Заполняем новый файл:
```yaml
version: "3.7"
services:
photoprism:
container_name: photoprism
image: photoprism/photoprism:latest
restart: unless-stopped
stop_grace_period: 10s
depends_on:
- mariadb
security_opt:
- seccomp:unconfined
- apparmor:unconfined
ports:
- "2342:2342"
environment:
PHOTOPRISM_ADMIN_USER: $PHOTOPRISM_ADMIN_USER # admin login username
PHOTOPRISM_ADMIN_PASSWORD: $PHOTOPRISM_ADMIN_PASSWORD # initial admin password (8-72 characters)
PHOTOPRISM_AUTH_MODE: "password" # authentication mode (public, password)
PHOTOPRISM_SITE_URL: $PHOTOPRISM_SITE_URL # server URL in the format "http(s)://domain.name(:port)/(path)"
PHOTOPRISM_DISABLE_TLS: "false" # disables HTTPS/TLS even if the site URL starts with https:// and a certificate is available
PHOTOPRISM_DEFAULT_TLS: "true" # defaults to a self-signed HTTPS/TLS certificate if no other certificate is available
PHOTOPRISM_ORIGINALS_LIMIT: 5000 # file size limit for originals in MB (increase for high-res video)
PHOTOPRISM_HTTP_COMPRESSION: "gzip" # improves transfer speed and bandwidth utilization (none or gzip)
PHOTOPRISM_LOG_LEVEL: "info" # log level: trace, debug, info, warning, error, fatal, or panic
PHOTOPRISM_READONLY: "false" # do not modify originals directory (reduced functionality)
PHOTOPRISM_EXPERIMENTAL: "false" # enables experimental features
PHOTOPRISM_DISABLE_CHOWN: "false" # disables updating storage permissions via chmod and chown on startup
PHOTOPRISM_DISABLE_WEBDAV: "false" # disables built-in WebDAV server
PHOTOPRISM_DISABLE_SETTINGS: "false" # disables settings UI and API
PHOTOPRISM_DISABLE_TENSORFLOW: "false" # disables all features depending on TensorFlow
PHOTOPRISM_DISABLE_FACES: "false" # disables face detection and recognition (requires TensorFlow)
PHOTOPRISM_DISABLE_CLASSIFICATION: "false" # disables image classification (requires TensorFlow)
PHOTOPRISM_DISABLE_VECTORS: "false" # disables vector graphics support
PHOTOPRISM_DISABLE_RAW: "false" # disables indexing and conversion of RAW images
PHOTOPRISM_RAW_PRESETS: "false" # enables applying user presets when converting RAW images (reduces performance)
PHOTOPRISM_JPEG_QUALITY: 85 # a higher value increases the quality and file size of JPEG images and thumbnails (25-100)
PHOTOPRISM_DETECT_NSFW: "false" # automatically flags photos as private that MAY be offensive (requires TensorFlow)
PHOTOPRISM_UPLOAD_NSFW: "true" # allows uploads that MAY be offensive (no effect without TensorFlow)
# PHOTOPRISM_DATABASE_DRIVER: "sqlite" # SQLite is an embedded database that doesn't require a server
PHOTOPRISM_DATABASE_DRIVER: "mysql" # use MariaDB 10.5+ or MySQL 8+ instead of SQLite for improved performance
PHOTOPRISM_DATABASE_SERVER: "mariadb:3306" # MariaDB or MySQL database server (hostname:port)
PHOTOPRISM_DATABASE_NAME: "photoprism" # MariaDB or MySQL database schema name
PHOTOPRISM_DATABASE_USER: "photoprism" # MariaDB or MySQL database user name
PHOTOPRISM_DATABASE_PASSWORD: $MARIADB_PASSWORD # MariaDB or MySQL database user password
PHOTOPRISM_SITE_CAPTION: "AI-Powered Photos App"
PHOTOPRISM_SITE_DESCRIPTION: "" # meta site description
PHOTOPRISM_SITE_AUTHOR: "" # meta site author
## Video Transcoding (https://docs.photoprism.app/getting-started/advanced/transcoding/):
# PHOTOPRISM_FFMPEG_ENCODER: "software" # H.264/AVC encoder (software, intel, nvidia, apple, raspberry, or vaapi)
# PHOTOPRISM_FFMPEG_SIZE: "1920" # video size limit in pixels (720-7680) (default: 3840)
# PHOTOPRISM_FFMPEG_BITRATE: "32" # video bitrate limit in Mbit/s (default: 50)
## Run/install on first startup (options: update https gpu tensorflow davfs clitools clean):
# PHOTOPRISM_INIT: "https gpu tensorflow"
## Run as a non-root user after initialization (supported: 0, 33, 50-99, 500-600, and 900-1200):
# PHOTOPRISM_UID: 1000
# PHOTOPRISM_GID: 1000
# PHOTOPRISM_UMASK: 0000
user: "1000:1000"
working_dir: "/photoprism" # do not change or remove
## Storage Folders: "~" is a shortcut for your home directory, "." for the current directory
volumes:
# "/host/folder:/photoprism/folder" # Example
- ./photoprism/originals:/photoprism/originals
- ./photoprism/storage:/photoprism/storage
- ./photoprism/import:/photoprism/import
# - "/example/family:/photoprism/originals/family" # *Additional* media folders can be mounted like this
## Database Server (recommended)
## see https://docs.photoprism.app/getting-started/faq/#should-i-use-sqlite-mariadb-or-mysql
mariadb:
container_name: mariadb
image: mariadb:11
## If MariaDB gets stuck in a restart loop, this points to a memory or filesystem issue:
## https://docs.photoprism.app/getting-started/troubleshooting/#fatal-server-errors
restart: unless-stopped
stop_grace_period: 5s
security_opt: # see https://github.com/MariaDB/mariadb-docker/issues/434#issuecomment-1136151239
- seccomp:unconfined
- apparmor:unconfined
command: --innodb-buffer-pool-size=512M --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=120
## Never store database files on an unreliable device such as a USB flash drive, an SD card, or a shared network folder:
volumes:
- "./database:/var/lib/mysql" # DO NOT REMOVE
environment:
MARIADB_AUTO_UPGRADE: "1"
MARIADB_INITDB_SKIP_TZINFO: "1"
MARIADB_DATABASE: "photoprism"
MARIADB_USER: "photoprism"
MARIADB_PASSWORD: $MARIADB_PASSWORD
MARIADB_ROOT_PASSWORD: $MARIADB_ROOT_PASSWORD
```
Создаем файл, где будут описаны переменные:
```bash
cp .env
```
Нужно заполнить его:
```
PHOTOPRISM_ADMIN_USER=admin # Имя админа
PHOTOPRISM_ADMIN_PASSWORD=password # пароль админа
PHOTOPRISM_SITE_URL=http://site.name # URL сайта, для доступа
MARIADB_ROOT_PASSWORD=strong-password # Пароль root от БД mariadb
MARIADB_PASSWORD=strong-password1 # Пароль от юзера photoprism БД
```
## Проблемы
Если после обновления, пропали фотки. Или идет цикличная загрузка по кругу, то лучше всего снести БД и восстановится на чистую.
Порядок действий таков:
1. Сносим текущую БД
2. Ставим новую БД с настройками старой
3. Перезапускаем призму
4. В терминале вводим: `docker compose exec photoprism photoprism restore -i`
Должно получится.
Можно и без команды, но тогда не вернутся текущие фотки.

@ -11,7 +11,7 @@
Запуск простой, через docker:
```bash
docker run -d -p 8080:80 --name=pictshare ghcr.io/hascheksolutions/pictshare
docker run -d -p 8080:80 -e "TITLE=My own PictShare" -e "URL=http://localhost/" hascheksolutions/pictshare:2
```
После, открываем [http://localhost:8080/](http://localhost:8080) в браузере и пользуемся.
@ -31,3 +31,4 @@ docker run -d -p 8080:80 --name=pictshare ghcr.io/hascheksolutions/pictshare
- Дубликаты не занимают места. Если один и тот же файл загружается дважды, вторая загрузка будет связана с первой.
- [Много возможностей для настройки](https://github.com/HaschekSolutions/pictshare/blob/master/rtfm/CONFIG.md)
- Полный контроль над вашими данными. Удаление изображений с индивидуальными и глобальными кодами удаления

@ -1,38 +0,0 @@
Plex можно устанавливать разными способами, через **пакет**, через **docker-cli** и **docker compose**. Я предпочитаю **Docker Compose**.
Ниже будет приведен файл Docker Compose. 
[Получение Plex Claim](https://www.plex.tv/claim/)
```yaml
version: "3.7"
services:
plex:
container_name: plex
image: plexinc/pms-docker:latest
restart: always
#devices:
#- /dev/dri:/dev/dri # для hardware траснкодинга - если есть видеокарта, вписать сюда
ports:
- "32400:32400"
- "32400:32400/udp"
- "32469:32469"
- "32469:32469/udp"
- "5353:5353/udp"
- "1900:1900/udp"
security_opt:
- no-new-privileges:true
volumes:
- /opt/appdata/plex:/config
- /mnt:/mnt:ro # перечислить папки с медиа файлами
environment:
- PUID=1000
- PGID=1000
- VERSION=docker
- PLEX_CLAIM= # ваш плекс клайм
```
Удаление мусора из PhotoTranscoder
```bash
find "/home/plex/plexconfig/Library/Application Support/Plex Media Server/Cache/PhotoTranscoder" -name "*.jpg" -type f -mtime +5 -delete
```

@ -0,0 +1,223 @@
# Autoscan - автоскан для Plex на Go
[![](https://img.shields.io/github/stars/Cloudbox/autoscan?label=%E2%AD%90%20Stars&style=flat-square)](https://github.com/Cloudbox/autoscan)
[![](https://img.shields.io/github/v/release/Cloudbox/autoscan?label=%F0%9F%9A%80%20Release&style=flat-square)](https://github.com/Cloudbox/autoscan/releases/latest)
[![Docker Pulls](https://img.shields.io/docker/pulls/cloudb0x/autoscan.svg?maxAge=60&style=flat-square)](https://hub.docker.com/r/cloudb0x/autoscan/)
Autoscan - заменяет поведение **Plex** и **Emby** по умолчанию для обнаружения изменений в файловой системе. Autoscan интегрируется с **Sonarr**, **Radarr**, **Readarr**, **Lidarr** и **Google Drive** для получения изменений практически в реальном времени, не полагаясь на файловую систему.
!!! note "От автора"
Наткнулся случайно, ища как можно поправить большую нагрузку при сканировании библиотеки в **Plex**. У меня достаточно большая медиа библиотека (1500 фильмов и 30000 серий в сериалах) и во время сканирования изменений, система могла некоторое ремя чуть тормозить. Решение нашлось - **Autoscan**. Он позволяет сделать интеграцию с Sonarr и Radarr, чтобы отслеживать моменты изменения файловой системы. Таким образом, сканирование в основом производится, когда что-то добавилось. Так же скан идет только по той папке, что менялась.
Запускать будем через **Docker Compose**. Предпологается, что [Docker](../install.md) уже установлен. Так же установлен [Plex](index.md). Наличии Radarr и Sonarr опционально.
## Образ Docker
Создаем файл `docker-compose.yml`:
```bash
nano docker-compose.yml
```
Заполняем его:
```yaml title="docker-compose.yml"
version: "3.7"
services:
autoscan:
image: cloudb0x/autoscan
container_name: autoscan
restart: unless-stopped
environment:
- PUID=1001
- PGID=1001
ports:
- 3030:3030
volumes:
- ./autoscan:/config
- /mnt:/mnt:ro #Media Library
```
Запустить можно через:
```bash
docker compose up -d
```
## Конфиг файл
По умолчанию конифг не создается, его нужно создать руками и заполнить параметрами. Ниже представлен пример. А еще ниже описание параметров. Конфиг файл находится по пути: `./autoscan/config.yml`
Создадим его:
```bash
touch ./autoscan/config.yml
```
??? example "Полный файл конфигурации"
```yaml title="config.yml"
# <- processor ->
# override the minimum age to 30 minutes:
minimum-age: 30m
# set multiple anchor files
#anchors:
# - /mnt/unionfs/drive1.anchor
# <- triggers ->
# Protect your webhooks with authentication
authentication:
username: username
password: password
# port for Autoscan webhooks to listen on
port: 3030
triggers:
radarr:
- name: radarr # /triggers/radarr
priority: 2
sonarr:
- name: sonarr # /triggers/sonarr
priority: 2
# Rewrite the path from within the container
# to your local filesystem.
#rewrite:
# - from: /mnt/TV/
# to: /mnt/Media/TV/
targets:
plex:
- url: https://plex.domain.tld # URL of your Plex server
token: XXX # Plex API Token
#rewrite:
# - from: /mnt/ # local file system
# to: / # path accessible by the Plex docker container (if applicable)
```
Типичный конфиг файл состоит из 3 частей:
1. `triggers`
2. `processor`
3. `targets`
### triggers
`triggers` - входные данные для запуска автосканирования. Они переводят входящие данные в общий формат данных, называемый сканированием.
Поддерживается несколько триггеров:
- [A-Train](https://github.com/m-rots/a-train/pkgs/container/a-train) : официальный триггер Google Drive для Autoscan.
- **Inotify**: прослушивает изменения в файловой системе. Его не следует использовать поверх креплений RClone.
- **Вручную**: если вы хотите просканировать путь вручную.
- **-arrs**: Lidarr, Sonarr, Radarr, Readarr - через webhook
#### Настройка triggers
Рассмотрим более подробно настройку триггера через webhook для Sonarr и Radarr.
Чтобы добавить вебхук в **Sonarr**, **Radarr**, **Readarr** или **Lidarr**, выполните следующие действия:
1. Откройте `settings` страницу в Sonarr/Radarr/Readarr/Lidarr.
2. Выберите вкладку `connect`
3. Нажмите на большой плюсик
4. Выбирать `webhook`
5. Используйте `Autoscan` в качестве имени
6. Выберите `On Import` и `On Upgrade`
7. Задайте URL-адрес URL-адреса автосканирования и добавьте, `/triggers/:name` где имя — это имя, заданное в конфигурации триггера.
8. Установите имя пользователя и пароль.
9. Установите события: `Rename`, `On Movie Delete` или `On Series Delete`, `On Movie File Delete` или `On Episode File Delete`
??? example "Пример куска конфига"
```yaml
triggers:
radarr:
- name: radarr # /triggers/radarr
priority: 2
sonarr:
- name: sonarr # /triggers/sonarr
priority: 2
# Rewrite the path from within the container
# to your local filesystem.
#rewrite:
# - from: /mnt/TV/
# to: /mnt/Media/TV/
```
### processor
Триггеры передают полученные сканы процессору. Затем процессор сохраняет сканы в свое хранилище данных. В качестве хранилища данных процессор использует **SQLite**.
Все отправляемые сканы в процессор группируются по одинаковой папке. Далее процессор ждет, пока все файлы в этот папке не станут старше `minimum-age`, по дефолту это 10 минут.
Когда все файлы старше минимального возраста, процессор параллельно вызовет все настроенные цели, чтобы запросить сканирование папки.
#### Настройка processor
Настройка процессора сводится к установке минимального времени сканирования. Есть 3 параметра:
- `minimum-age` - сколько времени пройдет после триггера
- `scan-delay` - задержка между процессами сканирования
- `scan-stats` - вывод статистики
```yaml title="Фрагмент файла config.yml"
...
# override the minimum age to 30 minutes:
minimum-age: 30m
# override the delay between processed scans:
# defaults to 5 seconds
scan-delay: 15s
# override the interval scan stats are displayed:
# defaults to 1 hour / 0s to disable
scan-stats: 1m
...
```
В `minimum-age` полях `scan-delay` и `scan-stats` должна быть указана строка в следующем формате:
- `1s` если минимальный возраст должен быть установлен на 1 секунду.
- `5m` если минимальный возраст должен быть установлен на 5 минут.
- `1m30s` если минимальный возраст должен быть установлен на 1 минуту и 30 секунд.
- `1h` если минимальный возраст должен быть установлен на 1 час.
### targets
targets - это конечный путь, куда будет сгружаться вся информация по изменениям. Сгружать можно в:
- Plex
- Emby
- Jellyfin
- Autoscan
### Настройка targets
Рассмотрим выгрузку в **Plex**. **Autoscan** заменяет стандартную джобу **Plex** по автоматическому обновлению библиотеки **Plex**. Поэтому лучше отключить параметр `Update my library automatically`
Можно настроить одну или несколько целей **Plex** в конфигурации:
```yaml
...
targets:
plex:
- url: https://plex.domain.tld # URL of your Plex server
token: XXXX # Plex API Token
rewrite:
- from: /mnt/Media/ # local file system
to: /data/ # path accessible by the Plex docker container (if applicable)
...
```
В конфигурации следует обратить внимание на пару вещей:
- `url`. URL-адрес может напрямую ссылаться на контейнер докеров, локальный хост или обратный прокси-сервер, расположенный перед Plex.
- `token`. Нам нужен токен Plex API, чтобы делать запросы от вашего имени. Эта статья должна вам помочь.
- `rewrite`. Если Plex работает не в хостовой ОС, а в Docker-контейнере (или в Docker-контейнере работает Autoscan), то необходимо соответствующим образом [переписать пути](https://github.com/Cloudbox/autoscan#rewriting-paths).

@ -0,0 +1,147 @@
# Plex in Docker
[![](https://img.shields.io/github/stars/plexinc/pms-docker?label=%E2%AD%90%20Stars&style=flat-square)](https://github.com/plexinc/pms-docker)
[![Docker Pulls](https://img.shields.io/docker/pulls/plexinc/pms-docker.svg?maxAge=60&style=flat-square)](https://hub.docker.com/r/plexinc/pms-docker/)
[Plex](https://www.plex.tv/) — это клиент-серверная система медиаплеера и пакет программного обеспечения, состоящий из двух основных компонентов (медиа-сервера и клиентских приложений).
![](../../images/docker/plex_1.png)
## Требования для запуска
!!! summary "Уже работает"
* [Traefik](../traefik/index.md) настроен согласно инструкциям
* Запись DNS для имени хоста, которое вы собираетесь использовать (или подстановочный знак ), указывающая на ваш поддерживаемый IP-адрес .
## Подготовка
### Папка
Для запуска контейнера, нужен будет каталог, где Plex сможет хранить свои данные:
```
mkdir /opt/appdata/plex
```
### Использование Docker macvlan (опционально)
Если нужно сделать так, чтобы у докера был свой отдельный IP адрес в домашней локальной сети, то нужно будет использовать macvlan Docker. Контейнеры в macvlan будут думать, что они находятся на отдельном ПК в локальной сети.
Для настройки, нужно добавить блок кода
```yaml
dockervlan:
name: dockervlan
driver: macvlan
driver_opts:
parent: eth1 # using ifconfig
ipam:
config:
- subnet: "192.168.1.0/24"
ip_range: "192.168.1.250/32"
gateway: "192.168.1.1"
```
Моя домашняя сеть находится в подсети **192.168.1.X**. Я захотел сделать так, чтобы у Plex, был свой IP-адрес, а не IP-адрес сервера с кучей контейнеров. Разберем, что значат строчки, из кода выше.
- **eth1** - это имя используемого сетевого интерфейса. Вы можете найти это с помощью команды `ifconfig` или `ip a`.
- Далее назначаем конфиг. **192.168.1.250/32** - таким образом будет только 1 IP в подсети. Если нужно больше, то сменить маску подсети (записывается после `/`)
### Файл .env
Далее создадим `.env` файл, где будут храниться переменные. Для **PUID** и **PGID** нужно задать **UID** и **GID** пользователя системы, которому принадлежат права на медиафайлы в локальной файловой системе.
```yaml title=".env"
VERSION=latest
PUID=1001
PGID=1001
PLEX_CLAIM=
```
### Plex Claim
Не забываем прописать `PLEX_CLAIM` - параметр нужен, чтобы привязать этот экземпляр медиасервера к учетной записи Plex. Получить можно по ссылке: [https://www.plex.tv/claim](https://www.plex.tv/claim)
### Docker Compose для Plex
Ниже приведен файл Docker Compose, рекомендованный для начала работы с Plex. 
```yaml title="docker-compose.yml"
version: "3.7"
networks:
default:
driver: bridge
services:
plex:
container_name: plex
image: plexinc/pms-docker:latest
restart: unless-stopped
networks:
- default
#devices:
# - /dev/dri:/dev/dri # for harware transcoding
ports:
- "32400:32400"
- "32400:32400/udp"
security_opt:
- no-new-privileges:true
volumes:
- /opt/appdata/plex:/config
- /opt/appdata/plex/temp:/transcode
- /mnt:/mnt:ro
environment:
- ADVERTISE_IP="http://172.18.1.250:32400/"
- PUID=$PUID
- PGID=$PGID
- TZ=$TZ
- VERSION=docker
- PLEX_CLAIM=$PLEX_CLAIM
```
Разберем, что значат некоторые параметры в файле:
- Мы используем образ докера **plexinc/pms-docker:public** Plex. Вы также можете использовать изображение **plexpass** , которое предлагает некоторые преимущества вместо **public** . Благодаря поддержке Plex на серверах Raspberry Pi Docker (ARM), [образ Plex Linuxserver.io](https://github.com/linuxserver/docker-plex) также является хорошим.
- Plex будет принадлежать к сети типа мост "default". Это нормально для большинства пользователей.
- Мы также сопоставляем несколько портов контейнера Plex (правая часть двоеточия) с хостом Docker (слева от двоеточия). Plex будет доступен на IP-адресе хоста Docker через порт Plex Docker 32400. Например, мой хост Docker имеет IP-адрес **192.168.1.100** . Итак, Plex будет доступен по адресу `http://192.168.1.100:32400`.
- `/dev/dri` обычно представляет собой видеокарту. Вы можете передать видеокарту вашего хоста докера в контейнер докера Plex для аппаратного перекодирования. Раскомментируйте эти строки (удалите # впереди), чтобы включить видеокарты. Вам придется включить аппаратное перекодирование в настройках Plex. Это особенно полезно для NAS, поддерживающих Plex (например, Synology).
- В разделе `volumes` мы сопоставляем постоянный том для конфигурации Plex, еще один том, на котором находится наша медиабиблиотека. Вы можете сделать его доступным только для чтения, добавив `:ro` в конце.
- С помощью `$PUID` и `$PGID` мы указываем, что Plex запускается с идентификатором пользователя и группой пользователей, которые мы определили ранее в файле `.env`.
- `ADVERTISE_IP` настраивает URL-адреса доступа к пользовательскому серверу в настройках сети сервера Plex. Он указывает другие IP-адреса, по которым можно получить доступ к тому же серверу Plex.
- `ALLOWED_NETWORKS`: предназначено исключительно для регулирования пропускной способности. Указанные здесь IP-адреса считаются локальными (LAN) сетями.
### Настройка сети
В приведенном выше файле Docker Compose используется сеть **default**. Если нужно использовать сеть macvlan, то нужно заменить блок `networks`:
```yaml
networks:
dockervlan:
ipv4_address: 192.168.1.250
```
!!! warning
Обратите внимание, что указанный IP-адрес такой же, как тот, который мы настроили ранее в этом руководстве. Plex должен быть доступен по адресу **http://192.168.1.250:32400**.
### Запуск Plex
После настройки файле Docker Compose пришло время запустить Plex с помощью команды:
```bash
sudo docker compose -f ~/docker/docker-compose.yml up -d
```
Если все будет хорошо, то через пару минут станет доступна страница в браузере, по URL адресу, перечсиленному ранее.
## Доступ к Plex через интернет
Доступ из домашней сети это хорошо, но что делать, когда хочется пользоваться не только дома. Самое простое - перенаправить порт 32400 на роутере, чтобы он указывал на IP-адрес сервера Plex (тот же что и `ADVERTISE_IP`, определенный ранее)
### Использование обратного прокси
Другой безопасный способ доступа к Plex - использовать обратный прокси. Но для этого нужно доменное имя или DDNS.
Можно использовать NGINX или Traefik. NGINX прост в настройке, но не гибок. Я рекомендую [Traefik](../traefik/index.md).

@ -0,0 +1,38 @@
# Jackett
[![](https://img.shields.io/github/stars/Jackett/Jackett?label=%E2%AD%90%20Stars&style=flat-square)](https://github.com/Jackett/Jackett)
[![](https://img.shields.io/github/v/release/Jackett/Jackett?label=%F0%9F%9A%80%20Release&style=flat-square)](https://github.com/Jackett/Jackett/releases/latest)
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/jackett.svg?maxAge=60&style=flat-square)](https://hub.docker.com/r/linuxserver/jackett/)
![](../../images/docker/jackett-1.png)
Jackett - нужен для преобразования запросов от [Sonarr](./sonarr.md)/[Radarr](./radarr.md)/Lidarr/Readarr и прочих в HTTP-запросы, специфичные для сайта трекера, анализирует ответ html или json и затем отправляет результаты обратно запрашивающему программному обеспечению. Это позволяет получать последние загрузки (например, RSS) и выполнять поиск.
Jackett — это единый репозиторий поддерживаемой логики очистки и перевода индексаторов, который снимает нагрузку с других приложений.
## Установка
Устанавливать будем через Docker Compose
```yaml title="docker-compose.yml"
version: "3.7"
services:
jackett:
container_name: jackett
image: linuxserver/jackett:latest
restart: always
ports:
- "9117:9117"
security_opt:
- no-new-privileges:true
volumes:
- ./jackett:/config
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Moscow
```
Альтернатива: [Prowlarr](./prowlarr.md)

@ -15,8 +15,6 @@
## Установка через docker-compose
```yaml
version: "3.7"
services:
plextraktsync:
image: ghcr.io/taxel/plextraktsync
@ -31,7 +29,7 @@ services:
command: sync
```
Запустить синхронизацию: `docker-compose run --rm plextraktsync sync`
Запустить синхронизацию: `docker compose run --rm plextraktsync sync`
Для запуска автоматически по расписанию можно использовать crontab или sheduler:

@ -0,0 +1,40 @@
# Prowlarr
[![](https://img.shields.io/github/stars/Prowlarr/Prowlarr?label=%E2%AD%90%20Stars&style=flat-square)](https://github.com/Prowlarr/Prowlarr)
[![](https://img.shields.io/github/v/release/Prowlarr/Prowlarr?label=%F0%9F%9A%80%20Release&style=flat-square)](https://github.com/Prowlarr/Prowlarr/releases/latest)
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/prowlarr.svg?maxAge=60&style=flat-square)](https://hub.docker.com/r/linuxserver/prowlarr/)
![](../../images/docker/prowlarr-1.png)
Prowlarr — это менеджер индексаторов и прокси, построенный на стеке *arr .NET/ReactJS. Prowlarr поддерживает торрент-трекеры и индексаторы Usenet для интеграции с приложениями PVR, Lidarr, Mylar3, Radarr, Readarr и Sonarr.
Некоторые из функций, которые делают Prowlarr достойным использования, включают в себя:
- Собственная поддержка Usenet для 24 индексаторов, включая VIP для наушников, а также поддержка любого индексатора, совместимого с Newznab, через «Generic Newznab».
- Поддержка Torrent для более чем 500 трекеров, постоянно добавляемых новых.
- Поддержка торрентов для любого трекера, совместимого с Torznab, через «Generic Torznab».
- Индексатор синхронизируется с [Sonarr](./sonarr.md)/[Radarr](./radarr.md)/Readarr/Lidarr/Mylar3, поэтому ручная настройка других приложений не требуется.
- История и статистика индексатора
- Ручной поиск трекеров и индексаторов на уровне категории.
- Поддержка отправки выпусков непосредственно в ваши клиенты загрузки из Prowlarr.
- Уведомления о работоспособности и статусе индексатора
- Поддержка прокси-сервера индексатора (SOCKS4, SOCKS5, HTTP, Flaresolver)
С Prowlarr у вас будет одно место для управления всеми индексаторами всех ваших приложений Arr. Это отличная замена [Jackett](./jackett.md).
```yaml title="docker-compose.yml"
services:
prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: prowlarr
environment:
- PUID=1001
- PGID=1001
- TZ=Europe/Moscow
volumes:
- ./prowlarr:/config
ports:
- 9696:9696
restart: unless-stopped
```

@ -0,0 +1,10 @@
# Radarr
[![](https://img.shields.io/github/stars/Prowlarr/Prowlarr?label=%E2%AD%90%20Stars&style=flat-square)](https://github.com/Prowlarr/Prowlarr)
[![](https://img.shields.io/github/v/release/Prowlarr/Prowlarr?label=%F0%9F%9A%80%20Release&style=flat-square)](https://github.com/Jackett/Jackett/releases/latest)
<<<<<<< HEAD
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/prowlarr.svg?maxAge=60&style=flat-square)](https://hub.docker.com/r/linuxserver/prowlarr/)
=======
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/prowlarr.svg?maxAge=60&style=flat-square)](https://hub.docker.com/r/linuxserver/prowlarr/)
>>>>>>> 49f6799 (?)

@ -0,0 +1,5 @@
# Sonarr
[![](https://img.shields.io/github/stars/Prowlarr/Prowlarr?label=%E2%AD%90%20Stars&style=flat-square)](https://github.com/Prowlarr/Prowlarr)
[![](https://img.shields.io/github/v/release/Prowlarr/Prowlarr?label=%F0%9F%9A%80%20Release&style=flat-square)](https://github.com/Jackett/Jackett/releases/latest)
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/prowlarr.svg?maxAge=60&style=flat-square)](https://hub.docker.com/r/linuxserver/prowlarr/)

@ -0,0 +1,41 @@
# Решение проблем Plex
## Удаление мусора из PhotoTranscoder
Часто бывает так, что папка `../Library/Application Support/Plex Media Server/Cache/PhotoTranscoder` начинает занимать очень много места. в ней хранится весь кеш из изображений. Разные версии превью - все тут. Надо как-то почистить старое, чтобы освободить место:
```bash
find "<path_to_plexfolder>/Library/Application Support/Plex Media Server/Cache/PhotoTranscoder" -name "*.jpg" -type f -mtime +5 -delete
```
## Удаленный доступ в LAN сети
### Длинная версия
Столкнулся тут с проблемой воспроизведения киношки на тв дома. Почему-то, клиент Plex для ТВ не понимал, что находится в локальной сети и сервер плекса, с которого воспроизводится контент, находится в 5 метрах от него. Из-за этого, шел постоянный процесс транскодинга к 700p. Согласитесь, смотреть кино 4K ужатое до 700p это ужас.
Мой сетап:
- Plex для TV на базе Plex for Android, версия 10.12.
- Сервер Plex на Ubuntu Server в docker (8 ядер, 16гб RAM)
- Роутер Mikrotik - это важно, далее поясню почему.
Первым дело решено было смотреть, какие натсройки есть в Plex, влияющие на подключения. В настройках был обнаружен параметр **Включить ретрансляцию** (Настройки/Сеть). Если кратко, то при включении параметр позволяет подключаться через прокси ретранслятор, когда нет прямого доступа до сервера Плекса. Скорость у этого пркоси ограниченная. Это была первая причина, почему тормозило.
При отключении этого параметра, клиент Плекса на ТВ перестал подключаться к серверу. Это был знак. С одной стороны хороший, с другой не очень - ибо надо дальше искать и чинить проблему. Ошибка `Plex unable to connect securely`.
Ниже этого параметра, есть другой - **Внешний URL-адрес сервера**. Как я понял, это URL адреса для подключения к серверу плекса через DNS-подмену. У меня был указан адрес контейнера Докера в bridge сети. Поменял на свои внешние адреса. Пример: `"https://plex.site.ru","http://your_wan_ip:32400"`
Но это не помогло :(
При входе из локалки на [https://app.plex.tv](https://app.plex.tv) показывало, что библиотека не доступна. Но если входить из вне, то доступ появлялся. Значит какая то проблема с роутером. И тут я вспомнил, что для доступа к своей лабе из локалки, я настраивал [Hairpin NAT](../../network/mikrotik/hairpin-nat.md). Так может и для плекса нужно его сделать.
Это помогло. Настроил для порта *32400*
### Короткая версия
Если ТВ в локалке пишет, что скорости мало, то:
- Проверить не включен ли параметр **Включить ретрансляцию** (Настройки/Сеть)
- Проверить, стоят ли верные **внешние URL адреса**
- Если микротик, то попробовать настроить Hairpin NAT для порта plex (обычно 32400)

@ -247,9 +247,11 @@ networks:
!!! warning "Внимание"
никогда не открывайте порт 2375 для доступа в Интернет. Вас взломают/ Это еще более важно для виртуальных частных серверов, которые обычно предоставляют доступ ко всем портам. Включите брандмауэр, чтобы разрешить только порты 80 и 443 (и заблокировать остальные) для прохождения на ваш сервер, а также реализовать обходной путь Docker IP Tables, описанный далее в этом руководстве.
Никогда не открывайте порт 2375 для доступа в Интернет. Вас взломают. Это еще более важно для виртуальных частных серверов, которые обычно предоставляют доступ ко всем портам. Включите брандмауэр, чтобы разрешить только порты 80 и 443 (и заблокировать остальные) для прохождения на ваш сервер, а также реализовать обходной путь Docker IP Tables, описанный далее в этом руководстве.
!!! note
Кроме того, порт `2375` должен быть открыт только для внутренней сети (*127.0.0.1:2375*).
В блоке **environment:** указываем раздел Docker API, который хотим открыть или закрыть. Я добавил комментарии, чтобы описать, какие службы требуют каких разделов API. Например, если вы не используете WatchTower, вы можете ввести **0** для нескольких разделов API.

@ -0,0 +1,68 @@
# Docker Socket Proxy
[![](https://img.shields.io/badge/Github-blue)](https://github.com/fluencelabs/docker-socket-proxy)
[![](https://img.shields.io/github/stars/fluencelabs/docker-socket-proxy?label=%E2%AD%90%20Stars)](https://github.com/fluencelabs/docker-socket-proxy)
## Что это?
Это прокси-сервер с повышенной безопасностью для Docker Socket.
## Зачем?
Предоставление доступа к вашему сокету Docker может означать предоставление root-доступа к вашему хосту или даже ко всему вашему множеству, но некоторым службам требуется подключение к этому сокету, чтобы реагировать на события и т. д. Использование этого прокси-сервера позволяет вам блокировать все, что, по вашему мнению, эти службы не должны делать.
```yaml title="docker-compose.yml"
version: "3.8"
services:
# Docker Socket Proxy - Security Enchanced Proxy for Docker Socket
socket-proxy:
container_name: socket-proxy
image: fluencelabs/docker-socket-proxy
restart: always
privileged: true
security_opt:
- no-new-privileges:true
ports:
- 2375:2375
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
environment:
- LOG_LEVEL=warning # debug,info,notice,warning,err,crit,alert,emerg
## Variables match the URL prefix (i.e. AUTH blocks access to /auth/* parts of the API, etc.).
# 0 to revoke access.
# 1 to grant access.
## Granted by Default
- EVENTS=1
- PING=1
- VERSION=1
## Revoked by Default
# Security critical
- AUTH=0
- SECRETS=0
- POST=1 # Watchtower
- DELETE=1 # Watchtower
# GET Optons
- BUILD=0
- COMMIT=0
- CONFIGS=0
- CONTAINERS=1 # Traefik, portainer, etc.
- DISTRIBUTION=0
- EXEC=1 # Portainer
- IMAGES=1 # Portainer, Watchtower
- INFO=1 # Portainer
- NETWORKS=1 # Portainer, Watchtower
- NODES=0
- PLUGINS=0
- SERVICES=1 # Portainer
- SESSION=0
- SWARM=0
- SYSTEM=0
- TASKS=1 # Portaienr
- VOLUMES=1 # Portainer
# POST Options
- CONTAINERS_CREATE=1 # WatchTower
- CONTAINERS_START=1 # WatchTower
- CONTAINERS_UPDATE=1 # WatchTower
# DELETE Options
- CONTAINERS_DELETE=1 # WatchTower
- IMAGES_DELETE=1 # WatchTower
```

@ -0,0 +1,53 @@
# Syncthing
[![](https://img.shields.io/github/stars/syncthing/syncthing?label=%E2%AD%90%20Stars)](https://github.com/syncthing/syncthing)
[Syncthing](https://syncthing.net/) — отличное программное обеспечение, которое позволяет безопасно синхронизировать файлы между различными устройствами и операционными системами.
## Docker Compose
Запускать будем через **Docker Compose**. Предпологается, что **Docker** уже установлен в системе.
```yaml title="docker-compose.yml"
version: "3.7"
services:
syncthing:
image: syncthing/syncthing
container_name: syncthing
hostname: my-syncthing
environment:
- PUID=$PUID
- PGID=$PGID
volumes:
- ./syncthing:/var/syncthing
ports:
- 8384:8384 # Web UI
- 22000:22000/tcp # TCP file transfers
- 22000:22000/udp # QUIC file transfers
- 21027:21027/udp # Receive local discovery broadcasts
restart: unless-stopped
```
Запустите стек, используя команду `docker compose up`
Веб-интерфейс будет доступен по адресу `http://ip-address:8384`. Далее в веб интерефейсу будет предупреждение, что нужно установить пароль. Переходим в верхнее меню и выбираем «Действия», затем в меню окна нажимает «GUI» и вводим имя пользователя и пароль. Использовать нужно надежные пароли.
## Синхронизация с Android
Со смартфона заходим в магазин приложений Google, находим и устанавливаем приложение Syncthing.
В интерфейсе Syncthing нажимаем нижнюю кнопку «Действия», затем «Показать идентификатор». Появится QR-код, который нужно отсканировать с помощью смартфона.
Открываем приложение Syncthing смартфона и нажимаем «Устройства», затем «+», затем значок справа от «ID устройства» и сканируем QR-код NAS. Мы принимаем сообщения, и у нас уже подключены два устройства.
Чтобы синхронизировать папку, например фотографии, со смартфона:
1. Создаем папку `/DATA/user1/phone_photos` на нашем сервере, где стоит **Syncthing**.
2. В интерфейсе **Syncthing** смартфона нажимаем «Папки», а затем «+», в окне нажимаем «Каталог» и ищем папку с нашими фотографиями (обычно DCIM), разрешаем доступ, выбираем сервер, чтобы активировать эту папку, и подтвердить значок в правом верхнем углу.
3. В интерфейсе **Syncthing** появится диалоговое окно, нажмем «Добавить». В окне заходим в «Путь к папке» и пишем «/data1/phone_photos/». Вероятно, будет полезно перейти на вкладку «Дополнительно» и нажать «Разрешения игнорировать». Затем нажмите «Сохранить». В этот момент должна начаться синхронизация фотографий с нашего смартфона в папку, определенную на сервере папку `/DATA/user1/phone_photos`.
## Настройка клиента в других системах.
Чтобы установить Syncthing на другие платформы, см. здесь: [https://syncthing.net/downloads/](https://syncthing.net/downloads/).

@ -1,69 +0,0 @@
# Traefik Forward Auth
[![](https://img.shields.io/github/stars/thomseddon/traefik-forward-auth?label=%E2%AD%90%20Stars)](https://github.com/thomseddon/traefik-forward-auth)
[![](https://img.shields.io/github/v/release/thomseddon/traefik-forward-auth?label=%F0%9F%9A%80%20Release)](https://github.com/thomseddon/traefik-forward-auth/releases/latest)
![Docker Pulls](https://img.shields.io/docker/pulls/thomseddon/traefik-forward-auth.svg)
- Бесшовно накладывает любой http-сервис на одну конечную точку (см.: `url-path`в [разделе «Конфигурация](https://github.com/thomseddon/traefik-forward-auth#configuration) ») .
- Поддерживает несколько поставщиков, включая Google и OpenID Connect (поддерживается Azure, Github, Salesforce и т. д.).
- Поддерживает несколько доменов/поддоменов, динамически генерируя redirect\_uri
- Позволяет выборочно применять/обходить аутентификацию на основе параметров запроса (см `rules`. [Конфигурация](https://github.com/thomseddon/traefik-forward-auth#configuration) )
- Поддерживает использование централизованной аутентификации host/redirect\_uri (см `auth-host`. [Конфигурация](https://github.com/thomseddon/traefik-forward-auth#configuration) )
- Позволяет сохранять аутентификацию в нескольких доменах (см. [Домены cookie](https://github.com/thomseddon/traefik-forward-auth#cookie-domains) )
- Поддерживает расширенную аутентификацию за пределами срока действия токена Google (см.: `lifetime`в разделе [«Конфигурация](https://github.com/thomseddon/traefik-forward-auth#configuration) »).
## Применение
docker-compose
```yaml
version: "3.9"
# docker network create --gateway 172.18.0.254 --subnet 172.18.0.0/24 traefik_net
networks:
traefik_net:
external: true
services:
traefik-forward-auth:
image: thomseddon/traefik-forward-auth
container_name: traefik-forward-auth
restart: always
networks:
traefik_net:
ipv4_address: 172.18.1.4
environment:
- DEFAULT_PROVIDER=oidc
# Keycloak Section
#- PROVIDERS_OIDC_ISSUER_URL=https://auth.example.ru/auth/realms/traefik #for keycloak
#- PROVIDERS_OIDC_CLIENT_ID=$PROVIDERS_OIDC_CLIENT_ID
#- PROVIDERS_OIDC_CLIENT_SECRET=$PROVIDERS_OIDC_CLIENT_SECRET
# Google OAuth
- PROVIDERS_GOOGLE_CLIENT_ID=your-client-id
- PROVIDERS_GOOGLE_CLIENT_SECRET=your-client-secret
- SECRET=secret #replace
- LOG_LEVEL=warn
labels:
- "traefik.enable=true"
- "traefik.http.middlewares.traefik-forward-auth.forwardauth.address=http://traefik-forward-auth:4181"
- "traefik.http.middlewares.traefik-forward-auth.forwardauth.authResponseHeaders=X-Forwarded-User"
- "traefik.http.services.traefik-forward-auth.loadbalancer.server.port=4181"
```
Более полный файл [docker-compose.yml](https://github.com/thomseddon/traefik-forward-auth/blob/master/examples/traefik-v2/swarm/docker-compose.yml) или [kubernetes/simple-separate-pod](https://github.com/thomseddon/traefik-forward-auth/blob/master/examples/traefik-v2/kubernetes/simple-separate-pod/) можно найти в каталоге примеров
## Google провайдер
Настройка провайдера на примере Google. [Другие провайдеры](https://github.com/thomseddon/traefik-forward-auth/wiki/Provider-Setup) можно посмотреть на Github автора.
Перейдите на [https://console.developers.google.com](https://console.developers.google.com/) и убедитесь, что вы переключились на правильную учетную запись электронной почты.
Создайте новый проект, затем найдите и выберите «Учетные данные» в строке поиска. Заполните вкладку «Экран согласия OAuth».
Нажмите «Создать учетные данные» > «Идентификатор клиента OAuth». Выберите «Веб-приложение», введите имя своего приложения, пропустите «Авторизованные источники JavaScript» и заполните «Авторизованные URI перенаправления» со всеми доменами, с которых вы разрешите аутентификацию, добавив (например, https: `url-path`//app.test [. com/\_oauth](https://app.test.com/_oauth) )
Вы должны установить параметры конфигурации `providers.google.client-id`и `providers.google.client-secret`
## Авторские права
2018 Том Седдон

@ -0,0 +1,244 @@
# Traefik Forward Auth
[![](https://img.shields.io/github/stars/thomseddon/traefik-forward-auth?label=%E2%AD%90%20Stars)](https://github.com/thomseddon/traefik-forward-auth)
[![](https://img.shields.io/github/v/release/thomseddon/traefik-forward-auth?label=%F0%9F%9A%80%20Release)](https://github.com/thomseddon/traefik-forward-auth/releases/latest)
![Docker Pulls](https://img.shields.io/docker/pulls/thomseddon/traefik-forward-auth.svg)
- Бесшовно накладывает любой http-сервис на одну конечную точку (см.: `url-path`в [разделе «Конфигурация](https://github.com/thomseddon/traefik-forward-auth#configuration) ») .
- Поддерживает несколько поставщиков, включая Google и OpenID Connect (поддерживается Azure, Github, Salesforce и т. д.).
- Поддерживает несколько доменов/поддоменов, динамически генерируя redirect\_uri
- Позволяет выборочно применять/обходить аутентификацию на основе параметров запроса (см `rules`. [Конфигурация](https://github.com/thomseddon/traefik-forward-auth#configuration) )
- Поддерживает использование централизованной аутентификации host/redirect\_uri (см `auth-host`. [Конфигурация](https://github.com/thomseddon/traefik-forward-auth#configuration) )
- Позволяет сохранять аутентификацию в нескольких доменах (см. [Домены cookie](https://github.com/thomseddon/traefik-forward-auth#cookie-domains) )
- Поддерживает расширенную аутентификацию за пределами срока действия токена Google (см.: `lifetime`в разделе [«Конфигурация](https://github.com/thomseddon/traefik-forward-auth#configuration) »).
## Применение c Google OAuth
Google SSO выбран, как один из самых простых способов сделать доступными и защитить домашние сервисы. Процесс настройки прост. Из минусов можно выделить, что не будет гибкого управления пользователями - нет ограничения доступа по ресурсам. Я понимаю, что самое простое, это сделать авторизацию при помощи `.htpasswd` файла. Для одной службы это норм, но когда служб много - вводить каждый раз логин и пароль может быть утомительным.
После внедрения **Traefik Forward Auth** нужно будет входить в систему только один раз. А добавив _Google OAuth_, можно настроить двухфакторную аутентификацию (2FA), что делает домашние сервисы более защищенными, нежели использование файла `.htpasswd`.
Для тех кто не хочет отдавать авторизацию в руки гугла и хочет что-то свое - смотрите в сторону **Authelia**, **Keycloak** или **Authentik**. Я использовал все 3 проекта для авторизации и остановился на **Authentik**.
## Что за OAuth?
**OAuth** — открытый протокол (схема) [авторизации](https://ru.wikipedia.org/wiki/%D0%90%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F "Авторизация"), обеспечивающий предоставление третьей стороне ограниченный доступ к защищённым ресурсам пользователя без передачи ей (третьей стороне) логина и пароля - [Wikipedia](https://ru.wikipedia.org/wiki/OAuth)
Вход и аутентификация Google OAuth для Traefik действует как посредник для ваших служб, разрешая или запрещая доступ после проверки авторизованного файла cookie в вашем браузере. Процесс выглядит примерно так:
1. Для нашего хоста сделан **запрос** (например, https://traefik.example.com)
2. Запрос направляется нашим провайдером DNS на наш IP-адрес WAN, где порты 80 и 443 перенаправляются в контейнер Traefik.
3. Traefik видит входящий запрос и распознает, что **Forward Auth** определен в **метках** для этого хоста, поэтому запрос перенаправляется в контейнер **Traefik Forward Auth**.
4. Затем контейнер проверяет, есть ли в браузере авторизованный файл cookie. Если файл cookie отсутствует, запрос отправляется на **сервер авторизации Google OAuth2**.
5. После успешного входа в Google запрос отправляется на **URI перенаправления**, указанный для **веб-приложения** (https://oauth.example.com/_oauth).
6. Затем авторизованный файл cookie сохраняется в браузере, и пользователь отправляется во внутреннюю службу.
В следующий раз, когда этот браузер попытается получить доступ к службе, защищенной входом и аутентификацией на основе OAuth, файл cookie будет распознан, и пользователь будет перенаправлен на их службу без запроса на вход.
![](../../images/docker/traefik-forward-auth-google-flow.png)
Процесс происходит очень быстро и как только ваш браузер получит файл cookie, вы забудете, что включили Google OAuth с Traefik.
!!! note "Примечание"
Образ Traefik Forward Auth использует [**OpenID** **Connect**](https://en.wikipedia.org/wiki/OpenID_Connect) (**OIDC**),который представляет собой уровень аутентификации поверх протокола [OAuth 2.0](https://en.wikipedia.org/wiki/OAuth#OAuth_2.0 "OAuth"). Образ Docker, представленный в этом руководстве, поддерживает Google, а также [других поставщиков OIDC](https://github.com/thomseddon/traefik-forward-auth/wiki/Provider-Setup).
Процесс настройки Google OAuth для Traefik можно разделить на 3 этапа:
1. создание записей DNS
2. настройку службы Google OAuth
3. изменение файлов docker compose и добавление меток Traefik для активации прямой аутентификации.
## Этап 1. Создание записи DNS
Для начала, создадим новую запись DNS для нашей службы OAuth (Google перенаправит на этот адрес после аутентификации), выбираем тип CNAME. Для примера, используем домменое имя **example.com**.
Устанавливаем запись DNS как **oauth.example.com**. На рисунках ниже показан скриншот из Cloudflare.
![](../../images/docker/traefik-forward-auth-google-1.png)
Если есть запись CNAME с подстановочными знаками, указывающую на ваш корневой домен, то можно пропустить этот шаг.
## Этап 2. Настройка службы Google OAuth2
После создания записи DNS, переходим к настройке Google OAuth.
### Этап 2.1. Создаём проект Google.
Нам нужно создать **проект Google**, который будет содержать наше **веб-приложение**, **экран согласия** и **учетные данные**.
Перейдем в [Google Cloud Developers Console](https://console.developers.google.com/). Затем проверим, что вошли в правильный аккаунт Google, который хотим использовать (обычно это будет адрес электронной почты).
!!! note "Примечание"
Рекомендую выйти из других активных аккаунтов Google, чтобы быть уверенным, что на каждом этапе используется правильный аккаунт.
При появлении запроса нужно будет согласиться с **Условиями использования Google Cloud Platform**, чтобы использовать их API.
![](../../images/docker/traefik-forward-auth-google-2.png)
Сервис OAuth от Google можно использовать бесплатно, поэтому **отказываемся** от бесплатной пробной версии. Нажимаем «**Select a project**» и «**New project**».
![](../../images/docker/traefik-forward-auth-google-3.png)
Введим уникальное имя для идентификации проекта, например **Traefik Auth**. Далее нажимаем **Create**.
![](../../images/docker/traefik-forward-auth-google-4.png)
### Этап 2.2. Создайте учетные данные OAuth
Теперь, когда наш проект создан, нам нужно создать идентификатор клиента и секрет клиента, чтобы пройти аутентификацию в Google. Выберите наш проект **Traefik Authentication** и в меню навигации выберите **APIs & Services > Credentials**. Нажмите **Create Credentials > OAuth client ID**.
![](../../images/docker/traefik-forward-auth-google-5.png)
![](../../images/docker/traefik-forward-auth-google-6.png)
### Этап 2.3. Настройте Consent Screen
После того, как выбираем **OAuth Client ID**, вы увидите примечание о настройке **consent screen**, как показано ниже. Перед продолжением необходимо настроить **consent screen**.
![](../../images/docker/traefik-forward-auth-google-7.png)
Если автоматический запрос не появится, надо выбрать **OAuth consent screen** на левой панели.
Далее выбераем тип пользователей приложения: **External** и нажимаем **Create**.
![](../../images/docker/traefik-forward-auth-google-8.png)
Вводим имя своего приложения, например **Traefik Auth**, затем в разделе **Authorized domains** вводим свой домен, например **example.com**. Обязательно нажимаем **Enter**.
![](../../images/docker/traefik-forward-auth-google-9.png)
После нажатия кнопки **Save and Continue** перейдем на следующий шаг. Далее везде нажимаем снизу **Save and Continue**.
### Этап 2.4. Создайте идентификатор клиента OAuth
Выбераем наш проект **Traefik Auth**, далее в меню навигации переходим по пути **APIs & Services > Credentials**. Нажимаем **Create Credentials > OAuth client ID**.
Теперь выберите тип **Web Application** и вводим имя для своего веб-приложения, например, **Traefik**. Кроме того, потребуется ввести **Authorized redirect URI** в виде _https://oauth.example.com/_oauth_. Убедитесь, что нажата **Enter**, чтобы добавить его, а затем нажмем **Save**.
!!! note "Примечание"
Разрешено добавлять только **URI перенаправления**, которые ведут на наши **авторизованные домены**. В случае проблемы, нужно вернутся к странице **OAuth consent screen**
Скопируйте и сохраните **client ID** и **client secret**. Их нужно будет использовать на следующем шаге.
## Этап 3. Настройка аутентификации Traefik с помощью OAuth2
Теперь, когда учетные данные OAuth настроены, нужно полготовить контейнер OAuth.
Обязательно нужно остановить контейнер [Traefik](index.md) и поправить файл `docker-compose.yml`, добавив метки Traefik и контейнер OAuth, как описано ниже.
### Этап 3.1. Создание middlewares - Traefik Auth
Пришло время создать новый файл `middlewares-oauth.yml` и добавьте следующие строки:
```yaml
http:
middlewares:
middlewares-oauth:
forwardAuth:
address: "http://oauth:4181" # Указать название сервиса OAuth, как задано в файле docker-compose.yml
trustForwardHeader: true
authResponseHeaders:
- "X-Forwarded-User"
chain-oauth:
chain:
middlewares:
- middlewares-oauth
```
Сохраняем файл и выходим из редактирования.
### Этап 3.2: Контейнер OAuth Forwarder
Пример файла `docker-compose.yml`
```yaml title="Пример файла docker-compose.yml"
version: "3.9"
services:
traefik-forward-auth:
image: thomseddon/traefik-forward-auth
container_name: traefik-forward-auth
restart: always
environment:
- DEFAULT_PROVIDER=oidc
# Keycloak Section
#- PROVIDERS_OIDC_ISSUER_URL=https://auth.example.com/auth/realms/traefik #for keycloak
#- PROVIDERS_OIDC_CLIENT_ID=$PROVIDERS_OIDC_CLIENT_ID
#- PROVIDERS_OIDC_CLIENT_SECRET=$PROVIDERS_OIDC_CLIENT_SECRET
# Google OAuth
- PROVIDERS_GOOGLE_CLIENT_ID=your-client-id
- PROVIDERS_GOOGLE_CLIENT_SECRET=your-client-secret
- SECRET=secret #replace
- LOG_LEVEL=warn
- WHITELIST=your-email-google
labels:
- "traefik.enable=true"
- "traefik.http.middlewares.traefik-forward-auth.forwardauth.address=http://traefik-forward-auth:4181"
- "traefik.http.middlewares.traefik-forward-auth.forwardauth.authResponseHeaders=X-Forwarded-User"
- "traefik.http.services.traefik-forward-auth.loadbalancer.server.port=4181"
```
Теперь более подробнее что и как заполнять:
- **your-client-id** и **your-client-secret**: полученные ранее в этом руководстве по Traefik Oauth2.
- **secret**: используется для подписи файла cookie и должен быть случайным. Создайте случайный секрет с помощью: `openssl rand -hex 16`
- **your-email-google**: используется для указания, кто может получить доступ. Формат электронной почты.
!!! note
Более полный файл [docker-compose.yml](https://github.com/thomseddon/traefik-forward-auth/blob/master/examples/traefik-v2/swarm/docker-compose.yml) или [kubernetes/simple-separate-pod](https://github.com/thomseddon/traefik-forward-auth/blob/master/examples/traefik-v2/kubernetes/simple-separate-pod/) можно найти в каталоге примеров
### Этап 3.3: Добавление Google OAuth для служб Docker
Возьмем пример панели инструментов Traefik 2. Нужно сделать так, чтобы доступ к панели осущесвлялся только через авторизацию Google OAuth2:
Указываем для службы в файле `docker-compose` следующие строки:
```yaml
labels:
- "traefik.enable=true"
## Middlewares
- "traefik.http.routers.heimdall-rtr.middlewares=chain-oauth@file"
```
Итак, вот и все, вход и аутентификация на основе OAuth для стека обратного прокси-сервера Traefik.
После этого используйте команду **docker-compose up -d**.
### Этап 3.4. Добавление OAuth в другие (не Docker) службы
Приложениями, не относящимися к Docker, могут быть любые службы, находящиеся в хост-системе или в удаленной системе.
Поставщик файлов Traefik позволяет нам добавлять динамические маршрутизаторы, промежуточное ПО и службы.
```yaml title="Пример файла для pihole"
http:
routers:
pihole-rtr:
rule: "Host(`pihole.example.com`)"
entryPoints:
- https
middlewares:
- chain-oauth
service: pihole-svc
tls:
certResolver: dns-cloudflare
middlewares:
pihole-add-admin:
addPrefix:
prefix: "/admin"
services:
pihole-svc:
loadBalancer:
servers:
- url: "http://192.168.80.254:80"
```
## Существуют ли другие альтернативы Google OAuth?
Да. [Authelia](https://github.com/authelia/authelia), [Authentik](https://goauthentik.io/) и [Keycloak](https://github.com/keycloak/keycloak). По сложности: Authelia, Authentik, Keycloak

@ -1,16 +1,22 @@
Traefik — это обратный прокси-сервер с открытым исходным кодом, обеспечивающий простую работу с микросервисами и/или просто контейнерами с вашими приложениями.
# Traefik
Обратный прокси-сервер (reverse proxy, реверс-прокси) служит для ретрансляции запросов из внешней сети к каким-либо серверам/сервисам внутренней сети (например веб-сервера, БД или файловые хранилища) и позволяет:
- обеспечить сокрытие структуры внутренней сети и подробностей о находящейся в ней сервисах;
- осуществлять балансировку нагрузки (load balancing) между экземплярами одного и того же сервиса или серверами с одинаковыми задачами;
- обеспечить зашифрованное (HTTPS) соединение между клиентом и любым сервисом, в таком случае SSL сессия создается между клиентом и прокси, а между прокси и сервисом во внутренней сети устанавливается незашифрованное HTTP соединение, если сервис поддерживает HTTPS то можно организовать зашифрованное соединение и во внутренней сети;
- организовать контроль доступа к сервисам (аутентификацию клиента), а также установить файрвол (брандмауэр).
**Traefik** — это обратный прокси-сервер с открытым исходным кодом, обеспечивающий простую работу с микросервисами и/или просто контейнерами с вашими приложениями.
!!! tip
Обратный прокси-сервер (reverse proxy, реверс-прокси) служит для ретрансляции запросов из внешней сети к каким-либо серверам/сервисам внутренней сети (например веб-сервера, БД или файловые хранилища) и позволяет:
- обеспечить сокрытие структуры внутренней сети и подробностей о находящейся в ней сервисах
- осуществлять балансировку нагрузки (load balancing) между экземплярами одного и того же сервиса или серверами с одинаковыми задачами
- обеспечить зашифрованное (HTTPS) соединение между клиентом и любым сервисом, в таком случае SSL сессия создается между клиентом и прокси, а между прокси и сервисом во внутренней сети устанавливается незашифрованное HTTP соединение, если сервис поддерживает HTTPS то можно организовать зашифрованное соединение и во внутренней сети
- организовать контроль доступа к сервисам (аутентификацию клиента), а также установить файрвол (брандмауэр).
В статье будет описываться использование Traefik в Docker в качестве реверс-прокси для других контейнеров Docker, а также не контейнеризированных сервисов.
## Введение
Traefik позиционируется разработчиками как “Edge Router”, то есть можно направить его непосредственно в глобальную сеть одной стороной и во внутреннюю другой. Если у читателя создалось впечатление что таким образом создается единая точка отказа всей системы, то так и есть, но есть несколько моментов:
- во-первых, **Traefik** имеет развитый функционал для автоматического восстановления при сбоях;
**Traefik** позиционируется разработчиками как "Edge Router", то есть можно направить его непосредственно в глобальную сеть одной стороной и во внутреннюю другой. Если у читателя создалось впечатление что таким образом создается единая точка отказа всей системы, то так и есть, но есть несколько моментов:
- во-первых, **Traefik** имеет развитый функционал для автоматического восстановления при сбоях
- во-вторых, существует **Traefik EE** — платная версия, в которой помимо прочих преимуществ имеется HA (Hight Availability, Высокая доступность), что подразумевает распределение нагрузки между несколькими экземплярами сервиса (узлами), таким образом при отказе одного его задачи перераспределяются на другие узлы, а отказавший узел отключается и затем немедленно вводится обратно в эксплуатацию.
> В качестве примечания отметим, что в статье будет рассматриваться бесплатная версия Traefik.
@ -19,23 +25,23 @@ Traefik позиционируется разработчиками как “Ed
Список основных провайдеров:
- Docker
- File
- Kubernetes
- Consul Catalog
- Marathon
- Rancher
- File
В рамках этой статьи будут рассмотрены первый и последний провайдеры из этого списка.
В рамках этой статьи будут рассмотрены первый и второй провайдеры из этого списка.
Вероятно, не знакомому с темой читателю будет не понятно, чем является провайдер с именем — “File”, это некоторый файл (или папка с файлами), в котором описана конфигурация какого-либо сервиса, не связанного с другими провайдерами, но который должен быть скрыт за реверс-прокси. Остальные же провайдеры являются различными системами оркестрации контейнеров.
Вероятно, не знакомому с темой читателю будет не понятно, чем является провайдер с именем — *File*, это некоторый файл (или папка с файлами), в котором описана конфигурация какого-либо сервиса, не связанного с другими провайдерами, но который должен быть скрыт за реверс-прокси. Остальные же провайдеры являются различными системами оркестрации контейнеров.
Файл конфигурации Traefik, а также файлы для провайдера “File” могут быть написаны на TOML либо YAML, в статье будут приведены примеры на YAML так как этот синтаксис больше нравится автору, а какой-либо функциональной разницы между ними нет, а также не составляет трудности переписать файлы на другой формат конфигурации. Traefik будет развернут в Docker. Для развертывания будет использоваться docker-compose, для обеспечения простоты повторного развертывания.
Файл конфигурации **Traefik**, а также файлы для провайдера *File* могут быть написаны на TOML либо YAML, в статье будут приведены примеры на YAML так как этот синтаксис больше нравится автору, а какой-либо функциональной разницы между ними нет, а также не составляет трудности переписать файлы на другой формат конфигурации. Traefik будет развернут в Docker. Для развертывания будет использоваться `docker-compose`, для обеспечения простоты повторного развертывания.
> В статье будут приведены команды для ОС Linux.
> В статье будут приведены команды для ОС Ubuntu.
## Деплой Traefik
Предполагается что у читателя установлены и настроены `docker` и `docker-compose`, их установка выходит за рамки этой статьи.
Предполагается, что у читателя установлены и настроены `docker` и `docker-compose`. Установить можно [тут](../install.md)
Создадим в домашней папке пользователя папку `traefik`, в которой будем хранить всю конфигурацию, и перейдем в эту папку
@ -49,7 +55,7 @@ cd ~/traefik
version: '3.9'
services:
traefik:
image: traefik:v2.10
image: traefik:v2.10 # Лучше не использовать тег latest
container_name: traefik
restart: unless-stopped
security_opt:
@ -58,9 +64,9 @@ services:
- 80:80
- 443:443
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
- /etc/localtime:/etc/localtime:ro # for localtime
- /var/run/docker.sock:/var/run/docker.sock:ro # Docker Socket
- ./data/traefik.yml:/traefik.yml:ro # static config
```
Во внешний мир будут смотреть порты 80 и 443 для HTTP и HTTPS соответственно. Также пробросим в контейнер сокет демона Docker для работы механизма автоматической конфигурации. Конфигурацию Traefik будем описывать в файле `traefik.yml` находящемся в папке `data` в текущей директории.
@ -70,6 +76,7 @@ services:
Создадим и будем постепенно наполнять этот файл.
Для начала опишем точки входа в наш прокси (те самые порты, которые смотрят во внешний мир):
```yaml
entryPoints:
http:
@ -89,7 +96,7 @@ providers:
exposedByDefault: false
```
Параметром указываем что Traefik не должен брать все контейнеры подряд, далее будет объяснено каким образом мы будем сообщать какие контейнеры нас интересуют. Также здесь видно зачем мы пробрасывали сокет в контейнер — именно через него Traefik будет получать сведения о запускаемых контейнерах на этом хосте (можно подключиться и к демону на другом хосте).
Параметром `exposedByDefault` указываем, что Traefik не должен брать все контейнеры подряд, далее будет объяснено каким образом мы будем сообщать какие контейнеры нас интересуют. Также здесь видно зачем мы пробрасывали сокет в контейнер — именно через него Traefik будет получать сведения о запускаемых контейнерах на этом хосте (можно подключиться и к демону на другом хосте).
Следующим шагом развернем весь HTTP трафик в HTTPS (почему это было сделано именно таким образом будет описано дальше):
@ -117,10 +124,10 @@ Traefik может проксировать не только HTTP трафик,
Рассмотрим на примере описанного выше роутера:
- `http-catchall` — имя роутера, может быть любым, но обязано быть уникальным в рамках блока `http` всей конфигурации Traefik;
- `rule:` — правило, описывает какой трафик попадает в этот роутер, в данном случае описывается `HostRegexp`, то есть поле `Host` запроса должно попадать под регулярное выражение `.+` (то есть любое), здесь мы видим специфику регулярных выражений в Traefik — оно должно быть заключено в фигурные скобки и иметь наименование (`host` в данном случае), то есть синтаксис имеем вид `{name:reg_exp}`;
- `entrypoints` — массив описанных ранее точек входа, которые будут использоваться этим роутером, в нашем случае используем только `http`;
- `middlewares` — массив промежуточных обработчиков, куда попадает трафик перед передачей к сервису (сервисы будут рассмотрены позднее).
- `http-catchall` — имя роутера, может быть любым, но обязано быть уникальным в рамках блока `http` всей конфигурации **Traefik**
- `rule` — правило, описывает какой трафик попадает в этот роутер, в данном случае описывается `HostRegexp`, то есть поле `Host` запроса должно попадать под регулярное выражение `.+` (то есть любое). Синтаксис имеет вид `{name:reg_exp}`
- `entrypoints` — массив описанных ранее точек входа, которые будут использоваться этим роутером, в нашем случае используем только `http`
- `middlewares` — массив промежуточных обработчиков, куда попадает трафик перед передачей к сервису (сервисы будут рассмотрены позднее)
Подробнее о различных видах правил можно прочитать в [документации](https://docs.traefik.io/routing/routers/#rule).
@ -133,6 +140,8 @@ Traefik может проксировать не только HTTP трафик,
Подробнее о различных обработчиках можно прочитать в [документации](https://docs.traefik.io/middlewares/overview/) (дальше в статье будет описан ещё один обработчик — BasicAuth).
## Файл конфиурации
??? note "Полностью файл traefik.yml"
```yaml
entryPoints:
@ -159,15 +168,17 @@ Traefik может проксировать не только HTTP трафик,
permanent: false
```
Таким образом мы получим первую рабочую конфигурацию. Выполняем
Таким образом мы получим первую рабочую конфигурацию. Выполняем:
```bash
sudo docker-compose up -d
```
И прокси должен подняться, можно почитать логи (`sudo docker-compose logs -f`) и убедиться, что всё работает.
## Lets Encrypt
Поскольку мы хотим использовать HTTPS нам нужно где-то взять SSL сертификаты для сервисов, есть возможность использовать свои сертификаты, но мы настроем автоматическое получение бесплатных сертификатов от Lets Encrypt.
Поскольку мы хотим использовать HTTPS, нам нужно где-то взять SSL сертификаты для сервисов. У нас есть возможность использовать свои сертификаты, но мы настроем автоматическое получение бесплатных сертификатов от **Lets Encrypt**.
Добавим в конфигурацию (`traefik.yml`) новый блок:
@ -181,17 +192,17 @@ certificatesResolvers:
httpChallenge:
entryPoint: http
```
Здесь:
- `letsEncrypt` — это просто имя резолвера;
- `acme` — тип резолвера (других типов в общем-то и нет);
- `storage` — файл, в котором хранятся сведения о полученных сертификатах;
- `httpChallenge` — тип acme-челенжа, дополнительно указываем параметр — точку входа;
- `letsEncrypt` — это просто имя резолвера
- `acme` — тип резолвера (других типов в общем-то и нет)
- `storage` — файл, в котором хранятся сведения о полученных сертификатах
- `httpChallenge` — тип acme-челенжа, дополнительно указываем параметр — точку входа
- `caServer: "https://acme-staging-v02.api.letsencrypt.org/directory"` — позволяет использовать не основной сервер Lets Encrypt в тестовых целях, так как основной имеет строгие лимиты API (можно закомментировать, когда наладите получение сертификатов).
Также дополним пункт `volumes` в файле `docker-compose.yml`, чтобы сохранять сертификаты при перезапуске контейнера (предварительно создав файл `data/acme.json`):
```yaml
```yaml hl_lines="5"
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
@ -215,20 +226,21 @@ HTTPS настроен, пришло время поднять первый се
- "traefik.http.services.traefik-traefik.loadbalancer.server.port=888"
```
Разберем построчно:
- `traefik.enable=true` — указываем что Traefik должен обеспечить
доступ к этому контейнеру, необходимо для всего остального;
доступ к этому контейнеру, необходимо для всего остального
- `traefik.http.routers.traefik.entrypoints=https` — создаем новый
роутер с точной входа `https`;
роутер с точной входа `https`
- `traefik.http.routers.traefik.rule=Host(`traefik.example.com`)` —
роутер будет жить по адресу traefik.example.com;
роутер будет жить по адресу traefik.example.com
- `traefik.http.routers.traefik.tls=true` — указываем что используется
TLS;
TLS
- `traefik.http.routers.traefik.tls.certresolver=letsEncrypt`
указываем через какой резолвер получать сертификат;
указываем через какой резолвер получать сертификат
- `traefik.http.routers.traefik.service=api@internal` — указываем, что
сервер за этим роутером — `api@internal`, это специальный сервис,
созданный по умолчанию, это как раз и есть дашбоард который мы хотели
увидеть;
увидеть
- `traefik.http.services.traefik-traefik.loadbalancer.server.port=888`
— издержки интерфейса, без этого не заработает, но можно написать
абсолютно любую цифру.
@ -248,25 +260,26 @@ sudo docker-compose down && sudo docker-compose up -d
Когда всё поднимется можно перейти на `traefik.example.com` (тут на самом деле должен быть ваш домен, который направлен на хост с Traefik) и увидеть дашборд.
Дашбоард это хорошо, но мы не хотим, чтобы все пользователи интернета имели к нему доступ, закроем его от внешнего мира с помощью BasicAuth, для это в Traefik есть специальный middleware.
Дашбоард это хорошо, но мы не хотим, чтобы все пользователи интернета имели к нему доступ, закроем его от внешнего мира с помощью BasicAuth, для это в Traefik есть специальный *middleware*.
Для начала сгенерируем для нас строку с логином и паролем (admin/password)^
Для начала сгенерируем для нас строку с логином и паролем (admin/password):
```bash
$ htpasswd -nb admin password
admin:$apr1$vDSqkf.v$GTJOtsd9CBiAFFnHTI2Ds1
```
Теперь добавим в наш `docker-compose.yml` новые строчки:
```yaml
- "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$vDSqkf.v$$GTJOtsd9CBiAFFnHTI2Ds1"
- "traefik.http.routers.traefik.middlewares=traefik-auth"
```
Заметим, что символы `$` из полученной строки мы должны заменить на `$$`.
- `traefik.http.middlewares.traefik-auth.basicauth.users=...` — создаем middleware типа `basicauth` с параметром `users`;
- `traefik.http.routers.traefik.middlewares=traefik-auth` — указываем что роутер `traefik` использует только что-то созданный middleware.
- `traefik.http.middlewares.traefik-auth.basicauth.users=...` — создаем middleware типа `basicauth` с параметром `users`
- `traefik.http.routers.traefik.middlewares=traefik-auth` — указываем что роутер `traefik` использует только что-то созданный middleware
??? note "Весь docker-compose.yml"
```yaml
@ -294,6 +307,8 @@ admin:$apr1$vDSqkf.v$GTJOtsd9CBiAFFnHTI2Ds1
- "traefik.http.routers.traefik.tls.certresolver=letsEncrypt"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.services.traefik-traefik.loadbalancer.server.port=888"
- "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$vDSqkf.v$$GTJOtsd9CBiAFFnHTI2Ds1"
- "traefik.http.routers.traefik.middlewares=traefik-auth"
```
Теперь при попытке доступа к дашборду у нас спросят логин и пароль.
@ -318,7 +333,7 @@ admin:$apr1$vDSqkf.v$GTJOtsd9CBiAFFnHTI2Ds1
Добавим в `docker-compose.yml` ещё один `volume`:
```yaml
```yaml hl_lines="5"
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
@ -333,7 +348,6 @@ admin:$apr1$vDSqkf.v$GTJOtsd9CBiAFFnHTI2Ds1
```yaml
providers:
...
file:
directory: /custom
watch: true
@ -370,7 +384,7 @@ http:
loadBalancer:
servers:
- хосты для балансировки нагрузки
- ...
#- ...
```
Дополнительно мы указываем параметр `passHostHeader: true` чтобы тот хост думал, что он на самом деле смотрит в сеть и прокси нет.

@ -9,8 +9,6 @@
## Modular Rail Network
[![](https://i.imgur.com/7UHaFA1.jpeg)](https://www.factorio.school/view/-K_VpUtsGAlQeBuZ1oez)
[![name](pic)](link)
## Tileable Science Production 0.17-1.0 - Early to Mid Game
[![](http://i.imgur.com/42RoMSil.jpeg)](https://www.factorio.school/view/-KnQ865j-qQ21WoUPbd3)

@ -28,59 +28,87 @@
## Мод-лист
---
Minor Content:
Aircraft
Asphalt Paving
Beautiful Bridge Railway
Clockwork
Fluid Must Flow
Hardcore Start
Jetpack
Loader Redux
Logistic Train Network
Nanobots
Prospector
Robot Attrition
Teleportation_Redux
---
UI and Planners:
Advanced Logistics System Fork
Bob & Angel RAW Patch
Bottleneck
Calculator UI
EvoGUI
Helomod
Recipe Book
Solar Calculator
Upgrade Builder and Planner
YARM
---
Quality Of Life:
EvenDistrobution
Honk
Placeables
Progressive Running
Quality Of Life Research
Reverse Factory
Tree Collision
---
Biters, Map, Visuals:
Alien Biomes High Res
Armored Biters
Artisanal Reskins: All mods
Bullet Trails
Natural Evolution: Buildings2, Enemies (Redux)
Rampant
Resource Spawner Overhaul
| Мод | Ссылка | Описание |
|--|--|--|
| Additional turrets | https://mods.factorio.com/mod/Additional-Turret-updated | Добавляет больше турелей и щитов |
| Advanced Logistics System Fork | https://mods.factorio.com/mod/advanced-logistics-system-fork | Мониторинг ресурсов и сети |
| Auto Research | https://mods.factorio.com/mod/some-autoresearch | Автоматизирует исследования. Переключите графический интерфейс с помощью Shift+T |
| Auto Deconstruct | https://mods.factorio.com/mod/AutoDeconstruct | Этот мод отмечает буры, у которых больше нет ресурсов для добычи для разрушения |
| Automatic Train Painter | https://mods.factorio.com/mod/Automatic_Train_Painter | Автоматически раскрашивает локомотивы и вагоны в зависимости от их содержимого. |
| Belt Balancer (Improved Performance) | https://mods.factorio.com/mod/belt-balancer-performance | Добавляет детали балансира, которые можно собрать вместе, чтобы сбалансировать все регулируемые полосы |
| Bottleneck Lite | https://mods.factorio.com/mod/BottleneckLite | Инструмент для поиска узких мест на вашем заводе |
| Clock | https://mods.factorio.com/mod/clock | Добавляет часы |
| Clockwork | https://mods.factorio.com/mod/Clockwork | Изменяет параметры солнечного цикла |
| Deadlock's Stacking Beltboxes & Compact Loaders | https://mods.factorio.com/mod/deadlock-beltboxes-loaders | Добавляет минималистичные загрузчики 1x1 и ленточные ящики-штабелеры для 5-кратного сжатия |
| Jetpack | https://mods.factorio.com/mod/jetpack | Позволяет создавать реактивный ранец, позволяющий летать на высоких скоростях |
| Lighted Electric Poles + | https://mods.factorio.com/mod/LightedPolesPlus | Добавляет копию каждого электрического столба, включая модифицированные, со встроенным фонарем. |
| Loader Redux | https://mods.factorio.com/mod/LoaderRedux | Добавляет загрузчики. Переписан адд-загрузчик с новой логикой и графикой привязки загрузчика |
| LTN - Logistic Train Network | https://mods.factorio.com/mod/LogisticTrainNetwork | Добавляет остановки логистических поездов, выступающие в качестве опорных точек |
| LTN Combinator Modernized | https://mods.factorio.com/mod/LTN_Combinator_Modernized | Добавьте комбинатор с дружественным графическим интерфейсом для управления сигналами управления LTN для каждой остановки поезда LTN. |
| LTN Content Reader | https://mods.factorio.com/mod/LTN_Content_Reader | Отображение содержимого поставщика и запросчика LTN для определенных идентификаторов сети в качестве вывода комбинатора.|
| LTN Language Pack | https://mods.factorio.com/mod/LTN_Language_Pack | Локализации для LTN |
| LTN Manager | https://mods.factorio.com/mod/LtnManager | Графический интерфейс для управления вашей сетью логистических поездов |
| Miniloader | https://mods.factorio.com/mod/miniloader | Компактные и удобные для работы с ИБП погрузчики 1x1 |
| Russian locale for some mods 2 | https://mods.factorio.com/mod/MyRUS2 | Очередной русификатор для нескольких модов |
| RUSLocalizationsModsForFactorio | https://mods.factorio.com/mod/RUSLocalizationsModsForFactorio | Перевод модов на: Русский язык. |
| Nixie Tubes | https://mods.factorio.com/mod/nixie-tubes | Добавляет газоразрядные трубки для отображения значений из подключенной сети |
| Noxys Waterfill | https://mods.factorio.com/mod/Noxys_Waterfill | Различные размещаемые воды. Очень настраиваемый. |
| Omega Drill | https://mods.factorio.com/mod/OmegaDrill | Добавляет большую мощную дрель. |
| Picker Dollies | https://mods.factorio.com/mod/PickerDollies | Перемещайте большинство размещенных объектов быстро и легко. |
| Placeables | https://mods.factorio.com/mod/Placeables | Окно в стиле панели быстрого доступа, в котором показаны все предметы, которые вы можете использовать для строительства |
| Power Armor MK3 | https://mods.factorio.com/mod/Power%20Armor%20MK3 | Силовая броня MK3 и MK4 |
| Quality of Life research | https://mods.factorio.com/mod/qol_research | Добавляет бонусы и, при необходимости, исследование больших сумок |
| Repair Turret | https://mods.factorio.com/mod/Repair_Turret | Добавляет ремонтные турели |
| Reverse Factory | https://mods.factorio.com/mod/reverse-factory | Машина Reverse Factory переработает (переработает) практически любой предмет |
| Resource Spawner Overhaul | https://mods.factorio.com/mod/rso-mod | Переработана система появления ресурсов. |
| Simulation Helper | https://mods.factorio.com/mod/simhelper | Вспомогательные скрипты для создания симуляций |
| Skandragon's Fusion Robots | https://mods.factorio.com/mod/skan-fusion-robots | Дорогие роботы, которым не нужна подзарядка. |
| Solar Calculator | https://mods.factorio.com/mod/solar-calc | Добавляет калькулятор солнечной энергии |
| Space Extension Mod (SpaceX) | https://mods.factorio.com/mod/SpaceMod | Значительно расширить конечную игру |
| Squeak Through | https://mods.factorio.com/mod/Squeak%20Through | Позволяет вам проходить между тем, что раньше было препятствиями |
| Factorio Standard Library | https://mods.factorio.com/mod/stdlib | Стандартная библиотека Factorio |
| YARM - Resource Monitor | https://mods.factorio.com/mod/YARM | Этот мод поможет вам отслеживать ваши сайты добычи полезных ископаемых |
## Quality Of Life:
| Мод | Ссылка | Описание |
|--|--|--|
| Enhanced Map Colors | [![](https://img.shields.io/badge/dynamic/json?query=downloads_count&suffix=%20downloads&label&color=orange&url=https%3A%2F%2Fmods.factorio.com%2Fapi%2Fmods%2FEnhanced_Map_Colors)](https://mods.factorio.com/mod/Enhanced_Map_Colors) | Добавляет цвет к объектам на карте/мини-карте для контраста. Помогает читаемости карт |
| Even Distribution Lite | [![](https://img.shields.io/badge/dynamic/json?query=downloads_count&suffix=%20downloads&label&color=orange&url=https%3A%2F%2Fmods.factorio.com%2Fapi%2Fmods%2FEvenDistributionLite)](https://mods.factorio.com/mod/EvenDistributionLite) | Равномерно распределите элементы между объектами с помощью Ctrl+перетаскивания |
| Factorio Library | [![](https://img.shields.io/badge/dynamic/json?query=downloads_count&suffix=%20downloads&label&color=orange&url=https%3A%2F%2Fmods.factorio.com%2Fapi%2Fmods%2Fflib)](https://mods.factorio.com/mod/flib) | Набор высококачественных, часто используемых утилит для создания модов Factorio |
| Fluid Level Indicator | [![](https://img.shields.io/badge/dynamic/json?query=downloads_count&suffix=%20downloads&label&color=orange&url=https%3A%2F%2Fmods.factorio.com%2Fapi%2Fmods%2FFluid-level-indicator)](https://mods.factorio.com/mod/Fluid-level-indicator) | Цифровой дисплей, показывающий уровень жидкости/газа в системе |
| Fluid Must Flow | [![](https://img.shields.io/badge/dynamic/json?query=downloads_count&suffix=%20downloads&label&color=orange&url=https%3A%2F%2Fmods.factorio.com%2Fapi%2Fmods%2FFluidMustFlow)](https://mods.factorio.com/mod/FluidMustFlow) | Добавляет очень большие трубы с огромной пропускной способностью |
| FNEI | [![](https://img.shields.io/badge/dynamic/json?query=downloads_count&suffix=%20downloads&label&color=orange&url=https%3A%2F%2Fmods.factorio.com%2Fapi%2Fmods%2FFNEI)](https://mods.factorio.com/mod/FNEI) | Все рецепты предметов и их использование |
| Helmod | [![](https://img.shields.io/badge/dynamic/json?query=downloads_count&suffix=%20downloads&label&color=orange&url=https%3A%2F%2Fmods.factorio.com%2Fapi%2Fmods%2Fhelmod)](https://mods.factorio.com/mod/helmod) | Помощник по планированию вашего завода. Может рассчитывать необходимые ингредиенты |
| Honk | [![](https://img.shields.io/badge/dynamic/json?query=downloads_count&suffix=%20downloads&label&color=orange&url=https%3A%2F%2Fmods.factorio.com%2Fapi%2Fmods%2FHonk)](https://mods.factorio.com/mod/Honk) | Поезда сигналят при остановке или при старте |
## Bob & Angels Mods:
| Мод | Ссылка | Описание |
|--|--|--|
| Angel's Infinite Ores | https://mods.factorio.com/mod/angelsinfiniteores | Добавляет бесконечные руды для базовой игры, Bobmods, Yuoki Industries, Uranium Power, Nucular, Dark Matter Replicators и базовые руды для AngelsRefining |
| Bob's Functions Library | https://mods.factorio.com/mod/boblibrary | Добавляет ряд полезных функций, используемых Bob's Mods |
| Bob & Angel RAWs patch | https://mods.factorio.com/mod/baraws | Мод, улучшающий качество жизни, позволяющий рецептам Боба и Ангела отображать разумные сырые ингредиенты (даже в творческом режиме) |
| Bob's Assembling machines | https://mods.factorio.com/mod/bobassembly | Добавляет сборочные машины 4, 5 и 6. А также другие машины более высоких уровней |
| Bob's Electronics | https://mods.factorio.com/mod/bobelectronics | Добавляет совершенно новую цепочку производства электроники |
| Bob's Personal Equipment | https://mods.factorio.com/mod/bobequipment | Расширяет набор оборудования, доступного в базовом моде для модульной брони |
| Bob's Greenhouse | https://mods.factorio.com/mod/bobgreenhouse | Это теплица, она делает дрова |
| Bob's Adjustable Inserters | https://mods.factorio.com/mod/bobinserters | Добавляет горячие клавиши и графический интерфейс для настройки мест захвата и опускания устройства вставки |
| Bob's Logistics | https://mods.factorio.com/mod/boblogistics | Добавляет вещи, связанные с логистикой |
| Bob's Mining | https://mods.factorio.com/mod/bobmining | Добавляет некоторые полезные инструменты и объекты для майнинга |
| Bob's Modules | https://mods.factorio.com/mod/bobmodules | Расширение системы модулей |
| Bob's Ores | https://mods.factorio.com/mod/bobores | Добавляет полезные руды |
| Bob's Metals, Chemicals and Intermediates | https://mods.factorio.com/mod/bobplates | Переплавляйте лишнюю руду в пластины |
| Bob's Power | https://mods.factorio.com/mod/bobpower | Добавляет новые силовые структуры |
| Bob's Revamp | https://mods.factorio.com/mod/bobrevamp | Реструктуризация технологии и рецептуры |
| Bob's Tech | https://mods.factorio.com/mod/bobtech | Расширение исследований |
| Bob's Vehicle Equipment | https://mods.factorio.com/mod/bobvehicleequipment | Ассортимент оборудования для использования в автомобилях |
| Bob's Warfare | https://mods.factorio.com/mod/bobwarfare | Делайте вещи для войны |
| Deadlock Stacking For Bobs | https://mods.factorio.com/mod/DeadlockStackingForBobs | Добавьте сложенные предметы для Bob's |
## Industrial Revolution 3
| Мод | Ссылка | Описание |
|--|--|--|
| Industrial Revolution 3 | https://mods.factorio.com/mod/IndustrialRevolution3 | Мод капитальной переделки, основанный на прогрессе материалов. |

@ -0,0 +1,11 @@
# Установка Xpenology DSM 7.2
Ставить будем через ARC
https://github.com/AuxXxilium/arc
https://www.reddit.com/r/Xpenology/comments/xho4fg/upgrade_from_6x_to_7x_xpenology/
https://xpenology.com/forum/topic/62221-tutorial-installmigrate-to-dsm-7x-with-tinycore-redpill-tcrp-loader/
https://bafista.ru/kak-obnovit-xpenology-s-dsm-7-1-do-7-2/
Тут же применимо обновление версии Xpenology с 6 до 7.2
Обновление не сильно отличает от новой устанвоки

@ -0,0 +1,46 @@
# SSO вход на Synology через Authentik
Чуть от себя, чуть с [официальной документации](https://kb.synology.com/en-af/DSM/help/DSM/AdminCenter/file_directory_service_sso?version=7).
!!! warning
Применимо к DSM 7.1 и выше.
# Подготовка
Будут использоваться следующие заполнители:
- `synology.company`— это полное доменное имя сервера Synology DSM.
- `authentik.company`— это полное доменное имя установки authentik.
## Настройки на Authentik
В интерфейсе администратора Authentik, в разделе *«Поставщики»* создайте поставщика OAuth2/OpenID со следующими настройками:
- Название: Synology
- URI перенаправления: `https://synology.company/#/signin` (обратите внимание на отсутствие косой черты и включение порта веб-интерфейса)
- Ключ подписи: выберите любой доступный ключ.
- Режим темы: `Based on the Users's Email`
- Обратите внимание на `Client ID` и `Client secret`.
Далее. Создайте приложение, использующее этого провайдера. При необходимости примените ограничения доступа к приложению.
## Настройка Synology DSM
Чтобы настроить Synology DSM для использования Authentik в качестве поставщика OpenID Connect 1.0:
1. В панели управления DSM перейдите в раздел **Домен/LDAP** -> **Клиент SSO**.
2. Установите флажок **Выберите SSO по умолчанию на странице входа в систему**.
3. Установите флажок **Включить службу OpenID Connect SSO**.
4. Нажмите на кнопку **Настройки OpenID Connect SSO**.
5. Настройте следующие значения:
- Профиль: OIDC
- Тип учетной записи: Домен/LDAP/локальный
- Имя: Authentik
- Well-known url: скопируйте его из «URL-адреса конфигурации OpenID» в провайдере аутентификации (URL-адрес заканчивается на «/.well-known/openid-configuration»).
- Идентификатор приложения: «Идентификатор клиента» от поставщика аутентификации.
- Секрет приложения: «Секрет клиента» от провайдера аутентификации.
- Переадресация URI: `https://synology.company/#/signin` (он должен точно соответствовать «URI перенаправления» в authentik)
- Область действия авторизации: `openid profile email`
- Заявка на имя пользователя: `preferred_username`
- Сохраните настройки.

@ -0,0 +1,29 @@
# Обновление пакета корневых сертификатов CA
Я столкнулся с проблемой, что мой Synology NAS не может получить данные из локального реестра Docker:
```
docker: Error response from daemon: Get "https://redacted-local-hostname.net/v2/": x509: certificate has expired or is not yet valid
```
Оказывается, мой Synology не получает последние корневые сертификаты CA. Я обнаружил это, пытаясь скачать докер образ. Каждый раз выходила ошибка. Тогда я решил постучаться куда нить через **curl**.
```bash
curl -I https://st1t.ru
curl: (60) SSL certificate problem: certificate has expired
More details here: https://curl.haxx.se/docs/sslcerts.html
...
```
Исправить оказалось довольно легко. Нужно лишь скачать актуальные корневые сертифиаты. Приведенные ниже команды загружают сертификаты с сайта Curl.se в формате PEM. Перемещаем их туда, где Synology хранит связку CA-сертификатов, перезаписывая его. Мы сделаем резервную копию исходного пакета сертификатов CA с *.backup* расширением на тот случай, если по какой-либо причине вы захотите вернуться.
```bash
cp /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt.backup
wget --no-check-certificate https://curl.se/ca/cacert.pem
mv cacert.pem /etc/ssl/certs/ca-certificates.crt
```
После этого та же команда **curl** начала работать успешно. Однако Docker по-прежнему выдавал ту же ошибку — то есть не получал обновленные корневые сертификаты. Чтобы заставить работать, нужно перезапустить демон Synology Docker:
```bash
synoservice --restart pkgctl-Docker
```

@ -0,0 +1,27 @@
# ТСД - Терминалы Сбора Данных
1. [Решение проблем с ТСД Motorola](troubleshooting.md)
2. [Компонентный ремонт](repair.md)
## Motorola MC 9090
1. [Переустановка ОС CE 5.0](reinstall-os/ce5.md)
2. [Переустановка ОС WM 6.1](reinstall-os/m61.md)
## Motorola MC 9200
1. [Переустановка ОС](reinstall-os/ce7.md)
2. [Настройка ТСД](config-ce.md)
3. [Настройка Wi-Fi](config-wifi.md)
4. [Настройка TelnetCE](config-telnetce.md)
5. [Установка TelnetCE](install-telnetce.md)
## Софт
!!! note
7.0 версии не требуют лицензии
1. [Zebra MC9000](http://www.wavelink.com/Zebra-MC9000-Emulators-downloads/)
2. [Zebra MC9100](http://www.wavelink.com/Zebra-MC9100-Emulators-downloads/)

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="640" height="640" viewBox="0 0 640 640" xml:space="preserve">
<desc>Created with Fabric.js 5.3.0</desc>
<defs>
</defs>
<g transform="matrix(0.9544918218 0 0 0.9544918218 320 325.5657767239)" id="0UAuLmXgnot4bJxVEVJCQ" >
<linearGradient id="SVGID_136_0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1 0 0 1 -236.6470440833 -213.9441386034)" x1="259.78" y1="261.15" x2="463.85" y2="456.49">
<stop offset="0%" style="stop-color:#74C2FF;stop-opacity: 1"/>
<stop offset="100%" style="stop-color:rgb(134,230,169);stop-opacity: 1"/>
</linearGradient>
<path style="stroke: rgb(242,242,242); stroke-opacity: 0.51; stroke-width: 190; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: url(#SVGID_136_0); fill-rule: nonzero; opacity: 1;" transform=" translate(0, 0)" d="M 131.8665 -139.04883 C 159.01022 -111.20969000000001 170.12421 -99.45396000000001 203.11849999999998 -51.72057000000001 C 236.1128 -3.9871800000000093 264.44147999999996 83.98416999999998 187.33995 144.05073 C 177.72728999999998 151.53955 166.73827 158.81189999999998 154.65932999999998 165.65812999999997 C 69.85514999999998 213.72433999999998 -68.67309000000003 240.78578 -161.79279 174.28328999999997 C -268.17583 98.30862999999997 -260.10282 -68.66557000000003 -144.35093 -170.50579000000005 C -28.599040000000002 -272.34602000000007 104.72278 -166.88797000000005 131.86649999999997 -139.04883000000004 z" stroke-linecap="round" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 637 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

@ -0,0 +1,31 @@
# Получение кастомных маршрутов eBGP
Выпускаем трафик BGP с маршрутизатора
```
/ip firewall filter add action=accept chain=output protocol=tcp dst-address=51.75.66.20 dst-port=179 out-interface=site2
```
Прописываем маршрут до сервиса, который содержит маршруты BGP. Это нужно для того, чтобы избежать фильтрации BGP.
```
/ip route add dst-address=51.75.66.20/32 gateway=site2
```
Настраиваем пиринг с сервисом
!!! info "Mikrotik ROS7"
```
/routing bgp template
add as="64999" disabled=no hold-time=4m input.filter=bgp_in .ignore-as-path-len=yes keepalive-time=1m multihop=yes name=BGP_1 routing-table=main
/routing bgp connection add as=64999 disabled=no hold-time=4m input.filter=bgp_in .ignore-as-path-len=yes keepalive-time=1m local.address=<local_IP> .role=\
ebgp multihop=yes name=BGP1 output.filter-chain=discard \
remote.address=51.75.66.20/32 .as=65444 router-id=<WAN_IP> \
routing-table=main templates=BGP_1
/routing filter rule
add chain=bgp_in disabled=no rule="set gw site2; accept;
add chain=discard disabled=no rule=reject
```

@ -0,0 +1,23 @@
# Маркировка траффика
Сделаем Policy-based Routing (PBR) - маршрутизация на основе определенных политик (правил, условий), которые являются относительно гибкими и устанавливаются Администратором. Другими словами это технология предоставляет условия гибкой маршрутизации (если смотреть на технологию с первоочередной ее задачи), по источнику или назначению пакета.
Формируем списки (`address-list`) для адресов или подсетей:
```
# auth.servarr.com - ресурс, у которого меняем маршрут
/ip firewall address-list add list=PBR address=auth.servarr.com
```
Создаем таблицу маршрутизации
```
/routing table
add Disabled=no name=PBR fib
```
Настраиваем правила роутинга
```
/ip firewall mangle add disabled=no action=mark-routing chain=prerouting dst-address-list=PBR new-routing-mark=PBR passthrough=yes src-address=192.168.88.2-192.168.88.254
/ip route add disabled=no dst-address=0.0.0.0/0 type=unicast gateway=site2 routing-mark=PBR scope=30 target-scope=10
/ip firewall nat add chain=srcnat src-address=192.168.88.0/24 out-interface=site2 action=masquerade
```

@ -1,69 +0,0 @@
# Обход блокировок
Расписывать как поднять и настроить VPN через Wireguard или OpenVPN не буду. В сети достаточно инструкций. Чуть ниже слева есть еще одна от меня.
Варианта как обходить блокировки 2:
- через таблицу маршрутизации, куда вносим ресурсы руками или скриптами
- через BGP с одного "неизвестного" сайта
## Вариант 1: таблица маршрутизации
Статья о маркировке трафика, для отправки его в VPN: [Policy_Base_Routing](https://wiki.mikrotik.com/wiki/Policy_Base_Routing)
Формируем списки (`address-list`) для подсетей, трафик на которые будем гнать через VPN:
```
# auth.servarr.com - заблоченный ресурс
/ip firewall address-list add list=unblock address=auth.servarr.com
```
Вместо формирования руками, готовые списки можно выкачивать с [https://antifilter.download](https://antifilter.download)
Создаем таблицу маршрутизации
```
/routing table
add Disabled=no name=unblock fib
```
Настраиваем правила роутинга
```
/ip firewall mangle add disabled=no action=mark-routing chain=prerouting dst-address-list=unblock new-routing-mark=unblock passthrough=yes src-address=192.168.88.2-192.168.88.254
/ip route add disabled=no dst-address=0.0.0.0/0 type=unicast gateway=wireguard1 routing-mark=unblock scope=30 target-scope=10
/ip firewall nat add chain=srcnat src-address=192.168.88.0/24 out-interface=wireguard1 action=masquerade
```
## Вариант 2: BGP
Проверяем, что VPN жив и работает.
Выпускаем трафик BGP с маршрутизатора
```
/ip firewall filter add action=accept chain=output protocol=tcp dst-address=51.75.66.20 dst-port=179 out-interface=wireguard1
```
Прописываем маршрут до сервиса antifilter.network через VPN. Это нужно для того, чтобы если провайдер блочит или фильтрует BGP, на нас это не влияло.
```
/ip route add dst-address=51.75.66.20/32 gateway=wireguard1
```
Настраиваем пиринг с сервисом
!!! info "Mikrotik ROS7"
```
/routing bgp template
add as="64999" disabled=no hold-time=4m input.filter=bgp_in .ignore-as-path-len=yes keepalive-time=1m multihop=yes name=antifilter routing-table=main
/routing bgp connection
add as=64999 disabled=no hold-time=4m input.filter=bgp_in \
.ignore-as-path-len=yes keepalive-time=1m local.address=<local_IP> .role=\
ebgp multihop=yes name=bgp-antifilter.net output.filter-chain=discard \
remote.address=51.75.66.20/32 .as=65444 router-id=<WAN_IP> \
routing-table=main templates=antifilter
/routing filter rule
add chain=bgp_in disabled=no rule="set gw wireguard1; accept;
add chain=discard disabled=no rule=reject
```

@ -0,0 +1,4 @@
# Полезные ресурсы
[HTPasswd Generator](https://www.web2generators.com/apache-tools/htpasswd-generator)

@ -1,27 +0,0 @@
# ТСД - Терминалы Сбора Данных
1. [Решение проблем с ТСД Motorola](../../other/tsd/troubleshooting.md)
2. [Компонентный ремонт](../../other/tsd/repair.md)
## Motorola MC 9090
1. [Переустановка ОС CE 5.0](../../other/tsd/reinstall-os/ce5.md)
2. [Переустановка ОС WM 6.1](../../other/tsd/reinstall-os/m61.md)
## Motorola MC 9200
1. [Переустановка ОС](../../other/tsd/reinstall-os/ce7.md)
2. [Настройка ТСД](../../other/tsd/config-ce.md)
3. [Настройка Wi-Fi](../../other/tsd/config-wifi.md)
4. [Настройка TelnetCE](../../other/tsd/config-telnetce.md)
5. [Установка TelnetCE](../../other/tsd/install-telnetce.md)
## Софт
!!! note
7.0 версии не требуют лицензии
1. [Zebra MC9000](http://www.wavelink.com/Zebra-MC9000-Emulators-downloads/)
2. [Zebra MC9100](http://www.wavelink.com/Zebra-MC9100-Emulators-downloads/)

@ -0,0 +1,84 @@
# Proxmox VE, проброс физического HDD в виртуальную машину
Периодически так бывает, что нужно подключить к виртуальной машине дополнительный физический диск. Долго расписывать не буду что и как.
Все решается 1 командой на ноде Proxmox VE:
```bash
qm set <vm_id> -[virtio|sata|ide|scsi][№] [/dev/disk/by-id|/dev/disk/by-uuid]
```
где:
* `vm_id` - номер виртуальной машины (в интерфейсе Proxmox указывается перед именем VM)
* `virtio|sata|ide|scsi` - допустимый тип и номер HDD интерфейса
* `/dev/disk/by-id|/dev/disk/by-uuid` - пробрасываемою физическое устройство
# ID и UUID
Возникает вопрос: где же взять путь `/dev/disk/by-id` или `/dev/disk/by-uuid`.
Все просто, чтобы вывести UUID диска, нужно выполнить:
```bash
blkid /dev/sdb1
```
Так же, можно проверить, есть ли диск в директории /by-uuid:
```bash
ls /dev/disk/by-uuid/
```
Если диска нет, то можно использовать его ID. Чтобы получить идентификатор (серийный номер диска) выполните:
```bash
lshw -class disk -class storage
```
Скопируйте значение serial. Например, *Serial: QP8516N*
Выведите идентификаторы диска и разделов на нем по его серийному номеру:
```bash
ls -l /dev/disk/by-id | grep QP8516N
```
# Команда
Итого. Чтобы пробросить диск по ID, выполняем команду:
```bash
qm set 100 -virtio2 /dev/disk/by-id/scsi-36003005700ba2e00ff00002a02aec9e8
```
А для UUID:
```bash
qm set 100 -virtio2 /dev/disk/by-uuid/0b56138b-6124-4ec4-a7a3-7c503516a65c
```
Проверить, что диск подключился можно в веб-интерфейсе Proxmox, на вкладке Hardware виртуалки или проверив конфигурационный файл ВМ:
```bash
cat /etc/pve/qemu-server/100.conf
```
# Проверка
Должно появится строка вида
```bash
virtio0: volume=/dev/disk/by-uuid/0b56138b-6124-4ec4-a7a3-7c503516a65c
```
или
```bash
sata0: volume=/dev/disk/by-uuid/0b56138b-6124-4ec4-a7a3-7c503516a65c
```
---
Можно почитать [тут](https://pve.proxmox.com/wiki/Passthrough_Physical_Disk_to_Virtual_Machine_(VM)#Check_Configuration_File)

@ -0,0 +1,322 @@
# NVidia Proxmox + LXC
Не так давно мне потребовалось добавить поддержку перекодировки в Plex, используя видеокарту. У меня уже был сервер Plex, который работал внутри Docker. Сам Docker стоял внутри LXC контейнера Proxmox. Перерыв кучу материалов и потратив не мало времени, решил сделать руководство.
Я предполагаю, что уже настроен хост Proxmox и LXC. Работает под управлением Debian 11 (Bullseye). В моем примере я буду запускать контейнер LXC с именем plex(ID 101) на моем хосте Proxmox. Все команды через терминал, без использования графического интерфейса. LXC получит привилегию `fuse=1,nesting=1` набора функций. В качестве видеокарты я буду использовать Nvidia GeForce 1050Ti. Все команды будут выполняться как root.
!!! info "Запуск в rootless LXC"
Обратите внимание, что могут потребоваться другие шаги, если вы попытаетесь запустить это в контейнере LXC без root-прав или непривилегированном.
## Proxmox хост
Первый шаг - это установка драйверов на хост. Хотя у Nvidia и есть официальный репозиторий Debian, который мы могли бы использьваоть, делать этого не будем. Потому что это может создать проблему - позднее нужно будет поставить в контейнер LXC драйверы, но без модулей ядра. Сделать это используя официальный репозиторий Debian я не смог. Поэтому будем устанавливать драйверы вручную. Другая проблема использования официального репозитория Debian - драйвер на хосте и в контейнере должны быть одной версии.
Для начала нужно отключить модуль ядра Nouveau, прежде чем сможем установить драйверы NVIDIA
```
echo -e "blacklist nouveau\noptions nouveau modeset=0" > /etc/modprobe.d/blacklist-nouveau.conf
update-initramfs -u
reboot
```
Устанавливаем пакеты, необходимые для сборки драйверов ядра NVIDIA (нужны только на хосте)
```
apt install build-essential
```
Установливаем заголовки pve, соответствующие вашему текущему ядру. Для старых версий нужно использовать `pve-headers-$(uname -r)`
```
apt install proxmox-headers-$(uname -r)
```
Скачиваем и устанавливаем драйвер nvidia. 550.54.14 был последним на момент написания статьи.
```
wget -O NVIDIA-Linux-x86_64-550.54.14.run https://ru.download.nvidia.com/XFree86/Linux-x86_64/550.54.14/NVIDIA-Linux-x86_64-550.54.14.run
chmod +x NVIDIA-Linux-x86_64-550.54.14.run
./NVIDIA-Linux-x86_64-550.54.14.run --check
./NVIDIA-Linux-x86_64-550.54.14.run
```
!!! tip
При установке, будет выбор что ставить дополнительно. В пунктах, перечисленных ниже, нужно ответить **No**
- install 32bit compability drivers
- should update X config
После установки драйверов нужно добавить несколько правил udev. Это необходимо для того, чтобы гарантировать загрузку правильных модулей ядра и создание всех соответствующих файлов устройств при загрузке.
``` title="добавляем модули ядра"
echo -e '\n# load nvidia modules\nnvidia-drm\nnvidia-uvm' >> /etc/modules-load.d/modules.conf
```
добавьте следующее в `/etc/udev/rules.d/70-nvidia.rules` - создаст соответствующие файлы устройств в `/dev/` во время загрузки
```
KERNEL=="nvidia", RUN+="/bin/bash -c '/usr/bin/nvidia-smi -L && /bin/chmod 666 /dev/nvidia*'"
KERNEL=="nvidia_uvm", RUN+="/bin/bash -c '/usr/bin/nvidia-modprobe -c0 -u && /bin/chmod 0666 /dev/nvidia-uvm*'"
SUBSYSTEM=="module", ACTION=="add", DEVPATH=="/module/nvidia", RUN+="/usr/bin/nvidia-modprobe -m"
```
Чтобы избежать выгрузки модуля драйвера/ядра всякий раз, когда графический процессор не используется, нужно запустить службу сохранения, предоставляемую Nvidia . Он становится доступен после установки драйвера.
Копируем и извлекаем.
```
cp /usr/share/doc/NVIDIA_GLX-1.0/samples/nvidia-persistenced-init.tar.bz2 .
bzip2 nvidia-persistenced-init.tar.bz2
tar -xf nvidia-persistenced-init.tar
```
Удаляем старый.
```
rm /etc/systemd/system/nvidia-persistenced.service
```
Устанавливаем.
```
chmod +x nvidia-persistenced-init/install.sh
./nvidia-persistenced-init/install.sh
```
Проверка, что все ОК.
```
systemctl status nvidia-persistenced.service
rm -rf nvidia-persistenced-init*
```
Если до этого момента не было ошибок, то можно перезагрузить хост Proxmox. После перезагрузки, введя команду `nvidia-smi`, можно увидеть информацию про видеокарту.
```
root@pve1:~# nvidia-smi
Sat Mar 9 12:59:57 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.14 Driver Version: 550.54.14 CUDA Version: 12.4 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce GTX 1050 Ti On | 00000000:03:00.0 Off | N/A |
| 0% 35C P8 N/A / 75W | 4MiB / 4096MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+-----------------------------------------------------------------------------------------+
```
Проверим работу службы:
```
root@pve1:~# systemctl status nvidia-persistenced.service
● nvidia-persistenced.service - NVIDIA Persistence Daemon
Loaded: loaded (/lib/systemd/system/nvidia-persistenced.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2024-03-09 00:38:15 +05; 12h ago
Process: 1543 ExecStart=/usr/bin/nvidia-persistenced --user nvidia-persistenced (code=exited, status=0/SUCCESS)
Main PID: 1546 (nvidia-persiste)
Tasks: 1 (limit: 76887)
Memory: 944.0K
CPU: 328ms
CGroup: /system.slice/nvidia-persistenced.service
└─1546 /usr/bin/nvidia-persistenced --user nvidia-persistenced
Mar 09 00:38:14 ekb-pve1 systemd[1]: Starting NVIDIA Persistence Daemon...
Mar 09 00:38:14 ekb-pve1 nvidia-persistenced[1546]: Started (1546)
Mar 09 00:38:15 ekb-pve1 systemd[1]: Started NVIDIA Persistence Daemon.
```
Проверим, что появились устройства в `/dev/`
```
root@pve1:~# ls -alh /dev/nvidia*
crw-rw-rw- 1 root root 195, 0 Mar 9 00:38 /dev/nvidia0
crw-rw-rw- 1 root root 195, 255 Mar 9 00:38 /dev/nvidiactl
crw-rw-rw- 1 root root 195, 254 Mar 9 00:38 /dev/nvidia-modeset
crw-rw-rw- 1 root root 511, 0 Mar 9 00:38 /dev/nvidia-uvm
crw-rw-rw- 1 root root 511, 1 Mar 9 00:38 /dev/nvidia-uvm-tools
/dev/nvidia-caps:
total 0
drwxr-xr-x 2 root root 80 Mar 9 00:38 .
drwxr-xr-x 21 root root 5.0K Mar 9 03:03 ..
cr-------- 1 root root 236, 1 Mar 9 00:38 nvidia-cap1
cr--r--r-- 1 root root 236, 2 Mar 9 00:38 nvidia-cap2
```
Понять что все хорошо - есть минимум 5 файлов `/dev/nvidia*`.
## LXC-контейнер
Теперь, нужно добавить конфигурацию в LXC-контейнер. Останаливаем работу контейнера и вносим изменения в файле конфигурации LXC.
Отредактируем `/etc/pve/lxc/101.conf` и добавим:
```
lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 237:* rwm
lxc.cgroup2.devices.allow: c 240:* rwm
```
Монтирование устройств nvidia в контейнер LXC
```
lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-caps/nvidia-cap1 dev/nvidia-caps/nvidia-cap1 none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-caps/nvidia-cap2 dev/nvidia-caps/nvidia-cap2 none bind,optional,create=file
```
Числа в строках с `cgroup2` взяты из 5 столбца в списках устройств выше (команда `ls -alh /dev/nvidia*`)
После запускаем контейнер и приступаем к установке драйева Nvidia. Будем ставить без драйеверов ядра.
```
dpkg --add-architecture i386
apt update
apt install libc6:i386
wget -O NVIDIA-Linux-x86_64-550.54.14.run https://ru.download.nvidia.com/XFree86/Linux-x86_64/550.54.14/NVIDIA-Linux-x86_64-550.54.14.run
chmod +x NVIDIA-Linux-x86_64-550.54.14.run
./NVIDIA-Linux-x86_64-550.54.14.run --check
./NVIDIA-Linux-x86_64-550.54.14.run --no-kernel-module
```
Как и для хоста, отказываем от обновления конфигурации X
После, выполняем reboot контейнеру LXC. Проверим, что все работает используя `ls -alh /dev/nvidia*` и `nvidia-smi`. Вывод будет таким же, как и для хоста.
## Docker контейнер
Буду считать, что Plex уже работает, но транскодинг выполняется на процессоре.
Нужно установить **NVIDIA Container Toolkit**:
```
apt install -y curl
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
apt update
apt install nvidia-container-toolkit
nvidia-ctk runtime configure --runtime=docker
systemctl daemon-reload
systemctl restart docker
```
Проверить, что Docker работает с поддержкой GPU можно через контейнер:
```
user@media:~$ docker run --rm --gpus all nvidia/cuda:11.0.3-base nvidia-smi
Sat Mar 9 08:17:54 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.14 Driver Version: 550.54.14 CUDA Version: 12.4 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce GTX 1050 Ti Off | 00000000:03:00.0 Off | N/A |
| 0% 35C P8 N/A / 75W | 4MiB / 4096MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+-----------------------------------------------------------------------------------------+
```
## Plex + GPU
Нужно внести допстрочки в файл docker-compose, чтобы Plex начал видеть нашу видеокарту. Я приведу полный пример, как в итоге должен выглядеть файл.
```yaml hl_lines="9-16 33 34"
version: "3.7"
services:
plex:
container_name: plex
image: linuxserver/plex:latest
profiles:
- plex
restart: unless-stopped
runtime: nvidia # закоментить, если образ plexinc/pms-docker
# Использование строк ниже, если образ plexinc/pms-docker
#deploy:
# resources:
# reservations:
# devices:
# - capabilities: [gpu]
ports:
- "32400:32400"
- "32400:32400/udp"
security_opt:
- no-new-privileges:true
volumes:
- ./plex:/config
- ./plex/temp:/transcode
- /mnt:/mnt:ro
environment:
- ADVERTISE_IP="http://172.18.1.250:32400/"
- PUID=$PUID
- PGID=$PGID
- TZ=$TZ
- VERSION=docker
- PLEX_CLAIM=$PLEX_CLAIM
- NVIDIA_VISIBLE_DEVICES=all
- NVIDIA_DRIVER_CAPABILITIES=compute,video,utility
```
Проверить что все работает, можно зайдя на свой сервер Plex и запустить какой нить фильм. В статистике, будет что то типо такого:
![](../images/proxmox/proxmox-nvidia-1.png)
## Обновление
Каждый раз, когда обновляется ядро, нужно переустановить драйвер на хосте Proxmox. При установке той же версии, что и стояла изначально, процесс прост: перезапустить исходную установку драйвера. В контейнере LXC ничего делать не нужно, так как версия остается той же)
```
./NVIDIA-Linux-x86_64-550.54.14.run
reboot
```
### Обновление драйвера
При обновлении драйвера Nvidia, нужно выполнеить несколько дополнительных шагов. Если на хосте Proxmox уже есть работающий драйвер, то нужно для анчала удалить старый драйвер (иначе будут проблемы: при выгрузке модуля, будет происходить моментальная его загрузка обратно)
Удалим старый драйвер
```
./NVIDIA-Linux-x86_64-510.47.03.run --uninstall
reboot
```
Если было обновление ядра, то нужно скачать заново заголовки. Для старых версий нужно использовать `pve-headers-$(uname -r)`
```
apt install proxmox-headers-$(uname -r)
```
Установим новую версию. Для примера версия та же что и выше.
```
wget -O NVIDIA-Linux-x86_64-550.54.14.run https://ru.download.nvidia.com/XFree86/Linux-x86_64/550.54.14/NVIDIA-Linux-x86_64-550.54.14.run
chmod +x NVIDIA-Linux-x86_64-550.54.14.run
./NVIDIA-Linux-x86_64-550.54.14.run --check
./NVIDIA-Linux-x86_64-550.54.14.run
reboot
```
!!! tip
При установке, будет выбор что ставить дополнительно. В пунктах, перечисленных ниже, нужно ответить **No**
- install 32bit compability drivers
- should update X config
После перезагрузки, проверим что все работает, используя `nvidia-smi`
Проверим, что номера cgroup не изменились. если нужно, то меняем их под новые значения в файле конфигурации LXC
Далее, обновляем драйвера в контейнере LXC
```
wget -O NVIDIA-Linux-x86_64-550.54.14.run https://ru.download.nvidia.com/XFree86/Linux-x86_64/550.54.14/NVIDIA-Linux-x86_64-550.54.14.run
chmod +x NVIDIA-Linux-x86_64-550.54.14.run
./NVIDIA-Linux-x86_64-550.54.14.run --check
./NVIDIA-Linux-x86_64-550.54.14.run --no-kernel-module
```
Как и для хоста, отказываем от обновления конфигурации X
После, выполняем reboot контейнеру LXC. Проверим, что все работает используя `ls -alh /dev/nvidia*` и `nvidia-smi`. Вывод будет таким же, как и для хоста.
Обновим **NVIDIA Container Toolkit**:
```
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
apt update
apt install nvidia-container-toolkit
apt upgrade
```
Перезагружаем контейнер LXC. Все должно рбаотать с новым драйвером.

@ -1,2 +1,3 @@
User-agent: *
Sitemap: https://st1t.ru/sitemap.xml
Clean-param: q

@ -0,0 +1,95 @@
# Установка Home Assistant на Debian 12
## Подготовка
### Установка Debian
Рассматривать подробно установку не буду. Ищите в интернете.
### Установка OS Agent, Docker и зависимостей
После того, как основная операционная система установилась и была выполнена настройка, начнем установку агента `os-agent`. Он используется для разных типов установки HA и позволяет версии Supervisor обмениваться данными с основной операционной системой.
Для этого в терминале выполним команды обновления Debian, установки Docker, необходимых зависимостей для OS Agent, а также установщика Supervised.
!!! warning
Внимание: все команды здесь и далее запускаем по одной, и дожидаемся их завершения!
```bash
sudo -i
```
??? tip "При выполнении команды вы получили сообщение __команда `sudo` не найдена__"
При установке на "голый" Debian, скорее всего, команды sudo в системе не окажется. Устанавливаем так:
```bash
su -
apt install sudo
```
Теперь добавляем пользователя в группу sudo:
```bash
usermod -aG sudo [ИМЯПОЛЬЗОВАТЕЛЯ]
```
После, делаем релогон в систему
```bash
apt update && sudo apt upgrade -y && sudo apt autoremove -y
apt --fix-broken install
apt install apparmor jq wget curl udisks2 libglib2.0-bin network-manager dbus lsb-release systemd-journal-remote systemd-resolved -y
```
??? tip "Стала возникать ошибка __#Could not resolve host: get.docker.com__"
Во время установки зависимостей, ставится пакет systemd-resolved. Из-за его установки, меняется DNS на дефолтный: 127.0.0.1. Чтобы решить проблему, необходимо внести правки в файл `resolved.conf`
```bash
sudo nano /etc/systemd/resolved.conf
```
В открывшемся файле раскомментируем и правим строку DNS, указав адрес вашего роутера, например: `DNS=192.168.1.1`.
Сохраняем результат («Ctrl+X», затем «y», а затем «Enter» для подтверждения), после чего перезапускаем systemd-resolved:
```bash
sudo systemctl restart systemd-resolved
```
```bash
curl -fsSL get.docker.com | sh
```
Далее перезагружаем систему. И после ребута, проверяем, что у нас права root:
```bash
sudo -i
```
Затем на [странице OS Agent](https://github.com/home-assistant/os-agent/releases/latest) находим последнюю версию и вставляем её в команды ниже (в примере указана версия 1.6.0):
```bash
wget https://github.com/home-assistant/os-agent/releases/download/1.6.0/os-agent_1.6.0_linux_x86_64.deb
dpkg -i os-agent_1.6.0_linux_x86_64.deb
```
### Установка Home Assistant Supervised
Теперь можно перейти к установке Home Assistant Supervised.
Выполняем команды:
```bash
wget -O homeassistant-supervised.deb https://github.com/home-assistant/supervised-installer/releases/latest/download/homeassistant-supervised.deb
apt install ./homeassistant-supervised.deb
```
!!! note
На этом шаге может появиться предупреждение:
`файл /root/homeassistant-supervised.deb недоступен для пользователя _apt. - pkgAcquire::Run (13: Отказано в доступе)`
Так как программа-установщик, не имея нужных прав доступа к текущему каталогу, вынуждена была получить привилегии root для выполнения установки. Сама установка при этом завершается успешно, предупреждение можно игнорировать.
Если в процессе установки было предложено выбрать тип машины, то выбираем generic-x86-64.
Время установки обычно в пределах 5 минут, проверить ход настройки Home Assistant, можно подключившись к IP-адресу вашего компьютера в Chrome/Firefox через порт 8123 (например, http://192.168.1.10:8123). Как только вы увидели экран входа в систему - настройка завершена, и пора настроить имя учетной записи и пароль. Также вы можете сразу настроить любые интеллектуальные устройства, которые Home Assistant автоматически обнаружил в вашей сети.

@ -9,8 +9,8 @@
## Карточка
![](../../images/hass/card-budilnik-1.png)
![](../../images/hass/card-budilnik-2.png)
![](../../../images/hass/card-budilnik-1.png)
![](../../../images/hass/card-budilnik-2.png)
??? example "Код карточки"

@ -2,7 +2,7 @@
Чтоб установить актуальную версию, нам нужно зайти в магазин дополнений и добавить туда новую ссылку: `https://github.com/zigbee2mqtt/hassio-zigbee2mqtt`
![](../images/hass/card-budilnik-1.png)
![](../../images/hass/zigbee2mqtt-1.png)
После добавления этой ссылки в репозитории, необходимо перезапустить Home Assistant.
@ -35,7 +35,7 @@ USB Stick Sonoff ZB Dongle-E это новый координатор Zigbee
6. Выбираем **Все оборудование**.
7. Находим через поиск наш стик - можно ввести в поиск sonoff, покажется адрес
![](../images/hass/zigbee2mqtt-2.png)
![](../../images/hass/zigbee2mqtt-2.png)
Копируем строчу начиная от **DEVLINKS:**. Строчка должна выглядеть примерно так:

@ -0,0 +1,53 @@
новый контроллер
https://wirenboard.com/wiki/Wiren_Board_7.4
обновляем прошивку https://wirenboard.com/wiki/Wiren_Board_7.4_Firmware_Update#web-ui
сменить пароль рута https://wirenboard.com/wiki/SSH#%D0%9B%D0%BE%D0%B3%D0%B8%D0%BD_%D0%B8_%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C
защитить веб интерфейс https://wirenboard.com/wiki/%D0%97%D0%B0%D1%89%D0%B8%D1%82%D0%B0_%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D0%B5%D0%BC
Установите верный часовой пояс. https://wirenboard.com/wiki/Time
```
timedatectl set-timezone Asia/Yekaterinburg
```
https://github.com/4mr/wb-engine
## Новое устройство для Modbus
Первым делом, увеличиваем скорость работы. Со стандартных 9600 на 115200, что соответствует "быстрому modbus"
Подключаемся к контроллеру по ssh и останавливаем службу `wb-mqtt-serial`. Затем выставляем нужную скорость и запускаем службу обратно.
```bash
systemctl stop wb-mqtt-serial
modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-2 -a212 -t0x06 -r110 1152
systemctl start wb-mqtt-serial
```
Разберем 2 строчку подробнее:
- `-b9600` - текущая скорость работы
- `-a212` - адрес устройство в modbus
- `/dev/ttyRS485-2` - через какой интерфейс подключаемся
- `-r110 1152` - записываем в регистр **110** значение скорости *115200*
## Смена ID-адреса у устройства
Останавливаем службу `wb-mqtt-serial`. Затем выставляем новый адрес и запускаем службу обратно.
Идентификацию делаем по серийноу номеру:
```
systemctl stop wb-mqtt-serial
wb-modbus-scanner -d /dev/ttyRS485-2 -b 115200 -s 174072 -i 51 - сменить адрес у устройства с SN=174072
systemctl start wb-mqtt-serial
```
Разберем 2 строчку подробнее:
- `-b 115200` - текущая скорость работы
- `-s 174072` - серийник устройства
- `/dev/ttyRS485-2` - через какой интерфейс подключаемся
- `-i 51` - новый адрес

@ -0,0 +1,35 @@
# Подключение и настройка термостата Hessway.
Купил себе в дом термостат Hessway c управлением по RS-485 (Modbus). С установкой правда возникли сложности, тк Wirenboard отказывался самостоятельно находить устройство.
Для начала физическое подключение. Шина RS подключается по 2 проводам, на термостате красный и белый. **В большинстве случаев A=красный, B=белый. Но это же китайцы, может быть и по другому.**
Параметры подключения RS-485 с завода:
- Baud rate — 9600 бит/с,
- Parity — None,
- Data bits — 8,
- Stop bits — 1.
Но даже с этими параметрами, не находит. Поэтому будет прописывать вручную. С завода, у термостата адрес 1. Его можно поменять через меню:
1. Выключите термостат нажатием на кнопку ON/OFF.
2. Зажмите одновременно кнопки M и Clock на 5 секунд — термостат войдет в сервисный режим.
3. Кратким нажатием на кнопку M выберите параметр C.
4. Кнопками вверх ↑ и вниз ↓ установите новый адрес термостата.
5. После установки адреса подождите 5 секунд, термостат применит новые настройки и выйдет из сервисного режима.
6. Включите термостат нажатием на кнопку ON/OFF.
Далее вручную прописываем на нужном порту эти настройки и привязываем к шаблону: BHT-002GBLN (Скачать можно по ссылке: https://support.wirenboard.com/uploads/short-url/oBLAAEHVntr3mGnoplxGsgTgMEp.json)
После все должно заработать.
## Не нашлось или хз
Можно попробовать перебрать адреса на порту:
```
systemctl stop wb-mqtt-serial
for i in {1..255}; do echo -n "$i - "; D=`modbus_client -mrtu /dev/ttyRS485-2 --debug -b9600 -pnone -s2 -a$i -t3 -o400 -r0 -c1 2>/dev/null | grep Data:`; echo -e $D; done
systemctl start wb-mqtt-serial
```

@ -1,13 +1,4 @@
---
draft: false
date: 2023-10-17
tags:
- chrome
---
# Google Chrome
## Блокировка медиакнопок
# Блокировка медиакнопок
Одним словом, то пока можно только отключить. Но не весь браузер, а только упомянутую функцию поддержки мультимедийных кнопок в нем. Делается это путем отключения соответствующего «*флага*» (экспериментальной функции) в настройках Chrome. Для этого:

@ -31,12 +31,6 @@ GO
## Удаление Log Shipping без второго сервера
![Database Properties](http%3A%2F%2Flh3.googleusercontent.com%2F-8u7Gar1yO54%2FVbBhpg9uqII%2FAAAAAAAAAxk%2FscsPJqqKNRI%2Fimage_thumb%5B5%5D.png)
![Error Deleting Log Shipping Configuration](http%3A%2F%2Flh3.googleusercontent.com%2F-0bXadZHuNDo%2FVbBhqc0arwI%2FAAAAAAAAAxw%2FiTkT7RLZsJQ%2Fimage_thumb%5B7%5D.png)
![image](http%3A%2F%2Flh3.googleusercontent.com%2F-2JVo2aXEBAU%2FVbBhq7Ocz-I%2FAAAAAAAAAyA%2FMB1kTPPthvM%2Fimage_thumb%5B9%5D.png)
Удаление через скрипт
```sql

@ -0,0 +1,71 @@
# Русский язык для консоли Ubuntu
**Локаль (locale)** — это файл, который содержит таблицу с указанием того, какие символы считать буквами, и как их следует сортировать. Операционная система использует эту таблицу для отображения букв определенного национального алфавита.
После установки чистой системы Linux Ubuntu или Debian, если не был выбран русский ввод и вывод, то их надо установить.
Для начала проверяем, какая локаль установлена:
```
locale
```
Если вывод команды такой:
```
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
```
То нужно настроить локаль.
Выполним команду:
```
dpkg-reconfigure locales
```
Откроется диалоговое окно, в котором необходимо установить нужное значение региональных настроек (локали).
Выбираем: `ru_RU.UTF-8 UTF-8`
Установим пакет `console-cyrillic`:
```
sudo apt install console-cyrillic
```
Далее необходимо перезагрузить систему командой:
```
reboot
```
После загрузки системы выполним команду:
```
locale
```
В результате должен быть вывод:
```
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
```

@ -0,0 +1,16 @@
# ![btop++](https://github.com/aristocratos/btop/raw/main/Img/logo.png)
[![](https://img.shields.io/github/stars/aristocratos/btop?label=%E2%AD%90%20Stars&style=flat-square)](https://github.com/aristocratos/btop)
[![](https://img.shields.io/github/v/release/aristocratos/btop?label=%F0%9F%9A%80%20Release&style=flat-square)](https://github.com/aristocratos/btop/releases/latest)
Удобная тулза для мониторинга ресурсов на различных ОС. Есть поддержка видеокарт. Отображение в терминале.
Для установки на убунту необходимо скачать пакет через apt:
```
sudo apt update
sudo apt install btop
```
# ![](https://github.com/aristocratos/btop/raw/main/Img/normal.png)

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save