319 lines
12 KiB
Markdown
319 lines
12 KiB
Markdown
|
|
# 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
|
|||
|
|
|
|||
|
|
- Kurs base image build ve push
|
|||
|
|
|
|||
|
|
```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"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- Yukarıdaki komutun çıktısı olan ".pub" dosyasıdır. Bu dosyanın içeriği devpos.sozsoft.net repository nin Deploy key sekmesine eklenir.
|
|||
|
|
`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"`
|