{% extends '../../base.html.twig' %}

{% block body %}
  <div class="container-fluid">
    <div class="row flex-xl-nowrap">
      {% include '../../../documentation/navbar.html.twig' with {
        'route' : nodefony.route
      } %}
      <main class="col-12 col-md-9 col-xl-8 py-md-3 pl-md-5" style="top: 5rem;">
        <div class="page-header">
          <h1>Framework Configuration
          </h1>
          <p>
            <h2 >
              You can see here :</h2>

            <p>
              <ul>
                <li>
                  <a href="#global">Goblal Configuration</a>
                </li>
                <li>
                  <a href="#certificates">Servers Certificates
                  </a>
                </li>
                <li>
                  <a href="#pm2">Production Configuration PM2
                  </a>
                </li>
              </ul>
              <p>

                <p></div>

                <h2>Location Framework configurations in File System
                </h2>
                <div class="doc2">
                  Location :
                  <code>./config</code>
                  <pre><code class="hljs console" >
config/
├── certificates
│   ├── ca
│   ├── ca_intermediate
│   ├── client
│   └── server
├── config.js
├── generatedConfig.yml
├── openssl
│   ├── ca
│   └── ca_intermediate
└── pm2.config.js

                </code></pre>
                </div>

                <h2 id="global">Goblal Configuration
                  <span class="badge">File</span></h2>
                <div class="doc2">

                  <div class="card">
                    <!-- Default card contents -->
                    <div class="card-header">
                      KERNEL Configuration
                    </div>
                    <div class="card-body">

                      <p>
                        You can find the nodefony KERNEL configuration file
                        <br>

                        This config file do multiple tasks as :
                        <br>
                        <ul>
                          <li>
                            Configuring http(s) websoket(s) web servers to start them, listen domain and port, certificats
                          </li>
                          <li>
                            Domain Alias, Domain check
                          </li>
                          <li>
                            Register Bundles (Local and Core) </li>
                          </li>
                          <li>
                            Locale (Lang) by default for all framework
                          </li>
                          <li>
                            Default node package Manager (yarn, npm)
                          </li>
                          <li>
                            ORM to use (Sequelize, Mongoose)
                          </li>
                        </ul>

                        Location :
                        <code>./config/config.js</code>
                        <p>
                          <pre><code class="hljs javascript" >/**
*  NODEFONY FRAMEWORK
*
*       KERNEL CONFIG
*
*   Domain listen : Nodefony can listen only one domain ( no vhost )
*     Example :
*      domain :  0.0.0.0      // for all interfaces
*      domain :  [::1]        // for IPV6 only
*      domain :  192.168.1.1  // IPV4
*      domain :  mydomain.com // DNS
*
*   Domain Alias : string only "<<regexp>>" use domainCheck : true
*     Example :
*      domainAlias:[
*        "^127.0.0.1$",
*        "^localhost$",
*        ".*\\.nodefony-starter\\.com",
*        "^nodefony-starter\\.eu$",
*        "^.*\\.nodefony-starter\\.eu$"
*      ]
*/
const path = require("path");

module.exports = {
system: {
  domain: "0.0.0.0",
  domainAlias: [
    "^127.0.0.1$",
    "^localhost$"
  ],
  httpPort: 5151,
  httpsPort: 5152,
  domainCheck: false,
  locale: "en_en",

  /**
   * BUNDLES CORE
   */
  security: true,
  realtime: true,
  monitoring: true,
  mail: true,
  documentation: false,
  unitTest: true,
  redis: false,
  mongo: false,
  elastic: false,

  /**
   * SERVERS
   */
  servers: {
    statics: true,
    protocol: "2.0", //  2.0 || 1.1
    http: true,
    https: true,
    ws: true,
    wss: true,
    certificats: {
      key: path.resolve("config", "certificates", "server", "privkey.pem"),
      cert: path.resolve("config", "certificates", "server", "fullchain.pem"),
      ca: path.resolve("config", "certificates", "ca", "nodefony-starter-root-ca.crt.pem"),
      options: {
        rejectUnauthorized: true
      }
    }
  },

  /**
   * DEV SERVER
   */
  devServer: {
    inline: true,
    hot: false,
    hotOnly: false,
    overlay: true,
    logLevel: "info", // none, error, warning or info
    progress: false,
    protocol: "https",
    websocket: true
  },

  /**
   *  BUNDLES LOCAL REGISTRATION
   *
   *       bundles:
   *         hello-bundle                 : "file:src/bundles/hello-bundle"
   *         my-bundle                    : require("my-bundle")
   */
  bundles: {},

  /**
   * SYSLOG NODEFONY
   */
  log: {
    active: true
  }
},

/**
 *       ASSETS CDN
 *
 *       You set cdn with string
 *       CDN :    "cdn.nodefony-starter.com",
 *       or
 *       CDN:
 *          global: "cdn.nodefony-starter.com",
 *       or
 *       CDN:{
 *         stylesheet:[
 *           "cdn.nodefony-starter.com"
 *         ],
 *         javascript:[
 *           "cdn.nodefony-starter.com"
 *         ],
 *         image:[
 *           "cdn.nodefony-starter.com",
 *           "cdn.nodefony-starter.fr"
 *         ],
 *         font:[
 *           "cdn.nodefony-starter.com"
 *         ]
 *      },
 */
CDN: null,

/**
 *  ENGINE TEMPLATE
 *
 *       TWIG
 *       https://github.com/justjohn/twig.js
 *
 */
templating: "twig",

/**
 * ENGINE ORM
 *       sequelize || mongoose
 *   orm : mongoose
 */
orm: "sequelize",

/**
 * NODE.JS PACKAGE MANAGER
 *
 *       npm
 *       yarn
 */
packageManager: "npm"

};
        	                </code></pre>
                        </div>

                        <table class="table">
                          <thead>
                            <th class="config-parameters">Parameters</th>
                            <th>Description</th>
                            <th>Data Type</th>
                            <th>Example /
                              <span class="badge">Default</span>
                            </th>
                          </thead>
                          <tbody>
                            <tr>
                              <td class="config-parameters">name</td>
                              <td>Name Project</td>
                              <td>String</td>
                              <td>NODEFONY</td>
                            </tr>
                            <tr>
                              <td class="config-parameters">version</td>
                              <td>Version Framework</td>
                              <td>String</td>
                              <td>Alpha</td>
                            </tr>
                            <tr>
                              <td class="config-parameters">system.domain</td>
                              <td>
                                <p>Domain or IP to listen servers HTTP / HTTPS / WEBSOCKET / WEBSOCKET SECURE nodefony can listen only one domain
                                </p>
                              </td>
                              <td>String</td>
                              <td>localhost or 192.168.0.230 or domain.com
                                <span class="badge">0.0.0.0</span></td>
                            </tr>
                            <tr>
                              <td class="config-parameters">system.domainAlias</td>
                              <td>Alias of domain
                              </td>
                              <td>String or array the separator is space for string type regexp only
                              </td>
                              <td>".*\\.nodefony.com ^nodefony.eu$ ^.*\\.nodefony.eu$"</td>
                            </tr>
                            <tr>
                              <td class="config-parameters">system.httpPort</td>
                              <td>Port to listen servers HTTP / WEBSOCKET
                              </td>
                              <td>String</td>
                              <td>
                                <span class="badge">5151</span></td>
                            </tr>
                            <tr>
                              <td class="config-parameters">system.httpsPort</td>
                              <td>Port to listen servers HTTPS / WEBSOCKET SECURE</td>
                              <td>String</td>
                              <td>
                                <span class="badge">5152</span></td>
                            </tr>

                            <tr>
                              <td class="config-parameters">system.servers.http</td>
                              <td>Start http server
                              </td>
                              <td>Boolean</td>
                              <td>
                                <span class="badge">true</span></td>
                            </tr>
                            <tr>
                              <td class="config-parameters">system.servers.https</td>
                              <td>Start https server
                              </td>
                              <td>Boolean</td>
                              <td>
                                <span class="badge">true</span></td>
                            </tr>
                            <tr>
                              <td class="config-parameters">system.servers.ws</td>
                              <td>Start websocket server
                              </td>
                              <td>Boolean</td>
                              <td>
                                <span class="badge">true</span></td>
                            </tr>
                            <tr>
                              <td class="config-parameters">system.servers.wss</td>
                              <td>Start websocket secure server
                              </td>
                              <td>Boolean</td>
                              <td>
                                <span class="badge">true</span></td>
                            </tr>
                            <tr>
                              <td class="config-parameters">system.servers.certificats</td>
                              <td>Manage certificats for https and websocket secure server
                                <a href="https://nodejs.org/dist/latest-v7.x/docs/api/tls.html#tls_tls_connect_options_callback">tls.connect(options)
                                </a>
                              </td>
                              <td>Object</td>
                              <td></td>
                            </tr>
                            <tr>
                              <td class="config-parameters">system.statics</td>
                              <td>
                                If active nodefony can Serve statics files : configurations of service in Application config file For developement use in production use varnish or similar reverse proxy caches in front to serve statics files
                              </td>
                              <td>Boolean</td>
                              <td>
                                <span class="badge">true</span></td>
                            </tr>
                            <tr>
                              <td class="config-parameters">system.security</td>
                              <td>Auto registre Firewall Bundle
                              </td>
                              <td>Boolean</td>
                              <td>
                                <span class="badge">true</span></td>
                            </tr>
                            <tr>
                              <td class="config-parameters">system.realtime</td>
                              <td>Auto registre realtime Bundle</td>
                              <td>Boolean</td>
                              <td>
                                <span class="badge">true</span></td>
                            </tr>
                            <tr>
                              <td class="config-parameters">system.monitoring</td>
                              <td>Auto registre monitoring Bundle (debugBar ... )</td>
                              <td>Boolean</td>
                              <td>
                                <span class="badge">true</span></td>
                            </tr>
                            <tr>
                              <td class="config-parameters">locale</td>
                              <td>I18n lang Framework
                              </td>
                              <td>String</td>
                              <td>
                                <span class="badge">en_en</span></td>
                            </tr>
                            <tr>
                              <td class="config-parameters">CDN</td>
                              <td>
                                Manages CDN for all differents assets. Can be use in twig templates with built-in &#123;&#123; CDN() &#125;&#125;
                              </td>
                              <td>Object</td>
                              <td></td>
                            </tr>
                            <tr>
                              <td class="config-parameters">log.avtive</td>
                              <td>Active syslog in kernel (show log in terminal )
                              </td>
                              <td>Boolean</td>
                              <td>
                                <span class="badge">true</span></td>
                            </tr>

                            <tr>
                              <td class="config-parameters">templating</td>
                              <td>Template Engine ( only twig for the moment)</td>
                              <td>String</td>
                              <td>
                                <span class="badge">twig</span></td>
                            </tr>
                            <tr>
                              <td class="config-parameters">orm</td>
                              <td>ORM Engine ( Sequelize, Mongoose )</td>
                              <td>String</td>
                              <td>
                                <span class="badge">sequelize</span></td>
                            </tr>
                          </tbody>
                        </table>
                      </div>
                    </div>
                    </br>
                    <h2 id="certificates">Certificates SSL HTTPS
                      <span class="badge">Directory</span>
                      <small>
                        <code>./config/certificates</code>
                      </small>
                    </h2>
                    <div class="doc2">
                      <pre><code class="hljs console" > ./config/certificates/

├── ca
│   ├── certs
│   ├── crl
│   ├── db
│   ├── newcerts
│   ├── nodefony-starter-root-ca.crt.pem
│   ├── nodefony-starter-root-ca.key.pem
│   ├── private
│   └── public
├── ca_intermediate
│   ├── certs
│   ├── crl
│   ├── csr
│   ├── db
│   ├── newcerts
│   └── private
├── client
│   ├── chain.pem
│   └── pubkey.pem
└── server
    ├── cert.pem
    ├── chain.pem
    ├── fullchain.pem
    ├── haproxy.pem
    └── privkey.pem
                    </code></pre>

                      <p>
                        You can manage your https certificates in this directory
                        <br>
                      </p>

                    </div>

                    <h2 name="pm2" id="pm2">Configuration PM2
                      <span class="badge">File</span>
                      <small>
                        <code>./config/pm2.config.js</code>
                      </small>
                    </h2>

                    <div class="doc2">
                      <p>
                        Configuration nodefony running mode :

                        <a href="{{ url("nodefony-doc-index",{section:"running"}) }}">
                          PM2
                        </a>
                        (Production process manager for Node.js )
                        <br>
                        This Configuration PM2 use by executable
                        <code>nodefony prod</code>
                      </p>

                      <pre><code class="hljs javascript" >const cpu = require('os').cpus().length;
const path = require("path");

const package = require(path.resolve("package.json"));
const name = package.name;
const script = process.argv[1] || "nodefony";
const logName = `${name}.log`;
const logFile = path.resolve("tmp", logName);

/**
 * Application configuration section
 * http://pm2.keymetrics.io/docs/usage/application-declaration/
 */
module.exports = {
  apps: [{
    name: name,
    script: script,
    args: "pm2",
    //node_args           : "--expose-gc",
    watch: false,
    exec_mode: "cluster",
    instances: cpu,
    max_memory_restart: "1024M",
    autorestart: true,
    max_restarts: 10,
    //log_file            : logFile,
    out_file: logFile,
    error_file: logFile,
    merge_logs: true,
    env: {
      "NODE_ENV": "development",
      "MODE_START": "PM2",
      "NODEFONY_DEBUG": true
    },
    env_production: {
      "NODE_ENV": "production",
      "MODE_START": "PM2",
      "NODEFONY_DEBUG": false
    }
  }]
};
        	            </code></pre>
                      <a href="http://pm2.keymetrics.io/docs/usage/cluster-mode/">
                        Documentation pm2.keymetrics.io
                      </a>
                    </div>


      </main>
    </div>
  </div>
{% endblock %}
