diff --git a/.drone.yml b/.drone.yml index e2353fd..60c40ad 100755 --- a/.drone.yml +++ b/.drone.yml @@ -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: diff --git a/dockerfile b/dockerfile new file mode 100644 index 0000000..92ac550 --- /dev/null +++ b/dockerfile @@ -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 diff --git a/docs/blog/posts/traefik-fa.md b/docs/blog/posts/traefik-fa.md deleted file mode 100755 index 73974b8..0000000 --- a/docs/blog/posts/traefik-fa.md +++ /dev/null @@ -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. - -> Почему 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/). \ No newline at end of file diff --git a/docs/docker/compose/profile.md b/docs/docker/compose/profiles.md similarity index 70% rename from docs/docker/compose/profile.md rename to docs/docker/compose/profiles.md index 4648dc5..a60be26 100755 --- a/docs/docker/compose/profile.md +++ b/docs/docker/compose/profiles.md @@ -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 diff --git a/docs/docker/drone.md b/docs/docker/drone.md index c4f685b..9b2e839 100755 --- a/docs/docker/drone.md +++ b/docs/docker/drone.md @@ -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 ``` \ No newline at end of file diff --git a/docs/docker/error.md b/docs/docker/error.md new file mode 100755 index 0000000..2f9e0ce --- /dev/null +++ b/docs/docker/error.md @@ -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 +``` diff --git a/docs/docker/games/ark-se.md b/docs/docker/games/ark-se.md new file mode 100755 index 0000000..0475763 --- /dev/null +++ b/docs/docker/games/ark-se.md @@ -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 \ No newline at end of file diff --git a/docs/docker/grafana/index.md b/docs/docker/grafana/index.md new file mode 100755 index 0000000..3c645bc --- /dev/null +++ b/docs/docker/grafana/index.md @@ -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» источников данных был установлен на «сервер». Мне пришлось установить его как «браузер», как показано ниже: \ No newline at end of file diff --git a/docs/docker/grafana/prometheus.md b/docs/docker/grafana/prometheus.md new file mode 100755 index 0000000..3b10116 --- /dev/null +++ b/docs/docker/grafana/prometheus.md @@ -0,0 +1,3 @@ +# Prometheus + +Prometheus — это база данных временных рядов, использующая экспортеры для мониторинга различных серверов/сервисов \ No newline at end of file diff --git a/docs/docker.md b/docs/docker/install.md similarity index 88% rename from docs/docker.md rename to docs/docker/install.md index 78f607a..0aba0a3 100755 --- a/docs/docker.md +++ b/docs/docker/install.md @@ -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** для начала: diff --git a/docs/docker/nextcloud/occ-files-scan.md b/docs/docker/nextcloud/occ-files-scan.md new file mode 100755 index 0000000..9c9b2ea --- /dev/null +++ b/docs/docker/nextcloud/occ-files-scan.md @@ -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** \ No newline at end of file diff --git a/docs/docker/plex.md b/docs/docker/plex.md deleted file mode 100755 index d17ba2e..0000000 --- a/docs/docker/plex.md +++ /dev/null @@ -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 -``` \ No newline at end of file diff --git a/docs/docker/plex/autoscan.md b/docs/docker/plex/autoscan.md new file mode 100755 index 0000000..07acd6c --- /dev/null +++ b/docs/docker/plex/autoscan.md @@ -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). \ No newline at end of file diff --git a/docs/docker/plex/index.md b/docs/docker/plex/index.md new file mode 100755 index 0000000..b5ed397 --- /dev/null +++ b/docs/docker/plex/index.md @@ -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 +``` \ No newline at end of file diff --git a/docs/docker/plex/jackett.md b/docs/docker/plex/jackett.md new file mode 100755 index 0000000..2f1aef2 --- /dev/null +++ b/docs/docker/plex/jackett.md @@ -0,0 +1,38 @@ +# Jackett + +[![](https://img.shields.io/github/stars/Jackett/Jackett?label=%E2%AD%90%20Stars&style=flat-square)](https://github.com/Jackett/Jackett) +[![](https://img.shields.io/github/v/release/Jackett/Jackett?label=%F0%9F%9A%80%20Release&style=flat-square)](https://github.com/Jackett/Jackett/releases/latest) +[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/jackett.svg?maxAge=60&style=flat-square)](https://hub.docker.com/r/linuxserver/jackett/) + +![](../../images/docker/jackett-1.png) + + +Jackett - нужен для преобразования запросов от [Sonarr](./sonarr.md)/[Radarr](./radarr.md)/Lidarr/Readarr и прочих в HTTP-запросы, специфичные для сайта трекера, анализирует ответ html или json и затем отправляет результаты обратно запрашивающему программному обеспечению. Это позволяет получать последние загрузки (например, RSS) и выполнять поиск. + +Jackett — это единый репозиторий поддерживаемой логики очистки и перевода индексаторов, который снимает нагрузку с других приложений. + +## Установка + +Устанавливать будем через Docker Compose + +```yaml title="docker-compose.yml" +version: "3.7" + +services: + jackett: + container_name: jackett + image: linuxserver/jackett:latest + restart: always + ports: + - "9117:9117" + security_opt: + - no-new-privileges:true + volumes: + - ./jackett:/config + environment: + - PUID=1000 + - PGID=1000 + - TZ=Europe/Moscow +``` + +Альтернатива: [Prowlarr](./prowlarr.md) \ No newline at end of file diff --git a/docs/docker/plex-mm.md b/docs/docker/plex/plex-mm.md similarity index 100% rename from docs/docker/plex-mm.md rename to docs/docker/plex/plex-mm.md diff --git a/docs/docker/plextraktsync.md b/docs/docker/plex/plextraktsync.md similarity index 100% rename from docs/docker/plextraktsync.md rename to docs/docker/plex/plextraktsync.md diff --git a/docs/docker/plex/prowlarr.md b/docs/docker/plex/prowlarr.md new file mode 100755 index 0000000..4d7ba6d --- /dev/null +++ b/docs/docker/plex/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 +``` \ No newline at end of file diff --git a/docs/docker/plex/radarr.md b/docs/docker/plex/radarr.md new file mode 100755 index 0000000..85b77a2 --- /dev/null +++ b/docs/docker/plex/radarr.md @@ -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/) \ No newline at end of file diff --git a/docs/docker/plex/sonarr.md b/docs/docker/plex/sonarr.md new file mode 100755 index 0000000..65b5294 --- /dev/null +++ b/docs/docker/plex/sonarr.md @@ -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/) \ No newline at end of file diff --git a/docs/docker/socket-proxy.md b/docs/docker/socket-proxy.md new file mode 100755 index 0000000..4d0dfb5 --- /dev/null +++ b/docs/docker/socket-proxy.md @@ -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 +``` \ No newline at end of file diff --git a/docs/docker/syncthing.md b/docs/docker/syncthing.md new file mode 100755 index 0000000..e91d7b9 --- /dev/null +++ b/docs/docker/syncthing.md @@ -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/). \ No newline at end of file diff --git a/docs/docker/traefik-forward-auth.md b/docs/docker/traefik-forward-auth.md deleted file mode 100755 index 36d261b..0000000 --- a/docs/docker/traefik-forward-auth.md +++ /dev/null @@ -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 Том Седдон \ No newline at end of file diff --git a/docs/docker/traefik/forward-auth.md b/docs/docker/traefik/forward-auth.md new file mode 100755 index 0000000..6185b43 --- /dev/null +++ b/docs/docker/traefik/forward-auth.md @@ -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 \ No newline at end of file diff --git a/docs/docker/traefik.md b/docs/docker/traefik/index.md similarity index 100% rename from docs/docker/traefik.md rename to docs/docker/traefik/index.md diff --git a/docs/games/factorio/index.md b/docs/games/factorio/index.md index 01586f9..116cd0c 100755 --- a/docs/games/factorio/index.md +++ b/docs/games/factorio/index.md @@ -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 \ No newline at end of file +| Мод | Ссылка | Описание | +|--|--|--| +| 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 | Мод капитальной переделки, основанный на прогрессе материалов. | diff --git a/docs/images/docker/jackett-1.png b/docs/images/docker/jackett-1.png new file mode 100755 index 0000000..57fbe14 Binary files /dev/null and b/docs/images/docker/jackett-1.png differ diff --git a/docs/images/docker/plex_1.png b/docs/images/docker/plex_1.png new file mode 100755 index 0000000..b3201d1 Binary files /dev/null and b/docs/images/docker/plex_1.png differ diff --git a/docs/images/docker/prowlarr-1.png b/docs/images/docker/prowlarr-1.png new file mode 100755 index 0000000..d4bb74e Binary files /dev/null and b/docs/images/docker/prowlarr-1.png differ diff --git a/docs/images/docker/traefik-forward-auth-google-1.png b/docs/images/docker/traefik-forward-auth-google-1.png new file mode 100755 index 0000000..f0f6c31 Binary files /dev/null and b/docs/images/docker/traefik-forward-auth-google-1.png differ diff --git a/docs/images/docker/traefik-forward-auth-google-2.png b/docs/images/docker/traefik-forward-auth-google-2.png new file mode 100755 index 0000000..9969b89 Binary files /dev/null and b/docs/images/docker/traefik-forward-auth-google-2.png differ diff --git a/docs/images/docker/traefik-forward-auth-google-3.png b/docs/images/docker/traefik-forward-auth-google-3.png new file mode 100755 index 0000000..c835276 Binary files /dev/null and b/docs/images/docker/traefik-forward-auth-google-3.png differ diff --git a/docs/images/docker/traefik-forward-auth-google-4.png b/docs/images/docker/traefik-forward-auth-google-4.png new file mode 100755 index 0000000..654dc0c Binary files /dev/null and b/docs/images/docker/traefik-forward-auth-google-4.png differ diff --git a/docs/images/docker/traefik-forward-auth-google-5.png b/docs/images/docker/traefik-forward-auth-google-5.png new file mode 100755 index 0000000..bea586d Binary files /dev/null and b/docs/images/docker/traefik-forward-auth-google-5.png differ diff --git a/docs/images/docker/traefik-forward-auth-google-6.png b/docs/images/docker/traefik-forward-auth-google-6.png new file mode 100755 index 0000000..e3d2374 Binary files /dev/null and b/docs/images/docker/traefik-forward-auth-google-6.png differ diff --git a/docs/images/docker/traefik-forward-auth-google-7.png b/docs/images/docker/traefik-forward-auth-google-7.png new file mode 100755 index 0000000..f0f9b9d Binary files /dev/null and b/docs/images/docker/traefik-forward-auth-google-7.png differ diff --git a/docs/images/docker/traefik-forward-auth-google-8.png b/docs/images/docker/traefik-forward-auth-google-8.png new file mode 100755 index 0000000..8214dc3 Binary files /dev/null and b/docs/images/docker/traefik-forward-auth-google-8.png differ diff --git a/docs/images/docker/traefik-forward-auth-google-9.png b/docs/images/docker/traefik-forward-auth-google-9.png new file mode 100755 index 0000000..8f595d1 Binary files /dev/null and b/docs/images/docker/traefik-forward-auth-google-9.png differ diff --git a/docs/images/docker/traefik-forward-auth-google-flow.png b/docs/images/docker/traefik-forward-auth-google-flow.png new file mode 100755 index 0000000..69ee536 Binary files /dev/null and b/docs/images/docker/traefik-forward-auth-google-flow.png differ diff --git a/docs/images/proxmox/proxmox-nvidia-1.png b/docs/images/proxmox/proxmox-nvidia-1.png new file mode 100755 index 0000000..61bd786 Binary files /dev/null and b/docs/images/proxmox/proxmox-nvidia-1.png differ diff --git a/docs/network/mikrotik/unblock-site.md b/docs/network/mikrotik/unblock-site.md index 39fa598..6e5f576 100755 --- a/docs/network/mikrotik/unblock-site.md +++ b/docs/network/mikrotik/unblock-site.md @@ -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= .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= .role=\ ebgp multihop=yes name=bgp-antifilter.net output.filter-chain=discard \ remote.address=51.75.66.20/32 .as=65444 router-id= \ routing-table=main templates=antifilter diff --git a/docs/proxmox/nvidia-lxc.md b/docs/proxmox/nvidia-lxc.md new file mode 100755 index 0000000..c5b07e7 --- /dev/null +++ b/docs/proxmox/nvidia-lxc.md @@ -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. Все должно рбаотать с новым драйвером. \ No newline at end of file diff --git a/docs/hass/automation/trigger/time.md b/docs/smart-home/hass/automation/trigger/time.md similarity index 100% rename from docs/hass/automation/trigger/time.md rename to docs/smart-home/hass/automation/trigger/time.md diff --git a/docs/hass/device/xiaomi-airpurifier.md b/docs/smart-home/hass/device/xiaomi-airpurifier.md similarity index 100% rename from docs/hass/device/xiaomi-airpurifier.md rename to docs/smart-home/hass/device/xiaomi-airpurifier.md diff --git a/docs/hass/hacs/stack-in-card.md b/docs/smart-home/hass/hacs/stack-in-card.md similarity index 100% rename from docs/hass/hacs/stack-in-card.md rename to docs/smart-home/hass/hacs/stack-in-card.md diff --git a/docs/smart-home/hass/install-hass-debian.md b/docs/smart-home/hass/install-hass-debian.md new file mode 100755 index 0000000..21288bc --- /dev/null +++ b/docs/smart-home/hass/install-hass-debian.md @@ -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 автоматически обнаружил в вашей сети. \ No newline at end of file diff --git a/docs/hass/klimat.md b/docs/smart-home/hass/klimat.md similarity index 100% rename from docs/hass/klimat.md rename to docs/smart-home/hass/klimat.md diff --git a/docs/hass/package/budilnik.md b/docs/smart-home/hass/package/budilnik.md similarity index 100% rename from docs/hass/package/budilnik.md rename to docs/smart-home/hass/package/budilnik.md diff --git a/docs/hass/package/index.md b/docs/smart-home/hass/package/index.md similarity index 100% rename from docs/hass/package/index.md rename to docs/smart-home/hass/package/index.md diff --git a/docs/hass/zigbee2mqtt.md b/docs/smart-home/hass/zigbee2mqtt.md similarity index 100% rename from docs/hass/zigbee2mqtt.md rename to docs/smart-home/hass/zigbee2mqtt.md diff --git a/docs/smart-home/wirenboard/new-controller.md b/docs/smart-home/wirenboard/new-controller.md new file mode 100755 index 0000000..e790173 --- /dev/null +++ b/docs/smart-home/wirenboard/new-controller.md @@ -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 +``` \ No newline at end of file diff --git a/docs/blog/posts/chrome.md b/docs/software/chrome/block-mediabutton.md similarity index 87% rename from docs/blog/posts/chrome.md rename to docs/software/chrome/block-mediabutton.md index e117dd8..de2d96e 100755 --- a/docs/blog/posts/chrome.md +++ b/docs/software/chrome/block-mediabutton.md @@ -1,13 +1,4 @@ ---- -draft: false -date: 2023-10-17 -tags: - - chrome ---- - -# Google Chrome - -## Блокировка медиакнопок +# Блокировка медиакнопок Одним словом, то пока можно только отключить. Но не весь браузер, а только упомянутую функцию поддержки мультимедийных кнопок в нем. Делается это путем отключения соответствующего «*флага*» (экспериментальной функции) в настройках Chrome. Для этого: diff --git a/mkdocs.yml b/mkdocs.yml index fdc41c4..a9eafed 100755 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -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 © TheSt1tch - Licensed under GPLv3 \ No newline at end of file +copyright: 2024 © TheSt1tch - Licensed under GPLv3 \ No newline at end of file diff --git a/woodpacker.yml b/woodpacker.yml new file mode 100755 index 0000000..bfea819 --- /dev/null +++ b/woodpacker.yml @@ -0,0 +1,3 @@ +steps: + buildDocs: + image: woodpeckerci/plugin-mkdocs:latest \ No newline at end of file