# 1. SSH Config `~/.ssh/config` dosyası içeriği ``` Host DevOps HostName 192.168.1.6 User kurs Host PlatformDev HostName 192.168.1.106 User kurs Host PlatformProd HostName 192.168.1.137 User kurs ``` # 2. Altyapı 1. DevOps - devops.sozsoft.com - 192.168.1.6 - kurs:ChatR+... 1. Dev - platform-dev-cdn.sozsoft.com - platform-dev-api.sozsoft.com - platform-dev.sozsoft.com - 192.168.1.106 - kurs:ChatR+... 1. Prod - platform-cdn.sozsoft.com - platform-api.sozsoft.com - platform.sozsoft.com - 192.168.1.137 - kurs:ChatR+... # 3. Kurulum Buradaki maddeler tüm makinalarda başlangıçta yapılır. ## 3.1. Firewall ve SSH - https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys-on-ubuntu-22-04 - Client makinasında anahtarların oluşturulması gerekiyor. Client makinada ssh_keygen komutu çalıştırılır dosya adı belirlenmezse C:\Users\sedat.ozturk\.ssh klasörün altında id_rsa ve id_rsa.pub isimli 2 dosya oluşturur. - Bu kısımda amaç C:\Users\sedat.ozturk\.ssh dosyasının içerisindeki id_rsa.pub dosyasının içeriğini Prod makinasındaki ~/.ssh klasöründeki authorized_keys dosyasının içerisine kopyalacaktır. - https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-22-04 - Bu sayfadaki kısımlar yapılmadı. Sunucu kurulumu sırasında root dışında ayrı bir kullanıcı zaten oluşturulmuştu. ## 3.2. Docker kurulumu - https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04 ```sh sudo apt update sudo apt install apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update apt-cache policy docker-ce sudo apt install docker-ce sudo systemctl status docker sudo usermod -aG docker ${USER} su - ${USER} ``` ## 3.3. Sertifika alma certbot ile otomatik sertifika bu şekilde alınıyor. Ancak 3 ayda bir aşağıdaki komutları manuel çalıştırıp üretilen txt yi DNS sozsoft.com domaine eklememiz gerekiyor. Bu işlemi otomatize edilebilecek şekilde reha bey ile görüşülecektir. ``` sudo apt-get remove certbot sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot sudo certbot certonly --manual --preferred-challenges=dns --email system@sozsoft.com --agree-tos -d sozsoft.com -d *.sozsoft.com sudo su cd /etc/letsencrypt/archive chgrp docker -R sozsoft.com chown ${USER} -R sozsoft.com ``` Sertifika ortam makinalarına manuel olarak kopyalanır - DevOps makinasından sertifikalar indirilir (indirmek için sudo su, cp -R /etc/letsencrypt/archive/sozsoft.com /home/${USER}) - Ortam makinasına /home/${USER} klasörüne yüklenir # 4. DevOps Makina Kurulumu DevOps platformu olarak, Forgejo, Gitea, OneDev, Harness gibi alternatifler değerlendirildi ve Github benzerliği, FOSS olması ve action yml'ları kullanabilmesi sebebiyle Forgejo seçildi. Bunun yanında OneDev de istenen bütün özellikleri barındırıyor, o da ikinci alternatif olarak seçildi. Aşağıdaki kod n8n çalışmadığı zaman kullanılacaktır. `docker run --rm -v kurs-devops_n8n_data:/data alpine chown -R 1000:1000 /data` ### Forgejo Kurulumu - https://forgejo.org/docs/next/admin/installation-docker/ - docker-compose-devops.yml dosyası kullanıldı (bunu git repo'dan manuel olarak kopyaladık) - Kullanıcılar eklendi, organizasyon oluşturuldu, BT takımı oluşturuldu ve organizasyona eklendi #### Runner yapılandırması - DevOps, PlatformDev ve PlatformProd makinaları için aşağıdaki yapılandırma yapıldı: - https://forgejo.org/docs/latest/admin/runner-installation/#oci-image-installation ```json { "id": 1, "uuid": "8407f0f8-f296-46af-adba-5ee88ffdfccd", "name": "devops", "token": "39f9af97febdd8ea131a3a65c4710e7682a79635", "address": "https://devops.sozsoft.com", "labels": ["devops:docker://code.forgejo.org/oci/alpine:3"] } ``` - forgejo-runner için config.yml /data klasöründe olmalı ve içeriği şu şekilde olmalı ```yaml runner: insecure: true ``` - aynı zamanda docker-compose'da forgejo-runner daemon --config /data/config.yml olarak çalıştırılmalı - daemon.json ~/forgejo-runner klasörüne kopyalanmalı ```json { "insecure-registries": ["devops.sozsoft.com"] } ``` - ardından docker-compose-forgejo-runner.yml içerisine docker-in-docker kısmına şu volume eklenmeli ```yaml volumes: - ./daemon.json:/etc/docker/daemon.json ``` - forgejo/data/gitea/conf/app.ini dosyasında server kısmı şu şekilde olmalı ```ini [server] APP_DATA_PATH = /data/gitea DOMAIN = devops.sozsoft.com SSH_DOMAIN = devops.sozsoft.com DISABLE_SSH = false SSH_PORT = 222 SSH_LISTEN_PORT = 22 LFS_START_SERVER = true LFS_JWT_SECRET = CDy3ldC2cTbYHalO_dH68QJseoD7dGvH9x0Zx9aq2J0 OFFLINE_MODE = true PROTOCOL=http HTTP_PORT = 3000 ROOT_URL = https://devops.sozsoft.com/ CERT_FILE = /etc/ssl/cert1.pem KEY_FILE = /etc/ssl/privkey1.pem ``` ### Diğer yapılandırmalar - Base image build ve push ```sh docker build -t devops.sozsoft.com/kurs/base-image:latest -f Kurs.WorkflowBaseImage.Dockerfile . docker push devops.sozsoft.com/kurs/base-image:latest ``` - Docker login işlemi "bot" kullanıcı ile yapılır. SSH yapılır. `docker login devops.sozsoft.com` - Git kurulumu - Aşağıdaki komut ile SSH anahtarı oluşturulur. Passphrase boş geçilerek oluşturulabilir. ```sh cd ~/ ssh-keygen -t ed25519 -C "platformdev/prod@sozsoft.com" ``` - Yukarıdaki komutun çıktısı olan ".pub" dosyasıdır. Bu dosyanın içeriği devops.sozsoft.com repository nin Deploy key sekmesine eklenir. `cat ~/.ssh/id_ed25519.pub` - https://devops.sozsoft.com/Kurs/kurs-platform/settings/keys kısmına Add New Key diyerek yapıştırılır. - Aşağıdaki komutlar sırasıyla çalıştırılır. ```sh git clone ssh://git@devops.sozsoft.com:222/Kurs/kurs-platform.git git config http.sslVerify false # Eğer lazım olursa kullanılabilir ``` ### Rocket Chat Sistemi Kurulumu - Rocket Chat ve Forgejo aynı makinaya kurulacağı için, yukarıda yapılan yapılandırmaların bazıları değiştirilmelidir. - Rocket Chat'siz yapılandırma "docker-compose-devops-forgejo.yml" de bulunmaktadır. Rocket Chat'li yapılandırma için "docker-compose-devops.yml" kullanılmalıdır. - Öncelikle 80 ve 443 artık forgejo tarafından değil nginx servisi tarafından dinlenmeli. Bu değişiklikl docker-compose dosyasında mevcut. - Forgejo HTTPS yapılandırması kaldırılarak, HTTPS kısmı nginx'e devredilmeli. Devops makinasında, ~/forgejo/data/gitea/conf/app.ini dosyasında şu değişiklikler yapılır: ```ini [server] PROTOCOL=http HTTP_PORT = 80 # CERT_FILE = /etc/ssl/cert1.pem # KEY_FILE = /etc/ssl/privkey1.pem ``` - Kurulumdan sonra default olarak Starter Plan ile başlıyor. https://chat.sozsoft.com/admin/subscription adresine giderek "Cancel Subscription"a basılmalı, böylece Community Edition kullanılamya başlanacaktır. - Setup Wizard'da admin kullanıcı olarak sedat.ozturk ve 1q... parolası seçilmiştir. # 5. Dev - Prod Ortam Makinaları Kurulumu Yeni bir ortam makina kurulumunda bir defaya mahsus yapılacaktır. - Api ve Ui projeleri için Dockerfile konfigürasyonu - api ve migrator için appsettings.Dev/Prod.json hazırlanır. - docker-compose-dev/production.yml dosyası hazırlanır. - ui için env.dev/production hazırlanır. - Yukarıda **Git Kurulumu** maddesinde adımlar izlenir. - Docker login işlemi "bot" kullanıcı ile yapılır. SSH yapılır. `docker login devops.sozsoft.com` - cd ~/kurs-platform/configs/deployment klasöründe komut çalıştırılır. `docker compose -f ./docker-compose-data.yml up -d` # 6. Deployment ## 6.1. Script ile Deployment Scriptler ile güncellemek için aşağıdaki bash dosyaları çalıştırılır, veya bir altta manuel güncelleme metodu kullanılabilir. Not: Eğer aşağıda kullanılan .sh dosyalarının içeriğinde bir güncelleme olduysa, son halinin çalışması için, çalıştırmadan önce manuel olarak git fetch && git pull yapılmalıdır. ### App DevOps Makinasında: `./kurs-platform/configs/deployment/scripts/1-devops-api.sh` `./kurs-platform/configs/deployment/scripts/1-devops-ui.sh dev/production` Dev / Prod Ortam Makinalarında: `./kurs-platform/configs/deployment/scripts/2-dev-app.sh` ### Migrator DevOps Makinasında: `./kurs-platform/configs/deployment/scripts/1-devops-migrator.sh` Dev / Prod Ortam Makinalarında: `./kurs-platform/configs/deployment/scripts/2-dev-migrator.sh` Seedleri çalıştırmak için sonuna "true" eklenir. Örn: `2-dev-migrator.sh true` ## 6.2. Manuel Deployment ### DevOps ```sh cd ~/kurs-platform git checkout master/branch git fetch && git pull cd ~/kurs-platform/api docker build \ -t devops.sozsoft.com/kurs/kurs-platform-api:1.0.0 \ -t devops.sozsoft.com/kurs/kurs-platform-api:latest \ -f Kurs.Platform.HttpApi.Host.Dockerfile . docker push devops.sozsoft.com/kurs/kurs-platform-api:1.0.0 docker push devops.sozsoft.com/kurs/kurs-platform-api:latest docker build \ -t devops.sozsoft.com/kurs/kurs-platform-migrator:1.0.0 \ -t devops.sozsoft.com/kurs/kurs-platform-migrator:latest \ -f Kurs.Platform.DbMigrator.Dockerfile . docker push devops.sozsoft.com/kurs/kurs-platform-migrator:1.0.0 docker push devops.sozsoft.com/kurs/kurs-platform-migrator:latest cd ~/kurs-platform/ui docker build \ -t devops.sozsoft.com/kurs/kurs-platform-ui:1.0.0 \ -t devops.sozsoft.com/kurs/kurs-platform-ui:latest \ -f Kurs.Platform.Ui.Dockerfile --build-arg ENV=dev . docker push devops.sozsoft.com/kurs/kurs-platform-ui:1.0.0 docker push devops.sozsoft.com/kurs/kurs-platform-ui:latest ``` ### Dev-Prod Ortam Makinaları ```sh cd ~/kurs-platform/configs/deployment docker compose -f docker-compose-app.yml -f docker-compose-app.dev.yml stop docker compose -f docker-compose-app.yml -f docker-compose-app.dev.yml rm -f #docker-compose-app.production.yml cd ~/kurs-platform git checkout master/branch git fetch && git pull cd ~/kurs-platform/configs/deployment docker compose -f docker-compose-app.yml -f docker-compose-app.dev.yml pull docker compose -f docker-compose-app.yml -f docker-compose-app.dev.yml up migrator -d docker compose -f docker-compose-app.yml -f docker-compose-app.dev.yml up -d ``` # 7. Docker Yardımcı Bilgiler ## 7.1.Komutlar - docker build -t devops.sozsoft.com/kurs/kurs-platform-api:1.0.0 -f Kurs.Platform.HttpApi.Host.Dockerfile . - docker build -t devops.sozsoft.com/kurs/kurs-platform-migrator:1.0.0 -f Kurs.Platform.DbMigrator.Dockerfile . - docker build -t devops.sozsoft.com/kurs/kurs-platform-ui:1.0.0 -f Kurs.Platform.Ui.Dockerfile --build-arg ENV=dev . - docker run -it --entrypoint /bin/sh kurs-platform-api - docker run -it --entrypoint /bin/sh --network kurs-platform_default kurs-platform-api --env ASPNETCORE_ENVIRONMENT=Development --port 8080:80 - docker run -it --entrypoint /bin/sh --network kurs-platform_default --env ASPNETCORE_ENVIRONMENT=Development kurs-platform-migrator - docker login devops.sozsoft.com - docker push devops.sozsoft.com/kurs/kurs-platform-api:1.0.0 - docker push devops.sozsoft.com/kurs/kurs-platform-migrator:1.0.0 - docker push devops.sozsoft.com/kurs/kurs-platform-ui:1.0.0 ## 7.2. SSL olmayan registry'e bağlanma ```sh cd ~/ touch daemon.json { "insecure-registries": ["devops.sozsoft.com"] } sudo cp daemon.json /etc/docker sudo systemctl stop docker sudo systemctl start docker ``` ## 7.3. Sunucu disk alanı yönetimi - Sunucuda kalan disk alanı belirli bir seviyenin altına inince bize alarm göndermeli. Şu an bu sistem tarafındaki sanallaştırma platformu üzerinden takip ediliyor. - Sunucuda neyin disk alanını kapladığını öğrenmek için: `cd / && sudo df -h` veya `cd / && sudo ncdu` Eğer yüklü değilse `sudo apt-get install ncdu` - Docker'da neyin ne kadar yer kapladığını görmek için: `docker system df` - Temizlemek için: `docker image prune -a --filter "until=24h"` `docker builder prune -a --filter "until=24h"`