Cloudflare Tünelləri və Docker Swarm ilə Yüksək Mövcudluq

3 VPS nodunda Cloudflare Tünelləri və Docker Swarm istifadə edərək veb tətbiqləriniz üçün yüksək mövcudluq (HA) qurmaq üçün tam təlimat.

Xülasə

Bu təlimat aşağıdakıları istifadə edərək 3 VPS nodunda yüksək mövcudluqlu veb tətbiq qurmağı göstərir:

Bu quruluş tətbiqinizin ayrı-ayrı VPS nodları çöksə belə onlayn qalmasını təmin edir, bütün mövcud nodlarda avtomatik load balancing ilə.

Arxitektura

┌─────────────────┐
│   Cloudflare    │
│     Edge        │
└────────┬────────┘
         │ Load Balancing
    ┌────┴────┬────┬────┐
    │         │    │    │
┌───▼───┐ ┌──▼──┐ ┌▼───┐ ┌▼───┐
│ VPS 1 │ │VPS 2│ │VPS 3│ │ ... │
│ NC2   │ │NC3  │ │NC4  │ │     │
└───┬───┘ └──┬──┘ └┬───┘ └┬───┘
    │       │      │      │
    └───────┴──────┴──────┘
         Docker Swarm
         Overlay Network

Hər VPS işlədir:

Tələblər

İnfrastruktur

Cloudflare

Proqram təminatı

Quruluş

1. Docker Swarm-ı Başlat

Manager nodda (NC2-net):

docker swarm init --advertise-addr <MANAGER_IP>

Worker nodlarda (NC3-org, NC4-de):

docker swarm join --token <TOKEN> <MANAGER_IP>:2377

2. Overlay Şəbəkə Yarat

Inter-service kommunikasiya üçün attachable overlay şəbəkə yarat:

docker network create --driver overlay --subnet 10.0.1.0/24 --gateway 10.0.1.1 --attachable cloudflared-ha

3. Cloudflare Tunnel Token Al

  1. Cloudflare Zero Trust → Networks → Tunnels keç
  2. Yeni tunnel yarad və ya mövcud olanı istifadə et
  3. Tunnel tokenını kopyala

4. Cloudflared Konfiqurasyon Et

Cloudflared direktoriyanda .env faylı yarat:

TUNNEL_TOKEN=your_tunnel_token_here

Konfiqurasiya Faylları

cloudflared.yaml

services:
  cloudflared-ha:
    image: cloudflare/cloudflared:latest
    command: tunnel run
    env_file:
      - .env
    networks:
      - cloudflared-ha
    healthcheck:
      test: ["CMD", "cloudflared", "version"]
      interval: 60s
      timeout: 20s
      retries: 5
      start_period: 60s
      start_interval: 5s
    deploy:
      mode: replicated
      replicas: 3
      placement:
        max_replicas_per_node: 1
      restart_policy:
        condition: any

networks:
  cloudflared-ha:
    external: true

swarm.yaml

services:
  frontend:
    image: your-registry/frontend:latest
    env_file:
      - ./frontend/.env
    networks:
      - cloudflared-ha
    healthcheck:
      test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://127.0.0.1/health"]
      interval: 60s
      timeout: 20s
      retries: 5
      start_period: 60s
      start_interval: 5s
    deploy:
      mode: replicated
      replicas: 3
      placement:
        max_replicas_per_node: 1
      update_config:
        parallelism: 1
        delay: 10s
        order: start-first
      restart_policy:
        condition: any

  backend:
    image: your-registry/backend:latest
    env_file:
      - ./backend/.env
    networks:
      - cloudflared-ha
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 60s
      timeout: 20s
      retries: 5
      start_period: 60s
      start_interval: 5s
    deploy:
      mode: replicated
      replicas: 3
      placement:
        max_replicas_per_node: 1
      update_config:
        parallelism: 1
        delay: 10s
        order: start-first
      restart_policy:
        condition: any

networks:
  cloudflared-ha:
    external: true

Deploy

1. Cloudflared Stack-i Deploy Et

cd /path/to/cloudflared-ha
docker stack deploy -c cloudflared.yaml cloudflared

Deploy-i yoxla:

docker service ps cloudflared_cloudflared-ha

Hər nodda 1 replika işləməlidir.

2. Application Stack-i Deploy Et

cd /path/to/your-app
docker stack deploy -c swarm.yaml blog

Deploy-i yoxla:

docker service ps blog_frontend
docker service ps blog_backend

3. Cloudflare Tunnel Routes Konfiqurasyon Et

Cloudflare Zero Trust dashboard-da:

  1. Networks → Tunnels → Tunnelin keç
  2. Public Hostname əlavə et:
  3. API üçün Public Hostname əlavə et:

Yüksək Mövcudluğu Test Etmək

Bütün Connectorların Qeyd Olunduğunu Yoxla

Cloudflare dashboard → Networks → Connectors keç:

Traffik Distribusiyasını Test Et

Metod 1: Cloudflare Live Logs

  1. Zero Trust → Networks → Tunnels → Live logs keç
  2. Tətbiqinə bir neçə dəfə daxil ol
  3. Fərqli Connector ID-lərin requestləri idarə etdiyini müşahidə et
# Bir neçə request et
for i in {1..10}; do curl -I https://yourdomain.com; sleep 1; done

Fərqli connector ID-lərə traffikin paylandığını görməlisiniz.

Metod 2: Node Çatışmazlığını Simulyasyon Et

# Cloudflared-i 2 replikaya endir
docker service scale cloudflared_cloudflared-ha=2

# Saytın hələ də işlədiyini yoxla
curl -I https://yourdomain.com

# 3-ə geri qaytar
docker service scale cloudflared_cloudflared-ha=3

Metod 3: Service Replikalarını Yoxla

# Bütün service-lərin işlədiyini yoxla
docker service ls

# Fərdi service distribusiyasını yoxla
docker service ps cloudflared_cloudflared-ha
docker service ps blog_frontend
docker service ps blog_backend

Hər biri hər nodda 1 replika göstərməlidir.

Health Checkləri Test Et

# Service health-i yoxla
docker service ps blog_frontend --format "table \t"

# Fərdi konteyner health-i yoxla
docker inspect <container_id> --format ''

Şəbəkə Connectivity-sini Test Et

# Overlay şəbəkə konfiqurasiyasını yoxla
docker network inspect cloudflared-ha

# Konteynerlərin kommunikasiya edə biləcəyini yoxla
docker exec <frontend_container> wget -qO- http://backend:8000/health

Troubleshooting

Problem: Service-lər Bütün Nodalarda Başlamır

Simptomlar: Yalnız bəzi replikalar işləyir, digərləri rədd olunur

Həll:

# Şəbəkə konfiqurasiyasını yoxla
docker network inspect cloudflared-ha

# Şəbəkəni sil və yenidən yarat
docker network rm cloudflared-ha
docker network create --driver overlay --subnet 10.0.1.0/24 --gateway 10.0.1.1 --attachable cloudflared-ha

# Stack-ləri yenidən deploy et
docker stack rm cloudflared blog
docker stack deploy -c cloudflared.yaml cloudflared
docker stack deploy -c swarm.yaml blog

Problem: Health Checklər Uğursuz Olur

Simptomlar: Konteynerlər "health: starting" vəziyyətində qalır

Həll:

Problem: Cloudflared Qoşulmur

Simptomlar: Dashboard-da connectorlar disconnected göstərilir

Həll:

# Cloudflared loglarını yoxla
docker service logs cloudflared_cloudflared-ha -f

# Tunnel tokenının doğru olduğunu yoxla
# Nodlar arası şəbəkə connectivity-sini yoxla
# Overlay şəbəkəsinin işlədiyini yoxla

Problem: Traffik Distribusiyası Yoxdur

Simptomlar: Bütün traffik tək connectora gedir

Həll:

Ən Yaxşı Təcrübələr

1. Resurs Limitləri

Resource exhaustionsun qarşısını almaq üçün resource constraint-lər əlavə et:

deploy:
  resources:
    limits:
      cpus: '0.5'
      memory: 512M
    reservations:
      cpus: '0.25'
      memory: 256M

2. Update Strategiyası

Zero-downtime deploy-lər üçün rolling updates istifadə et:

update_config:
  parallelism: 1
  delay: 10s
  order: start-first
  failure_action: rollback

3. Monitorinq

4. Təhlükəsizlik

5. Backup Strategiyası

Nəticə

Bu HA quruluşu təmin edir:

Docker Swarm və Cloudflare Tünellərinin birləşməsi nod uğursuzluqları zamanı service mövcudluğunu saxlayan güclü, production-ready infrastruktur yaradır.

Əlavə Resurslar