При работе с PdfDing через веб-интерфейс весь обмен данными между пользователем и сервером проходит по HTTP-запросам, при помощи которых передаются загружаемые документы, параметры обработки и результаты. При использовании незащищённого подключения весь трафик идёт в открытом виде и может быть перехвачен. Кроме того, PdfDing построен на Django, где при включённых параметрах CSRF_COOKIE_SECURE и SESSION_COOKIE_SECURE корректная работа возможна только через HTTPS. В противном случае браузер не будет передавать необходимые cookie. Это может привести к ошибкам авторизации и проверки форм.
Браузеры также накладывают определённые ограничения. При работе без HTTPS браузер может выдавать предупреждения о небезопасности и блокировать некоторые ресурсы. Для устранения этих проблем используется SSL/TLS-шифрование с валидным сертификатом, например, от Let’s Encrypt. Настройка доступа по HTTPS обеспечивает безопасный обмен файлами, защиту cookie и корректное функционирование веб-приложения.
В статье разберём, как настроить доступ к PdfDing по HTTPS на виртуальном выделенном сервере, работающем под управлением Ubuntu 24.04.
Как настроить доступ к PdfDing по HTTPS
Во-первых, чтобы настроить доступ к сайту по HTTPS, необходимо владеть доменным именем. Причём это доменное имя должно быть привязано к IP-адресу узла, на котором расположен сайт. В нашем случае под сайтом мы понимаем веб-интерфейс PdfDing, под узлом – виртуальный выделенный сервер. Привязка имени домена к IP-адресу производится при помощи специальной DNS-записи, которая называется A-запись. Такую настройку можно сделать либо на сайте регистратора вашего домена, либо в личном кабинете RUVDS, где нужно перейти во вкладку Домены и добавить туда имя своего домена, привязав его к серверу, на котором установлен PdfDing.

Почему Nginx?
Одним из наиболее популярных способов настройки доступа через HTTPS является использование обратного прокси Nginx. Nginx сочетает в себе лёгкость и высокую производительность и способен обрабатывать большое количество соединений одновременно. Он умеет работать как прокси-сервер, принимая запросы на HTTPS и перенаправляя их к внутреннему приложению без необходимости изменять конфигурацию самого приложения. Nginx поддерживает установку и автоматическое обновление TLS-сертификатов от Let’s Encrypt для безопасного шифрования трафика. В сочетании с Docker это даёт простую и надёжную архитектуру, где PdfDing остаётся в контейнере, а Nginx обрабатывает весь внешний трафик. Таким образом обратный прокси фильтрует запросы и обеспечивает HTTPS, минимизируя нагрузку на приложение и снижая риски для безопасности.
При этом сам Nginx не умеет получать TLS-сертификаты и для организации HTTPS-соединения использует уже готовые. Поэтому для получения и автоматического обновления сертификатов применяется утилита Certbot. Именно она взаимодействует с центром сертификации Let’s Encrypt. Certbot выполняет проверку домена, генерирует приватный ключ и выпускает сертификат. После чего эти файлы подключаются в конфигурации Nginx.
Настройка брандмауэра
Для проверки домена через HTTP-01 challenge Certbot использует порт 80. Утилита временно размещает проверочный файл на веб-сервере, и центр сертификации Let’s Encrypt обращается к нему по HTTP, чтобы убедиться, что вы контролируете домен. Если проверка прошла успешно, Certbot получает сертификат и копирует его на сервер. После чего остаётся настроить Nginx на работу через HTTPS с использованием порта 443.
Таким образом, на данном этапе необходимо обеспечить возможность доступа к серверу по протоколам HTTP и HTTPS. Чтобы это сделать, в брандмауэр UFW добавьте для них разрешающие правила:
$ sudo ufw allow http
$ sudo ufw allow httpsУстановка сертификата через Certbot
Теперь установите в систему утилиту Certbot:
$ sudo apt install certbotПо окончании установки запустите процесс запроса и установки TLS-сертификата. В данной команде замените your-site-name.ru на доменное имя вашего сайта:
$ sudo certbot certonly --standalone -d your-site-name.ruПри выполнении своей работы утилита сначала попросит указать E-mail, который будет использоваться для уведомлений. Затем вы должны будете согласиться с условиями предоставления услуг, чтобы зарегистрироваться на сервере ACME – протокола, который использует Let’s Encrypt и другие центры сертификации для автоматической выдачи, продления и управления SSL/TLS-сертификатами. Далее необходимо согласиться с тем, что вы готовы поделиться своим адресом электронной почты с Electronic Frontier Foundation, партнёром-основателем проекта Let’s Encrypt и некоммерческой организацией, разрабатывающей Certbot. В результате утилита отправит запрос, и после успешного прохождения проверки в систему будет установлен сертификат.

Настройка обратного прокси
По окончании работы утилиты перейдите в рабочий каталог PdfDing:
$ cd ~/pdfding/Затем остановите работающий контейнер PdfDing. При этом следующая команда полностью свернёт проект. В том числе удалит контейнеры и сети, созданные текущим docker-compose.yml. Сами данные, поскольку они находятся в томах, останутся на месте.
$ sudo docker compose downПосле чего откройте для редактирования файл docker-compose.yml:
$ nano docker-compose.ymlВ файл docker-compose.yml внесите следующие изменения:
- секцию portsзамените наexpose, которая объявляет порты в контейнере, предназначенные для взаимодействия с другими контейнерами внутри одной сети Docker Compose без их проброса на хост;
- в параметрах HOST_NAMEиALLOWED_HOSTSукажите доменное имя сайта, но не IP-адрес;
- установите в TRUEзначения параметровCSRF_COOKIE_SECUREиSESSION_COOKIE_SECURE, относящихся к настройке cookie в веб-приложениях, в частности, в Django, на котором работает PdfDing, и отвечают за безопасность при работе через HTTPS.
services:
  pdfding:
    container_name: pdfding
    image: mrmn/pdfding:latest
    restart: unless-stopped
    expose:
      - "8000"
    environment:
      - DEFAULT_THEME=dark
      - DEFAULT_THEME_COLOR=blue
      - SECRET_KEY=abcdef...890
      - HOST_NAME=your-site-name.ru
      - ALLOWED_HOSTS=your-site-name.ru,localhost,127.0.0.1
      - CSRF_COOKIE_SECURE=TRUE
      - SESSION_COOKIE_SECURE=TRUE
    volumes:
      - sqlite_data:/home/nonroot/pdfding/db
      - media:/home/nonroot/pdfding/media
  nginx:
    image: nginx:stable-alpine
    container_name: nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - /etc/letsencrypt:/etc/letsencrypt:ro
    depends_on:
      - pdfding
volumes:
  sqlite_data:
  media:
Дополнительно добавьте в файл секцию для контейнера с именем nginx, где:
- image: nginx:stable-alpine– означает, что в качестве основы в контейнере используется лёгкий и стабильный образ Nginx на базе Alpine Linux;
- container_name: nginx– задаёт имя контейнера для обращения к нему через Docker Compose;
- restart: unless-stopped– определяет, что контейнер будет автоматически перезапускаться, кроме случаев его остановки вручную;
- ports: - "80:80" - "443:443"– описывает проброс портов 80 и 443 с хоста в контейнер, чтобы Nginx мог принимать HTTP и HTTPS-запросы извне;
- ./nginx.conf:/etc/nginx/nginx.conf:ro– данный параметр из секции- volumesотвечает за подключение локального конфигурационного файла Nginx внутрь контейнера в режиме только для чтения;
- /etc/letsencrypt:/etc/letsencrypt:ro– тоже параметр из секции- volumes, который монтирует каталог с сертификатами SSL для того, чтобы Nginx мог их использовать, и также в режиме только для чтения;
- depends_on: - pdfding– гарантирует, что контейнер PdfDing будет запускаться перед запуском контейнера Nginx для корректной работы проксирования.
Настройка конфигурации обратного прокси Nginx
Закройте файл docker-compose.yml, сохранив внесённые изменения, после чего в текущем каталоге создайте конфигурационный файл Nginx:
$ nano nginx.confВ нашем примере конфигурация Nginx как обратного прокси выглядит так:
events {}
http {
    server {
        listen 80;
        server_name your-site-name.ru;
        location / {
            proxy_pass http://pdfding:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    server {
        listen 443 ssl;
        server_name your-site-name.ru;
        ssl_certificate /etc/letsencrypt/live/your-site-name.ru/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/your-site-name.ru/privkey.pem;
        location / {
            proxy_pass http://pdfding:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}Здесь:
- events {}– обязательный блок Nginx, который управляет обработкой соединений (в данном случае используется минимальная стандартная конфигурация);
- первая секция serverотвечает за работу с HTTP-запросами:- listen 80– слушает запросы на порту 80 для домена- your-site-name.ru(директива- server_name);
- proxy_pass http://pdfding:8000– все входящие запросы перенаправляются к контейнеру- pdfdingна порт 8000;
- proxy_set_header– данные директивы передают реальный хост и IP-адрес клиента, чтобы веб-приложение видело корректную информацию о запросе;
 
- вторая секция serverотвечает за работу с HTTPS-запросами:- listen 443 ssl– слушает HTTPS-запросы на порту 443, так же для домена- your-site-name.ru(директива- server_name);
- ssl_certificateи- ssl_certificate_key– параметры содержат пути к сертификату и закрытому ключу для шифрования соединений;
- proxy_pass http://pdfding:8000и- proxy_set_header– директивы проксируют запросы к- pdfding:8000, передавая заголовки- Hostи реальный IP-адрес клиента.
 
Проверка доступа по HTTPS
По окончании работы с файлом закройте его с сохранением и запустите контейнеры, описанные в docker-compose.yml:
$ sudo docker compose up -dВывести на экран их текущее состояние можно командой:
$ sudo docker psВ столбце STATUS должно быть значение Up.

Если контейнеры работают, откройте браузер и перейдите на https://your-site-name.ru, где вместо your-site-name.ru укажите доменное имя своего сайта PdfDing.

Сообщение вида Подключение защищено в навигационной строке браузера говорит о том, что доступ к веб-интерфейсу приложения теперь осуществляется с использованием протокола HTTPS.
