Не актуально
Не актуальные инструкции, тк более не используются в моей инфраструктуре.
- Установка docker и Portainer в lxc контейнере proxmox
- Установка и настройка Nginx proxy manager в docker portainer, настройка split dns, настройка wildcard-сертификата
- Установка и настройка homepage в portainer
- Установка Nginx Proxy Manager в lxc контейнер
- Установка и настройка MTProto прокси для telegram на vps сервере через docker
Установка docker и Portainer в lxc контейнере proxmox
Использование Proxmox и lxc контейнеров в нем, позволяет оптимизировать использование ресурсов и повышает отказоустойчивость инфраструктуры, по сути lxc контейнер является сильно "облегченной" операционной системой, на которую можно установить только те пакеты которые необходимы. Но сама по себе идея работы lxc контейнера, не является новой, одним из самых популярных аналогов lxc контейнеров является docker. Так как я не ограничен никакими рамками в использовании ПО отказываться от docker и docker-compose я не вижу никакого смысла.
Proxmox и его lxc контейнеры никак не ограниченны в установке ПО поэтому мне ничего не мешает выделить ресурсы ноды под использование другой контейнерной структуры.
Portainer — это открытый веб-интерфейс для управления контейнерами Docker, который упрощает работу частично освобождая от использования командной строки.
В гайде описан процесс установки в lxc контейнер docker и portainer
Создание LXC контейнера
Процесс создания lxc контейнера описан тут
Нам необходимо создать контейнер с такими настройками:
-
General: Hostname=portainer-docker
-
Template: Ubuntu 22.04 или Debian 12
-
Disks: 8GB
-
CPU: 2 cores
-
Memory: 2048 MB
Далее необходимо подключиться к нему через 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
Слева или в центре экрана выбрать Stacks
Слева сверху выбрать +Add stack
В name указать название нашего контейнера npm
Ниже в поле для ввода кода 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
Если все в порядке, после установки у вас появится доступ к панели по адресу 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
После этого нажимаем кнопку 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
После этого нажимаем кнопку 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
В открывшемся окне необходимо заполнить поля
Domain Names: тут указываешь <твоедоменноеимя.ru> и <*.твоедоменноеимя.ru>
DNS Provider: reg.ru
Credentials File Content:
dns_username=<твоя почта на reg.ru>
dns_password=<api колюч>
После этого необходимо нажать кнопку Save и подождать 1-5 минут.
Настройка split dns
Так как мы не хотим что бы все наши домены были доступны из сети, и для оптимизации подключения к доменам, нам необходимо настроить split dns на нашем opnsense.
Технически можно реализовать эту технологию на любом локальном dns сервере, но в opnsense уже установлен unbound dns, в котором есть необходимый нам функционал (ubound dns должен быть включен и настроен), для этого нам необходимо перейти во вкладку Services, далее Unbound DNS, далее Overrides, в открывшемся окне в разделе Hosts нажать на +
В открывшемся окне необходимо заполнить поля
Enabled: Галочка
Host: *
Domain: <твой домен>
Type: A (IPv4 address)
IP address: <ip адрес lxc контейнера>
Description: NPM
Далее нажать кнопку Save и Apply
Следующим шагом нужно указать Query forwarding для нашего сертификата, что бы избежать проблем с сертификатами в локальной сети при переходе по нашим доменам.
Для этого необходимо перейти во вкладку Query forwarding нажать на + и в открывшемся окне заполнить поля
Enabled: Галочка
Domain: ocsp.int-x3.letsencrypt.org
Server IP: 1.1.1.1
Далее нажать Save и Apply
Теперь необходимо перейти в панель npm и настроить там группу доступа которую мы будем указывать при создании доменов.
Для этого необходимо перейти во вкладку Acces list нажать на кнопку Add Acces list и в открывшемся окне заполнить форму
Во вкладке Details необходимо указать имя нашей группы
Во вкладке Rules необходимо добавить подсети из которых у нас будет доступ к нашим доменам
Создание и настройка поддомена
Для создания поддомена нам необходимо перейти во вкладку 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).
Переходим во вкладку 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.
После нажатия кнопки Save домен появится в списке и ресурс станет доступен по заданному домену
Установка и настройка homepage в portainer
Установка homepage
Для установки homepage в docker через portainer, нам необходимо перейти в веб-интерфейс portainer
http://<ip lxc контейнера>:9000
В веб интерфейсе необходимо перейти в docker
Слева или в центре экрана выбрать Stacks
Слева сверху выбрать +Add stack
В name указать название нашего контейнера homepage
Ниже в поле для ввода кода 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
Если все в порядке, после установки у вас появится доступ к панели по адресу 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
После этого нажимаем кнопку 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
После этого нажимаем кнопку 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
В открывшемся окне необходимо заполнить поля
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 минут.
Настройка split dns
Так как мы не хотим что бы все наши домены были доступны из сети, и для оптимизации подключения к доменам, нам необходимо настроить split dns на нашем opnsense.
Технически можно реализовать эту технологию на любом локальном dns сервере, но в opnsense уже установлен unbound dns, в котором есть необходимый нам функционал (ubound dns должен быть включен и настроен), для этого нам необходимо перейти во вкладку Services, далее Unbound DNS, далее Overrides, в открывшемся окне в разделе Hosts нажать на +
В открывшемся окне необходимо заполнить поля
Enabled: Галочка
Host: *
Domain: <твой домен>
Type: A (IPv4 address)
IP address: <ip адрес lxc контейнера>
Description: NPM
Далее нажать кнопку Save и Apply
Следующим шагом нужно указать Query forwarding для нашего сертификата, что бы избежать проблем с сертификатами в локальной сети при переходе по нашим доменам.
Для этого необходимо перейти во вкладку Query forwarding нажать на + и в открывшемся окне заполнить поля
Enabled: Галочка
Domain: ocsp.int-x3.letsencrypt.org
Server IP: 1.1.1.1
Далее нажать Save и Apply
Теперь необходимо перейти в панель npm и настроить там группу доступа которую мы будем указывать при создании доменов.
Для этого необходимо перейти во вкладку Acces list нажать на кнопку Add Acces list и в открывшемся окне заполнить форму
Во вкладке Details необходимо указать имя нашей группы
Во вкладке Rules необходимо добавить подсети из которых у нас будет доступ к нашим доменам
Создание и настройка поддомена
Для создания поддомена нам необходимо перейти во вкладку 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).
Переходим во вкладку 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.
После нажатия кнопки 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