~/ziphub — zsh
ZipHub·~/catalog~/articles~/feed~/sellers~/hire
auth login
[article]category · new-cat

Cloudflare Tunnel с Docker Compose: безопасный доступ к контейнерам без открытых портов

@dignezzz · author2 min read2026-03-15free

TL;DR: Как настроить Cloudflare Tunnel с помощью Docker Compose и обеспечить защищённый HTTPS-доступ к вашим контейнерам без проброса портов.

Введение

Cloudflare Tunnel позволяет надёжно публиковать ваши локальные сервисы в интернете, не открывая порты и не обрабатывая HTTPS вручную. В этом гайде вы научитесь настраивать туннель в связке с Docker Compose, чтобы автоматически проксировать доступ к нужным контейнерам, как будто это обычный публичный сайт.

Зачем это нужно

  • Нет белого IP — и не надо.
  • Никакого проброса портов на роутере или в фаерволе.
  • Cloudflare даёт HTTPS, WAF, защиту от DDoS и ботов.
  • Всё можно запускать в контейнерах — без лишней настройки nginx, certbot и прочего.

Пример: публикуем веб-приложение через туннель

Допустим, у нас есть контейнер my-app, который работает на http://my-app:3000. Мы хотим, чтобы он был доступен по https://app.example.com.

Шаг 1. Подготовка Cloudflare

  1. Зарегистрируйтесь и добавьте домен в Cloudflare.

  2. Установите cloudflared локально и выполните авторизацию:

bash
1cloudflared login
  1. Создайте туннель:
bash
1    cloudflared tunnel create my-tunnel
  1. Привяжите DNS:
bash
1    cloudflared tunnel route dns my-tunnel app.example.com
  1. Скопируйте .json-файл с credentials (обычно находится в ~/.cloudflared/) в директорию проекта, например, ./cloudflared.

Шаг 2. Структура проекта

yaml
1project/
2├── docker-compose.yml
3├── cloudflared/
4   ├── config.yml
5   └── <тут ваш tunnel-id>.json
6

Шаг 3. config.yml — конфиг туннеля

yaml
1tunnel: my-tunnel
2credentials-file: /etc/cloudflared/<тут ваш tunnel-id>.json
3
4ingress:
5  - hostname: app.example.com
6    service: http://my-app:3000
7  - service: http_status:404

Шаг 4. docker-compose.yml

yaml
1version: '3.8'
2
3services:
4  my-app:
5    image: your-image
6    container_name: my-app
7    expose:
8      - 3000
9    networks:
10      - app-network
11
12  cloudflared:
13    image: cloudflare/cloudflared:latest
14    container_name: cloudflared
15    restart: always
16    command: tunnel --config /etc/cloudflared/config.yml run
17    volumes:
18      - ./cloudflared:/etc/cloudflared
19    networks:
20      - app-network
21
22networks:
23  app-network:
24    driver: bridge

Шаг 5. Запуск

bash
1docker compose up -d

Теперь при переходе на https://app.example.com вы попадёте в ваш контейнер my-app, не открывая портов наружу.

Заключение

Использование Cloudflare Tunnel в связке с Docker Compose позволяет:

  • Упростить публикацию сервисов.
  • Убрать необходимость ручной настройки HTTPS.
  • Увеличить безопасность без танцев с iptables и nginx.

Всё работает в контейнерах — прозрачно и без магии. Отличный способ проксировать административки, панели или API, которые не хочется выставлять напрямую.

~2 min read · scroll to continue ↓

## discussion

$ topics --entity=article0
sign in to start or join a discussion
No discussions yet — start one to break the ice.
↑↓ nav open⌘K palettei install? help