12 KiB
1. SSH Config
~/.ssh/config dosyası içeriği
Host DevOps
HostName 192.168.1.6
User erp
Host PlatformDev
HostName 192.168.1.106
User erp
Host PlatformProd
HostName 192.168.1.137
User erp
2. Altyapı
- DevOps
- devops.sozsoft.com
- 192.168.1.6
- erp:ChatR+...
- Dev
- erp-dev-cdn.sozsoft.com
- erp-dev-api.sozsoft.com
- erp-dev.sozsoft.com
- 192.168.1.106
- erp:ChatR+...
- Prod
- cdn.sozsoft.com
- api.sozsoft.com
- sozsoft.com
- 192.168.1.137
- erp: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
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 erp-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
{ "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ı
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ı
{ "insecure-registries": ["devops.sozsoft.com"] } -
ardından docker-compose-forgejo-runner.yml içerisine docker-in-docker kısmına şu volume eklenmeli
volumes: - ./daemon.json:/etc/docker/daemon.json -
forgejo/data/gitea/conf/app.ini dosyasında server kısmı şu şekilde olmalı
[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
docker build -t devops.sozsoft.com/erp/base-image:latest -f Erp.WorkflowBaseImage.Dockerfile .
docker push devops.sozsoft.com/erp/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.
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/sozsoft/erp-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.
git clone ssh://git@devops.sozsoft.com:222/sozsoft/erp-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:
[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 ~/erp-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:
./erp-platform/configs/deployment/scripts/1-devops-api.sh
./erp-platform/configs/deployment/scripts/1-devops-ui.sh dev/production
Dev / Prod Ortam Makinalarında:
./erp-platform/configs/deployment/scripts/2-dev-app.sh
Migrator
DevOps Makinasında:
./erp-platform/configs/deployment/scripts/1-devops-migrator.sh
Dev / Prod Ortam Makinalarında:
./erp-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
cd ~/erp-platform
git checkout master/branch
git fetch && git pull
cd ~/erp-platform/api
docker build \
-t devops.sozsoft.com/sozsoft/erp-platform-api:1.0.0 \
-t devops.sozsoft.com/sozsoft/erp-platform-api:latest \
-f Erp.Platform.HttpApi.Host.Dockerfile .
docker push devops.sozsoft.com/sozsoft/erp-platform-api:1.0.0
docker push devops.sozsoft.com/sozsoft/erp-platform-api:latest
docker build \
-t devops.sozsoft.com/sozsoft/erp-platform-migrator:1.0.0 \
-t devops.sozsoft.com/sozsoft/erp-platform-migrator:latest \
-f Erp.Platform.DbMigrator.Dockerfile .
docker push devops.sozsoft.com/sozsoft/erp-platform-migrator:1.0.0
docker push devops.sozsoft.com/sozsoft/erp-platform-migrator:latest
cd ~/erp-platform/ui
docker build \
-t devops.sozsoft.com/sozsoft/erp-platform-ui:1.0.0 \
-t devops.sozsoft.com/sozsoft/erp-platform-ui:latest \
-f Erp.Platform.Ui.Dockerfile --build-arg ENV=dev .
docker push devops.sozsoft.com/sozsoft/erp-platform-ui:1.0.0
docker push devops.sozsoft.com/sozsoft/erp-platform-ui:latest
Dev-Prod Ortam Makinaları
cd ~/erp-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 ~/erp-platform
git checkout master/branch
git fetch && git pull
cd ~/erp-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/sozsoft/erp-platform-api:1.0.0 -f Erp.Platform.HttpApi.Host.Dockerfile .
- docker build -t devops.sozsoft.com/sozsoft/erp-platform-migrator:1.0.0 -f Erp.Platform.DbMigrator.Dockerfile .
- docker build -t devops.sozsoft.com/sozsoft/erp-platform-ui:1.0.0 -f Erp.Platform.Ui.Dockerfile --build-arg ENV=dev .
- docker run -it --entrypoint /bin/sh erp-platform-api
- docker run -it --entrypoint /bin/sh --network erp-platform_default erp-platform-api --env ASPNETCORE_ENVIRONMENT=Development --port 8080:80
- docker run -it --entrypoint /bin/sh --network erp-platform_default --env ASPNETCORE_ENVIRONMENT=Development erp-platform-migrator
- docker login devops.sozsoft.com
- docker push devops.sozsoft.com/sozsoft/erp-platform-api:1.0.0
- docker push devops.sozsoft.com/sozsoft/erp-platform-migrator:1.0.0
- docker push devops.sozsoft.com/sozsoft/erp-platform-ui:1.0.0
7.2. SSL olmayan registry'e bağlanma
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 -hveya
cd / && sudo ncdu
Eğer yüklü değilsesudo 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"