NGINX ile Symfony 5 projesi nasıl Deploy edilir ? Ubuntu 
Published: 2022-01-26 14:22:36

Selamlar ben Alperen,

Bu yazıda sizlere `NGINX` ile Symfony 5 projesi nasıl Deploy edilir açıklayamaya çalışıcağım.

Bunu yaparken sırasıyla  `PHP`, `Mysql`, `NGINX` ,`Redis` , `Composer` , `Gitlab repository'sinden projeyi çekmek` ve `NGINX Config` kurulum ve ayarlamalarına da değineceğim.

Öncelikli olarak deploy etmek istediğimiz projenin düzgün bir şekilde Gitlab üzerinde bir repository'de bulunduğunu varsayalım.

 Webserver'a nasıl geçicez açıkçası o kısmını ben de bilmiyorum . Bana gökten indi :D 

`lsb_release -cd ; hostname ; hostname -I ; whoami ; getconf LONG_BIT;`
Size de gökten indiyse bu komutları çalıştırarak webserverınız hakkında bilgi alabilirsiniz .

Webserver'ı ayağa kaldırmak için gerekli kurulumları yapalım 

## PHP 8.1
Kuruluma başlamadan önce PHP nedir ? sorusunun cevabına bakalım 

PHP, HTML içine gömülebilen bir betik dilidir.Dilin amacı site geliştirenlere dinamik olarak hızla üretilen sayfalar yazabilme imkanı vermektir.

Php kurulumu için repo'muzu ekleyelim ;
`add-apt-repository ppa:ondrej/php -y`

Php 8.1 ve gerekli extensionları kuralım ;
`sudo apt install php8.1 php8.1-cli  php8.1-cgi php8.1-bcmath php8.1-curl php8.1-gd php8.1-intl php8.1-mbstring php8.1-mysql php8.1-opcache php8.1-sqlite3 php8.1-xml php8.1-zip php8.1-snmp php8.1-imap php8.1-common php8.1-tidy php8.1-pgsql php8.1-ldap php8.1-soap php8.1-xsl php8.1-redis php8.1-xmlrpc php8.1-zip php-imagick php-pear php-memcache php-apcu
`
Php kurulumunu  doğrulamak için ;
`php -v`
Kurduğumuz extansionları görmek için ise ;
`php -m`

## MYSQL 8

Mysql kurulumda dikkat etmemiz gereken bir konu Yetkilendirme 
eğer yetkilendirmeyi yapmayı unutursanız database oluşturamaz silemez veya düzenleyemezsiniz. 
`sudo apt install mysql-server`
Mysql'e girş yapalım ;
`mysql -u root`
Yeni kullanıcı oluşturalım ;
`CREATE USER 'yeni_kullanici'@'localhost' IDENTIFIED BY 'sifre';`
Yeni kullanıcıya yetkilendirme verelim ;
`GRANT ALL PRIVILEGES ON * . * TO 'yeni_kullanici'@'localhost'; `

Komuttaki yıldızlar (*) database ve tabloları referans vermek içindir. Komut kullanıcıya belirli database ve tablolara izin vermeye olanak sağlar. İşlemi bitirmeden önce yetkileri yenilediğinizden emin olun Daha sonra `yeni_kullanıcı` ile mysql'e tekrar giriş yapın .

`mysql -u yeni_kullanici -p 'sifre'`

Şimdi bir database oluşturalım . Peki bu database ne işimize yarayacak ? 
Symfony projemizdeki verileri tutacak .
Projemizdeki `.env` dosyasını ayarlarken kullanacağız, database'i ekteki komut ile oluşturalım ;
`CREATE DATABASE deneme;`

## NGINX 
Ngınx webserver'i ayağa kaldıracak hızlı stabil ve hafif bir web sunucudur.
`sudo apt install nginx`
`systemctl start nginx`
`systemctl status nginx`

## REDIS 
`sudo apt install redis-server`
redis.conf dosyasını düzenleyelim;
`sudo nano /etc/redis/redis.conf`
`supervised` kısmı default olarak `no` geliyor görseldeki gibi değiştirelim 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uvmn7gy7nkmuboaybhlo.png)

## COMPOSER
Symfony projemizi ayağa kaldıracak bunu unutmayalım ;
`curl -sS https://getcomposer.org/installer | php ; mv composer.phar /usr/local/bin/composer ; chmod +x /usr/local/bin/composer`

## Sunucu üzerinde gerekli tüm kurulumları bitirdiğimizde aşağıdaki adımları takip ederek deployment işlemine başlayabiliriz.

Projemizi çekeceğimiz dizine girelim;
`cd /var/www/html `

` git clone https://{gitlab-username}:{access_token}@{git-url}`

daha anlaşılır olması için bir örnek verelim;
**gitlab-username** : alper
**acces_token** : abcdf_1234ae
**git-url** : gitlab.com/alper/test.git

`git clone https://alper: abcdf_1234ae@gitlab.com/alper/test.git`

> **NOT** bu kısımda ben acces-token kullandım fakat deploy-token da kullanılabilir.

Projeyi çektikten sonra sahiplendirme ve izin işlemleri için ;
`chown -R www-data:www-data /var/www/html/ ; chmod -R 755 /var/www/html/`

Projemiz symfony projesi olduğu için gerekli paketleri yükleyelim;
`Composer install`
 
.env dosyasını ayarlayalım
bunun için ilk olarak proje dizinine girelim . 
`cd /var/www/test`
`nano .env`
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t5u1fywoykxf4pr6z4jq.png)
ekte olduğu gibi MYSQL Kısmında oluşturduğunuz database'i `.env` dosyamıza ekliyoruz .
 


## NGINX Config
Projemizi ayağa kaldırmak için en önemli adım NGINX config düzenlemesidir.
Ekteki komutta belirtilen dizine default isimli bir dosya oluşturur;
` nano /etc/nginx/sites-available/default`

dosyamızın içini düzenleyelim;

```
 server {
    listen 80;
    listen [::]:80;
    server_name domain www.domain.com;
    root   /var/www/test/public;
     index  index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

    client_max_body_size 100M;

    autoindex off;

    location / {

    try_files $uri /index.php$is_args$args;
      }

    location ~ \.php$ {
         include snippets/fastcgi-php.conf;
         fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
         include fastcgi_params;
         fastcgi_intercept_errors on;
    }
}

```
 kaydetme işlemi için `CTRL+O` `ENTER` `CTRL+X`
config dosyamıza sembolik link oluşturalım ;

`sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/`

daha sonra  `nginx.service` tekrar başlatalım ;
`sudo systemctl restart nginx.service`

her şey tamam . 

`http://domain.com/` sitenizi görebilirsiniz...