diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..474692e --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,35 @@ +name: Backend Deploy 🚀 +run-name: ${{ gitea.actor }} backend güncelliyor... + +on: + push: + branches: + - main + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + steps: + - name: Kodu Çek + uses: actions/checkout@v3 + + - name: Docker Build + # Dockerfile'ı kullanarak imajı oluşturuyoruz + run: docker build -t backend-proje:latest . + + - name: Eski Konteyneri Sil + # İlk seferde hata vermemesi için '|| true' ekledik + run: docker rm -f backend-container || true + + - name: Yeni Versiyonu Başlat + # Secrets kısmından şifreleri alıp konteynere veriyoruz + run: | + docker run -d \ + --name backend-container \ + --restart always \ + --network gitea \ + -p 1501:3000 \ + -e DATABASE_URL='${{ secrets.DATABASE_URL }}' \ + -e REDIS_HOST='${{ secrets.REDIS_HOST }}' \ + -e REDIS_PORT='6379' \ + backend-proje:latest \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 1f092e0..70af6d5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,49 +1,56 @@ -# Build stage +# --- Build Stage --- FROM node:20-alpine AS builder WORKDIR /app -# Copy package files -COPY package*.json ./ +# Raspberry Pi ve Prisma uyumluluğu için gerekli kütüphaneler +RUN apk add --no-cache openssl libc6-compat -# Install dependencies +# Paket dosyalarını kopyala +COPY package*.json ./ RUN npm ci -# Copy source code +# Kaynak kodları kopyala COPY . . -# Generate Prisma client +# Prisma client üret (Database şeman için şart) RUN npx prisma generate -# Build the application +# Build al (NestJS/Backend için) RUN npm run build -# Production stage +# --- Production Stage (Canlı Sistem) --- FROM node:20-alpine AS production +# Prisma için gerekli kütüphaneleri buraya da ekliyoruz +RUN apk add --no-cache openssl libc6-compat + WORKDIR /app -# Copy package files COPY package*.json ./ -# Install production dependencies only +# Sadece production (canlıda lazım olan) paketleri kur RUN npm ci --only=production -# Copy Prisma schema and generate client +# Prisma şemasını taşı ve client üret COPY prisma ./prisma RUN npx prisma generate -# Copy built application -COPY --from=builder /app/dist ./dist +# Build edilen dosyaları taşı (Senin Dockerfile'ındaki yapıya sadık kaldım) +# Güvenlik için dosyaları 'node' kullanıcısına zimmetliyoruz +COPY --chown=node:node --from=builder /app/dist ./dist -# Copy i18n files -COPY --from=builder /app/src/i18n ./dist/i18n +# Eğer i18n varsa onu da taşı +COPY --chown=node:node --from=builder /app/src/i18n ./dist/i18n -# Set environment +# Ortam değişkeni ENV NODE_ENV=production -# Expose port +# Portu aç EXPOSE 3000 -# Start the application -CMD ["node", "dist/main.js"] +# Güvenlik: Root yerine 'node' kullanıcısına geç +USER node + +# Uygulamayı başlat +CMD ["node", "dist/main.js"] \ No newline at end of file diff --git a/mds/deploy.md b/mds/deploy.md new file mode 100644 index 0000000..6105f56 --- /dev/null +++ b/mds/deploy.md @@ -0,0 +1,75 @@ +🏗️ Backend Altyapı Kurulum Rehberi (Database & Redis) +Bu doküman, Raspberry Pi üzerinde yeni bir Backend projesi için gerekli olan kalıcı veritabanı ve Redis servislerinin nasıl kurulacağını anlatır. + +⚠️ Mantık: Bu servisler deploy sürecine dahil EDİLMEZ. Sunucuda bir kere kurulur, verileri kalıcı olarak saklar ve Backend projesi buraya bağlanır. + +1. Hazırlık: Docker Ağı Kontrolü +Tüm servislerin (Gitea, App, DB, Redis) birbirini görebilmesi için ortak bir ağda olmaları gerekir. + +Bash +# Ağ var mı kontrol et (Listede 'gitea' yazmalı) +docker network ls + +# Yoksa oluştur: +docker network create gitea +2. PostgreSQL Veritabanı Kurulumu (Kalıcı) +Her yeni proje için port çakışması yaşamamak adına konteyner ismini ve volume ismini projeye özel değiştir. + +Değiştirilecek Yerler: proje-db-ismi, DB_KULLANICI, DB_SIFRE, DB_ADI + +Bash +docker run -d \ + --name proje-adi-postgres \ + --restart always \ + --network gitea \ + -e POSTGRES_USER=db_kullanici \ + -e POSTGRES_PASSWORD=cok_guclu_sifre \ + -e POSTGRES_DB=proje_db_adi \ + -v proje_adi_db_data:/var/lib/postgresql/data \ + postgres:16-alpine +Not: -p (Port) parametresi eklemedik. Çünkü dış dünyaya kapalı olsun, sadece bizim uygulamamız (aynı ağdaki) erişebilsin istiyoruz. Güvenlik için en iyisi budur. + +3. Redis Kurulumu (Kalıcı) +Redis için de projeye özel bir isim veriyoruz. + +Bash +docker run -d \ + --name proje-adi-redis \ + --restart always \ + --network gitea \ + -v proje_adi_redis_data:/data \ + redis:7-alpine +4. Gitea Secrets Ayarları (Bağlantı) +Veritabanlarını kurduktan sonra Gitea'da Ayarlar -> Actions -> Secrets kısmına gidip aşağıdaki bilgileri ekle. + +🔑 Secret 1: DATABASE_URL +Uygulamanın veritabanını bulması için gerekli bağlantı cümlesi. + +Format: postgresql://KULLANICI:SIFRE@KONTEYNER_ADI:5432/DB_ADI?schema=public + +Örnek (Yukarıdaki kuruluma göre): postgresql://db_kullanici:cok_guclu_sifre@proje-adi-postgres:5432/proje_db_adi?schema=public + +Dikkat: localhost veya IP yerine direkt kurduğun konteyner ismini (proje-adi-postgres) yazıyoruz. Docker isimden tanır. + +🔑 Secret 2: REDIS_HOST +Uygulamanın Redis'i bulması için. + +Değer: proje-adi-redis + +5. Sorun Giderme (Debug) +Eğer bağlantı hatası alırsan şu komutlarla kontrol et: + +Veritabanı ayakta mı? + +Bash +docker ps | grep postgres +Veritabanı loglarını incele: + +Bash +docker logs --tail 50 proje-adi-postgres +Veritabanını sıfırlamak (Silip baştan kurmak) istersen: + +Bash +# DİKKAT: TÜM VERİ SİLİNİR! +docker rm -f proje-adi-postgres +docker volume rm proje_adi_db_data \ No newline at end of file