erp-platform/configs/deployment/README.md

319 lines
12 KiB
Markdown
Raw Normal View History

2025-05-06 06:45:49 +00:00
# 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.net
- 192.168.1.6
- kurs:ChatR+...
1. Dev
- platform-dev-cdn.sozsoft.net
- platform-dev-api.sozsoft.net
- platform-dev.sozsoft.net
- 192.168.1.106
- kurs:ChatR+...
1. Prod
- platform-cdn.sozsoft.net
- platform-api.sozsoft.net
- platform.sozsoft.net
- 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.net 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 sedat@sozsoft.com --agree-tos -d sozsoft.net -d *.sozsoft.net
sudo su
cd /etc/letsencrypt/archive
chgrp docker -R sozsoft.net
chown kurs -R sozsoft.net
```
Sertifika ortam makinalarına manuel olarak kopyalanır
- DevOps makinasından sertifikalar indirilir (indirmek için sudo su, cp -R /etc/letsencrypt/archive/sozsoft.net /home/kurs)
- Ortam makinasına /home/kurs 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.
### 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.net",
"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.net"]
}
```
- 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
```
- app.ini dosyasında server kısmı şu şekilde olmalı
```ini
[server]
APP_DATA_PATH = /data/gitea
DOMAIN = devops.sozsoft.net
SSH_DOMAIN = devops.sozsoft.net
DISABLE_SSH = false
SSH_PORT = 222
SSH_LISTEN_PORT = 22
LFS_START_SERVER = true
LFS_JWT_SECRET = CDy3ldC2cTbYHalO_dH68QJseoD7dGvH9x0Zx9aq2J0
OFFLINE_MODE = true
PROTOCOL=https
HTTP_PORT = 443
ROOT_URL = https://devops.sozsoft.net/
CERT_FILE = /etc/ssl/cert1.pem
KEY_FILE = /etc/ssl/privkey1.pem
```
### Diğer yapılandırmalar
2025-05-06 08:04:37 +00:00
- Base image build ve push
2025-05-06 06:45:49 +00:00
```sh
docker build -t devops.sozsoft.net/sozsoft/base-image:latest -f Kurs.WorkflowBaseImage.Dockerfile .
docker push devops.sozsoft.net/sozsoft/base-image:latest
```
- Docker login işlemi "bot" kullanıcı ile yapılır. SSH yapılır. `docker login devops.sozsoft.net`
- 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.net"
```
2025-05-06 08:04:37 +00:00
- Yukarıdaki komutun çıktısı olan ".pub" dosyasıdır. Bu dosyanın içeriği devops.sozsoft.net repository nin Deploy key sekmesine eklenir.
2025-05-06 06:45:49 +00:00
`cat ~/.ssh/id_ed25519.pub`
- https://devops.sozsoft.net/Sozsoft/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.net:222/Sozsoft/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.net/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.net`
- 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.net/sozsoft/kurs-platform-api:1.0.0 \
-t devops.sozsoft.net/sozsoft/kurs-platform-api:latest \
-f Kurs.Platform.HttpApi.Host.Dockerfile .
docker push devops.sozsoft.net/sozsoft/kurs-platform-api:1.0.0
docker push devops.sozsoft.net/sozsoft/kurs-platform-api:latest
docker build \
-t devops.sozsoft.net/sozsoft/kurs-platform-migrator:1.0.0 \
-t devops.sozsoft.net/sozsoft/kurs-platform-migrator:latest \
-f Kurs.Platform.DbMigrator.Dockerfile .
docker push devops.sozsoft.net/sozsoft/kurs-platform-migrator:1.0.0
docker push devops.sozsoft.net/sozsoft/kurs-platform-migrator:latest
cd ~/kurs-platform/ui
docker build \
-t devops.sozsoft.net/sozsoft/kurs-platform-ui:1.0.0 \
-t devops.sozsoft.net/sozsoft/kurs-platform-ui:latest \
-f Kurs.Platform.Ui.Dockerfile --build-arg ENV=dev .
docker push devops.sozsoft.net/sozsoft/kurs-platform-ui:1.0.0
docker push devops.sozsoft.net/sozsoft/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.net/sozsoft/kurs-platform-api:1.0.0 -f Kurs.Platform.HttpApi.Host.Dockerfile .
- docker build -t devops.sozsoft.net/sozsoft/kurs-platform-migrator:1.0.0 -f Kurs.Platform.DbMigrator.Dockerfile .
- docker build -t devops.sozsoft.net/sozsoft/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.net
- docker push devops.sozsoft.net/sozsoft/kurs-platform-api:1.0.0
- docker push devops.sozsoft.net/sozsoft/kurs-platform-migrator:1.0.0
- docker push devops.sozsoft.net/sozsoft/kurs-platform-ui:1.0.0
## 7.2. SSL olmayan registry'e bağlanma
```sh
cd ~/
touch daemon.json
{
"insecure-registries": ["devops.sozsoft.net"]
}
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"`