Caddy - Dosya ve Tekil Vekil Sunucusu (Sanallaştırmalı Çözüm)

 Caddy Go dilinde yazılmış çok kullanışlı bir sunucu. Lokal ve Uzak dosya sunucusu hizmeti verebildiği gibi reverse proxy (ters vekil sunucu) hizmeti de verebiliyor.Hem de tüm bunları otomatik https üzerinden ve düzenli güncelleme garantisi ile.

Caddy yönetimini Caddyfile dediğimiz bir dosya üzerinden sağlıyoruz. 

Dosyaya çeşitli konfigurasyonlar ekleyerek sunucunun davranışını düzenliyoruz. Herşey oldukça kolay.

Ön şart olarak sunucumuzun  çalışması için isteklerin DNS kayıtları üzerinden yönlendirilmesi gerekiyor. 

Biz testimizi lokalde yapacağımız için windows ta host file ımızı kullanıp bir domain yönlendirmesi ile  requesti localimizde tutabiliriz. 

Bu requesti, üreteceğimiz iki adet docker container ile ters vekil sunucu yük dağıtmasini yapalım.

Şimdi hızlıca notepad ı administrator modunda açıp abc.com u lokalimize yönlendirelim.Sonra muhakkak silmeyi unutmayın :)

Not: Burada niyetimiz ilk https testinde sertifika oluşumunun sürecini görebilmek. Dilerseniz hiç karıştırmadan localhost çağrısı yapıp bu kismi atlayabilirsiniz.


Şimdi ise githubdan projemizi indirebiliriz.

https://github.com/Gmotes/CaddyTest

Yapılan işlerimizi kısaca özetleyelim;

Node projesi için yapılanlar

1-) npx express-generator ile projemizi oluşturduk.

2-) Environment yönetimi için "dotenv" ı package.json a ekledik. App.js e de konfigurasyon olarak ekleyelim.


require('dotenv').config();


3-) .env , .env.server1 ve .env.server2 dosyalarımızı ekleyelim. 

4-) app.js dosyamıza

       Caddy in kullanacağı healthcheck servisi ve load balance testini yapacağımız getMessage servisini ekliyoruz.

app.use('/healthcheck'function (reqres) {
  res.status(200);
  res.json({
      health: 'ok'
  });
});

var port = process.env.PORT || 0
var message = process.env.MESSAGE || 4000

app.use('/getMessage'function (reqres) {
  res.status(200);
  res.json({
      serverMessage: 'I am  '+message+' port '+port
  });
});

Node.js projesi için bu işlemler yeterli.


Sanallaştırma ve Caddyfile işlemleri

Caddyfile;

Bu kısımda dikkat edilmesi gereken eğer domain i özellikle http olarak belirtmez iseniz Caddy in https üzerinde reverse proxy yapacağı. Eğer host dosyasını değiştirmiş iseniz başına http eklemeyerek  

https://caddyserver.com/docs/automatic-https otomatik https loglarını takip edebilirsiniz. DNS tanımınız yanlış olduğu için sertifika oluşumu hata verecektir.

http://abc.com {

reverse_proxy server1:4000 server2:5000 {

lb_policy       random_choose 2

health_path     /healthcheck

health_interval 10s

}

}

Sanallaştırma

Dockerfile

FROM node:14

# Create app directory
RUN mkdir -p /usr/app/src

WORKDIR /usr/app/src



# Bundle app source
COPY / /usr/app/src
RUN rm -rf /usr/app/src/node_modules

RUN rm /usr/app/src/.env

#server1
RUN mv /usr/app/src/.env.server1 /usr/app/src/.env
#server2
#RUN mv /usr/app/src/.env.server2 /usr/app/src/.env


# Install
RUN npm install

# Run
CMD ["npm""start"]


İki build alıyoruz. Her seferinde server1 ve server2 için kapalı alanları açıp kapatıyoruz.

docker build -t server1 .

docker build -t server2 .

Son olarak ise Docker-compose.yml

version'3.5'

services:
# Run the caddy server        
  caddy:
    imagecaddy/caddy:2.2.1-alpine
    container_namecaddy-service
    restartunless-stopped
    ports:
      - "80:80"
      - "443:443"
    networks:
      - network1
    volumes:            
      - ./Caddyfile:/etc/caddy/Caddyfile
  server1:
    image'server1'
    container_nameserver1
    ports:
      - 4000:4000
    networks:
      - network1
  server2:
    image'server2'
    container_nameserver2
    ports:
      - 5000:5000
    networks:
      - network1
networks:
  network1:
    driverbridge


Bu dosyayı docker-compose up -d komutuyla çalıştırıyoruz. Compose içeriğindeki servisleri gözlemleyebiliriz.


Son olarak her iki sunucudan cevap aldığımızı da gözlemleyelim.





Yorumlar

Bu blogdaki popüler yayınlar

IONIC BAŞLANGIÇ

Cannot resolve the collation conflict between “Turkish_CI_AS” and “SQL_Latin1_General_CP1_CI_AS” in the equal to operation

Golang working with interfaces and functions -3