* Sanitation and cleanup.
* More sanitation.
* Good base.
* Conversion of images to jpeg for background and added border-radius.
* sanitation and css addition.
* Moved documents and further expanded documentation.
* Converting images and setting structure.
* Minor text addition
* [ENH] Improve home page documentation, meshcentral index page documentation
* [ENH]Improve submodules & features page
* [ENH]review and improve how-to-contribute page
* [ENH]review and improve Design and Architecture page
* [ENH] Reviewed and improve 'Other' pages
* reworked advanced page
* Small additions and corrections.
* minor removal of dashes
* [ENH] Review and improve install menu (With related pages) in the docs (#16)
* feat: rewrite entire install directory
---------
Co-authored-by: alain.cisirika <cisirikalain@gmail.com>
Co-authored-by: Daan Selen <dselen@systemec.nl>
MeshCentral OIDC strategy was throwing `TypeError: done is not a function`
because the callback was not properly passed when using openid-client.
This patch wraps the OIDC callback to detect missing callback parameters,
extracts user info from the id_token if needed, and ensures `done()` is
called in all code paths, including async group fetching. This restores
functional OIDC logins for Azure AD/Keycloak.
Tested on Azure B2C OIDC
Co-authored-by: Szymon Sypula <szymon.sypula@dieboldnixdorf.com>
* Redesign user dropdown menu with new icons and UI
Replaces the old top menu and UI selection controls with a modern user dropdown menu featuring new icon assets, improved styling, and a UI settings submenu. Updates CSS for layout and responsiveness, adds new PNG icon files, and refactors related JavaScript logic for menu toggling and user image handling.
* Replace user dropdown icons with Font Awesome
Swapped out image-based icons in the user dropdown menu for Font Awesome icon elements. This change reduces reliance on image assets, improves consistency, and simplifies icon management.
* Update icons in user dropdown menu
Replaced the UI Settings, Left bar interface, and night mode icons with more appropriate Font Awesome icons for improved clarity and consistency in the user dropdown menu.
* Fixed menu position for Fixed Width Style
* Updated Dropdown for Translations
Refactored hardcoded dropdown text to support translation handling.
* Updated Translations
* Updated dropdown to close SubMenu on all buttons.
* Removed "UserDummyMenuSpan" Not needed any more as we have removed UIMenu
* Improve notification icon UI and add badge
Replaces the plain notification count with a bell icon and a badge for better visibility. (FA)
* notificationBadge & notificationCount:hover
* Add new translations
Added new translation entries for 'Toggle Dark Mode', 'Toggle Light Mode', 'Toggle Footer Bar', 'Left Bar Interface', and 'Top Bar Interface'
* Updated Dropdown background
* Updated Dark/Light Mode Toggle
* Updated Right Chevron Arrow
Introduces a new 'customFiles' array in the config schema for granular domain-level CSS and JavaScript customization. Updates webserver logic to inject custom CSS/JS tags based on template scope, replacing static custom.css/custom.js references in all Handlebars views. Also updates meshctrl.js to support the new config property.
* Update login token modal and button behavior
Removes orange background from username and password fields in the login token modal,
updates modal title to 'Login Token Created', disables the OK button, and changes
the Cancel button text to 'Close'. Also adds a 'return false' statement to
account_createLoginTokenEx to keep the modal open upon token creation.
* Added Close and Login Token Created
Added Close and Login Token Created
* Add translations for 'Login Token Created'
Added multiple language translations for the 'Login Token Created' message in translate.json to improve localization support.
Corrected the callback function for the ‘Remove Login Token’ modal to properly execute the token removal. The previous implementation incorrectly wrapped the callback in an arrow function returning another function, preventing the logic from running.
* Workflow split (#14)
* Made the workflow build multiple images for simplicity
* New method
* Trying workflow
* Finalize
* Reset package files to upstream/master
* Edit workflow according to @si458
* Whoops accidentally removed these. Back again.
* Testing out embedded tokens
* Workflow split (#12)
* Made the workflow build multiple images for simplicity
* New method
* Trying workflow
* Finalize
* Reset package files to upstream/master
* Edit workflow according to @si458
* Whoops accidentally removed these. Back again.
* Testing out embedded tokens
---------
Co-authored-by: Daan Selen <dselen@systemec.nl>
* Why the flip do we even use that???
* Testing out suggestions of permissions
* Testing fallback.
* Remove fallback
* Minor removal of comment
---------
Co-authored-by: Daan Selen <dselen@systemec.nl>
* fix: workflow like we want
---------
Co-authored-by: Daan Selen <dselen@systemec.nl>
* Merge into master (#11)
* Made the workflow build multiple images for simplicity
* New method
* Trying workflow
* Finalize
* Reset package files to upstream/master
* Edit workflow according to @si458
* Whoops accidentally removed these. Back again.
* Integrate the syslog compiler
* Changed logging accordingly.
* Looks to be a working prototype
* chore(docker): bump alpine version
* feat: make simon less anxious :P
* refac: dockerfile and some package.json packages to improve compat
* chore: revert package lock
---------
Co-authored-by: Daan Selen <dselen@systemec.nl>
* Merge into master (#11)
* Made the workflow build multiple images for simplicity
* New method
* Trying workflow
* Finalize
* Reset package files to upstream/master
* Edit workflow according to @si458
* Whoops accidentally removed these. Back again.
---------
Co-authored-by: Daan Selen <dselen@systemec.nl>
* Integrate the syslog compiler
* Changed logging accordingly.
* Looks to be a working prototype
* chore(docker): bump alpine version
* feat: make simon less anxious :P
---------
Co-authored-by: Daan Selen <dselen@systemec.nl>
* Add initial support for custom stylesheets
Allow an override file `custom.css` that can partially override the
stylesheet used for the web interface.
# Changes
1. Update default views to use custom stylesheet
2. Update documentation
Related to: https://github.com/Ylianst/MeshCentral/issues/7144
* Add custom style support to more views
Load `custom.css` in the following views:
- agentinvite.handlebars
- invite.handlebars
- login2.handlebars
- message2.handlebars
- messenger.handlebars
- player.handlebars
- sharing.handlebars
Introduces the .backgroundContainer class to improve styling of modal content in night mode by setting text color. Updates relevant divs in default3.handlebars to use this class for hardware keys and login events sections. Also adjusts the width of login event entries for better display.
* update default.handlebars to implement gotodevicername
Adding a new gotodevicername url option to reach the device page
* update default3.handlebars to implement gotodevicername
Adding a new gotodevicername url option to reach the device page
* update mobile.handlebars to implement gotodevicername
Adding a new gotodevicername url option to reach the device page
---------
Co-authored-by: rida.abou <rida.abouechcharaf@pytech.it>
* 🐛 Fix mobile load issue caused by bad quote escaping
Resolved an issue that blocked page loading on mobile devices caused by improperly escaped quotation marks.
* Ukrainian localization fixes
* Convert to async-await
* use require instead of import
* Use pipeline instead of pipe
* Revert "use require instead of import"
This reverts commit b5635e89cc71e47e0b7a078bce223321dc519e51.
* Sanitize webdav foldername, move to setup defaults
* Check for webdav config
* Moving external call back into meshcentral
* Debugging logging
* Moved the external call to the callback function
* Updated codesigning.md
* Move callback invoke of callExternalSignJob outside of err check
* change console.log to obj.debug for external sign job call logging
* obj debug signing failed using obj.debug and console.error inside callExternalSignJob
* Add flags to meshes to prefer agentname when synced and to override synced name temporarily
* automatically enable sub-options
* change caption
* apply changes to bootstrap UI
* autoAcceptIfNoUser for desktop
* autoAcceptIfNoUser for terminal
* autoAcceptIfNoUser for files
* forgot few extra files
---------
Signed-off-by: si458 <simonsmith5521@gmail.com>
* [ENH] Add toggle switch for new MeshCentral UI in settings and top header of the classic UI
* [ENH] Add toggle for new MeshCentral UI in settings and in top headbar of the modern UI
* add showModernUIToggle and store uiviewmode in db
---------
Co-authored-by: kambereBr <brunokambere@gmail.com>
added check for relaystate saml and regex check
added in rest of allowed params
correct formatting on regex string - now evaluates correctly
set relaystate on get request
check for ipv6
Fix: error: 2026: "TLS/SSL error: Server certificate validation failed. The certificate's CN name does not match the passed value. Error 0x800B010F(CERT_E_CN_NO_MATCH)"
by adding '--ssl-verify-server-cert=false'
and updating the modules.
Co-authored-by: Bruno Kambere <brunokambere@gmail.com>
Co-authored-by: snyk-bot <snyk-bot@snyk.io>
Co-authored-by: Simon Smith <simonsmith5521@gmail.com>
* Use built-in login validation
* use button instead of submit to avoid duplicate submits
---------
Co-authored-by: Simon Smith <simonsmith5521@gmail.com>
* Fixed filenames not being escaped when editing files
This allowed a possible XSS by naming a file in a particular way on your device.
* Fixed HTML generation in webserver not escaping most things from req.query
This would allow XSS through a very simple phishing attack
* Added HtmlEscape to Mobile default as well
* Added sanitization to SAML redirect and Twitter/Azure
* Added pbkdf2 and aes-256-gcm options for database file encryption
* Added dbCipherAlgorithm option
* Changed pbkdf2 to default
Maintains backward compatibility, but will require a manual repush to update to the new version
* Removed dbkeyderivationiterations option, as this branch is to be more opinionated
* dont translate min files
* translate meshcentral-web-domain folders with --translate
* also translate default views folder incase of changes
Signed-off-by: si458 <simonsmith5521@gmail.com>
• removal of "accessToken" from documentation, since it is not in the source code.
• addition of a new step of 'changing publishing status from testing to production'
• removal of a duplicate picture in index.md and adding an appropriate pic instead.
* Add the ability to set TLS cipher suites
Added config option to set the TLS ciphers instead of relying on a hardcoded list of ciphers determined by meshcentral.
* Added option to use default node ciphers
This allows the ciphers used to be set to the recommended ciphers by nodejs, as well as allowing the user to override the ciphers using the "--tls-cipher-list" command line switch for node.
* Updated validArguments array to include "usenodedefaulttlsciphers" and "tlsciphers" as options
* Create forksync.yml
* update oidc to use openid-client
* update oidc module requirements
* working oidc+
includes all oauth2 clients automatically migrated. azure will need some kind of fix for the uid
* update openid-client install checks
* created overarching schema for OIDC
* bug fixs for azure login
* update schema
prepare schema for unified oidc module
* update 'oidc' to strategy variable
* working azure+ groups
groups from azure are in,
you can use memberOf or transitiveMemberOf in config (Graphs API)
* clean up old config import + working google oidc
previous config map was recursive nonsense, changed to multiple IFs
* added convertStrArray
* de-expanded scope
put all other auth strategies back to normal and fixed oidc strategy
* swap back to using authlog debugger
* Update meshcentral-config-schema.json
* working google oidc + groups
* working azure+groups (again)
* init oidc docs
very incomplete but basic config is present
* add oidc
* more work on docs
* add scope and claim options
plus fixed a few bugs and faults in my logic
used logs correctly
* further cleanup debug
* more debug cleanup
* continue documentation push
fixed minor debug bugs also
* more work on docs
missing links, need to get azure preset docs, probably more.
* done with docs
its good enough for now
* minor fix + presets get correct icon
* fix google oidc not visible at login
* fix bug with emailVerified property
* fix logout bug + debug cleanup
* fix strategy logout bug +cleanup
* fixed preset login icon
* fix alert + fix schema
* terminate lines
* Dutch language update 1.0.85
line up polish translation
* Fixed guest web relay session revocation (#4667)
* Updated French translation.
* Add hook to allow adding custom api endpoints to Express routing
* Updated German translation.
* Update meshcentral-config-schema.json (change formatting)
This way it is easier to edit and maintain
* Fixed schema.
* fix meshcentral-config-schema.json
* add language selector to login (#5648)
* add language selector to login
* add showLanguageSelect to pick top or bottom boxe
* remove additionalProperties: false in schema to allow comments #5697
Signed-off-by: si458 <simonsmith5521@gmail.com>
* fix notes in docs
* Fix web relay session handling and redirection due to bad merge
* Added option to check HTTP origin.
* add links and fix typo
* move groups after strategy
* Update version split in docs
* Fix preset issuer URL in OIDC strategy
* Update clientid and clientsecret to client_id and client_secret
* Update meshcentral-config-schema.json and fix bad rebase
* Update meshcentral-config-schema.json
* fix bad rebase
* fix bad rebase
* Add 'connect-flash' to passport dependencies
* Remove unnecessary passport dependencies - fix bad rebase
* Fix auth strategy bug and remove console.log statement
* Set groupType to the preset name if it exists, otherwise use the strategy name
* remove finally block from
* Refactor authentication logging in handleStrategyLogin to include strategy name
---------
Signed-off-by: si458 <simonsmith5521@gmail.com>
Co-authored-by: petervanv <58996467+petervanv@users.noreply.github.com>
Co-authored-by: Ylian Saint-Hilaire <ysainthilaire@hotmail.com>
Co-authored-by: Martin Mädler <martin.maedler@gmail.com>
Co-authored-by: Fausto Gutierrez <28719096+faustogut@users.noreply.github.com>
Co-authored-by: Simon Smith <simonsmith5521@gmail.com>
* fix install packages and set docker to node 20
Signed-off-by: si458 <simonsmith5521@gmail.com>
* missed a few no-package-lock and no-save
Signed-off-by: si458 <simonsmith5521@gmail.com>
* use --save-exact and only install missing modules
Signed-off-by: si458 <simonsmith5521@gmail.com>
---------
Signed-off-by: si458 <simonsmith5521@gmail.com>
The Dockerfile specifies NPM modules to be installed. However, some do not specify a version, so the latest is installed. Later in meshcentral.js mainStart() specific versions are required. If they don't match the latest version, all modules will be reinstalled to get the specific versions.
#5684 Soft version conflict on NPM modules causes NPM modules to be installed on startup in Docker
#5545 Docker on Debian 11 fails on version 1.1.15 and 1.1.16 giving NPM errors
#5681 InstallModules() installs all modules, not just missing modules (regression)
* allow setting meshcentral assistant type for agentinvites
Signed-off-by: si458 <simonsmith5521@gmail.com>
* forgot webserver for assistantTypeAgentInvite
Signed-off-by: si458 <simonsmith5521@gmail.com>
* dont use capital letters with domain args
Signed-off-by: si458 <simonsmith5521@gmail.com>
---------
Signed-off-by: si458 <simonsmith5521@gmail.com>
* move identifiers to server side to allow future updates
Signed-off-by: si458 <simonsmith5521@gmail.com>
* add rpi support
Signed-off-by: si458 <simonsmith5521@gmail.com>
---------
Signed-off-by: si458 <simonsmith5521@gmail.com>
Windows doesnt have a proper AltGr, but handles it using fake Ctrl+Alt. However the remote end might not be Windows, so we need to merge those into a single AltGr event. We detect this case by seeing the two key events directly after each other with a very short time between them.
Since the Linux kernel uses free memory for caching, this value is usually very small. MemAvailble is an estimate of how much memory is available for starting new applications, without swapping. MemFree is the free physical memory. Using this value gives much more meaningful results.
* add tpm support
Signed-off-by: Simon Smith <simonsmith5521@gmail.com>
* fix tpm semicolon mistake
Signed-off-by: Simon Smith <simonsmith5521@gmail.com>
---------
Signed-off-by: Simon Smith <simonsmith5521@gmail.com>
* add last boot up time for windows
Signed-off-by: si458 <simonsmith5521@gmail.com>
* fixed lastbootuptime parsing
Signed-off-by: si458 <simonsmith5521@gmail.com>
---------
Signed-off-by: si458 <simonsmith5521@gmail.com>
* add hover title to temperatures
Signed-off-by: Simon Smith <simonsmith5521@gmail.com>
* fix temp trim
Signed-off-by: Simon Smith <simonsmith5521@gmail.com>
* add extra linux sensors
Signed-off-by: Simon Smith <simonsmith5521@gmail.com>
* add padding for temps on multi lines
Signed-off-by: Simon Smith <simonsmith5521@gmail.com>
---------
Signed-off-by: Simon Smith <simonsmith5521@gmail.com>
* add android apk to web ui
Signed-off-by: Simon Smith <simonsmith5521@gmail.com>
* add amazon and google buttons instead
Signed-off-by: Simon Smith <simonsmith5521@gmail.com>
* add android link and brand icons to agentinvite
Signed-off-by: Simon Smith <simonsmith5521@gmail.com>
* oops change mysql back
Signed-off-by: Simon Smith <simonsmith5521@gmail.com>
* add android to agentinvite selector
Signed-off-by: Simon Smith <simonsmith5521@gmail.com>
* forgot paragraph begin
Signed-off-by: Simon Smith <simonsmith5521@gmail.com>
---------
Signed-off-by: Simon Smith <simonsmith5521@gmail.com>
If 'privacy bar' user consent option is enabled for desktop, then it will show the privacy bar in user side while taking desktop access.
But it will not disconnect the session even though clicks the close option. It will only close the privacy bar. This issue is fixed.
https://github.com/Ylianst/MeshCentral/issues/5289
Reference Issues/PRs
Issues #3245 / #3296
what does this implement fix? Explain your changes.
setting skipChallengeVerification to true by default to save sometime when setting up a certificate
any other comments
I can see that this problem has been solved and a suggestion to make it easier
I think is to set "skipChallengeVerification": true by default.
The only format that makes sense to me is CSV, node and mesh ids in the sessions report are just too big for terminal view and JSON is inefficient (too much white-space).
The first field (group) derives from the groupby arguement and is "0" when no grouping is applicable (e.g. db reports).
resolves#3472, resolves#3509
- fix: ensure TLS is used when TLS is enabled
- add constants.SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION for TLS client connection for newer Nodejs
- ensure nc of AMT redirection Digest authentication to have at 8 bytes length
"__comment1__": "This is a simple configuration file, all values and sections that start with underscore (_) are ignored. Edit a section and remove the _ in front of the name. Refer to the user's guide for details.",
"__comment2__": "See node_modules/meshcentral/sample-config-advanced.json for a more advanced example.",
"__comment1__": "This is a simple configuration file, all values and sections that start with underscore (_) are ignored. Edit a section and remove the _ in front of the name. Refer to the user's guide for details.",
"__comment2__": "See node_modules/meshcentral/sample-config-advanced.json for a more advanced example.",
"settings": {
"_cert": "myserver.mydomain.com",
"_WANonly": true,
"_LANonly": true,
"_sessionKey": "MyReallySecretPassword1",
"_port": 443,
"_aliasPort": 443,
"_redirPort": 80,
"_redirAliasPort": 80
},
"domains": {
"": {
"_title": "MyServer",
"_title2": "Servername",
"_minify": true,
"_newAccounts": true,
"_userNameIsEmail": true
}
},
"_letsencrypt": {
"__comment__": "Requires NodeJS 8.x or better, Go to https://letsdebug.net/ first before trying Let's Encrypt.",
stale-issue-message:"This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions."
close-issue-message:"This issue has been automatically closed due to inactivity. If you believe this is still relevant, please feel free to reopen it."
close-issue-label:"Closed"
stale-issue-label:"Stale"
exempt-issue-labels:"pinned,important,Closed"
# PRs configuration
stale-pr-message:"This pull request has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions."
close-pr-message:"This pull request has been automatically closed due to inactivity. If you'd like to continue working on it, please reopen it."
"description":"Click the buttons below to install or uninstall this remote management software. When installed, this software runs in the background allowing this computer to be managed and controlled by a remote administrator."
"description":"Click the buttons below to install or uninstall this remote management software. When installed, this software runs in the background allowing this computer to be managed and controlled by a remote administrator.",
"connectionDetailsButton":"Connection Details..."
},
"cs":{
"agent":"Agent",
@ -37,7 +38,7 @@
"meshName":"Skupinové jméno",
"meshId":"Identifikátor skupiny",
"serverId":"Identifikátor serveru",
"setup":"Založit",
"setup":"Nastavit",
"update":"Aktualizace",
"install":"Instalace",
"uninstall":"Odinstalace",
@ -52,14 +53,15 @@
"zenity":"Zkuste nainstalovat / aktualizovat Zenity a spustit znovu",
"status":[
"NENÍ INSTALOVÁN",
"BĚH",
"SPUŠTĚNO",
"NEFUNGUJE"
],
"statusDescription":"Aktuální stav agenta",
"agentVersion":"Nová verze",
"elevation":"K instalaci/odinstalaci tohoto softwaru jsou vyžadována zvýšená oprávnění.",
"graphicalerror":"Na tomto systému nelze spustit grafickou verzi tohoto instalačního programu",
"description":"Klepnutím na tlačítka níže nainstalujete nebo odinstalujete tento software pro vzdálenou správu. Když je tento software nainstalován, běží na pozadí, což umožňuje spravovat a ovládat tento počítač vzdáleným správcem."
"description":"Klepnutím na tlačítka níže nainstalujete nebo odinstalujete tento software pro vzdálenou správu. Když je tento software nainstalován, běží na pozadí, což umožňuje spravovat a ovládat tento počítač vzdáleným správcem.",
"connectionDetailsButton":"Podrobnosti o připojení..."
},
"de":{
"agent":"Agent",
@ -123,7 +125,8 @@
"agentVersion":"Nueva versión",
"elevation":"Se requieren permisos elevados para instalar/desinstalar este software.",
"graphicalerror":"La versión gráfica de este instalador no puede ejecutarse en este sistema",
"description":"Haga clic en los botones a continuación para instalar o desinstalar este software de administración remota. Cuando se instala, este software se ejecuta en segundo plano, lo que permite que un administrador remoto administre y controle esta computadora."
"description":"Haga clic en los botones a continuación para instalar o desinstalar este software de administración remota. Cuando se instala, este software se ejecuta en segundo plano, lo que permite que un administrador remoto administre y controle esta computadora.",
"connectionDetailsButton":"Detalles de conexión..."
},
"fi":{
"agent":"Agentti",
@ -154,7 +157,8 @@
"agentVersion":"Uusi versio",
"elevation":"Tämän ohjelmiston asentaminen/asennuksen poistaminen edellyttää korotettuja käyttöoikeuksia.",
"graphicalerror":"Tämän asennusohjelman graafista versiota ei voi käyttää tässä järjestelmässä",
"description":"Napsauta alla olevia painikkeita asentaaksesi tai poistaaksesi tämän etähallintaohjelmiston. Kun ohjelmisto on asennettu, se toimii taustalla, jolloin etäjärjestelmänvalvoja voi hallita ja ohjata tätä tietokonetta."
"description":"Napsauta alla olevia painikkeita asentaaksesi tai poistaaksesi tämän etähallintaohjelmiston. Kun ohjelmisto on asennettu, se toimii taustalla, jolloin etäjärjestelmänvalvoja voi hallita ja ohjata tätä tietokonetta.",
"connectionDetailsButton":"Yhteyden tiedot..."
},
"fr":{
"agent":"Agent",
@ -185,7 +189,8 @@
"agentVersion":"Nouvelle version",
"elevation":"Des autorisations élevées sont requises pour installer/désinstaller ce logiciel.",
"graphicalerror":"La version graphique de ce programme d'installation ne peut pas s'exécuter sur ce système",
"description":"Cliquez sur les boutons ci-dessous pour installer ou désinstaller ce logiciel de gestion à distance. Une fois installé, ce logiciel s'exécute en arrière-plan, ce qui permet à cet ordinateur d'être géré et contrôlé par un administrateur distant."
"description":"Cliquez sur les boutons ci-dessous pour installer ou désinstaller ce logiciel de gestion à distance. Une fois installé, ce logiciel s'exécute en arrière-plan, ce qui permet à cet ordinateur d'être géré et contrôlé par un administrateur distant.",
"connectionDetailsButton":"Détails de la connexion..."
},
"hi":{
"agent":"एजेंट",
@ -216,7 +221,8 @@
"agentVersion":"नया संस्करण",
"elevation":"इस सॉफ़्टवेयर को स्थापित/अनइंस्टॉल करने के लिए उन्नत अनुमतियों की आवश्यकता होती है।",
"graphicalerror":"इस इंस्टालर का आलेखीय संस्करण इस सिस्टम पर नहीं चल सकता",
"description":"इस दूरस्थ प्रबंधन सॉफ़्टवेयर को स्थापित या अनइंस्टॉल करने के लिए नीचे दिए गए बटनों पर क्लिक करें। स्थापित होने पर, यह सॉफ़्टवेयर पृष्ठभूमि में चलता है जिससे इस कंप्यूटर को दूरस्थ व्यवस्थापक द्वारा प्रबंधित और नियंत्रित किया जा सकता है।"
"description":"इस दूरस्थ प्रबंधन सॉफ़्टवेयर को स्थापित या अनइंस्टॉल करने के लिए नीचे दिए गए बटनों पर क्लिक करें। स्थापित होने पर, यह सॉफ़्टवेयर पृष्ठभूमि में चलता है जिससे इस कंप्यूटर को दूरस्थ व्यवस्थापक द्वारा प्रबंधित और नियंत्रित किया जा सकता है।",
"connectionDetailsButton":"कनेक्शन विवरण..."
},
"it":{
"agent":"Agente",
@ -247,7 +253,8 @@
"agentVersion":"Nuova versione",
"elevation":"Per installare/disinstallare questo software sono necessarie autorizzazioni elevate.",
"graphicalerror":"La versione grafica di questo programma di installazione non può essere eseguita su questo sistema",
"description":"Fare clic sui pulsanti seguenti per installare o disinstallare questo software di gestione remota. Una volta installato, questo software viene eseguito in background consentendo a questo computer di essere gestito e controllato da un amministratore remoto."
"description":"Fare clic sui pulsanti seguenti per installare o disinstallare questo software di gestione remota. Una volta installato, questo software viene eseguito in background consentendo a questo computer di essere gestito e controllato da un amministratore remoto.",
"connectionDetailsButton":"Dettagli di connessione..."
"graphicalerror":"이 설치 프로그램의 그래픽 버전은 이 시스템에서 실행할 수 없습니다.",
"description":"이 원격 관리 소프트웨어를 설치하거나 제거하려면 아래 버튼을 클릭하십시오. 이 소프트웨어를 설치하면 백그라운드에서 실행되어 원격 관리자가 이 컴퓨터를 관리하고 제어할 수 있습니다."
"description":"이 원격 관리 소프트웨어를 설치하거나 제거하려면 아래 버튼을 클릭하십시오. 이 소프트웨어를 설치하면 백그라운드에서 실행되어 원격 관리자가 이 컴퓨터를 관리하고 제어할 수 있습니다.",
"connectionDetailsButton":"연결 세부정보..."
},
"nl":{
"agent":"Agent",
@ -340,7 +349,8 @@
"agentVersion":"Nieuwe versie",
"elevation":"Verhoogde machtigingen zijn vereist om deze software te installeren/verwijderen.",
"graphicalerror":"De grafische versie van dit installatieprogramma kan niet op dit systeem draaien",
"description":"Klik op de onderstaande knoppen om deze software voor beheer op afstand te installeren of te verwijderen. Na installatie draait deze software op de achtergrond waardoor deze computer kan worden beheerd en gecontroleerd door een externe beheerder."
"description":"Klik op de onderstaande knoppen om deze software voor beheer op afstand te installeren of te verwijderen. Na installatie draait deze software op de achtergrond waardoor deze computer kan worden beheerd en gecontroleerd door een externe beheerder.",
"connectionDetailsButton":"Verbindingsdetails..."
},
"pt":{
"agent":"Agente",
@ -371,7 +381,8 @@
"agentVersion":"Nova versão",
"elevation":"Permissões elevadas são necessárias para instalar/desinstalar este software.",
"graphicalerror":"A versão gráfica deste instalador não pode ser executada neste sistema",
"description":"Clique nos botões abaixo para instalar ou desinstalar este software de gerenciamento remoto. Quando instalado, este software é executado em segundo plano, permitindo que este computador seja gerenciado e controlado por um administrador remoto."
"description":"Clique nos botões abaixo para instalar ou desinstalar este software de gerenciamento remoto. Quando instalado, este software é executado em segundo plano, permitindo que este computador seja gerenciado e controlado por um administrador remoto.",
"connectionDetailsButton":"Detalhes da conexão..."
},
"ru":{
"agent":"Агент",
@ -402,7 +413,8 @@
"agentVersion":"Новая версия",
"elevation":"Для установки/удаления этого программного обеспечения требуются повышенные права.",
"graphicalerror":"Графическая версия этого установщика не может быть запущена в этой системе.",
"description":"Нажмите кнопки ниже, чтобы установить или удалить это программное обеспечение для удаленного управления..После установки это программное обеспечение работает в фоновом режиме, что позволяет удаленному администратору управлять этим компьютером."
"description":"Нажмите кнопки ниже, чтобы установить или удалить это программное обеспечение для удаленного управления..После установки это программное обеспечение работает в фоновом режиме, что позволяет удаленному администратору управлять этим компьютером.",
"elevation":"Förhöjda behörigheter krävs för att installera/avinstallera denna programvara.",
"graphicalerror":"Den grafiska versionen av detta installationsprogram kan inte köras på det här systemet",
"description":"Klicka på knapparna nedan för att installera eller avinstallera denna fjärrhanteringsprogramvara. När den är installerad körs den här programvaran i bakgrunden så att den här datorn kan hanteras och kontrolleras av en fjärradministratör."
"description":"Klicka på knapparna nedan för att installera eller avinstallera denna fjärrhanteringsprogramvara. När den är installerad körs den här programvaran i bakgrunden så att den här datorn kan hanteras och kontrolleras av en fjärradministratör.",
"elevation":"Bu yazılımı yüklemek/kaldırmak için yüksek izinler gerekir.",
"graphicalerror":"Bu yükleyicinin grafik sürümü bu sistemde çalışamaz",
"description":"Bu uzaktan yönetim yazılımını yüklemek veya kaldırmak için aşağıdaki düğmelere tıklayın. Yüklendiğinde, bu yazılım arka planda çalışır ve bu bilgisayarın uzak bir yönetici tarafından yönetilmesine ve kontrol edilmesine olanak tanır."
"description":"Bu uzaktan yönetim yazılımını yüklemek veya kaldırmak için aşağıdaki düğmelere tıklayın. Yüklendiğinde, bu yazılım arka planda çalışır ve bu bilgisayarın uzak bir yönetici tarafından yönetilmesine ve kontrol edilmesine olanak tanır.",
"elevation":"Forhøjede tilladelser er nødvendige for at installere/afinstallere denne software.",
"graphicalerror":"Den grafiske version af dette installationsprogram kan ikke køre på dette system",
"description":"Klik på knapperne nedenfor for at installere eller afinstallere denne fjernstyringssoftware. Når den er installeret, kører denne software i baggrunden, så denne computer kan administreres og kontrolleres af en fjernadministrator."
"description":"Klik på knapperne nedenfor for at installere eller afinstallere denne fjernstyringssoftware. Når den er installeret, kører denne software i baggrunden, så denne computer kan administreres og kontrolleres af en fjernadministrator.",
"elevation":"Do zainstalowania/odinstalowania tego oprogramowania wymagane są podwyższone uprawnienia.",
"graphicalerror":"Graficzna wersja tego instalatora nie może być uruchomiona w tym systemie",
"description":"Kliknij poniższe przyciski, aby zainstalować lub odinstalować oprogramowanie zdalnego dostępu. Po zainstalowaniu, to oprogramowanie działa w tle, umożliwiając zarządzanie i kontrolowanie tego komputera przez zdalnego administratora."
"description":"Kliknij poniższe przyciski, aby zainstalować lub odinstalować oprogramowanie zdalnego dostępu. Po zainstalowaniu, to oprogramowanie działa w tle, umożliwiając zarządzanie i kontrolowanie tego komputera przez zdalnego administratora.",
"elevation":"Permissões Elevadas são necessárias para instalar/desinstalar este software",
"graphicalerror":"A versão gráfica do instalador não pode ser executada neste sistema",
"description":"Clique nos botões abaixo para instalar ou desinstalar este software de gerenciamento remoto. Quando instalado, este software é executado em segundo plano permitindo que este computador seja gerenciado e controlado por um administrador remoto"
"description":"Clique nos botões abaixo para instalar ou desinstalar este software de gerenciamento remoto. Quando instalado, este software é executado em segundo plano permitindo que este computador seja gerenciado e controlado por um administrador remoto",
"connectionDetailsButton":"Detalhes da conexão..."
},
"bs":{
"agent":"Agent",
@ -650,6 +669,103 @@
"NOT RUNNING"
],
"statusDescription":"Trenutni status agenta",
"description":"Kliknite na dugmad ispod da instalirate ili deinstalirate ovaj softver za daljinsko upravljanje. Kada je instaliran, ovaj softver radi u pozadini, što omogućava da ovim računarom upravlja i kontroliše udaljeni administrator."
"description":"Kliknite na dugmad ispod da instalirate ili deinstalirate ovaj softver za daljinsko upravljanje. Kada je instaliran, ovaj softver radi u pozadini, što omogućava da ovim računarom upravlja i kontroliše udaljeni administrator.",
"sudo":"Kérjük, próbálja meg újra a sudo használatával.",
"ctrlc":"A kilépéshez nyomja meg a Ctrl-C billentyűt.",
"commands":"A szöveges változatot a parancssorból futtathatja a következő parancs(okk)al",
"graphicalerror":"A telepítő grafikus verziója nem futtatható ezen a rendszeren.",
"zenity":"Próbálja meg telepíteni/frissíteni a Zenity-t, és indítsa újra",
"status":[
"NINCS TELEPÍTVE",
"FUT",
"NEM FUT"
],
"statusDescription":"Jelenlegi agent állapota",
"description":"Kattintson a Telepítés vagy Eltávolítás gombokra a Távfelügyeleti alkalmazás telepítéséhez vagy eltávolításához. Telepítés után ez az alkalmazás a háttérben fut, lehetővé téve, hogy a számítógépet egy távoli rendszergazda kezelje.",
"elevation":"Es necessiten permisos elevats per instal·lar/desinstal·lar aquest programari.",
"sudo":"Si us plau, torna-ho a provar amb sudo.",
"ctrlc":"Premeu Ctrl-C per sortir.",
"commands":"Podeu executar la versió de text des de la línia d'ordres amb les següents ordres",
"graphicalerror":"La versió gràfica d'aquest instal·lador no pot executar-se en aquest sistema",
"zenity":"Proveu d'instal·lar/actualitzar Zenity i torneu a executar-lo",
"status":[
"NO ESTÀ INSTAL · LAT",
"CÓRRER",
"NO CORRE"
],
"statusDescription":"Estat actual de l'agent",
"description":"Feu clic als botons següents per instal·lar o desinstal·lar aquest programari de gestió remota. Quan s'instal·la, aquest programari s'executa en segon pla i permet que aquest ordinador sigui gestionat i controlat per un administrador remot.",
"connectionDetailsButton":"Detalls de la connexió..."
},
"uk":{
"agent":"Агент",
"agentVersion":"Нова версія",
"group":"Група пристроїв",
"url":"URL Сервера",
"meshName":"Ім'я групи",
"meshId":"Ідентифікатор групи",
"serverId":"Ідентифікатор сервера",
"setup":"Налаштувати",
"update":"Оновити",
"install":"Інсталювати",
"uninstall":"Видалити",
"connect":"Підключитись",
"disconnect":"Відключити",
"cancel":"Скасувати",
"close":"Закрити",
"pressok":"Натисніть OK, щоб від'єднатись",
"elevation":"Для встановлення/видалення цієї програми потрібні права адміністратора.",
"sudo":"Будь ласка, спробуйте ще раз за допомогою sudo.",
"ctrlc":"Натисніть Ctrl-C, щоб вийти",
"commands":"Ви можете запустити текстову версію з командного рядка за допомогою таких команд",
"graphicalerror":"Графічна версія цього інсталятора не може запуститись в цій системі",
"zenity":"Спробуйте встановити або оновити Zenity, а тоді запустіть програму знову",
"status":[
"НЕ ВСТАНОВЛЕНО",
"ПРАЦЮЄ",
"НЕ ПРАЦЮЄ"
],
"statusDescription":"Поточний статус Агента",
"description":"Щоб встановити або видалити це програмне забезпечення для віддаленого керування, скористайтеся кнопками нижче. Після інсталяції програма працютиме у фоновому режимі, що дозволить віддаленому адміністратору керувати цим комп'ютером. Підключення ж надасть тимчасовий доступ поки це вікно відкрите",
ret=require('win-wmi').query('ROOT\\WMI','SELECT CurrentTemperature,InstanceName FROM MSAcpi_ThermalZoneTemperature',['CurrentTemperature','InstanceName']);
values=require('win-wmi').query('ROOT\\CIMV2',"SELECT * FROM Win32_PhysicalMemory");
if(values[0]){
trimResults(values);
ret.windows.memory=values;
}
values=require('win-wmi').query('ROOT\\CIMV2',"SELECT * FROM Win32_OperatingSystem");
if(values[0]){
trimResults(values);
ret.windows.osinfo=values[0];
}
values=require('win-wmi').query('ROOT\\CIMV2',"SELECT * FROM Win32_DiskPartition");
if(values[0]){
trimResults(values);
ret.windows.partitions=values;
for(variinvalues){
if(values[i].Description=='GPT: System'){
ret['identifiers']['bios_mode']='UEFI';
}
}
}
values=require('win-wmi').query('ROOT\\CIMV2',"SELECT * FROM Win32_Processor",['Caption','DeviceID','Manufacturer','MaxClockSpeed','Name','SocketDesignation']);
if(values[0]){
ret.windows.cpu=values;
}
values=require('win-wmi').query('ROOT\\CIMV2',"SELECT * FROM Win32_VideoController",['Name','CurrentHorizontalResolution','CurrentVerticalResolution']);
if(values[0]){
ret.windows.gpu=values;
}
values=require('win-wmi').query('ROOT\\CIMV2',"SELECT * FROM Win32_DiskDrive",['Caption','DeviceID','Model','Partitions','Size','Status']);
values=require('win-wmi').query('ROOT\\CIMV2\\Security\\MicrosoftTpm',"SELECT * FROM Win32_Tpm",['IsActivated_InitialValue','IsEnabled_InitialValue','IsOwned_InitialValue','ManufacturerId','ManufacturerVersion','SpecVersion']);
ret=require('win-wmi').query('ROOT\\WMI','SELECT CurrentTemperature,InstanceName FROM MSAcpi_ThermalZoneTemperature',['CurrentTemperature','InstanceName']);
child.stdin.write("for mon in /sys/class/hwmon/hwmon*; do for label in \"$mon\"/temp*_label; do if [ -f $label ]; then echo $(cat \"$label\")___$(cat \"${label%_*}_input\"); fi; done; done;\nexit\n");
varvalues=require('win-wmi').query('ROOT\\CIMV2','SELECT * FROM Win32_LogicalDisk',['DeviceID','VolumeName','FileSystem','Size','FreeSpace','DriveType']);
values=require('win-wmi').query('ROOT\\CIMV2\\Security\\MicrosoftVolumeEncryption','SELECT * FROM Win32_EncryptableVolume',['DriveLetter','ConversionStatus','ProtectionStatus']);
// Perform a power action: 2 = Power up, 5 = Power cycle, 8 = Power down, 10 = Reset, 11 = Power on to BIOS, 12 = Reset to BIOS, 13 = Power on to BIOS with SOL, 14 = Reset to BIOS with SOL
// Perform a power action: 2 = Power up, 5 = Power cycle, 8 = Power down, 10 = Reset, 11 = Power on to BIOS, 12 = Reset to BIOS, 13 = Power on to BIOS with SOL, 14 = Reset to BIOS with SOL, 15 = Power on to PXE, 16 = Reset to PXE
functionperformPowerAction(nodeid,action){
console.log('performPowerAction',nodeid,action);
vardevices=obj.amtDevices[nodeid];
if(devices==null)return;
for(variindevices){
@ -960,7 +973,7 @@ module.exports.CreateAmtManager = function (parent) {
// Action: 2 = Power up, 5 = Power cycle, 8 = Power down, 10 = Reset
if(isAmtDeviceValid(dev)==false)return;// Device no longer exists, ignore this request.
if(status!=200){dev.consoleMsg("Failed to set boot config ("+status+").");return;}
dev.amtstack.RequestPowerStateChange(10,function(stack,name,response,status){// 10 = Reset, 2 = Power Up
@ -1294,7 +1333,7 @@ module.exports.CreateAmtManager = function (parent) {
}
// Figure out what index is local & remote
varlocalNdx=((dev.policy.tlsSettings[0]['InstanceID']=='Intel(r) AMT LMS TLS Settings'))?0:1,remoteNdx=(1-localNdx);
varlocalNdx=((dev.policy!=null)&&(dev.policy.tlsSettings!=null)&&(dev.policy.tlsSettings[0]!=null)&&(dev.policy.tlsSettings[0]['InstanceID']=='Intel(r) AMT LMS TLS Settings'))?0:1,remoteNdx=(1-localNdx);
// Remote TLS settings
varxxTlsSettings2=Clone(dev.policy.tlsSettings);
@ -2318,7 +2357,8 @@ module.exports.CreateAmtManager = function (parent) {
constdev=stack.dev;
if(isAmtDeviceValid(dev)==false)return;// Device no longer exists, ignore this request.
constdomain=parent.config.domains[dev.domainid];
if((responses['AMT_PublicKeyCertificate'].status!=200)||(responses['AMT_PublicKeyCertificate'].status!=200)){func(dev);return;}// We can't get the certificate list, fail and carry on.
if((responses['AMT_PublicKeyCertificate'].status!=200)||(responses['AMT_PublicPrivateKeyPair'].status!=200)){func(dev);return;}// We can't get the certificate list, fail and carry on.
if((responses['AMT_PublicKeyCertificate'].responses.length==0)||(responses['AMT_PublicPrivateKeyPair'].responses.length==0)){func(dev);return;}// Empty certificate list, fail and carry on.
obj.isWebSocket=false;// If true, this request will not close and so, it can't be allowed to hold up other requests
obj.isStreaming=false;// If true, this request will not close and so, it can't be allowed to hold up other requests
obj.processedRequestCount=0;
obj.mtype=mtype;
constconstants=(require('crypto').constants?require('crypto').constants:require('constants'));// require('constants') is deprecated in Node 11.10, use require('crypto').constants instead.
consturl=protocol+'://localhost:'+args.port+'/'+domainadd+(((obj.mtype==3)&&(obj.relaynodeid==null))?'local':'mesh')+'relay.ashx?p=14&auth='+cookie;// Protocol 14 is Web-TCP
varurl=protocol+'://localhost:'+args.port+'/'+domainadd+(((obj.mtype==3)&&(obj.relaynodeid==null))?'local':'mesh')+'relay.ashx?p=14&auth='+cookie;// Protocol 14 is Web-TCP
if(domain.id!=''){url+='&domainid='+domain.id;}// Since we are using "localhost", we are going to signal what domain we are on using a URL argument.
parent.parent.parent.debug('relay','TCP: Connection websocket to '+url);
obj.res.status(parseInt(header.Directive[1]));// Set the status
conststatusCode=parseInt(header.Directive[1]);
if((!isNaN(statusCode))&&(statusCode>0)&&(statusCode<=999)){obj.res.status(statusCode);}// Set the status
constblockHeaders=['Directive','sec-websocket-extensions','connection','transfer-encoding','last-modified','content-security-policy','cache-control'];// We do not forward these headers
elseif(blockHeaders.indexOf(i)==-1){obj.res.set(i, header[i]);}// Set the headers if not blocked
elseif(blockHeaders.indexOf(i)==-1){obj.res.set(i.trim(), header[i]);}// Set the headers if not blocked
}
obj.res.set('Content-Security-Policy',"default-src 'self' 'unsafe-inline' 'unsafe-eval' data: blob:;");// Set an "allow all" policy, see if the can restrict this in the future
// Dont set any Content-Security-Policy at all because some applications like Node-Red, access external websites from there javascript which would be forbidden by the below CSP
//obj.res.set('Content-Security-Policy', "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: blob:;"); // Set an "allow all" policy, see if the can restrict this in the future
//obj.res.set('Content-Security-Policy', "default-src * 'unsafe-inline' 'unsafe-eval'; script-src * 'unsafe-inline' 'unsafe-eval'; connect-src * 'unsafe-inline'; img-src * data: blob: 'unsafe-inline'; frame-src *; style-src * 'unsafe-inline';"); // Set an "allow all" policy, see if the can restrict this in the future
obj.res.set('Cache-Control','no-store');// Tell the browser not to cache the responses since since the relay port can be used for many relays
consturl=protocol+'://localhost:'+args.port+'/'+domainadd+(((obj.mtype==3)&&(obj.relaynodeid==null))?'local':'mesh')+'relay.ashx?p=11&auth='+obj.xcookie;// Protocol 11 is Web-SSH
varurl=protocol+'://localhost:'+args.port+'/'+domainadd+(((obj.mtype==3)&&(obj.relaynodeid==null))?'local':'mesh')+'relay.ashx?p=11&auth='+obj.xcookie;// Protocol 11 is Web-SSH
if(domain.id!=''){url+='&domainid='+domain.id;}// Since we are using "localhost", we are going to signal what domain we are on using a URL argument.
parent.parent.debug('relay','SSH: Connection websocket to '+url);
consturl=protocol+'://localhost:'+args.port+'/'+domainadd+(((obj.mtype==3)&&(obj.relaynodeid==null))?'local':'mesh')+'relay.ashx?p=11&auth='+authCookie// Protocol 11 is Web-SSH
varurl=protocol+'://localhost:'+args.port+'/'+domainadd+(((obj.mtype==3)&&(obj.relaynodeid==null))?'local':'mesh')+'relay.ashx?p=11&auth='+authCookie// Protocol 11 is Web-SSH
if(domain.id!=''){url+='&domainid='+domain.id;}// Since we are using "localhost", we are going to signal what domain we are on using a URL argument.
parent.parent.debug('relay','SSH: Connection websocket to '+url);
obj.wsClient=newWebSocket(url,options);
@ -1613,16 +1623,14 @@ module.exports.CreateSshTerminalRelay = function (parent, db, ws, req, domain, u
ws._socket.resume();
}
}else{
if(typeofdata=='string'){
// Forward any ping/pong commands to the browser
try{// Forward any ping/pong commands to the browser
consturl=protocol+'://localhost:'+args.port+'/'+domainadd+(((obj.mtype==3)&&(obj.relaynodeid==null))?'local':'mesh')+'relay.ashx?p=13&auth='+authCookie// Protocol 13 is Web-SSH-Files
varurl=protocol+'://localhost:'+args.port+'/'+domainadd+(((obj.mtype==3)&&(obj.relaynodeid==null))?'local':'mesh')+'relay.ashx?p=13&auth='+authCookie// Protocol 13 is Web-SSH-Files
if(domain.id!=''){url+='&domainid='+domain.id;}// Since we are using "localhost", we are going to signal what domain we are on using a URL argument.
parent.parent.debug('relay','SSH: Connection websocket to '+url);
obj.wsClient=newWebSocket(url,options);
@ -1961,16 +1970,15 @@ module.exports.CreateSshFilesRelay = function (parent, db, ws, req, domain, user
if(obj.compareCertificateNames(r.CommonNames,commonName)==false){console.log("Error: "+commonName+" does not match name in TLS certificate: "+r.CommonNames.join(', '));forceWebCertGen=1;}else{r.CommonName=commonName;}
if(commonName.indexOf('.')==-1){console.log("ERROR: Must specify a server full domain name in Config.json->Settings->Cert when using a wildcard certificate.");process.exit(0);return;}
@ -1318,20 +1411,15 @@ module.exports.CertificateOperations = function (parent) {
if((typeofobj[i]=='object')&&((exceptions==null)||(exceptions.indexOf(i.toLowerCase())==-1))){module.exports.objKeysToLower(obj[i],exceptions);}// LowerCase all key names in the child object
// Escape and unescape field names so there are no invalid characters for MongoDB/NeDB ("$", ",", ".", see https://github.com/seald/nedb/tree/master?tab=readme-ov-file#inserting-documents)
# environment variables for initial configuration file
ENVUSE_MONGODB="false"
ENVMONGO_INITDB_ROOT_USERNAME="root"
ENVMONGO_INITDB_ROOT_PASSWORD="pass"
ENVHOSTNAME="localhost"
ENVALLOW_NEW_ACCOUNTS="true"
ENVALLOWPLUGINS="false"
ENVLOCALSESSIONRECORDING="false"
ENVMINIFY="true"
ENVWEBRTC="false"
ENVIFRAME="false"
ENVSESSION_KEY=""
ENVREVERSE_PROXY="false"
ENVREVERSE_PROXY_TLS_PORT=""
# environment variables for the above defined MeshCentral Config.json. Can be done like that following: https://docs.docker.com/reference/dockerfile/#env
| [MongoDB](https://www.mongodb.com/) backend included | mongodb | ghcr.io/ylianst/meshcentral:\<version\>-mongodb |
| [PostgreSQL](https://www.postgresql.org/) backend included | postgresql | ghcr.io/ylianst/meshcentral:\<version\>-postgresql |
| [Mysql](https://www.mysql.com/)/[MariaDB](https://mariadb.org/) backend(s) included | mysql | ghcr.io/ylianst/meshcentral:\<version\>-mysql |
So for a quick example: if you want to get the bleeding edge code with a PostgreSQL backend: `ghcr.io/ylianst/meshcentral:master-postgresql`<br>
So for another quick example: if you want to get a complete image at the latest released version: `ghcr.io/ylianst/meshcentral:latest`<br>
So for another quick example: if you want to get a released version with a MongoDB backend: `ghcr.io/ylianst/meshcentral:latest-mongodb`<br>
So for another quick example: if you want a very slim image with the latest code and only a local database: `ghcr.io/ylianst/meshcentral:master-slim`<br>
So as a last example: if you want to get a MariaDB/MySQL backend with MeshCentral version 1.1.53: `ghcr.io/ylianst/meshcentral:1.1.53-mysql`
## Environment Variables
Below is a breakdown of environment variables used in this setup.
### General MeshCentral Configuration
| Variable | Default Value | Description |
|----------|--------------|-------------|
| NODE_ENV | production | Specifies the Node.js environment. |
| CONFIG_FILE | /opt/meshcentral/meshcentral-data/config.json | Path to the configuration file. |
| DYNAMIC_CONFIG | false | Enables/disables dynamic configuration. This means config is being rechecked every container restart. False if you want to use your own `config.json` |
And if you ever change the port on which MeshCentral *INTERNALLY* runs on please also change the healthcheck either in your compose or self-compiled Dockerfile.<br>
Also relevant if you change scheme, such as HTTP to HTTPS or vice versa.
# MeshCentral Docker Build Process
This document explains the build process for the MeshCentral Docker image, along with details on various build arguments and how to use them.
## Build Arguments
The following build arguments are available for customizing the build process:
- **DISABLE_MINIFY**: Disable HTML/JS minification during the build.
- **DISABLE_TRANSLATE**: Disable translation of strings in MeshCentral.
- **INCLUDE_MONGODB_TOOLS**: Include MongoDB client and related tools.
- **INCLUDE_POSTGRESQL_TOOLS**: Include PostgreSQL client tools.
- **INCLUDE_MARIADB_TOOLS**: Include MariaDB/MySQL client tools.
- **PREINSTALL_LIBS**: Pre-install specific libraries like `ssh2`, `nodemailer`, etc.
### Build Commands with Arguments
Here are the shell commands to build the Docker image with different configurations.
#### 1. Build with Minify and Translate Disabled
If you want to disable both HTML/JS minification and translation during the build process, use the following command:
echo"Invalid or no REVERSE_PROXY and/or REVERSE_PROXY_TLS_PORT value given, commenting out so default applies... Value(s) given: $REVERSE_PROXY_STRING"
sed -i 's/"certUrl":/"_certUrl":/g'"$CONFIG_FILE"
fi
# ALLOW_NEW_ACCOUNTS
ALLOW_NEW_ACCOUNTS=${ALLOW_NEW_ACCOUNTS,,}
if[[$ALLOW_NEW_ACCOUNTS=~ ^(true|false)$ ]];then
echo"Setting NewAccounts... $ALLOW_NEW_ACCOUNTS"
sed -i 's/"_NewAccounts"/"NewAccounts"/'"$CONFIG_FILE"
echo"Invalid or no REVERSE_PROXY and/or REVERSE_PROXY_TLS_PORT value given, commenting out so default applies... Value(s) given: $REVERSE_PROXY_STRING"
| - meshcentral/ # this folder contains the persistent data
| - data/ # MeshCentral data-files
| - user_files/ # where file uploads for users live
| - web/ # location for site customization files
| - backup/ # location for the meshcentral-backups
| - .env # environment file with initial variables
| - docker-compose.yml
```
# Templates:
## .env:
```ini
NODE_ENV=production
# initial mongodb-variables
MONGO_INITDB_ROOT_USERNAME=mongodbadmin
MONGO_INITDB_ROOT_PASSWORD=mongodbpasswd
# initial meshcentral-variables
# the following options are only used if no config.json exists in the data-folder
# your hostname
HOSTNAME=my.domain.com
USE_MONGODB=false
# set to your reverse proxy IP if you want to put meshcentral behind a reverse proxy
REVERSE_PROXY=false
REVERSE_PROXY_TLS_PORT=
# set to true if you wish to enable iframe support
IFRAME=false
# set to false if you want disable self-service creation of new accounts besides the first (admin)
ALLOW_NEW_ACCOUNTS=true
# set to true to enable WebRTC - per documentation it is not officially released with meshcentral and currently experimental. Use with caution
WEBRTC=false
# set to true to allow plugins
ALLOWPLUGINS=false
# set to true to allow session recording
LOCALSESSIONRECORDING=false
# set to enable or disable minification of json, reduces traffic
MINIFY=true
```
## docker-compose.yml:
```yaml
version: '3'
services:
meshcentral:
restart: always
container_name: meshcentral
# use the official meshcentral container
image: ghcr.io/ylianst/meshcentral:latest
ports:
# MeshCentral will moan and try everything not to use port 80, but you can also use it if you so desire, just change the config.json according to your needs
- 8086:443
env_file:
- .env
volumes:
# config.json and other important files live here. A must for data persistence
# mongodb data-directory - A must for data persistence
- ./meshcentral/mongodb_data:/data/db
networks:
- meshcentral-tier
meshcentral:
restart: always
container_name: meshcentral
# use the official meshcentral container
image: ghcr.io/ylianst/meshcentral:latest
depends_on:
- mongodb
ports:
# MeshCentral will moan and try everything not to use port 80, but you can also use it if you so desire, just change the config.json according to your needs
- 8086:443
env_file:
- .env
volumes:
# config.json and other important files live here. A must for data persistence
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.