TGViewer
Записки IT специалиста Записки IT специалиста @interface31 · 8.99K subscribers
Post #5564 2.93K
Настраиваем TLS защиту собственного сервера Joplin

Вчера мы рассказали (https://t.me/interface31/5557), как быстро установить собственный сервер заметок Joplin при помощи Docker, но у него есть один недостаток – он работает по незащищенному протоколу HTTP и публично публиковать такие сервисы категорически не рекомендуется.

Как быть? Ничего сложного, технически Joplin Server – обычное веб-приложение, а следовательно все наши вопросы решит установленный перед ним обратный прокси и поддержкой HTTPS.

Вариантов тут великое множество, если у вас уже есть подобная инфраструктура, то имеет смысл рассматривать ее. Если же нет, то будем обходиться собственными силами и желательно сделать это максимально просто.

Исходя из этого мы решили использовать веб-сервер Caddy, почему именно его, а не NGINX/ Angie? Потому что Caddy предельно прост и вы это сами скоро увидите.

Так как мы уже используем Docker, то нет смысла разделять разные службы по разным местам, проще объединить их все в один compose-файл, что обеспечит проекту отличную управляемость и переносимость.

Поехали. Мы дадим инструкцию с нуля, если вы уже развернули Joplin-сервер, то часть шагов можно пропустить, но даже если вы их выполните ничего страшного и деструктивного не случится.

Создаем папку проекта и compose-файл в ней:

mkdir -p /opt/joplin
nano /opt/joplin/docker-compose.yml


Приводим его содержимое к следующему виду:

services:
db:
image: postgres:17
volumes:
- ./data/postgres:/var/lib/postgresql/data
restart: always
environment:
POSTGRES_PASSWORD: MyPa$$worD
POSTGRES_USER: joplin-user
POSTGRES_DB: joplindb

app:
image: joplin/server:latest
container_name: joplin-server
depends_on:
- db
restart: always
environment:
APP_PORT: 8080
APP_BASE_URL: https://joplin.example.com
DB_CLIENT: pg
POSTGRES_PASSWORD: MyPa$$worD
POSTGRES_DATABASE: joplindb
POSTGRES_USER: joplin-user
POSTGRES_PORT: 5432
POSTGRES_HOST: db

caddy:
image: caddy:2
restart: always
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro
- ./data/caddy:/data
- ./config/caddy:/config


Что изменилось в нем, кроме добавления секции caddy? Мы убрали проброс портов для контейнера Joplin, теперь он полностью изолирован во внутренней сети.

Также обратите внимание на APP_BASE_URL, теперь там https://joplin.example.com, т.е. явно указан протокол – HTTPS и отсутствует внутренний порт, потому что именно так мы будем обращаться к серверу через обратный прокси.

Следующим шагом следует создать конфигурационный файл для Caddy:

mkdir -p /opt/joplin/caddy
nano /opt/joplin/caddy/Caddyfile


После чего внесем в него следующее содержимое:

joplin.example.com {
reverse_proxy app:8080
}


И всё? И всё! Этим и хорош Caddy, не нужно ничего расписывать, он сам по умолчанию получит для указанного домена сертификаты Let’s Encrypt и настроит максимально надежное современное шифрование.

Сохраняем конфигурационный файл и запускаем проект:

docker compose up -d


Теперь открываем указанный в APP_BASE_URL адрес и убеждаемся, что наш сервер работает по защищенному протоколу с сертификатом Let’s Encrypt и максимальным уровнем шифрования.
  • 👍 27
  • ❤ 5
  • 🥱 4
  • 🤔 2
More from @interface31
  1. Oct 2, 2026Post #6832
  2. Oct 2, 2026Без лишнего шума и пыли вышла Aspia 3.0. Ключевые изменения в выжимке ниже: 1️⃣ Архитектур…
  3. Oct 2, 2026Post #6826
  4. Oct 1, 2026V2V миграция при помощи Vinchin Backup & Recovery Виртуализация сегодня – норма жизни, даж…
  5. Oct 1, 2026Post #6822
  6. Oct 1, 2026Проблема, как и статья не новая, но регулярно возникают вопросы. Не включается сетевое обн…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →