Set the PHP server config per site (#232)

* Set up the php server per site.

* Backwards compatibility logic for old config URLs.

* Remove php global config tab.

* Fix util import in website.conf.js

* Fix eslint fails.

* Move global php i18n keys to domain

* Remove unnecessary domains verification and set fastcgi_pass in unified mode.

* Convert return statement to logic operator in php_ustream.js

* Move php upstream to outside the server blocks

* Remove unnecessary watcher from php domain section

* Fix upstream config context and conditional append

* Separate backwards compatibility logic.

* Remove unused i18n key from php domain and update copyright of these files

* Replace all dots for underscore in php_upstream helper

* Fix missing space and remove upstream comment from php config.

* Fix selects $refs and watch the enable status for phpServer and phpBackupServer.

* Change copyright year for all modified files.

* Backwards compatibility logic for old config URLs after angularBackwardsCompatibility

* Deep merge old php global config from data url, and add safe disable for phpConfigs

* Move deep merge function to new helper

* Fix missing disable wordpressRules  and convert function declaration to arrows in deep merge helper

* Fix missing css class in php domain-section
This commit is contained in:
Atila Silva 2021-02-24 13:20:10 -03:00 committed by GitHub
parent 4cfdcdb8d1
commit 1fb756ca77
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
29 changed files with 385 additions and 507 deletions

View file

@ -27,7 +27,6 @@ THE SOFTWARE.
import sslProfiles from '../../util/ssl_profiles';
import websiteConf from './website.conf';
import shareQuery from '../../util/share_query';
import phpPath from '../../util/php_path';
export default (domains, global) => {
const config = {};
@ -51,14 +50,6 @@ export default (domains, global) => {
// HTTP (kv so we can use the same key multiple times)
config.http = [];
if (global.php.phpBackupServer.computed)
config.http.push(['upstream php', {
server: [
phpPath(global),
`${phpPath(global, true)} backup`,
],
}]);
config.http.push(['charset', 'utf-8']);
config.http.push(['sendfile', 'on']);
config.http.push(['tcp_nopush', 'on']);

View file

@ -24,9 +24,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
import phpPath from '../../util/php_path';
export default (domains, global) => {
export default (domains) => {
const legacyRouting = domains.some(d => d.routing.legacyPhpRouting.computed);
const config = {};
@ -43,8 +41,6 @@ export default (domains, global) => {
config.include = 'fastcgi_params';
config['# fastcgi settings'] = '';
config.fastcgi_pass = domains.some(d => d.php.php.computed) && global.php.phpBackupServer.computed !== ''
? 'php' : phpPath(global);
config.fastcgi_index = 'index.php';
config.fastcgi_buffers = '8 16k';
config.fastcgi_buffer_size = '32k';

View file

@ -1,5 +1,5 @@
/*
Copyright 2020 DigitalOcean
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
@ -38,6 +38,8 @@ import drupalConf from './drupal.conf';
import magentoConf from './magento.conf';
import joomlaConf from './joomla.conf';
import letsEncryptConf from './letsencrypt.conf';
import phpPath from '../../util/php_path';
import phpUpstream from '../../util/php_upstream';
const sslConfig = (domain, global) => {
const config = [];
@ -176,8 +178,8 @@ export default (domain, domains, global) => {
// Restrict Methods
if (Object.keys(domain.restrict).find(k => domain.restrict[k].computed && k !== 'responseCode')) {
const allowedKeys = Object.keys(domain.restrict)
.filter(k => !domain.restrict[k].computed && k !== 'responseCode')
.map(e => e.replace('Method', '').toUpperCase());
.filter(k => !domain.restrict[k].computed && k !== 'responseCode')
.map(e => e.replace('Method', '').toUpperCase());
serverConfig.push(['# restrict methods', '']);
serverConfig.push([`if ($request_method !~ ^(${allowedKeys.join('|')})$)`, {
@ -284,15 +286,36 @@ export default (domain, domains, global) => {
// PHP
if (domain.php.php.computed) {
if (domain.php.phpBackupServer.computed) {
config.push([`upstream ${phpUpstream(domain)}`, {
server: [
phpPath(domain),
`${phpPath(domain, true)} backup`,
],
}]);
}
serverConfig.push(['# handle .php', '']);
const loc = `location ~ ${domain.routing.legacyPhpRouting.computed ? '[^/]\\.php(/|$)' : '\\.php$'}`;
const fastcgiPass = {
fastcgi_pass: domain.php.phpBackupServer.computed !== ''
? phpUpstream(domain) : phpPath(domain),
};
if (global.tools.modularizedStructure.computed || domain.php.wordPressRules.computed) {
// Modularized
serverConfig.push([loc, { include: 'nginxconfig.io/php_fastcgi.conf' }]);
serverConfig.push([loc, {
...fastcgiPass,
include: 'nginxconfig.io/php_fastcgi.conf',
}]);
} else {
// Unified
serverConfig.push([loc, phpConf(domains, global)]);
serverConfig.push([loc, {
...fastcgiPass,
...phpConf(domains),
}]);
}
}

View file

@ -1,5 +1,5 @@
/*
Copyright 2020 DigitalOcean
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
@ -73,7 +73,7 @@ export default (domains, global) => {
// PHP
if (domains.some(d => d.php.php.computed))
files['nginxconfig.io/php_fastcgi.conf'] = toConf(phpConf(domains, global));
files['nginxconfig.io/php_fastcgi.conf'] = toConf(phpConf(domains));
// Python
if (domains.some(d => d.python.python.computed))
@ -102,7 +102,7 @@ export default (domains, global) => {
} else {
// PHP
if (domains.some(d => d.php.wordPressRules.computed))
files['nginxconfig.io/php_fastcgi.conf'] = toConf(phpConf(domains, global));
files['nginxconfig.io/php_fastcgi.conf'] = toConf(phpConf(domains));
}
return files;

View file

@ -1,5 +1,5 @@
/*
Copyright 2020 DigitalOcean
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
@ -39,4 +39,18 @@ export default {
enableMagentoRules: `${common.enable} ${common.magento}-specific rules`,
joomlaRules: `${common.joomla} rules`,
enableJoomlaRules: `${common.enable} ${common.joomla}-specific rules`,
phpServer: `${common.php} server`,
phpBackupServer: `${common.php} backup server`,
tcp: 'TCP',
hhvmSocket: 'HHVM socket',
php5Socket: '5.x socket',
php70Socket: '7.0 socket',
php71Socket: '7.1 socket',
php72Socket: '7.2 socket',
php73Socket: '7.3 socket',
php74Socket: '7.4 socket',
php80Socket: '8.0 socket',
phpSocket: 'PHP socket',
custom: 'Custom',
disabled: 'Disabled',
};

View file

@ -1,5 +1,5 @@
/*
Copyright 2020 DigitalOcean
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
@ -28,11 +28,10 @@ import https from './https';
import logging from './logging';
import nginx from './nginx';
import performance from './performance';
import php from './php';
import python from './python';
import reverseProxy from './reverse_proxy';
import security from './security';
import tools from './tools';
import docker from './docker';
export default { https, logging, nginx, performance, php, python, reverseProxy, security, tools, docker };
export default { https, logging, nginx, performance, python, reverseProxy, security, tools, docker };

View file

@ -1,45 +0,0 @@
/*
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
https://github.com/digitalocean/nginxconfig.io/blob/master/LICENSE or https://mit-license.org/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions :
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
import common from '../../common';
export default {
phpServer: `${common.php} server`,
phpMustBeEnabledOnOneSite: `${common.php} must be enabled on at least one site to configure global ${common.php} settings.`,
phpBackupServer: `${common.php} backup server`,
tcp: 'TCP',
hhvmSocket: 'HHVM socket',
php5Socket: '5.x socket',
php70Socket: '7.0 socket',
php71Socket: '7.1 socket',
php72Socket: '7.2 socket',
php73Socket: '7.3 socket',
php74Socket: '7.4 socket',
php80Socket: '8.0 socket',
phpSocket: 'PHP socket',
custom: 'Custom',
disabled: 'Disabled',
};

View file

@ -39,4 +39,18 @@ export default {
enableMagentoRules: `${common.enable} les règles spécifiques à ${common.magento}`,
joomlaRules: `Règles ${common.joomla}`,
enableJoomlaRules: `${common.enable} les règles spécifiques à ${common.joomla}`,
phpServer: `Serveur ${common.php}`,
phpBackupServer: `Serveur de sauvegarde ${common.php}`,
tcp: 'TCP',
hhvmSocket: 'Socket HHVM',
php5Socket: 'Socket 5.x',
php70Socket: 'Socket 7.0',
php71Socket: 'Socket 7.1',
php72Socket: 'Socket 7.2',
php73Socket: 'Socket 7.3',
php74Socket: 'Socket 7.4',
php80Socket: 'Socket 8.0',
phpSocket: 'Socket PHP',
custom: 'Custom', // TODO: translate
disabled: 'Désactivé',
};

View file

@ -28,11 +28,10 @@ import https from './https';
import logging from './logging';
import nginx from './nginx';
import performance from './performance';
import php from './php';
import python from './python';
import reverseProxy from './reverse_proxy';
import security from './security';
import tools from './tools';
import docker from './docker';
export default { https, logging, nginx, performance, php, python, reverseProxy, security, tools, docker };
export default { https, logging, nginx, performance, python, reverseProxy, security, tools, docker };

View file

@ -1,45 +0,0 @@
/*
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
https://github.com/digitalocean/nginxconfig.io/blob/master/LICENSE or https://mit-license.org/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions :
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
import common from '../../common';
export default {
phpServer: `Serveur ${common.php}`,
phpMustBeEnabledOnOneSite: `${common.php} doit être activé sur au moins un site pour configurer les paramètres globaux de ${common.php}.`,
phpBackupServer: `Serveur de sauvegarde ${common.php}`,
tcp: 'TCP',
hhvmSocket: 'Socket HHVM',
php5Socket: 'Socket 5.x',
php70Socket: 'Socket 7.0',
php71Socket: 'Socket 7.1',
php72Socket: 'Socket 7.2',
php73Socket: 'Socket 7.3',
php74Socket: 'Socket 7.4',
php80Socket: 'Socket 8.0',
phpSocket: 'Socket PHP',
custom: 'Custom', // TODO: translate
disabled: 'Désactivé',
};

View file

@ -1,5 +1,5 @@
/*
Copyright 2020 DigitalOcean
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
@ -39,4 +39,18 @@ export default {
enableMagentoRules: `${common.enable} regras específicas do ${common.magento}`,
joomlaRules: `Regras do ${common.joomla}`,
enableJoomlaRules: `${common.enable} regras específicas do ${common.joomla}`,
phpServer: `Servidor ${common.php}`,
phpBackupServer: `Servidor de backup ${common.php}`,
tcp: 'TCP',
hhvmSocket: 'Socket HHVM',
php5Socket: 'Socket 5.x',
php70Socket: 'Socket 7.0',
php71Socket: 'Socket 7.1',
php72Socket: 'Socket 7.2',
php73Socket: 'Socket 7.3',
php74Socket: 'Socket 7.4',
php80Socket: 'Socket 8.0',
phpSocket: 'Socket PHP',
custom: 'Custom', // TODO: translate
disabled: 'Desabilitado',
};

View file

@ -1,5 +1,5 @@
/*
Copyright 2020 DigitalOcean
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
@ -28,11 +28,10 @@ import https from './https';
import logging from './logging';
import nginx from './nginx';
import performance from './performance';
import php from './php';
import python from './python';
import reverseProxy from './reverse_proxy';
import security from './security';
import tools from './tools';
import docker from './docker';
export default { https, logging, nginx, performance, php, python, reverseProxy, security, tools, docker };
export default { https, logging, nginx, performance, python, reverseProxy, security, tools, docker };

View file

@ -1,45 +0,0 @@
/*
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
https://github.com/digitalocean/nginxconfig.io/blob/master/LICENSE or https://mit-license.org/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions :
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
import common from '../../common';
export default {
phpServer: `Servidor ${common.php}`,
phpMustBeEnabledOnOneSite: `O ${common.php} deve estar habilitado em pelo menos um site para definir as configurações globais do ${common.php}.`,
phpBackupServer: `Servidor de backup ${common.php}`,
tcp: 'TCP',
hhvmSocket: 'Socket HHVM',
php5Socket: 'Socket 5.x',
php70Socket: 'Socket 7.0',
php71Socket: 'Socket 7.1',
php72Socket: 'Socket 7.2',
php73Socket: 'Socket 7.3',
php74Socket: 'Socket 7.4',
php80Socket: 'Socket 8.0',
phpSocket: 'Socket PHP',
custom: 'Custom', // TODO: translate
disabled: 'Desabilitado',
};

View file

@ -39,4 +39,18 @@ export default {
enableMagentoRules: `${common.enable} ${common.magento}-специфичные правила`,
joomlaRules: `${common.joomla} правила`,
enableJoomlaRules: `${common.enable} ${common.joomla}-специфичные правила`,
phpServer: `${common.php} сервер`,
phpBackupServer: `${common.php} бекап сервер`,
tcp: 'TCP',
hhvmSocket: 'HHVM сокет',
php5Socket: '5.x сокет',
php70Socket: '7.0 сокет',
php71Socket: '7.1 сокет',
php72Socket: '7.2 сокет',
php73Socket: '7.3 сокет',
php74Socket: '7.4 сокет',
php80Socket: '8.0 сокет',
phpSocket: 'PHP сокет',
custom: 'Другой',
disabled: 'Выключено',
};

View file

@ -28,11 +28,10 @@ import https from './https';
import logging from './logging';
import nginx from './nginx';
import performance from './performance';
import php from './php';
import python from './python';
import reverseProxy from './reverse_proxy';
import security from './security';
import tools from './tools';
import docker from './docker';
export default { https, logging, nginx, performance, php, python, reverseProxy, security, tools, docker };
export default { https, logging, nginx, performance, python, reverseProxy, security, tools, docker };

View file

@ -1,45 +0,0 @@
/*
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
https://github.com/digitalocean/nginxconfig.io/blob/master/LICENSE or https://mit-license.org/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions :
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
import common from '../../common';
export default {
phpServer: `${common.php} сервер`,
phpMustBeEnabledOnOneSite: `${common.php} должен быть включен как минимум на одном сайте, чтобы сконфигурировать глобальные настройки ${common.php}.`,
phpBackupServer: `${common.php} бекап сервер`,
tcp: 'TCP',
hhvmSocket: 'HHVM сокет',
php5Socket: '5.x сокет',
php70Socket: '7.0 сокет',
php71Socket: '7.1 сокет',
php72Socket: '7.2 сокет',
php73Socket: '7.3 сокет',
php74Socket: '7.4 сокет',
php80Socket: '8.0 сокет',
phpSocket: 'PHP сокет',
custom: 'Другой',
disabled: 'Выключено',
};

View file

@ -1,5 +1,5 @@
/*
Copyright 2020 DigitalOcean
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
@ -39,4 +39,18 @@ export default {
enableMagentoRules: `${common.enable} ${common.magento}专属规则`,
joomlaRules: `${common.joomla} 规则`,
enableJoomlaRules: `${common.enable} ${common.joomla}专属规则`,
phpServer: `${common.php} 服务`,
phpBackupServer: `${common.php}备份服务器`,
tcp: 'TCP',
hhvmSocket: 'HHVM socket',
php5Socket: '5.x socket',
php70Socket: '7.0 socket',
php71Socket: '7.1 socket',
php72Socket: '7.2 socket',
php73Socket: '7.3 socket',
php74Socket: '7.4 socket',
php80Socket: '8.0 socket',
phpSocket: 'PHP socket',
custom: '自定义',
disabled: '禁用',
};

View file

@ -1,5 +1,5 @@
/*
Copyright 2020 DigitalOcean
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
@ -28,11 +28,10 @@ import https from './https';
import logging from './logging';
import nginx from './nginx';
import performance from './performance';
import php from './php';
import python from './python';
import reverseProxy from './reverse_proxy';
import security from './security';
import tools from './tools';
import docker from './docker';
export default { https, logging, nginx, performance, php, python, reverseProxy, security, tools, docker };
export default { https, logging, nginx, performance, python, reverseProxy, security, tools, docker };

View file

@ -1,5 +1,5 @@
/*
Copyright 2020 DigitalOcean
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
@ -39,4 +39,18 @@ export default {
enableMagentoRules: `${common.enable} ${common.magento}專屬規則`,
joomlaRules: `${common.joomla} 規則`,
enableJoomlaRules: `${common.enable} ${common.joomla}專屬規則`,
phpServer: `${common.php} 服務`,
phpBackupServer: `${common.php}備份服務器`,
tcp: 'TCP',
hhvmSocket: 'HHVM socket',
php5Socket: '5.x socket',
php70Socket: '7.0 socket',
php71Socket: '7.1 socket',
php72Socket: '7.2 socket',
php73Socket: '7.3 socket',
php74Socket: '7.4 socket',
php80Socket: '8.0 socket',
phpSocket: 'PHP socket',
custom: '自定义',
disabled: '禁用',
};

View file

@ -28,11 +28,10 @@ import https from './https';
import logging from './logging';
import nginx from './nginx';
import performance from './performance';
import php from './php';
import python from './python';
import reverseProxy from './reverse_proxy';
import security from './security';
import tools from './tools';
import docker from './docker';
export default { https, logging, nginx, performance, php, python, reverseProxy, security, tools, docker };
export default { https, logging, nginx, performance, python, reverseProxy, security, tools, docker };

View file

@ -1,5 +1,5 @@
<!--
Copyright 2020 DigitalOcean
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
@ -65,6 +65,54 @@ THE SOFTWARE.
</div>
</div>
<div v-if="phpServerEnabled" class="field is-horizontal is-aligned-top">
<div class="field-label has-margin-top">
<label class="label">{{ $t('templates.domainSections.php.phpServer') }}</label>
</div>
<div class="field-body">
<div class="field">
<div :class="`control${phpServerChanged ? ' is-changed' : ''}`">
<VueSelect ref="phpServerSelect"
v-model="phpServer"
:options="phpServerOptions"
:clearable="false"
:reduce="s => s.value"
></VueSelect>
</div>
<div v-if="phpServerCustomEnabled"
:class="`control${phpServerCustomChanged ? ' is-changed' : ''}`"
>
<input v-model="phpServerCustom" class="input" type="text" :placeholder="$props.data.phpServerCustom.default" />
</div>
</div>
</div>
</div>
<div v-if="phpBackupServerEnabled" class="field is-horizontal is-aligned-top">
<div class="field-label has-margin-top">
<label class="label">{{ $t('templates.domainSections.php.phpBackupServer') }}</label>
</div>
<div class="field-body">
<div class="field">
<div :class="`control${phpBackupServerChanged ? ' is-changed' : ''}`">
<VueSelect ref="phpBackupServerSelect"
v-model="phpBackupServer"
:options="phpBackupServerOptions"
:clearable="false"
:reduce="s => s.value"
></VueSelect>
</div>
<div v-if="phpBackupServerCustomEnabled"
:class="`control${phpBackupServerCustomChanged ? ' is-changed' : ''}`"
>
<input v-model="phpBackupServerCustom" class="input" type="text" :placeholder="$props.data.phpBackupServerCustom.default" />
</div>
</div>
</div>
</div>
<div v-if="wordPressRulesEnabled" class="field is-horizontal">
<div class="field-label">
<label class="label">{{ $t('templates.domainSections.php.wordPressRules') }}</label>
@ -141,10 +189,47 @@ THE SOFTWARE.
<script>
import PrettyCheck from 'pretty-checkbox-vue/check';
import VueSelect from 'vue-select';
import delegatedFromDefaults from '../../util/delegated_from_defaults';
import computedFromDefaults from '../../util/computed_from_defaults';
// Value -> i18n key
const serverOptions = {
'127.0.0.1:9000': 'templates.domainSections.php.tcp',
'/var/run/hhvm/sock': 'templates.domainSections.php.hhvmSocket',
'/var/run/hhvm/hhvm.sock': 'templates.domainSections.php.hhvmSocket',
'/var/run/php5-fpm.sock': 'templates.domainSections.php.php5Socket',
'/var/run/php/php7.1-fpm.sock': 'templates.domainSections.php.php71Socket',
'/var/run/php/php7.2-fpm.sock': 'templates.domainSections.php.php72Socket',
'/var/run/php/php7.0-fpm.sock': 'templates.domainSections.php.php70Socket',
'/var/run/php/php7.3-fpm.sock': 'templates.domainSections.php.php73Socket',
'/var/run/php/php7.4-fpm.sock': 'templates.domainSections.php.php74Socket',
'/var/run/php/php8.0-fpm.sock': 'templates.domainSections.php.php80Socket',
'/var/run/php/php-fpm.sock': 'templates.domainSections.php.phpSocket',
'custom': 'templates.domainSections.php.custom',
};
const hiddenValues = ['', 'custom'];
const defaults = {
phpServer: {
default: '/var/run/php/php-fpm.sock',
options: serverOptions,
enabled: true,
},
phpServerCustom: {
default: 'unix:/var/run/php/php-fpm.sock',
enabled: false,
},
phpBackupServer: {
default: '',
options: { '': 'templates.domainSections.php.disabled', ...serverOptions },
enabled: true,
},
phpBackupServerCustom: {
default: 'unix:/var/run/php/php-fpm.sock',
enabled: false,
},
php: {
default: true,
enabled: true,
@ -174,11 +259,22 @@ THE SOFTWARE.
delegated: delegatedFromDefaults(defaults), // Data the parent will present here
components: {
PrettyCheck,
VueSelect,
},
props: {
data: Object, // Data delegated back to us from parent
},
computed: computedFromDefaults(defaults, 'php'), // Getters & setters for the delegated data
computed: {
...computedFromDefaults(defaults, 'php'), // Getters & setters for the delegated data
phpServerOptions() {
return Object.entries(this.$props.data.phpServer.options)
.map(([key, value]) => this.formattedOption(key, value));
},
phpBackupServerOptions() {
return Object.entries(this.$props.data.phpBackupServer.options)
.map(([key, value]) => this.formattedOption(key, value));
},
},
watch: {
// If the Reverse proxy or Python is enabled, PHP will be forced off
'$parent.$props.data': {
@ -198,6 +294,10 @@ THE SOFTWARE.
'$props.data.php': {
handler(data) {
if (data.computed) {
this.$props.data.phpServer.enabled = true;
this.$props.data.phpServer.computed = this.$props.data.phpServer.value;
this.$props.data.phpBackupServer.enabled = true;
this.$props.data.phpBackupServer.computed = this.$props.data.phpBackupServer.value;
this.$props.data.wordPressRules.enabled = true;
this.$props.data.wordPressRules.computed = this.$props.data.wordPressRules.value;
this.$props.data.drupalRules.enabled = true;
@ -207,6 +307,10 @@ THE SOFTWARE.
this.$props.data.joomlaRules.enabled = true;
this.$props.data.joomlaRules.computed = this.$props.data.joomlaRules.value;
} else {
this.$props.data.phpServer.enabled = false;
this.$props.data.phpServer.computed = '';
this.$props.data.phpBackupServer.enabled = false;
this.$props.data.phpBackupServer.computed = '';
this.$props.data.wordPressRules.enabled = false;
this.$props.data.wordPressRules.computed = false;
this.$props.data.drupalRules.enabled = false;
@ -219,6 +323,61 @@ THE SOFTWARE.
},
deep: true,
},
// Check server selection is valid
'$props.data.phpServer': {
handler(data) {
if (data.enabled) {
// This might cause recursion, but seems not to
if (!Object.keys(data.options).includes(data.computed))
data.computed = data.default;
// Show the custom box
this.$props.data.phpServerCustom.enabled = data.computed === 'custom';
return;
}
// Hide custom if disabled
this.$props.data.phpServerCustom.enabled = false;
},
deep: true,
},
// Check backup server selection is valid
'$props.data.phpBackupServer': {
handler(data) {
if (data.enabled) {
// This might cause recursion, but seems not to
if (!Object.keys(data.options).includes(data.computed))
data.computed = data.default;
// Show the custom box
this.$props.data.phpBackupServerCustom.enabled = data.computed === 'custom';
return;
}
// Hide custom if disabled
this.$props.data.phpBackupServerCustom.enabled = false;
},
deep: true,
},
// Ensure 'Custom'/'Disabled' get translated in VueSelect on language switch
'$i18n.locale'() {
if (!this.$refs.phpServerSelect)
return false;
const updated = this.phpServerOptions
.find(x => x.value === this.$refs.phpServerSelect.$data._value.value);
if (updated) this.$refs.phpServerSelect.$data._value = updated;
const updatedBackup = this.phpBackupServerOptions
.find(x => x.value === this.$refs.phpBackupServerSelect.$data._value.value);
if (updatedBackup) this.$refs.phpBackupServerSelect.$data._value = updatedBackup;
},
},
methods: {
formattedOption(key, value) {
return {
label: `${this.$t(value)}${hiddenValues.includes(key) ? '' : `: ${key}`}`,
value: key,
};
},
},
};
</script>

View file

@ -1,5 +1,5 @@
/*
Copyright 2020 DigitalOcean
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
@ -26,7 +26,6 @@ THE SOFTWARE.
export { default as HTTPS } from './https';
export { default as Security } from './security';
export { default as PHP } from './php';
export { default as Python } from './python';
export { default as ReverseProxy } from './reverse_proxy';
export { default as Performance } from './performance';

View file

@ -1,238 +0,0 @@
<!--
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
https://github.com/digitalocean/nginxconfig.io/blob/master/LICENSE or https://mit-license.org/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions :
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<template>
<div>
<div v-if="!phpServerEnabled" class="field is-horizontal is-aligned-top">
<div class="field-label">
<label class="label">{{ $t('templates.globalSections.php.phpServer') }}</label>
</div>
<div class="field-body">
<div class="field">
<div class="control">
<label class="text">
{{ $t('templates.globalSections.php.phpMustBeEnabledOnOneSite') }}
</label>
</div>
</div>
</div>
</div>
<template v-else>
<div class="field is-horizontal is-aligned-top">
<div class="field-label has-margin-top">
<label class="label">{{ $t('templates.globalSections.php.phpServer') }}</label>
</div>
<div class="field-body">
<div class="field">
<div :class="`control${phpServerChanged ? ' is-changed' : ''}`">
<VueSelect v-model="phpServer"
:options="phpServerOptions"
:clearable="false"
:reduce="s => s.value"
></VueSelect>
</div>
<div v-if="phpServerCustomEnabled"
:class="`control${phpServerCustomChanged ? ' is-changed' : ''}`"
>
<input v-model="phpServerCustom" class="input" type="text" :placeholder="$props.data.phpServerCustom.default" />
</div>
</div>
</div>
</div>
<div class="field is-horizontal is-aligned-top">
<div class="field-label has-margin-top">
<label class="label">{{ $t('templates.globalSections.php.phpBackupServer') }}</label>
</div>
<div class="field-body">
<div class="field">
<div :class="`control${phpBackupServerChanged ? ' is-changed' : ''}`">
<VueSelect ref="phpBackupServerSelect"
v-model="phpBackupServer"
:options="phpBackupServerOptions"
:clearable="false"
:reduce="s => s.value"
></VueSelect>
</div>
<div v-if="phpBackupServerCustomEnabled"
:class="`control${phpBackupServerCustomChanged ? ' is-changed' : ''}`"
>
<input v-model="phpBackupServerCustom" class="input" type="text" :placeholder="$props.data.phpBackupServerCustom.default" />
</div>
</div>
</div>
</div>
</template>
</div>
</template>
<script>
import VueSelect from 'vue-select';
import delegatedFromDefaults from '../../util/delegated_from_defaults';
import computedFromDefaults from '../../util/computed_from_defaults';
// Value -> i18n key
const serverOptions = {
'127.0.0.1:9000': 'templates.globalSections.php.tcp',
'/var/run/hhvm/sock': 'templates.globalSections.php.hhvmSocket',
'/var/run/hhvm/hhvm.sock': 'templates.globalSections.php.hhvmSocket',
'/var/run/php5-fpm.sock': 'templates.globalSections.php.php5Socket',
'/var/run/php/php7.1-fpm.sock': 'templates.globalSections.php.php71Socket',
'/var/run/php/php7.2-fpm.sock': 'templates.globalSections.php.php72Socket',
'/var/run/php/php7.0-fpm.sock': 'templates.globalSections.php.php70Socket',
'/var/run/php/php7.3-fpm.sock': 'templates.globalSections.php.php73Socket',
'/var/run/php/php7.4-fpm.sock': 'templates.globalSections.php.php74Socket',
'/var/run/php/php8.0-fpm.sock': 'templates.globalSections.php.php80Socket',
'/var/run/php/php-fpm.sock': 'templates.globalSections.php.phpSocket',
'custom': 'templates.globalSections.php.custom',
};
const hiddenValues = ['', 'custom'];
const defaults = {
phpServer: {
default: '/var/run/php/php-fpm.sock',
options: serverOptions,
enabled: true,
},
phpServerCustom: {
default: 'unix:/var/run/php/php-fpm.sock',
enabled: false,
},
phpBackupServer: {
default: '',
options: { '': 'templates.globalSections.php.disabled', ...serverOptions },
enabled: true,
},
phpBackupServerCustom: {
default: 'unix:/var/run/php/php-fpm.sock',
enabled: false,
},
};
export default {
name: 'GlobalPHP', // Component name
display: 'common.php', // Display name for tab (i18n key)
key: 'php', // Key for data in parent
delegated: delegatedFromDefaults(defaults), // Data the parent will present here
components: {
VueSelect,
},
props: {
data: Object, // Data delegated back to us from parent
},
computed: {
...computedFromDefaults(defaults, 'php'), // Getters & setters for the delegated data
phpServerOptions() {
return Object.entries(this.$props.data.phpServer.options)
.map(([key, value]) => this.formattedOption(key, value));
},
phpBackupServerOptions() {
return Object.entries(this.$props.data.phpBackupServer.options)
.map(([key, value]) => this.formattedOption(key, value));
},
},
watch: {
// Check server selection is valid
'$props.data.phpServer': {
handler(data) {
if (data.enabled) {
// This might cause recursion, but seems not to
if (!Object.keys(data.options).includes(data.computed))
data.computed = data.default;
// Show the custom box
this.$props.data.phpServerCustom.enabled = data.computed === 'custom';
return;
}
// Hide custom if disabled
this.$props.data.phpServerCustom.enabled = false;
},
deep: true,
},
// Check backup server selection is valid
'$props.data.phpBackupServer': {
handler(data) {
if (data.enabled) {
// This might cause recursion, but seems not to
if (!Object.keys(data.options).includes(data.computed))
data.computed = data.default;
// Show the custom box
this.$props.data.phpBackupServerCustom.enabled = data.computed === 'custom';
return;
}
// Hide custom if disabled
this.$props.data.phpBackupServerCustom.enabled = false;
},
deep: true,
},
// Enable PHP server settings if any site uses PHP
'$parent.$parent.$data.domains': {
handler(data) {
for (const domain of data) {
if (domain && domain.php && domain.php.php && domain.php.php.computed) {
this.$props.data.phpServer.enabled = true;
this.$props.data.phpServer.computed = this.$props.data.phpServer.value;
this.$props.data.phpBackupServer.enabled = true;
this.$props.data.phpBackupServer.computed = this.$props.data.phpBackupServer.value;
return;
}
}
this.$props.data.phpServer.enabled = false;
this.$props.data.phpServer.computed = '';
this.$props.data.phpBackupServer.enabled = false;
this.$props.data.phpBackupServer.computed = '';
},
deep: true,
},
// Ensure 'Custom'/'Disabled' get translated in VueSelect on language switch
'$i18n.locale'() {
if (!this.$refs.phpServerOptions)
return false;
const updated = this.phpServerOptions
.find(x => x.value === this.$refs.phpServerOptions.$data._value.value);
if (updated) this.$refs.phpServerOptions.$data._value = updated;
const updatedBackup = this.phpBackupServerOptions
.find(x => x.value === this.$refs.phpBackupServerSelect.$data._value.value);
if (updatedBackup) this.$refs.phpBackupServerSelect.$data._value = updatedBackup;
},
},
methods: {
formattedOption(key, value) {
return {
label: `${this.$t(value)}${hiddenValues.includes(key) ? '' : `: ${key}`}`,
value: key,
};
},
},
};
</script>

View file

@ -1,5 +1,5 @@
/*
Copyright 2020 DigitalOcean
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at

View file

@ -24,22 +24,15 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
import common from '../../common';
export default {
phpServer: `${common.php} 服務`,
phpMustBeEnabledOnOneSite: `必須在至少一個網站上啟用${common.php}才能配寘全域${common.php}設定。`,
phpBackupServer: `${common.php}備份服務器`,
tcp: 'TCP',
hhvmSocket: 'HHVM socket',
php5Socket: '5.x socket',
php70Socket: '7.0 socket',
php71Socket: '7.1 socket',
php72Socket: '7.2 socket',
php73Socket: '7.3 socket',
php74Socket: '7.4 socket',
php80Socket: '8.0 socket',
phpSocket: 'PHP socket',
custom: '自定义',
disabled: '禁用',
export default (target, source) => {
const merge = (target, source) => {
Object.keys(source).forEach((key) => {
if (source[key] && typeof source[key] === 'object') {
merge(target[key] = target[key] || {}, source[key]);
return;
}
target[key] = source[key];
});
};
merge(target, source);
};

View file

@ -1,5 +1,5 @@
/*
Copyright 2020 DigitalOcean
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
@ -28,7 +28,8 @@ import qs from 'qs';
import clone from 'clone';
import Domain from '../templates/domain';
import isObject from './is_object';
import backwardsCompatibility from './backwards_compatibility';
import angularBackwardsCompatibility from './angular_backwards_compatibility';
import vueBackwardsCompatibility from './vue_backwards_compatibility';
const applyCategories = (categories, target) => {
// Work through each potential category
@ -86,7 +87,10 @@ export default (query, domains, global, nextTick) => new Promise(resolve => {
});
// Handle converting nginxconfig.io-angular params to the current version
backwardsCompatibility(data);
angularBackwardsCompatibility(data);
// Handle converting vue params to the current version
vueBackwardsCompatibility(data);
// Handle domains
if ('domains' in data && isObject(data.domains)) {

View file

@ -24,8 +24,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
export default (global, backup = false) => {
export default (domain, backup = false) => {
const key = `php${backup ? 'Backup' : ''}Server`;
if (global.php[key].computed === 'custom') return global.php[`${key}Custom`].computed;
return (global.php[key].computed[0] === '/' ? 'unix:' : '') + global.php[key].computed;
if (domain.php[key].computed === 'custom') return domain.php[`${key}Custom`].computed;
return (domain.php[key].computed[0] === '/' ? 'unix:' : '') + domain.php[key].computed;
};

View file

@ -24,22 +24,4 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
import common from '../../common';
export default {
phpServer: `${common.php} 服务`,
phpMustBeEnabledOnOneSite: `必须在至少一个站点上启用${common.php}才能配置全局${common.php}设置。`,
phpBackupServer: `${common.php}备份服务器`,
tcp: 'TCP',
hhvmSocket: 'HHVM socket',
php5Socket: '5.x socket',
php70Socket: '7.0 socket',
php71Socket: '7.1 socket',
php72Socket: '7.2 socket',
php73Socket: '7.3 socket',
php74Socket: '7.4 socket',
php80Socket: '8.0 socket',
phpSocket: 'PHP socket',
custom: '自定义',
disabled: '禁用',
};
export default (domain) => `php_${domain.server.domain.computed.replace(/\./g, '_')}`;

View file

@ -0,0 +1,71 @@
/*
Copyright 2021 DigitalOcean
This code is licensed under the MIT License.
You may obtain a copy of the License at
https://github.com/digitalocean/nginxconfig.io/blob/master/LICENSE or https://mit-license.org/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions :
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
import isObject from './is_object';
import deepMerge from './deep_merge';
// Handle converting the old query format to our new query params
export default data => {
// Handle converting old domain settings to new ones
if ('global' in data && isObject(data.global)) {
// Handle specifics global data
const mappedData = {
php: {},
};
// Keys to map
const keysToMap = {
php: [
'phpServer',
'phpServerCustom',
'phpBackupServer',
'phpBackupServerCustom',
],
};
for (const key in data.global) {
if (!Object.prototype.hasOwnProperty.call(data.global, key)) continue;
// Skip if key doesn't need to be mapped
if (!Object.prototype.hasOwnProperty.call(keysToMap, key)) continue;
for (const key2 in data.global[key]) {
if (!Object.prototype.hasOwnProperty.call(data.global[key], key2)) continue;
if (keysToMap[key].includes(key2)) {
mappedData[key][key2] = data.global[key][key2];
}
}
}
for (const key in data.domains) {
if (!Object.prototype.hasOwnProperty.call(data.domains, key)) continue;
// Deep merge the mapped data
deepMerge(data.domains[key], mappedData);
}
}
};