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:
- Backend (Spring Boot) Uygulamasının Derlenmesi: Spring Boot uygulamasının WAR dosyası olarak paketlenmesi.
- Frontend (Angular) Uygulamasının Derlenmesi: Angular uygulamasının üretim için optimize edilmiş statik dosyalar olarak derlenmesi.
- Tomcat Sunucusunun Kurulumu ve Yapılandırılması: Tomcat sunucusunun kurulması ve gerekli yapılandırmaların yapılması.
- Backend Uygulamasının Tomcat’e Deployment Edilmesi: WAR dosyasının Tomcat sunucusuna yüklenmesi.
- Frontend Uygulamasının Deployment Edilmesi: Derlenen Angular uygulamasının web sunucusuna yüklenmesi.
- 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
- Apache Tomcat web sitesinden en son Tomcat sürümünü indirin.
- İ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
- Web tarayıcınızda Tomcat yönetim arayüzüne gidin:
http://your_server:8080/manager/html
- Kullanıcı adı ve şifrenizi girin (tomcat-users.xml dosyasında yapılandırdığınız).
- “WAR file to deploy” bölümünde, “Choose File” düğmesine tıklayın ve WAR dosyanızı seçin.
- “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>
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
- Uygulamanın ana sayfasına erişin ve yüklendiğinden emin olun.
- Kullanıcı kaydı ve girişi yapın.
- Ürünleri listeleyin ve detaylarını görüntüleyin.
- Sepete ürün ekleyin ve sipariş verin.
- 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:
- Tarayıcıda F12 tuşuna basın veya sağ tıklayıp “İncele” seçeneğini seçin.
- “Console” sekmesine gidin ve hata mesajlarını kontrol edin.
- “Network” sekmesinde API isteklerini ve yanıtlarını izleyin.
Yaygın Hatalar ve Çözümleri
-
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.
-
CORS Hataları:
- Backend’de CORS yapılandırmasını kontrol edin.
- Proxy yapılandırmasını kontrol edin.
-
500 Internal Server Error:
- Backend loglarını kontrol edin.
- Veritabanı bağlantısını ve yapılandırmasını kontrol edin.
-
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.