针对nginx+keeplived的vip映射管理方案 (#154)

* fixed environment indicator display overlay & edit not obtain newest data

* finished environment operation sync

* fix: environment indicator display overflow not ellipsis

---------

Co-authored-by: 0xJacky <me@jackyu.cn>
This commit is contained in:
superlollipop 2023-08-21 21:56:07 +08:00 committed by GitHub
parent 477bec07d8
commit 6ede443bbe
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 586 additions and 159 deletions

View file

@ -1,9 +1,10 @@
import Curd from '@/api/curd' import Curd from '@/api/curd'
import http from '@/lib/http' import http from '@/lib/http'
import {AxiosRequestConfig} from "axios/index";
class Domain extends Curd { class Domain extends Curd {
enable(name: string) { enable(name: string, config: AxiosRequestConfig) {
return http.post(this.baseUrl + '/' + name + '/enable') return http.post(this.baseUrl + '/' + name + '/enable', undefined, config)
} }
disable(name: string) { disable(name: string) {

View file

@ -75,9 +75,11 @@ watch(node_id, async () => {
justify-content: space-between; justify-content: space-between;
.env-name { .env-name {
max-width: 50px; max-width: 85px;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
line-height: 1em;
overflow: hidden;
} }
.ant-tag { .ant-tag {

View file

@ -10,7 +10,15 @@ export default defineComponent({
return () => { return () => {
const template: any = [] const template: any = []
props.dataList.forEach((v: any) => { props.dataList.forEach((v: any) => {
if (v.edit.type) { let show = true
if (v.edit.show) {
if (typeof v.edit.show === "boolean") {
show = v.edit.show
} else if (typeof v.edit.show === "function") {
show = v.edit.show(props.dataSource)
}
}
if (v.edit.type && show) {
template.push( template.push(
<StdFormItem dataIndex={v.dataIndex} label={v.title()} extra={v.extra} error={props.error}> <StdFormItem dataIndex={v.dataIndex} label={v.title()} extra={v.extra} error={props.error}>
{v.edit.type(v.edit, props.dataSource, v.dataIndex)} {v.edit.type(v.edit, props.dataSource, v.dataIndex)}

View file

@ -1,6 +1,6 @@
import StdDataEntry from './StdDataEntry.js' import StdDataEntry from './StdDataEntry.js'
import {h} from 'vue' import {h} from 'vue'
import {Input, InputNumber, Textarea} from 'ant-design-vue' import {Input, InputNumber, Textarea, Switch} from 'ant-design-vue'
import StdSelector from './components/StdSelector.vue' import StdSelector from './components/StdSelector.vue'
import StdSelect from './components/StdSelect.vue' import StdSelect from './components/StdSelect.vue'
import StdPassword from './components/StdPassword.vue' import StdPassword from './components/StdPassword.vue'
@ -110,6 +110,15 @@ function selector(edit: IEdit, dataSource: any, dataIndex: any) {
/> />
} }
function antSwitch(edit: IEdit, dataSource: any, dataIndex: any) {
return h(Switch, {
checked: dataSource?.[dataIndex],
'onUpdate:checked': value => {
dataSource[dataIndex] = value
}
})
}
export { export {
readonly, readonly,
input, input,
@ -117,7 +126,8 @@ export {
select, select,
selector, selector,
password, password,
inputNumber inputNumber,
antSwitch
} }
export default StdDataEntry export default StdDataEntry

View file

@ -19,7 +19,7 @@ msgstr ""
#: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:31 #: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:31
#: src/views/config/config.ts:35 src/views/domain/DomainList.vue:47 #: src/views/config/config.ts:35 src/views/domain/DomainList.vue:47
#: src/views/environment/Environment.vue:61 src/views/user/User.vue:43 #: src/views/environment/Environment.vue:92 src/views/user/User.vue:43
msgid "Action" msgid "Action"
msgstr "Action" msgstr "Action"
@ -604,6 +604,7 @@ msgid "Enabled"
msgstr "Enabled" msgstr "Enabled"
#: src/views/domain/components/RightSettings.vue:26 #: src/views/domain/components/RightSettings.vue:26
#: src/views/domain/components/SiteDuplicate.vue:85
#: src/views/domain/DomainAdd.vue:49 src/views/domain/DomainList.vue:59 #: src/views/domain/DomainAdd.vue:49 src/views/domain/DomainList.vue:59
msgid "Enabled successfully" msgid "Enabled successfully"
msgstr "Enabled successfully" msgstr "Enabled successfully"
@ -926,7 +927,11 @@ msgstr ""
msgid "Next" msgid "Next"
msgstr "Next" msgstr "Next"
#: src/views/preference/NginxLogSettings.vue:3 #: src/views/preference/Preference.vue:8
msgid "Nginx"
msgstr ""
#: src/views/preference/NginxSettings.vue:3
msgid "Nginx Access Log Path" msgid "Nginx Access Log Path"
msgstr "" msgstr ""
@ -941,12 +946,11 @@ msgstr "Configuration Name"
msgid "Nginx Control" msgid "Nginx Control"
msgstr "" msgstr ""
#: src/views/preference/NginxLogSettings.vue:6 #: src/views/preference/NginxSettings.vue:6
msgid "Nginx Error Log Path" msgid "Nginx Error Log Path"
msgstr "" msgstr ""
#: src/routes/index.ts:110 src/views/nginx_log/NginxLog.vue:2 #: src/routes/index.ts:110 src/views/nginx_log/NginxLog.vue:2
#: src/views/preference/Preference.vue:8
msgid "Nginx Log" msgid "Nginx Log"
msgstr "" msgstr ""
@ -998,7 +1002,7 @@ msgstr ""
#: src/components/NodeSelector/NodeSelector.vue:11 #: src/components/NodeSelector/NodeSelector.vue:11
#: src/views/dashboard/Environments.vue:15 #: src/views/dashboard/Environments.vue:15
#: src/views/dashboard/Environments.vue:16 #: src/views/dashboard/Environments.vue:16
#: src/views/environment/Environment.vue:48 #: src/views/environment/Environment.vue:79
msgid "Offline" msgid "Offline"
msgstr "" msgstr ""
@ -1022,7 +1026,7 @@ msgstr ""
#: src/components/NodeSelector/NodeSelector.vue:9 #: src/components/NodeSelector/NodeSelector.vue:9
#: src/views/dashboard/Environments.vue:14 #: src/views/dashboard/Environments.vue:14
#: src/views/dashboard/Environments.vue:15 #: src/views/dashboard/Environments.vue:15
#: src/views/environment/Environment.vue:45 #: src/views/environment/Environment.vue:76
msgid "Online" msgid "Online"
msgstr "" msgstr ""
@ -1030,6 +1034,10 @@ msgstr ""
msgid "OpenAI" msgid "OpenAI"
msgstr "" msgstr ""
#: src/views/environment/Environment.vue:38
msgid "OperationSync"
msgstr ""
#: src/views/system/Upgrade.vue:14 src/views/system/Upgrade.vue:15 #: src/views/system/Upgrade.vue:14 src/views/system/Upgrade.vue:15
#: src/views/system/Upgrade.vue:19 src/views/system/Upgrade.vue:23 #: src/views/system/Upgrade.vue:19 src/views/system/Upgrade.vue:23
#: src/views/system/Upgrade.vue:27 #: src/views/system/Upgrade.vue:27
@ -1249,7 +1257,7 @@ msgid "Save error %{msg}"
msgstr "Save error %{msg}" msgstr "Save error %{msg}"
#: src/components/StdDataDisplay/StdBatchEdit.vue:39 #: src/components/StdDataDisplay/StdBatchEdit.vue:39
#: src/views/preference/Preference.vue:60 #: src/views/preference/Preference.vue:66
#, fuzzy #, fuzzy
msgid "Save successfully" msgid "Save successfully"
msgstr "Saved successfully" msgstr "Saved successfully"
@ -1281,7 +1289,7 @@ msgstr "Send"
#: src/components/StdDataDisplay/StdTable.vue:343 #: src/components/StdDataDisplay/StdTable.vue:343
#: src/components/StdDataDisplay/StdTable.vue:463 #: src/components/StdDataDisplay/StdTable.vue:463
#: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:83 #: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:83
#: src/views/other/Install.vue:71 src/views/preference/Preference.vue:62 #: src/views/other/Install.vue:71 src/views/preference/Preference.vue:68
#: src/views/system/Upgrade.vue:54 #: src/views/system/Upgrade.vue:54
msgid "Server error" msgid "Server error"
msgstr "Server error" msgstr "Server error"
@ -1348,7 +1356,7 @@ msgstr "Certificate Status"
msgid "Stable" msgid "Stable"
msgstr "Enabled" msgstr "Enabled"
#: src/views/domain/DomainList.vue:24 src/views/environment/Environment.vue:38 #: src/views/domain/DomainList.vue:24 src/views/environment/Environment.vue:69
msgid "Status" msgid "Status"
msgstr "Status" msgstr "Status"
@ -1364,10 +1372,20 @@ msgstr "Storage"
msgid "Subject Name: %{name}" msgid "Subject Name: %{name}"
msgstr "Subject Name: %{name}" msgstr "Subject Name: %{name}"
#: src/views/environment/Environment.vue:67
msgid ""
"Such as Reload and Configs, regex can configure as `/api/nginx/reload|/api/"
"nginx/test|/api/config/.+`, please see system api"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:40 #: src/views/dashboard/ServerAnalytic.vue:40
msgid "Swap" msgid "Swap"
msgstr "Swap" msgstr "Swap"
#: src/views/environment/Environment.vue:55
msgid "SyncApiRegex"
msgstr ""
#: src/routes/index.ts:157 #: src/routes/index.ts:157
msgid "System" msgid "System"
msgstr "" msgstr ""
@ -1435,10 +1453,6 @@ msgid ""
"continue?" "continue?"
msgstr "" msgstr ""
#: src/views/environment/Environment.vue:30
msgid "Token"
msgstr ""
#: src/views/config/config.ts:13 #: src/views/config/config.ts:13
msgid "Type" msgid "Type"
msgstr "" msgstr ""
@ -1446,7 +1460,7 @@ msgstr ""
#: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:25 #: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:25
#: src/views/config/config.ts:28 src/views/config/ConfigEdit.vue:31 #: src/views/config/config.ts:28 src/views/config/ConfigEdit.vue:31
#: src/views/domain/components/RightSettings.vue:11 #: src/views/domain/components/RightSettings.vue:11
#: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:55 #: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:86
#: src/views/user/User.vue:37 #: src/views/user/User.vue:37
msgid "Updated at" msgid "Updated at"
msgstr "Updated at" msgstr "Updated at"
@ -1520,6 +1534,10 @@ msgid ""
"Nginx. Are you sure you want to continue?" "Nginx. Are you sure you want to continue?"
msgstr "" msgstr ""
#: src/views/environment/Environment.vue:45
msgid "Whether config api regex that will redo on this environment"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:104 #: src/views/dashboard/ServerAnalytic.vue:104
#: src/views/dashboard/ServerAnalytic.vue:29 #: src/views/dashboard/ServerAnalytic.vue:29
msgid "Writes" msgid "Writes"

View file

@ -22,7 +22,7 @@ msgstr "Registros de acceso"
#: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:31 #: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:31
#: src/views/config/config.ts:35 src/views/domain/DomainList.vue:47 #: src/views/config/config.ts:35 src/views/domain/DomainList.vue:47
#: src/views/environment/Environment.vue:61 src/views/user/User.vue:43 #: src/views/environment/Environment.vue:92 src/views/user/User.vue:43
msgid "Action" msgid "Action"
msgstr "Acción" msgstr "Acción"
@ -588,6 +588,7 @@ msgid "Enabled"
msgstr "Habilitado" msgstr "Habilitado"
#: src/views/domain/components/RightSettings.vue:26 #: src/views/domain/components/RightSettings.vue:26
#: src/views/domain/components/SiteDuplicate.vue:85
#: src/views/domain/DomainAdd.vue:49 src/views/domain/DomainList.vue:59 #: src/views/domain/DomainAdd.vue:49 src/views/domain/DomainList.vue:59
msgid "Enabled successfully" msgid "Enabled successfully"
msgstr "Habilitado con éxito" msgstr "Habilitado con éxito"
@ -901,7 +902,12 @@ msgstr "Se liberó una nueva versión"
msgid "Next" msgid "Next"
msgstr "Siguiente" msgstr "Siguiente"
#: src/views/preference/NginxLogSettings.vue:3 #: src/views/preference/Preference.vue:8
#, fuzzy
msgid "Nginx"
msgstr "Registro Nginx"
#: src/views/preference/NginxSettings.vue:3
msgid "Nginx Access Log Path" msgid "Nginx Access Log Path"
msgstr "Ruta de registro de acceso de Nginx" msgstr "Ruta de registro de acceso de Nginx"
@ -915,12 +921,11 @@ msgstr "Error de análisis de configuración de Nginx"
msgid "Nginx Control" msgid "Nginx Control"
msgstr "Control de Nginx" msgstr "Control de Nginx"
#: src/views/preference/NginxLogSettings.vue:6 #: src/views/preference/NginxSettings.vue:6
msgid "Nginx Error Log Path" msgid "Nginx Error Log Path"
msgstr "Ruta de registro de errores de Nginx" msgstr "Ruta de registro de errores de Nginx"
#: src/routes/index.ts:110 src/views/nginx_log/NginxLog.vue:2 #: src/routes/index.ts:110 src/views/nginx_log/NginxLog.vue:2
#: src/views/preference/Preference.vue:8
msgid "Nginx Log" msgid "Nginx Log"
msgstr "Registro Nginx" msgstr "Registro Nginx"
@ -969,7 +974,7 @@ msgstr "Obteniendo certificado"
#: src/components/NodeSelector/NodeSelector.vue:11 #: src/components/NodeSelector/NodeSelector.vue:11
#: src/views/dashboard/Environments.vue:15 #: src/views/dashboard/Environments.vue:15
#: src/views/dashboard/Environments.vue:16 #: src/views/dashboard/Environments.vue:16
#: src/views/environment/Environment.vue:48 #: src/views/environment/Environment.vue:79
msgid "Offline" msgid "Offline"
msgstr "Desconectado" msgstr "Desconectado"
@ -993,7 +998,7 @@ msgstr "OK"
#: src/components/NodeSelector/NodeSelector.vue:9 #: src/components/NodeSelector/NodeSelector.vue:9
#: src/views/dashboard/Environments.vue:14 #: src/views/dashboard/Environments.vue:14
#: src/views/dashboard/Environments.vue:15 #: src/views/dashboard/Environments.vue:15
#: src/views/environment/Environment.vue:45 #: src/views/environment/Environment.vue:76
msgid "Online" msgid "Online"
msgstr "Conectado" msgstr "Conectado"
@ -1001,6 +1006,10 @@ msgstr "Conectado"
msgid "OpenAI" msgid "OpenAI"
msgstr "OpenAI" msgstr "OpenAI"
#: src/views/environment/Environment.vue:38
msgid "OperationSync"
msgstr ""
#: src/views/system/Upgrade.vue:14 src/views/system/Upgrade.vue:15 #: src/views/system/Upgrade.vue:14 src/views/system/Upgrade.vue:15
#: src/views/system/Upgrade.vue:19 src/views/system/Upgrade.vue:23 #: src/views/system/Upgrade.vue:19 src/views/system/Upgrade.vue:23
#: src/views/system/Upgrade.vue:27 #: src/views/system/Upgrade.vue:27
@ -1226,7 +1235,7 @@ msgid "Save error %{msg}"
msgstr "Error al guardar %{msg}" msgstr "Error al guardar %{msg}"
#: src/components/StdDataDisplay/StdBatchEdit.vue:39 #: src/components/StdDataDisplay/StdBatchEdit.vue:39
#: src/views/preference/Preference.vue:60 #: src/views/preference/Preference.vue:66
msgid "Save successfully" msgid "Save successfully"
msgstr "Guardado con éxito" msgstr "Guardado con éxito"
@ -1256,7 +1265,7 @@ msgstr "Enviado"
#: src/components/StdDataDisplay/StdTable.vue:343 #: src/components/StdDataDisplay/StdTable.vue:343
#: src/components/StdDataDisplay/StdTable.vue:463 #: src/components/StdDataDisplay/StdTable.vue:463
#: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:83 #: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:83
#: src/views/other/Install.vue:71 src/views/preference/Preference.vue:62 #: src/views/other/Install.vue:71 src/views/preference/Preference.vue:68
#: src/views/system/Upgrade.vue:54 #: src/views/system/Upgrade.vue:54
msgid "Server error" msgid "Server error"
msgstr "Error del servidor" msgstr "Error del servidor"
@ -1317,7 +1326,7 @@ msgstr "Contenido de la llave del certificado SSL"
msgid "Stable" msgid "Stable"
msgstr "Estable" msgstr "Estable"
#: src/views/domain/DomainList.vue:24 src/views/environment/Environment.vue:38 #: src/views/domain/DomainList.vue:24 src/views/environment/Environment.vue:69
msgid "Status" msgid "Status"
msgstr "Estado" msgstr "Estado"
@ -1333,10 +1342,20 @@ msgstr "Almacenamiento"
msgid "Subject Name: %{name}" msgid "Subject Name: %{name}"
msgstr "Nombre del asunto: %{name}" msgstr "Nombre del asunto: %{name}"
#: src/views/environment/Environment.vue:67
msgid ""
"Such as Reload and Configs, regex can configure as `/api/nginx/reload|/api/"
"nginx/test|/api/config/.+`, please see system api"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:40 #: src/views/dashboard/ServerAnalytic.vue:40
msgid "Swap" msgid "Swap"
msgstr "Swap" msgstr "Swap"
#: src/views/environment/Environment.vue:55
msgid "SyncApiRegex"
msgstr ""
#: src/routes/index.ts:157 #: src/routes/index.ts:157
msgid "System" msgid "System"
msgstr "Sistema" msgstr "Sistema"
@ -1406,10 +1425,6 @@ msgstr ""
"de la autoridad al backend, y debemos guardar este archivo y volver a cargar " "de la autoridad al backend, y debemos guardar este archivo y volver a cargar "
"Nginx. ¿Estás seguro de que quieres continuar?" "Nginx. ¿Estás seguro de que quieres continuar?"
#: src/views/environment/Environment.vue:30
msgid "Token"
msgstr "Token"
#: src/views/config/config.ts:13 #: src/views/config/config.ts:13
msgid "Type" msgid "Type"
msgstr "Tipo" msgstr "Tipo"
@ -1417,7 +1432,7 @@ msgstr "Tipo"
#: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:25 #: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:25
#: src/views/config/config.ts:28 src/views/config/ConfigEdit.vue:31 #: src/views/config/config.ts:28 src/views/config/ConfigEdit.vue:31
#: src/views/domain/components/RightSettings.vue:11 #: src/views/domain/components/RightSettings.vue:11
#: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:55 #: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:86
#: src/views/user/User.vue:37 #: src/views/user/User.vue:37
msgid "Updated at" msgid "Updated at"
msgstr "Actualizado a" msgstr "Actualizado a"
@ -1490,6 +1505,10 @@ msgstr ""
"Eliminaremos la configuración de HTTPChallenge de este archivo y " "Eliminaremos la configuración de HTTPChallenge de este archivo y "
"recargaremos Nginx. ¿Estás seguro de que quieres continuar?" "recargaremos Nginx. ¿Estás seguro de que quieres continuar?"
#: src/views/environment/Environment.vue:45
msgid "Whether config api regex that will redo on this environment"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:104 #: src/views/dashboard/ServerAnalytic.vue:104
#: src/views/dashboard/ServerAnalytic.vue:29 #: src/views/dashboard/ServerAnalytic.vue:29
msgid "Writes" msgid "Writes"
@ -1521,3 +1540,6 @@ msgstr "Puede consultar la actualización de Nginx UI en esta página."
msgctxt "Project" msgctxt "Project"
msgid "License" msgid "License"
msgstr "Licencia" msgstr "Licencia"
#~ msgid "Token"
#~ msgstr "Token"

View file

@ -21,7 +21,7 @@ msgstr "Journaux d'accès"
#: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:31 #: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:31
#: src/views/config/config.ts:35 src/views/domain/DomainList.vue:47 #: src/views/config/config.ts:35 src/views/domain/DomainList.vue:47
#: src/views/environment/Environment.vue:61 src/views/user/User.vue:43 #: src/views/environment/Environment.vue:92 src/views/user/User.vue:43
msgid "Action" msgid "Action"
msgstr "Action" msgstr "Action"
@ -599,6 +599,7 @@ msgid "Enabled"
msgstr "Activé" msgstr "Activé"
#: src/views/domain/components/RightSettings.vue:26 #: src/views/domain/components/RightSettings.vue:26
#: src/views/domain/components/SiteDuplicate.vue:85
#: src/views/domain/DomainAdd.vue:49 src/views/domain/DomainList.vue:59 #: src/views/domain/DomainAdd.vue:49 src/views/domain/DomainList.vue:59
msgid "Enabled successfully" msgid "Enabled successfully"
msgstr "Activé avec succès" msgstr "Activé avec succès"
@ -918,7 +919,12 @@ msgstr "Nouvelle version publiée"
msgid "Next" msgid "Next"
msgstr "Suivant" msgstr "Suivant"
#: src/views/preference/NginxLogSettings.vue:3 #: src/views/preference/Preference.vue:8
#, fuzzy
msgid "Nginx"
msgstr "Journal Nginx"
#: src/views/preference/NginxSettings.vue:3
msgid "Nginx Access Log Path" msgid "Nginx Access Log Path"
msgstr "Chemin du journal d'accès Nginx" msgstr "Chemin du journal d'accès Nginx"
@ -932,12 +938,11 @@ msgstr "Erreur d'analyse de configuration Nginx"
msgid "Nginx Control" msgid "Nginx Control"
msgstr "Contrôle Nginx" msgstr "Contrôle Nginx"
#: src/views/preference/NginxLogSettings.vue:6 #: src/views/preference/NginxSettings.vue:6
msgid "Nginx Error Log Path" msgid "Nginx Error Log Path"
msgstr "Chemin du journal des erreurs Nginx" msgstr "Chemin du journal des erreurs Nginx"
#: src/routes/index.ts:110 src/views/nginx_log/NginxLog.vue:2 #: src/routes/index.ts:110 src/views/nginx_log/NginxLog.vue:2
#: src/views/preference/Preference.vue:8
msgid "Nginx Log" msgid "Nginx Log"
msgstr "Journal Nginx" msgstr "Journal Nginx"
@ -987,7 +992,7 @@ msgstr "Obtention du certificat"
#: src/components/NodeSelector/NodeSelector.vue:11 #: src/components/NodeSelector/NodeSelector.vue:11
#: src/views/dashboard/Environments.vue:15 #: src/views/dashboard/Environments.vue:15
#: src/views/dashboard/Environments.vue:16 #: src/views/dashboard/Environments.vue:16
#: src/views/environment/Environment.vue:48 #: src/views/environment/Environment.vue:79
msgid "Offline" msgid "Offline"
msgstr "" msgstr ""
@ -1011,7 +1016,7 @@ msgstr "OK"
#: src/components/NodeSelector/NodeSelector.vue:9 #: src/components/NodeSelector/NodeSelector.vue:9
#: src/views/dashboard/Environments.vue:14 #: src/views/dashboard/Environments.vue:14
#: src/views/dashboard/Environments.vue:15 #: src/views/dashboard/Environments.vue:15
#: src/views/environment/Environment.vue:45 #: src/views/environment/Environment.vue:76
msgid "Online" msgid "Online"
msgstr "" msgstr ""
@ -1019,6 +1024,10 @@ msgstr ""
msgid "OpenAI" msgid "OpenAI"
msgstr "OpenAI" msgstr "OpenAI"
#: src/views/environment/Environment.vue:38
msgid "OperationSync"
msgstr ""
#: src/views/system/Upgrade.vue:14 src/views/system/Upgrade.vue:15 #: src/views/system/Upgrade.vue:14 src/views/system/Upgrade.vue:15
#: src/views/system/Upgrade.vue:19 src/views/system/Upgrade.vue:23 #: src/views/system/Upgrade.vue:19 src/views/system/Upgrade.vue:23
#: src/views/system/Upgrade.vue:27 #: src/views/system/Upgrade.vue:27
@ -1249,7 +1258,7 @@ msgid "Save error %{msg}"
msgstr "Enregistrer l'erreur %{msg}" msgstr "Enregistrer l'erreur %{msg}"
#: src/components/StdDataDisplay/StdBatchEdit.vue:39 #: src/components/StdDataDisplay/StdBatchEdit.vue:39
#: src/views/preference/Preference.vue:60 #: src/views/preference/Preference.vue:66
msgid "Save successfully" msgid "Save successfully"
msgstr "Sauvegarde réussie" msgstr "Sauvegarde réussie"
@ -1279,7 +1288,7 @@ msgstr "Envoyer"
#: src/components/StdDataDisplay/StdTable.vue:343 #: src/components/StdDataDisplay/StdTable.vue:343
#: src/components/StdDataDisplay/StdTable.vue:463 #: src/components/StdDataDisplay/StdTable.vue:463
#: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:83 #: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:83
#: src/views/other/Install.vue:71 src/views/preference/Preference.vue:62 #: src/views/other/Install.vue:71 src/views/preference/Preference.vue:68
#: src/views/system/Upgrade.vue:54 #: src/views/system/Upgrade.vue:54
msgid "Server error" msgid "Server error"
msgstr "Erreur du serveur" msgstr "Erreur du serveur"
@ -1341,7 +1350,7 @@ msgstr "Contenu de la clé de certification SSL"
msgid "Stable" msgid "Stable"
msgstr "Tableau" msgstr "Tableau"
#: src/views/domain/DomainList.vue:24 src/views/environment/Environment.vue:38 #: src/views/domain/DomainList.vue:24 src/views/environment/Environment.vue:69
msgid "Status" msgid "Status"
msgstr "Statut" msgstr "Statut"
@ -1357,11 +1366,21 @@ msgstr "Stockage"
msgid "Subject Name: %{name}" msgid "Subject Name: %{name}"
msgstr "Nom du sujet : %{name}" msgstr "Nom du sujet : %{name}"
#: src/views/environment/Environment.vue:67
msgid ""
"Such as Reload and Configs, regex can configure as `/api/nginx/reload|/api/"
"nginx/test|/api/config/.+`, please see system api"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:40 #: src/views/dashboard/ServerAnalytic.vue:40
#, fuzzy #, fuzzy
msgid "Swap" msgid "Swap"
msgstr "Échanger" msgstr "Échanger"
#: src/views/environment/Environment.vue:55
msgid "SyncApiRegex"
msgstr ""
#: src/routes/index.ts:157 #: src/routes/index.ts:157
msgid "System" msgid "System"
msgstr "Système" msgstr "Système"
@ -1434,11 +1453,6 @@ msgstr ""
"transmettre la demande de l'autorité au backend, et nous devons enregistrer " "transmettre la demande de l'autorité au backend, et nous devons enregistrer "
"ce fichier et recharger le Nginx. Êtes-vous sûr de vouloir continuer?" "ce fichier et recharger le Nginx. Êtes-vous sûr de vouloir continuer?"
#: src/views/environment/Environment.vue:30
#, fuzzy
msgid "Token"
msgstr "Jeton d'API"
#: src/views/config/config.ts:13 #: src/views/config/config.ts:13
msgid "Type" msgid "Type"
msgstr "Type" msgstr "Type"
@ -1446,7 +1460,7 @@ msgstr "Type"
#: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:25 #: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:25
#: src/views/config/config.ts:28 src/views/config/ConfigEdit.vue:31 #: src/views/config/config.ts:28 src/views/config/ConfigEdit.vue:31
#: src/views/domain/components/RightSettings.vue:11 #: src/views/domain/components/RightSettings.vue:11
#: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:55 #: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:86
#: src/views/user/User.vue:37 #: src/views/user/User.vue:37
msgid "Updated at" msgid "Updated at"
msgstr "Mis à jour le" msgstr "Mis à jour le"
@ -1520,6 +1534,10 @@ msgstr ""
"Nous allons supprimer la configuration HTTPChallenge de ce fichier et " "Nous allons supprimer la configuration HTTPChallenge de ce fichier et "
"recharger le Nginx. Êtes-vous sûr de vouloir continuer?" "recharger le Nginx. Êtes-vous sûr de vouloir continuer?"
#: src/views/environment/Environment.vue:45
msgid "Whether config api regex that will redo on this environment"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:104 #: src/views/dashboard/ServerAnalytic.vue:104
#: src/views/dashboard/ServerAnalytic.vue:29 #: src/views/dashboard/ServerAnalytic.vue:29
msgid "Writes" msgid "Writes"
@ -1552,6 +1570,10 @@ msgctxt "Project"
msgid "License" msgid "License"
msgstr "Licence" msgstr "Licence"
#, fuzzy
#~ msgid "Token"
#~ msgstr "Jeton d'API"
#~ msgid "Git" #~ msgid "Git"
#~ msgstr "Git" #~ msgstr "Git"

View file

@ -15,7 +15,7 @@ msgstr ""
#: src/views/cert/DNSCredential.vue:31 #: src/views/cert/DNSCredential.vue:31
#: src/views/config/config.ts:35 #: src/views/config/config.ts:35
#: src/views/domain/DomainList.vue:47 #: src/views/domain/DomainList.vue:47
#: src/views/environment/Environment.vue:61 #: src/views/environment/Environment.vue:92
#: src/views/user/User.vue:43 #: src/views/user/User.vue:43
msgid "Action" msgid "Action"
msgstr "" msgstr ""
@ -616,6 +616,7 @@ msgid "Enabled"
msgstr "" msgstr ""
#: src/views/domain/components/RightSettings.vue:26 #: src/views/domain/components/RightSettings.vue:26
#: src/views/domain/components/SiteDuplicate.vue:85
#: src/views/domain/DomainAdd.vue:49 #: src/views/domain/DomainAdd.vue:49
#: src/views/domain/DomainList.vue:59 #: src/views/domain/DomainList.vue:59
msgid "Enabled successfully" msgid "Enabled successfully"
@ -942,7 +943,11 @@ msgstr ""
msgid "Next" msgid "Next"
msgstr "" msgstr ""
#: src/views/preference/NginxLogSettings.vue:3 #: src/views/preference/Preference.vue:8
msgid "Nginx"
msgstr ""
#: src/views/preference/NginxSettings.vue:3
msgid "Nginx Access Log Path" msgid "Nginx Access Log Path"
msgstr "" msgstr ""
@ -956,13 +961,12 @@ msgstr ""
msgid "Nginx Control" msgid "Nginx Control"
msgstr "" msgstr ""
#: src/views/preference/NginxLogSettings.vue:6 #: src/views/preference/NginxSettings.vue:6
msgid "Nginx Error Log Path" msgid "Nginx Error Log Path"
msgstr "" msgstr ""
#: src/routes/index.ts:110 #: src/routes/index.ts:110
#: src/views/nginx_log/NginxLog.vue:2 #: src/views/nginx_log/NginxLog.vue:2
#: src/views/preference/Preference.vue:8
msgid "Nginx Log" msgid "Nginx Log"
msgstr "" msgstr ""
@ -1012,7 +1016,7 @@ msgstr ""
#: src/components/NodeSelector/NodeSelector.vue:11 #: src/components/NodeSelector/NodeSelector.vue:11
#: src/views/dashboard/Environments.vue:15 #: src/views/dashboard/Environments.vue:15
#: src/views/dashboard/Environments.vue:16 #: src/views/dashboard/Environments.vue:16
#: src/views/environment/Environment.vue:48 #: src/views/environment/Environment.vue:79
msgid "Offline" msgid "Offline"
msgstr "" msgstr ""
@ -1036,7 +1040,7 @@ msgstr ""
#: src/components/NodeSelector/NodeSelector.vue:9 #: src/components/NodeSelector/NodeSelector.vue:9
#: src/views/dashboard/Environments.vue:14 #: src/views/dashboard/Environments.vue:14
#: src/views/dashboard/Environments.vue:15 #: src/views/dashboard/Environments.vue:15
#: src/views/environment/Environment.vue:45 #: src/views/environment/Environment.vue:76
msgid "Online" msgid "Online"
msgstr "" msgstr ""
@ -1044,6 +1048,10 @@ msgstr ""
msgid "OpenAI" msgid "OpenAI"
msgstr "" msgstr ""
#: src/views/environment/Environment.vue:38
msgid "OperationSync"
msgstr ""
#: src/views/system/Upgrade.vue:14 #: src/views/system/Upgrade.vue:14
#: src/views/system/Upgrade.vue:15 #: src/views/system/Upgrade.vue:15
#: src/views/system/Upgrade.vue:19 #: src/views/system/Upgrade.vue:19
@ -1274,7 +1282,7 @@ msgid "Save error %{msg}"
msgstr "" msgstr ""
#: src/components/StdDataDisplay/StdBatchEdit.vue:39 #: src/components/StdDataDisplay/StdBatchEdit.vue:39
#: src/views/preference/Preference.vue:60 #: src/views/preference/Preference.vue:66
msgid "Save successfully" msgid "Save successfully"
msgstr "" msgstr ""
@ -1307,7 +1315,7 @@ msgstr ""
#: src/views/config/ConfigEdit.vue:41 #: src/views/config/ConfigEdit.vue:41
#: src/views/domain/DomainList.vue:83 #: src/views/domain/DomainList.vue:83
#: src/views/other/Install.vue:71 #: src/views/other/Install.vue:71
#: src/views/preference/Preference.vue:62 #: src/views/preference/Preference.vue:68
#: src/views/system/Upgrade.vue:54 #: src/views/system/Upgrade.vue:54
msgid "Server error" msgid "Server error"
msgstr "" msgstr ""
@ -1374,7 +1382,7 @@ msgid "Stable"
msgstr "" msgstr ""
#: src/views/domain/DomainList.vue:24 #: src/views/domain/DomainList.vue:24
#: src/views/environment/Environment.vue:38 #: src/views/environment/Environment.vue:69
msgid "Status" msgid "Status"
msgstr "" msgstr ""
@ -1390,10 +1398,18 @@ msgstr ""
msgid "Subject Name: %{name}" msgid "Subject Name: %{name}"
msgstr "" msgstr ""
#: src/views/environment/Environment.vue:67
msgid "Such as Reload and Configs, regex can configure as `/api/nginx/reload|/api/nginx/test|/api/config/.+`, please see system api"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:40 #: src/views/dashboard/ServerAnalytic.vue:40
msgid "Swap" msgid "Swap"
msgstr "" msgstr ""
#: src/views/environment/Environment.vue:55
msgid "SyncApiRegex"
msgstr ""
#: src/routes/index.ts:157 #: src/routes/index.ts:157
msgid "System" msgid "System"
msgstr "" msgstr ""
@ -1447,10 +1463,6 @@ msgstr ""
msgid "To make sure the certification auto-renewal can work normally, we need to add a location which can proxy the request from authority to backend, and we need to save this file and reload the Nginx. Are you sure you want to continue?" msgid "To make sure the certification auto-renewal can work normally, we need to add a location which can proxy the request from authority to backend, and we need to save this file and reload the Nginx. Are you sure you want to continue?"
msgstr "" msgstr ""
#: src/views/environment/Environment.vue:30
msgid "Token"
msgstr ""
#: src/views/config/config.ts:13 #: src/views/config/config.ts:13
msgid "Type" msgid "Type"
msgstr "" msgstr ""
@ -1461,7 +1473,7 @@ msgstr ""
#: src/views/config/ConfigEdit.vue:31 #: src/views/config/ConfigEdit.vue:31
#: src/views/domain/components/RightSettings.vue:11 #: src/views/domain/components/RightSettings.vue:11
#: src/views/domain/DomainList.vue:41 #: src/views/domain/DomainList.vue:41
#: src/views/environment/Environment.vue:55 #: src/views/environment/Environment.vue:86
#: src/views/user/User.vue:37 #: src/views/user/User.vue:37
msgid "Updated at" msgid "Updated at"
msgstr "" msgstr ""
@ -1536,6 +1548,10 @@ msgstr ""
msgid "We will remove the HTTPChallenge configuration from this file and reload the Nginx. Are you sure you want to continue?" msgid "We will remove the HTTPChallenge configuration from this file and reload the Nginx. Are you sure you want to continue?"
msgstr "" msgstr ""
#: src/views/environment/Environment.vue:45
msgid "Whether config api regex that will redo on this environment"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:104 #: src/views/dashboard/ServerAnalytic.vue:104
#: src/views/dashboard/ServerAnalytic.vue:29 #: src/views/dashboard/ServerAnalytic.vue:29
msgid "Writes" msgid "Writes"

View file

@ -19,7 +19,7 @@ msgstr "Журнал доступа"
#: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:31 #: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:31
#: src/views/config/config.ts:35 src/views/domain/DomainList.vue:47 #: src/views/config/config.ts:35 src/views/domain/DomainList.vue:47
#: src/views/environment/Environment.vue:61 src/views/user/User.vue:43 #: src/views/environment/Environment.vue:92 src/views/user/User.vue:43
msgid "Action" msgid "Action"
msgstr "Действие" msgstr "Действие"
@ -511,7 +511,8 @@ msgstr "Конфигурация домена успешно создана"
#: src/views/cert/Cert.vue:21 #: src/views/cert/Cert.vue:21
msgid "Domains list is empty, try to reopen auto-cert for %{config}" msgid "Domains list is empty, try to reopen auto-cert for %{config}"
msgstr "Список доменов пуст, попробуйте заново открыть авто-сертификат для %{config}" msgstr ""
"Список доменов пуст, попробуйте заново открыть авто-сертификат для %{config}"
#: src/language/constants.ts:29 #: src/language/constants.ts:29
msgid "Download latest release error" msgid "Download latest release error"
@ -604,6 +605,7 @@ msgid "Enabled"
msgstr "Влючено" msgstr "Влючено"
#: src/views/domain/components/RightSettings.vue:26 #: src/views/domain/components/RightSettings.vue:26
#: src/views/domain/components/SiteDuplicate.vue:85
#: src/views/domain/DomainAdd.vue:49 src/views/domain/DomainList.vue:59 #: src/views/domain/DomainAdd.vue:49 src/views/domain/DomainList.vue:59
msgid "Enabled successfully" msgid "Enabled successfully"
msgstr "Активировано успешно" msgstr "Активировано успешно"
@ -926,7 +928,12 @@ msgstr "Вышла новая версия"
msgid "Next" msgid "Next"
msgstr "Дальше" msgstr "Дальше"
#: src/views/preference/NginxLogSettings.vue:3 #: src/views/preference/Preference.vue:8
#, fuzzy
msgid "Nginx"
msgstr "Журнал"
#: src/views/preference/NginxSettings.vue:3
msgid "Nginx Access Log Path" msgid "Nginx Access Log Path"
msgstr "Путь для Nginx Access Log" msgstr "Путь для Nginx Access Log"
@ -941,12 +948,11 @@ msgstr "Ошибка синтаксического анализа конфиг
msgid "Nginx Control" msgid "Nginx Control"
msgstr "Управление Nginx" msgstr "Управление Nginx"
#: src/views/preference/NginxLogSettings.vue:6 #: src/views/preference/NginxSettings.vue:6
msgid "Nginx Error Log Path" msgid "Nginx Error Log Path"
msgstr "Путь для Nginx Error Log" msgstr "Путь для Nginx Error Log"
#: src/routes/index.ts:110 src/views/nginx_log/NginxLog.vue:2 #: src/routes/index.ts:110 src/views/nginx_log/NginxLog.vue:2
#: src/views/preference/Preference.vue:8
msgid "Nginx Log" msgid "Nginx Log"
msgstr "Журнал" msgstr "Журнал"
@ -998,7 +1004,7 @@ msgstr "Получение сертификата"
#: src/components/NodeSelector/NodeSelector.vue:11 #: src/components/NodeSelector/NodeSelector.vue:11
#: src/views/dashboard/Environments.vue:15 #: src/views/dashboard/Environments.vue:15
#: src/views/dashboard/Environments.vue:16 #: src/views/dashboard/Environments.vue:16
#: src/views/environment/Environment.vue:48 #: src/views/environment/Environment.vue:79
msgid "Offline" msgid "Offline"
msgstr "" msgstr ""
@ -1022,7 +1028,7 @@ msgstr ""
#: src/components/NodeSelector/NodeSelector.vue:9 #: src/components/NodeSelector/NodeSelector.vue:9
#: src/views/dashboard/Environments.vue:14 #: src/views/dashboard/Environments.vue:14
#: src/views/dashboard/Environments.vue:15 #: src/views/dashboard/Environments.vue:15
#: src/views/environment/Environment.vue:45 #: src/views/environment/Environment.vue:76
msgid "Online" msgid "Online"
msgstr "" msgstr ""
@ -1030,6 +1036,10 @@ msgstr ""
msgid "OpenAI" msgid "OpenAI"
msgstr "" msgstr ""
#: src/views/environment/Environment.vue:38
msgid "OperationSync"
msgstr ""
#: src/views/system/Upgrade.vue:14 src/views/system/Upgrade.vue:15 #: src/views/system/Upgrade.vue:14 src/views/system/Upgrade.vue:15
#: src/views/system/Upgrade.vue:19 src/views/system/Upgrade.vue:23 #: src/views/system/Upgrade.vue:19 src/views/system/Upgrade.vue:23
#: src/views/system/Upgrade.vue:27 #: src/views/system/Upgrade.vue:27
@ -1251,7 +1261,7 @@ msgid "Save error %{msg}"
msgstr "Ошибка сохранения %{msg}" msgstr "Ошибка сохранения %{msg}"
#: src/components/StdDataDisplay/StdBatchEdit.vue:39 #: src/components/StdDataDisplay/StdBatchEdit.vue:39
#: src/views/preference/Preference.vue:60 #: src/views/preference/Preference.vue:66
#, fuzzy #, fuzzy
msgid "Save successfully" msgid "Save successfully"
msgstr "Успешно сохранено" msgstr "Успешно сохранено"
@ -1283,7 +1293,7 @@ msgstr "Отправлено"
#: src/components/StdDataDisplay/StdTable.vue:343 #: src/components/StdDataDisplay/StdTable.vue:343
#: src/components/StdDataDisplay/StdTable.vue:463 #: src/components/StdDataDisplay/StdTable.vue:463
#: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:83 #: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:83
#: src/views/other/Install.vue:71 src/views/preference/Preference.vue:62 #: src/views/other/Install.vue:71 src/views/preference/Preference.vue:68
#: src/views/system/Upgrade.vue:54 #: src/views/system/Upgrade.vue:54
msgid "Server error" msgid "Server error"
msgstr "Ошибка сервера" msgstr "Ошибка сервера"
@ -1350,7 +1360,7 @@ msgstr "Содержание ключа сертификата SSL"
msgid "Stable" msgid "Stable"
msgstr "Таблица" msgstr "Таблица"
#: src/views/domain/DomainList.vue:24 src/views/environment/Environment.vue:38 #: src/views/domain/DomainList.vue:24 src/views/environment/Environment.vue:69
msgid "Status" msgid "Status"
msgstr "Статус" msgstr "Статус"
@ -1366,10 +1376,20 @@ msgstr "Хранилище"
msgid "Subject Name: %{name}" msgid "Subject Name: %{name}"
msgstr "Название темы: %{name}" msgstr "Название темы: %{name}"
#: src/views/environment/Environment.vue:67
msgid ""
"Such as Reload and Configs, regex can configure as `/api/nginx/reload|/api/"
"nginx/test|/api/config/.+`, please see system api"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:40 #: src/views/dashboard/ServerAnalytic.vue:40
msgid "Swap" msgid "Swap"
msgstr "Своп" msgstr "Своп"
#: src/views/environment/Environment.vue:55
msgid "SyncApiRegex"
msgstr ""
#: src/routes/index.ts:157 #: src/routes/index.ts:157
msgid "System" msgid "System"
msgstr "Система" msgstr "Система"
@ -1437,10 +1457,6 @@ msgid ""
"continue?" "continue?"
msgstr "" msgstr ""
#: src/views/environment/Environment.vue:30
msgid "Token"
msgstr ""
#: src/views/config/config.ts:13 #: src/views/config/config.ts:13
msgid "Type" msgid "Type"
msgstr "Тип" msgstr "Тип"
@ -1448,7 +1464,7 @@ msgstr "Тип"
#: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:25 #: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:25
#: src/views/config/config.ts:28 src/views/config/ConfigEdit.vue:31 #: src/views/config/config.ts:28 src/views/config/ConfigEdit.vue:31
#: src/views/domain/components/RightSettings.vue:11 #: src/views/domain/components/RightSettings.vue:11
#: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:55 #: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:86
#: src/views/user/User.vue:37 #: src/views/user/User.vue:37
msgid "Updated at" msgid "Updated at"
msgstr "Обновлено в" msgstr "Обновлено в"
@ -1522,6 +1538,10 @@ msgid ""
"Nginx. Are you sure you want to continue?" "Nginx. Are you sure you want to continue?"
msgstr "" msgstr ""
#: src/views/environment/Environment.vue:45
msgid "Whether config api regex that will redo on this environment"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:104 #: src/views/dashboard/ServerAnalytic.vue:104
#: src/views/dashboard/ServerAnalytic.vue:29 #: src/views/dashboard/ServerAnalytic.vue:29
msgid "Writes" msgid "Writes"

File diff suppressed because one or more lines are too long

View file

@ -23,7 +23,7 @@ msgstr "访问日志"
#: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:31 #: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:31
#: src/views/config/config.ts:35 src/views/domain/DomainList.vue:47 #: src/views/config/config.ts:35 src/views/domain/DomainList.vue:47
#: src/views/environment/Environment.vue:61 src/views/user/User.vue:43 #: src/views/environment/Environment.vue:92 src/views/user/User.vue:43
msgid "Action" msgid "Action"
msgstr "操作" msgstr "操作"
@ -584,6 +584,7 @@ msgid "Enabled"
msgstr "启用" msgstr "启用"
#: src/views/domain/components/RightSettings.vue:26 #: src/views/domain/components/RightSettings.vue:26
#: src/views/domain/components/SiteDuplicate.vue:85
#: src/views/domain/DomainAdd.vue:49 src/views/domain/DomainList.vue:59 #: src/views/domain/DomainAdd.vue:49 src/views/domain/DomainList.vue:59
msgid "Enabled successfully" msgid "Enabled successfully"
msgstr "启用成功" msgstr "启用成功"
@ -896,7 +897,12 @@ msgstr "新版本发布"
msgid "Next" msgid "Next"
msgstr "下一步" msgstr "下一步"
#: src/views/preference/NginxLogSettings.vue:3 #: src/views/preference/Preference.vue:8
#, fuzzy
msgid "Nginx"
msgstr "Nginx 日志"
#: src/views/preference/NginxSettings.vue:3
msgid "Nginx Access Log Path" msgid "Nginx Access Log Path"
msgstr "Nginx 访问日志路径" msgstr "Nginx 访问日志路径"
@ -910,12 +916,11 @@ msgstr "Nginx 配置解析错误"
msgid "Nginx Control" msgid "Nginx Control"
msgstr "控制 Nginx" msgstr "控制 Nginx"
#: src/views/preference/NginxLogSettings.vue:6 #: src/views/preference/NginxSettings.vue:6
msgid "Nginx Error Log Path" msgid "Nginx Error Log Path"
msgstr "Nginx 错误日志路径" msgstr "Nginx 错误日志路径"
#: src/routes/index.ts:110 src/views/nginx_log/NginxLog.vue:2 #: src/routes/index.ts:110 src/views/nginx_log/NginxLog.vue:2
#: src/views/preference/Preference.vue:8
msgid "Nginx Log" msgid "Nginx Log"
msgstr "Nginx 日志" msgstr "Nginx 日志"
@ -965,7 +970,7 @@ msgstr "正在获取证书"
#: src/components/NodeSelector/NodeSelector.vue:11 #: src/components/NodeSelector/NodeSelector.vue:11
#: src/views/dashboard/Environments.vue:15 #: src/views/dashboard/Environments.vue:15
#: src/views/dashboard/Environments.vue:16 #: src/views/dashboard/Environments.vue:16
#: src/views/environment/Environment.vue:48 #: src/views/environment/Environment.vue:79
msgid "Offline" msgid "Offline"
msgstr "离线" msgstr "离线"
@ -989,7 +994,7 @@ msgstr "确定"
#: src/components/NodeSelector/NodeSelector.vue:9 #: src/components/NodeSelector/NodeSelector.vue:9
#: src/views/dashboard/Environments.vue:14 #: src/views/dashboard/Environments.vue:14
#: src/views/dashboard/Environments.vue:15 #: src/views/dashboard/Environments.vue:15
#: src/views/environment/Environment.vue:45 #: src/views/environment/Environment.vue:76
msgid "Online" msgid "Online"
msgstr "在线" msgstr "在线"
@ -997,6 +1002,10 @@ msgstr "在线"
msgid "OpenAI" msgid "OpenAI"
msgstr "OpenAI" msgstr "OpenAI"
#: src/views/environment/Environment.vue:38
msgid "OperationSync"
msgstr "操作同步"
#: src/views/system/Upgrade.vue:14 src/views/system/Upgrade.vue:15 #: src/views/system/Upgrade.vue:14 src/views/system/Upgrade.vue:15
#: src/views/system/Upgrade.vue:19 src/views/system/Upgrade.vue:23 #: src/views/system/Upgrade.vue:19 src/views/system/Upgrade.vue:23
#: src/views/system/Upgrade.vue:27 #: src/views/system/Upgrade.vue:27
@ -1217,7 +1226,7 @@ msgid "Save error %{msg}"
msgstr "保存错误 %{msg}" msgstr "保存错误 %{msg}"
#: src/components/StdDataDisplay/StdBatchEdit.vue:39 #: src/components/StdDataDisplay/StdBatchEdit.vue:39
#: src/views/preference/Preference.vue:60 #: src/views/preference/Preference.vue:66
msgid "Save successfully" msgid "Save successfully"
msgstr "保存成功" msgstr "保存成功"
@ -1247,7 +1256,7 @@ msgstr "上传"
#: src/components/StdDataDisplay/StdTable.vue:343 #: src/components/StdDataDisplay/StdTable.vue:343
#: src/components/StdDataDisplay/StdTable.vue:463 #: src/components/StdDataDisplay/StdTable.vue:463
#: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:83 #: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:83
#: src/views/other/Install.vue:71 src/views/preference/Preference.vue:62 #: src/views/other/Install.vue:71 src/views/preference/Preference.vue:68
#: src/views/system/Upgrade.vue:54 #: src/views/system/Upgrade.vue:54
msgid "Server error" msgid "Server error"
msgstr "服务器错误" msgstr "服务器错误"
@ -1308,7 +1317,7 @@ msgstr "SSL证书密钥内容"
msgid "Stable" msgid "Stable"
msgstr "稳定" msgstr "稳定"
#: src/views/domain/DomainList.vue:24 src/views/environment/Environment.vue:38 #: src/views/domain/DomainList.vue:24 src/views/environment/Environment.vue:69
msgid "Status" msgid "Status"
msgstr "状态" msgstr "状态"
@ -1324,10 +1333,20 @@ msgstr "存储"
msgid "Subject Name: %{name}" msgid "Subject Name: %{name}"
msgstr "主体名称: %{name}" msgstr "主体名称: %{name}"
#: src/views/environment/Environment.vue:67
msgid ""
"Such as Reload and Configs, regex can configure as `/api/nginx/reload|/api/"
"nginx/test|/api/config/.+`, please see system api"
msgstr "`重载`和`配置管理`的操作同步正则可以配置为`/api/nginx/reload|/api/nginx/test|/api/config/.+`详细请查看系统API"
#: src/views/dashboard/ServerAnalytic.vue:40 #: src/views/dashboard/ServerAnalytic.vue:40
msgid "Swap" msgid "Swap"
msgstr "Swap" msgstr "Swap"
#: src/views/environment/Environment.vue:55
msgid "SyncApiRegex"
msgstr "Api正则表达式"
#: src/routes/index.ts:157 #: src/routes/index.ts:157
msgid "System" msgid "System"
msgstr "系统" msgstr "系统"
@ -1391,10 +1410,6 @@ msgstr ""
"为了确保认证自动更新能够正常工作,我们需要添加一个能够代理从权威机构到后端的" "为了确保认证自动更新能够正常工作,我们需要添加一个能够代理从权威机构到后端的"
"请求的 Location并且我们需要保存这个文件并重新加载Nginx。你确定要继续吗" "请求的 Location并且我们需要保存这个文件并重新加载Nginx。你确定要继续吗"
#: src/views/environment/Environment.vue:30
msgid "Token"
msgstr "Token"
#: src/views/config/config.ts:13 #: src/views/config/config.ts:13
msgid "Type" msgid "Type"
msgstr "类型" msgstr "类型"
@ -1402,7 +1417,7 @@ msgstr "类型"
#: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:25 #: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:25
#: src/views/config/config.ts:28 src/views/config/ConfigEdit.vue:31 #: src/views/config/config.ts:28 src/views/config/ConfigEdit.vue:31
#: src/views/domain/components/RightSettings.vue:11 #: src/views/domain/components/RightSettings.vue:11
#: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:55 #: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:86
#: src/views/user/User.vue:37 #: src/views/user/User.vue:37
msgid "Updated at" msgid "Updated at"
msgstr "修改时间" msgstr "修改时间"
@ -1474,6 +1489,10 @@ msgid ""
msgstr "" msgstr ""
"我们将从这个文件中删除HTTPChallenge的配置并重新加载Nginx。你确定要继续吗" "我们将从这个文件中删除HTTPChallenge的配置并重新加载Nginx。你确定要继续吗"
#: src/views/environment/Environment.vue:45
msgid "Whether config api regex that will redo on this environment"
msgstr "是否配置API正则操作同步到该环境"
#: src/views/dashboard/ServerAnalytic.vue:104 #: src/views/dashboard/ServerAnalytic.vue:104
#: src/views/dashboard/ServerAnalytic.vue:29 #: src/views/dashboard/ServerAnalytic.vue:29
msgid "Writes" msgid "Writes"
@ -1506,6 +1525,12 @@ msgctxt "Project"
msgid "License" msgid "License"
msgstr "开源许可" msgstr "开源许可"
#~ msgid "The Operation of Sites, Configs and Certification will redo on this"
#~ msgstr "网站、配置和证书的操作同步到该环境"
#~ msgid "Token"
#~ msgstr "Token"
#~ msgid "Git" #~ msgid "Git"
#~ msgstr "Git" #~ msgstr "Git"

View file

@ -23,7 +23,7 @@ msgstr "存取日誌"
#: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:31 #: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:31
#: src/views/config/config.ts:35 src/views/domain/DomainList.vue:47 #: src/views/config/config.ts:35 src/views/domain/DomainList.vue:47
#: src/views/environment/Environment.vue:61 src/views/user/User.vue:43 #: src/views/environment/Environment.vue:92 src/views/user/User.vue:43
msgid "Action" msgid "Action"
msgstr "操作" msgstr "操作"
@ -557,7 +557,6 @@ msgstr "在 %{node_name} 啟用 %{conf_name} 失敗"
msgid "Enable %{conf_name} in %{node_name} successfully" msgid "Enable %{conf_name} in %{node_name} successfully"
msgstr "成功在 %{node_name} 啟用 %{conf_name}" msgstr "成功在 %{node_name} 啟用 %{conf_name}"
#: src/views/domain/cert/components/ObtainCert.vue:55 #: src/views/domain/cert/components/ObtainCert.vue:55
msgid "Enable auto-renewal failed for %{name}" msgid "Enable auto-renewal failed for %{name}"
msgstr "啟用 %{name} 自動續簽失敗" msgstr "啟用 %{name} 自動續簽失敗"
@ -586,6 +585,7 @@ msgid "Enabled"
msgstr "已啟用" msgstr "已啟用"
#: src/views/domain/components/RightSettings.vue:26 #: src/views/domain/components/RightSettings.vue:26
#: src/views/domain/components/SiteDuplicate.vue:85
#: src/views/domain/DomainAdd.vue:49 src/views/domain/DomainList.vue:59 #: src/views/domain/DomainAdd.vue:49 src/views/domain/DomainList.vue:59
msgid "Enabled successfully" msgid "Enabled successfully"
msgstr "成功啟用" msgstr "成功啟用"
@ -820,8 +820,7 @@ msgid ""
"Make sure you have configured a reverse proxy for .well-known directory to " "Make sure you have configured a reverse proxy for .well-known directory to "
"HTTPChallengePort before obtaining the certificate." "HTTPChallengePort before obtaining the certificate."
msgstr "" msgstr ""
"在取得憑證前,請確保您已將 .well-known 目錄反向代理到 " "在取得憑證前,請確保您已將 .well-known 目錄反向代理到 HTTPChallengePort。"
"HTTPChallengePort。"
#: src/routes/index.ts:65 #: src/routes/index.ts:65
msgid "Manage Configs" msgid "Manage Configs"
@ -898,7 +897,12 @@ msgstr "新版本發布"
msgid "Next" msgid "Next"
msgstr "下一步" msgstr "下一步"
#: src/views/preference/NginxLogSettings.vue:3 #: src/views/preference/Preference.vue:8
#, fuzzy
msgid "Nginx"
msgstr "Nginx 日誌"
#: src/views/preference/NginxSettings.vue:3
msgid "Nginx Access Log Path" msgid "Nginx Access Log Path"
msgstr "Nginx 存取日誌路徑" msgstr "Nginx 存取日誌路徑"
@ -912,12 +916,11 @@ msgstr "Nginx 設定解析錯誤"
msgid "Nginx Control" msgid "Nginx Control"
msgstr "Nginx 控制元件" msgstr "Nginx 控制元件"
#: src/views/preference/NginxLogSettings.vue:6 #: src/views/preference/NginxSettings.vue:6
msgid "Nginx Error Log Path" msgid "Nginx Error Log Path"
msgstr "Nginx 錯誤日誌路徑" msgstr "Nginx 錯誤日誌路徑"
#: src/routes/index.ts:110 src/views/nginx_log/NginxLog.vue:2 #: src/routes/index.ts:110 src/views/nginx_log/NginxLog.vue:2
#: src/views/preference/Preference.vue:8
msgid "Nginx Log" msgid "Nginx Log"
msgstr "Nginx 日誌" msgstr "Nginx 日誌"
@ -966,7 +969,7 @@ msgstr "正在取得憑證"
#: src/components/NodeSelector/NodeSelector.vue:11 #: src/components/NodeSelector/NodeSelector.vue:11
#: src/views/dashboard/Environments.vue:15 #: src/views/dashboard/Environments.vue:15
#: src/views/dashboard/Environments.vue:16 #: src/views/dashboard/Environments.vue:16
#: src/views/environment/Environment.vue:48 #: src/views/environment/Environment.vue:79
msgid "Offline" msgid "Offline"
msgstr "離線" msgstr "離線"
@ -990,7 +993,7 @@ msgstr "確定"
#: src/components/NodeSelector/NodeSelector.vue:9 #: src/components/NodeSelector/NodeSelector.vue:9
#: src/views/dashboard/Environments.vue:14 #: src/views/dashboard/Environments.vue:14
#: src/views/dashboard/Environments.vue:15 #: src/views/dashboard/Environments.vue:15
#: src/views/environment/Environment.vue:45 #: src/views/environment/Environment.vue:76
msgid "Online" msgid "Online"
msgstr "線上" msgstr "線上"
@ -998,6 +1001,10 @@ msgstr "線上"
msgid "OpenAI" msgid "OpenAI"
msgstr "OpenAI" msgstr "OpenAI"
#: src/views/environment/Environment.vue:38
msgid "OperationSync"
msgstr ""
#: src/views/system/Upgrade.vue:14 src/views/system/Upgrade.vue:15 #: src/views/system/Upgrade.vue:14 src/views/system/Upgrade.vue:15
#: src/views/system/Upgrade.vue:19 src/views/system/Upgrade.vue:23 #: src/views/system/Upgrade.vue:19 src/views/system/Upgrade.vue:23
#: src/views/system/Upgrade.vue:27 #: src/views/system/Upgrade.vue:27
@ -1053,8 +1060,8 @@ msgid ""
"all in seconds." "all in seconds."
msgstr "" msgstr ""
"請填寫您的 DNS 供應商提供的 API 身份驗證認證。我們會將一個或多個 TXT 記錄新增" "請填寫您的 DNS 供應商提供的 API 身份驗證認證。我們會將一個或多個 TXT 記錄新增"
"到您網域的 DNS 記錄中以進行所有權驗證。驗證完成後,記錄將被刪除。請注意,以下" "到您網域的 DNS 記錄中以進行所有權驗證。驗證完成後,記錄將被刪除。請注意,以下"
"間設定均以秒為單位。" "間設定均以秒為單位。"
#: src/views/domain/cert/components/AutoCertStepOne.vue:42 #: src/views/domain/cert/components/AutoCertStepOne.vue:42
msgid "" msgid ""
@ -1218,7 +1225,7 @@ msgid "Save error %{msg}"
msgstr "儲存錯誤 %{msg}" msgstr "儲存錯誤 %{msg}"
#: src/components/StdDataDisplay/StdBatchEdit.vue:39 #: src/components/StdDataDisplay/StdBatchEdit.vue:39
#: src/views/preference/Preference.vue:60 #: src/views/preference/Preference.vue:66
msgid "Save successfully" msgid "Save successfully"
msgstr "儲存成功" msgstr "儲存成功"
@ -1248,7 +1255,7 @@ msgstr "傳送"
#: src/components/StdDataDisplay/StdTable.vue:343 #: src/components/StdDataDisplay/StdTable.vue:343
#: src/components/StdDataDisplay/StdTable.vue:463 #: src/components/StdDataDisplay/StdTable.vue:463
#: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:83 #: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:83
#: src/views/other/Install.vue:71 src/views/preference/Preference.vue:62 #: src/views/other/Install.vue:71 src/views/preference/Preference.vue:68
#: src/views/system/Upgrade.vue:54 #: src/views/system/Upgrade.vue:54
msgid "Server error" msgid "Server error"
msgstr "伺服器錯誤" msgstr "伺服器錯誤"
@ -1309,7 +1316,7 @@ msgstr "SSL 憑證金鑰內容"
msgid "Stable" msgid "Stable"
msgstr "穩定" msgstr "穩定"
#: src/views/domain/DomainList.vue:24 src/views/environment/Environment.vue:38 #: src/views/domain/DomainList.vue:24 src/views/environment/Environment.vue:69
msgid "Status" msgid "Status"
msgstr "狀態" msgstr "狀態"
@ -1325,10 +1332,20 @@ msgstr "儲存空間"
msgid "Subject Name: %{name}" msgid "Subject Name: %{name}"
msgstr "主體名稱: %{name}" msgstr "主體名稱: %{name}"
#: src/views/environment/Environment.vue:67
msgid ""
"Such as Reload and Configs, regex can configure as `/api/nginx/reload|/api/"
"nginx/test|/api/config/.+`, please see system api"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:40 #: src/views/dashboard/ServerAnalytic.vue:40
msgid "Swap" msgid "Swap"
msgstr "交換空間" msgstr "交換空間"
#: src/views/environment/Environment.vue:55
msgid "SyncApiRegex"
msgstr ""
#: src/routes/index.ts:157 #: src/routes/index.ts:157
msgid "System" msgid "System"
msgstr "系統" msgstr "系統"
@ -1390,12 +1407,8 @@ msgid ""
"need to save this file and reload the Nginx. Are you sure you want to " "need to save this file and reload the Nginx. Are you sure you want to "
"continue?" "continue?"
msgstr "" msgstr ""
"為了確保憑證自動續期能夠正常運作,我們需要新增一個 Location 來代理從授權後" "為了確保憑證自動續期能夠正常運作,我們需要新增一個 Location 來代理從授權後端"
"端的請求,我們需要儲存這個檔案並重新載入 Nginx。你確定你要繼續嗎" "的請求,我們需要儲存這個檔案並重新載入 Nginx。你確定你要繼續嗎"
#: src/views/environment/Environment.vue:30
msgid "Token"
msgstr "Token"
#: src/views/config/config.ts:13 #: src/views/config/config.ts:13
msgid "Type" msgid "Type"
@ -1404,7 +1417,7 @@ msgstr "類型"
#: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:25 #: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:25
#: src/views/config/config.ts:28 src/views/config/ConfigEdit.vue:31 #: src/views/config/config.ts:28 src/views/config/ConfigEdit.vue:31
#: src/views/domain/components/RightSettings.vue:11 #: src/views/domain/components/RightSettings.vue:11
#: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:55 #: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:86
#: src/views/user/User.vue:37 #: src/views/user/User.vue:37
msgid "Updated at" msgid "Updated at"
msgstr "更新時間" msgstr "更新時間"
@ -1477,6 +1490,10 @@ msgstr ""
"我們將從該檔案中刪除 HTTPChallenge 設定並重新載入 Nginx 設定檔案。你確定你要" "我們將從該檔案中刪除 HTTPChallenge 設定並重新載入 Nginx 設定檔案。你確定你要"
"繼續嗎?" "繼續嗎?"
#: src/views/environment/Environment.vue:45
msgid "Whether config api regex that will redo on this environment"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:104 #: src/views/dashboard/ServerAnalytic.vue:104
#: src/views/dashboard/ServerAnalytic.vue:29 #: src/views/dashboard/ServerAnalytic.vue:29
msgid "Writes" msgid "Writes"
@ -1509,6 +1526,9 @@ msgctxt "Project"
msgid "License" msgid "License"
msgstr "授權條款" msgstr "授權條款"
#~ msgid "Token"
#~ msgstr "Token"
#~ msgid "Git" #~ msgid "Git"
#~ msgstr "Git" #~ msgstr "Git"

View file

@ -79,6 +79,13 @@ function onSubmit() {
description: $gettext(e?.message ?? 'Server error') description: $gettext(e?.message ?? 'Server error')
}) })
}) })
if (r.enabled) {
domain.enable(modelRef.name, {headers: {'X-Node-ID': id}}).then(() => {
notification.success({
message: $gettext('Enabled successfully')
})
})
}
}) })
} }
}) })
@ -89,7 +96,7 @@ function onSubmit() {
watch(() => props.visible, (v) => { watch(() => props.visible, (v) => {
if (v) { if (v) {
modelRef.name = '' modelRef.name = props.name // default with source name
modelRef.target = [0] modelRef.target = [0]
nextTick(() => clearValidate()) nextTick(() => clearValidate())
} }

View file

@ -3,9 +3,9 @@ import {useGettext} from 'vue3-gettext'
import {customRender, datetime} from '@/components/StdDataDisplay/StdTableTransformer' import {customRender, datetime} from '@/components/StdDataDisplay/StdTableTransformer'
import environment from '@/api/environment' import environment from '@/api/environment'
import StdCurd from '@/components/StdDataDisplay/StdCurd.vue' import StdCurd from '@/components/StdDataDisplay/StdCurd.vue'
import {input} from '@/components/StdDataEntry' import {input, antSwitch, textarea} from '@/components/StdDataEntry'
import {h} from 'vue' import {h} from 'vue'
import {Badge} from 'ant-design-vue' import {Badge, Tag} from 'ant-design-vue'
const {$gettext, interpolate} = useGettext() const {$gettext, interpolate} = useGettext()
@ -34,6 +34,37 @@ const columns = [{
edit: { edit: {
type: input type: input
} }
}, {
title: () => $gettext('OperationSync'),
dataIndex: 'operation_sync',
sorter: true,
pithy: true,
edit: {
type: antSwitch
},
extra: $gettext('Whether config api regex that will redo on this environment'),
customRender: (args: customRender) => {
const {operation_sync} = args.record
if (operation_sync) {
return h(Tag, {color: 'success'}, {default: ()=> h('span', '是')})
} else {
return h(Tag, {color: 'default'}, {default: ()=> h('span', '否')})
}
},
}, {
title: () => $gettext('SyncApiRegex'),
dataIndex: 'sync_api_regex',
sorter: true,
pithy: true,
display: false,
edit: {
type: textarea,
show: (data) => {
const {operation_sync} = data
return operation_sync
}
},
extra: $gettext('Such as Reload and Configs, regex can configure as `/api/nginx/reload|/api/nginx/test|/api/config/.+`, please see system api'),
}, { }, {
title: () => $gettext('Status'), title: () => $gettext('Status'),
dataIndex: 'status', dataIndex: 'status',

View file

@ -147,8 +147,11 @@ func AddConfig(c *gin.Context) {
} }
} }
output := nginx.Reload() output, err := nginx.Reload()
if err != nil {
ErrHandler(c, err)
return
}
if nginx.GetLogLevel(output) >= nginx.Warn { if nginx.GetLogLevel(output) >= nginx.Warn {
c.JSON(http.StatusInternalServerError, gin.H{ c.JSON(http.StatusInternalServerError, gin.H{
"message": output, "message": output,
@ -193,8 +196,11 @@ func EditConfig(c *gin.Context) {
} }
} }
output := nginx.Reload() output, err := nginx.Reload()
if err != nil {
ErrHandler(c, err)
return
}
if nginx.GetLogLevel(output) >= nginx.Warn { if nginx.GetLogLevel(output) >= nginx.Warn {
c.JSON(http.StatusInternalServerError, gin.H{ c.JSON(http.StatusInternalServerError, gin.H{
"message": output, "message": output,

View file

@ -271,7 +271,11 @@ func SaveDomain(c *gin.Context) {
enabledConfigFilePath = nginx.GetConfPath("sites-enabled", name) enabledConfigFilePath = nginx.GetConfPath("sites-enabled", name)
if helper.FileExists(enabledConfigFilePath) { if helper.FileExists(enabledConfigFilePath) {
// Test nginx configuration // Test nginx configuration
output := nginx.TestConf() output, err := nginx.TestConf()
if err != nil {
ErrHandler(c, err)
return
}
if nginx.GetLogLevel(output) > nginx.Warn { if nginx.GetLogLevel(output) > nginx.Warn {
c.JSON(http.StatusInternalServerError, gin.H{ c.JSON(http.StatusInternalServerError, gin.H{
"message": output, "message": output,
@ -280,7 +284,11 @@ func SaveDomain(c *gin.Context) {
return return
} }
output = nginx.Reload() output, err = nginx.Reload()
if err != nil {
ErrHandler(c, err)
return
}
if nginx.GetLogLevel(output) > nginx.Warn { if nginx.GetLogLevel(output) > nginx.Warn {
c.JSON(http.StatusInternalServerError, gin.H{ c.JSON(http.StatusInternalServerError, gin.H{
@ -314,7 +322,11 @@ func EnableDomain(c *gin.Context) {
} }
// Test nginx config, if not pass then disable the site. // Test nginx config, if not pass then disable the site.
output := nginx.TestConf() output, err := nginx.TestConf()
if err != nil {
ErrHandler(c, err)
return
}
if nginx.GetLogLevel(output) > nginx.Warn { if nginx.GetLogLevel(output) > nginx.Warn {
_ = os.Remove(enabledConfigFilePath) _ = os.Remove(enabledConfigFilePath)
@ -324,7 +336,11 @@ func EnableDomain(c *gin.Context) {
return return
} }
output = nginx.Reload() output, err = nginx.Reload()
if err != nil {
ErrHandler(c, err)
return
}
if nginx.GetLogLevel(output) > nginx.Warn { if nginx.GetLogLevel(output) > nginx.Warn {
c.JSON(http.StatusInternalServerError, gin.H{ c.JSON(http.StatusInternalServerError, gin.H{
@ -363,7 +379,11 @@ func DisableDomain(c *gin.Context) {
return return
} }
output := nginx.Reload() output, err := nginx.Reload()
if err != nil {
ErrHandler(c, err)
return
}
if nginx.GetLogLevel(output) > nginx.Warn { if nginx.GetLogLevel(output) > nginx.Warn {
c.JSON(http.StatusInternalServerError, gin.H{ c.JSON(http.StatusInternalServerError, gin.H{

View file

@ -8,6 +8,7 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/spf13/cast" "github.com/spf13/cast"
"net/http" "net/http"
"regexp"
) )
func GetEnvironment(c *gin.Context) { func GetEnvironment(c *gin.Context) {
@ -39,6 +40,16 @@ type EnvironmentManageJson struct {
Name string `json:"name" binding:"required"` Name string `json:"name" binding:"required"`
URL string `json:"url" binding:"required"` URL string `json:"url" binding:"required"`
Token string `json:"token" binding:"required"` Token string `json:"token" binding:"required"`
OperationSync bool `json:"operation_sync"`
SyncApiRegex string `json:"sync_api_regex"`
}
func validateRegex(data EnvironmentManageJson) error {
if data.OperationSync {
_, err := regexp.Compile(data.SyncApiRegex)
return err
}
return nil
} }
func AddEnvironment(c *gin.Context) { func AddEnvironment(c *gin.Context) {
@ -46,11 +57,17 @@ func AddEnvironment(c *gin.Context) {
if !BindAndValid(c, &json) { if !BindAndValid(c, &json) {
return return
} }
if err := validateRegex(json); err != nil {
ErrHandler(c, err)
return
}
env := model.Environment{ env := model.Environment{
Name: json.Name, Name: json.Name,
URL: json.URL, URL: json.URL,
Token: json.Token, Token: json.Token,
OperationSync: &json.OperationSync,
SyncApiRegex: json.SyncApiRegex,
} }
envQuery := query.Environment envQuery := query.Environment
@ -73,6 +90,10 @@ func EditEnvironment(c *gin.Context) {
if !BindAndValid(c, &json) { if !BindAndValid(c, &json) {
return return
} }
if err := validateRegex(json); err != nil {
ErrHandler(c, err)
return
}
envQuery := query.Environment envQuery := query.Environment
@ -86,6 +107,8 @@ func EditEnvironment(c *gin.Context) {
Name: json.Name, Name: json.Name,
URL: json.URL, URL: json.URL,
Token: json.Token, Token: json.Token,
OperationSync: &json.OperationSync,
SyncApiRegex: json.SyncApiRegex,
}) })
if err != nil { if err != nil {

View file

@ -53,7 +53,7 @@ func NginxStatus(c *gin.Context) {
pidPath := nginx.GetNginxPIDPath() pidPath := nginx.GetNginxPIDPath()
running := true running := true
if _, err := os.Stat(pidPath); err != nil { if fileInfo, err := os.Stat(pidPath); err != nil || fileInfo.Size() == 0 { // fileInfo.Size() == 0 no process id
running = false running = false
} }
@ -63,7 +63,11 @@ func NginxStatus(c *gin.Context) {
} }
func ReloadNginx(c *gin.Context) { func ReloadNginx(c *gin.Context) {
output := nginx.Reload() output, err := nginx.Reload()
if err != nil {
ErrHandler(c, err)
return
}
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"message": output, "message": output,
@ -72,7 +76,11 @@ func ReloadNginx(c *gin.Context) {
} }
func TestNginx(c *gin.Context) { func TestNginx(c *gin.Context) {
output := nginx.TestConf() output, err := nginx.TestConf()
if err != nil {
ErrHandler(c, err)
return
}
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"message": output, "message": output,
@ -81,7 +89,11 @@ func TestNginx(c *gin.Context) {
} }
func RestartNginx(c *gin.Context) { func RestartNginx(c *gin.Context) {
output := nginx.Restart() output, err := nginx.Restart()
if err != nil {
ErrHandler(c, err)
return
}
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"message": output, "message": output,

View file

@ -14,55 +14,60 @@ func execShell(cmd string) (out string, err error) {
return return
} }
func TestConf() string { func TestConf() (string, error) {
out, err := exec.Command("nginx", "-t").CombinedOutput() out, err := exec.Command("nginx", "-t").CombinedOutput()
if err != nil { if err != nil {
logger.Error(err) logger.Error(err)
return string(out), err
} }
return string(out) return string(out), nil
} }
func Reload() string { func Reload() (string, error) {
if settings.NginxSettings.ReloadCmd != "" { if settings.NginxSettings.ReloadCmd != "" {
out, err := execShell(settings.NginxSettings.ReloadCmd) out, err := execShell(settings.NginxSettings.ReloadCmd)
if err != nil { if err != nil {
logger.Error(err) logger.Error(err)
return out, err
} }
return out return out, nil
} else { } else {
out, err := exec.Command("nginx", "-s", "reload").CombinedOutput() out, err := exec.Command("nginx", "-s", "reload").CombinedOutput()
if err != nil { if err != nil {
logger.Error(err) logger.Error(err)
return string(out), err
} }
return string(out) return string(out), nil
} }
} }
func Restart() string { func Restart() (string, error) {
if settings.NginxSettings.RestartCmd != "" { if settings.NginxSettings.RestartCmd != "" {
out, err := execShell(settings.NginxSettings.RestartCmd) out, err := execShell(settings.NginxSettings.RestartCmd)
if err != nil { if err != nil {
logger.Error(err) logger.Error(err)
return "", err
} }
return out return out, nil
} else { } else {
out, err := exec.Command("nginx", "-s", "reopen").CombinedOutput() out, err := exec.Command("nginx", "-s", "reopen").CombinedOutput()
if err != nil { if err != nil {
logger.Error(err) logger.Error(err)
return "", err
} }
return string(out) return string(out), nil
} }
} }

View file

@ -10,6 +10,8 @@ type Environment struct {
Name string `json:"name"` Name string `json:"name"`
URL string `json:"url"` URL string `json:"url"`
Token string `json:"token"` Token string `json:"token"`
OperationSync *bool `json:"operation_sync"`
SyncApiRegex string `json:"sync_api_regex"`
} }
func (e *Environment) GetWebSocketURL(uri string) (decodedUri string, err error) { func (e *Environment) GetWebSocketURL(uri string) (decodedUri string, err error) {

View file

@ -35,6 +35,8 @@ func newEnvironment(db *gorm.DB, opts ...gen.DOOption) environment {
_environment.Name = field.NewString(tableName, "name") _environment.Name = field.NewString(tableName, "name")
_environment.URL = field.NewString(tableName, "url") _environment.URL = field.NewString(tableName, "url")
_environment.Token = field.NewString(tableName, "token") _environment.Token = field.NewString(tableName, "token")
_environment.OperationSync = field.NewBool(tableName, "operation_sync")
_environment.SyncApiRegex = field.NewString(tableName, "sync_api_regex")
_environment.fillFieldMap() _environment.fillFieldMap()
@ -52,6 +54,8 @@ type environment struct {
Name field.String Name field.String
URL field.String URL field.String
Token field.String Token field.String
OperationSync field.Bool
SyncApiRegex field.String
fieldMap map[string]field.Expr fieldMap map[string]field.Expr
} }
@ -75,6 +79,8 @@ func (e *environment) updateTableName(table string) *environment {
e.Name = field.NewString(table, "name") e.Name = field.NewString(table, "name")
e.URL = field.NewString(table, "url") e.URL = field.NewString(table, "url")
e.Token = field.NewString(table, "token") e.Token = field.NewString(table, "token")
e.OperationSync = field.NewBool(table, "operation_sync")
e.SyncApiRegex = field.NewString(table, "sync_api_regex")
e.fillFieldMap() e.fillFieldMap()
@ -91,7 +97,7 @@ func (e *environment) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
} }
func (e *environment) fillFieldMap() { func (e *environment) fillFieldMap() {
e.fieldMap = make(map[string]field.Expr, 7) e.fieldMap = make(map[string]field.Expr, 9)
e.fieldMap["id"] = e.ID e.fieldMap["id"] = e.ID
e.fieldMap["created_at"] = e.CreatedAt e.fieldMap["created_at"] = e.CreatedAt
e.fieldMap["updated_at"] = e.UpdatedAt e.fieldMap["updated_at"] = e.UpdatedAt
@ -99,6 +105,8 @@ func (e *environment) fillFieldMap() {
e.fieldMap["name"] = e.Name e.fieldMap["name"] = e.Name
e.fieldMap["url"] = e.URL e.fieldMap["url"] = e.URL
e.fieldMap["token"] = e.Token e.fieldMap["token"] = e.Token
e.fieldMap["operation_sync"] = e.OperationSync
e.fieldMap["sync_api_regex"] = e.SyncApiRegex
} }
func (e environment) clone(db *gorm.DB) environment { func (e environment) clone(db *gorm.DB) environment {

View file

@ -0,0 +1,147 @@
package router
import (
"bytes"
"crypto/tls"
"encoding/json"
"fmt"
"github.com/0xJacky/Nginx-UI/server/internal/analytic"
"github.com/0xJacky/Nginx-UI/server/internal/logger"
"github.com/gin-gonic/gin"
"github.com/pkg/errors"
"io"
"net/http"
"net/url"
"regexp"
"sync"
)
type ErrorRes struct {
Message string `json:"message"`
}
type toolBodyWriter struct {
gin.ResponseWriter
body *bytes.Buffer
}
func (r toolBodyWriter) Write(b []byte) (int, error) {
return r.body.Write(b)
}
// OperationSync 针对配置了vip的环境操作进行同步
func OperationSync() gin.HandlerFunc {
return func(c *gin.Context) {
bodyBytes, _ := PeekRequest(c.Request)
wb := &toolBodyWriter{
body: &bytes.Buffer{},
ResponseWriter: c.Writer,
}
c.Writer = wb
c.Next()
if c.Request.Method == "GET" || !statusValid(c.Writer.Status()) { // 请求有问题,无需执行同步操作
wb.ResponseWriter.Write(wb.body.Bytes())
return
}
totalCount := 0
successCount := 0
detailMsg := ""
// 后置处理操作同步
wg := sync.WaitGroup{}
for _, node := range analytic.NodeMap {
wg.Add(1)
go func(data analytic.Node) {
defer wg.Done()
if *node.OperationSync && node.Status && requestUrlMatch(c.Request.URL.Path, data) { // 开启操作同步且当前状态正常
totalCount++
if err := syncNodeOperation(c, data, bodyBytes); err != nil {
detailMsg += fmt.Sprintf("node_name: %s, err_msg: %s; ", data.Name, err)
return
}
successCount++
}
}(*node)
}
wg.Wait()
if successCount < totalCount { // 如果有错误,替换原来的消息内容
originBytes := wb.body
logger.Infof("origin response body: %s", originBytes)
// clear Origin Buffer
wb.body = &bytes.Buffer{}
wb.ResponseWriter.WriteHeader(http.StatusInternalServerError)
errorRes := ErrorRes{
Message: fmt.Sprintf("operation sync failed, total: %d, success: %d, fail: %d, detail: %s", totalCount, successCount, totalCount-successCount, detailMsg),
}
byts, _ := json.Marshal(errorRes)
wb.Write(byts)
}
wb.ResponseWriter.Write(wb.body.Bytes())
}
}
func PeekRequest(request *http.Request) ([]byte, error) {
if request.Body != nil {
byts, err := io.ReadAll(request.Body) // io.ReadAll as Go 1.16, below please use ioutil.ReadAll
if err != nil {
return nil, err
}
request.Body = io.NopCloser(bytes.NewReader(byts))
return byts, nil
}
return make([]byte, 0), nil
}
func requestUrlMatch(url string, node analytic.Node) bool {
p, _ := regexp.Compile(node.SyncApiRegex)
result := p.FindAllString(url, -1)
if len(result) > 0 && result[0] == url {
return true
}
return false
}
func statusValid(code int) bool {
return code < http.StatusMultipleChoices
}
func syncNodeOperation(c *gin.Context, node analytic.Node, bodyBytes []byte) error {
u, err := url.JoinPath(node.URL, c.Request.RequestURI)
if err != nil {
return err
}
decodedUri, err := url.QueryUnescape(u)
if err != nil {
return err
}
logger.Debugf("syncNodeOperation request: %s, node_id: %d, node_name: %s", decodedUri, node.ID, node.Name)
client := http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
},
}
req, err := http.NewRequest(c.Request.Method, decodedUri, bytes.NewReader(bodyBytes))
req.Header.Set("X-Node-Secret", node.Token)
res, err := client.Do(req)
if err != nil {
return err
}
defer res.Body.Close()
byts, err := io.ReadAll(res.Body)
if err != nil {
return err
}
if !statusValid(res.StatusCode) {
errRes := ErrorRes{}
if err = json.Unmarshal(byts, &errRes); err != nil {
return err
}
return errors.New(errRes.Message)
}
logger.Debug("syncNodeOperation result: ", string(byts))
return nil
}

View file

@ -15,6 +15,8 @@ func InitRouter() *gin.Engine {
r.Use(cacheJs()) r.Use(cacheJs())
r.Use(OperationSync())
r.Use(static.Serve("/", mustFS(""))) r.Use(static.Serve("/", mustFS("")))
r.NoRoute(func(c *gin.Context) { r.NoRoute(func(c *gin.Context) {