diff --git a/docs/blog/index.md b/docs/blog/index.md new file mode 100755 index 0000000..d713ff5 --- /dev/null +++ b/docs/blog/index.md @@ -0,0 +1,3 @@ +# Blogs + +{{ blog_content }} \ No newline at end of file diff --git a/docs/blog/posts/ark-admins-command.md b/docs/blog/posts/ark-admins-command.md new file mode 100755 index 0000000..f893a8d --- /dev/null +++ b/docs/blog/posts/ark-admins-command.md @@ -0,0 +1,28 @@ + +# Настройка и использование консольных команд Админа в Ark Survival Evolved + +Как использовать администраторские команды консоли в **Ark: Survival Evolved**? Для этого потребуется открыть консоль, нажав кнопку **TAB**. +Некоторые из этих команд будут недоступны, пока вы не выполнили аутентификацию с помощью команды **enablecheats**. + +Команды, отмеченные тегом _cheat_ должны указываться с префиксом **admincheat**. + +## Использование + +### Первый способ + +1. Выключаем сервер. +2. В конфиге сервера **GameUserSettings.ini** указываем пароль администратора переменной **ServerAdminPassword.** (Пример: _ServerAdminPassword password_). +3. Включаем сервер. +4. Заходим в игру и на сервер, открываем консоль нажатием кнопки **TAB**. +5. Авторизируемся на сервере как администратор указывая команду: **enablecheats «AdminPassword».** (Пример: enablecheats password). + +### Второй способ + + Добавляем игроков в белый список. + +1. Выключаем сервер. +2. Создать файл **AllowedCheaterSteamIDs.txt** (_Путь: ShooterGame/Saved/AllowedCheaterSteamIDs.txt_). +3. Указать Steam ID игрока, если администраторов несколько, Steam ID нужно указывать с новой строчки. +4. Включаем сервер. +5. Авторизация на сервере командой **enablecheats «AdminPassword»** не требуется. +6. Открываем графическую админку командой **ShowMyAdminManager**. \ No newline at end of file diff --git a/docs/blog/posts/close-phishing-site.md b/docs/blog/posts/close-phishing-site.md new file mode 100755 index 0000000..0ccae5f --- /dev/null +++ b/docs/blog/posts/close-phishing-site.md @@ -0,0 +1,9 @@ + +Каждый раз, когда я в интернете натыкался на фишинговый сайт, у меня был сложный квест куда писать и что делать, чтобы его закрыть. У меня, обычно это были сайты, которые притворялись игровыми. Каждый раз даже интересно, как у тебя пытаются узнать пароль. + +При обнаружении такого сайта, необходимо сделать: + +1. через [whois](https://whois.ru/) узнать регистратора домена и подать запрос +2. попробовать по ip определить принадлежность к хостеру и подать запрос ему. +3. подать запрос в [CERT-GIB](https://www.group-ib.ru/cert.html) и [RU-CERT](https://www.cert.ru/ru/abuse.shtml) +4. подать запросы в поисковики [Яндекс](https://yandex.ru/support/search/troubleshooting/delspam.html) и [Google](https://safebrowsing.google.com/safebrowsing/report_phish/?hl=en) \ No newline at end of file diff --git a/docs/blog/posts/traefik-fa.md b/docs/blog/posts/traefik-fa.md new file mode 100755 index 0000000..9272147 --- /dev/null +++ b/docs/blog/posts/traefik-fa.md @@ -0,0 +1,367 @@ +# Руководство по Traefik Forward Auth – Простая защита через Google SSO + +![](https://st1t.ru/wp-content/uploads/2022/11/traefik-forward-auth-google-flow-840x525.png) + +---------- + +Хотите защитить свой стек 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/blog/posts/veeam-agent.md b/docs/blog/posts/veeam-agent.md new file mode 100755 index 0000000..c8e88f9 --- /dev/null +++ b/docs/blog/posts/veeam-agent.md @@ -0,0 +1,19 @@ +# Настройка бекапов в Veeam Agent + +---------- + +![](https://st1t.ru/wp-content/uploads/2023/04/veeam_agent_configure_backup_1.png) + +![](https://st1t.ru/wp-content/uploads/2023/04/veeam_agent_configure_backup_2.png) + +![](https://st1t.ru/wp-content/uploads/2023/04/veeam_agent_configure_backup_3.png) + +![](https://st1t.ru/wp-content/uploads/2023/04/veeam_agent_configure_backup_4.png) + +![](https://st1t.ru/wp-content/uploads/2023/04/veeam_agent_configure_backup_6.png) + +![](https://st1t.ru/wp-content/uploads/2023/04/veeam_agent_configure_backup_7.png) + +![](https://st1t.ru/wp-content/uploads/2023/04/veeam_agent_configure_backup_5.png) + +![](https://st1t.ru/wp-content/uploads/2023/04/veeam_agent_configure_backup_8.png) \ No newline at end of file diff --git a/docs/docker-compose.md b/docs/docker.md similarity index 100% rename from docs/docker-compose.md rename to docs/docker.md diff --git a/docs/docker/docker-compose-healthcheck.md b/docs/docker/docker-compose-healthcheck.md new file mode 100755 index 0000000..bf83069 --- /dev/null +++ b/docs/docker/docker-compose-healthcheck.md @@ -0,0 +1,38 @@ +Собрал несколько настроек для docker-compose, чтобы проверять работоспособность различных баз данных + +## MySQL / MariaDB +```yaml +healthcheck: + test: out=$$(mysqladmin ping -h 127.0.0.1 -P 3306 -u root --password=$$(cat $${MARIADB_ROOT_PASSWORD_FILE}) 2>&1); echo $$out | grep 'mysqld is alive' || { echo $$out; exit 1; } + interval: 1m + timeout: 10s + retries: 5 +``` +## Redis +```yaml +healthcheck: + test: [ 'CMD', 'redis-cli', 'ping' ] + interval: 5m + timeout: 10s + retries: 5 +``` +## PostgreSQL + +pg_isready не очень полезно, потому что часто служба может работать, но БД недоступна. +```yaml +healthcheck: + test: [ "CMD", "psql", "-U", "postgres", "-c", "SELECT 1;" ] + interval: 1m + timeout: 10s + retries: 5 +``` +## Curl + +Ensure you use --fail or your health check will always succeed. +```yaml +healthcheck: + test: [ "CMD", "curl", "--fail", "http://localhost" ] + interval: "60s" + timeout: "5s" + retries: 3 +``` \ No newline at end of file diff --git a/docs/docker/games/valheim.md b/docs/docker/games/valheim.md new file mode 100755 index 0000000..097980c --- /dev/null +++ b/docs/docker/games/valheim.md @@ -0,0 +1,196 @@ + +# Запуск своего сервера игры Valheim + +![Valheim](https://raw.githubusercontent.com/lloesche/valheim-server-docker/main/misc/Logo_valheim.png) + +!!! note + Для запуска используем docker образ от [lloesche](https://github.com/lloesche). Полная информация по запуску, доступна на [Github](https://github.com/lloesche/valheim-server-docker). + +Запуск сервера будем производить на Ubuntu, по ссылке выше на Github, можно найти инструкцию, как запустить на других системах. + +Запустить сервер можно 2 путями: через **консоль** (базовое) или через **docker-compose** + +## Требования к серверу + +Без игроков сервер потребляет в среднем 3Гб RAM и 30% одного ядра CPU на процессоре Intel Xeon E5-2620 v3 (частота 2,4ГГц) +При подключении игроков, нагрузка на CPU возрастает на 15% за хаждого игрока. + +| | Минимальные | Рекомендуемые | +|----------|----------|-------| +| CPU | 2 Core | 4 Core, 2.8+Ghz | +| RAM | 4 Gb | 8 Gb | + +Большая тактовая частота ЦПУ лучше, чем большее количество ядер. + +## Запуск через docker-compose + +Я рекомендую именно этот способ + +Скопируйте и вставьте следующее в консоль + +``` +mkdir -p $HOME/valheim-server/config $HOME/valheim-server/data +cd $HOME/valheim-server/ +cat > $HOME/valheim-server/.env << EOF +SERVER_NAME=My Server +WORLD_NAME=Dedicated +SERVER_PASS=secret +SERVER_PUBLIC=true +PUID=1000 +PGID=1000 +UPDATE_IF_IDLE=true +UPDATE_CRON="30 5 * * *" +BEPINEX=true +EOF +``` + +Далее создадим сам docker-compose файл: + +``` +nano docker-compose.yml +``` +и заполним его +```yaml +version: '3.7' + +services: + valheim: + image: ghcr.io/lloesche/valheim-server:latest + container_name: valheim-server + cap_add: + - sys_nice + volumes: + - $HOME/valheim-server/config:/config + - $HOME/valheim-server/data:/opt/valheim + ports: + - "2456-2458:2456-2458/udp" + - "9001:9001/tcp" + env_file: + - $HOME/valheim-server/valheim.env + restart: always + stop_grace_period: 2m +``` +Запуск через +``` +docker-compose up +``` + +## Базовое использование (консоль) + +Имя образа Docker — `ghcr.io/lloesche/valheim-server`. + +Каталог монтирования конфигурации сервера `/config` в контейнере Docker. + +Если у вас есть существующий мир в системе Windows, вы можете скопировать его, например: +`C:\Users\Lukas\AppData\LocalLow\IronGate\Valheim\worlds_local` в +`$HOME/valheim-server/config/worlds_local` , и запустить образ с `$HOME/valheim-server/config`томом, смонтированным `/config` внутри контейнера. +Каталог контейнера `/opt/valheim` содержит загруженный сервер. При желании его можно смонтировать в томе, чтобы не загружать сервер при каждом новом запуске. + +``` +$ mkdir -p $HOME/valheim-server/config/worlds_local $HOME/valheim-server/data +# copy existing world +$ docker run -d \ + --name valheim-server \ + --cap-add=sys_nice \ + --stop-timeout 120 \ + -p 2456-2457:2456-2457/udp \ + -v $HOME/valheim-server/config:/config \ + -v $HOME/valheim-server/data:/opt/valheim \ + -e SERVER_NAME="My Server" \ + -e WORLD_NAME="Neotopia" \ + -e SERVER_PASS="secret" \ + ghcr.io/lloesche/valheim-server +``` + +!!! warning + `SERVER_PASS` должен быть не менее 5 символов. Иначе `valheim_server.x86_64` откажется запускаться! + +Новый запуск займет несколько минут в зависимости от скорости вашего интернет-соединения, поскольку контейнер загрузит выделенный сервер Valheim из Steam (~ 1 ГБ). + +Не забудьте изменить `WORLD_NAME`, чтобы отразить название вашего мира! Для существующих миров это имя файла в `worlds_local/` папке без `.db/.fwl` расширения. + +!!! note + Если вы хотите играть с друзьями через Интернет и находитесь за NAT, убедитесь, что порты UDP 2456-2457 перенаправлены на хост-контейнер. + +**Кроссплей:** чтобы включить кроссплей между разными платформами, добавьте `-crossplay` в `SERVER_ARGS`: +``` + -e SERVER_ARGS="-crossplay" +``` + +Более подробная информация находится в разделе [Как найти свой сервер](https://github.com/lloesche/valheim-server-docker#finding-your-server) . + +Информацию об игре только по локальной сети см. в разделе [Избранные сервера Steam и LAN](https://github.com/lloesche/valheim-server-docker#steam-server-favorites--lan-play). + +Предоставление `CAP_SYS_NICE` контейнеру не является обязательным. Это позволяет библиотеке Steam, которую использует Valheim, увеличить количество циклов процессора. Без него вы увидите сообщение `Warning: failed to set thread priority` в журнале запуска. + +### Значения переменных + +Я не буду описывать значения всех переменных, используемых к образе. Я опишу лишь те. что использовал на своем сервере. По [ссылке](https://github.com/lloesche/valheim-server-docker#environment-variables) можно найти другие. + +!!! note + Все имена и значения переменных чувствительны к регистру! + +| Name | Default | Purpose | +|----------|----------|-------| +| `SERVER_NAME` | `My Server` | Имя сервера, отображаемое в браузере серверов | +| `WORLD_NAME` | `Dedicated` | Имя мира без `.db/.fwl` | +| `SERVER_PASS` | `secret` | Пароль для входа на сервер, минимум **5 символов!** | +| `SERVER_PUBLIC` | `true` | Отображение сервера в браузере серверов (`true`) или нет (`false`) | +| `UPDATE_CRON` | `*/15 * * * *` | [Cron расписание](https://en.wikipedia.org/wiki/Cron#Overview) для проверки обновлений (отключено, если задана пустая строка или установлен `UPDATE_INTERVAL`) | +| `UPDATE_IF_IDLE` | `true` | Запуск проверки обновлений, когда на сервере пусто (`true` или `false`) | +| `BEPINEX` | `false` | Должен быть загружен мод [BepInExPack Valheim](https://valheim.thunderstore.io/package/denikson/BepInExPack_Valheim/) (конфиг в `/config/bepinex`, плагины в `/config/bepinex/plugins`). Не использовать вместе с `VALHEIM_PLUS`. | +| `PUID` | `0` | UID для запуска valheim-сервера как | +| `PGID` | `0` | GID для запуска valheim-сервера как | + +### Развертывание + +Создайте файл конфигурации `/etc/sysconfig/valheim-server` + +``` +SERVER_NAME=My Server +SERVER_PORT=2456 +WORLD_NAME=Dedicated +SERVER_PASS=secret +SERVER_PUBLIC=true +``` +Затем включите контейнер Docker при загрузке системы. +``` +$ sudo mkdir -p /etc/valheim /opt/valheim +$ sudo curl -o /etc/systemd/system/valheim.service https://raw.githubusercontent.com/lloesche/valheim-server-docker/main/valheim.service +$ sudo systemctl daemon-reload +$ sudo systemctl enable valheim.service +$ sudo systemctl start valheim.service +``` + +## Обновления + +По умолчанию контейнер будет проверять наличие обновлений сервера Valheim каждые 15 минут, если в данный момент к серверу не подключены игроки. Если обновление найдено, оно загружается, и сервер перезапускается. Это расписание обновлений можно изменить с помощью `UPDATE_CRON` переменной. +В перменных выше, указана чистота проверки обновлений "30 5 * * *" - это означает, что сервер будет првоерять обновления раз в сутки, в 5:30. Чтобы было проще указывать параметры cron, я советую использовать [crontab.guru](https://crontab.guru/) + +## Бекап сервера, когда наигрались. + +Какой бы не была эта игра прекрасной, приходит время закончить играть в нее. Я не хочу в рамках этого руководства рассказывать в чем ее проблема для долгой игры. Вы можете и сами почитать отрицательные отзывы в Steam. Скажу лишь, что у меня и 2 моих друзей сгорели жепы в последней добавленной локации Mistland. Но, мы не бросем эту игру и вернемся в нее еще. + +Для того чтобы сохранить ваш сервер или перенести куда либо еще, нужно забекапить папку `$HOME/valheim-server/config`: + +``` +cd $HOME/valheim-server +sudo tar -czvf valheim-server.tar.gz config +``` +проверить созданный архив можно командой +``` +tar -ztvf valheim-server.tar.gz +``` +--- +## Полезности + +- [Генератор карты](https://valheim-map.world/) +- Моды для сервера или клиента: + - [Nexusmods](https://www.nexusmods.com/valheim/mods/) + - [Thunderstore](https://valheim.thunderstore.io/package/) + +--- + +[Github](https://github.com/lloesche/valheim-server-docker){ .md-button .md-button--primary } + + diff --git a/docs/docker-compose/linx-server.md b/docs/docker/linx-server.md similarity index 100% rename from docs/docker-compose/linx-server.md rename to docs/docker/linx-server.md diff --git a/docs/docker-compose/motioneye.md b/docs/docker/motioneye.md similarity index 100% rename from docs/docker-compose/motioneye.md rename to docs/docker/motioneye.md diff --git a/docs/docker/nextcloud/during-scan.md b/docs/docker/nextcloud/during-scan.md new file mode 100755 index 0000000..bde6276 --- /dev/null +++ b/docs/docker/nextcloud/during-scan.md @@ -0,0 +1,30 @@ +# Exception during scan .. is locked + +Столкнулся с такой проблемой, в логах nextcloud стала всплывать ошибка + +`Error: opendir(/mnt/downloads/): Failed to open directory: Permission denied at /var/www/html/lib/private/Files/Storage/Local.php#153` + +Поиск решения проблемы, привело к запуску команды на сканирование файлов пользователей. Для Docker запускается командой: +```bash +docker exec -ti -u 33 nextcloud php -f /var/www/html/console.php files:scan --all +``` + +В ходе сканирования файлов пользователей, всплыла новая ошибка: + +`Exception while scanning: "files/0e3e13890e7b79a0edc572f53b262079" is locked #0 /volume1/web/nextcloud/lib/private/Files/Storage/Common.php(680)` + +Согласно [базе знаний Nextcloud](https://help.nextcloud.com/t/file-is-locked-how-to-unlock/1883), для её решения, нужно: + +=== "Вручную отключить состояние блокировки" + - Переведите Nextcloud в режим обслуживания: отредактируйте `config/config.php`и измените эту строку: + `'maintenance' => true,` + - Пустая таблица `oc_file_locks`: используйте такие инструменты, как phpmyadmin, или подключитесь напрямую к своей базе данных и запустите (префикс таблицы по умолчанию — `oc_`, этот префикс может быть другим или даже пустым): + `DELETE FROM oc_file_locks WHERE 1` + - Отключите режим обслуживания (отменить первый шаг). + - Убедитесь, что ваши cron-jobs работают правильно (страница администратора сообщает вам, когда cron запускался в последний раз): [Docs Nextcloud](https://docs.nextcloud.org/server/13/admin_manual/configuration_server/background_jobs_configuration.html) +=== "Постоянное решение" + - На вашем **собственном сервере** : используйте Redis для этой функции. Это быстрее, и до сих пор никаких проблем не было зарегистрировано. Вы можете следовать [инструкциям по кэшированию памяти в документах](https://docs.nextcloud.org/server/13/admin_manual/configuration_server/caching_configuration.html#id4) + - **Общий хостинг** (Те, кто не может установить Redis): вы можете отключить блокировку файлов, отредактировав файл конфигурации `config/config.php`: + `'filelocking.enabled' => false,` однако отключение не является хорошим решением. Вы можете столкнуться с проблемами, когда несколько процессов пытаются записать в файл (особенно онлайн-редакторы в веб-интерфейсе). В однопользовательских и одноклиентских средах это, вероятно, не такая уж проблема. + - У меня поднят [redis](../redis.md) для кеширования с веб-мордой redis-commander, поэтому идем в веб-интерфейс и делаем flushall. + - После запускаем сканирование файлов. Проблема решена. Файлы доступны. Ошибок в логе нет. diff --git a/docs/docker/nextcloud/index.md b/docs/docker/nextcloud/index.md new file mode 100755 index 0000000..c5e6922 --- /dev/null +++ b/docs/docker/nextcloud/index.md @@ -0,0 +1,63 @@ +```env +PUID= +PGID= +TZ= +DOCKER_APP= +SECRETSDIR= +NEXTCLOUD_DOMAIN_NAME= +REDIS_PASSWORD= +``` + +docker-compose.yml + +```yaml +version: "3.7" + +secrets: + nextcloud_admin_password: + file: $SECRETSDIR/nextcloud_admin_password # put admin password in this file + nextcloud_admin_user: + file: $SECRETSDIR/nextcloud_admin_user # put admin username in this file + nextcloud_postgres_db: + file: $SECRETSDIR/nextcloud_postgres_db # put postgresql db name in this file + nextcloud_postgres_password: + file: $SECRETSDIR/nextcloud_postgres_password # put postgresql password in this file + nextcloud_postgres_user: + file: $SECRETSDIR/nextcloud_postgres_user # put postgresql username in this file + +services: + # Nextcloud Docker Application + nextcloud: + image: nextcloud:25.0.4 + container_name: nextcloud + restart: always + volumes: + - $DOCKER_APP/nextcloud:/var/www/html + - $DOCKER_APP/nextcloud/apps:/var/www/html/custom_apps + - $DOCKER_APP/nextcloud/config:/var/www/html/config + - /mnt/NAS/Nextcloud:/var/www/html/data + - /mnt:/mnt + environment: + - POSTGRES_HOST=192.168.1.12 + - POSTGRES_DB_FILE=/run/secrets/nextcloud_postgres_db + - POSTGRES_USER_FILE=/run/secrets/nextcloud_postgres_user + - POSTGRES_PASSWORD_FILE=/run/secrets/nextcloud_postgres_password + - NEXTCLOUD_ADMIN_PASSWORD_FILE=/run/secrets/nextcloud_admin_password + - NEXTCLOUD_ADMIN_USER_FILE=/run/secrets/nextcloud_admin_user + - REDIS_HOST=172.18.3.249 + - REDIS_HOST_PASSWORD=$REDIS_PASSWORD + - PUID=$PUID + - PGID=$PGID + - TZ=$TZ + - NEXTCLOUD_TRUSTED_DOMAIN=$NEXTCLOUD_DOMAIN_NAME + - TRUSTED_PROXIES=172.18.0.253 + - OVERWRITEPROTOCOL=https + secrets: + - nextcloud_admin_password + - nextcloud_admin_user + - nextcloud_postgres_db + - nextcloud_postgres_password + - nextcloud_postgres_user + labels: + - com.centurylinklabs.watchtower.enable=False +``` \ No newline at end of file diff --git a/docs/docker/nextcloud/php-imagick.md b/docs/docker/nextcloud/php-imagick.md new file mode 100755 index 0000000..80cf9f5 --- /dev/null +++ b/docs/docker/nextcloud/php-imagick.md @@ -0,0 +1,16 @@ +# Module php-imagick in this instance has no SVG support + +При использовании официального Nextcloud образа Docker вы увидите сообщение вроде: + +![](../images/docker/nextcloud-docker-php-imagick.png) + +Чтобы исправить это предупреждение в docker нужно установить пакет `libmagickcore-6.q16-6-extra`: + +```bash +docker exec nextcloud apt -y update +docker exec nextcloud apt -y install libmagickcore-6.q16-6-extra +``` + +После этого предупреждение пропало. + +Если мы создадим контейнер заново, это изменение будет потеряно. На мой взгляд, здесь лучше выбрать простое решение и делать это каждый раз при обновлении образа, в отличие от постоянной, но гораздо более трудоемкой процедуры. Такой, как обновление docker-контейнера и возврата к официальному образу. diff --git a/docs/docker-compose/plex-mm.md b/docs/docker/plex-mm.md similarity index 71% rename from docs/docker-compose/plex-mm.md rename to docs/docker/plex-mm.md index 42fe562..a09fd2e 100755 --- a/docs/docker-compose/plex-mm.md +++ b/docs/docker/plex-mm.md @@ -137,4 +137,50 @@ trakt: refresh_token: scope: public created_at: +``` + +Для сериалов: + +```yaml + Сериалы: + metadata_path: + - file: config/TV-Shows/Collections.yml + - folder: config/TV-Shows/Metadata/Anime + - folder: config/TV-Shows/Metadata/TV + - pmm: basic + - pmm: imdb + overlay_path: + - remove_overlays: false + - reapply_overlay: false + - pmm: ratings + template_variables: + rating1: critic + rating1_image: imdb + rating2: audience + rating2_image: trakt + rating3: user + rating3_image: tmdb + horizontal_position: right + - pmm: resolution + template_variables: + overlay_level: season + - pmm: resolution + template_variables: + overlay_level: episode + - pmm: ratings # 3, 4 + template_variables: + rating1: audience + rating1_image: trakt + horizontal_position: right # the set of ratings is on the right of the poster + overlay_level: episode + - pmm: status + template_variables: + font_size: 75 + #font: config/fonts/Juventus-Fans-Bold.ttf + back_color: "#262626" # darker + back_width: 1920 + back_height: 125 + horizontal_align: center + vertical_align: top + vertical_offset: 0 ``` \ No newline at end of file diff --git a/docs/docker-compose/plex.md b/docs/docker/plex.md similarity index 100% rename from docs/docker-compose/plex.md rename to docs/docker/plex.md diff --git a/docs/docker/plextraktsync.md b/docs/docker/plextraktsync.md new file mode 100755 index 0000000..3dada01 --- /dev/null +++ b/docs/docker/plextraktsync.md @@ -0,0 +1,71 @@ +Сервис добавляет двустороннюю сихронизацию между trakt.tv и Plex Media Server. Для этого требуется учетная запись trakt.tv, но без премиум-подписки Plex или VIP-подписки Trakt, в отличие от приложения Plex, предоставляемого Trakt. + +## Функции +- Медиа из Plex добавлено в коллекцию Trakt +- Сихронизация рейтингов +- Сихронизация статуса просмотра (даты не синхронизируются от Trakt до Plex) +- Списки понравившегося в Trakt загружаются, все фильмы в Plex, принадлежащие к этому списку, объединяются в коллекцию +- Сихронизация списков налюдения +- Можно отредактировать файл конфигурации, чтобы выбрать, что синхронизировать + +Ни одно из вышеперечисленных действий не требует членства в Plex Pass или Trakt VIP. Недостаток: необходимо выполнять вручную или через cronjob, нельзя использовать оперативные данные через веб-хуки. + +## Установка через docker-compose + +```yaml +version: "3.7" + +services: + plextraktsync: + image: ghcr.io/taxel/plextraktsync + container_name: plextraktsync + restart: on-failure:2 + volumes: + - ./config:/app/config + environment: + - PUID=1000 + - PGID=1000 + - TZ=Asia/Yekaterinburg + command: sync +``` + +Запустить синхронизацию: `docker-compose run --rm plextraktsync sync` + +Для запуска автоматически по расписанию можно использовать crontab или sheduler: + +=== "Crontab" + ``` + $ crontab -e + 0 */2 * * * $HOME/.local/bin/plextraktsync sync + ``` + +=== "Sheduler" + ```yaml + version: '2' + services: + scheduler: + image: mcuadros/ofelia:latest + container_name: scheduler + depends_on: + - plextraktsync + command: daemon --docker + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + labels: + ofelia.job-run.plextraktsync.schedule: "@every 6h" + ofelia.job-run.plextraktsync.container: "plextraktsync" + ``` + +## Настройки + +Если будет ошибка, что не найден сервер Plex, то надо в ручную прописать сервер в файле `servers.yml`: + +```yaml +servers: + default: + token: token + urls: + - http://plex:32400 +``` + +[Github](https://github.com/Taxel/PlexTraktSync){ .md-button .md-button--primary } \ No newline at end of file diff --git a/docs/docker-compose/redis.md b/docs/docker/redis.md similarity index 100% rename from docs/docker-compose/redis.md rename to docs/docker/redis.md diff --git a/docs/docker-compose/samba.md b/docs/docker/samba.md similarity index 100% rename from docs/docker-compose/samba.md rename to docs/docker/samba.md diff --git a/docs/docker/security.md b/docs/docker/security.md new file mode 100755 index 0000000..557a9cd --- /dev/null +++ b/docs/docker/security.md @@ -0,0 +1,450 @@ +# Защита хоста Docker + +Первая категория охватывает все, что вы можете сделать для защиты вашего хоста докеров. + +## 1. Поддерживайте актуальность Docker Host + +Здесь действительно не нужно никаких объяснений. Это самая простая из лучших практик безопасности Docker, и она буквально занимает секунды. + +Держите свою хост-систему Docker в курсе обновлений безопасности. В моем стеке Docker Traefik на базе Linux я часто обновляю пакеты и обновляю систему, используя следующие команды: + +```bash +sudo apt-get update +sudo apt-get upgrade +``` + +## 2. Используйте обратный прокси + +Лучший способ — не открывать какие-либо порты для Интернета, а вместо этого использовать VPN в вашей частной сети и получать локальный доступ к приложениям. Но это слишком громоздко, и размещение приложений за обратным прокси-сервером — удобная, но худшая альтернатива. + +Вам нужно будет настроить переадресацию портов на вашем интернет-шлюзе, чтобы перенаправить определенные порты на хост Docker. + +Я настоятельно рекомендую не выставлять все приложения Docker в Интернет. Вместо этого поместите их за обратным прокси. Я использую Traefik и выставляю в Интернет только порты **80** и **443**. Даже приборная панель traefik, использующая порт **8080**, находится за обратным прокси-сервером. + +# Защита Докера + +Следующая большая категория: Docker. Давайте рассмотрим, как я считаю, контрольный список безопасности Docker , чтобы убедиться, что ваша установка защищена. + +## 3. Не меняйте владельца сокета Docker + +Не связывайтесь с владением Docker Socket (`/var/run/docker.sock` в Linux). По умолчанию сокет принадлежит пользователю **root** и группе **docker** . + +Для удобства я рекомендовал добавить себя (ваше имя пользователя) в группу докеров в прошлом. + +Преимущество заключается в том, что вы можете запускать команды docker без использования sudo. Но это угроза безопасности. Я отошел от него и не рекомендую. + +## 4. Не запускайте контейнеры Docker от имени root + +По умолчанию контейнеры запускаются от имени пользователя root внутри контейнера, что дает привилегии root. Это угроза безопасности. + +Одна из лучших практик безопасности Docker — запускать контейнер от имени пользователя без полномочий root (UID не 0). Известные и надежные образы используют эту передовую практику безопасности при создании образов. Например, LinuxServer.io предоставляет образы докеров для нескольких приложений домашнего сервера. Их образы позволяют явно указать UID и GID в качестве переменных окружения. + +В идеале, это должно выглядеть так, как показано в блоке кода ниже. +```yaml + environment: + - PUID=$PUID + - PGID=$PGID +``` +## 5. Осторожно используйте привилегированный режим + +По умолчанию контейнеры Docker работают в «непривилегированном» режиме. Это означает, что эти контейнеры не могут запускать демон Docker внутри себя. Это также запрещает использование хост-устройств или определенных функций ядра. + +Обычно это делается путем добавления следующей строки в services: + +```yaml + privileged: true +``` + +Для некоторых служб требуется привилегированный режим. Например, только четыре службы в моем файле компоновки Docker используют привилегированный режим: + +1. Home Assistant — для доступа к USB-контроллеру Z-wave. +2. Socket Proxy — требование для Socket proxy, повышающее безопасность. +3. Glances – для мониторинга системы +4. APCUPSD — для связи демона ИБП APC с ИБП через USB. + +В таких ситуациях используйте образы докеров только из надежных источников (подробнее об этом позже). Еще лучший подход — использовать возможности докеров . + +Кроме того, добавление следующей строки гарантирует, что контейнеры не получат дополнительных привилегий: + +```yaml + security_opt: + - no-new-privileges:true +``` + +## 6. Используйте доверенные образы Docker + +По возможности всегда используйте изображения от проверенных издателей или официальных источников. + +Это дает немедленное доверие и обеспечивает безопасность контейнера Docker. + +С непопулярными образами трудно предсказать или предположить, были ли соблюдены/реализованы передовые методы безопасности Docker. + +!!! note + К сожалению, для многих приложений для домашних серверов, таких как Sonarr, Radarr и т. д., нет «официальных» или «проверенных» издателей. Поэтому вам придется ориентироваться на популярность изображения (количество загрузок/звезд). + +## 7. Используйте секреты Docker + +Указание всей вашей конфиденциальной информации (например, ключей API) в файле `.env`, `/etc/environment` или файле `docker-compose.yml` может представлять угрозу безопасности. + +Именно поэтому были введены [секреты Docker](https://www.docker.com/blog/docker-secrets-management/): для управления конфиденциальными данными. + +Реализация секретов Docker для вашего стека — это многоэтапный процесс. + +### А. Создать папку секретов + +Сначала создайте папку secrets внутри корневой папки docker . + +```bash +sudo mkdir secrets +``` + +Установите для этой папки права доступа 600 , принадлежащие пользователю root и группе root . + +```bash +sudo chown root:root ~/docker/secrets +sudo chmod 600 ~/docker/secrets +``` +Это делает эту папку доступной только для пользователя *root*, добавляя уровень безопасности при доступе к конфиденциальной информации. + +### B. Создайте секретные файлы + +Затем вам нужно будет поместить вашу конфиденциальную информацию в файл. В качестве примера давайте определим секрет для электронной почты учетной записи Cloudflare. + +Давайте создадим файл внутри папки секретов с именем **cloudflare_email** . Помните, что для создания файла вам потребуются root-права. В моей системе Ubuntu я использую: + +```bash +sudo su +nano cloudflare_email +``` +Вы можете использовать любой другой текстовый редактор. + +Единственное, что нужно добавить в файл, — это адрес электронной почты вашей учетной записи Cloudflare. + +Сохранить и выйти. + +### C. Определите секреты в файле Docker Compose + +Теперь, когда секрет Docker создан, давайте определим его в файле компоновки Docker. Делается это с помощью блока: secrets. + +В приведенном ниже примере показаны два секрета: `cloudflare_email` и `cloudflare_api_key`. + +```yaml +########################### SECRETS + +secrets: + cloudflare_email: + file: $SECRETSDIR/cloudflare_email + cloudflare_api_key: + file: $SECRETSDIR/cloudflare_api_key +``` + +`$SECRETSDIR` — это переменная окружения, содержащая путь к папке секретов Docker. + +### D. Используйте секреты в службах Docker + +После глобального определения мы можем использовать секреты в сниппетах docker-compose для отдельных сервисов. Поскольку мы добавили данные учетной записи Cloudflare в качестве секретов Docker, давайте посмотрим, как их использовать во фрагменте кода docker-compose для Traefik. + +Во-первых, мы должны сделать секреты доступными внутри контейнера Traefik. Для этого вам нужно добавить следующий блок в сниппет docker-compose для Traefik: + +```yaml + secrets: + - cloudflare_email + - cloudflare_api_key +``` + +Это делает секретный файл доступным в папке `/run/secrets` внутри контейнера. + +Затем мы можем установить переменные среды для чтения конфиденциальных данных из этих секретных файлов с помощью блока `environment:` как показано ниже: + +```yaml +environment: + - CF_API_EMAIL_FILE=/run/secrets/cloudflare_email + - CF_API_KEY_FILE=/run/secrets/cloudflare_api_key +``` + +Обратите внимание, что к переменным окружения теперь добавляется **_FILE** в конце. Не пропустите это, иначе это не сработает. + +Сохраните и заново создайте службу и проверьте журналы на наличие ошибок. Если контейнер не сможет правильно прочитать секреты, вы увидите это как ошибку в журналах. + +!!! note + Чтобы секреты Docker работали правильно, базовый образ контейнера должен их поддерживать. Если образ имеет репутацию/надежный образ, очень высока вероятность того, что разработчики внедрили передовые методы обеспечения безопасности Docker , включая секреты Docker. + +## 8. Используйте прокси-сервер Docker Socket + +Каждый раз, когда вы предоставляете сокет Docker службе, вы упрощаете для контейнера получение root-доступа в хост-системе. + +Но некоторым приложениям требуется доступ к сокету Docker и API (например, Traefik, Glances, Dozzle, Watchtower и т. д.). + +Если Traefik будет скомпрометирован, ваша хост-система может быть скомпрометирована. Собственная документация Traefik перечисляет использование Socket Proxy в качестве решения. + +Прокси-сервер сокета похож на брандмауэр для сокета/API докера. Вы можете разрешить или запретить доступ к определенному API. + +Я начал с [Socket Proxy от Tecnativa](https://hub.docker.com/r/tecnativa/docker-socket-proxy), но недавно перешел на [Socket Proxy от FluenceLab](https://hub.docker.com/r/fluencelabs/docker-socket-proxy), так как он обеспечивает более детальный контроль . + +Добавьте сеть в свой файл compose (игнорируйте первую строку, если у вас уже есть блок network:): + +```yaml +networks: + socket_proxy: + name: socket_proxy + driver: bridge + ipam: + config: + - subnet: 192.168.91.0/24 +``` + +И, наконец, вот фрагмент кода docker-compose для добавления прокси-сервера сокета для повышения безопасности докера: + +```yaml +# Docker Socket Proxy - Security Enchanced Proxy for Docker Socket + socket-proxy: + container_name: socket-proxy + image: tecnativa/docker-socket-proxy + restart: always + networks: + socket_proxy: + ipv4_address: 192.168.91.254 # You can specify a static IP + # privileged: true # true for VM. False for unprivileged LXC container. + ports: + - "127.0.0.1:2375:2375" # Port 2375 should only ever get exposed to the internal network. When possible use this line. + # I use the next line instead, as I want portainer to manage multiple docker endpoints within my home network. + # - "2375:2375" + volumes: + - "/var/run/docker.sock:/var/run/docker.sock" + environment: + - LOG_LEVEL=info # 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 + # Not always needed + - BUILD=0 + - COMMIT=0 + - CONFIGS=0 + - CONTAINERS=1 # Traefik, portainer, etc. + - DISTRIBUTION=0 + - EXEC=0 + - IMAGES=1 # Portainer + - INFO=1 # Portainer + - NETWORKS=1 # Portainer + - NODES=0 + - PLUGINS=0 + - SERVICES=1 # Portainer + - SESSION=0 + - SWARM=0 + - SYSTEM=0 + - TASKS=1 # Portainer + - VOLUMES=1 # Portainer +``` + + +!!! warning "Внимание" + никогда не открывайте порт 2375 для доступа в Интернет. Вас взломают/ Это еще более важно для виртуальных частных серверов, которые обычно предоставляют доступ ко всем портам. Включите брандмауэр, чтобы разрешить только порты 80 и 443 (и заблокировать остальные) для прохождения на ваш сервер, а также реализовать обходной путь Docker IP Tables, описанный далее в этом руководстве. + +!!! note + Кроме того, порт `2375` должен быть открыт только для внутренней сети (*127.0.0.1:2375*). + +В блоке **environment:** указываем раздел Docker API, который хотим открыть или закрыть. Я добавил комментарии, чтобы описать, какие службы требуют каких разделов API. Например, если вы не используете WatchTower, вы можете ввести **0** для нескольких разделов API. + +После запуска контейнера прокси-сервера Socket вы можете заменить прямой доступ к сокету Docker прокси-сервером Socket для всех служб, которые в нем нуждаются. Это можно сделать несколькими способами, в зависимости от того, как это поддерживает образ контейнера. + +Для Traefik замените следующий аргумент CLI (если вы используете аргументы CLI вместо статических конфигураций): + +`- --providers.docker.endpoint=unix:///var/run/docker.sock` + +на + +`- --providers.docker.endpoint=tcp://socket-proxy:2375` + +Для других служб вы можете удалить указание Docker Socket в качестве тома (следующая строка под томами: ): + +`- /var/run/docker.sock:/var/run/docker.sock:ro` + +и добавьте переменную окружения DOCKER_HOST , как показано ниже: + +`DOCKER_HOST: tcp://socket-proxy:2375` + +Это то, что я делаю для Portainer и WatchTower. + +Воссоздайте свой стек, и ваши службы должны использовать защищенный прокси-сервер сокета Docker вместо сокета Docker. + +## 9. Измените DOCKER_OPTS на Respect IP Table Firewall + +Случайно наткнулся на эту тему. Я включил UFW, как всегда делаю на своем VPS Digital Ocean, и заблокировал все, кроме 80 и 443. Я непреднамеренно попытался получить доступ к одной из служб, используя номер порта, и был шокирован тем, что я был подключен. + +Покопавшись дальше, я наткнулся на этот открытый вопрос на GitHub . Почему это было открыто больше года, несмотря на огромное количество людей, запрашивающих исправление, мне не понятно. + +Поэтому, если у вас включен прокси-сервер сокета и включен брандмауэр, из-за недостатка безопасности в докере хакеры все равно могут взломать вашу систему, используя порт прокси-сервера сокета (2375). + +К счастью, есть обходной путь. В системах на базе Ubuntu/Debian отредактируйте **/etc/default/docker** и добавьте следующую строку: + +`DOCKER_OPTS="--iptables=false"` + +Сохраните файл и перезапустите службу Docker. + +Попробуйте подтвердить исправление, обратившись к одной из ваших служб с помощью WAN-IP:PORT. + +## 10. Контролируйте использование ресурсов Docker + +Мне понравилось, что я могу устанавливать ресурсы для сервисов Docker. К сожалению, это возможно только с [Docker-Compose версии 2](https://docs.docker.com/compose/compose-file/compose-file-v2/#cpu-and-other-resources) или режимом Docker Swarm. + +Если вы используете любой из них, вы можете установить [ограничения ресурсов для служб Docker](https://docs.docker.com/config/containers/resource_constraints/) . + +Вот пример docker-compose для установки ограничений ресурсов в режиме Docker Swarm: + +```yaml +deploy: + resources: + limits: + cpus: '0.50' + memory: 50M + reservations: + cpus: '0.25' + memory: 20M +``` + +Установив ограничения ресурсов, вы можете ограничить любую службу, которая становится мошеннической и потребляет ваши системные ресурсы. + +**Защита приложений Docker с помощью Traefik** + +Есть вещи, которые можно сделать на стороне Traefik, чтобы защитить ваш стек от вредоносных атак. Давайте рассмотрим некоторые меры безопасности Traefik, которые можно реализовать. + +## 11. Ограничение скорости + +Ограничение скорости довольно распространено для смягчения атак методом грубой силы или отказа в обслуживании. В моем стеке Traefik Docker есть промежуточное ПО для определения ограничения скорости . + +```yaml +middlewares-rate-limit: + rateLimit: + average: 100 + burst: 50 +``` + +Приведенный выше общий набор чисел отлично работает для меня. Его можно настроить в соответствии с вашей ситуацией, используя документацию Traefik по ограничению скорости . + +## 12. Заголовки безопасности Traefik + +Заголовки безопасности — это основные требования к безопасности веб-сайта. Они защищают от различных атак, включая XSS, кликджекинг, внедрение кода и многое другое. + +Вот заголовки безопасности Traefik, которые я определил как промежуточное ПО: + +```yaml +middlewares-secure-headers: + headers: + accessControlAllowMethods: + - GET + - OPTIONS + - PUT + accessControlMaxAge: 100 + hostsProxyHeaders: + - "X-Forwarded-Host" + sslRedirect: true + stsSeconds: 63072000 + stsIncludeSubdomains: true + stsPreload: true + forceSTSHeader: true + # frameDeny: true #overwritten by customFrameOptionsValue + customFrameOptionsValue: "allow-from https:example.com" #CSP takes care of this but may be needed for organizr. + contentTypeNosniff: true + browserXssFilter: true + # sslForceHost: true # add sslHost to all of the services + # sslHost: "example.com" + referrerPolicy: "same-origin" + # Setting contentSecurityPolicy is more secure but it can break things. Proper auth will reduce the risk. + # the below line also breaks some apps due to 'none' - sonarr, radarr, etc. + # contentSecurityPolicy: "frame-ancestors '*.example.com:*';object-src 'none';script-src 'none';" + featurePolicy: "camera 'none'; geolocation 'none'; microphone 'none'; payment 'none'; usb 'none'; vr 'none';" + customResponseHeaders: + X-Robots-Tag: "none,noarchive,nosnippet,notranslate,noimageindex," + server: "" +``` + +В Traefik была ошибка, из-за которой нельзя было определить заголовки безопасности как в динамической, так и в статической конфигурации. Это с тех пор было закрыто. + +Так что теперь можно добавить **sslForceHost** и **sslHost** к отдельным службам, если хотите, для дополнительной безопасности. + +## 13. Параметры TLS + +Параметры TLS позволяют настраивать соединения TLS для защиты соединения между клиентом и вашей службой. Дополнительные пояснения можно найти в [документации TLS от Traefik](https://doc.traefik.io/traefik/https/tls/). + +В моей настройке я определил следующие параметры TLS для Traefik: + +```yaml +tls: + options: + default: + minVersion: VersionTLS12 + sniStrict: true + cipherSuites: + - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 + - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 + - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 + - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 + - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 + - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 + - TLS_AES_128_GCM_SHA256 + - TLS_AES_256_GCM_SHA384 + - TLS_CHACHA20_POLY1305_SHA256 + curvePreferences: + - CurveP521 + - CurveP384 +``` + +## 14. Многофакторная аутентификация + +Это становится все более и более очевидным / обязательным. Если вы еще не защитили свои приложения Docker с помощью многофакторной аутентификации, сделайте это прямо сейчас. Я тестировал и использовал три системы аутентификации: Google OAuth, Authelia и Keycloak. + +## 15. Защитите контейнеры Docker с помощью Cloudflare + +Вот краткое изложение ключевых настроек Cloudflare для повышения безопасности контейнеров Docker при подключении к Интернету. + +- **Cloudflare Proxy** — позволяет использовать улучшения безопасности и производительности Cloudflare. +- **Режим SSL** — полный или строгий. Это шифрует соединение между исходным сервером и Cloudflare и между Cloudflare и клиентом. +- **Пограничные сертификаты**: + - **Всегда использовать HTTPS**: ВКЛ. + - **HTTP Strict Transport Security (HSTS)**: Включить (будьте осторожны) + - **Минимальная версия TLS**: 1.2 + - **Оппортунистическое шифрование**: ВКЛ. + - **TLS 1.3**: ВКЛ. + - **Автоматическая перезапись HTTPS**: ВКЛ. + - **Мониторинг прозрачности сертификата**: ВКЛ. +- Правила брандмауэра. Создайте правила для разрешения или запрета определенного трафика (например, я разрешаю трафик только из РФ в мои частные приложения, так как я получаю к нему доступ только из РФ). +- **Настройки брандмауэра**: + - **Уровень безопасности**: Высокий + - **Режим боя с ботом**: ВКЛ. + - **Прохождение испытания**: 30 минут + - **Проверка целостности браузера**: ВКЛ. + +Это настройки Cloudflare, связанные с безопасностью Docker. + +**Другие улучшения безопасности для стека Docker Traefik** + +Все вышеперечисленные рекомендации по безопасности докеров — это то, что я реализовал до сих пор. Но есть и другие, и я настоятельно рекомендую изучить следующее для дополнительной безопасности. + +## 16. Fail2ban + +Fail2ban сканирует ваши лог-файлы и блокирует IP-адреса, которые показывают злонамеренные намерения (например, поиск эксплойтов, неудачных паролей и т. д.). При обнаружении подозрительной активности он обновляет правила брандмауэра, чтобы заблокировать IP-адрес на указанный период времени. + +## 17. Безопасность Docker Bench + +Docker Bench for Security — это скрипт, который проверяет десятки распространенных передовых методов развертывания контейнеров Docker в рабочей среде . + +## 18. RBAC + +RBAC — это управление доступом на основе ролей. Если вы представляете предприятие или имеете несколько пользователей, это обязательно. Это может быть довольно дорого реализовать, но [portainer делает это очень простым](https://www.funkypenguin.co.nz/note/docker-rbac-with-portainer/) (поскольку кулинарная книга FunkyPenguin потрясающая … проверьте ее, если вы этого не сделали) за символическую плату. + +## 19. Сканер уязвимостей контейнеров + +Последним в списке лучших практик для безопасности докеров является сканер уязвимостей. Здесь есть несколько примеров, но я перечислю только один: Clair. + +Clair — проект с открытым исходным кодом для статического анализа уязвимостей в контейнерах приложений. + +Он использует Clair API для индексации образов контейнеров, а затем сопоставляет их с известными уязвимостями безопасности Docker. \ No newline at end of file diff --git a/docs/docker-compose/traefik-forward-auth.md b/docs/docker/traefik-forward-auth.md similarity index 100% rename from docs/docker-compose/traefik-forward-auth.md rename to docs/docker/traefik-forward-auth.md diff --git a/docs/docker/traefik.md b/docs/docker/traefik.md new file mode 100755 index 0000000..86cc651 --- /dev/null +++ b/docs/docker/traefik.md @@ -0,0 +1,376 @@ +Traefik — это обратный прокси-сервер с открытым исходным кодом, обеспечивающий простую работу с микросервисами и/или просто контейнерами с вашими приложениями. + +Обратный прокси-сервер (reverse proxy, реверс-прокси) служит для ретрансляции запросов из внешней сети к каким-либо серверам/сервисам внутренней сети (например веб-сервера, БД или файловые хранилища) и позволяет: +- обеспечить сокрытие структуры внутренней сети и подробностей о находящейся в ней сервисах; +- осуществлять балансировку нагрузки (load balancing) между экземплярами одного и того же сервиса или серверами с одинаковыми задачами; +- обеспечить зашифрованное (HTTPS) соединение между клиентом и любым сервисом, в таком случае SSL сессия создается между клиентом и прокси, а между прокси и сервисом во внутренней сети устанавливается незашифрованное HTTP соединение, если сервис поддерживает HTTPS то можно организовать зашифрованное соединение и во внутренней сети; +- организовать контроль доступа к сервисам (аутентификацию клиента), а также установить файрвол (брандмауэр). + +В статье будет описываться использование Traefik в Docker в качестве реверс-прокси для других контейнеров Docker, а также не контейнеризированных сервисов. + +## Введение +Traefik позиционируется разработчиками как “Edge Router”, то есть можно направить его непосредственно в глобальную сеть одной стороной и во внутреннюю другой. Если у читателя создалось впечатление что таким образом создается единая точка отказа всей системы, то так и есть, но есть несколько моментов: +- во-первых, **Traefik** имеет развитый функционал для автоматического восстановления при сбоях; +- во-вторых, существует **Traefik EE** — платная версия, в которой помимо прочих преимуществ имеется HA (Hight Availability, Высокая доступность), что подразумевает распределение нагрузки между несколькими экземплярами сервиса (узлами), таким образом при отказе одного его задачи перераспределяются на другие узлы, а отказавший узел отключается и затем немедленно вводится обратно в эксплуатацию. + +> В качестве примечания отметим, что в статье будет рассматриваться бесплатная версия Traefik. + +Одним из основных достоинств Traefik является возможность изменения его конфигурации без приостановки работы (“на лету”) при применении любого из поддерживаемых бэкэндов, называемых провайдерами. + +Список основных провайдеров: +- Docker +- Kubernetes +- Consul Catalog +- Marathon +- Rancher +- File + +В рамках этой статьи будут рассмотрены первый и последний провайдеры из этого списка. + +Вероятно, не знакомому с темой читателю будет не понятно, чем является провайдер с именем — “File”, это некоторый файл (или папка с файлами), в котором описана конфигурация какого-либо сервиса, не связанного с другими провайдерами, но который должен быть скрыт за реверс-прокси. Остальные же провайдеры являются различными системами оркестрации контейнеров. + +Файл конфигурации Traefik, а также файлы для провайдера “File” могут быть написаны на TOML либо YAML, в статье будут приведены примеры на YAML так как этот синтаксис больше нравится автору, а какой-либо функциональной разницы между ними нет, а также не составляет трудности переписать файлы на другой формат конфигурации. Traefik будет развернут в Docker. Для развертывания будет использоваться docker-compose, для обеспечения простоты повторного развертывания. + +> В статье будут приведены команды для ОС Linux. + +## Деплой Traefik + +Предполагается что у читателя установлены и настроены `docker` и `docker-compose`, их установка выходит за рамки этой статьи. + +Создадим в домашней папке пользователя папку `traefik`, в которой будем хранить всю конфигурацию, и перейдем в эту папку + +```bash +mkdir ~/traefik +cd ~/traefik +``` + +Для развертывания (деплоя) Traefik создадим файл `docker-compose.yml` и отредактируем его в любом удобном вам редакторе. Для начала этот файл будет иметь следующий вид: +```yaml +version: '3.9' +services: + traefik: + image: traefik:v2.10 + container_name: traefik + restart: unless-stopped + security_opt: + - no-new-privileges:true + ports: + - 80:80 + - 443:443 + volumes: + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./data/traefik.yml:/traefik.yml:ro +``` + +Во внешний мир будут смотреть порты 80 и 443 для HTTP и HTTPS соответственно. Также пробросим в контейнер сокет демона Docker для работы механизма автоматической конфигурации. Конфигурацию Traefik будем описывать в файле `traefik.yml` находящемся в папке `data` в текущей директории. + +> Если для разделения внешней и внутренней сетей используются networks Docker-а, то Traefik должен иметь доступ к внешней сети и ко всем внутренним в которых находятся целевые сервисы. + +Создадим и будем постепенно наполнять этот файл. + +Для начала опишем точки входа в наш прокси (те самые порты, которые смотрят во внешний мир): +```yaml +entryPoints: + http: + address: ":80" + https: + address: ":443" +``` + +Здесь `http` и `https` это просто названия (могут быть любыми, хоть `a` и `b`) и были выбраны так для удобства. + +Теперь добавим первого провайдера — Docker, это делается следующим образом: + +```yaml +providers: + docker: + endpoint: "unix:///var/run/docker.sock" + exposedByDefault: false +``` + +Параметром указываем что Traefik не должен брать все контейнеры подряд, далее будет объяснено каким образом мы будем сообщать какие контейнеры нас интересуют. Также здесь видно зачем мы пробрасывали сокет в контейнер — именно через него Traefik будет получать сведения о запускаемых контейнерах на этом хосте (можно подключиться и к демону на другом хосте). + +Следующим шагом развернем весь HTTP трафик в HTTPS (почему это было сделано именно таким образом будет описано дальше): + +```yaml +http: + routers: + http-catchall: + rule: HostRegexp(`{host:.+}`) + entrypoints: + - http + middlewares: + - redirect-to-https + middlewares: + redirect-to-https: + redirectScheme: + scheme: https + permanent: false +``` + +Traefik может проксировать не только HTTP трафик, но и просто TCP и UDP, поэтому указываем что этот блок конфигурации относится к `http`. + +Здесь мы встречаем два из трех основных элементов роутинга в Traefik 2 routers (роутеры) и middlewares(промежуточные обработчики), рассмотрим их подробнее. + +### Routers (роутеры) + +Рассмотрим на примере описанного выше роутера: + +- `http-catchall` — имя роутера, может быть любым, но обязано быть уникальным в рамках блока `http` всей конфигурации Traefik; +- `rule:` — правило, описывает какой трафик попадает в этот роутер, в данном случае описывается `HostRegexp`, то есть поле `Host` запроса должно попадать под регулярное выражение `.+` (то есть любое), здесь мы видим специфику регулярных выражений в Traefik — оно должно быть заключено в фигурные скобки и иметь наименование (`host` в данном случае), то есть синтаксис имеем вид `{name:reg_exp}`; +- `entrypoints` — массив описанных ранее точек входа, которые будут использоваться этим роутером, в нашем случае используем только `http`; +- `middlewares` — массив промежуточных обработчиков, куда попадает трафик перед передачей к сервису (сервисы будут рассмотрены позднее). + +Подробнее о различных видах правил можно прочитать в [документации](https://docs.traefik.io/routing/routers/#rule). + +### Middlewares(промежуточные обработчики) + +- `redirect-to-https` — имя обработчика, может быть любым, но обязано быть уникальным в рамках блока `http` всей конфигурации Traefik; +- `redirectScheme` — тип обработчика, в данном случае изменение схемы запроса; +- `scheme: https` — вынуждает клиента использовать схему HTTPS при запросе к прокси; +- `permanent: false` — говорит клиенту что это не навсегда и может измениться в будущем. + +Подробнее о различных обработчиках можно прочитать в [документации](https://docs.traefik.io/middlewares/overview/) (дальше в статье будет описан ещё один обработчик — BasicAuth). + +??? note "Полностью файл traefik.yml" + ```yaml + entryPoints: + http: + address: ":80" + https: + address: ":443" + providers: + docker: + endpoint: "unix:///var/run/docker.sock" + exposedByDefault: false + http: + routers: + http-catchall: + rule: HostRegexp(`{host:.+}`) + entrypoints: + - http + middlewares: + - redirect-to-https + middlewares: + redirect-to-https: + redirectScheme: + scheme: https + permanent: false + ``` + +Таким образом мы получим первую рабочую конфигурацию. Выполняем +```bash +sudo docker-compose up -d +``` +И прокси должен подняться, можно почитать логи (`sudo docker-compose logs -f`) и убедиться, что всё работает. + +## Let’s Encrypt + +Поскольку мы хотим использовать HTTPS нам нужно где-то взять SSL сертификаты для сервисов, есть возможность использовать свои сертификаты, но мы настроем автоматическое получение бесплатных сертификатов от Let’s Encrypt. + +Добавим в конфигурацию (`traefik.yml`) новый блок: + +```yaml +certificatesResolvers: + letsEncrypt: + acme: + email: postmaster@example.com + storage: acme.json + caServer: "https://acme-staging-v02.api.letsencrypt.org/directory" + httpChallenge: + entryPoint: http +``` + +Здесь: +- `letsEncrypt` — это просто имя резолвера; +- `acme` — тип резолвера (других типов в общем-то и нет); +- `storage` — файл, в котором хранятся сведения о полученных сертификатах; +- `httpChallenge` — тип acme-челенжа, дополнительно указываем параметр — точку входа; +- `caServer: "https://acme-staging-v02.api.letsencrypt.org/directory"` — позволяет использовать не основной сервер Let’s Encrypt в тестовых целях, так как основной имеет строгие лимиты API (можно закомментировать, когда наладите получение сертификатов). + +Также дополним пункт `volumes` в файле `docker-compose.yml`, чтобы сохранять сертификаты при перезапуске контейнера (предварительно создав файл `data/acme.json`): + +```yaml + volumes: + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./data/traefik.yml:/traefik.yml:ro + - ./data/acme.json:/acme.json +``` + +## Docker провайдер + +HTTPS настроен, пришло время поднять первый сервис, пусть это будет дашборд самого Traefik, так как Traefik у нас в Docker, воспользуемся этим провайдером. + +Для описания конфигурации в Docker Traefik использует метки (labels) контейнеров. Допишем в наш файл `docker-compose.yml`: +```yaml + labels: + - "traefik.enable=true" + - "traefik.http.routers.traefik.entrypoints=https" + - "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)" + - "traefik.http.routers.traefik.tls=true" + - "traefik.http.routers.traefik.tls.certresolver=letsEncrypt" + - "traefik.http.routers.traefik.service=api@internal" + - "traefik.http.services.traefik-traefik.loadbalancer.server.port=888" +``` +Разберем построчно: +- `traefik.enable=true` — указываем что Traefik должен обеспечить + доступ к этому контейнеру, необходимо для всего остального; +- `traefik.http.routers.traefik.entrypoints=https` — создаем новый + роутер с точной входа `https`; +- `traefik.http.routers.traefik.rule=Host(`traefik.example.com`)` — + роутер будет жить по адресу traefik.example.com; +- `traefik.http.routers.traefik.tls=true` — указываем что используется + TLS; +- `traefik.http.routers.traefik.tls.certresolver=letsEncrypt` — + указываем через какой резолвер получать сертификат; +- `traefik.http.routers.traefik.service=api@internal` — указываем, что + сервер за этим роутером — `api@internal`, это специальный сервис, + созданный по умолчанию, это как раз и есть дашбоард который мы хотели + увидеть; +- `traefik.http.services.traefik-traefik.loadbalancer.server.port=888` + — издержки интерфейса, без этого не заработает, но можно написать + абсолютно любую цифру. + +Дашбоард надо включить, для этого добавим в файл `traefik.yml`: + +```yaml +api: + dashboard: true +``` + +На данном этапе можно пересоздать контейнер (нужно так как мы меняли `docker-compose.yml`): + +```bash +sudo docker-compose down && sudo docker-compose up -d +``` + +Когда всё поднимется можно перейти на `traefik.example.com` (тут на самом деле должен быть ваш домен, который направлен на хост с Traefik) и увидеть дашборд. + +Дашбоард это хорошо, но мы не хотим, чтобы все пользователи интернета имели к нему доступ, закроем его от внешнего мира с помощью BasicAuth, для это в Traefik есть специальный middleware. + +Для начала сгенерируем для нас строку с логином и паролем (admin/password)^ + +```bash +$ htpasswd -nb admin password +admin:$apr1$vDSqkf.v$GTJOtsd9CBiAFFnHTI2Ds1 +``` + + +Теперь добавим в наш `docker-compose.yml` новые строчки: +```yaml +- "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$vDSqkf.v$$GTJOtsd9CBiAFFnHTI2Ds1" +- "traefik.http.routers.traefik.middlewares=traefik-auth" +``` + +Заметим, что символы `$` из полученной строки мы должны заменить на `$$`. +- `traefik.http.middlewares.traefik-auth.basicauth.users=...` — создаем middleware типа `basicauth` с параметром `users`; +- `traefik.http.routers.traefik.middlewares=traefik-auth` — указываем что роутер `traefik` использует только что-то созданный middleware. + +??? note "Весь docker-compose.yml" + ```yaml + version: '3.9' + services: + traefik: + image: traefik:v2.10 + container_name: traefik + restart: unless-stopped + security_opt: + - no-new-privileges:true + ports: + - 80:80 + - 443:443 + volumes: + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./data/traefik.yml:/traefik.yml:ro + - ./data/acme.json:/acme.json + labels: + - "traefik.enable=true" + - "traefik.http.routers.traefik.entrypoints=https" + - "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)" + - "traefik.http.routers.traefik.tls=true" + - "traefik.http.routers.traefik.tls.certresolver=letsEncrypt" + - "traefik.http.routers.traefik.service=api@internal" + - "traefik.http.services.traefik-traefik.loadbalancer.server.port=888" + ``` + +Теперь при попытке доступа к дашборду у нас спросят логин и пароль. + +Приведем также кофигурацию некого другого сервиса, развернутого через docker-compose (аналогично работает и для обычного docker): + +```yaml + labels: + - "traefik.enable=true" + - "traefik.http.routers.test.entrypoints=https" + - "traefik.http.routers.test.rule=Host(`test.example.com`)" + - "traefik.http.routers.test.tls=true" + - "traefik.http.routers.test.tls.certresolver=letsEncrypt" + - "traefik.http.services.test-service.loadbalancer.server.port=80" +``` + +Здесь одна новая метка `traefik.http.services.test-service.loadbalancer.server.port=80` — присваиваем этому контенеру имя сервиса `test-service` и порт 80, он автоматически присоединится к роутеру `test`, Traefik автоматически постороит маршрут до этого контенера, даже если он находится на другом хосте. + +## File провайдер + +С контейнерами работает, а как быть если есть какой-то сервис работающий на выделенном хосте (пускай IP 192.168.1.222 и порт 8080) и мы его хотим пропустить через этот же прокси, заодно закрыв его с помощью HTTPS. Для этого есть решение. + +Добавим в `docker-compose.yml` ещё один `volume`: + +```yaml + volumes: + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./data/traefik.yml:/traefik.yml:ro + - ./data/custom/:/custom/:ro + - ./data/acme.json:/acme.json +``` + +Пускай описания таких хостов у нас будут лежать в `data/custom/` (а что, вдруг ещё появятся). + +Добавим в `traefik.yml` конфигурацию file провайдера для этих файлов: + +```yaml +providers: +... + file: + directory: /custom + watch: true +``` + +Директория следует из нашего `docker-compose.yml`, а `watch: true` значит что Traefik будет автоматически обновлять конфигурацию при обнаружении изменений в этих файлах (помните про обновление конфигурации “на лету”, вот работает даже для файлов, а не только для оркестраторов). + +Перезапускаем Traefik и теперь можно создать файл с описанием нашего отдельного хоста (`data/custom/host.yml`): + +```yaml +http: + routers: + host: + entryPoints: + - https + service: service-host + rule: Host(`host.example.com`) + tls: + certResolver: letsEncrypt + services: + service-host: + loadBalancer: + servers: + - url: http://192.168.1.222:8080/ + passHostHeader: true +``` + +Роутер описывался раньше, тут добавилось только `service: service-host` — связь с нашим сервисом, и конфигурация для TLS. + +Описание для сервиса имеет вид: + +```yaml +имя_сервиса: + loadBalancer: + servers: + - хосты для балансировки нагрузки + - ... +``` + +Дополнительно мы указываем параметр `passHostHeader: true` чтобы тот хост думал, что он на самом деле смотрит в сеть и прокси нет. \ No newline at end of file diff --git a/docs/images/docker/nextcloud-docker-php-imagick.png b/docs/images/docker/nextcloud-docker-php-imagick.png new file mode 100755 index 0000000..1e28777 Binary files /dev/null and b/docs/images/docker/nextcloud-docker-php-imagick.png differ diff --git a/docs/images/docker/traefik2.png b/docs/images/docker/traefik2.png new file mode 100755 index 0000000..19f77f4 Binary files /dev/null and b/docs/images/docker/traefik2.png differ diff --git a/docs/images/other/office/excel-vba-progress-bar-01.png b/docs/images/other/office/excel-vba-progress-bar-01.png new file mode 100755 index 0000000..377b5c6 Binary files /dev/null and b/docs/images/other/office/excel-vba-progress-bar-01.png differ diff --git a/docs/images/other/office/excel-vba-progress-bar-02.png b/docs/images/other/office/excel-vba-progress-bar-02.png new file mode 100755 index 0000000..bd2123d Binary files /dev/null and b/docs/images/other/office/excel-vba-progress-bar-02.png differ diff --git a/docs/images/other/office/excel-vba-progress-bar-03.png b/docs/images/other/office/excel-vba-progress-bar-03.png new file mode 100755 index 0000000..2d463c2 Binary files /dev/null and b/docs/images/other/office/excel-vba-progress-bar-03.png differ diff --git a/docs/images/other/office/excel_vba_01.png b/docs/images/other/office/excel_vba_01.png new file mode 100755 index 0000000..8e868c4 Binary files /dev/null and b/docs/images/other/office/excel_vba_01.png differ diff --git a/docs/images/other/phone/grandstream_01.png b/docs/images/other/phone/grandstream_01.png new file mode 100755 index 0000000..643059b Binary files /dev/null and b/docs/images/other/phone/grandstream_01.png differ diff --git a/docs/images/other/phone/grandstream_02.png b/docs/images/other/phone/grandstream_02.png new file mode 100755 index 0000000..6cf9e8e Binary files /dev/null and b/docs/images/other/phone/grandstream_02.png differ diff --git a/docs/images/other/phone/grandstream_03.png b/docs/images/other/phone/grandstream_03.png new file mode 100755 index 0000000..742331e Binary files /dev/null and b/docs/images/other/phone/grandstream_03.png differ diff --git a/docs/images/other/phone/grandstream_04.png b/docs/images/other/phone/grandstream_04.png new file mode 100755 index 0000000..46f775f Binary files /dev/null and b/docs/images/other/phone/grandstream_04.png differ diff --git a/docs/images/other/phone/grandstream_05.png b/docs/images/other/phone/grandstream_05.png new file mode 100755 index 0000000..785a2f9 Binary files /dev/null and b/docs/images/other/phone/grandstream_05.png differ diff --git a/docs/images/other/phone/grandstream_06.png b/docs/images/other/phone/grandstream_06.png new file mode 100755 index 0000000..0581e08 Binary files /dev/null and b/docs/images/other/phone/grandstream_06.png differ diff --git a/docs/images/other/phone/grandstream_07.png b/docs/images/other/phone/grandstream_07.png new file mode 100755 index 0000000..a7bfdc4 Binary files /dev/null and b/docs/images/other/phone/grandstream_07.png differ diff --git a/docs/images/other/phone/ipecs01.png b/docs/images/other/phone/ipecs01.png new file mode 100755 index 0000000..096dccf Binary files /dev/null and b/docs/images/other/phone/ipecs01.png differ diff --git a/docs/images/other/phone/ipecs02.png b/docs/images/other/phone/ipecs02.png new file mode 100755 index 0000000..9f06cde Binary files /dev/null and b/docs/images/other/phone/ipecs02.png differ diff --git a/docs/images/other/phone/ipecs03.png b/docs/images/other/phone/ipecs03.png new file mode 100755 index 0000000..cb22d82 Binary files /dev/null and b/docs/images/other/phone/ipecs03.png differ diff --git a/docs/images/other/phone/ipecs04.png b/docs/images/other/phone/ipecs04.png new file mode 100755 index 0000000..3aaf2c7 Binary files /dev/null and b/docs/images/other/phone/ipecs04.png differ diff --git a/docs/images/other/phone/ipecs05.png b/docs/images/other/phone/ipecs05.png new file mode 100755 index 0000000..345cb53 Binary files /dev/null and b/docs/images/other/phone/ipecs05.png differ diff --git a/docs/images/other/phone/ipecs06.png b/docs/images/other/phone/ipecs06.png new file mode 100755 index 0000000..76b7be4 Binary files /dev/null and b/docs/images/other/phone/ipecs06.png differ diff --git a/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-1.webp b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-1.webp new file mode 100755 index 0000000..fe554a5 Binary files /dev/null and b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-1.webp differ diff --git a/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-11.webp b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-11.webp new file mode 100755 index 0000000..837bdaa Binary files /dev/null and b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-11.webp differ diff --git a/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-15.webp b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-15.webp new file mode 100755 index 0000000..b4cdb15 Binary files /dev/null and b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-15.webp differ diff --git a/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-16.webp b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-16.webp new file mode 100755 index 0000000..543e60f Binary files /dev/null and b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-16.webp differ diff --git a/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-19.webp b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-19.webp new file mode 100755 index 0000000..0f9e6b0 Binary files /dev/null and b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-19.webp differ diff --git a/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-2.webp b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-2.webp new file mode 100755 index 0000000..bd4b551 Binary files /dev/null and b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-2.webp differ diff --git a/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-21.webp b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-21.webp new file mode 100755 index 0000000..7c53d07 Binary files /dev/null and b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-21.webp differ diff --git a/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-26.webp b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-26.webp new file mode 100755 index 0000000..92a89cc Binary files /dev/null and b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-26.webp differ diff --git a/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-29.webp b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-29.webp new file mode 100755 index 0000000..c7d1a96 Binary files /dev/null and b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-29.webp differ diff --git a/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-3.webp b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-3.webp new file mode 100755 index 0000000..9376a68 Binary files /dev/null and b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-3.webp differ diff --git a/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-4.webp b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-4.webp new file mode 100755 index 0000000..569889f Binary files /dev/null and b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-4.webp differ diff --git a/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-5.webp b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-5.webp new file mode 100755 index 0000000..55a5e4e Binary files /dev/null and b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-5.webp differ diff --git a/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-7.webp b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-7.webp new file mode 100755 index 0000000..9372d51 Binary files /dev/null and b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-7.webp differ diff --git a/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-8.webp b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-8.webp new file mode 100755 index 0000000..6ce094d Binary files /dev/null and b/docs/images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-8.webp differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_1.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_1.png new file mode 100755 index 0000000..af7b4c5 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_1.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_10.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_10.png new file mode 100755 index 0000000..9c4eb33 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_10.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_11.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_11.png new file mode 100755 index 0000000..8e60bdc Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_11.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_12.jpg b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_12.jpg new file mode 100755 index 0000000..66cc5dc Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_12.jpg differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_13.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_13.png new file mode 100755 index 0000000..76106a1 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_13.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_14.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_14.png new file mode 100755 index 0000000..69f6b42 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_14.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_15.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_15.png new file mode 100755 index 0000000..378520f Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_15.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_16.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_16.png new file mode 100755 index 0000000..6d1582f Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_16.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_17.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_17.png new file mode 100755 index 0000000..b14fff1 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_17.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_18.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_18.png new file mode 100755 index 0000000..7bfc03c Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_18.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_19.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_19.png new file mode 100755 index 0000000..1a0876f Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_19.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_2.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_2.png new file mode 100755 index 0000000..9087023 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_2.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_20.jpg b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_20.jpg new file mode 100755 index 0000000..81bc9ef Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_20.jpg differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_21.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_21.png new file mode 100755 index 0000000..6711429 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_21.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_22.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_22.png new file mode 100755 index 0000000..61e0c79 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_22.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_23.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_23.png new file mode 100755 index 0000000..f2393d1 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_23.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_24.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_24.png new file mode 100755 index 0000000..cb3ee24 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_24.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_25.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_25.png new file mode 100755 index 0000000..f9db1d9 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_25.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_26.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_26.png new file mode 100755 index 0000000..5bf94f5 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_26.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_27.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_27.png new file mode 100755 index 0000000..903b048 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_27.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_28.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_28.png new file mode 100755 index 0000000..044a482 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_28.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_3.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_3.png new file mode 100755 index 0000000..a255716 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_3.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_4.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_4.png new file mode 100755 index 0000000..a8afc31 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_4.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_5.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_5.png new file mode 100755 index 0000000..218f003 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_5.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_6.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_6.png new file mode 100755 index 0000000..ce3a076 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_6.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_7.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_7.png new file mode 100755 index 0000000..ecbd30f Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_7.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_8.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_8.png new file mode 100755 index 0000000..aa2a710 Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_8.png differ diff --git a/docs/images/other/tsd/flashing-tsd-mc9200-ce7_9.png b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_9.png new file mode 100755 index 0000000..b381c0d Binary files /dev/null and b/docs/images/other/tsd/flashing-tsd-mc9200-ce7_9.png differ diff --git a/docs/images/st1t_blue.png b/docs/images/st1t_blue.png new file mode 100755 index 0000000..9c4975a Binary files /dev/null and b/docs/images/st1t_blue.png differ diff --git a/docs/images/st1t_white.png b/docs/images/st1t_white.png new file mode 100755 index 0000000..1b54d4e Binary files /dev/null and b/docs/images/st1t_white.png differ diff --git a/docs/images/ubuntu/docker-and-ufw.jpg b/docs/images/ubuntu/docker-and-ufw.jpg new file mode 100755 index 0000000..8c90456 Binary files /dev/null and b/docs/images/ubuntu/docker-and-ufw.jpg differ diff --git a/docs/index.md b/docs/index.md index bd16f68..d04f033 100755 --- a/docs/index.md +++ b/docs/index.md @@ -1,10 +1,12 @@ -# Welcome to MkDocs +# Приветствую на моем сайт -For full documentation visit [mkdocs.org](https://www.mkdocs.org). +Данный ресурс создан для структурирования моих знаний в различных областях IT. -## Commands +Прошло мого времени, прежде чем я пришел к такому виду. До этого были Mediawiki, Dokuwiki, WikiJS, Wordpress. + +Сейчас MkDocs, но я изучаю еще Docusaurus + +Надеюсь, что статьи будут полезны. + +Для связи: https://t.me/thest1tch -* `mkdocs new [dir-name]` - Create a new project. -* `mkdocs serve` - Start the live-reloading docs server. -* `mkdocs build` - Build the documentation site. -* `mkdocs -h` - Print help message and exit. diff --git a/docs/macos/macos-bootable-flash.md b/docs/macos/macos-bootable-flash.md new file mode 100755 index 0000000..650f049 --- /dev/null +++ b/docs/macos/macos-bootable-flash.md @@ -0,0 +1,52 @@ + +Часто в работе возникает необходимость обновить MacOS на следующую версию. Скачивать каждый раз с интернета долго. Поэтому ускорим процесс и сделаем себе USB флешку с образом установки. + +Важно отметить, что вам не нужно создавать установщик USB для установки macOS. Вы можете использовать App Store для нужной версии системы: + +- [Monterey 12.x](https://apps.apple.com/us/app/macos-monterey/id1576738294?mt=12) +- [Big Sur 11.x](https://apps.apple.com/ru/app/macos-big-sur/id1526878132?mt=12) +- [Catalina 10.x](https://apps.apple.com/ru/app/macos-catalina/id1466841314?mt=12) + +## Выбор USB-накопителя + +Прежде чем следовать этому руководству, вам необходимо убедиться, что у вас есть доступ к USB-накопителю, который может служить местом установки. + +Как правило, USB-флеш-накопитель будет работать, если на нем есть не менее 16 ГБ памяти. + +## Создание загрузочного установочного USB-накопителя macOS + +1. Запустите **Mac App Store** и загрузите нужную ОС. Список с ссылками выше. Для примера будет использовать последнюю ОС - Monterey. +2. После завершения загрузки macOS автоматически запустится программа установки. Закройте программу установки через строку меню или с помощью ⌘+Q. +3. Подключите USB-накопитель, откройте его в **Finder** и убедитесь, что на нем нет ничего нужного. Если есть, важно сделать резервную копию любых данных на диске, которые вам нужны, потому что выполнение этих шагов приведет к очистке содержимого диска. ! Примечание. В этом руководстве нельзя использовать диски в формате APFS. Если диск отформатирован как APFS или вы не уверены, откройте Дисковую утилиту, выберите диск и нажмите «Стереть». Для формата обязательно выберите _Mac OS Extended (Journaled)_ и нажмите «Стереть». +4. Откройте **Finder** → Приложения. Щелкните правой кнопкой мыши « _Установить macOS Monterey_ » → « **Показать содержимое пакета»** . + ![](https://st1t.ru/wp-content/uploads/2022/12/ri0oyskj-1024x657.png) +5. Откройте Содержание → Ресурсы. + ![](https://st1t.ru/wp-content/uploads/2022/12/38egrg4j-1024x543.png) +6. Откройте новое окно Терминала, выбрав Приложения → Утилиты → Терминал. +7. Введите `**sudo**` , а затем пробел в окне терминала. +8. Перетащите **createinstallmedia** в окно терминала из папки «Ресурсы», открытой на шаге 5. + ![](https://st1t.ru/wp-content/uploads/2022/12/bx2bs4ok-1024x677.png) +9. Введите `**--volume**` , а затем пробел. + ![](https://st1t.ru/wp-content/uploads/2022/12/cgi471gt-1024x677.png) +10. Откройте Finder → Перейти → Перейти в папку… +11. Введите **/Volumes** и нажмите клавишу «Return». +12. Перетащите иконку USB-накопителя в окно терминала. + ![](https://st1t.ru/wp-content/uploads/2022/12/6lmebw5u-1024x365.png)** + Примечание.** Обязательно выберите правильный USB-накопитель, иначе вы рискуете повредить не тот диск. +13. Нажмите клавишу « _Return_ » на клавиатуре, чтобы обработать полную команду терминала, и введите пароль администратора при появлении запроса. +14. При появлении запроса введите «y» и нажмите клавишу « _Return_ » на клавиатуре. + ![](https://st1t.ru/wp-content/uploads/2022/12/ww7kegd1-1024x676.png) +15. Если вы еще не предоставили разрешение, утилита терминала может запросить доступ к файлам на съемном томе. Если это так, не забудьте нажать OK, чтобы разрешить доступ. +16. Процесс установки начнется с очистки содержимого подключенного USB-накопителя, создания загрузочного диска и копирования файлов установщика на диск. Поскольку этот процесс занимает несколько минут, наберитесь терпения. + ![](https://st1t.ru/wp-content/uploads/2022/12/ifsdjj2f-1024x678.png) + +## Использование установщика macOS Monterey USB + +Чтобы использовать установщик на Mac с Apple Silicon, выключите Mac, подключите диск, нажмите и удерживайте кнопку питания, пока не увидите логотип Apple со словами _Загрузка параметров запуска_ внизу. Через некоторое время вы должны увидеть, что «Установить macOS Monterey» появится в качестве параметра запуска. + +Для компьютеров Mac с процессором Intel подключите установочный USB-накопитель и нажмите и удерживайте клавишу **Option** после перезагрузки компьютера, пока не появится селектор запуска. + +При установке macOS в вашем распоряжении будет несколько вариантов, например: + +1. Обновление существующей установки macOS, переход с macOS Big Sur или предыдущих версий macOS на macOS Monterey. +2. Удаление существующей установки и запуск с нуля. \ No newline at end of file diff --git a/docs/network/mikrotik/wireguard.md b/docs/network/mikrotik/wireguard.md new file mode 100755 index 0000000..3135939 --- /dev/null +++ b/docs/network/mikrotik/wireguard.md @@ -0,0 +1,210 @@ +# Настройка WireGuard на Mikrotik + +# Что такое WireGuard + +Если не касаться wiki и официального сайта, и объяснять как можно проще, то это VPN туннелирование через UDP. + +Это возможность быстро, максимально просто и надёжно, с хорошим уровнем безопасности соединить две точки между собой. + +Соединение одноранговое, открытый исходный код, и полу-автоматизированное создание маршрутов(для некоторых клиентов) – что еще нужно, для счастья 😉 + +Возможность использовать WireGuard появилась в mikrotik начиная с седьмой версии RouterOS. + +## Как работает подключение (простым языком) + +У нас есть две точки: +- Точка А с внешним адресом 111.111.111.111 +- Точка Б с внешним адресом 222.222.222.222 + +С точки зрения WireGuard эти адреса называются `Endpoint`. + +Также у точек есть внутренние сети или LAN: +- Точка А. 192.168.100.0/24 +- Точка Б. 192.168.200.0/24 + +Эти сети мы и хотим связать между собой. Для WireGuard это называется **AllowedAddress**, или разрешенные адреса для точки. Для Точки А нам нужно будет указать разрешенные адреса – `192.168.200.0/24`. Для Точки Б, соответственно – `192.168.100.0/24` + +Помимо этого мы должны определить для точек А и Б их адреса. Они используются для интерфейса, который создает WireGuard и передачи внутри протокола. В настройках большинства клиентов это будет называться `Address`. В mikrotik мы создадим отдельный адрес. + +- Точка А. 10.10.10.1 +- Точка Б. 10.10.11.1 + +Всё! Этого достаточно для создания подключения и его работы. + +В итоге всё это будет выглядеть так: + +![Краткая схема работы WireGuard](https://habrastorage.org/r/w1560/getpro/habr/upload_files/ba4/847/961/ba48479616baa45e5a2d49e35668e926.png) + +## Отличия WireGuard и OpenVPN + +Я не являются специалистом по сетевым протоколов и криптографических систем, поэтому не могу дать детальное сравнение этих решений. Но могу выделить несколько основных отличий для меня, как пользователя и администратора: + +- В WireGuard не нужно создавать сертификаты, в отличии от OpenVpn, и следить за ними. Это и плюс и минус в зависимости от цели использования. +- В WireGuard создаются одноранговые соединения, где каждая точка может быть как сервером так и клиентом. Это позволяет создавать, помимо классических “звёзд”, ещё и mesh сети. +- OpenVPN позволяет более тонко управлять клиентами и их подключениями. Например, можно индивидуально раздавать маршруты и DNS-серверы для клиентов. WireGuard так не умеет. +- Отдельно для mikrotik есть недостаток в том, что для каждой подсети нужно настраивать маршруты. Для win-клиентов они определяются и задаются исходя из `AllowedAddress`. + +В целом я для себя сделал вывод, что для внешних пользователей удобнее и, возможно, безопаснее использовать OpenVPN. А для железных(ака аппаратных) или программных роутеров и их связи между собой удобнее WireGuard. По принципу – настроил и забыл. + +## Подготовка к настройке + +Для начала нужно убедится в том, что наш роутер Mikrotik умеет работать с WireGuard. Далее я буду показывать на примере интерфейса winbox. Если Вы пользуете командную строку, то Вы, скорее всего, сами сможете определить наличие WireGuard. + +Проверить, это можно просто взглянув на пункты меню (актуально для версии 7.5): + +![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/a70/2fb/4ac/a702fb4ac21cbfc064c036eceae95c7c.png) + +Обновить можно попробовать так: + +![стандартный способ обновления](https://habrastorage.org/r/w1560/getpro/habr/upload_files/fb4/029/b5d/fb4029b5d003f6b1ed3a639b140f47fa.png "стандартный способ обновления") + +стандартный способ обновления + +Если так не получилось, то смотрите свою версию в заголовке winbox устройства + +![в данном случае это mipsbe](https://habrastorage.org/r/w1560/getpro/habr/upload_files/a59/8d9/653/a598d9653e2ad09ce2ff88de5bc85854.png "в данном случае это mipsbe") + +в данном случае это mipsbe + +и идите на [официальный сайт mikrotik](https://mikrotik.com/download) для скачивания последней версии ОС. + +Коротко, как обновить через загрузку файла на Mikrotik: + +![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/cde/592/687/cde592687e0b10fc7cb74d0255d31c3f.png) + +Если у Вас много точек и так же для удобства настройки и дальнейшего обслуживания я рекомендую создать Вам подобную таблицу: + +| Name | Address | Endpoint | EndpointIp | AllowedIPs | ListenPort | PrivateKey | PublicKey | +|--|--|--|--|--|--|--|--| +| PointA | 10.10.10.1 | www.pointA.com | 222.222.222.222 | 10.10.11.1/32,192.168.200.0/24 | 13231 | `` | `ucwL8IWLNYrPHOu9qk70ZOagPgjJXhzvvkg7ZLooaj4=` | +| PointB | 10.10.11.1 | www.pointB.com | 111.111.111.111 | 10.10.10.1/32,192.168.100.0/24 | 13231 | `` | `FxNwKIFINspWh5pkoFpS5LzNKMDjkqcAV/Ypo2Ed8ys=` | + +Вам так будет проще ориентироваться в дальнейшем + +## Настройка WireGuard на Mikrotik + +Итак, у Вас есть WireGuard на Mikrotik, и теперь мы можем начать настройку. + +Прежде всего нам нужно создать интерфейс, чтобы получить публичный ключ или `Public Key`. Я ранее про него не писал умышленно, чтобы было проще понять принцип работы WireGuard. + +Но без публичного ключа установить соединение не получится. Он служит ключом шифрования и, можно сказать, паролем точки и для каждой точки он должен быть уникальным. При создании интерфейса он генерируется автоматически, так что Вам не нужно об этом переживать: + +![Создаем интерфейсы и копируем публичные ключи](https://habrastorage.org/r/w1560/getpro/habr/upload_files/e22/93a/b58/e2293ab586ed08adc7734ded260ea949.png " + +## Скрипт для быстрой настройки + +Далее я дам два варианта настройки простой и быстрый, и немного подольше. Для начала простой, которым пользуюсь сам. Вот скрипт который, я сделал для Вашего удобства: +``` +# EXAMPLE start +# Peer A params +# Name peerAname "PointA" +# Interaface Address peerAifAddress "10.10.10.1/24" +# AllowedIPs peerAallowed 10.10.11.1/32,192.168.200.0/24 +# EndPoint peerAendAddress "111.111.111.111" +# EndPort peerAendPort 13231 +# PublicKey peerAkey "ucwL8IWLNYrPHOu9qk70ZOagPgjJXhzvvkg7ZLooaj4=" +# Peer B params +# Name peerBname "PointB" +# Interaface peerBif "PointB" +# AllowedIPs peerBallowed 10.10.10.1/32,192.168.100.0/24 +# EndPoint peerBendAddress "222.222.222.222" +# EndPort 13231 +# PublicKey "FxNwKIFINspWh5pkoFpS5LzNKMDjkqcAV/Ypo2Ed8ys=" +# EXAMPLE end + +{ +# Peer A params +# SET PARAMS HERE +:local peerAname "PointA" +:local peerAifAddress "10.10.10.1/24" +:local peerAallowed 10.10.11.1/32,192.168.200.0/24 +:local peerAendAddress "111.111.111.111" +:local peerAendPort 13231 +:local peerAkey "ucwL8IWLNYrPHOu9qk70ZOagPgjJXhzvvkg7ZLooaj4=" +# Peer B params +:local peerBname "PointB" +:local peerBifAddress "10.10.11.1/24" +:local peerBallowed 10.10.10.1/32,192.168.100.0/24 +:local peerBendAddress "222.222.222.222" +:local peerBendPort 13231 +:local peerBkey "FxNwKIFINspWh5pkoFpS5LzNKMDjkqcAV/Ypo2Ed8ys=" +# start select +:local input do={:put $input;:return} +:local selectedPeer [$input "Enter current Peer A or B"] +:put "You select is $selectedPeer. Finished!" +# end select +{ +# start for A +:if ($selectedPeer = "A") do={ +# add address +/ip address +add address=$peerAifAddress interface=$peerAname comment=$peerAname +# add firewall rule +/ip firewall filter +add action=accept chain=input dst-port=$peerAendPort in-interface-list=WAN protocol=udp comment="WireGuard $peerAname" +# add peer +/interface/wireguard/peers +add allowed-address=$peerBallowed endpoint-address=$peerBendAddress endpoint-port=$peerBendPort interface=$peerAname public-key=$peerBkey persistent-keepalive=10 comment=$peerBname +# add route +/ip/route +:foreach peer in=$peerBallowed do={ +add dst-address=$peer gateway=$peerAname comment=$peerBname +} +} +# end for A +# start for B +:if ($selectedPeer = "B") do={ +# add address +/ip address +add address=$peerBifAddress interface=$peerBname comment=$peerBname +# add firewall rule +/ip firewall filter +add action=accept chain=input dst-port=$peerBendPort in-interface-list=WAN protocol=udp comment="WireGuard $peerBname" +# add peer +/interface/wireguard/peers +add allowed-address=$peerAallowed endpoint-address=$peerAendAddress endpoint-port=$peerAendPort interface=$peerBname public-key=$peerAkey persistent-keepalive=10 comment=$peerAname +# add route +/ip/route +:foreach peer in=$peerAallowed do={ +add dst-address=$peer gateway=$peerBname comment=$peerAname +} +} +# end for B +} +} +``` + +Его можно запускать прямо из терминала, либо из winbox открыв терминал. Так же вы можете добавить его в `System -> Scripts` и запустить из терминала, но так как это разовая процедура, не вижу в этом особого смысла. + +> Для начала внесите все необходимые параметры в строки переменных +`:local`, затем скопируйте и вставьте скрипт в терминал. Вам нужно будет только выбрать точку в которой вы находитесь `А` или `B`. Введите её и нажмите `Enter`. + +Так нужно будет повторить в каждой точке! + +Скрипт создаёт `address`, правило firewall для доступа из вне по списку `interface list` `WAN`. Список интерфейсов `WAN` создаётся по умолчанию. Если его нет, то добавьте. + +Далее, скрипт создаёт настройки точки `Peers` для подключения и добавляет все необходимые маршруты `Routes`, которые берёт из `Allowed Address` + +Ну или вы можете прописать всё руками по следующим скриншотам: + +![Создаём адрес и подсеть для нашего интерфейса](https://habrastorage.org/r/w1560/getpro/habr/upload_files/b6a/79c/890/b6a79c8907d945705ade7dd112fc5816.png) + +Создаём адрес и подсеть для нашего интерфейса + +![Создаём правило Firewall](https://habrastorage.org/r/w1560/getpro/habr/upload_files/776/c16/094/776c16094a52aa01d1b20ee7568ef440.png) + +Создаём правило Firewall + +![Прописываем маршруты](https://habrastorage.org/r/w1560/getpro/habr/upload_files/cb2/9d0/b13/cb29d0b1306b94391612fc9118770cdb.png "Прописываем маршруты") + +Прописываем маршруты + +![Добавляем точку к которой хотим подключится](https://habrastorage.org/r/w1560/getpro/habr/upload_files/291/636/634/291636634012a197fd5f611b026e9829.png) + +Добавляем точку к которой хотим подключится + +Надеюсь эта статья помогла кому-то быстро всё понять и настроить. Так как я на понимание, тесты и настройку потратил минимум один день, а то и больше. + +И в конце добавлю общую схему со всеми параметрами: + +![Общая схема работы и настройки WireGuard](https://habrastorage.org/r/w1560/getpro/habr/upload_files/7c0/a5c/cb8/7c0a5ccb8f649e9b51533b0ef75b1a1e.png) \ No newline at end of file diff --git a/docs/network/ubi/add-new-ap.md b/docs/network/ubi/add-new-ap.md new file mode 100755 index 0000000..e0051b8 --- /dev/null +++ b/docs/network/ubi/add-new-ap.md @@ -0,0 +1,9 @@ +Добавление на контроллер +Чтобы добавить точку на контроллер (1-3) или сменить контроллер нужно (3): + +1. зайти на точку по ssh +2. сбросить на заводские настройки `set-default` +3. привязать по новому адресу: `set-inform http://ip-server:8080/inform` + +!!! info + по умолчанию логин пароль: ubnt:ubnt \ No newline at end of file diff --git a/docs/network/ubi/failed-update.md b/docs/network/ubi/failed-update.md new file mode 100755 index 0000000..9f208cf --- /dev/null +++ b/docs/network/ubi/failed-update.md @@ -0,0 +1,19 @@ +# Проблема при обновлении из контроллера: Update – Failed update, error curl + +Зайти на точку по ssh + +Ввести `upgrade <ссылка_на_файл>` + +файл выкладывать на **http** сервер в корень + +пример: +!!! info "Пример" + Через консоль на точке: + ```bash + upgrade http://ip-server/BZ.ar7240.v4.0.15.9872.181229.0259.bin + upgrade http://ip-server/UAP-LR-v2.v4.0.15.9872.181229.0259.bin + ``` + через SCP: + ```bash + scp /var/www/unifi/fw/UAP-LR-v2.v4.0.80.10875.200111.2335/firmware.bin admin@10.118.13.250:/tmp/fwupdate.bin + ``` \ No newline at end of file diff --git a/docs/other/chrome.md b/docs/other/chrome.md new file mode 100755 index 0000000..80b5e19 --- /dev/null +++ b/docs/other/chrome.md @@ -0,0 +1,10 @@ +Google Chrome + +## Блокировка медиакнопок + +Одним словом, то пока можно только отключить. Но не весь браузер, а только упомянутую функцию поддержки мультимедийных кнопок в нем. Делается это путем отключения соответствующего «*флага*» (экспериментальной функции) в настройках Chrome. Для этого: + +1. открываем браузер в адресную строку копируем `chrome:flags/#hardware-media-key-handling` и жмем Enter +2. далее для функции Hardware Media Key Handling вместо значения «`Default`» устанавливаем «`Disabled` +3. перезапускаем Chrome, чтобы активировать изменение. + diff --git a/docs/other/cloudflare-cname.md b/docs/other/cloudflare-cname.md new file mode 100755 index 0000000..0a4b94c --- /dev/null +++ b/docs/other/cloudflare-cname.md @@ -0,0 +1,24 @@ +# Cоздание новой DNS-записи CNAME на Cloudflare + +---------- + +Я рекомендую получить собственное доменное имя, указывающее на IP-адрес вашего дома в глобальной сети. Частное доменное имя через reg.ru будет стоить 850 рублей в год. Есть несколько причин, почему я рекомендую это: + +- В моем тестировании я никогда не мог заставить некоторые контейнеры докеров работать в качестве подкаталога (даже на моем собственном частном доменном имени) за обратным прокси-сервером Traefik. В таких ситуациях вам останется создать несколько динамических субдоменов DNS, чтобы разместить все ваши службы. Большинство бесплатных динамических DNS-сервисов ограничивают количество субдоменов, которые вы можете создать. +- Afraid DNS не является одним из поддерживаемых поставщиков wildcard сертификатов. Хотя DuckDNS указан как поддерживаемый, он еще не тестировался. + +В моей настройке использую собственное доменное имя, все мои приложения в качестве отдельных хостов и Traefik 2.9 с сертификатами Wildcard. Мой провайдер DNS — Cloudflare, который [протестирован и подтвержден](https://doc.traefik.io/traefik/v1.7/configuration/acme/#wildcard-domains) для работы с подстановочными сертификатами Traefik Let’s Encrypt. Если у вас есть собственное доменное имя, а ваш провайдер DNS не указан в списке поддерживаемых, то я рекомендую перенести ваш DNS на Cloudflare, который удивительно быстр и бесплатен. + +В Cloudflare вы должны указать свой корневой домен (example.com) на свой IP-адрес WAN. Затем добавьте CNAME с подстановочным знаком (*.example.com) или отдельные субдомены, указывающие на ваш корневой домен (@ для хоста), как показано ниже (для этого не требуется платная учетная запись). + +[![Cloudflare Dns Entries](https://www.smarthomebeginner.com/images/2018/05/cloudflare-dns-records-screenshot-740x495.png "Traefik Tutorial: Traefik Reverse Proxy with LetsEncrypt for Docker Media Server 3")](https://www.smarthomebeginner.com/images/2018/05/cloudflare-dns-records-screenshot.png) + +Cloudflare Dns Entries For Traefik Dns Challenge + +In addition to creating the DNS records, you will have to adjust Cloudflares SSL settings to avoid indefinite redirects. Go to **Crypto** settings for the domain and change **SSL** to **Full** as shown below. + +[![Cloudflare &Quot;Full&Quot; Ssl](https://www.smarthomebeginner.com/images/2018/05/cloudflare-crypto-full-ssl-740x358.png "Traefik Tutorial: Traefik Reverse Proxy with LetsEncrypt for Docker Media Server 4")](https://www.smarthomebeginner.com/images/2018/05/cloudflare-crypto-full-ssl.png) + +Cloudflare “Full” Ssl + +Note that you may have to wait for a few minutes for the DNS entries to propagate. If you run Traefik before that, DNS challenge may fail and no SSL certificate will be generated. If you keep trying, [Let’s Encrypt may ban you temporarily](https://letsencrypt.org/docs/rate-limits/) for reaching the request limits. To counter this I have added a 5 min wait in the traefik configuration below but you may need longer. Until validation is complete, Traefik’s default certificate will be used and your browser will throw a warning. \ No newline at end of file diff --git a/docs/other/marvel.md b/docs/other/marvel.md new file mode 100755 index 0000000..7d2a654 --- /dev/null +++ b/docs/other/marvel.md @@ -0,0 +1,53 @@ +Оптимальный вариант просмотра (в порядке выхода) +I. «Сага Бесконечности» + +Первая фаза +1. «Железный человек» (2008) +2. «Невероятный Халк» (2008) +3. «Железный человек 2» (2010) +4. «Тор» (2011) +5. «Первый мститель» (2011) +6. «Мстители» (2012) + +Вторая фаза +7. «Железный человек 3» (2013) +8. «Тор 2: Царство тьмы» (2013) +9. «Первый мститель: Другая война» (2014) +10. «Стражи Галактики» (2014) +11. «Мстители: Эра Альтрона» (2015) +12. «Человек-муравей» (2015) + +Третья фаза +13. «Первый мститель: Противостояние» (2016) +14. «Доктор Стрэндж» (2016) +15. «Стражи Галактики. Часть 2» (2017) +16. «Человек-паук: Возвращение домой» (2017) +17. «Тор: Рагнарёк» (2017) +18. «Черная Пантера» (2018) +19. «Мстители: Война бесконечности» (2018) +20. «Человек-муравей и Оса» (2018) +21. «Капитан Марвел» (2019) +22. «Мстители: Финал» (2019) +23. «Человек-паук: Вдали от дома» (2019) + +«Сага Мультивселенной» +Четвертая фаза +24. «Ванда/Вижн» (2021), сериал +25. «Сокол и Зимний Солдат» (2021), сериал +26. «Локи», 1-й сезон (2021), сериал +27. «Черная Вдова» (2021) +28. «Что, если…?», 1-й сезон (2021), мультсериал +29. «Шан-Чи и легенда десяти колец» (2021) +30. «Вечные» (2021) +31. «Соколиный Глаз» (2021), сериал +32. «Человек-паук: Нет пути домой» (2021) +33. «Лунный рыцарь» (2022), сериал +34. «Доктор Стрэндж: В мультивселенной безумия» (2022) +35. «Мисс Марвел» (2022), сериал +36. «Тор: Любовь и гром» (2022) +37. «Я есть Грут» (2022), мини-мультсериал +38. «Женщина-Халк: Адвокат» (2022), сериал +39. «Ночной оборотень» (2022), спешел +40. «Черная Пантера: Ваканда навеки» (2022) +41. «Стражи Галактики: Праздничный спецвыпуск» (2022), спешел +42. «Человек-муравей и Оса: Квантомания» (2023) \ No newline at end of file diff --git a/docs/other/office/excel/index.md b/docs/other/office/excel/index.md new file mode 100755 index 0000000..e84b352 --- /dev/null +++ b/docs/other/office/excel/index.md @@ -0,0 +1,15 @@ +## Отключение обновления экрана +```vba +Application.ScreenUpdating = False +' в конце +Application.ScreenUpdating = True +``` + +## Список уникальных значений VBA + +```vba +PS = Range("A" & Rows.Count).End(xlUp).Row +Range("N6:N" & PS).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("T11"), Unique:=True +Range("T11:T300").Font.ColorIndex = 5 +MsgBox "Создали уникальный список источников" +``` \ No newline at end of file diff --git a/docs/other/office/excel/vba-align-comments.md b/docs/other/office/excel/vba-align-comments.md new file mode 100755 index 0000000..64d29b3 --- /dev/null +++ b/docs/other/office/excel/vba-align-comments.md @@ -0,0 +1,15 @@ +# Исправление примечаний VBA + +Бывает так, что ты вставляешь примечания и они уползают вниз при действиях со строками.  + +Чтобы такого не было, используй этот макрос: + +```vba +Sub align_comments() +Dim x As Comment +For Each x In ActiveSheet.Comments + x.Shape.Left = x.Parent.Offset(0, 1).Left + 10 + x.Shape.Top = x.Parent.Top +Next +End Sub +``` \ No newline at end of file diff --git a/docs/other/office/excel/vba-create-file.md b/docs/other/office/excel/vba-create-file.md new file mode 100755 index 0000000..adfa89e --- /dev/null +++ b/docs/other/office/excel/vba-create-file.md @@ -0,0 +1,12 @@ +# Создание файла VBA + +Простое + +```vba +iFullName = ThisWorkbook.Path & "name.xlsx" +``` +С именем из ячейки: + +```vba +iFullName = ThisWorkbook.Path & "\" & Range("A1").Value & ".xlsx" +``` \ No newline at end of file diff --git a/docs/other/office/excel/vba-open-file.md b/docs/other/office/excel/vba-open-file.md new file mode 100755 index 0000000..8470556 --- /dev/null +++ b/docs/other/office/excel/vba-open-file.md @@ -0,0 +1,39 @@ +# Открытие файла VBA + +## 1 файл +Для открытия 1 файла и передачи его на дальнейшую обработку, используй этот код: + +```vba +avFiles = Application.GetOpenFilename _ + ("Excel files(*.xls*),*.xls*", 1, "Выбери Excel файл", , False) +If VarType(avFiles) = vbBoolean Then + 'была нажата кнопка отмены - выход из процедуры + Exit Sub +End If + +Set avFiles1 = Workbooks.Open(Filename:=avFiles) +``` + +## Несколько файлов +Чтобы открыть много файлов и запустить обработку по ним, используем цикл: + +```vba +FilesToOpen = Application.GetOpenFilename _ + (FileFilter:="All files (*.*), *.*", _ + MultiSelect:=True, Title:="Files to Merge") + +If TypeName(FilesToOpen) = "Boolean" Then + MsgBox "Не выбрано ни одного файла!" + Exit Sub +End If + +'проходим по всем выбранным файлам +x = 1 +While x <= UBound(FilesToOpen) + With Workbooks.Open(FilesToOpen(x)).Sheets(1) + ... + ... + End With + x = x + 1 +Wend +``` \ No newline at end of file diff --git a/docs/other/office/excel/vba-progress-bar.md b/docs/other/office/excel/vba-progress-bar.md new file mode 100755 index 0000000..ebf9804 --- /dev/null +++ b/docs/other/office/excel/vba-progress-bar.md @@ -0,0 +1,83 @@ +# Прогресс бар VBA + +> Использование APPLICATION.STATUSBAR + +## Прогресс бар внизу страницы: +```vba +Application.StatusBar = "TEST" + DoEvents + ... +Application.StatusBar = False +``` + +## Прогресс бар для циклов: +```vba +For i = 1 To n + Istochnik = Cells(i, 20) + Application.StatusBar = "Делаю источник " & i & "-" & Istochnik & "/" & 50 & "" + DoEvents +Next +``` +## Можно сделать показ % завершения: + +![](../../../images/other/office/excel-vba-progress-bar-01.png) + +```vba +Sub ShowProgressBar() + Dim lAllCnt As Long, lr as Long + Dim rc As Range + 'кол-во ячеек в выделенной области + lAllCnt = Selection.Count + 'цикл по всем ячейкам в выделенной области + For Each rc In Selection + 'прибавляем 1 при каждом шаге + lr = lr + 1 + Application.StatusBar = "Выполнено: " & Int(100 * lr / lAllCnt) & "%" + DoEvents 'чтобы форма перерисовывалась + Next + 'сбрасываем значение статусной строки + Application.StatusBar = False +End Sub +``` +## Текст + блоки символов из 10 штук: + +![](../../../images/other/office/excel-vba-progress-bar-02.png) + +```vba +Sub StatusBar2() + Dim lr As Long, lp As Double + Dim lAllCnt As Long 'кол-во итераций + Dim s As String + lAllCnt = 10000 + For lr = 1 To lAllCnt + lp = lr \ 100 'десятая часть всего массива + 'формируем строку символов(от 1 до 10) + s = String(lp \ 10, ChrW(10152)) & String(11 - lp \ 10, ChrW(8700)) + Application.StatusBar = "Выполнено: " & lp & "% " & s: DoEvents + DoEvents + Next + 'очищаем статус-бар от значений после выполнения + Application.StatusBar = False +End Sub +``` + +## Текст + блоки квадратов из n штук: + +количество квадратов можно менять +![](../../../images/other/office/excel-vba-progress-bar-03.png) + +```vba +Sub StatusBar3() + Dim lr As Long + Dim lAllCnt As Long 'кол-во итераций + Const lMaxQuad As Long = 20 'сколько квадратов выводить + lAllCnt = 10000 + + For lr = 1 To lAllCnt + Application.StatusBar = "Выполнено: " & Int(100 * lr / lAllCnt) & "%" & String(CLng(lMaxQuad * lr / lAllCnt), ChrW(9632)) & String(lMaxQuad - CLng(lMaxQuad * lr / lAllCnt), ChrW(9633)) + DoEvents + Next + 'очищаем статус-бар от значений после выполнения + Application.StatusBar = False +End Sub +``` \ No newline at end of file diff --git a/docs/other/office/excel/vba-remove-pass.md b/docs/other/office/excel/vba-remove-pass.md new file mode 100755 index 0000000..776ed09 --- /dev/null +++ b/docs/other/office/excel/vba-remove-pass.md @@ -0,0 +1,186 @@ +# Удаление пароля VBA + +> Пожалуйста, сделайте резервную копию ваших файлов в первую очередь! +{.is-warning} + +## Для 32 битной версии +Откройте файл(ы), которые содержат ваши заблокированные проекты VBA +Создайте новый файл **xlsm** и сохраните этот код в `Module1` + +```vba +code credited to Siwtom (nick name), a Vietnamese developer + +Option Explicit + +Private Const PAGE_EXECUTE_READWRITE = &H40 + +Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _ + (Destination As Long, Source As Long, ByVal Length As Long) + +Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As Long, _ + ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long + +Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long + +Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, _ + ByVal lpProcName As String) As Long + +Private Declare Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As Long, _ + ByVal pTemplateName As Long, ByVal hWndParent As Long, _ + ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer + +Dim HookBytes(0 To 5) As Byte +Dim OriginBytes(0 To 5) As Byte +Dim pFunc As Long +Dim Flag As Boolean + +Private Function GetPtr(ByVal Value As Long) As Long + GetPtr = Value +End Function + +Public Sub RecoverBytes() + If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6 +End Sub + +Public Function Hook() As Boolean + Dim TmpBytes(0 To 5) As Byte + Dim p As Long + Dim OriginProtect As Long + + Hook = False + + pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA") + + + If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then + + MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6 + If TmpBytes(0) <> &H68 Then + + MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6 + + p = GetPtr(AddressOf MyDialogBoxParam) + + HookBytes(0) = &H68 + MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4 + HookBytes(5) = &HC3 + + MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6 + Flag = True + Hook = True + End If + End If +End Function + +Private Function MyDialogBoxParam(ByVal hInstance As Long, _ + ByVal pTemplateName As Long, ByVal hWndParent As Long, _ + ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer + If pTemplateName = 4070 Then + MyDialogBoxParam = 1 + Else + RecoverBytes + MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _ + hWndParent, lpDialogFunc, dwInitParam) + Hook + End If +End Function +``` +Вставьте этот код под вышеуказанным кодом в Module1 и запустите его +```vba +Sub unprotected() + If Hook Then + MsgBox "VBA Project is unprotected!", vbInformation, "*****" + End If +End Sub +``` +Возвращайтесь к своим проектам VBA и наслаждайтесь. + +## Для 64 битной версии: +Откройте файл (ы), содержащий ваши заблокированные проекты VBA. + +Создайте новый файл xlsm и сохраните этот код в `Module1` +```vba +Option Explicit + +Private Const PAGE_EXECUTE_READWRITE = &H40 + +Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _ +(Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr) + +Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, _ +ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr + +Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr + +Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, _ +ByVal lpProcName As String) As LongPtr + +Private Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LongPtr, _ +ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _ +ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer + +Dim HookBytes(0 To 5) As Byte +Dim OriginBytes(0 To 5) As Byte +Dim pFunc As LongPtr +Dim Flag As Boolean + +Private Function GetPtr(ByVal Value As LongPtr) As LongPtr + GetPtr = Value +End Function + +Public Sub RecoverBytes() + If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6 +End Sub + +Public Function Hook() As Boolean + Dim TmpBytes(0 To 5) As Byte + Dim p As LongPtr + Dim OriginProtect As LongPtr + + Hook = False + + pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA") + + + If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then + + MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6 + If TmpBytes(0) <> &H68 Then + + MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6 + + p = GetPtr(AddressOf MyDialogBoxParam) + + HookBytes(0) = &H68 + MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4 + HookBytes(5) = &HC3 + + MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6 + Flag = True + Hook = True + End If + End If +End Function + +Private Function MyDialogBoxParam(ByVal hInstance As LongPtr, _ +ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _ +ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer + + If pTemplateName = 4070 Then + MyDialogBoxParam = 1 + Else + RecoverBytes + MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _ + hWndParent, lpDialogFunc, dwInitParam) + Hook + End If +End Function +``` +Вставьте этот код в Module2 и запустите его +```vba +Sub unprotected() + If Hook Then + MsgBox "VBA Project is unprotected!", vbInformation, "*****" + End If +End Sub +``` \ No newline at end of file diff --git a/docs/other/office/excel/vba-security-page.md b/docs/other/office/excel/vba-security-page.md new file mode 100755 index 0000000..3df1bbb --- /dev/null +++ b/docs/other/office/excel/vba-security-page.md @@ -0,0 +1,34 @@ +# Защита страницы через VBA + +Каждый кто хоть раз писал макросы, сталкивался с тем, что требуется защитить лист и формулы на нем от шаловливых ручек пользователей. При том, нужно чтобы макросы на листе работали. Самое просто решение, это перед кодом макроса, добавить это: + +```vba +Worksheets("Лист1").Unprotect Password:="123" +'тут макрос делает действия +Worksheets("Лист1").Protect Password:="123" +``` + +Это будет работать, но у такого подхода есть и свои минусы. Во-первых, нужно эту конструкцию размещать в каждом макросе. Во-вторых - если будет ошибка, лист останется без защиты. + +## Есть другой способ + +Нажмите `Alt+F11`, чтобы попасть в редактор Visual Basic. Затем в левом верхнем углу в окне Project Explorer (если его не видно, то нажмите Ctrl+R) модуль ЭтаКнига (ThisWorkbook) и откройте двойным щелчком: + +![](../../../images/other/office/excel_vba_01.png){ loading=lazy } + + +Вставьте этот код: + +```vba +Private Sub Workbook_Open() + 'включаем защиту первого листа для пользователя, но не макроса + Worksheets("Лист1").Protect Password:="123", UserInterfaceOnly:=True + + 'второй лист защищаем аналогично, но с возможностью пользоваться группировкой + Worksheets("Лист2").EnableOutlining = True + Worksheets("Лист2").Protect Password:="555", UserInterfaceOnly:=True +End Sub +``` + +Данный код будет автоматически запускаться при открытии файла и ставить защиту на заданные листы. Параметр `UserInterfaceOnly` указывает Excel, что защита не должна работать для действий макроса, а только на операции юзера. +Второй параметр `EnableOutlining` разрешает пользоваться группировкой. diff --git a/docs/other/office/excel/vba-send-email.md b/docs/other/office/excel/vba-send-email.md new file mode 100755 index 0000000..2d733df --- /dev/null +++ b/docs/other/office/excel/vba-send-email.md @@ -0,0 +1,32 @@ +# Отправка почты VBA + +отправляет почту, используя для этого запущенный MS Outlook + +```vba +' Запрос ввода темы письма + Dim vRetVal + vRetVal = InputBox("Введи тему письма", "Тема", "Test") + ActiveSheet.Range("I3").Value = vRetVal + + Dim OutApp As Object + Dim OutMail As Object + Dim cell As Range + + Send_ist = Cells(1, 1) + + Application.ScreenUpdating = False + Set OutApp = CreateObject("Outlook.Application") + OutApp.Session.Logon + Set OutMail = OutApp.CreateItem(0) + On Error Resume Next + With OutMail + .To = Send_ist + .Body = "Заполнить в день получения и отправить обратно на your_email" + .Subject = Range("A1").Value + .Attachments.Add iFullName + .Send + End With + + On Error GoTo 0 + Set OutMail = Nothing +``` \ No newline at end of file diff --git a/docs/other/phone/grandstream/example-config.md b/docs/other/phone/grandstream/example-config.md new file mode 100755 index 0000000..953e59a --- /dev/null +++ b/docs/other/phone/grandstream/example-config.md @@ -0,0 +1,504 @@ +Скачать [пример](https://disk.yandex.ru/d/UJJK2Ttm1amJmg) + +??? example + ```xml + + + + 000b82dc084a + + + + + + + + 1 + + + 111 + + + ast1.domain.com + + + 111 + + + 111 + + + pass + + + 111 + + + + + + + + 0 + + + + + + + 0 + ast1.domain.com + + + dc.domain.com + + + + + + + + + + + + + + + TZS-5 + + + + + + + 9xx[1-3]xx + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 60 + + + + + + + ru + + + 2 + + PassW0RD + + 1 + 120 + + + 1 + + + 0 + + ast1.domain.com/0415 + + + + 1 + + 2 + + + + + + + + 0 + 0 + 60 + 0 + 0 + 1 + 0 + 0 + { x+ | *x+ | *xx*x+ } + 0 + 1 + 0 + 1 + 127 + 0 + 0 + 0 + 1 + 0 + 1 + 6 + 0 + 2 + f1=350,f2=440; + 0 + 0 + 1 + 0 + 0 + 3 + 0 + 0 + 0 + 127 + 0 + 0 + 0 + 97 + 0 + 0 + 1 + 0 + 97 + 0 + 168 + 0 + 0 + 0 + 160 + 0 + 0 + 0 + 255 + 255 + 0 + 80 + 0 + 0 + 0 + 0 + 0 + 0 + 389 + 0 + 0 + 1440 + 0 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + f1=350,f2=440; + 0 + 0 + 0 + 0 + f1=350,f2=440,c=10/10; + 1 + 0 + f1=440,f2=480,c=200/400; + 0 + f1=440,f2=480,c=200/400; + 0 + f1=440,f2=440,c=25/525; + 0 + 0 + 0 + f1=480,f2=620,c=50/50; + 0 + 0 + f1=480,f2=620,c=25/25; + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 192 + 0 + 4 + 0 + 0 + 0 + 0 + 30 + 0 + 0 + 0 + 0 + 50 + 30 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + XML Service + 127 + 1 + 0 + 0 + 0 + 100 + 0 + 0 + 0 + 0 + 0 + 0 + 30 + 127 + 0 + 1 + 0 + 60 + 0 + 2 + 12 + 5004 + 1 + 30 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 1 + 1500 + 0 + MTZ+6MDT+5,M4.1.0,M11.1.0 + 1 + 0 + 1 + 0 + 5060 + 0 + 0 + 5 + 0 + 0 + 2 + 1 + 1 + 1 + 1 + 0 + 400 + 0 + 0 + 0 + 0 + 1 + 0 + 127 + 2 + 0 + 0 + 1 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1194 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 20 + 0 + 0 + 20 + 1 + 0 + 0 + 0 + 8 + 0 + 4 + 0 + 0 + Forward + 0 + 0 + 1 + 0 + 0 + 180 + 90 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 0 + 1 + 0 + 18 + 1 + 1 + 9 + 1 + 80 + 0 + 98 + 200 + 443 + 30 + 0 + 3 + Grandstream GXP1615 + 0 + 0 + 0 + 0 + 10 + 15 + 1 + 20 + 0 + 0 + 26 + 300 + 0 + 46 + 200 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 127 + 0 + 1 + 0 + 162 + 0 + 0 + 0 + 0 + 0 + 101 + 0 + 0 + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 1 + 86400 + 0 + 0 + 0 + 1 + 20 + 0 + 0 + 4 + 0 + 0 + 0 + 0 + 0 + 1 + 50 + 0 + 0 + + + ``` \ No newline at end of file diff --git a/docs/other/phone/grandstream/provisioning.md b/docs/other/phone/grandstream/provisioning.md new file mode 100755 index 0000000..4bc3542 --- /dev/null +++ b/docs/other/phone/grandstream/provisioning.md @@ -0,0 +1,111 @@ +# Настройка телефонов через TFTP сервер + +Опустим настройку самого TFTP сервера, в сети много есть информации по этому вопросу. + +## Правка начального шаблона + +Для начала, нам потребуется получить файл шаблона и немного его отредактировать. + +Скачать можно c [облака](https://disk.yandex.ru/d/UJJK2Ttm1amJmg). + +| **Параметры** | **Описание** | +| --- | --- | +| P47 | адрес сервера Астериск | +| P34 | пароль авторизации | +| P237 | сервер и папка, откуда берется конфиг | +| P30 | ntp сервер для синхронизации времени | +| P64 | часовой пояс | +| P2 | пароль на админку | +| P192 | сервер и папка, откуда берется обновление прошивки | + +сохраняем файл. + +## Заполнение файла с настройками + +Чтобы не вводить номера телефонов в каждый файл, существует возможность по созданию файла с настройками. + +Скачать файл можно [тут](https://disk.yandex.ru/d/S7XKjHypTigfyg). В файле заполняем: + +| Параметр | Значение | +| --- | --- | +| `MAC` | MAC адрес | +| `User_ID_1` | номер | +| `Password_1` | пароль | +| `Auth_ID_1` | номер | +| `SIP_Name_1` | номер | + +Файл сохраняем в формате `scv`, разделители **запятые**. Он нам потребуется дальше. + +## Создание конфиг файлов + +Для создания конфиг файлов используется программа [GSXmlGenerator_3.5](https://disk.yandex.ru/d/I3HvTLTLXHv4sA) + +![](../../../images/other/phone/grandstream_01.png) + +Запускаем программу, в ней: + +| Параметр | Значение | +| --- | --- | +| Configuration Template | путь где находится шаблон | +| Output Path | путь до папки, куда будут сохраняться готовые файлы | +| Use CSV File | путь до файла csv с настройками | + +После нажимаем на **Run with CSV as Input** + +## Папка на tftp сервере + +Создадим папку на tftp сервере, откуда телефон будет брать конфиг файл. + +К примеру это будет папка `test`. Далее в папку следует закачать: + +- файл прошивки +- 3 файла звонков (не обязательно) +- файлы конфигов + +Файлы можно взять по [ссылке](https://disk.yandex.ru/d/4eji_swJJdshNQ) + +В итоге получится такое содержание папки: + +![](../../../images/other/phone/grandstream_02.png) + +## Настройка на телефоне + +Есть 2 способа настройки - ручной и автоматический + +=== "Автоматический" + + Способ через конфигурирование DHCP и прописывание 66 опции. + + Открываем оснастку DHCP сервера и идем в параметры сервера. Далее ПКМ на центральной части - Настроить параметры: + + ![](../../../images/other/phone/grandstream_03.png) + + Ищем 066 параметр: 066 Имя узла сервера загрузки и прописываем путь до папки с конфигами: + + ![](../../../images/other/phone/grandstream_04.png) + + Нажимаем ОК. + + Теперь при включении телефона, телефон сам получит настройки подключения и сам обновит firmware + +=== "Ручной" + + Включаем телефон и заходим на web-страницу администрирования: + + Стандартный логин/пароль - `admin`/`admin` + + Далее переходим на вкладку **Maintenance** и выбираем в выпадающем списке **Upgrade and Provisioning**: + + ![](../../../images/other/phone/grandstream_05.png) + + На открывшейся странице ищем раздел **Config**. Выбираем метод скачивание через tftp и указываем путь до нашего сервера. + + Внизу нажимаем **Save and Apply**. + + ![](../../../images/other/phone/grandstream_06.png) + + После сохранения вверху **Reboot** + + ![](../../../images/other/phone/grandstream_07.png) + + После перезагрузки, телефон сам скачает обновление с сервера. \ No newline at end of file diff --git a/docs/other/phone/ipecs-mg/books.md b/docs/other/phone/ipecs-mg/books.md new file mode 100755 index 0000000..202314f --- /dev/null +++ b/docs/other/phone/ipecs-mg/books.md @@ -0,0 +1,2 @@ +- [Администрирование АТС](https://kaskadkm.ru/tel_s/instr/iPECS-MG_RU_v1.7.pdf) +- [Web-администрирование](https://deace.by/files/lg/mg/RU_Web.pdf) \ No newline at end of file diff --git a/docs/other/phone/ipecs-mg/general.md b/docs/other/phone/ipecs-mg/general.md new file mode 100755 index 0000000..d0b4aec --- /dev/null +++ b/docs/other/phone/ipecs-mg/general.md @@ -0,0 +1,41 @@ +## Поменять местами номера + +в PGM112 ищем номера и меняем + +## Настройка IP телефона + +PGM 106 и вводим MAC адрес, номер телефона (ID) + +PGM 112 ищем IP телефон с заданным IP адресом и назначаем номер + +## Настройка цепочки входящего звонка + +PGM 200, смотри группу, + +PGM 201-202. ⇒ PGM202 (Forward Destination) указываем номер куда перенаправлять + +## Международная связь + +PGM 137 +- 1 - все открыто +- 2 - закрыто + +## Добавление в группу на входящий звонок + +PGM 200, смотри группу + +## Настройка аналоговых линий + +PGM 167 - 1 порт = 1 линия + +## Настройка цифровых линий и маски набора + +PGM 251-252 + +## Блокировка номера + +PGM 262 + +## Настройка исходящего номера + +PGM131-135 c указанием номера \ No newline at end of file diff --git a/docs/other/phone/ipecs-mg/voice.md b/docs/other/phone/ipecs-mg/voice.md new file mode 100755 index 0000000..3754466 --- /dev/null +++ b/docs/other/phone/ipecs-mg/voice.md @@ -0,0 +1,36 @@ +Иногда требуется сделать так, чтобы текущее голосовое приветствие было погромче, или нужно его изменить. Чтобы это сделать, открываем веб консоль станции, идем в `S/W Upgrade` ⇒ `AAFU Upload/Download` + +Там выбираем `Individual SysGreeting Download` - это список всех голосовых приветсвий и сообщений, записанных в память АТС. + +Далее 2 варинта: + +1. Создать свое +2. Отредактировать текущее + +## Отредактировать текущее + +Скачиваем программу [Audacity](https://www.audacityteam.org/download/) , открываем файл, скачанный с АТС и ползунком делаем громче. Тут же можно и проверить: + +![](../../../images/other/phone/ipecs01.png) + +далее сохраняем: + +![](../../../images/other/phone/ipecs02.png) + +В окне сохранения ничего не меняем и сохраняем. + +Теперь нужно конвертировать в формат АТС - `G.711 A-law wave` + +[Скачиваем ПО](https://cloud.st1t.ru/s/dm5gYGP6f57t8Ex). В нем открываем наш файл. Далее: + +![](../../../images/other/phone/ipecs03.png) + +![](../../../images/other/phone/ipecs04.png) + +![](../../../images/other/phone/ipecs05.png) + +Готовый файл загружаем на АТС, выбирая `Individual SysGreeting Upload` + +Чтобы применить измененное приветствие, идем в `GM259`, вводим номер таблицы (1) и в поле `Announcement No` ставим номер загруженного файла. Нажимаем сохранить и проверяем: + +![](../../../images/other/phone/ipecs06.png) \ No newline at end of file diff --git a/docs/other/prometheus-grafana.md b/docs/other/prometheus-grafana.md new file mode 100755 index 0000000..4b8d999 --- /dev/null +++ b/docs/other/prometheus-grafana.md @@ -0,0 +1,267 @@ +# Как запустить Prometheus и Grafana используя Docker Compose + +---------- + +Docker Compose используется для запуска нескольких контейнеров как одной службы. Если у вас есть приложение/стек, требующий разных служб, docker compose позволяет создать один файл, который запустит все контейнеры как одну службу и избавит вас от необходимости запускать их по отдельности. Также можно запускать по одной службе за раз с помощью docker compose. Сегодня мы рассмотрим, как запустить Prometheus и Grafana с помощью docker compose. + +Чтобы иметь возможность использовать Docker Compose, в вашей системе должны быть установлены как Docker, так и Docker Compose. + +Prometheus — это база данных временных рядов, использующая экспортеры для мониторинга различных серверов/сервисов, а 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) + +nano ~/prometheus-grafana/prometheus/prometheus.yml + +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 , вы сможете увидеть статус своих целей, как показано ниже **_:_** + +![](https://techviewleo.com/wp-content/uploads/2021/03/How-to-run-prometheus-and-grafana-with-docker-compose.png?ezimgfmt=rs:640x143/rscb7/ng:webp/ngcb7) + +Для Grafana зайдите `http://serverip_or_hostname:3000`и войдите в систему, используя имя пользователя и пароль, указанные в `.ini` файле конфигурации. Учетные данные по умолчанию: _admin:admin_ + +![](https://techviewleo.com/wp-content/uploads/2021/03/How-to-run-prometheus-and-grafana-with-docker-compose-1.png?ezimgfmt=rs:640x214/rscb7/ng:webp/ngcb7) + +Теперь вы можете продолжить и создать информационную панель для мониторинга. Одна вещь, которую я отметил, заключается в том, что я не мог получить метрики для использования при создании графиков, когда «доступ» в разделе «HTTP» источников данных был установлен на «сервер». Мне пришлось установить его как «браузер», как показано ниже: + +![](https://techviewleo.com/wp-content/uploads/2021/03/How-to-run-prometheus-and-grafana-with-docker-compose-4.png?ezimgfmt=rs:640x326/rscb7/ng:webp/ngcb7) \ No newline at end of file diff --git a/docs/other/synology/install-hpe-ms-gen10.md b/docs/other/synology/install-hpe-ms-gen10.md new file mode 100755 index 0000000..8083050 --- /dev/null +++ b/docs/other/synology/install-hpe-ms-gen10.md @@ -0,0 +1,141 @@ +## Требования +- Бекапим все, что раньше было на жестких дисках, так как в процессе установки все будет стерто и отформатировано. +- USB флешка что будет выступать в роли загрузчика, должна быть более 2 Гб +- Монитор и клава с мышкой для отладки возможных проблем +- Сам Microserver должен быть в той же сети, что и ПК с которого проводим настройку + +## Загрузочная флешка + +Начальная стадия установки DSM, это создание загрузочной флешки. Путем тестов, нашел стабильную версию загрузчика - **v1.02b**, под **ds3615** + +Версии собраны тут: https://mega.nz/folder/yQpw0YTI#DQqIzUCG2RbBtQ6YieScWg/folder/iJZjAJoa + +Скачав нужный загрузчик, нужно его отредактировать под себя и записать на флешку. + +Нам потребуется любая флешка от 2 Гб и установленные программы: + +1. OSFMount - небольшая бесплатная утилита, которая позволяет монтировать ранее сделанные образы дисков и представлять их в виде виртуальных приводов. Необходима для монтирования и последующей редакции образа загрузчика. + [https://www.osforensics.com/tools/mount-disk-images.html](https://www.osforensics.com/tools/mount-disk-images.html) +2. Notepad++ - свободный текстовый редактор с открытым исходным кодом для Windows. Необходима для редактирования **grub.cfg** + [https://notepad-plus-plus.org/](https://notepad-plus-plus.org/) +3. Rufus - это утилита, которая помогает форматировать и создавать загрузочные Flash. Необходима для записи загрузчика. + [https://rufus.ie/](https://rufus.ie/) + +Данные программы, кроме OSFMount, могут быть и другими, в зависимости от вашего предпочтения. + +Открываем скачанный необходимый загрузчик в программе OSFMount, монтируем образ. + +![](../../images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-1.webp) + +Открываем ранее скачанный образ загрузчика + +![](../../images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-2.webp) + +Выбираем необходимый нам раздел. В нём находится нужный нам для редакции файл **grub.cfg** + +![](../../images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-3.webp) + +Обязательно снимаем галочку с опции: read only - только для чтения. Монтируем образ и открываем необходимый нам файл **grub.cfg** + +![](../../images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-4.webp) + +Редактируем в Notepad++ + +![](../../images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-5.webp) + +![](../../images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-7.webp) + +Редактируем значения: + +- `set vid=0x`(Ваш vid - обязательно) +- `set pid=0x`(Ваш pid - обязательно) + +!!! info + К вопросу о значении "0x" (мнения разнятся)..... + Загрузчик имеет исходный формат (0xabcd). Значение 0x говорит что это шестнадцатеричный код. + Если VID и PID вашей флешки состоит из цифр (1234), то без значения "0x" загрузчик работает , если имеются буквы (12АБ), то без значения "0x" может не сработать. + Потому лучше прописывайте VID и PID как в исходнике: "0xВаши данные" + +!!! info "Где узнать vid и pid флешки" + + Получить vid и pid не сложно. Нужно воспользоваться одной из программ. + + [http://flashboot.ru/files/vidpid/](http://flashboot.ru/files/vidpid/) + [https://www.antspec.com/usbflashinfo/](https://www.antspec.com/usbflashinfo/) + [https://www.usbdev.ru/files/usbflashinfo/](https://www.usbdev.ru/files/usbflashinfo/) + [https://www.synology.com/ru-ru/knowledgebase/DSM/tutorial/Compatibility_Peripherals/How_do_I_check_the_PID_VID_of_my_USB_device](https://www.synology.com/ru-ru/knowledgebase/DSM/tutorial/Compatibility_Peripherals/How_do_I_check_the_PID_VID_of_my_USB_device) + +- `set sn=Ваш серийник` +- `set mac1=Ваш mac1` +- `set mac1=Ваш mac2,3,4` (если сетевая карта имеет больше одного порта) + +Значения **set sn** и **set mac** можно оставить по дефолту, если вам не нужны такие функции, как транскодинг, Push уведомления и QuickConnect. + +Можно вставить сгенерированный серийный номер из генератора: https://xpenogen.github.io/serial_generator/index.html + +Так же, необязательно, но лучше отредактировать значение: + +- `set timeout='1'` - изменить значение "1" на другое, скажем на 5 или больше. + +Это значение отвечает на время видимости начального загрузчика из трёх пунктов. Многие не успевают прочесть то, что там написано. +Изменение этого значения даст возможность увеличить время отображения начальной страницы + +Отредактировав под себя **grub.cfg** , сохраняем его и размонтируем образ + +![](../../images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-8.webp) + +## Запись на флешку + +Теперь можно записать загрузчик на флешку + +Открываем , выбираем наш, уже правленый образ загрузчика и записываем на флешку. На скриншоте ниже, указано что выбрать. + +![](../../images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-11.webp) + +Ну вот и всё, загрузочная флешка готова. Можно начинать установку DSM + +Из личного опыта.. Всегда сохраняйте свой, правленый образ загрузчика. Всякое может случиться и всегда полезно иметь уже готовый для записи образ. + +## Установка Xpenology + +Вставляем флешку с записанным загрузчиком во внутренний порт нашего Microserver gen10. Нужно подключить монитор, в UEFI отключить загрузку со всего, кроме нашей флешки. + +После запустится установка. На мониторе будет "Happy Hacking" - Счастливый взлом. То есть всё хорошо. + +![](../../images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-15.webp) + +Далее, запускаем Synology Assistant для поиска своего сервера. Скачать можно по ссылке: https://archive.synology.com/download/Utility/Assistant/6.2-24922 + +![](../../images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-16.webp) + +Нашли свой сервер, вошли по ip и запускаете дальнейшую установку. Нажимаем на кнопку **Установить**. Далее на **Установить вручную** + +!!! warning "Важно" + Выбирать только **Установка вручную**, иначе скачается последний образ и не запустится. + +Необходимо указать файл с ОС DSM. Нужную нам версию можно скачать по ссылке: https://global.download.synology.com/download/DSM/release/6.2.1/23824/DSM_DS918%2B_23824.pat +![](../../images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-19.webp) + +Соглашаемся, что данные на дисках будут удалены. + +![](../../images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-21.webp) + +Установка долгая, может занять до 20 минут. + +После того, как Xpenology установится, нужно будет создать учётную запись +Создаём учётную запись +![](../../images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-26.webp) + +Предложение по созданию Synology QuickConnect'а отметаем, так как для его работы необходима Реальная Валидная пара. Снизу будет едва заметная кнопка. + +Готово +![](../../images/other/synology/install-synology-xpenology-on-hpe-microserver-gen10-amd-29.webp) + +Дальнейшая настройка не сложная. + +!!! danger + В Панели управления, DSM будет предлагать обновить версию до 6.2.4. Ни в коем случае не обновляемся. Загрузчика на эту версии НЕТ. + +Настройку разделов провести в File Station, ничего сложного там нет, мастер проведет по всем шагам. + +После настроек, советую открыть так называемый ROOT доступ: [https://www.synology.com/ru-ru/knowledgebase/DSM/tutorial/General_Setup/How_to_login_to_DSM_with_root_permission_via_SSH_Telnet](https://www.synology.com/ru-ru/knowledgebase/DSM/tutorial/General_Setup/How_to_login_to_DSM_with_root_permission_via_SSH_Telnet) \ No newline at end of file diff --git a/docs/other/tsd/config-ce7.md b/docs/other/tsd/config-ce7.md new file mode 100755 index 0000000..566aeb1 --- /dev/null +++ b/docs/other/tsd/config-ce7.md @@ -0,0 +1,33 @@ +Теперь нам нужно установить необходимые программы на ТСД. Для этого вставляем ТСД в кредл, устанавливаем на ПК набор программ для работы кредла (папка `\1.Soft\Lync\`) ждем пока ТСД определится. После того, как ТСД в кредле определился, он стал доступен в ПК и на него можно удаленно зайти для просмотра файлов. + +Копируем все файлы из папки `\2.Заливка ТСД\9200CE7\after Update\` в папку на ТСД **Application**, подтверждаем замену. + +Выполняем импорт настроек, чтобы ТСД не засыпал и не просил калибровку после перезагрузки. Запускаем из папки **Application** поочередно файлы: `9190_NoCalibration+RadioOn.reg` и `NoSleepCE.reg`, соглашаемся со всем. + +Для настройки энергопотребления терминала необходимо на ТСД зайти в настройки, выбрать **Backlight**. + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_3.png) + +На вкладке **Battery Power** убрать галочку со строчки **Disable backlight if device is not used for**. + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_4.png) + +Перейти на вкладку **External Power** и так же убрать галочку со строки **Disable backlight if device is not used for**. + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_5.png) + +Перейти на вкладку **Brightness** и выставить ползунок на двоечку. + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_6.png) + +Затем возвращаемся в меню настроек и выбираем пункт **Power**. + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_7.png) + +Здесь, во вкладке **Advanced**, ставим галочки на обоих пунктах и выбираем 5 минут из раскрывающегося списка. + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_8.png) + +Переходим на вкладку **CPU Power**, выбираем **Max Perfomance**, и нажимаем кнопку **Apply**. + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_9.png) \ No newline at end of file diff --git a/docs/other/tsd/config-telnetce.md b/docs/other/tsd/config-telnetce.md new file mode 100755 index 0000000..31bf087 --- /dev/null +++ b/docs/other/tsd/config-telnetce.md @@ -0,0 +1,37 @@ +Теперь надо настроить **TelnetCE**, для этого на ПК куда подключен кредл, устанавливаем ПО из папки `\1.Soft\Wavelink\` . Нам нужен файл **MC 9200 CE 7.0** + +Желательно ставить его и все другие программы в разные папки. Для примера `C:\Wavelink\mc9200_ce7\` + +После установки запускаем программу. Выйдет окно + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_24.png) + +## Host Profile +Для начала нам требуется настроить **Host Profile**. Нажимаем на кнопку **Host Profile** и открывается новое окно. Если в нем пусто, то нужно импортировать профиль. Если есть другие профили, то их удаляем (кроме случаем работы с несколькими профилями на ТСД). Далее закрываем окно и снизу нажимаем на кнопку **Import/Export Settings**: + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_25.png) + +При нажатии выйдет сообщение о том, что мы хотим сделать. Выбираем **import** и нажимаем ОК. Путь к файлу с конфигом: `\4.OHE\OHI_eburg.wltna` + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_26.png) + +Для проверки настроек, заходим в **Host Profile**, название должно быть **OHI_WMS**, должны быть прописаны ваш адрес сервера протокол и порт. Остальное оставляем по умолчанию. + +## Улучшение профиля + +Заходим в **Emulation Parameters** и отрываем заранее сохраненный файл. Путь к файлу – `4.OHE\termcfg_my.bin`. После нажимаем на значок дискеты – **Save** + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_27.png) + +Краткое описание параметров, которые настроены в файле: + + +| Группа | Раздел | Параметр | Значение | Описание | +|--|--|--|--|--| +| Emulation | Common | Key Macros | из файла по пути \4.OHE\Функциональные клавиши (F) | Макросы для работы функц. клавиш. Напр F1-F10 | +| Emulation | Display | Force black & white | Yes | Установка белого фона | +| Emulation | Display | Hide horizontal Scroll bar | Yes | Скрываем горизонтальную полосу прокрутки | +| Emulation | Display | Hide vertical scroll bar | Yes | Скрываем вертикальную полосу прокрутки | +| Emulation | Display | Hide menu | Yes | Скрываем системное меню | +| Emulation | Display | Menu toogle key | hex сочетание клавиш | Cочетание клавиш для вывода меню программы | +| Emulation | Display | Start Menu | Hide start menu | Скрывать меню Telnet | \ No newline at end of file diff --git a/docs/other/tsd/config-wifi.md b/docs/other/tsd/config-wifi.md new file mode 100755 index 0000000..7aa5e1b --- /dev/null +++ b/docs/other/tsd/config-wifi.md @@ -0,0 +1,63 @@ +Запускаем из папки **Application** файл обновления модуля Wi-Fi с помощью файла `FUSION_X_2.03.0.0.027R_MPA3_CE70`. Соглашаемся с путем установки и жмем ОК. После ТСД перезагрузится. + +Для начальной настройки Wi-Fi подключения, нажимаем на значок в системном трее и выбираем **Manage Profile**: + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_10.png)![](../../images/other/tsd/flashing-tsd-mc9200-ce7_11.png) + +Видим соединение **101**, выбираем его и удаляем. + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_13.png) + +!!! tip "ВАЖНО!!!" + Обязательно удаляем соединение 101 и создаём новое. Ни в коем случае не надо его редактировать, или оставлять вторым соединением. + +Нажимаем стилусом на пустом окне и выбираем в меню **Add**. + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_12.jpg) + +Название нового соединения ставим **105**. Далее буду приводить только те окна в который необходимо что-либо изменить. + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_14.png) + +В этом окне **Security mode** меняем на **WPA2–Personal** и жмём Next. + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_15.png) +В следующем окне оставляем **AES/TKIP** выбираем **pass-phrase**, нажимаем next + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_16.png) + +Вводим пароль доступа к сети Wi-Fi и нажимаем next. + +Снимаем все галочки и нажимаем next. + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_17.png) + +В следующем окне прописать статический IP- адрес, ввести маску, ввести шлюз, нажать некст + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_18.png) + +**Battery Usage** выбираем – **CAM** и нажимаем next. + +На этом настройка соединения закончена. Выбираем созданное соединение и нажимаем коннект. + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_19.png) + +После первого присоединения к сети выскочит уведомление: + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_20.jpg) + +Выбираем **The internet** и нажимаем **Connect**. + +Теперь необходимо сохранить настройки соединения в конфиг. Для этого вызываем меню соединения и выбираем **Options**. + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_21.png) + +В открывшемся окне выбираем **Export**. + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_22.png) + +Ставим 1 2 3 4 и 6 галочки и нажимаем **Export to file**. В открывшемся окне нажимаем ОК. + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_23.png) + +На этом настройка Wi-Fi завершена \ No newline at end of file diff --git a/docs/other/tsd/index.md b/docs/other/tsd/index.md new file mode 100755 index 0000000..4bf095b --- /dev/null +++ b/docs/other/tsd/index.md @@ -0,0 +1,9 @@ +# Прошивка ТСД MC9200 на CE7.0 + TelnetCE +Весь процесс по перепрошивку ТСД можно разделить на 5 этапов: + + 1. Переустановка ОС + 2. Настройка ТСД + 3. Настройка Wi-Fi + 4. Настройка TelnetCE + 5. Установка TelnetCE + diff --git a/docs/other/tsd/install-telnetce.md b/docs/other/tsd/install-telnetce.md new file mode 100755 index 0000000..b0152b3 --- /dev/null +++ b/docs/other/tsd/install-telnetce.md @@ -0,0 +1,15 @@ +Для правильной установки, требуется удалить все текущие версии на ТСД, для этого идем в настройки и запускаем **Remove Program** + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_28.png) + +Удаляем **TelnetCE**, если он там есть. + +Далее идем в **File Explorer** и удаляем из всех мест **Wavelink**: `\Application\wavelink` и `program files\wavelink` + +Переходим в окно программы **Wavelink product configuration**. Нажимаем кнопку **Application Only** и ждем установки. + +После завершения установки, устанавливаем подготовленный конфиг в терминал. Используем для этого кнопку внизу окна – **Config Only** + +## **Тюнинг ТСД** + +Нам нужно, чтобы при перезагрузке запускался TelnetCE, для этого ярлык с рабочего стола копируем в папку `Application\Startup` \ No newline at end of file diff --git a/docs/other/tsd/reinstall-ce7.md b/docs/other/tsd/reinstall-ce7.md new file mode 100755 index 0000000..931ff14 --- /dev/null +++ b/docs/other/tsd/reinstall-ce7.md @@ -0,0 +1,18 @@ +# Переустановка ОС + +Для того, чтобы перезалить проблемный ТСД, работающий на **Windows CE 7.0**, требуется скачать файлы: из [шары](https://disk.yandex.ru/d/YiTDTxSRqo1ddQ) по пути: `\2.Заливка ТСД\9200CE7\OSUpdate` + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_1.png) + +Папку **OSUpdate** скопировать на microSD карту, объемом не более 16 Гб и вставить в слот. Слот находится под клавиатурой. Как снять клавиатуру описано [здесь.](https://wiki.st1t.ru/ru/Hardware/TSD/Motorola/TSD-Motorola-repair-keyboard) + +После этого, заходим в терминал, запускаем **File Explorer,** переходим на карту памяти в папку **OSUpdate** и запускаем файл `92N0c70Ben_SD`. Запустится процесс обновления файлов. + +![](../../images/other/tsd/flashing-tsd-mc9200-ce7_2.png) + +Вставляем ТСД в кредл или подключаем зарядку и ждем 3-7 минут. Столько занимает перезаливка. + +!!! warning + Обязательно подключаем зарядку или вставляем в крэдл. Если во время прошивки сядет АКБ, с большим шансом ТСД превратится в кирпич + +После того, как ТСД перепрошился, он попросит выполнить стартовую калибровку. \ No newline at end of file diff --git a/docs/proxmox/ct-template.md b/docs/proxmox/ct-template.md new file mode 100755 index 0000000..4943b01 --- /dev/null +++ b/docs/proxmox/ct-template.md @@ -0,0 +1,7 @@ +Чтобы создать собственный шаблон контейнера в Proxmox, используйте: + +1. Сделайте резервную копию контейнера в формате gzip. В идеале, когда контейнер остановлен +2. SSH к базовой машине proxmox и переместите резервную копию контейнера в папку шаблона, используя: +3. Теперь можно использовать этот шаблон для создания новых контейнеров. + +`mv /var/lib/vz/dump/<имя-резервной копии>.tar.gz /var/lib/vz/template/cache/<имя-шаблона>.tar.gz` \ No newline at end of file diff --git a/docs/ubuntu/docker-ufw.md b/docs/ubuntu/docker-ufw.md new file mode 100755 index 0000000..57d6ed9 --- /dev/null +++ b/docs/ubuntu/docker-ufw.md @@ -0,0 +1,152 @@ +# Как использовать Docker с UFW одновременно + +![](../images/ubuntu/docker-and-ufw.jpg) + +Удивительно, но Docker не работает из коробки с “Universal Firewall” Linux, или UFW. +## Почему Docker не работает с UFW? +UFW задуман как очень простой брандмауэр. + +Проблема в том, что UFW и Docker пытаются изменить одни и те же базовые правила брандмауэра. И этот конфликт требует дополнительной настройки, если вы хотите запустить UFW и Docker вместе. + +При настройке базового брандмауэра UFW на запрет по умолчанию и разрешению SSH, это будет выглядеть, что все безопасно. Но это не будет блокировать запуск контейнеров Docker на других портах + +Сложно диагностировать эту проблему, тк в UFW и Docker – это отдельные системы. + +> UFW неосознанно обманывает вас и не показывает открытые порты контейнеров Docker. + +Это может стать серьезной проблемой, если вы не решите ее. + +Например: при запуске дашборда администратора на порту 8000 и добавлении правила только на доступ с определенных ip адресов (белый список). В обычных условиях все будет хорошо, особенно если дашборд имеет собственную аутентификацию. UFW покажет правило брандмауэра, как внесенное в белый список. Дашборд будет доступен вам с тех адресов, которые вы указали в правиле. **НО, если запущено через Docker, то по умолчанию оно будет видно на порту 8000 из любого места**. + +## Исправление конфигурации Docker +Есть решение, которое предлагает Docker: отредактируйте _/etc/default/docker_ или _/etc/docker/daemon.json_ и просто отключите функциональность iptables в Docker: + +``` +DOCKER_OPTS="--iptables=false" +``` +Это работает, однако это лишь половинчатое решение. + +Это лишает Docker возможности управлять собственными сетями и может привести к тому, что контейнеры вообще не смогут получить доступ в интернет из коробки. + +Это все еще может работать, но вам придется вручную поддерживать правила iptables для контейнеров Docker и пользовательских сетей, что сложно, раздражает и лишает цель простоты UFW. + +Реальное решение сложное, но, к счастью, достаточно распространенное, поэтому на [Github](https://github.com/chaifeng/ufw-docker) есть полезная публикация с подробным описанием проблемы и шагов по ее устранению. + +По сути, вам нужно изменить конфигурацию UFW в _/etc/ufw/after.rules_ и добавить следующий блок в конце: + +``` +# BEGIN UFW AND DOCKER +*filter +:ufw-user-forward - [0:0] +:ufw-docker-logging-deny - [0:0] +:DOCKER-USER - [0:0] +-A DOCKER-USER -j ufw-user-forward +-A DOCKER-USER -j RETURN -s 10.0.0.0/8 +-A DOCKER-USER -j RETURN -s 172.16.0.0/12 +-A DOCKER-USER -j RETURN -s 192.168.0.0/16 +-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN +-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16 +-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8 +-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12 +-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16 +-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8 +-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12 +-A DOCKER-USER -j RETURN +-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] " +-A ufw-docker-logging-deny -j DROP +COMMIT +# END UFW AND DOCKER +``` + +### Разберем подробнее что делают строчки. + +Следующие правила позволяют частным сетям посещать друг друга. Как правило, частные сети пользуются большим доверием, чем сети общего пользования. +``` +-A DOCKER-USER -j RETURN -s 10.0.0.0/8 +-A DOCKER-USER -j RETURN -s 172.16.0.0/12 +-A DOCKER-USER -j RETURN -s 192.168.0.0/16 +``` +Следующие правила позволяют UFW управлять тем, разрешено ли общедоступным сетям посещать службы, предоставляемые контейнером Docker. Чтобы мы могли управлять всеми правилами брандмауэра в одном месте. +``` +-A DOCKER-USER -j ufw-user-forward +``` +Следующие правила блокируют запросы на подключение, инициированные всеми общедоступными сетями, но разрешают внутренним сетям доступ к внешним сетям. + +- Для протокола TCP предотвращает активное установление TCP-соединения из общедоступных сетей. +- Для протокола UDP блокируется любой доступ к портам меньше 32767. + +Зачем этот порт? Поскольку протокол UDP не имеет состояния, невозможно заблокировать сигнал рукопожатия, который инициирует запрос на соединение, как это делает TCP. + +Для GNU/Linux мы можем найти диапазон локальных портов в файле `/proc/sys/net/ipv4/ip_local_port_range`. Диапазон по умолчанию`32768-60999`. + +При доступе к службе протокола UDP из запущенного контейнера локальный порт будет выбран случайным образом из диапазона портов, и сервер будет возвращать данные на этот случайный порт. Следовательно, мы можем предположить, что порт прослушивания протокола UDP во всех контейнерах меньше 32768. Это причина того, что мы не хотим, чтобы общедоступные сети обращались к портам UDP меньше 32768. +``` +-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16 +-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8 +-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12 +-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 192.168.0.0/16 +-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 10.0.0.0/8 +-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 172.16.0.0/12 +-A DOCKER-USER -j RETURN +``` +## Утилита для изменений + +Ручные правки это хорошо, но в [этом репозитории](https://github.com/chaifeng/ufw-docker) есть хорошая утилита, которая автоматизирует это и предоставляет полезные команды для проверки реального состояния брандмауэра. +```bash +sudo wget -O /usr/local/bin/ufw-docker https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker +sudo chmod +x /usr/local/bin/ufw-docker +``` +Затем установите конфиг и перезапустите UFW. +```bash +ufw-docker install +sudo systemctl restart ufw +``` +После перезапуска изменения должны применяться автоматически, но если они не применяются, вам может потребоваться перезапустить Docker или вашу машину в целом. + +После включения все порты должны быть правильно заблокированы. + +Список доступных команд: +```bash +ufw-docker help +ufw-docker install +ufw-docker status +ufw-docker allow webapp +ufw-docker allow webapp 80 +ufw-docker allow webapp 53/udp +ufw-docker list webapp +ufw-docker delete allow webapp 80/tcp +ufw-docker delete allow webapp +``` + +## Белые списки портов контейнеров Docker с помощью UFW + +Это решение потребует от вас немного другой конфигурации портов. + +В утилите ufw-docker есть команда, которая выборочно вносит порты в белый список для определенных контейнеров Docker. +```bash +ufw-docker allow httpd 80 +``` +Однако если вы хотите использовать более продвинутое правило, например, белый список на основе IP, вам придется использовать ufw route allow +```bash +ufw route allow proto tcp from 1.2.3.4 to any port 9443 +``` + +## Разница между ufw-user-forward и ufw-user-input + +### ufw-user-input + +| Плюсы | Минусы | +|--|--| +| Прост в использовании и понимании, поддерживает старые версии Ubuntu. Например, чтобы разрешить публике посещать опубликованный порт, порт контейнера которого — `8080`, используйте команду: `ufw allow 8080` | Кроме разрешения доступа к портам контейнеров, он также разрешает доступ к портам хоста. Например, если служба запущена на хосте, а порт — `8080`. Команда `ufw allow 8080` позволяет общедоступной сети посещать службу хоста и все опубликованные порты, контейнеры которых имеют порт `8080`. Но мы просто хотим дать доступ к службе, работающей на хосте или работающую внутри контейнеров. Но не вместе. Чтобы избежать этой проблемы, нам может понадобиться использовать команду, подобную следующей, для всех контейнеров: `ufw allow proto tcp from any to 172.16.0.3 port 8080` | + +### ufw-user-forward + +| Плюсы | Минусы | +|--|--| +| Невозможно предоставить доступ к службам, работающим одновременно на хостах и в контейнерах, с помощью одной и той же команды. Например, если мы хотим опубликовать порт `8080` контейнеров, используем следующую команду: `ufw route allow 8080`. Общедоступная сеть может получить доступ ко всем опубликованным портам, порты контейнеров которых имеют статус `8080`. Но порт `8080` хоста по-прежнему недоступен из общедоступной сети. Если мы хотим это сделать, выполните следующую команду, чтобы разрешить публичный доступ к порту на хосте отдельно: `ufw allow 8080` | Не поддерживает старые версии Ubuntu, и команда немного сложнее. Но вы можете использовать мой скрипт [https://github.com/chaifeng/ufw-docker](https://github.com/chaifeng/ufw-docker) | + +## Вывод + +Если мы используем более старую версию Ubuntu, мы можем использовать `ufw-user-input` chain. Но будьте осторожны, чтобы не открывать службы, которые не должны быть раскрыты. + +Если мы используем более новую версию Ubuntu, которая является подкомандой поддержки `ufw route`, нам лучше использовать `ufw-user-forward` цепочку и использовать `ufw route` команду для управления правилами брандмауэра для контейнеров. \ No newline at end of file diff --git a/docs/ubuntu/hpe/hpe-mcp.md b/docs/ubuntu/hpe/hpe-mcp.md new file mode 100755 index 0000000..d8a2c13 --- /dev/null +++ b/docs/ubuntu/hpe/hpe-mcp.md @@ -0,0 +1,73 @@ +Недавно у меня появился на руках сервер HPE ML30 Gen10. Мне больше всего нравится Ubuntu Server, поэтому я решил установить его на сервере. Чуть позднее я узнал, что у HP есть утилиты, которые вы можете установить в Linux для изменения и просмотра настроек и информации на уровне системы, что довольно круто. + +Я хотел попробовать их, однако Ubuntu не входит в группу ОС (Red Hat и SUSE), которые получают пакеты [обновлений](https://downloads.linux.hpe.com/SDR/project/spp/) . Так что документация и поддержка минимальны, и мне потребовалось немного времени, чтобы во всем разобраться. + +!!! info + Отказ от ответственности: я работаю над сервером Gen 10, поэтому + устанавливаемые пакеты могут отличаться от других поколений. + +## Установка через APT + +Во-первых, чтобы установить утилиты, вам нужно добавить [источник](https://downloads.linux.hpe.com/SDR/project/mcp/) в **apt**: +```bash +sudo echo "deb http://downloads.linux.hpe.com/SDR/repo/mcp dist/project_ver non-free" > /etc/apt/sources.list.d/mcp.list +``` + +Где: +- **dist**: jammy, bullseye, focal, buster, bionic, xenial, precise, stretch, jessie +- **project_ver**: current, 12.40, 12.30, 12.20, 12.05, 12.00, 11.30, 11.21, 11.05 + +Для **Ubuntu Server 22** команда будет такой: +```bash +sudo echo "deb http://downloads.linux.hpe.com/SDR/repo/mcp jammy/current non-free" > /etc/apt/sources.list.d/mcp.list +``` +Затем вам необходимо зарегистрировать [открытые ключи HPE](https://downloads.linux.hpe.com/SDR/keys.html) (в этой же команде, идет преобразование ключей в новый формат, чтобы при обновлении пакетов, не выходило предупреждение): +```bash +curl https://downloads.linux.hpe.com/SDR/hpPublicKey2048.pub | apt-key add - +apt-key export 5CE2D476 | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/hpPublicKey2048.gpg +sudo apt-key --keyring /etc/apt/trusted.gpg del 5CE2D476 + +curl https://downloads.linux.hpe.com/SDR/hpPublicKey2048_key1.pub | apt-key add - +apt-key export B1275EA3 | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/hpPublicKey2048_key1.gpg +sudo apt-key --keyring /etc/apt/trusted.gpg del B1275EA3 + +curl https://downloads.linux.hpe.com/SDR/hpePublicKey2048_key1.pub | apt-key add - +apt-key export 26C2B797 | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/hpePublicKey2048_key1.gpg +sudo apt-key --keyring /etc/apt/trusted.gpg del 26C2B797 +``` + Теперь вам просто нужно обновить исходники apt и установить утилиты. +```bash +sudo apt update +``` + +Несмотря на имена пакетов, указанные на [странице HPE](https://downloads.linux.hpe.com/SDR/project/mcp/) , я обнаружил, что некоторые пакеты просто не существуют или имеют другие имена. + +Список доступных компонентов для установки: + +| | | +| - | - | +| **hp-health** | HPE System Health Application and Command line Utilities (Gen9 and earlier) | +| **hponcfg** | HPE RILOE II/iLO online configuration utility | +| **amsd** | HPE Agentless Management Service (Gen10 only) | +| **hp-ams** | HPE Agentless Management Service (Gen9 and earlier) | +| **hp-snmp-agents** | Insight Management SNMP Agents for HPE ProLiant Systems (Gen9 and earlier) | +| **hpsmh** | HPE System Management Homepage (Gen9 and earlier) | +| **hp-smh-templates** | HPE System Management Homepage Templates (Gen9 and earlier) | +| **ssacli** | HPE Command Line Smart Storage Administration Utility | +| **ssaducli** | HPE Command Line Smart Storage Administration Diagnostics | +| **ssa** | HPE Array Smart Storage Administration Service | +| **storcli** | MegaRAID command line interface | + +Устанавливаются просто: `sudo apt install `. Например `sudo apt install amsd` + +## Установка через пакеты .deb + + 1. Идем в [репозиторий HPE для Linux](https://downloads.linux.hpe.com), раздел **mpc** — Management Component Pack for ProLiant. + 2. Ищем Ubuntu. + 3. Дальше *pool* → *non-free*. + 4. Находим нужный пакет, копируем ссылку, качаем и устанавливаем. Для примера будет **amsd**: + ```bash + cd /tmp + wget https://downloads.linux.hpe.com/SDR/repo/mcp/Ubuntu/pool/non-free/amsd_3.1.0-1745.130-jammy_amd64.deb + dpkg -i amsd_3.1.0-1745.130-jammy_amd64.deb + ``` \ No newline at end of file diff --git a/docs/ubuntu/mariadb.md b/docs/ubuntu/mariadb.md old mode 100644 new mode 100755 diff --git a/docs/ubuntu/mount-cifs.md b/docs/ubuntu/mount-cifs.md new file mode 100755 index 0000000..d3c1557 --- /dev/null +++ b/docs/ubuntu/mount-cifs.md @@ -0,0 +1,98 @@ +Периодически, при работе на Linux системах, требуется примонтировать расшаренную SMB-папку к файловой системе. + +Для этой цели нам потребуется установленный пакет `cifs-utils`, установленный командой: +=== "в Ubuntu и Debian" + ```bash + sudo apt-get install cifs-utils ntfs-3g ntfs-confiп + ``` +=== "в Fedora, CentOS и других RedHat based дистрибутивах" + ```bash + sudo yum install cifs-utils ntfs-3g ntfs-confi + ``` +Что нужно чтобы монтировать расшаренные папки вручную. Потребуется создать путь куда будем монтировать SMB-папку, пусть это, к примеру, будет `/mnt/sharefolder`: +```bash +sudo mkdir /mnt/sharefolder +``` +Вот такой командой можно примонтировать папку, требующую авторизации по логину и паролю: +```bash +sudo mount -t cifs //192.168.80.10/share /mnt/sharefolder -o username=windowsuser,password=windowspass,iocharset=utf8,file_mode=0777,dir_mode=0777 +``` +где вместо: + +- `//192.168.80.10/share` – ip-адрес и имя необходимой общей папки (если имя расшаренной папки содержит пробел, то необходимо заключить весь путь в кавычки, как это показано в следующем примере) +- `/mnt/sharefolder` – путь куда будет монтироваться ресурс, +- `windowsuser` – имя пользователя с необходимыми правами доступа к этому ресурсу Windows, +- `windowspass` – пароль этого пользователя. + +Если необходимая папка не требует обязательной авторизации, то подключить ресурс можно такой командой: +```bash +sudo mount -t cifs "//192.168.0.11/общие документы" /media/sharefolder -o guest,rw,iocharset=utf8,file_mode=0777,dir_mode=0777 +``` +Если гостевой доступ к необходимой папке включен только в режиме чтения, то будет достаточно такой команды: +```bash +sudo mount -t cifs //192.168.0.11/общие /media/sharefolder -o guest,iocharset=utf8 +``` +При удачном выполнении этих команд не должно произойти никакого уведомления – можете смело проверять как примонтировалась папка перейдя по вашему пути (в нашем примере – `/mnt/sharefolder`). +Отмонтируется папка командой: +```bash +sudo umount /mnt/sharefolder +``` +Для того чтобы осуществить автомонтирование таких папок нам придется отредактировать системный файл **fstab**. Также, если доступ к необходимому windows-ресурсу требует обязательной авторизации, то потребуется предварительно создать файл, в котором будут прописаны логин и пароль доступа (сделать это можно текстовым редактором nano): +```bash +sudo nano /root/.smbcredentials +``` +В этот новый файл добавьте две строки: +``` +username=windowsuser +password=windowspass +``` +где, соответственно + - **windowsuser** – имя пользователя с необходимыми правами доступа к ресурсу Windows, + - **windowspass** – пароль этого пользователя. + +Измените права созданного файла так, что редактировать и смотреть его смог только root, то есть сама система: +```bash +sudo chmod 700 /root/.smbcredentials +``` +Сохраните изменения и переходите к редактированию файла /etc/fstab: +```bash +sudo nano /etc/fstab +``` +И здесь в самом конце добавьте строку типа: +``` +//192.168.0.11/share /media/sharefolder cifs credentials=/root/.smbcredentials,iocharset=utf8,file_mode=0777,dir_mode=0777 0 0 +``` +Если авторизации по имени и паролю не требуется, а требуется только гостевой доступ, то создавать файл **.smbcredentials** не потребуется, этот шаг можно было пропустить и сразу в `/etc/fstab` добавить строку: +``` +//192.168.0.11/общие\040документы /media/sharefolder cifs guest,rw,iocharset=utf8,file_mode=0777,dir_mode=0777 0 0 +``` +Обратите внимание, что здесь если ваша папка содержит пробелы, то вариант аналогичный командной строке – заключении пути в кавычки – не поможет, для того, чтобы **fstab** понял пробелы – их необходимо заменить на четыре символа: `\040 ` +И, соответственно, если требуется только лишь гостевой доступ в режиме чтения к windows-папке, то будет достаточно такой строки: +``` +//192.168.0.11/общие /media/sharefolder cifs guest,iocharset=utf8 0 0 +``` +Для того, чтобы проверить корректно ли монтируется shared-папка из fstab без перезагрузки нужно выполнить такую команду: +```bash +sudo mount -a +``` +Также к этому стоит добавить, что если вы хотите получать доступ к windows-шаре не через ip-адрес, а через имя машины, то вам потребуется установить winbind: +=== "в Debian-based" + ```bash + sudo apt-get install winbind + ``` +=== "в RedHat-based" + ```bash + sudo yum install samba-winbind + ``` +После этого отредактируйте файл **/etc/nsswitch.conf**: +```bash +sudo nano /etc/nsswitch.conf +``` +Где в строке: +`hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4` +перед dns добавьте wins, то есть после редактирования она должна выглядеть вот так: +`hosts: files mdns4_minimal [NOTFOUND=return] wins dns mdns4` + +После перезагрузки для получения доступа к windows-ресурсу через CIFS можно будет указывать не только ip, но и сетевое имя windows-ресурса (netbios name). Но мы все же рекомендую использовать непосредственно ip-адрес, т.к. к нему обращение идет напрямую, быстрее. + +Также стоит отметить, что таким образом можно монтировать только конкретные общие папки (например: `//192.168.0.11/share`), но не весь windows-ресурс целиком (то есть просто: `//192.168.0.11`). \ No newline at end of file diff --git a/docs/ubuntu/telegraf.md b/docs/ubuntu/telegraf.md new file mode 100755 index 0000000..f74f8f0 --- /dev/null +++ b/docs/ubuntu/telegraf.md @@ -0,0 +1,58 @@ +Telegraf это агент, написанный на Go для сбора метрик производительности из системы и сервисов, где он запущен. Собираемые метрики отправляются в **InfluxD** или в другие поддерживаемые хранилища. Из InfluxDB можно визуализировать данные и производительность используя Grafana. [Github](https://github.com/influxdata/telegraf/) + +Базовый способ использования Telegraf следующий: + +1. Агент Telegraf устанавливается на все сервера, откуда нужно собирать метрики (Ubuntu, Debian, Windows, CentOS и прочие) +2. Метрики собираются и отправляются в InfluxDB +3. Источник данных InfluxDB добавляется в Grafana +4. Созданы графики Grafana - они получают данные из источника данных InfluxDB. + +Установка Telegraf на Ubuntu 22.04 производится из репозитория Influxdata. После добавления репозитория пакет можно установить с помощью диспетчера пакетов **apt**. Добавьте репозиторий InfluxData в файл `/etc/apt/sources.list.d/influxdata.list` +```bash +wget -q https://repos.influxdata.com/influxdata-archive_compat.key +echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null +echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list +``` + +Обновить **apt** индекс и установить Telegraf + +```bash +sudo apt update && sudo apt install telegraf -y +``` + +Запустить и включить сервис, для запуска при загрузке + +```bash +sudo systemctl enable --now telegraf +sudo systemctl is-enabled telegraf +``` + +Проверить статус сервиса + +```bash +systemctl status telegraf +``` + +## Решение проблем + +### S.M.A.R.T. Input плагин + +You will need the following in your telegraf config: + +[[inputs.smart]] + use_sudo = true + +You will also need to update your sudoers file: + +$ visudo +# For smartctl add the following lines: +Cmnd_Alias SMARTCTL = /usr/bin/smartctl +telegraf ALL=(ALL) NOPASSWD: SMARTCTL +Defaults!SMARTCTL !logfile, !syslog, !pam_session + +# For nvme-cli add the following lines: +Cmnd_Alias NVME = /path/to/nvme +telegraf ALL=(ALL) NOPASSWD: NVME +Defaults!NVME !logfile, !syslog, !pam_session + +https://github.com/influxdata/telegraf/tree/master/plugins/inputs/smart \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index b831bb6..6271a31 100755 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,7 @@ 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 \ No newline at end of file +pymdown-extensions>=9.9.1 +mkdocs-git-revision-date-localized-plugin +mkdocs-glightbox +mkdocs-blogging-plugin \ No newline at end of file