Skip to content

20. İstemci/sunucu uygulamasının bir barındırma hizmetine dağıtımı

Burada, geliştirdiğimiz istemci/sunucu uygulamasının bir OVH [https://www.ovh.com/fr/] sunucusuna dağıtımının ana hatlarını veriyoruz. Diğer barındırma sağlayıcılarına dağıtım da bundan çok farklı olmamalıdır. Sadece uygulamamızın bu tür bir dağıtım için uygun olduğunu göstermek istiyoruz.

20.1. Sunucu Kurulumu

Hedeflediğimiz OVH barındırma hizmeti temel bir barındırma hizmetidir:

  1. PHP 7.3 ortamı;
  2. bir SGBD MySQL;
  3. [Redis] sunucusu yok;
  1. madde, vergi hesaplama sunucumuzun 14. sürümünü değiştirmemizi gerektiriyor.

Image

Değiştirmemiz gerekenler:

  • yapılandırma dosyalarını [1] ;
  • [AdminDataController] ve [CalculerImpotController] denetleyicilerini, [Redis] sunucusunun bulunmadığını dikkate alacak şekilde;

[config.json] dosyası şu şekilde değiştirilir:


{
    "databaseFilename": "Config/database.json",
    "corsAllowed": false,
    "redisAvailable":false,
    "rootDirectory": "/.../www/apps/impot/serveur-php7",
    "relativeDependencies": [

        "/Entities/BaseEntity.php",
        ...
        "/Controllers/AdminDataController.php"
    ],
    "absoluteDependencies": [
        "/.../vendor/autoload.php",
        "/.../vendor/predis/predis/autoload.php"
    ],
    "users": [
        {
            "login": "admin",
            "passwd": "admin"
        }
    ],
    ...
}

Açıklamalar

  • 4. satır: [Redis] sunucusuna erişim olup olmadığını belirtmek için bir boole değeri [redisAvailable] eklenir;
  • 5., 13. ve 14. satırlar: mutlak yollar değişecektir;

[database.json] dosyası şu şekilde değişir:


{
    "dsn": "mysql:host=...;dbname=...",
    "id": "...",
    "pwd": "...",
    "tableTranches": "dbimpots_tbtranches",
    "colLimites": "limites",
    "colCoeffR": "coeffr",
    "colCoeffN": "coeffn",
    "tableConstantes": "dbimpots_tbconstantes",
    "colPlafondQfDemiPart": "plafondQfDemiPart",
    ...
}

Açıklamalar

  • 2-4. satırlar: Veritabanının kimliği ve sahibinin kimlik bilgileri değişecektir;

[AdminDataController] denetleyicisi şu şekilde değişecektir:


<?php

namespace Application;

// Symfony bağımlılıkları
use \Symfony\Component\HttpFoundation\Response;
use \Symfony\Component\HttpFoundation\Request;
use \Symfony\Component\HttpFoundation\Session\Session;
// [dao] katmanının takma adı
use \Application\ServerDaoWithSession as ServerDaoWithRedis;

class AdminDataController implements InterfaceController {

  // $config uygulama yapılandırmasıdır
  // bir Request isteğinin işlenmesi
  // Session oturumunu kullanır ve değiştirebilir
  // $infos, her denetleyiciye özgü ek bilgilerdir
  // bir dizi döndürür: [$statusCode, $état, $content, $headers]
  public function execute(
    array $config,
    Request $request,
    Session $session,
    array $infos = NULL): array {

    // tek bir parametreye sahip olunmalıdır GET
    $method = strtolower($request->getMethod());
    ...

    // çalışabiliriz
    // Redis
    if ($config["redisAvailable"]) {
      \Predis\Autoloader::register();
      ...
    } else {
      try {
        // veritabanından vergi verilerini alacağız
        $dao = new ServerDaoWithRedis($config["databaseFilename"], NULL);
        // taxAdminData
        $taxAdminData = $dao->getTaxAdminData();
      } catch (\Throwable $ex) {
        // işler ters gitti
        // Hata içeren sonucu ana denetleyiciye geri gönderiyoruz
        $état = 1051;
        return [Response::HTTP_INTERNAL_SERVER_ERROR, $état,
          ["réponse" => utf8_encode($ex->getMessage())], []];
      }
    }

    // sonuç ana denetleyiciye geri gönderildi
    $état = 1000;
    return [Response::HTTP_OK, $état, ["réponse" => $taxAdminData], []];
  }

}

Açıklamalar

  • 31. satır: Artık [Redis] sunucusunun olup olmadığı kontrol ediliyor;
  • 32-34. satırlar: Varsa, önceki kod tamamen alınır;
  • satır 35-46: yoksa, vergi idaresine ait veriler veritabanından alınır;

Vergi idaresinin verilerine de ihtiyaç duyan [CalculerImpotController] denetleyicisi de aynı şekilde değiştirildi.

Bu işlem tamamlandı. OVH sunucusuna dağıtım, FTP'in oluşturulmasından ibaretti. OVH'e şunlar indirildi:

  • [vuejs-14-without-redis] sürümü;
  • [vuejs-14-without-redis] sunucusunun tüm bağımlılıklarını içeren [vendor] dosyası;

FTP aktarımı tamamlandıktan sonra, aşağıdaki SQL komut dosyası ile sunucu için gerekli tablolar oluşturuldu:


-- phpMyAdmin SQL Dump
-- sürüm 4.8.5
-- https://www.phpmyadmin.net/
--
-- Sunucu: localhost:3306
-- Oluşturulma Tarihi: 12 Ekim 2019, 07:45 AM
-- Sunucu sürümü: 5.7.24
-- PHP Sürümü: 7.2.11

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- `dbimpots_tbconstantes` tablosu için tablo yapısı
--

CREATE TABLE `dbimpots_tbconstantes` (
  `id` int(11) NOT NULL,
  `plafondQfDemiPart` decimal(10,2) NOT NULL,
  `plafondRevenusCelibatairePourReduction` decimal(10,2) NOT NULL,
  `plafondRevenusCouplePourReduction` decimal(10,2) NOT NULL,
  `valeurReducDemiPart` decimal(10,2) NOT NULL,
  `plafondDecoteCelibataire` decimal(10,2) NOT NULL,
  `plafondDecoteCouple` decimal(10,2) NOT NULL,
  `plafondImpotCelibatairePourDecote` decimal(10,2) NOT NULL,
  `plafondImpotCouplePourDecote` decimal(10,2) NOT NULL,
  `abattementDixPourcentMax` decimal(10,2) NOT NULL,
  `abattementDixPourcentMin` decimal(10,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- `dbimpots_tbconstantes` tablosu için veri dökümü
--

INSERT INTO `dbimpots_tbconstantes` (`id`, `plafondQfDemiPart`, `plafondRevenusCelibatairePourReduction`, `plafondRevenusCouplePourReduction`, `valeurReducDemiPart`, `plafondDecoteCelibataire`, `plafondDecoteCouple`, `plafondImpotCelibatairePourDecote`, `plafondImpotCouplePourDecote`, `abattementDixPourcentMax`, `abattementDixPourcentMin`) VALUES
(8, '1551.00', '21037.00', '42074.00', '3797.00', '1196.00', '1970.00', '1595.00', '2627.00', '12502.00', '437.00');

-- --------------------------------------------------------

--
-- `dbimpots_tbtranches` tablosunun tablo yapısı
--

CREATE TABLE `dbimpots_tbtranches` (
  `id` int(11) NOT NULL,
  `limites` decimal(10,2) NOT NULL,
  `coeffR` decimal(10,2) NOT NULL,
  `coeffN` decimal(10,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- `dbimpots_tbtranches` tablosunun verileri dökülüyor
--

INSERT INTO `dbimpots_tbtranches` (`id`, `limites`, `coeffR`, `coeffN`) VALUES
(36, '9964.00', '0.00', '0.00'),
(37, '27519.00', '0.14', '1394.96'),
(38, '73779.00', '0.30', '5798.00'),
(39, '156244.00', '0.41', '13913.69'),
(40, '0.00', '0.45', '20163.45');

--
-- Dökümlenen tablolar için dizinler
--

--
-- `dbimpots_tbconstantes` tablosu için dizinler
--
ALTER TABLE `dbimpots_tbconstantes`
  ADD PRIMARY KEY (`id`);

--
-- `dbimpots_tbtranches` tablosu için dizinler
--
ALTER TABLE `dbimpots_tbtranches`
  ADD PRIMARY KEY (`id`);

--
-- Dökümlenmiş tablolar için AUTO_INCREMENT
--

--
-- `dbimpots_tbconstantes` tablosu için AUTO_INCREMENT
--
ALTER TABLE `dbimpots_tbconstantes`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=9;

--
-- AUTO_INCREMENT, `dbimpots_tbtranches` tablosu için
--
ALTER TABLE `dbimpots_tbtranches`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=41;
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Tüm bunlar tamamlandıktan sonra, [config.json, database.json] dosyalarını yeni ortamlarına uyarladık.

20.2. [Vue.js] istemcisinin dağıtımı

[Vue.js] istemcisinin URL ve [http://machine/apps/impot/client-vuejs/]'e dağıtılmasına karar verildi. Bu, aşağıdaki değişiklikleri gerektirdi:

[VSCode]'in kök dizininde, aşağıdaki [vue.config.js] dosyası oluşturuldu:

Image

[vue.config.js] dosyası şu şekildedir:


// vue.config.js
module.exports = {
  // müşteri hizmetleri URL vergi hesaplama sunucusu [vuejs]
  publicPath: '/apps/impot/client-vuejs/'
}

[router.js] ve [3] dosyaları da değiştirilmiştir:


// ithalatlar
import Vue from 'vue'
import VueRouter from 'vue-router'
...

// yönlendirme eklentisi
Vue.use(VueRouter)

// uygulama yolları
const routes = [
  ...
]

// yönlendirici
const router = new VueRouter({
  // yollar
  routes,
  // URL görüntüleme modu
  mode: 'history',
  // uygulamanın temel URL'i
  base: '/apps/impot/client-vuejs/'
})

// yolların doğrulanması
router.beforeEach((to, from, next) => {
  ...
})

// yönlendiricinin dışa aktarılması
export default router

Yorumlar

  • 21. satır: URL dosyasının tabanı değiştirilmiştir;

[config.js] dosyası şu şekilde değiştirilmiştir:


// [axios] kütüphanesinin kullanımı
const axios = require('axios');
// istek zaman aşımı HTTP
axios.defaults.timeout = 5000;
// vergi hesaplama sunucusunun URL veritabanı
// [https] şeması, vergi hesaplama sunucusu
// vergi hesaplama sunucusu kendi imzaladığı bir sertifika gönderiyor. Chrome ve Edge'de sorun yok. Safari test edilmedi.
// Firefox'ta, aşağıdaki URL adresini doğrudan çağırıp Firefox'a
// sertifikasının imzalanmamış olmasının riskini kabul ettiğinizi belirtmeniz yeterlidir. Ardından [vuejs] istemcisi çalışacaktır.
axios.defaults.baseURL = 'http://.../apps/impot/serveur-php7';
// çerezler kullanılacak
axios.defaults.withCredentials = true;

// yapılandırmanın dışa aktarılması
export default {
  // [axios] nesnesi
  axios: axios,
  // oturumun maksimum hareketsizlik süresi: 5 dakika = 300 saniye = 300000 milisaniye
  duréeSession: 300000
}

Yorumlar

  • 10. satır: vergi hesaplama sunucusundaki URL dosyası eklenir;

Projenin üretim sürümü, aşağıdaki [package.json] ve [5] dosyalarındaki [build] komutuyla oluşturulmuştur:


{
  "name": "vuejs",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve vuejs-22/main.js",
    "build": "vue-cli-service build vuejs-22-ovh-withBootstrapVue/main.js",
    "lint": "vue-cli-service lint"
  },
  ...
}

Bu işlem tamamlandıktan sonra, oluşturulan üretim sürümünü içeren [dist] dosyası, OVH sunucusundaki [/.../apps/impot] klasörüne yüklendi ve ardından, müşteri kodunun planlandığı gibi [/.../apps/impot/client-vuejs/] klasöründe yer alması için [client-vuejs] olarak yeniden adlandırıldı. Ardından bu klasöre aşağıdaki [.htaccess] dosyasını indirdik:


<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /apps/impot/client-vuejs/
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /apps/impot/client-vuejs/index.html [L]
</IfModule>

Bunun nedeni, burada kullanılan OVH web sunucusunun bir Apache sunucusu olmasıdır. Diğer sunucu türleri için |https://cli.vuejs.org/guide/deployment.html| belgelerine başvurulmalıdır.

PHP 7 sunucu uygulaması |ici| ile test edilebilir.

[Vue.js] istemcisi, |ici| ile test edilebilir.

20.3. Conclusion

[vuejs-21] sürümü zorunlu değildi. [vuejs-20] sürümünün, kullanıcı tarafından girilen URL'lere karşı doğru şekilde direnç gösterdiği görülmüştü. Bununla birlikte, yeni sürüm kullanıcıya ek bir rahatlık sağlıyor. Kullanıcı, URL yazarak gezinme yapabilir. Uygulama, bu durumda uygulamanın mevcut durumuna (oturuma) en uygun görünümü sunar. Ayrıca, [vuejs-22] sürümü, uygulamanın mobil cihazlarda görüntülenmesine yönelik iyileştirmeler getiriyor.