Kategori arşivi: Sanallaştırma

Vmware ve Hyper-V hakkında, genel bilgiler, konfigürasyonlar, kurulum örnekleri, performans ayarları, ipuçları, hata çözümleri ve daha fazlası

CentOS 7 Kullanan Docker İmajlarında mirror hatasının giderilmesi

Biliyorsunuz CentOS 7 bugün EOL oldu ve kullanılamıyor. Geliştirme süreçlerinde ise hızlı aksiyon almanız gerekiyorsa ve hali hazırda kullandığınız yazılıma güncelleme gelmediyse aşağıdaki işlemleri yapın.

Hatadan örnek vermem gerekirse

  1. centos-sclo-rh paketini bulamıyor
  2. direk olarak mirrorliste erişemiyor.

Docker’da en kolay çözüm yöntemi ise şu şekilde kullanabilirsiniz.

# Workaround the fact that CentOS 7 is EOL
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* \
  && sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* \
  && yum-config-manager --disable centos-sclo-rh \
  && yum install epel-release -y
ShellScript

ESXi Routed VM Network Nasıl Oluşturulur?

ESXi kurulumunu ESXi Kurulumu Nasıl Yapılır? makalesi ile yaptınız ve servislerinizi dışarı açacaksanız ki özellikle subnet satın almışsanız makinede 1 Adet Router VM ihtiyacınız olacaktır. Bu VM alınan subnet’in internete çıkabilmesi amacıyla kullanılır ve zorunludur, aksi durumda tek tek ip adresi satın alınmalı ve servis sağlayıcısının DHCP sunucusundan ip adresi alınmalıdır. Bu örnekte Hetzner kullanıyor olacağım.

Bu Router VM bir MikroTik olabilir, router görevi gören bir Linux işletim sistemi olabilir ve/veya VyOS, OpenWRT, PfSense gibi çözümler olabilir. Bu örnekte ben MikroTik kullanıyorum.

Ücretlendirmesi sebebiyle, tekil ip satın alınmasını önermiyorum. Ancak yönlendirme amacıyla satın alınan 1 adet tekil ip üzerine “Separate MAC” isteği yapılması ve bu ip adresinin router VM’de kullanılması gereklidir. Genellikle sağlayıcı fark etmeksizin aynı işlem yapılmaktadır.

VM oluştururken verilen bu “00:50:56:00:4D:A9” mac adresi Router VM ethernet ayarlarında aşağıdaki gibi girilmelidir. Çünkü sağlayıcılar genellikle bu MAC adresleri üzerinden sizin istek yaptığınızı ve kim olduğunuzu belirler. Yani “Bridged Network” aslında sizin Uplinkinizdir.

Ağ Bağdaştırıcısı Ayarları Ekran Görüntüsü
  • Adapter Type VMXNET 3
  • MAC → Manual → Separate MAC number

“Bridged Network” Topolojisi, internete erişecek ana makine vSwitch aşağıdaki gibi gözükmelidir.

Sanal ağ köprüsü yapılandırması ve topolojisi.

“Routed Network” Topolojisi vSwitch üzerinde aşağıdaki gibi gözükmelidir.

Sanal ağ yapısı ve ayarları gösteriliyor.

Her iki Network’te aynı VLAN ID’de olmalıdır. Ben bu örneği yaparken VLAN yapılandırmadığım için 0 olarak bıraktım. Trafiği izole etmek için VLAN kullanabilirsiniz.

ESXi Kurulumu Nasıl Yapılır?

USB belleğimiz hazır olduktan sonra bilgisayarımızı yeniden başlatıyoruz. Bilgisayarımız/Sunucumuz yeniden başladıktan sonra ESXi 6.7 kurulum ekranı gelecektir. Tüm ESXi Sürümlerinde genellikle aynı kurulum adımları uygulanmaktadır. Enter tuşuna basarak kurulumu başlatıyoruz.

ESXi yükleyicisi yükleniyor, otomatik başlatma ekranı.

Bu aşamada yükleme için gerekli olan dosyaları sisteme yüklemek için biraz bekleyeceksiniz.

ESXi yükleyicisi yükleniyor ekran görüntüsü.

Her şey hazır olduğunda karşınıza aşağıdaki donanımı kontrol eden ekran gelecek.

VMware ESXi başlangıç ekranı ve sistem bilgileri.

Aşağıdaki ekran karşımıza gelecek burada Enter tuşuna basarak devam ediyoruz.

VMware ESXi 6.7.0 yükleme ekranı.

EULA’yı kabul ediyoruz.

VMware ESXi yükleyici EULA ekranı.

Sistemin kurulabileceği diskleri taraması için bir süre bekliyoruz. Çok kısa sürecek…

VMware ESXi kurulum ekranı cihaz taraması.

Kurulumu yapacağımız diski seçiyoruz. Benim kurulumu yapacağım disk sanal bir disk ve VMware Virtual S olarak görünüyor. Sizde farklı bir disk görünebilir. Ben şuan için sanal makine içerisine kuruyorum. Yani Nested yapıyorum. Diski seçtikten sonra Enter tuşuna basarak devam ediyoruz.

VMware kurulum ekranı ve disk seçimi

Kurulumu yapacağımız diski seçtikten sonra Enter tuşuna basarak devam ediyoruz. Klavye seçimi yapmamız lazım Türkçe olarak devam etmek gerekli seçimi yapıyoruz ve Enter tuşuna basıyoruz.

VMware kurulumu için klavye düzeni seçimi.

Root parolası belirliyoruz. Parolayı belirledikten sonra Enter tuşuna basarak devam ediyoruz.

VMware ESXi yükleyici parola ekranı.

Diskin üzerine kurulum yapılacağı için uyarı veriyor. F11 tuşuna basarak devam ediyoruz.

VMware ESXi 6.7.0 kurulum onay ekranı.

Son olarak kurulumu onaylıyoruz ve kurulum başlıyor.

VMware ESXi 6.7.0 kurulum ekranı.

Son olarak kurulumu onaylıyoruz ve Enter tuşuna basarak devam ediyoruz.

ESXi 6.7.0 Kurulum Tamamlandı Ekran Görüntüsü

Artık makinemiz başarılı bir şekilde kuruldu ve yeniden başlatılacak.

VMware ESXi kurulumunda sunucu yeniden başlatılıyor.

İlk kurulumda F2 tuşuna basarak ESXi 6.7 ayarlarını yapmamız gerekebilir. DHCP üzerinden ip alınan durumlarda F2 tuşuna basarak ayarlarımızı genel olarak gerek yoktur.

Kurulum tamamlandığında aşağıdaki gibi bir ekran karşımıza gelecektir. Bu ekran gelmişse kurulum başarılı olmuş demektir.

VMware ESXi sunucu yönetim ekranı görüntüsü.

Size verdiği ip adresi üzerinden ESXi Host arayüzüne erişebilirsiniz.

VMware ESXi giriş ekranı resmi

Belirlediğiniz bilgiler ile giriş yaptıktan hemen sonra ise gerekli yönetimsel işlevleri yapabilirsiniz.

VMware ESXi yönetim arayüzü ekran görüntüsü.

Bu anlatım yapılırken Vmware Workstation kullanılmıştır, sunucu kurulumları ile bire bir aynıdır sadece network ve disk yapılandırması değişiklik göstermektedir.

ESXi üzerinde route limit (100) reached Sorunu ve Çözümü

Sanal bir makine üzerinden BGP bağlantıları sağlıyorsanız ve yüklü miktarda linux makinenizde route listesi varsa özellikle aşağıdaki gibi uyarılar ile karşılaşacaksınız, bu durum cihazınızın diskinin şişmesine de ayrıca sebep olacak.

[2023-12-06T19:04:05.568Z] [ message] [vmsvc] [948164] RecordRoutingInfoIPv6: route limit (100) reached, skipping overflow.
[2023-12-06T19:04:35.569Z] [ message] [vmsvc] [948164] RecordRoutingInfoIPv6: route limit (100) reached, skipping overflow.
[2023-12-06T19:05:05.575Z] [ message] [vmsvc] [948164] RecordRoutingInfoIPv6: route limit (100) reached, skipping overflow.
[2023-12-06T19:05:35.569Z] [ message] [vmsvc] [948164] RecordRoutingInfoIPv6: route limit (100) reached, skipping overflow.
[2023-12-06T19:06:05.621Z] [ message] [vmsvc] [948164] RecordRoutingInfoIPv6: route limit (100) reached, skipping overflow.
Plaintext

VMware makineye bildiğiniz gibi vmware-tools kurar ki sistemdeki metrikleri toplayabilsin ve hataları izleyebilsin. Tabii router olarak kullanılan bir makinede routingi kapatmak daha sağlıklı gerekte yok zaten. Ki bu durum makinede 30 dakikada bir CPU fırlamasına da sebep oluyor onu da çözmüş oluyoruz.

/etc/vmware-tools/tools.conf içerisine aşağıdaki satırları ekliyoruz.

poll-interval = 0
max-ipv4-routes = 0
max-ipv6-routes = 0
Plaintext

Kaydedip kapatıyoruz, ardından makineye ufak bir reboot atıyoruz. Ardından her şey rayına girmiş oluyor ve sistemde bu şekilde uyarılar görmemeye başlıyoruz.

ESXi üzerinde Docker Swarm Overlay Network Sorunu ve Çözümü

Geçtiğimiz günlerde bir elasticsearch cluster kurarken başımızı ağrıtan bir durum oldu, gerçekten ilginç bir durumdu işletim sistemleri üzerine otomatik bir şekilde gerekli kurulumları yaptık ve haliyle makineleri docker swarm’a dahil ettik, bu noktada başımız ağrımaya başladı.

Sorun neydi?

Makineler birbiri ile doğru bir şekilde haberleşmiyordu, aşağıdaki gibi bir uyarı vermeye başladı

[WARN ][o.e.c.c.ClusterFormationFailureHelper] master not discovered yet

Ardından biraz gözlemleyelim belki master elasticsearch birşeyler yapıyordur ve yayına geçmemiştir dedik bir kaç dakika bekledik. Tabii bu sırada aşağıdaki gibi bir uyarı daha gözümüze ilişti

[WARN ][o.e.d.SeedHostsResolver ] [elasticsearch-master-1] failed to resolve host [elasticsearch-master.local]

Tam olarak olay burada koptu, biz her şekilde ip üzerinden erişiyorduk icmp paketleri vs her şekilde ulaşıyordu ve sorun gözükmüyordu. hostname ile curl atamıyorduk ama ip adresi ile curl atabiliyorduk. Bu durum haliyle bizi DNS’i kontrol etmeye itti ama konunun DNS ile hiç bir alakası yoktu.

Nelere bakıldı?

  • Makinelerin bir biri arasında network erişimlerini kontrol ettik
  • telnet aracılığı ile portların açık olup olmadığına baktık
  • traceroute ile trafiğin nereden geçtiği bizim yanlışlıkla bir firewall kuralı ile iletişimlerini kesmiş olabilir miyiz ona baktık.
  • DNS tarafını kontrol ettik, acaba swarm düzgün mü işlemiyor diye uzunca bir süre baktık.
  • Makinelerin firewall durumlarına baktık
  • Kurulumları otomatik yaptığımız için yanlış network kartını mı dinletiyoruz diye iki kez yapılandırmamızı kontrol ettik.

Nasıl Çözdük?

Her şeyi denemiştik, başladık internete araştırma yapmaya uzunca bir süre arama yaptıktan sonra bir makalede gözümüze bir şey ilişti giden paketlerde checksum kontrolünü kapattığında birisinin sorunu çözdüğünü gördük bende direk gittim aşağıdaki komutu çalıştırdım.

ethtool -K <interface> tx off

Bir baktık ki hakikaten sorun çözülüyor, erişim geliyordu buraya kadar bir sorun yoktu ancak kararlı çalışmıyordu. 1 saat kadar bu şekilde çalıştırdık ve biraz gözlemledik. Bazı makalelerde çözümün sanal makinelerde ağ kartını değiştirmek olduğunu önermişler, lakin ESXi’da VMXNET3 dışında kullanmak pek önerilmez çünkü vmware zaten bu network kartını tüm sistemler düzgün ve performanslı çalışsın diye yapıyor o sebeple hiç değiştirmedik bile.

Kesin çözüme ise ulaşmamız bu aşamadan sonra zor olmadı, araştırmaya devam ettiğimizde konuyla ilgili bir çözüm karşıladı bizi evet bulmamız biraz zaman aldı ancak nihayetinde çözdük sorunu.

docker swarm init --data-path-port=3888

VMware ortamınızda NSX çalıştırıyorsanız ki çoğu zaman çalışır “overlay networking” varsayılan olarak UDP port 4789‘u kullanır ve bu da VMware NSX’in VXLAN için iletişim portu ile çakışır sorunda işte burada başlar. Bu portu değiştirince her şey haliyle zart diye çözülmüş oldu.


Silinmeyen Docker Ağları Otomatik Olarak Nasıl Kaldırılır?

docker compose kurulumlarda çok fazla kullanılıyor pratikte çokta işe yarıyor ama zaman zaman hataya düşebiliyor, bir işlem yapıyorsunuz ve çakışmalara, aynı ağ adlarını almaya başlıyor.

Bu durumda docker güncellemelerinde ve/veya sistem güncellemelerinden sonra ortaya çıkıyor. Ağların ve konteyner’ların başlamasına engel oluyor.

Örnek bir hata mesajı

Sep 01 18:30:15 debian docker compose[2281641]: Removing network mertcan_default
Sep 01 18:30:15 debian docker compose[2281641]: network mertcan_default is ambiguous (2 matches found based on name)
Sep 01 18:30:16 debian systemd[1]: mertcan_default.service: Control process exited, code=exited, status=1/FAILURE

Aşağıdaki gibi yazdığımız ufacık bir python kodu ile sistemden başa bela olan bu ağları otomatik kaldırma işlemi yapabilirsiniz.

import subprocess
import json
import logging

logger = logging.getLogger(__name__)

output = subprocess.check_output(["docker", "network", "ls", "--format", "{{json .}}"])
networks = set()  # use a set to avoid duplicates

for line in output.decode("utf-8").splitlines():
    # check line is not empty
    if not line:
        logger.debug("Empty line found in docker network ls output (ignoring)")
        continue

    network = json.loads(line)
    if network["Name"] in networks:
        logger.info("Removing duplicate network: %s", network["Name"])
        subprocess.check_call(["docker", "network", "rm", network["Name"]])

    networks.add(network["Name"])

Kullanılan Özel Container Registrylerin Watchtower ile Güncellenmesi

Bazı şeyleri otomatize ederken oto deployun yanı sıra otomatik güncelleme yapmakta önemli, bunun için rsync veya ssh üzerinden güncelleme yapmak yerine direk olarak docker containerı güncelleyebilirsiniz.

Bu işlem için ise direk olarak docker container build etmemiz bizim için yeterli, uygulamamız bunun içerisinde çalışacak ve watchtower bunu otomatik güncelleyecek.

İmaj oluşturmak için .gitlab-ci.yml için aşağıdaki yapılandırmayı kullanabilirsiniz.

image: docker:latest

docker-build:
  stage: build

  before_script:
    - docker info
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"

  variables:
    DOCKER_DRIVER: overlay2
    DOCKER_TLS_CERTDIR: "/certs"
    IMAGE_TAG: $CI_REGISTRY_IMAGE:latest

  script:
    - docker build -t "$IMAGE_TAG" .
    - docker push "$IMAGE_TAG"

Bu yapılandırma direk olarak mastera gönderilen her kodu container haline getirecek ve gitlab “container registry” içerisine basacak. Burada çift branch kullanmanızı öneririm. dev ve master olarak yoksa otomatik güncellemede sorunlarla karşılaşabilirsiniz.

Dockerfile yapılandırmamız ise aşağıdaki gibi, NodeJS uygulamamız çalışıyor siz kendinize göre güzel bir yapılandırma uygulayın.

FROM node:17

RUN set -eux; \
  npm install -g pm2

COPY app .

RUN npm install

CMD ["pm2-runtime", "index.js"]

İşlemler tamamlandığında imajımız gitlab’da duracak, isterseniz bu imajı docker hub üzerinede gönderebilirsiniz, karar size kalmış. Gitlab kullandığımız için biz başka bir alanda barındırmak istemedik.

Otomatik güncelleştirme kısmına geldik aşağıdaki gibi bir docker-compose.yml dosyası işimizi fazlasıyla görecek

version: "3.7"
services:
  monit:
    image: developer-core-team/monitoring_v01
    container_name: core_monitoring
    restart: always
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /root/.docker/config.json:/config.json
    command: --interval 30

Yapılandırmayı kendinize göre özelleştirmekte özgürsünüz 30 saniyede bir container registrymiz kontrol edilecek varsa güncelleme alınacak, isterseniz bu süreyi arttırabilirsiniz.

Docker Notlarım

Docker CLI ve Docker Compose ile ilgili sıkça kullandığım komutlar yer almaktadır. bu komutları terminal aracınıza kaydedip snippet olarak kullanabilirsiniz. Termius ve xShell üzerinde işlemlerinizi yapabilirsiniz.

Sanal Makine İmajları Nasıl Dönüştürülür?

Geçenlerde Twitter üzerinden isyanımı belki görmüşsünüzdür, bazıları gidip OVA olarak sanal makine imajı yayınlıyor. Virtualbox dışında bunu direk olarak açmak imkansız. Herhangi bir sıkıştırma uygulaması ile dışarı çıkartabiliyorsunuz içerisinde VMware\’ye uygun bir iso çıkıyor bunu kullanabiliyorsunuz tabii

Peki benim gibi VMware kullanmayan birisi ne yapacak? Tabii ki başının çaresine bakmak zorunda kalacak, Hyper-V ve KVM kullananları kimse düşünmesin zaten biz kimiz ki…

facepalm

Neyse fazla uzatmaya gerek yok. Qemu kardeşimizin geliştirdiği imaj dönüştürme aracını kullanıp formatlar arasında değişiklik yapabiliyoruz. Özellikle Windows bir makinede qemu-img for Windows aracı ile bu işlemi basitçe yapabilirsiniz.

Aslında bu aracın ana amacı bütün sanallaştırma imajları arasında geçiş yapabilmeyi sağlamak. Genel anlamda aşağıdaki bütün uygulamalar için dönüştürme işlemi yapabiliyor.

  • Hyper-V
  • KVM
  • VMware
  • VirtualBox
  • Xen

Bu aracı ana yayıncı silebileceği için ben bir sürümünü kendi makinemde tutacağım qemu-img-win-x64-2_3_0.zip sürümüne her zaman ulaşabilirsiniz.

Desteklenen Disk Formatları

Imaj Formatı-f ve -o çıktı formatı
VMDK (VMware)vmdk
QCOW2 (KVM, Xen)qcow2
VHD (Hyper-V)vpc
VHDX (Hyper-V)vhdx
RAWraw
VDI (VirtualBox)vdi

Herhangi bir imajı VHDX formatına dönüştürmek

Bahsettiğim gibi istediğiniz imajı dönüştürebilirsiniz, yeter ki dönüştüreceğiniz disk imajı bozuk olmasın. Örneğin ben vmdk imajını direk olarak Hyper-V uyumlu VHDX formatına geçireceğim.

qemu-img.exe convert .\disk1.vmdk -O vhdx -o subformat=fixed disk1.vhdx

Bu işlem diskin boyutuna ve sisteminizin gücüne bağlı olarak biraz zaman alacak. Ama dönüştürme işlemi tamamlandığında gidip Hyper-V üzerinde imajı kullanabileceksiniz.

vmdk

Herhangi bir imajı VHD formatına dönüştürmek

Yukarıda kullandığım aynı VMware disk imajını gidip Hyper-V uyumlu olan bir diğer format olan VHD\’ye dönüştüreceğim. Fark ettiyseniz disk boyutlarını fixed olarak belirledim. Dönüştürme işlemlerinden hemen sonra diski Hyper-V ile düzenleyip isterseniz dynamic moda geçirebilirsiniz.

qemu-img.exe convert .\disk1.vmdk -O vpc -o subformat=fixed disk1.vhd

Bu işlemde yukarıda olduğu gibi sanal diskinizin boyutuna ve sisteminizin gücüne göre biraz zaman alacak ama düzgün bir şekilde dönüştürme işlemi tamamlanır rahat olun.

hyper-v

Bu işlemden sonra Windows bize VHD imajının bilgilerini verebilir, VHDX için henüz böyle bir özellik olmasa da VHD diskler için oldukça işlevsel.

Get-VHD .\disk1.vhd

Bu kod bize direk olarak VHD hakkında bilgileri ekrana aşağıdaki gibi basmakta.

windowsda

Artık sanal makine diskleri arasında nasıl geçiş yapabileceğinizi öğrendiniz, internette uyumlu imaj aramayı bırakabilirsiniz. Tabii gün sonunda dönüştürme işlemi başarılı olsa bile ön yükleyici bozulabilir bu gibi durumlarda elle aksiyon alıp örneğin *nix bir işletim sistemiyse grubu tamir edip sorunu çözebilirsiniz.

Az buçuk fikir almak isterseniz konu ile ilgili geçtiğimiz yıllarda kaleme aldığım Tatlı Bela Grub Rescue Hatası ve Hızlı Çözümü adlı makalemi kullanabilirsiniz.

Docker-compose Kullanarak Mevcut Docker Imajları Nasıl Güncellenir?

Birden fazla geliştirme ortamı kullandığımız ve imajların güncelliğini yitirdiği senaryolar olabiliyor, mevcut bir konteyneri silmek istemeyebiliriz. Kullanılan bu konteyner production ortamında çalışıyor ve üzerinde işlem yapılıyor olabilir.

Docker kardeşimizde imajlar geçici olacak şekilde tasarlanmıştır. Yani mevcut bir imajı güncellemek için eskisini mecbur kaldırır ve yenisini başlatırsınız.

Bu işlemi yapmak için aşağıdaki prosedürü izlemeniz yeterlidir.

docker-compose pull
docker-compose up -d --remove-orphans
docker image prune -f

Bir imajın indirilmesinin başarısız olacağı senaryolar olabilir, kesintilerin sizin için önemli olacağı senaryolar olabilir. Bu sebeple tekrar imajı composer üzerinden pull etmeden ayağa kaldırma komutumuzu vermiyoruz. Güncel imajı indirmek ve bunun üzerinden tekrar konteyner ayağa kaldırmak bizim için önemli.

Docker ile Gitea Git Sunucusu Nasıl Kurulur?

Gitea ile kendinize özgü kişiselleştirilmiş git sunucusu kurabilir, repolarınızı kendi bünyenizde barındırabilir siniz. Normalde kurulum biraz daha uzun ancak Docker kullanarak bu kurulumu sancısız atlatmak ve çok basit bir şekilde kullanmak mümkün

Resmi belgelendirmede paylaşılan docker-compose.yml dosyasının aksine ben uygulamayı lokalde çalıştırmayı seçtim ve dışarıya da NGINX ile açma yoluna gittim. Çalıştırmak için;

docker-compose up -d

Düzenlediğim dosya şu şekilde

version: "3"

networks:
  gitea:
    external: false

volumes:
  gitea:
    driver: local


services:
  server:
    image: gitea/gitea:latest
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - DB_TYPE=postgres
      - DB_HOST=db:5432
      - DB_NAME=gitea
      - DB_USER=gitea
      - DB_PASSWD=change-me
    restart: always
    networks:
      - gitea
    volumes:
      - gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "127.0.0.1:3000:3000"
      - "22:22"
    depends_on:
      - db

  db:
    image: postgres:latest
    restart: always
    environment:
      - POSTGRES_USER=gitea
      - POSTGRES_PASSWORD=change-me
      - POSTGRES_DB=gitea
    networks:
      - gitea
    volumes:
      - ./postgres:/var/lib/postgresql/data

Hemen ardından kullandığım, NGINX yapılandırma dosyası ise şu şekilde

server {
    listen                  443 ssl http2;
    listen                  [::]:443 ssl http2;
    server_name             git.mertcan.dev;
    root                    /var/www/git.mertcan.dev/public;

    # SSL
    ssl_certificate         /root/.acme.sh/mertcan.dev/fullchain.cer;
    ssl_certificate_key     /root/.acme.sh/mertcan.dev/mertcan.dev.key;
    ssl_trusted_certificate /root/.acme.sh/mertcan.dev/fullchain.cer;

    # reverse proxy
    location / {
        proxy_pass http://localhost:3000;
    }

}

Ardından NGINX yeniden başlattığınız anda kurulum ekranı karşınıza çıkacak, gerisi size kalmış durumda. Gitea uygulaması üzerinde yapacağınız değişiklikler için /var/lib/docker/volumes/gitea_gitea/_data/gitea/conf/ yolu içerisinde yer alan app.ini dosyasını değiştiriniz.

Docker Container Log Dosyalarının Boyutu Nasıl Küçültülür?

Yanlış yapılandırılan her docker konteyneri dışarıya yüklü miktarda log basar, disk alanı az olan sunucularda sistem yöneticileri güneşi hızlı bir şekilde görebilir ve servis kesintileri yaşayabilir.

Aşağıda yapacaklarımızdan hemen önce lütfen docker-compose dosyanız üzerinde gerekli olan ince ayarları yapınız, aksi taktirde yapacağınız bu işlemlerin log dosyalarının boyutunu düşürmede bir etkisi olmayacaktır.

logging:
      driver: "json-file"
      options:
        max-size: "1g"
        max-file: "10"

Bir müşteride mevcut logların boyutunu şu şekilde gördüm, burada anladığım kadarıyla 2 konteyner aktif olarak kullanılmış ve üzerinde ciddi anlamda işlem yapılmış ve log üretilmiş.

-rw-r----- 1 root root 40,2M 2020-08-20  /var/lib/docker/containers/cff872f1769dfed9c36d5f7e61627d2ff77973441325b07847fb4874ef1a0acf/cff872f1769dfed9c36d5f7e61627d2ff77973441325b07847fb4874ef1a0acf-json.log
-rw-r----- 1 root root 8,2M 2020-08-20  /var/lib/docker/containers/02a78f490f6b7ace252f3126689cf9200f488e94b909b9a2e5ee29613a1ee305/02a78f490f6b7ace252f3126689cf9200f488e94b909b9a2e5ee29613a1ee305-json.log
-rw-r----- 1 root root 3,3M 06-10 11:19 /var/lib/docker/containers/4cb9f353b394287dff456c1ce08d13c1a3206ad902e44eb5a5f3cd33e747320c/4cb9f353b394287dff456c1ce08d13c1a3206ad902e44eb5a5f3cd33e747320c-json.log
-rw-r----- 1 root root 578G 09-22 10:12 /var/lib/docker/containers/7e1bb748c785343f47511e08cb10aa676df09d4fc4abe1f371bc7b49a3d88b9d/7e1bb748c785343f47511e08cb10aa676df09d4fc4abe1f371bc7b49a3d88b9d-json.log

Bu loga ulaşmak için şu komutu kullandım

docker ps -aq | xargs -I'{}' docker inspect --format='{{.LogPath}}' '{}' | xargs ls -lh

Müşteri bana logların önemli olabilecek verileri uzak storageda tutabileceğini ve gerektiği kadarını silmemi (bence saçma, bir işine yaramaz bu log ama neyse)

cat /var/lib/docker/containers/*-json.log | bzip2 --best --compress --stdout > /mnt/nfs-storage-shared/2020-09-22.log.bz2

Ardından log dosyasını bölmem ve çoğunu kesmem gerektiği için apt install util-linux kurulumu yaptım(ilginç şekilde yüklü değildi), ardından fallocate ile dosyayı bölme işlemine geçiş yaptım ve aşağıdaki gibi büyük çoğunluğunu uçurdum.

fallocate --collapse-range --offset 0 --length 577GiB --verbose /var/lib/docker/containers/7e1bb748c785343f47511e08cb10aa676df09d4fc4abe1f371bc7b49a3d88b9d/7e1bb748c785343f47511e08cb10aa676df09d4fc4abe1f371bc7b49a3d88b9d-json.log

Böylelikle dosyada 1 GB‘lik kısmı bıraktım, ancak ben bunu yapıncaya kadar sistemde yapılan işlemler sebebiyle +4 GB kadar daha log birikmişti. Docker ile ilgilenen arkadaşa ilettim konuyu(ancak çözmemiş)

Otomatik log rotasyonu aktif edildiği taktirde bu makalede anlatılan çözümü yapmanıza gerek yok.