Не актуально

Не актуальные инструкции, тк более не используются в моей инфраструктуре.

Установка docker и Portainer в lxc контейнере proxmox

Использование Proxmox и lxc контейнеров в нем, позволяет оптимизировать использование ресурсов и повышает отказоустойчивость инфраструктуры, по сути lxc контейнер является сильно "облегченной" операционной системой, на которую можно установить только те пакеты которые необходимы. Но сама по себе идея работы lxc контейнера, не является новой, одним из самых популярных аналогов lxc контейнеров является docker. Так как я не ограничен никакими рамками в использовании ПО отказываться от docker и docker-compose я не вижу никакого смысла.
Proxmox и его lxc контейнеры никак не ограниченны в установке ПО поэтому мне ничего не мешает выделить ресурсы ноды под использование другой контейнерной структуры.

Portainer — это открытый веб-интерфейс для управления контейнерами Docker, который упрощает работу частично освобождая от использования командной строки.

В гайде описан процесс установки в lxc контейнер docker и portainer

Создание LXC контейнера

Процесс создания lxc контейнера описан тут

Нам необходимо создать контейнер с такими настройками:

Далее необходимо подключиться к нему через ssh

Установка docker

apt update && apt install curl -y
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker

Установка portainer

docker volume create portainer_data
docker run -d -p 9000:9000 --name portainer --restart always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

Доступ http://<ip lxc контейнера>:9000

Установка и настройка Nginx proxy manager в docker portainer, настройка split dns, настройка wildcard-сертификата

После установки docker portainer

Nginx Proxy Manager (NPM) — это удобный инструмент с веб-интерфейсом для управления обратным прокси на базе Nginx, который упрощает маршрутизацию трафика к сервисам в Docker, LXC или VM без редактирования конфигов вручную.

Основные функции
Поддерживает проксирование по доменам/поддоменам, автоматическое получение SSL-сертификатов Let's Encrypt, HTTP-аутентификацию, списки доступа (ACL) и блокировку IP. Позволяет настраивать перенаправления, кастомные страницы ошибок и потоки TCP/UDP через Streams.
​

После покупки домена и регистрации его у dns провайдеров у нас появляется возможность реализовать обратный прокси трафика по доменному имени, это позволит нам убрать отображение ip адресов из нашей homelab и реализовать доступ из интернета к веб панелям необходимых нам сервисов.

Установка Nginx Proxy Manager

Для установки Nginx Proxy Manager (npm) в docker через portainer, нам необходимо перейти в веб-интерфейс portainer

http://<ip lxc контейнера>:9000

В веб интерфейсе необходимо перейти в docker

image.png

Слева или в центре экрана выбрать Stacks

image.png

Слева сверху выбрать +Add stack

image.png

В name указать название нашего контейнера npm

image.png

Ниже в поле для ввода кода Web editor, вводим код нашего docker-compose файла

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'    # HTTP
      - '443:443'  # HTTPS
      - '81:81'    # Админка NPM
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    environment:
      DISABLE_IPV6: 'true'

После ввода необходимо нажать кнопку Deploy the stack

image.png

Если все в порядке, после установки у вас появится доступ к панели по адресу http://<ip lxc контейнера с portain>:81

Настройка Nginx Proxy Manager

После установки нам необходимо выполнить несколько обязательных вещей

Проброс портов к npm

В OPNsense нам необходимо перейти в раздел Firewall, далее NAT и перейти в Port Forward, в открывшемся окне нажать справа сверху на +(add) 

В открывшемся окне нужно заполнить поля

Interface: WAN

TCP/IP Version: IPv4

Protocol: TCP

Destination: WAN adress

Destination port range: from: HTTP; to: HTTP

Redirect target IP: Single host of Network, ниже ip используемого lxc контейнера

Redirect target port: HTTP

Description: NPM HTTP for Let's Encrypt

Нажать кнопку Save

image.png

После этого нажимаем кнопку Apply changes и создаем следующее правило кнопкой +(add)

Interface: WAN

TCP/IP Version: IPv4

Protocol: TCP

Destination: WAN adress

Destination port range: from: HTTPS; to: HTTPS

Redirect target IP: Single host of Network, ниже ip используемого lxc контейнера

Redirect target port: HTTPS

Description: NPM HTTPS for Let's Encrypt

Нажать кнопку Save

image.png

После этого нажимаем кнопку Apply changes

Покупка домена reg.ru

Для настройки доменных имен в npm доменное имя необходимо купить по этому поводу уже написана подробная статья

После покупки доменного имени и указания его у ДНС провайдера потребуется время что бы запись появилась у ДНС резолверов, проверить это проще всего командой на любом клиенте сети с установленным линукс, я для этих целей создал отдельный тестовый lxc контейнер

dig <ваш домен>

В выводе команды должен отобразится внешний ip адрес, запись проводится в течении 1-24 часов.

Настройка сертификата

Так как мы планируем использовать большое количество поддоменов нам не подходит вариант с обычным запросом сертификата через certbot, reg.ru позволяет запрашивать wildcard сертификат на домен и все поддомены, поэтому мы будем настраивать сразу его. 

На сайте reg.ru заходишь в личный кабинет, далее Настройки API, запрашиваешь ключ API, его необходимо записать.

В NPM нужно создать wildcard-сертификат, во вкладке Certificates нужно нажать на кнопку Let's Encrypt via DNS

image.png

В открывшемся окне необходимо заполнить поля
Domain Names: тут указываешь <твоедоменноеимя.ru> и <*.твоедоменноеимя.ru>

DNS Provider: reg.ru

Credentials File Content:
dns_username=<твоя почта на reg.ru>
dns_password=<api колюч>

После этого необходимо нажать кнопку Save и подождать 1-5 минут.

image.png

Настройка split dns

Так как мы не хотим что бы все наши домены были доступны из сети, и для оптимизации подключения к доменам, нам необходимо настроить split dns на нашем opnsense. 
Технически можно реализовать эту технологию на любом локальном dns сервере, но в opnsense уже установлен unbound dns, в котором есть необходимый нам функционал (ubound dns должен быть включен и настроен), для этого нам необходимо перейти во вкладку Services, далее Unbound DNS, далее Overrides, в открывшемся окне в разделе Hosts нажать на +

image.png

В открывшемся окне необходимо заполнить поля

Enabled: Галочка

Host: *

Domain: <твой домен>

Type: A (IPv4 address)

IP address: <ip адрес lxc контейнера>

Description: NPM

Далее нажать кнопку Save и Apply

image.png

Следующим шагом нужно указать Query forwarding для нашего сертификата, что бы избежать проблем с сертификатами в локальной сети при переходе по нашим доменам.

Для этого необходимо перейти во вкладку Query forwarding нажать на + и в открывшемся окне заполнить поля

Enabled: Галочка

Domain: ocsp.int-x3.letsencrypt.org

Server IP: 1.1.1.1

Далее нажать Save и Apply

image.png

Теперь необходимо перейти в панель npm и настроить там группу доступа которую мы будем указывать при создании доменов.

Для этого необходимо перейти во вкладку Acces list нажать на кнопку Add Acces list и в открывшемся окне заполнить форму

Во вкладке Details необходимо указать имя нашей группы
Во вкладке Rules необходимо добавить подсети из которых у нас будет доступ к нашим доменам

image.png

Создание и настройка поддомена

Для создания поддомена нам необходимо перейти во вкладку Proxy Hosts и нажать на кнопку Add Proxy Host, в открывшемся окне необходимо заполнить поля

Domain Names: Вводим необходимы домен или поддомен

Scheme: В зависимости от панели к которой хотим открыть доступ выбираем http или https

Forward Hostname / IP: ip нашего сервиса,

Forward Port: Порт нашего сервиса

Access List: в зависимости от того хотим ли что бы сервис работал только локально или был публичным выбираем созданную нами группу доступа или Publicly Accessible

Cache Assets: (Опционально) Включает кэширование статических ресурсов (CSS, JS, изображения) на прокси-сервере для ускорения загрузки страниц, снижая нагрузку на backend-сервер. 
​

Block Common Exploits: (Опционально) Активирует встроенные правила Nginx для защиты от распространённых веб-атак (XSS, SQL-инъекции, кликджекинг) через заголовки безопасности вроде X-Frame-Options и Content-Security-Policy.
​

Websockets Support: (Опционально) Включает поддержку WebSocket-протокола (ws://, wss://), необходимую для real-time приложений вроде чатов, дашбордов или игр (например, Grafana, Homarr в homelab).

image.png

Переходим во вкладку SSL в открывшемся окне необходимо заполнить поля

SSL Certificate: Указываем созданный нами раннее сертификат

Force SSL: (Опционально) Принудительно перенаправляет весь HTTP-трафик (порт 80) на HTTPS (порт 443) с помощью 301-редиректа, обеспечивая обязательное шифрование.
​

HSTS Enabled: (Опционально) Включает HTTP Strict Transport Security — браузеры запоминают домен как HTTPS-only на заданный период (max-age), предотвращая MITM-атаки и downgrade до HTTP.
​

HTTP/2 Support: (Опционально) Активирует протокол HTTP/2 для мультиплексирования запросов, сжатия заголовков и ускорения загрузки (требует SSL).
​

HSTS Sub-domains: (Опционально) Расширяет HSTS-политику на все поддомены (includeSubDomains), заставляя браузеры применять HTTPS ко всем *.domain.com.
​

image.png

После нажатия кнопки Save домен появится в списке и ресурс станет доступен по заданному домену

Установка и настройка homepage в portainer

Установка homepage

Для установки homepage в docker через portainer, нам необходимо перейти в веб-интерфейс portainer

http://<ip lxc контейнера>:9000

В веб интерфейсе необходимо перейти в docker

image.png

Слева или в центре экрана выбрать Stacks

image.png

Слева сверху выбрать +Add stack

image.png

В name указать название нашего контейнера homepage

image.png

Ниже в поле для ввода кода Web editor, вводим код нашего docker-compose файла

version: "3.8"
services:
  homepage:
    image: ghcr.io/gethomepage/homepage:latest
    container_name: homepage
    ports:
      - "3000:3000"
    volumes:
      - /opt/homepage/config:/app/config          # Конфиги (services.yaml, settings.yaml)
      - /opt/homepage/images:/app/public/images   # Фоны и кастомные картинки
      - /opt/homepage/icons:/app/public/icons     # Иконки сервисов
      - /opt/homepage/custom:/app/custom          # Кастом CSS/JS
      - /var/run/docker.sock:/var/run/docker.sock:ro  # Docker виджеты
      - /etc/localtime:/etc/localtime:ro          # Часовой пояс
    environment:

      - HOMEPAGE_ALLOWED_HOSTS=<ip контейнера portainer>:3000,<домен созданный в NPM>,localhost:3000 #ВНИМАТЕЛЬНО!!!
    restart: unless-stopped

После ввода необходимо нажать кнопку Deploy the stack

image.png

Если все в порядке, после установки у вас появится доступ к панели по адресу http://<ip lxc контейнера с portain>:3000

Настройку homepage рекомендую выполнять через официальную документацию документацию homepage dashoboard

Установка Nginx Proxy Manager в lxc контейнер

Nginx Proxy Manager (NPM) — это удобный инструмент с веб-интерфейсом для управления обратным прокси на базе Nginx, который упрощает маршрутизацию трафика к сервисам в Docker, LXC или VM без редактирования конфигов вручную.

Основные функции
Поддерживает проксирование по доменам/поддоменам, автоматическое получение SSL-сертификатов Let's Encrypt, HTTP-аутентификацию, списки доступа (ACL) и блокировку IP. Позволяет настраивать перенаправления, кастомные страницы ошибок и потоки TCP/UDP через Streams.
​

После покупки домена и регистрации его у dns провайдеров у нас появляется возможность реализовать обратный прокси трафика по доменному имени, это позволит нам убрать отображение ip адресов из нашей homelab и реализовать доступ из интернета к веб панелям необходимых нам сервисов.

Установка Nginx Proxy Manager

Для установки NPM в lxc контейнер, нам понадобиться скрипт с сайта https://community-scripts.github.io/ProxmoxVE/scripts?id=nginxproxymanager

А так же VPN подключение на роутере, для того что бы весь трафик в сети шел через VPN, некоторые пакеты в скрипте не доступны из России

В консоли ноды необходимо ввести

bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/nginxproxymanager.sh)"

Сообщения о ошибках можно игнорировать, на все вопросы отвечаем Y

Если все в порядке, после установки у вас появится доступ к панели по адресу http://<ip lxc контейнера с portain>:81

Настройка Nginx Proxy Manager

После установки нам необходимо выполнить несколько обязательных вещей

Проброс портов к npm

В OPNsense нам необходимо перейти в раздел Firewall, далее NAT и перейти в Port Forward, в открывшемся окне нажать справа сверху на +(add) 

В открывшемся окне нужно заполнить поля

Interface: WAN

TCP/IP Version: IPv4

Protocol: TCP

Destination: WAN adress

Destination port range: from: HTTP; to: HTTP

Redirect target IP: Single host of Network, ниже ip используемого lxc контейнера

Redirect target port: HTTP

Description: NPM HTTP for Let's Encrypt

Нажать кнопку Save

image.png

После этого нажимаем кнопку Apply changes и создаем следующее правило кнопкой +(add)

Interface: WAN

TCP/IP Version: IPv4

Protocol: TCP

Destination: WAN adress

Destination port range: from: HTTPS; to: HTTPS

Redirect target IP: Single host of Network, ниже ip используемого lxc контейнера

Redirect target port: HTTPS

Description: NPM HTTPS for Let's Encrypt

Нажать кнопку Save

image.png

После этого нажимаем кнопку Apply changes

Покупка домена reg.ru

Для настройки доменных имен в npm доменное имя необходимо купить по этому поводу уже написана подробная статья

После покупки доменного имени и указания его у ДНС провайдера потребуется время что бы запись появилась у ДНС резолверов, проверить это проще всего командой на любом клиенте сети с установленным линукс, я для этих целей создал отдельный тестовый lxc контейнер

В выводе команды должен отобразится внешний ip адрес, запись проводится в течении 1-24 часов.

Настройка сертификата

Так как мы планируем использовать большое количество поддоменов нам не подходит вариант с обычным запросом сертификата через certbot, reg.ru позволяет запрашивать wildcard сертификат на домен и все поддомены, поэтому мы будем настраивать сразу его. 

На сайте reg.ru заходишь в личный кабинет, далее Настройки API, запрашиваешь ключ API, его необходимо записать.

В NPM нужно создать wildcard-сертификат, во вкладке Certificates нужно нажать на кнопку Let's Encrypt via DNS

image.png

В открывшемся окне необходимо заполнить поля
Domain Names: тут указываешь <твоедоменноеимя.ru> и <*.твоедоменноеимя.ru>

DNS Provider: reg.ru

Credentials File Content:
dns_username=<твоя почта на reg.ru>
dns_password=<api колюч>

Propagation Seconds: Лучше указать 600 так как сервера reg.ru могут работать не стабильно

После этого необходимо нажать кнопку Save и подождать 1-5 минут.

image.png

Настройка split dns

Так как мы не хотим что бы все наши домены были доступны из сети, и для оптимизации подключения к доменам, нам необходимо настроить split dns на нашем opnsense. 
Технически можно реализовать эту технологию на любом локальном dns сервере, но в opnsense уже установлен unbound dns, в котором есть необходимый нам функционал (ubound dns должен быть включен и настроен), для этого нам необходимо перейти во вкладку Services, далее Unbound DNS, далее Overrides, в открывшемся окне в разделе Hosts нажать на +

image.png

В открывшемся окне необходимо заполнить поля

Enabled: Галочка

Host: *

Domain: <твой домен>

Type: A (IPv4 address)

IP address: <ip адрес lxc контейнера>

Description: NPM

Далее нажать кнопку Save и Apply

image.png

Следующим шагом нужно указать Query forwarding для нашего сертификата, что бы избежать проблем с сертификатами в локальной сети при переходе по нашим доменам.

Для этого необходимо перейти во вкладку Query forwarding нажать на + и в открывшемся окне заполнить поля

Enabled: Галочка

Domain: ocsp.int-x3.letsencrypt.org

Server IP: 1.1.1.1

Далее нажать Save и Apply

image.png

Теперь необходимо перейти в панель npm и настроить там группу доступа которую мы будем указывать при создании доменов.

Для этого необходимо перейти во вкладку Acces list нажать на кнопку Add Acces list и в открывшемся окне заполнить форму

Во вкладке Details необходимо указать имя нашей группы
Во вкладке Rules необходимо добавить подсети из которых у нас будет доступ к нашим доменам

image.png

Создание и настройка поддомена

Для создания поддомена нам необходимо перейти во вкладку Proxy Hosts и нажать на кнопку Add Proxy Host, в открывшемся окне необходимо заполнить поля

Domain Names: Вводим необходимы домен или поддомен

Scheme: В зависимости от панели к которой хотим открыть доступ выбираем http или https

Forward Hostname / IP: ip нашего сервиса,

Forward Port: Порт нашего сервиса

Access List: в зависимости от того хотим ли что бы сервис работал только локально или был публичным выбираем созданную нами группу доступа или Publicly Accessible

Cache Assets: (Опционально) Включает кэширование статических ресурсов (CSS, JS, изображения) на прокси-сервере для ускорения загрузки страниц, снижая нагрузку на backend-сервер. 
​

Block Common Exploits: (Опционально) Активирует встроенные правила Nginx для защиты от распространённых веб-атак (XSS, SQL-инъекции, кликджекинг) через заголовки безопасности вроде X-Frame-Options и Content-Security-Policy.
​

Websockets Support: (Опционально) Включает поддержку WebSocket-протокола (ws://, wss://), необходимую для real-time приложений вроде чатов, дашбордов или игр (например, Grafana, Homarr в homelab).

image.png

Переходим во вкладку SSL в открывшемся окне необходимо заполнить поля

SSL Certificate: Указываем созданный нами раннее сертификат

Force SSL: (Опционально) Принудительно перенаправляет весь HTTP-трафик (порт 80) на HTTPS (порт 443) с помощью 301-редиректа, обеспечивая обязательное шифрование.
​

HSTS Enabled: (Опционально) Включает HTTP Strict Transport Security — браузеры запоминают домен как HTTPS-only на заданный период (max-age), предотвращая MITM-атаки и downgrade до HTTP.
​

HTTP/2 Support: (Опционально) Активирует протокол HTTP/2 для мультиплексирования запросов, сжатия заголовков и ускорения загрузки (требует SSL).
​

HSTS Sub-domains: (Опционально) Расширяет HSTS-политику на все поддомены (includeSubDomains), заставляя браузеры применять HTTPS ко всем *.domain.com.
​

image.png

После нажатия кнопки Save домен появится в списке и ресурс станет доступен по заданному домену

Установка и настройка MTProto прокси для telegram на vps сервере через docker

Установка docker на сервер
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
Создание каталога для конфигурационных файлов
mkdir -p proxy-config
Запуск docker контейнера
docker run -d --name mtproto-proxy \
  -p 8889:443 \
  --restart=always \
  -v proxy-config:/data \
  telegrammessenger/proxy:latest

Вместо 8889 можно указать любой не занятый порт

Формирование ссылки для подключения
docker logs mtproto-proxy

В логах будет указана ссылка на подключение к MTProto формата 

tg://proxy?server=<ip vps сервера>&port=443&secret=<секретный код>

При отправке ссылки в telegram нужно заменить порт на тот что вы указали при запуске контейнера в моем случае это 8889