Merge branch 'states/2024.01'

states/2024.05
TheSt1tch 10 months ago
commit 2a8496efe7

@ -4,29 +4,29 @@ type: docker
name: build-home-docs
steps:
- name: build main
image: squidfunk/mkdocs-material:9.4.6
pull: if-not-exists
volumes:
- name: site
path: /site
commands:
- pip install -U -r ./requirements.txt
- mkdocs build
- cp -r site/ /site
- chown 1000:1000 /site
- chmod -R 777 /site
when:
event:
- push
branch:
- main
#- name: build main
# image: squidfunk/mkdocs-material:9.4.6
# pull: if-not-exists
# volumes:
# - name: site
# path: /site
# commands:
# - pip install -U -r ./requirements.txt
# - mkdocs build
# - cp -r site/ /site
# - chown 1000:1000 /site
# - chmod -R 777 /site
# when:
# event:
# - push
# branch:
# - 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-st1tru
path: /site
commands:
- mkdocs build
@ -39,36 +39,6 @@ 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:

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

@ -32,4 +32,66 @@ services:
- DRONE_RUNNER_CAPACITY=2
- 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, если нет, то сделать можно в [инструкции](docs/docker/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 — это база данных временных рядов, использующая экспортеры для мониторинга различных серверов/сервисов

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

@ -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,157 @@
# 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).
## Полезные команды
### Удаление мусора из PhotoTranscoder
Часто бывает так, что папка `../Library/Application Support/Plex Media Server/Cache/PhotoTranscoder` начинает занимать очень много места. в ней хранится весь кеш из изображений. Разные версии превью - все тут. Надо как-то почистить старое, чтобы освободить место:
```bash
find "/home/plex/plexconfig/Library/Application Support/Plex Media Server/Cache/PhotoTranscoder" -name "*.jpg" -type f -mtime +5 -delete
```

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

@ -0,0 +1,41 @@
# 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/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/)
![](../../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"
version: "3.7"
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,5 @@
# 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)
[![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,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,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](../traefik.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

@ -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 | Мод капитальной переделки, основанный на прогрессе материалов. |

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

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

@ -1,6 +1,6 @@
# Обход блокировок
# Обход блокировок Европейских сайтов
Расписывать как поднять и настроить VPN через Wireguard или OpenVPN не буду. В сети достаточно инструкций. Чуть ниже слева есть еще одна от меня.
Расписывать как поднять и настроить VPN через Wireguard или OpenVPN не буду. В сети достаточно инструкций.
Варианта как обходить блокировки 2:
@ -56,9 +56,7 @@ add Disabled=no name=unblock fib
/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=\
/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

@ -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. Все должно рбаотать с новым драйвером.

@ -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 автоматически обнаружил в вашей сети.

@ -0,0 +1,15 @@
новый контроллер
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
```

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

@ -8,42 +8,52 @@ nav:
- Привет!: index.md
- 🐳 Docker:
- Подготовка:
- Установка: docker.md
- Установка: docker/install.md
- Безопасность: docker/security.md
- В начале:
- Traefik:
- docker/traefik.md
- TCP Route: docker/traefik/tcp-routes.md
- Error Pages: docker/traefik/errorpages.md
- Traefik Forward Auth: docker/traefik-forward-auth.md
- Ошибки: docker/error.md
- Docker Compose:
- Profile: docker/compose/profile.md
- Healthcheck: docker/compose/healthcheck.md
- Profiles: docker/compose/profiles.md
- Traefik:
- docker/traefik/index.md
- Error Pages: docker/traefik/errorpages.md
- Forward Auth: docker/traefik/forward-auth.md
- TCP Route: docker/traefik/tcp-routes.md
- Сервисы:
- Samba: docker/samba.md
- Redis: docker/redis.md
- MotionEye: docker/motioneye.md
- Plex:
- docker/plex.md
- Plex Meta Manager: docker/plex-mm.md
- Plex Trakt Sync: docker/plextraktsync.md
- Drone CI: docker/drone.md
- Gitea: docker/gitea.md
- Grafana+Prometheus: docker/grafana-prometheus.md
- HandBrake: docker/handbrake.md
- Homarr: docker/homarr.md
- Linx Server: docker/linx-server.md
- MotionEye: docker/motioneye.md
- Nextcloud:
- docker/nextcloud/index.md
- During Scan: docker/nextcloud/during-scan.md
- PHP imagick: docker/nextcloud/php-imagick.md
- Cron: docker/nextcloud/cron.md
- Проблемы с data: docker/nextcloud/problems-after-moving-data-folder.md
- Gitea: docker/gitea.md
- Drone CI: docker/drone.md
- Игровые сервера:
- Valheim: docker/games/valheim.md
- Factorio: docker/games/factorio.md
- WikiJS: docker/wikijs.md
- HandBrake: docker/handbrake.md
- OCC: docker/nextcloud/occ-files-scan.md
- Pictshare: docker/pictshare.md
- Устарело:
- Linx Server: docker/linx-server.md
- Plex:
- docker/plex/index.md
- Autoscan: docker/plex/autoscan.md
- Jackett: docker/plex/jackett.md
#- Overseerr:
- Plex Meta Manager: docker/plex/plex-mm.md
- Plex Trakt Sync: docker/plex/plextraktsync.md
- Prowlarr: docker/plex/prowlarr.md
#- Radarr:
#- Sonarr:
- Redis: docker/redis.md
- Samba: docker/samba.md
- Syncthing: docker/syncthing.md
- Socket Proxy: docker/socket-proxy.md
- WikiJS: docker/wikijs.md
- Игровые сервера:
- Valheim: docker/games/valheim.md
- Factorio: docker/games/factorio.md
- ARK Survival Evolved: docker/games/ark-se.md
- Ubuntu Server:
- ubuntu/index.md
- Команды: ubuntu/commands.md
@ -84,6 +94,7 @@ nav:
- Get-Content: software/powershell/get-content.md
- Chrome:
- Download bar: software/chrome/download-bar.md
- Блокировка медиакнопок: software/chrome/block-mediabutton.md
- Windows:
- Servers:
- Удаление RUS US: software/win/serv/rusus.md
@ -108,17 +119,22 @@ nav:
- Proxmox VE:
- proxmox/index.md
- CT Template: proxmox/ct-template.md
- Home Assistant:
- Addons:
- Zigbee2mqtt: hass/zigbee2mqtt.md
- Package:
- hass/package/index.md
- Будильник: hass/package/budilnik.md
- Device:
- Xiaomi Airpurifier: hass/device/xiaomi-airpurifier.md
- Автоматизации:
- Триггеры:
- Время: hass/automation/trigger/time.md
- Nvidia LXC: proxmox/nvidia-lxc.md
- Умный дом:
- Home Assistant:
- Установка на Debian: smart-home/hass/install-hass-debian.md
- Addons:
- Zigbee2mqtt: smart-home/hass/zigbee2mqtt.md
- Package:
- smart-home/hass/package/index.md
- Будильник: smart-home/hass/package/budilnik.md
- Device:
- Xiaomi Airpurifier: smart-home/hass/device/xiaomi-airpurifier.md
- Автоматизации:
- Триггеры:
- Время: smart-home/hass/automation/trigger/time.md
- Wirenboard:
- Новый контроллер: smart-home/wirenboard/new-controller.md
- Другое:
- Закрыть фишинговый сайт: other/close-phishing-site.md
- SSL для сайта: other/ssl-for-site.md
@ -230,7 +246,7 @@ theme:
- navigation.tabs
- navigation.tabs.sticky
- navigation.top
- navigation.pruning
- navigation.prune
- navigation.path
- search.suggest
- search.share
@ -269,11 +285,11 @@ markdown_extensions:
permalink: false
toc_depth: 3
- pymdownx.highlight: # code highlighting
linenums: true
linenums: false
- pymdownx.tabbed: # enables tabs for embedded blocks
alternate_style: true
- pymdownx.snippets
- pymdownx.superfences # allows for the nesting of code blocks inside other blocks
- pymdownx.keys
copyright: 2023 &copy; TheSt1tch - Licensed under GPLv3
copyright: 2024 &copy; TheSt1tch - Licensed under GPLv3

@ -0,0 +1,3 @@
steps:
buildDocs:
image: woodpeckerci/plugin-mkdocs:latest
Loading…
Cancel
Save