Deployment ve Uygulama Testi

Bu bölümde, geliştirdiğimiz e-ticaret uygulamasının Tomcat sunucusuna nasıl deploy edileceğini ve uygulamanın nasıl test edilip hata ayıklamasının yapılacağını detaylı olarak ele alacağız. Deployment süreci, geliştirme ortamından üretim ortamına geçiş için kritik bir aşamadır ve doğru yapılandırma ile sorunsuz bir şekilde gerçekleştirilmelidir.

Deployment Süreci Genel Bakış

E-ticaret uygulamamızın deployment süreci aşağıdaki adımları içerir:

  1. Backend (Spring Boot) Uygulamasının Derlenmesi: Spring Boot uygulamasının WAR dosyası olarak paketlenmesi.
  2. Frontend (Angular) Uygulamasının Derlenmesi: Angular uygulamasının üretim için optimize edilmiş statik dosyalar olarak derlenmesi.
  3. Tomcat Sunucusunun Kurulumu ve Yapılandırılması: Tomcat sunucusunun kurulması ve gerekli yapılandırmaların yapılması.
  4. Backend Uygulamasının Tomcat’e Deployment Edilmesi: WAR dosyasının Tomcat sunucusuna yüklenmesi.
  5. Frontend Uygulamasının Deployment Edilmesi: Derlenen Angular uygulamasının web sunucusuna yüklenmesi.
  6. Uygulama Testi ve Hata Ayıklama: Deployment edilen uygulamanın test edilmesi ve hataların giderilmesi.

Backend (Spring Boot) Uygulamasının Derlenmesi

Spring Boot uygulamasını Tomcat sunucusuna deploy etmek için, uygulamayı bir WAR (Web Application Archive) dosyası olarak paketlemeniz gerekir.

pom.xml Yapılandırması

Spring Boot uygulamanızın pom.xml dosyasında aşağıdaki değişiklikleri yapın:

<project>
    <!-- ... -->
    <packaging>war</packaging>
    
    <dependencies>
        <!-- ... -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <!-- ... -->
</project>

ServletInitializer Sınıfı

Spring Boot uygulamanızın kök paketinde bir ServletInitializer sınıfı oluşturun:

package com.example.ecommerce;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {
    
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(ECommerceApplication.class);
    }
}

WAR Dosyasının Oluşturulması

Spring Boot uygulamanızı WAR dosyası olarak derlemek için Maven veya Gradle kullanabilirsiniz:

Maven ile Derleme

cd /path/to/backend
mvn clean package -DskipTests

Bu komut, target dizininde bir WAR dosyası oluşturur (örneğin, ecommerce-0.0.1-SNAPSHOT.war).

Gradle ile Derleme

cd /path/to/backend
./gradlew clean build -x test

Bu komut, build/libs dizininde bir WAR dosyası oluşturur.

Frontend (Angular) Uygulamasının Derlenmesi

Angular uygulamasını üretim için derlemek, uygulamanın optimize edilmiş ve minimize edilmiş bir sürümünü oluşturur.

Üretim Ortamı Yapılandırması

Angular uygulamanızın üretim ortamı yapılandırmasını kontrol edin:

// src/environments/environment.prod.ts
export const environment = {
  production: true,
  apiUrl: 'https://api.example.com/api'
};

API URL’sini, backend uygulamanızın üretim ortamındaki URL’si ile değiştirin.

Angular Uygulamasının Derlenmesi

Angular uygulamanızı üretim için derlemek için:

cd /path/to/frontend
ng build --prod

Bu komut, dist/ dizininde optimize edilmiş ve minimize edilmiş statik dosyalar oluşturur.

Tomcat Sunucusunun Kurulumu ve Yapılandırılması

Tomcat, Java tabanlı web uygulamaları için popüler bir açık kaynak web sunucusudur.

Tomcat Kurulumu

Ubuntu/Debian Sistemlerde Kurulum

sudo apt update
sudo apt install tomcat9 tomcat9-admin

CentOS/RHEL Sistemlerde Kurulum

sudo yum install tomcat tomcat-webapps tomcat-admin-webapps

Manuel Kurulum

  1. Apache Tomcat web sitesinden en son Tomcat sürümünü indirin.
  2. İndirilen arşivi çıkarın:
tar -xvf apache-tomcat-9.0.x.tar.gz
mv apache-tomcat-9.0.x /opt/tomcat

Tomcat Yapılandırması

tomcat-users.xml

Tomcat yönetim arayüzüne erişim için kullanıcı ekleyin:

<!-- /opt/tomcat/conf/tomcat-users.xml -->
<tomcat-users>
    <!-- ... -->
    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <role rolename="admin-gui"/>
    <user username="admin" password="your_secure_password" roles="manager-gui,manager-script,admin-gui"/>
</tomcat-users>

server.xml

Tomcat’in port ve connector ayarlarını yapılandırın:

<!-- /opt/tomcat/conf/server.xml -->
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

context.xml

CORS ve diğer yapılandırmalar için context.xml dosyasını düzenleyin:

<!-- /opt/tomcat/conf/context.xml -->
<Context>
    <!-- ... -->
    <CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
                     sameSiteCookies="strict" />
    <!-- ... -->
</Context>

Tomcat Servisinin Başlatılması

# Systemd ile
sudo systemctl start tomcat9

# Manuel kurulum için
/opt/tomcat/bin/startup.sh

Backend Uygulamasının Tomcat’e Deployment Edilmesi

Spring Boot uygulamanızı Tomcat sunucusuna deploy etmek için birkaç yöntem vardır.

Tomcat Web Yönetim Arayüzü ile Deployment

  1. Web tarayıcınızda Tomcat yönetim arayüzüne gidin: http://your_server:8080/manager/html
  2. Kullanıcı adı ve şifrenizi girin (tomcat-users.xml dosyasında yapılandırdığınız).
  3. “WAR file to deploy” bölümünde, “Choose File” düğmesine tıklayın ve WAR dosyanızı seçin.
  4. “Deploy” düğmesine tıklayın.

Tomcat webapps Dizinine Kopyalama

WAR dosyanızı doğrudan Tomcat’in webapps dizinine kopyalayabilirsiniz:

cp target/ecommerce-0.0.1-SNAPSHOT.war /opt/tomcat/webapps/ecommerce.war

Tomcat, WAR dosyasını otomatik olarak algılar ve deploy eder.

Maven Tomcat Plugin ile Deployment

Maven Tomcat Plugin kullanarak doğrudan Maven’den deployment yapabilirsiniz:

<!-- pom.xml -->
<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
        <url>http://your_server:8080/manager/text</url>
        <server>tomcat</server>
        <path>/ecommerce</path>
    </configuration>
</plugin>
mvn tomcat7:deploy

Frontend Uygulamasının Deployment Edilmesi

Angular uygulamanızı deploy etmek için, derlenen statik dosyaları bir web sunucusuna yüklemeniz gerekir.

Nginx ile Deployment

Nginx, statik dosyaları sunmak için popüler bir web sunucusudur.

Nginx Kurulumu

sudo apt update
sudo apt install nginx

Nginx Yapılandırması

# /etc/nginx/sites-available/ecommerce
server {
    listen 80;
    server_name example.com www.example.com;
    
    root /var/www/ecommerce;
    index index.html;
    
    location / {
        try_files $uri $uri/ /index.html;
    }
    
    location /api {
        proxy_pass http://your_server:8080/ecommerce/api;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
sudo ln -s /etc/nginx/sites-available/ecommerce /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

Angular Dosyalarının Yüklenmesi

sudo mkdir -p /var/www/ecommerce
sudo cp -r dist/ecommerce/* /var/www/ecommerce/
sudo chown -R www-data:www-data /var/www/ecommerce

Apache HTTP Server ile Deployment

Apache HTTP Server da statik dosyaları sunmak için kullanılabilir.

Apache Kurulumu

sudo apt update
sudo apt install apache2

Apache Yapılandırması

# /etc/apache2/sites-available/ecommerce.conf
<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    
    DocumentRoot /var/www/ecommerce
    
    <Directory /var/www/ecommerce>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    ProxyPass /api http://your_server:8080/ecommerce/api
    ProxyPassReverse /api http://your_server:8080/ecommerce/api
    
    ErrorLog ${APACHE_LOG_DIR}/ecommerce-error.log
    CustomLog ${APACHE_LOG_DIR}/ecommerce-access.log combined
</VirtualHost>
sudo a2ensite ecommerce.conf
sudo a2enmod proxy proxy_http rewrite
sudo apache2ctl configtest
sudo systemctl restart apache2

Angular Dosyalarının Yüklenmesi

sudo mkdir -p /var/www/ecommerce
sudo cp -r dist/ecommerce/* /var/www/ecommerce/
sudo chown -R www-data:www-data /var/www/ecommerce

.htaccess Dosyası

Angular uygulamanız için bir .htaccess dosyası oluşturun (Apache için):

# /var/www/ecommerce/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.html$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.html [L]
</IfModule>

Uygulama Testi ve Hata Ayıklama

Uygulamanızı deploy ettikten sonra, düzgün çalıştığından emin olmak için test etmeniz gerekir.

Temel Fonksiyonalite Testi

  1. Uygulamanın ana sayfasına erişin ve yüklendiğinden emin olun.
  2. Kullanıcı kaydı ve girişi yapın.
  3. Ürünleri listeleyin ve detaylarını görüntüleyin.
  4. Sepete ürün ekleyin ve sipariş verin.
  5. Kullanıcı profilini ve sipariş geçmişini kontrol edin.

Hata Ayıklama

Backend Logları

Tomcat loglarını kontrol edin:

tail -f /opt/tomcat/logs/catalina.out

Frontend Hata Ayıklama

Tarayıcının geliştirici araçlarını kullanarak frontend hatalarını kontrol edin:

  1. Tarayıcıda F12 tuşuna basın veya sağ tıklayıp “İncele” seçeneğini seçin.
  2. “Console” sekmesine gidin ve hata mesajlarını kontrol edin.
  3. “Network” sekmesinde API isteklerini ve yanıtlarını izleyin.

Yaygın Hatalar ve Çözümleri

  1. 404 Not Found Hataları:

    • Backend API endpoint’lerinin doğru yapılandırıldığından emin olun.
    • Frontend’de API URL’lerinin doğru olduğunu kontrol edin.
  2. CORS Hataları:

    • Backend’de CORS yapılandırmasını kontrol edin.
    • Proxy yapılandırmasını kontrol edin.
  3. 500 Internal Server Error:

    • Backend loglarını kontrol edin.
    • Veritabanı bağlantısını ve yapılandırmasını kontrol edin.
  4. Kimlik Doğrulama Hataları:

    • JWT token yapılandırmasını kontrol edin.
    • Kullanıcı kimlik bilgilerini kontrol edin.

Üretim Ortamı Optimizasyonları

Uygulamanızın üretim ortamında en iyi performansı göstermesi için bazı optimizasyonlar yapabilirsiniz.

Backend Optimizasyonları

JVM Ayarları

export JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:+UseStringDeduplication"

Veritabanı Bağlantı Havuzu

# application-prod.properties
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000

Önbellek Yapılandırması

# application-prod.properties
spring.cache.type=caffeine
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s

Frontend Optimizasyonları

Gzip Sıkıştırma

Nginx için:

gzip on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
  application/javascript
  application/json
  application/x-javascript
  application/xml
  text/css
  text/javascript
  text/plain
  text/xml;

Apache için:

<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE application/javascript
  AddOutputFilterByType DEFLATE application/json
  AddOutputFilterByType DEFLATE application/x-javascript
  AddOutputFilterByType DEFLATE application/xml
  AddOutputFilterByType DEFLATE text/css
  AddOutputFilterByType DEFLATE text/javascript
  AddOutputFilterByType DEFLATE text/plain
  AddOutputFilterByType DEFLATE text/xml
</IfModule>

Tarayıcı Önbelleği

Nginx için:

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
}

Apache için:

<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresByType image/jpg "access plus 1 month"
  ExpiresByType image/jpeg "access plus 1 month"
  ExpiresByType image/gif "access plus 1 month"
  ExpiresByType image/png "access plus 1 month"
  ExpiresByType text/css "access plus 1 week"
  ExpiresByType application/javascript "access plus 1 week"
</IfModule>

Güvenlik Önlemleri

Uygulamanızın güvenliğini sağlamak için bazı önlemler alabilirsiniz.

SSL/TLS Yapılandırması

Let’s Encrypt ile ücretsiz SSL sertifikası alın:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com

HTTP Güvenlik Başlıkları

Nginx için:

add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options SAMEORIGIN;
add_header X-XSS-Protection "1; mode=block";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; connect-src 'self' https://api.example.com";
add_header Referrer-Policy "strict-origin-when-cross-origin";

Apache için:

<IfModule mod_headers.c>
  Header set X-Content-Type-Options nosniff
  Header set X-Frame-Options SAMEORIGIN
  Header set X-XSS-Protection "1; mode=block"
  Header set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; connect-src 'self' https://api.example.com"
  Header set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>

Firewall Yapılandırması

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw deny 8080/tcp
sudo ufw enable

Deployment Otomasyonu

Deployment sürecini otomatikleştirmek için çeşitli araçlar kullanabilirsiniz.

Jenkins ile CI/CD

Jenkins, sürekli entegrasyon ve sürekli dağıtım (CI/CD) için popüler bir açık kaynak otomasyonu aracıdır.

Jenkins Pipeline Örneği

pipeline {
    agent any
    
    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }
        
        stage('Build Backend') {
            steps {
                dir('backend') {
                    sh 'mvn clean package -DskipTests'
                }
            }
        }
        
        stage('Build Frontend') {
            steps {
                dir('frontend') {
                    sh 'npm install'
                    sh 'ng build --prod'
                }
            }
        }
        
        stage('Deploy Backend') {
            steps {
                sh 'cp backend/target/ecommerce-0.0.1-SNAPSHOT.war /opt/tomcat/webapps/ecommerce.war'
            }
        }
        
        stage('Deploy Frontend') {
            steps {
                sh 'rm -rf /var/www/ecommerce/*'
                sh 'cp -r frontend/dist/ecommerce/* /var/www/ecommerce/'
                sh 'chown -R www-data:www-data /var/www/ecommerce'
            }
        }
    }
    
    post {
        success {
            echo 'Deployment successful!'
        }
        failure {
            echo 'Deployment failed!'
        }
    }
}

Docker ile Deployment

Docker, uygulamaları konteynerler içinde paketlemek ve dağıtmak için kullanılan bir platformdur.

Backend Dockerfile

FROM tomcat:9.0-jdk11
COPY target/ecommerce-0.0.1-SNAPSHOT.war /usr/local/tomcat/webapps/ecommerce.war
EXPOSE 8080
CMD ["catalina.sh", "run"]

Frontend Dockerfile

FROM nginx:alpine
COPY dist/ecommerce /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Docker Compose

version: '3'
services:
  backend:
    build: ./backend
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/ecommerce
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=password
    depends_on:
      - db
  
  frontend:
    build: ./frontend
    ports:
      - "80:80"
    depends_on:
      - backend
  
  db:
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=ecommerce
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  mysql-data:

Yedekleme ve Kurtarma

Uygulamanızın verilerini ve yapılandırmalarını düzenli olarak yedeklemeniz önemlidir.

Veritabanı Yedekleme

# MySQL yedekleme
mysqldump -u root -p ecommerce > ecommerce_backup_$(date +%Y%m%d).sql

# Otomatik yedekleme için cron görevi
0 2 * * * mysqldump -u root -p ecommerce > /backup/ecommerce_backup_$(date +%Y%m%d).sql

Uygulama Dosyalarının Yedeklenmesi

# Tomcat webapps dizinini yedekleme
tar -czf tomcat_webapps_backup_$(date +%Y%m%d).tar.gz /opt/tomcat/webapps

# Frontend dosyalarını yedekleme
tar -czf frontend_backup_$(date +%Y%m%d).tar.gz /var/www/ecommerce

Yedekten Geri Yükleme

# MySQL geri yükleme
mysql -u root -p ecommerce < ecommerce_backup_20230101.sql

# Tomcat webapps geri yükleme
tar -xzf tomcat_webapps_backup_20230101.tar.gz -C /

# Frontend dosyaları geri yükleme
tar -xzf frontend_backup_20230101.tar.gz -C /

İzleme ve Günlük Kaydı

Uygulamanızın performansını ve durumunu izlemek için çeşitli araçlar kullanabilirsiniz.

Log Yapılandırması

Logback Yapılandırması (Spring Boot)

<!-- logback-spring.xml -->
<configuration>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/var/log/ecommerce/application.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/var/log/ecommerce/application.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    
    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

Prometheus ve Grafana ile İzleme

Prometheus ve Grafana, uygulamanızın performansını izlemek için popüler araçlardır.

Spring Boot Actuator Yapılandırması

# application-prod.properties
management.endpoints.web.exposure.include=health,info,metrics,prometheus
management.endpoint.health.show-details=always

Prometheus Yapılandırması

# prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'spring-boot'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['backend:8080']

Ölçeklendirme

Uygulamanızın artan yüke göre ölçeklendirilmesi gerekebilir.

Yatay Ölçeklendirme

Yatay ölçeklendirme, daha fazla sunucu ekleyerek uygulamanızın kapasitesini artırır.

Yük Dengeleyici Yapılandırması (Nginx)

upstream backend {
    server backend1.example.com:8080;
    server backend2.example.com:8080;
    server backend3.example.com:8080;
}

server {
    listen 80;
    server_name api.example.com;
    
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Dikey Ölçeklendirme

Dikey ölçeklendirme, mevcut sunucuların kaynaklarını (CPU, RAM) artırarak uygulamanızın kapasitesini artırır.

JVM Bellek Ayarları

export JAVA_OPTS="-Xms2g -Xmx4g -XX:+UseG1GC"

Sonuç

Bu bölümde, e-ticaret uygulamamızın Tomcat sunucusuna nasıl deploy edileceğini ve uygulamanın nasıl test edilip hata ayıklamasının yapılacağını detaylı olarak ele aldık. Backend ve frontend uygulamalarının derlenmesi, Tomcat sunucusunun kurulumu ve yapılandırılması, uygulamaların deployment edilmesi, test edilmesi ve hata ayıklaması konularını inceledik.

Ayrıca, üretim ortamı optimizasyonları, güvenlik önlemleri, deployment otomasyonu, yedekleme ve kurtarma, izleme ve günlük kaydı ve ölçeklendirme konularını da ele aldık. Bu bilgiler, e-ticaret uygulamanızın sorunsuz bir şekilde çalışmasını sağlamanıza yardımcı olacaktır.

Bir sonraki bölümde, dokümantasyonun tamamlanması ve son kontrollerin yapılması konularını ele alacağız.