[{"content":"FAQ Installation Should I pre-install Webmin before I run virtualmin-install.sh script? No. The install script runs best on a freshly installed Grade A supported operating system.\nShould I install Apache or Postfix, and other similar packages before I run virtualmin-install.sh script? No. The install script runs best on a freshly installed Grade A supported operating system.\nWhat if I already installed Webmin on my system? If you installed from the standard package type for your system downloaded from one of our repositories, everything should be fine. Running virtualmin-install.sh should work without any trouble.\nIf you installed from a third party source, or you don\u0026rsquo;t know where it came from (like it was provided on a dedicated server you\u0026rsquo;ve rented from your hosting provider), you should uninstall it, and make sure whatever software repository it came from has been disabled.\nWhat if Apache or Postfix, and other similar packages are already installed on my system? If you installed from the OS standard repository for your OS, everything should be fine. If you installed from any third party sources, or from source, the installation will fail and things will go badly. The install script cannot accommodate packages installed from non-standard sources.\nIf you can re-install your OS, it is recommended that you start with a freshly installed Grade A supported operating system.\nI installed Apache manually or using packages from a third party source I have the following error after install: \u0026ldquo;The suexec command your system is configured to only run scripts under /var/www, but the Virtualmin virtual server home directory is /home. CGI and PHP scripts run as domain owners will not be executed.\u0026rdquo;\nThe Apache suexec command on your system is misconfigured for use in a virtual hosting environment, and needs to be recompiled or configured (on systems that provide a configurable suexec command) with the docroot set to /home. On Debian/Ubuntu systems, you can install the apache2-suexec-custom package, and modify /etc/apache2/suexec/www-data to include /home. On other systems, you will need to recompile the Apache package or the suexec binary, which we strongly not recommend doing.\nWhat if I need to install it on a server that is already setup and running? It\u0026rsquo;s highly recommended to install Virtualmin on a new, Grade A supported operating system. If installation on an active server is necessary, make sure to back up all data beforehand.\nThe final results will depend on how invasive the changes to the running system were. Anything that conflicts with what the Virtualmin install script does would be a source of trouble. What kind of trouble is difficult to predict. The biggest risk would be causing some packages you use to be uninstalled (to satisfy dependencies of Virtualmin).\nThe safer way to do it would be to do the following, instead of using the full virtualmin-install.sh installer:\nSetup Virtualmin repos:\n./virtualmin-install.sh --setup Install dependencies but carefully. Look at the list of what will be installed, and more importantly, what will be removed:\napt install virtualmin-lamp-stack or\ndnf group install --setopt=group_package_types=mandatory,default \u0026#34;Virtualmin LAMP Stack\u0026#34; Or, if you want to keep it as small as possible to start, to reduce the surface area for problems (or if you\u0026rsquo;re not hosting mail):\napt install virtualmin-lamp-stack-minimal or\ndnf group install --setopt=group_package_types=mandatory,default \u0026#34;Virtualmin LAMP Stack Minimal\u0026#34; Assuming default configuration of apt or dnf, it\u0026rsquo;ll ask before doing any removals. Don\u0026rsquo;t type \u0026ldquo;y\u0026rdquo; until you know the changes being made won\u0026rsquo;t break something you depend on.\nThen install Virtualmin itself:\napt install virtualmin-core or\ndnf group install --setopt=group_package_types=mandatory,default \u0026#34;Virtualmin Core\u0026#34; Then, assuming everything seems to be fine, run the appropriate configuration bundle (this step also has some risks, and you won\u0026rsquo;t be given any warning about what it\u0026rsquo;s doing, it assumes that if you tell it to do something you mean it):\nvirtualmin-config-system --bundle LAMP Or use the MiniLAMP bundle if you did the minimal dependency install above.\nAssuming everything goes right, you\u0026rsquo;d then have roughly the same system the Virtualmin install script would produce, but it would give you a couple of opportunities to bail if something disastrous is about to happen.\nIt\u0026rsquo;s also possible to selectively run the config step. Or selectively install dependencies, but I\u0026rsquo;ll leave that as an exercise for the reader. The things virtualmin-config-system does can be found in Virtualmin config GitHub repo.\nIf you wanted to handroll an installation that\u0026rsquo;s exactly the things you need and nothing you don\u0026rsquo;t. But, that\u0026rsquo;s a lot more work. If you don\u0026rsquo;t have any mail setup and if you don\u0026rsquo;t have much in the Apache configuration, yet, then running the automated stages of the install manually if probably safe-ish.\nLicense How do I upgrade from GPL to Pro Once you have a serial number and a license key, you would need to undergo GPL to Pro upgrade by going to System Settings ⇾ Upgrade to Virtualmin Pro page. No other commands mentioned below should be run in this type of upgrade.\nHow to upgrade Virtualmin license? Upgrading your Virtualmin Professional license is straightforward and does not require a reinstallation of Virtualmin! Once you\u0026rsquo;ve purchased your new license, just run the virtualmin change-license command. This action will update your system with the new serial number and license key. All existing licenses details can be found in the My Account → Dashboard page on the Virtualmin website.\nHow do I renew an expired license? To re-activate a system with an expired license, simply buy a new license in our shop, and use the change-license command to apply it to your server. Your server will instantly be activated on the new license.\nThe change-license command can be used for Virtualmin, like this:\nvirtualmin change-license --serial NEWSERIAL --key NEWKEY How do I cancel a recurring license? Licenses can be canceled in your Virtualmin account. Click on My Account, and then find the license you want to cancel. Click the related subscription number in the licenses table. From there you can Cancel or make other changes. If your license does not have a related subscription it will automatically end when the license term is complete.\nHow do I upgrade or downgrade a license? As with cancellations, you can make changes to your licenses in the My Account page. Find the license you want to modify, click the related subscription, and choose to upgrade or downgrade. Confirm the order to make the change. If your license does not have a related subscription, that means it was purchased before 2021 and is not known to the new commerce system. To make changes, you\u0026rsquo;ll need to purchase a new license and switch to it using the virtualmin change-license command as described above.\nWhere are my expired licenses? Expired licenses don\u0026rsquo;t retain any value and are removed from your account dashboard after some time.\nWhy do I see a license error message? You may see a license error message if you\u0026rsquo;re using the same Pro license on multiple servers. Here are the important details to understand:\nEach Pro license is valid for exactly one server. Using it on multiple servers will trigger a license error unless you\u0026rsquo;re in the migration grace period.\nWhen migrating between servers or testing, you get a 21-day grace period (minus 48 hours for license server lock release) to use the same license on multiple servers.\nAfter the grace period expires:\nVirtualmin will temporarily disable features that allow changes to be made through either the UI or CLI on all affected servers. Your websites, databases, and other system services will continue running normally. For expired licenses, there\u0026rsquo;s a 7-day grace period to renew before the same restrictions are applied.\nTo resolve license errors, you can either:\nComplete your server migration within the grace period. Purchase additional licenses for extra servers. Ensure you\u0026rsquo;re only using the license on one server. How do I update payment information or find my invoices? If your billing information has expired, we will not be able to renew your licenses automatically. To add a new default payment method, browse to My Account ⇾ Payment methods, and then click the Add payment method button.\nSecurity What are the default file and directory permissions? When Webmin and Virtualmin create files and directories, they rely on the default mode mask (\u0026ldquo;umask\u0026rdquo;) without setting specific permissions. By default, all files and directories have full permissions set to \u0026ldquo;666 (rw-rw-rw-)\u0026rdquo; for files and \u0026ldquo;777 (rwxrwxrwx)\u0026rdquo; for directories. The \u0026ldquo;umask\u0026rdquo; value, typically set to \u0026ldquo;022\u0026rdquo;, modifies these default permissions. This means the actual default permissions are set and calculated as follows:\nFor files\n666 - 022 = 644 (rw-r--r--) For directories\n777 - 022 = 755 (rwxr-xr-x) However, these default settings can be overridden in Webmin ⇾ Webmin Configuration: Advanced Options page under the Umask (unset permission bits) for created files option, which for example can be set to \u0026ldquo;027\u0026rdquo; to restrict default permissions to \u0026ldquo;640 (rw-r\u0026mdash;\u0026ndash;)\u0026rdquo; for files and \u0026ldquo;750 (rwxr-x\u0026mdash;)\u0026rdquo; for directories.\nAdditionally, Webmin and Virtualmin offer specific settings for certain files and directories:\nDefault home directory permissions can be controlled in System ⇾ Users and Groups: Configuration ⇾ Home directory options page. Permissions for files in the \u0026ldquo;public_html\u0026rdquo; directory can be set in System Settings ⇾ Server Templates: Edit Server Template / Website for domain using the Permissions on website subdirectory option. Note: Changes made in templates only apply to newly created virtual servers. When I use Manage Virtual Server ⇾ Switch To Server\u0026rsquo;s Admin, is there a way to return without logging out? When you use that option, you become that user. For security reasons, there\u0026rsquo;s no way to switch back. Allowing it could let users trick the system into becoming the root user, which would be a big security risk.\nPackages and web apps upgrades Virtualmin and all related packages are outdated, and no updates are available. Why? This problem typically arises from outdated repositories. To resolve the issue, simply re-setup the Virtualmin repositories by executing the command below. This command is designed to function across all Grade A and some Grade B supported operating systems and is compatible with both Virtualmin GPL and Pro versions:\ncurl -fsSL https://download.virtualmin.com/repository | sudo sh -s -- -s -B stable How to update Virtualmin and all related packages? When a new version is available, you will see a message on the Dashboard page stating that there are Virtualmin related package updates available. Other packages may be listed too, depending on what is available to be updated. To install these updates, just click the Install All Updates Now button and follow onscreen instructions.\nUpgrading from the command line is also possible, using the dnf or apt-get commands, depending on your OS.\nFor example, on EL systems, you can run the following command to update all system packages, including Virtualmin related ones:\ndnf update -y On Debian and derivatives, you can run the following command:\napt-get update \u0026amp;\u0026amp; apt-get upgrade -y Alternately, you can install specific packages, e.g.:\ndnf update perl webmin wbm-virtual-server usermin -y or\napt-get install perl webmin webmin-virtual-server usermin -y How can I make sure my web applications are up-to-date without having to wait for the next Virtualmin release? In Virtualmin, go to System Settings ⇾ Web App Installers ⇾ Installer Updates, and ensure Download web app updates is set to Yes to automatically receive the latest web app installer updates.\nSystem upgrade How do I upgrade my system from one major version to another? Upgrading major versions of your Linux distribution, such as from Ubuntu 22.04 to 24.04, AlmaLinux 8 to 9, or Debian 11 to 12, is a significant process and is not something we can assist with. It\u0026rsquo;s important to note that distro upgrades can sometimes lead to complications. Some users might experience issues that require manual intervention to resolve, while others may find the upgrade process smooth and without major problems. We strongly recommend that such questions be directed to the respective forums or support communities. They are better equipped to provide detailed, distribution-specific advice and guidelines for the upgrade process.\nRemember, it\u0026rsquo;s always a good idea to backup your data before attempting any major system upgrade.\nMigration and transfer What is the difference between migrating and transferring a virtual server? The “Migrate Virtual Server” option is for importing a backup file from another panel into Virtualmin. The “Transfer Virtual Server” option is the opposite—it\u0026rsquo;s for pushing a virtual server from one Virtualmin system to another. Some people use it to move domains from an old server to a new one. If you\u0026rsquo;re importing a backup from another panel, “Migrate Virtual Server” is the way to go.\nUser interface What are the key terminology differences between cPanel and Virtualmin Virtualmin and cPanel have key differences in terminology \u0026mdash; in Virtualmin, what cPanel refers to as \u0026ldquo;domain\u0026rdquo; is called a \u0026ldquo;Virtual Server\u0026rdquo;, \u0026ldquo;add-on\u0026rdquo; domains roughly akin to a \u0026ldquo;sub-server\u0026rdquo; and \u0026ldquo;parked domain\u0026rdquo; may be comparable to an \u0026ldquo;alias\u0026rdquo;. \u0026ldquo;Subdomains\u0026rdquo; as they appear in cPanel are not usefully comparable to anything in Virtualmin. Either a Virtual Server or a Sub-Server can have a subdomain name. A subdomain is just a name to Virtualmin. A sub-server in Virtualmin is a domain owned by a top-level or parent Virtual Server, it has no relation to how it is named.\nWhat modules are included in the \u0026lsquo;Un-used Modules\u0026rsquo; section in Webmin? Un-used modules means \u0026ldquo;modules that are installed but for which the detection logic in the module did not find the related packages installed\u0026rdquo;. Any module that has service detection functions will end up in un-used modules if it does not detect the service or application it manages. The way to get a module out of unused modules is to install the related package.\nStarting with Virtualmin 8, Webmin from download.virtualmin.com installs the core module set by default, and optional Webmin modules are installed separately using the package manager. This means new Virtualmin installs should have few, if any, unused modules compared to older full Webmin installs. If you need an optional module later, install the matching webmin-* package, as explained in Webmin module packages.\n","permalink":"https://www.virtualmin.com/docs/faq/","summary":"\u003ch2 id=\"faq\"\u003eFAQ\u003c/h2\u003e\n\u003ch3 id=\"installation\"\u003eInstallation\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003ch5 id=\"should-i-pre-install-webmin-before-i-run-virtualmin-installsh-script\"\u003eShould I pre-install Webmin before I run \u003ccode\u003evirtualmin-install.sh\u003c/code\u003e script?\u003c/h5\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNo.  The install script runs best on a freshly installed Grade A \u003ca href=\"/docs/os-support/#grade-a-supported-systems\"\u003esupported operating\u003c/a\u003e system.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch5 id=\"should-i-install-apache-or-postfix-and-other-similar-packages-before-i-run-virtualmin-installsh-script\"\u003eShould I install Apache or Postfix, and other similar packages before I run \u003ccode\u003evirtualmin-install.sh\u003c/code\u003e script?\u003c/h5\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNo. The install script runs best on a freshly installed Grade A \u003ca href=\"/docs/os-support/#grade-a-supported-systems\"\u003esupported operating\u003c/a\u003e system.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch5 id=\"what-if-i-already-installed-webmin-on-my-system\"\u003eWhat if I already installed Webmin on my system?\u003c/h5\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIf you installed from the standard package type for your system downloaded from one of our repositories, everything should be fine.  Running \u003ccode\u003evirtualmin-install.sh\u003c/code\u003e should work without any trouble.\u003c/p\u003e","title":"FAQ"},{"content":"Virtualmin runs on top of Webmin. Webmin works on almost every UNIX-like OS, so with some manual setup Virtualmin can run on many of them, too. However, we only provide an automated installation script and managed software updates for a smaller set of popular systems.\nIf you\u0026rsquo;re new to Virtualmin and want a smooth install and easy maintenance, pick one of our Grade A supported systems. If you\u0026rsquo;re unsure which one, use the latest supported version of the OS you know best.\nGrade A supported systems Grade A systems have an automated installation script and a maintained software repository for updates, and are expected to work out of the box when you run the installer on a freshly installed system. We strongly recommend the current stable release of one of these systems for most users. We don\u0026rsquo;t support beta or pre-release versions of any OS.\nEnterprise Linux and derivatives Red Hat Enterprise Linux 8, 9, and 10 on x86_64 and aarch64 AlmaLinux and Rocky Linux 8, 9, and 10 on x86_64 and aarch64 Debian Linux and derivatives Debian 12 and 13 on i386, amd64, and arm64 Ubuntu 22.04 LTS and 24.04 LTS on i386, amd64, and arm64 Grade B supported systems These operating systems are not recommended for new or intermediate users. You should only use them if you\u0026rsquo;re already comfortable with both your OS and Virtualmin. If you\u0026rsquo;re unsure, choose a Grade A supported OS instead.\nMost Grade B systems don\u0026rsquo;t fully support automatic installation, but they can work well if you know how to configure and integrate the required services yourself. Virtualmin has been run on all of these, but they\u0026rsquo;re only recommended for experienced admins. We\u0026rsquo;ll try to help with Virtualmin issues on these platforms, but they get little or no direct testing.\nGrade B systems with automatic installation support To enable automatic installation on these systems, run the installer with:\nsudo sh virtualmin-install.sh --os-grade B Enterprise Linux and derivatives Fedora Server 43 and later on x86_64 and aarch64 CentOS Stream 8, 9, and 10 on x86_64 and aarch64 Amazon Linux 2023 on x86_64 and aarch64 Oracle Linux 8, 9, and 10 on x86_64 and aarch64 openEuler 24.03 and later on x86_64 and aarch64 CloudLinux 8 and 9 on x86_64 Debian Linux and derivatives Ubuntu 26.04 developer preview on i386, amd64, and arm64 Kali Linux Rolling on amd64 and arm64 Ubuntu interim (non-LTS) releases on i386, amd64, and arm64 Grade B systems without automatic installation support Raspbian Linux openSUSE Linux FreeBSD OpenBSD NetBSD Others If your UNIX-like OS isn\u0026rsquo;t listed above, Virtualmin may still work. Start by installing Webmin; if Webmin works, you\u0026rsquo;re partway to confirming that Virtualmin can, too. But getting all services working nicely together will be a manual, expert-level job.\n","permalink":"https://www.virtualmin.com/docs/os-support/","summary":"\u003cp\u003eVirtualmin runs on top of Webmin. Webmin works on almost every UNIX-like OS, so with some manual setup Virtualmin can run on many of them, too. However, we only provide an \u003ca href=\"/docs/installation/automated/\"\u003eautomated\u003c/a\u003e installation script and managed software updates for a smaller set of popular systems.\u003c/p\u003e\n\u003cp\u003eIf you\u0026rsquo;re new to Virtualmin and want a smooth install and easy maintenance, pick one of our Grade A supported systems. If you\u0026rsquo;re unsure which one, use the latest supported version of the OS you know best.\u003c/p\u003e","title":"OS Support"},{"content":"Virtualmin GPL is already an extremely powerful and flexible virtual hosting control panel, so we\u0026rsquo;re frequently asked about the differences between Virtualmin GPL and Virtualmin Professional. So, if you were wondering whether you should upgrade, you\u0026rsquo;ve come to the right place.\nKey attributes of professional features Before going into specifics, we wanted to explain our philosophy on determining which features are included in both GPL and Professional, and which features are reserved for our paying customers. A feature is \u0026ldquo;professional\u0026rdquo;, if any of the following are true:\nIt is really only useful in a commercial environment. We figure if you\u0026rsquo;re using Virtualmin to make money, we\u0026rsquo;d like to make a little bit, too, so we can keep working on it, making it better, and releasing new versions. So, if it\u0026rsquo;s obviously about making money, it\u0026rsquo;s a candidate for only being in Virtualmin Professional. This doesn\u0026rsquo;t mean all fiscally motivated features are excluded from GPL, but it is a starting point. Reseller Accounts are an example of this type of feature. It costs us a lot of time and effort to keep it working. Web Apps are the best example of this characteristic. Because there are so many, and because there are new versions that have to be deployed and tested every few days, we simply have to have revenue to support it. It was an extremely large, and extremely expensive, feature to develop in the first place. This is a special case, and features that fit this description might end up in GPL eventually. A large number of the features you find in GPL today came about through this process. Mail processing is one example, as is PHP with suexec and mod_fcgid management. Reseller accounts One big difference in Virtualmin Professional is the addition of a reseller account type.\nThis allows you to create users that can create users. These users can then be managed by the master administrator (root, and equivalents), or the reseller that created the account. These created users can also be re-assigned to other reseller accounts, or removed from control of the reseller, at any time by the master administrator.\nIt\u0026rsquo;s worth pointing out that some users think they need this feature to allow users to create their own additional websites, but that\u0026rsquo;s not the case. Both versions of Virtualmin allow users to create and manage their own websites (whether they are full featured sub-servers that have different content or aliases that point to an existing website). So, if you just need to allow unprivileged users to create new domain-based websites (and mail accounts, and everything that goes along with a website), reseller accounts are not necessary. Regular Virtualmin accounts, available in both GPL and Professional will work fine.\nIf you are a hosting provider, and you want to allow web developers to resell your services, you\u0026rsquo;ll need Virtualmin Professional. Some large enterprise environments might find the reseller features useful for delegating web hosting management to local administrators or supervisors. We\u0026rsquo;ve also seen a few universities, colleges, and K12 schools use it for similar delegation. So, it\u0026rsquo;s not just for reselling, but if you aren\u0026rsquo;t a hosting provider, this feature probably won\u0026rsquo;t be necessary.\nNew reseller email This feature is used to edit the template for the email message that can be sent to a new reseller account after it is created.\nEnhanced user management Easily manage SSH public keys directly from the user interface and set up database and webserver users independently, without the need for Unix account setup.\nManage SSH public keys This feature allows you to manage SSH public keys for users, which can be used for passwordless login to the server over SSH.\nManage extra database users This feature allows you to create and manage additional database users for a virtual server, which can be used to access databases without the need for creating a separate Unix user.\nManage extra webserver users This feature allows you to create and manage additional webserver users for a virtual server, which can be used to access website directories securely without the need for creating a separate Unix user.\nManage web apps Virtualmin Professional provides automated installation of dozens of installable web applications, including blogs, wikis, content management systems, ad servers, ecommerce systems, and more.\n\u0026nbsp;\u0026nbsp;List of installable web apps Web app Description Categories Incompatibilities Auktiva Auktiva is a free, open-source auction platform for hosting private and public auctions, built with Next.js and React for charity events, fundraisers and community organizations Community b2evolution A multilingual multiuser multi-blog engine Blog Blesta Blesta is a billing and client management application for hosting providers Commerce, Billing Booked A web-based resource scheduling system that allows administered management of reservations on any number of resources, such as conference rooms Calendar Bugzilla Bugzilla is server software designed to help you manage software development Tracker ClassicPress A lightweight, stable, instantly familiar free open-source content management system based on WordPress Blog, CMS CMS Made Simple CMS Made Simple makes it easy to set up a site and then hand it over to non-techies to maintain CMS Coppermine Coppermine is a multi-purpose fully-featured and integrated web picture gallery application written in PHP Photos Django Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design Development DokuWiki DokuWiki is a standards compliant, simple to use Wiki, mainly aimed at creating documentation of any kind Wiki Dolibarr Dolibarr ERP/CRM is a powerful Open Source software to manage a professional or foundation activity (small and medium enterprises, freelancers) Commerce dotProject An open source project management tool Projects Drupal A full-featured content management/discussion engine suitable to setup a news-driven community or portal site CMS, Community, Commerce eGroupWare EGroupware is an enterprise ready groupware software for your network Calendar eXtplorer eXtplorer is a web-based File Manager Others Feng Office A full-featured content management/discussion engine suitable to setup a news-driven community or portal site Others Flyspray Flyspray is an uncomplicated, web-based bug and task tracking system Tracker Foswiki Foswiki is the free and open source enterprise collaboration platform, a fork of TWiki Wiki Friendica Friendica is a decentralized social network communications platform Community Gallery Gallery is a web based software product that lets you manage your photos Photos Ghost Ghost is a powerful open source app for new-media creators to publish, share, and grow a business around their content Blog Grav Grav is a free software, self-hosted content management system CMS Heimdall Heimdall Application Dashboard is a dashboard for all your web applications Others ionCube IonCube is a PHP module extension that loads encrypted PHP files and speeds up webpages that are being displayed Others Joomla Joomla is an open source content management system CMS Kanboard Kanboard is a free and open source Kanban project management software Projects, Tracker LimeSurvey LimeSurvey is a PHP web application that interacts with MySQL to develop surveys, publish surveys and collect responses to surveys Survey Magento Magento is a new professional open-source eCommerce solution offering unprecedented flexibility and control Commerce Mantis Mantis is a free popular web-based bugtracking system Tracker Matomo Matomo is an open source web analytics software. It gives interesting reports on your website visitors, your popular pages and more Others Mautic Marketing Automation Software Others MediaWiki MediaWiki is a free Wiki software package, used to run Wikipedia Wiki MoinMoin Advanced, easy to use and extensible WikiEngine with a large community of users Wiki Moodle Moodle is a course management system (CMS) to help educators create effective online learning communities CMS Movable Type The Movable Type platform makes it easy for you to both author content and interact with your community of readers Blog MyBB MyBB is a free and open source, community-based forum software project managed, developed, and supported by volunteers Community Nextcloud Nextcloud gives you universal access to your files through a web interface or WebDAV Others Node.js Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications Development OpenCart A powerful open-source shopping cart system that is designed to be feature rich and user friendly Commerce osTicket osTicket is a widely-used open source support ticket system Others Nginx ownCloud ownCloud gives you universal access to your files through a web interface or WebDAV Others PHP-Calendar A web-based calendar and event scheduler written in PHP Calendar phpBB A high powered, fully scalable, and highly customizable Open Source bulletin board package Community PHPList PHPlist is a web application that implements a personalised mailing list manager or customer relationship management (CRM) system Email phpMyAdmin A browser-based MySQL database management interface Database phpMyFAQ phpMyFAQ is an open source FAQ system using PHP Helpdesk phpPgAdmin A browser-based PostgreSQL database management interface Database Piwigo Piwigo is a photo gallery software for the web. It comes with powerful features for publishing your photos and smart browsing capabilities Photos Pixelfed Pixelfed is a free and federated photo-sharing platform built on the ActivityPub protocol Community Pydio Pydio turns your web server into a powerful file management system Others RainLoop RainLoop is a simple, modern and fast web-based email client Email Revive Adserver Revive Adserver is an open-source ad server, with an integrated banner management interface and tracking system for gathering statistics Commerce RoundCube RoundCube Webmail is a browser-based multilingual IMAP client with an application-like user interface Email Simple Machines Forum Simple Machines Forum (SMF) is a free, professional grade software package that allows you to set up your own online community within minutes Community SquirrelMail SquirrelMail is a standards-based webmail package written in PHP Email SuiteCRM A powerful open-source package for managing customer relationships Commerce Textpattern A free, flexible, elegant, easy-to-use content management system for all kinds of websites, even weblogs Blog Tiki Wiki CMS Groupware A full featured free software Wiki/CMS/Groupware written in PHP Wiki Trac Enhanced wiki and issue tracking system for software development projects Tracker TWiki TWiki is a flexible, powerful, and easy to use enterprise collaboration platform Wiki TYPO3 CMS TYPO3 CMS is a free and open-source web content management system CMS Vtiger CRM Vtiger CRM is an open-source web-based customer relationship management application Commerce WebCalendar A PHP application used to maintain a calendar for one or more persons and for a variety of purposes Calendar webtrees A web application that allows you to publish your genealogy online, collaborate with family members and take control of your data Community WHMCS WHMCS is an all-in-one client management, billing \u0026amp; support solution for online businesses Commerce WordPress A semantic personal publishing platform with a focus on aesthetics, web standards, and usability Blog, CMS X2CRM X2CRM is a fast and compact marketing automation, sales force and customer service application powered by an easy to use website-optimized visual workflow engine Commerce Xoops XOOPS is a free open-source content management system CMS YOURLS YOURLS allows you to run your own URL shortening service Others Z-Push Z-Push is an open-source application to synchronize ActiveSync compatible devices Email Zen Cart Zen Cart is a full-function e-commerce application for your website Commerce Zenphoto Zenphoto is a standalone CMS for multimedia focused websites Photos, CMS Zikula Zikula allows you to build simple one-page websites to individual web applications utilizing different types of extensions for making your project to something special CMS This feature is popular with pretty much everyone, because it\u0026rsquo;s just so convenient. Even we use this feature heavily, because even though we aren\u0026rsquo;t intimidated by most install procedures for applications, we also like to save time and hassle.\nIf you plan to run more than one or two web applications, this feature will come in very handy. It not only makes installation a snap, it also makes it easier to upgrade in most cases. For applications with an automate-able upgrade process, you can upgrade to the latest version with the click of a button. You can also have Virtualmin notify you when new versions become available, and mass-upgrade all installations of an application on your system.\nResource usage graphs Another popular feature is the resource usage graphs. This makes it easy to see how well your server is performing, how much memory is in use, CPU load, email and spam delivery rates, and many more variables, over time. In a commercial environment, it is extremely important to know about performance problems before they begin to affect your users. Likewise, when problems occur, it is important to be able to isolate the source of the trouble quickly. Comprehensive resource usage graphs can make those tasks much easier.\nEnvironment limitations In addition to the basic Jailkit functionalities in the GPL version, Virtualmin Professional offers enhanced features for more control and flexibility. These include the ability to reset the jail environment to its minimal state, providing a clean slate for reconfigurations. It also allows for the selective inclusion of additional tools and commands from specific sections of the /etc/jailkit/jk_init.ini file, such as git or apacheutils. Furthermore, users can efficiently manage extra commands and directories, ensuring necessary dependencies are handled automatically for a seamless jail environment setup.\nThis expanded feature set in Virtualmin Professional provides a robust solution for users seeking advanced control and customization in server environment management, particularly for security and isolation capabilities.\nResource limits This feature allows you to define limits on CPU and memory use that apply to this virtual server and all sub-servers. Limits apply to both PHP scripts, and commands run via an SSH login. They can be used to prevent any one domain owner from overloading the system with a fork bomb or commands that use an excessive amount of RAM.\nEdit web pages This feature lets you create, upload, and edit HTML files directly on the virtual server, offering both a visual editor and a raw HTML editor for quick and flexible content modification.\nExternal connectivity check This feature checks the external accessibility of virtual servers, to run various tests to ensure that one or more virtual server\u0026rsquo;s web, DNS and mail servers are accessible from the rest of the Internet. This is useful for debugging various connectivity and configuration problems.\nSearch mail logs This feature can be used to search the email logs for messages to some virtual server, or all servers if you are the master administrator, where you can select one or more of the following criteria, all of which must match: start date, end date, source address and destination address.\nCloud DNS providers This feature is used to configure Virtualmin to use cloud DNS services (Cloudflare DNS, Google Cloud DNS, Amazon Route 53) other than your own system. These typically provide higher availability and faster DNS lookups to clients, for a cost per hosted domain.\nCloud mail delivery providers This feature provides support for systems with dynamic IPs to reliably send email by using outgoing SMTP providers, like Amazon SES. See How to Configure Amazon SES for Outgoing Email for setup details.\nEmail server owners This feature can be used to send email to the owners of the selected virtual servers, for example to announce system down-time, upgrades or other service alterations. Substitions such as ${USER}, ${DOM}, ${HOME} and other can be used in the message body and subject.\nMailbox cleanup This feature can be used to setup a mailbox cleanup policy that applies to some or all virtual servers on your system. Unlike the per-domain spam and virus folder cleanup settings, this policy applies to all folders of all users in each chosen domain, including the inbox. Message deletion can be based either on a time threshold, or a maximum mailbox size. Deletion based on message age is an easy way to setup a retention policy to limit the maximum age of stored messages.\nCustom links This feature allow the administrator to include additional links that appear in the left navigation menu when a virtual server is selected.\nRemote DNS servers This feature lets you add a remote DNS server running on another system managed by Virtualmin, allowing it to be used as primary or secondary to improve reliability or provide external DNS for specific virtual servers.\nSSL providers This feature allows you to choose from a variety of SSL certificate providers, including Let\u0026rsquo;s Encrypt, ZeroSSL, Google Trust Services, Buypass, SSL.com, Sectigo, and others. You can also set up automatic renewal of SSL certificates, choose between RSA and EC certificate algorithms, and check connectivity before requesting a certificate.\nSecondary mail servers This feature is used to add a secondary mail server that can also receive email for one of the virtual servers managed by Virtualmin, but only as a temporary relay rather than the final destination. It is wise to setup a secondary server for heavily used mail domains, to act as a backup or holding place in case the primary mail server is down.\nDisk quota monitoring This feature can be used to set up regular automatic checking of virtual servers that have reached or are approaching their disk quotas. It is most useful on systems that do not have group quota support, and thus depend on manual enforcement to ensure that servers do not use more than their allowed disk space.\nBatch create servers This feature allows you to create multiple virtual servers at once from a text file.\nBackup encryption keys This feature is used to create and manage GPG keys that Virtualmin can use to backup virtual servers. Encryption protects the contents of your backups when they are stored on an untrusted remote system (such as S3), and detects unauthorized modifications.\n","permalink":"https://www.virtualmin.com/docs/professional-features/","summary":"\u003cp\u003eVirtualmin GPL is already an extremely powerful and flexible virtual hosting control panel, so we\u0026rsquo;re frequently asked about the differences between Virtualmin GPL and Virtualmin Professional. So, if you were wondering whether you should upgrade, you\u0026rsquo;ve come to the right place.\u003c/p\u003e\n\u003ch3 id=\"key-attributes-of-professional-features\"\u003eKey attributes of professional features\u003c/h3\u003e\n\u003cp\u003eBefore going into specifics, we wanted to explain our philosophy on determining which features are included in both GPL and Professional, and which features are reserved for our paying customers. A feature is \u0026ldquo;professional\u0026rdquo;, if any of the following are true:\u003c/p\u003e","title":"Professional Features"},{"content":"Virtualmin can be installed in a number of ways, including an automated install script, which uses the standard package management features of your OS, and software repositories containing our software in native package formats. We strongly recommend that you use the automated install script to install Virtualmin, if at all possible.\nMost people can just follow the simple instructions on the Download page. Return here if that proves insufficient.\nAutomated installation Installation of the full Virtualmin stack using our automated install script. This is the recommended way to install Virtualmin.\nManual installation Installation of Virtualmin and related packages manually. This method is time-consuming, and requires a high level of technical experience. This is not recommended, except in cases where the automated installation is inappropriate or impossible.\nInstallation troubleshooting Troubleshooting common problems encountered during installation.\nUninstalling Virtualmin Remove Virtualmin from a test or disposable system. This is destructive and should not be used on production servers.\n","permalink":"https://www.virtualmin.com/docs/installation/guides/","summary":"\u003cp\u003eVirtualmin can be installed in a number of ways, including an automated install script, which uses the standard package management features of your OS, and software repositories containing our software in native package formats. We strongly recommend that you use the automated install script to install Virtualmin, if at all possible.\u003c/p\u003e\n\u003cp\u003eMost people can just follow the simple instructions on the \u003ca href=\"/download/\"\u003eDownload\u003c/a\u003e page. Return here if that proves insufficient.\u003c/p\u003e\n\u003ch3 id=\"automated-installation\"\u003eAutomated installation\u003c/h3\u003e\n\u003cp\u003eInstallation of the full Virtualmin stack using our automated install script. This is the recommended way to install Virtualmin.\u003c/p\u003e","title":"Installation Guides"},{"content":"Recommended system specifications A freshly installed supported OS At least 1 GiB RAM (full install with mail, spam filtering, and virus scanning needs 4 GiB or more) At least 1 GiB free disk space (plus more for your domains and mail) A domain name with DNS records pointing to your server\u0026rsquo;s IP address Installation There are two ways to install Virtualmin: using the automated install script described here or following the manual installation guide. Whenever possible, use the automated method because it reduces mistakes and configures everything correctly for virtual hosting in no time.\nIf you haven\u0026rsquo;t already, read the Download page first, as it covers the steps needed for most installations on one page. Only move on to the more detailed docs if those steps don\u0026rsquo;t work for your situation.\nOn Debian and its derivatives, the Virtualmin installer treats MariaDB and MySQL as drop-in replacements, so if MySQL is already installed it will use it. To use Oracle MySQL instead of MariaDB, install mysql-server, mysql-common, and libdbd-mysql-perl with your package manager before running the installer. This is not available on EL-based systems, where only MariaDB is supported. PostgreSQL and the Webmin PostgreSQL module are no longer installed by default. If you want PostgreSQL as part of the initial install, add --include PostgreSQL to your virtualmin-install.sh command, and also add --extra webmin-postgresql,postgresql,postgresql-server on EL systems or --extra webmin-postgresql,postgresql,postgresql-client on Debian and derivatives. You can also skip MariaDB setup with --exclude MariaDB. If Virtualmin is already installed, install the PostgreSQL packages and the Webmin PostgreSQL module for your OS, then run virtualmin-config-system --include PostgreSQL and lastly turn PostgreSQL feature on in the \u0026ldquo;System Settings ⇾ Features and Plugins\u0026rdquo; page. Automated installation In most cases, installing Virtualmin is as simple as installing a supported OS and then running the virtualmin-install.sh script. Supported systems are listed on the OS Support page.\nWe recommend using a minimal server version instance of your preferable operating system. The Virtualmin virtualmin-install.sh script will install any additional packages that it requires.\nRunning the install script The OS-neutral virtualmin-install.sh script sets up the license key in /etc/virtualmin-license, configures your package manager for the Virtualmin repository, and then installs the virtualmin-config package, which completes the install for your OS and version.\nIf you\u0026rsquo;re using Virtualmin Pro, download virtualmin-install.sh from My Account → Dashboard page. If you\u0026rsquo;re using Virtualmin GPL, download it from the Download page.\nOnce the virtualmin-install.sh script is on your server, run it as root:\nsudo sh virtualmin-install.sh The installer supports several options for different install types. Run it with --help to see the available choices.\nUsage: virtualmin-install.sh [options] If called without arguments, installs Virtualmin with default options. --bundle|-b \u0026lt;LAMP|LEMP\u0026gt; bundle to install (default: LAMP) --type|-t \u0026lt;full|mini\u0026gt; install type (default: full) --os-grade|-g \u0026lt;A|B\u0026gt; operating system support grade (default: A) --branch|-B \u0026lt;stable|rc|devel\u0026gt; install branch (default: stable) --extra|-E \u0026lt;name[,name..]\u0026gt; install extra packages before stack install --exclude|-e \u0026lt;name[,name..]\u0026gt; exclude plugin from configuration phase --include|-i \u0026lt;name[,name..]\u0026gt; include plugin in configuration phase --module|-o load custom module in post-install phase --hostname|-n force hostname during install --no-package-updates|-x skip package updates during install --no-hostname-ssl|-nhs skip SSL certificate request for hostname --uninstall|-u remove all packages and dependencies --setup|-s reconfigure repos without installing --connect|-C \u0026lt;ipv4|ipv6\u0026gt; test connectivity without installing --insecure-downloads|-I skip SSL certificate check for downloads --force|-f|--yes|-y assume \u0026#34;yes\u0026#34; to all prompts --force-reinstall|-fr force complete reinstall (not recommended) --no-banner|-nb suppress installation messages and warnings --verbose|-V enable verbose mode --version|-v show installer version --help|-h show this help LAMP (Apache) vs. LEMP (Nginx) The install script can set up either Apache or Nginx. Apache (LAMP) is the default and most common choice, but Nginx (LEMP) is also fully supported and can be installed using --bundle LEMP if you prefer Nginx.\nFull install vs. minimal install The full LAMP or LEMP stack with mail, spam filtering, and virus scanning is heavy and needs at least about 4 GiB of RAM to run well (more is better). On low-memory systems, running the full mail stack alongside LAMP or LEMP is not recommended.\nUse --type mini flag for a lighter setup that skips local mail handling, spam and virus filtering, local DNS, FTP, and Jailkit, but still provides a full web stack and works well with Cloud DNS. Minimal installs usually work well with around 1 GiB of RAM.\nQuestions install script might ask you Depending on your OS and the state of your system, the installer may ask a few questions.\nFully qualified domain name If your system doesn\u0026rsquo;t have a fully qualified domain name (FQDN), full installs that include mail will stop and ask you to set one. For minimal installs, it isn\u0026rsquo;t required.\nUse a name like host.example.com, not a name you\u0026rsquo;ll host in Virtualmin itself. For example, if you\u0026rsquo;ll host the virtualmin.com domain, you can call the system host.virtualmin.com, but not virtualmin.com.\nCompleting the installation Once you\u0026rsquo;ve answered any questions, installation continues automatically. After a few minutes, your system will be ready to use with Virtualmin.\nIf the TLS certificate request succeeded and your hostname resolves correctly, log in at:\nhttps://your-hostname:10000 This will usually avoid SSL warnings, since the certificate is issued for your hostname.\nIf DNS isn\u0026rsquo;t set up yet or the certificate request failed, you can still log in using your server\u0026rsquo;s IP address:\nhttps://your-ip:10000 In that case, you\u0026rsquo;ll see an SSL warning. You can safely continue and fix the certificate after setup.\nLog in as root or any sudo-capable user. You\u0026rsquo;ll be guided through a short post-installation wizard. After that, click Check Configuration at the top of the List Virtual Servers page to let Virtualmin verify that everything is ready.\nGetting logged in In most cases, you can just log in to Virtualmin with your sudo-capable user instead of root.\nIf you specifically want to log in as root and it doesn\u0026rsquo;t have a password (common on cloud images that use SSH keys), set one with:\nsudo passwd root ","permalink":"https://www.virtualmin.com/docs/installation/automated/","summary":"\u003ch3 id=\"recommended-system-specifications\"\u003eRecommended system specifications\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eA freshly installed \u003ca href=\"/docs/os-support/\"\u003esupported OS\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAt least 1 GiB RAM (full install with mail, spam filtering, and virus scanning needs 4 GiB or more)\u003c/li\u003e\n\u003cli\u003eAt least 1 GiB free disk space (plus more for your domains and mail)\u003c/li\u003e\n\u003cli\u003eA domain name with DNS records pointing to your server\u0026rsquo;s IP address\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"installation\"\u003eInstallation\u003c/h3\u003e\n\u003cp\u003eThere are two ways to install Virtualmin: using the automated install script described here or following the \u003ca href=\"/docs/installation/manual/\"\u003emanual installation\u003c/a\u003e guide. Whenever possible, use the automated method because it reduces mistakes and configures everything correctly for virtual hosting in no time.\u003c/p\u003e","title":"Automated Installation"},{"content":"Unlike the Automated Virtualmin installation, to make use of this installation type, your OS does not need to be freshly installed, nor does it need to be a supported operating system. This method, however, requires significantly more knowledge on the part of the person doing the installation, and a much larger time investment to insure that all necessary configuration is performed and all Virtualmin managed services are working correctly. If you are not extremely comfortable with your operating system, the services used in a hosting system, and performing various configuration tasks from the command line, you are advised to use the automatic installation on a Grade A supported operating system.\nPartitioning The partitions on your Virtualmin server should be allocated in one of the the following two ways, depending on your requirements and preference. Either partition scheme is supported by the Virtualmin Professional Installer. Other partition layouts may lead to incorrect configuration of filesystem quotas, but can be corrected after installation is completed if other partitioning schemes are preferred.\nOne partition In this partition layout, you will only have one system partition plus a swap partition and /boot partition. The system partition contains /home for users, /var for logs and databases, as well as all of the normal system executable files, documentation and libraries. It is often simpler to deploy. Traditionally, \u0026ldquo;one big partition\u0026rdquo; was considered problematic from an administration standpoint, but most such issues have been resolved by modern filesystems, backup utilities, and improved hardware reliability.\nswap: The swap partition should be at least twice the size of RAM on the system.\n/boot: The /boot partition should be large enough to accommodate a few system kernels and initrd images. Your OS vendor probably knows best what size this should be.\n/: The remainder of the disk(s) should be devoted to /. This is where all system and user data will go.\nIf you plan to use disk quotas, you should be aware of a few potential gotchas with this type of deployment. Quotas apply to all files on a given partition, regardless of the directory. In the case of mail delivery and processing, there are several very sneaky ways for this to cause failures of various types. Because of this, if you are using disk quotas, you probably want to make /home its own very large partition.\nMultiple partitions This layout spreads files across a few partitions, in order to facilitate usage some types of backup utility as well as making some types of administrative task easier (for example, installing larger disks for some partitions at a later time). Historically, multiple partitions were considered wise administrative policy, but most modern systems and backup utilities eliminate the reasons for utilizing multiple partitions.\n/: This partition is used for all of the operating system files, executables, and configuration files. This partition should be at least 4GB for most operating systems. /boot: The /boot partition should be large enough to accommodate a few system kernels and initrd images. Your OS vendor probably knows best what size this should be. swap: The swap partition should be at least twice the size of RAM on the system. /var: The /var partition is where system logs, various changing data, and MySQL and PostgreSQL databases are stored. Depending on whether you will allow your domain users to use the database features, this partition may be between 2 and 10 or more GB. If users are expected to be heavy database users, you may opt to divide the remaining disk space between /var and /home. /home: The /home partition is where all of your domain users data, email, CGI scripts, logs etc. will be stored. Pretty much anything that belongs to your users, except for MySQL and PostgreSQL databases, will reside on /home. Devote the remainder of your disk to /home, as usage will likely grow rapidly if you have many users. Dependencies Install the following applications, using whatever method is appropriate for your operating system:\nApache or Nginx BIND Postfix Procmail SpamAssassin ClamAV Dovecot ProFTPd MySQL or MariaDB (optional) PostgreSQL (optional) Mailman (optional) Standard versions of these applications are usually sufficient, as long as they are reasonably modern and have all security patches applied. Additionally, if your system supports disk quotas, and you will be using them with Virtualmin, you need the management tools for disk quotas. Webmin also provides support for firewall management on most UNIX and Linux platforms, assuming the appropriate command line tools are available.\nWebmin and Usermin Use download.virtualmin.com as the production repository for manual Virtualmin installs. It provides stable builds of Webmin, Usermin, Virtualmin, plugins, and related packages. On supported Debian and EL systems, use the native repositories. For unsupported systems or installs outside the package repositories, download the appropriate archive, such as the tar.gz package, from the same repository.\nVirtualmin modules Once Webmin is operational you can download and install the Virtualmin modules in either rpm format (for RPM-based Linux distributions), deb format (for Debian-based Linux distributions), or wbm format (for any other UNIX or Linux system), and install them using the Webmin Modules module found in Webmin ⇾ Webmin Configuration page.\nFor systems using the Virtualmin repositories, optional Webmin modules are shipped as separate webmin-* packages. Install the package that matches the module you need, such as webmin-squid or webmin-postgresql, using your OS package manager. See Webmin module packages for more about the repository layout.\nVirtualmin Professional All Virtualmin Pro modules and packages are now served from a single stable repository at download.virtualmin.com. This repository includes all stable builds of Virtualmin, its plugins, and related packages, including Webmin and Usermin.\nA password is only required for commercial modules such as Virtualmin Pro, Virtualmin WP Workbench, and some others. To download these, use your serial number and license key from the My Account page, with the serial number as the username and the license key as the password.\nVirtualmin GPL Virtualmin GPL uses the same stable repository at download.virtualmin.com for all modules and packages.\nService configuration Apache or Nginx Apache or Nginx web server should be installed.\nBIND BIND should be installed in you plan to host DNS locally.\nPostfix Postfix should be installed, and configured for virtual hosting. The best way to do this for the vast majority of deployments is to use a simple map file. Edit main.cf and add the following line: virtual_alias_maps = hash:/etc/postfix/virtual. Also, make sure that home_mailbox is set to Maildir/. Save it, and restart Postfix.\nProcmail Procmail is necessary if you plan to make use of the spam and anti-virus filtering capabilities in Virtualmin. A reasonable starting procmailrc might be:\nLOGFILE=/var/log/procmail.log TRAP=/etc/webmin/virtual-server/procmail-logger.pl :0wi VIRTUALMIN=|/etc/webmin/virtual-server/lookup-domain.pl $LOGNAME EXITCODE=$? :0 * ?/bin/test \u0026#34;$EXITCODE\u0026#34; = \u0026#34;73\u0026#34; /dev/null EXITCODE=0 :0 * ?/bin/test \u0026#34;$VIRTUALMIN\u0026#34; != \u0026#34;\u0026#34; { INCLUDERC=/etc/webmin/virtual-server/procmail/$VIRTUALMIN } ORGMAIL=$HOME/Maildir/ DEFAULT=$HOME/Maildir/ DROPPRIVS=yes :0 $DEFAULT Procmail-Wrapper The procmail-wrapper program is necessary for for mail to work properly, and in particular, spam and virus processing. First, put the following code into a file named procmail-wrapper.c:\n#include \u0026lt;stdio.h\u0026gt; #include \u0026lt;stdlib.h\u0026gt; #include \u0026lt;string.h\u0026gt; #include \u0026lt;unistd.h\u0026gt; int main(int argc, char **argv) { int i; for(i=0; argv[i] != NULL; i++) { } if (i != 6) { fprintf(stderr, \u0026#34;Wrong number of args (%d)\\n\u0026#34;, i); return 1; } if (strcmp(argv[1], \u0026#34;-o\u0026#34;) != 0) { fprintf(stderr, \u0026#34;argv[1] must be -o\\n\u0026#34;); return 1; } if (strcmp(argv[2], \u0026#34;-a\u0026#34;) != 0) { fprintf(stderr, \u0026#34;argv[2] must be -a\\n\u0026#34;); return 1; } if (strcmp(argv[4], \u0026#34;-d\u0026#34;) != 0) { fprintf(stderr, \u0026#34;argv[4] must be -d\\n\u0026#34;); return 1; } setuid(geteuid()); setgid(getegid()); execv(\u0026#34;/usr/bin/procmail\u0026#34;, argv); return 0; } Then, run the following commands to compile the code, install it into /usr/bin, and give it the proper permissions:\ngcc -o /usr/bin/procmail-wrapper procmail-wrapper.c chmod 6755 /usr/bin/procmail-wrapper Lastly, edit /etc/postfix/main.cf, and set mailbox_command to the following:\nmailbox_command = /usr/bin/procmail-wrapper -o -a $DOMAIN -d $LOGNAME SpamAssassin SpamAssassin should be installed if you will be using the spam filtering features of Virtualmin.\nClamAV ClamAV should be installed if you will be using the anti-virus features of Virtualmin.\nDovecot Dovecot should be installed and configured for use with Maildir mail spools. PAM or shadow authentication should be used.\nProFTPd ProFTPd should be installed. PAM or shadow authentication should be used.\nMySQL If you plan to use MySQL, or any of the Web Apps in Virtualmin Professional that rely on MySQL, it should be installed, and accessible to localhost. The root account should have a password set. Once Webmin is installed, you will need to configure the MySQL module to know the root MySQL password.\nVirtualmin does not require MySQL, and no Virtualmin-related user data is stored in MySQL. If you\u0026rsquo;ve read setup guides on the web for virtual mail hosting that require MySQL, we strongly recommend you ignore them. This is a very common source of confusion for new users, and there\u0026rsquo;s simply no reason to introduce the complexity of this kind of deployment. PostgreSQL If you plan to use PostgreSQL or any of the Web Apps in Virtualmin Professional that rely on PostgreSQL, it should be installed, and accessible to localhost.\nSASL If users will be sending email through your server, you will need to configure saslauthd service. This requires interaction with your MTA (probably Postfix), and it should be configured to use PAM or shadow authentication. When enabled, Virtualmin can allow your users to create and manage Mailman mailing lists.\n","permalink":"https://www.virtualmin.com/docs/installation/manual/","summary":"\u003cp\u003eUnlike the \u003ca href=\"/docs/installation/automated/\"\u003eAutomated Virtualmin installation\u003c/a\u003e, to make use of this installation type, your OS does not need to be freshly installed, nor does it need to be a \u003ca href=\"/docs/os-support/\"\u003esupported operating system\u003c/a\u003e. This method, however, requires significantly more knowledge on the part of the person doing the installation, and a much larger time investment to insure that all necessary configuration is performed and all Virtualmin managed services are working correctly. If you are not extremely comfortable with your operating system, the services used in a hosting system, and performing various configuration tasks from the command line, you are advised to use the automatic installation on a Grade A supported operating system.\u003c/p\u003e","title":"Manual Installation"},{"content":"If you only want to stop using Virtualmin Pro features and keep Virtualmin on the server, use the virtualmin downgrade-license command documented in downgrade-license instead. This page is only about removing Virtualmin itself.\nUninstalling There are many levels of uninstalling Virtualmin. The most extreme is using the --uninstall flag of the install script:\nsudo sh virtualmin-install.sh --uninstall Warning: This is a rather haphazard uninstall routine, that will remove pretty much everything Virtualmin installed, including its core dependencies. This should never be done on a system that is in production. It is very destructive. It is primarily for use when you tried an installation option (for example using Nginx instead of Apache) and have decided to change after trying it out. ","permalink":"https://www.virtualmin.com/docs/installation/uninstall/","summary":"\u003cp\u003eIf you only want to stop using Virtualmin Pro features and keep Virtualmin on the server, use the \u003ccode\u003evirtualmin downgrade-license\u003c/code\u003e command documented in \u003ca href=\"/docs/development/api-programs/downgrade-license/\"\u003edowngrade-license\u003c/a\u003e instead. This page is only about removing Virtualmin itself.\u003c/p\u003e\n\u003ch3 id=\"uninstalling\"\u003eUninstalling\u003c/h3\u003e\n\u003cp\u003eThere are many levels of uninstalling Virtualmin. The most extreme is using the \u003ccode\u003e--uninstall\u003c/code\u003e flag of the install script:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo sh virtualmin-install.sh --uninstall\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\n\n\n\n      \u003cp class=\"text-note\"\u003e\n        \u003ci class=\"text-note-icon wm wm-fw wm-sm wm-exclamation danger\"\u003e\u003c/i\u003e \u003cspan class=\"text-note-title danger\"\u003eWarning:\u003c/span\u003e\n        \u003cspan class=\"text-note-body\"\u003eThis is a rather haphazard uninstall routine, that will remove pretty much everything Virtualmin installed, including its core dependencies. This should never be done on a system that is in production. It is very destructive. It is primarily for use when you tried an installation option (for example using Nginx instead of Apache) and have decided to change after trying it out.\u003c/span\u003e\n      \u003c/p\u003e","title":"Uninstalling Virtualmin"},{"content":"Having your Virtualmin repositories configured correctly is essential to receive the latest updates and security fixes. If you are not getting updates for Virtualmin, Webmin, or Usermin, your repositories are likely outdated or misconfigured.\nReconfiguring Virtualmin repositories To reset and correct the Virtualmin repositories, run one of the commands below in a terminal over SSH. Both methods work on all Grade A and some Grade B supported operating systems, and are compatible with both Virtualmin GPL and Pro.\nIf Virtualmin is already installed, use the CLI command:\nsudo virtualmin setup-repos The CLI command uses the currently configured branch, or stable if none is set. You can change branches with --branch stable, --branch prerelease, or --branch unstable, but prerelease and unstable should only be used for testing, not for normal production systems.\nIf Virtualmin is not installed yet, or the virtualmin command is not available, use the repository setup script:\ncurl -fsSL https://download.virtualmin.com/repository | sudo sh -s -- -s -B stable This configures download.virtualmin.com, the production repository for Virtualmin and related packages.\nWebmin module packages Starting with Virtualmin 8, Webmin packages from the Virtualmin repositories are modular. A new Virtualmin system gets the Webmin core modules by default, and additional Webmin modules can be installed only when you need them.\nFor new manual and automated installs, treat download.virtualmin.com as the production repository. The development repository at download.webmin.dev uses the same modular Webmin layout, but is for testing new builds before they reach production. If an older Virtualmin system is still using the software.virtualmin.com repository, running the repository setup command above, or virtualmin setup-repos, automatically switches it to download.virtualmin.com. During that switch, Virtualmin keeps the Webmin modules the system was already using by installing the matching modular webmin-* packages for modules from the previous full Webmin install.\nOlder Webmin packages usually installed every standard Webmin module in one large package. That meant a Virtualmin server could have modules for services it would never run, such as Samba, Squid, LDAP, clustering tools, NFS, iSCSI, or other system-specific services.\nNew installs from the Virtualmin repositories install the Webmin core set instead. This includes the modules most Virtualmin systems need for normal hosting and server administration, such as users, groups, packages, cron, logs, filesystems, firewalls, SSH, Apache, Nginx, BIND, Postfix, Dovecot, ProFTPd, MySQL/MariaDB, quotas, Usermin, and the Webmin configuration modules.\nModules outside that core set are still available. They are just separate packages now, so they do not have to be present on every server. The module name is the Webmin module directory name, such as postgresql, samba, squid, ldap-server, or webalizer. The package name is normally webmin- plus the module name, for example webmin-postgresql.\nKeeping optional modules separate means new installs are cleaner, with few, if any, unused modules in the Webmin menu. Servers install fewer files and fewer service-specific dependencies, updates can be smaller and more focused, and administrators can add only the modules that match the services they actually run.\nIf you intentionally want the older full Webmin package with all standard modules bundled together, the standard Webmin repository at download.webmin.com and the legacy Virtualmin repository at software.virtualmin.com still provide full Webmin builds. The production repository at download.virtualmin.com provides the modular core Webmin package instead. ","permalink":"https://www.virtualmin.com/docs/installation/troubleshooting-repositories/","summary":"\u003cp\u003eHaving your Virtualmin repositories configured correctly is essential to receive the latest updates and security fixes. If you are not getting updates for Virtualmin, Webmin, or Usermin, your repositories are likely outdated or misconfigured.\u003c/p\u003e\n\u003ch3 id=\"reconfiguring-virtualmin-repositories\"\u003eReconfiguring Virtualmin repositories\u003c/h3\u003e\n\u003cp\u003eTo reset and correct the Virtualmin repositories, run one of the commands below in a terminal over SSH. Both methods work on all Grade A and some Grade B supported \u003ca href=\"/docs/os-support/\"\u003eoperating systems\u003c/a\u003e, and are compatible with both Virtualmin GPL and Pro.\u003c/p\u003e","title":"Troubleshooting Repositories"},{"content":"Most installation problems are related to having third party repositories enabled, attempting to run the install script on an unsupported operating system, and sometimes network connectivity.\nInstallation \u0026ldquo;freezes\u0026rdquo; and never completes Check the /root/virtualmin-install.log. It is possible that your package manager is configured to use a local CD ROM device for packages, and the disk is unavailable. Another possibility is that connections to one or more repositories are timing out, and causing the system to install packages very slowly.\nThird party repositories and package conflicts If your package manager is configured to use non-OS package repositories, or if you have installed alternative versions of packages before installation, conflicts are likely to occur during installation. If you plan to use non-OS standard packages (other than those provided by Virtualmin repositories), they should be installed after installation of Virtualmin, and you should add an exclude directive to the dnf or apt-get configuration in order to insure similar conflicts do not happen in the future. Also note that if you are using non-OS standard packages, you may need to configure the relevant Webmin module to make it aware of the location of the configuration files. Note that if your Linux distribution was installed by your ISP (such as with a VPS image), you may want to verify that no additional repositories were setup.\nPackage manager errors Sometimes package manager metadata can end up in a broken state. Try cleaning the metadata to see if it resolves the problem.\nOn EL systems (Alma/Rocky/CentOS):\ndnf clean all On Debian and derivatives (Ubuntu):\napt-get clean ; apt-get update Then try the installation again.\n/tmp directory is mounted noexec If you have run any so-called \u0026ldquo;hardening scripts\u0026rdquo; on your system before running virtualmin-install.sh, your /tmp directory may be mounted noexec. It is always best to run the install script on a freshly installed supported operating system, though this particular issue can be resolved. The install script cannot complete if this is the case, and /tmp will need to be remounted to allow executables. To do that:\nmount -o remount,exec /tmp If you wish to switch back to your original settings after installation, you can use this command to reset the noexec option:\nmount -o remount,noexec /tmp ClamAV outdated errors ClamAV is updated frequently by the upstream developers. Your OS repository may not have the latest version, which causes ClamAV to issue very scary warnings. These warnings are non-fatal, and can generally be safely ignored.\nClamAV lookup error We don\u0026rsquo;t know why this happens. ClamAV has become very fragile in recent years. Usually, you can work around it though.\nBefore starting a scan, it\u0026rsquo;s important to update the virus database by running:\nfreshclam Afterwards, try manually starting clamd service from the command line.\nOn EL systems:\nsystemctl start clamd@scan On Debian and derivatives:\nsystemctl start clamav-daemon Then trying again in the post-install wizard.\nGetting Help Virtualmin Professional customers receive free installation service if the automated installation process fails to work correctly on any Grade A supported operating system listed on the OS Support page. Open a ticket in the issue tracker with a description of your problem and the relevant portion of the virtualmin-install.log, and we will try to walk you through to a solution, or log into your system and complete the installation free of charge. Virtualmin GPL users can make use of the forums to ask for assistance with any problems that arise during installation.\n","permalink":"https://www.virtualmin.com/docs/installation/troubleshooting/","summary":"\u003cp\u003eMost installation problems are related to having third party repositories enabled, attempting to run the install script on an unsupported operating system, and sometimes network connectivity.\u003c/p\u003e\n\u003ch3 id=\"installation-freezes-and-never-completes\"\u003eInstallation \u0026ldquo;freezes\u0026rdquo; and never completes\u003c/h3\u003e\n\u003cp\u003eCheck the \u003ccode\u003e/root/virtualmin-install.log\u003c/code\u003e. It is possible that your package manager is configured to use a local CD ROM device for packages, and the disk is unavailable. Another possibility is that connections to one or more repositories are timing out, and causing the system to install packages very slowly.\u003c/p\u003e","title":"Troubleshooting Installation"},{"content":"This guide provides step-by-step instructions on how to log into the Virtualmin control panel. Virtualmin is a powerful web hosting and website management tool that allows you to manage multiple virtual hosts from a single interface.\nLogging into Virtualmin is a simple process that allows you to access a wide range of server and website management tools. Once logged in, you can begin managing your virtual hosts, setting up websites, creating email accounts, and more.\nPrerequisites Ensure you have Virtualmin installed on your server. Make sure you have the login credentials (username and password) provided by your server administrator or hosting provider. Confirm that you have the server\u0026rsquo;s IP address or domain name where Virtualmin is hosted. Steps to log in Open your web browser\nLaunch your preferred web browser (such as Chrome, Firefox, Safari, or Edge). Enter the Virtualmin URL\nIn the address bar, type the URL to access Virtualmin. This will usually be your server\u0026rsquo;s IP address or domain name followed by the port number 10000. For example: https://your-server-ip:10000 or https://yourdomain.com:10000. Please note that Virtualmin uses HTTPS for a secure connection, so ensure you include https:// at the beginning of the URL. Security warning (if applicable)\nOn your first visit, your browser might display a security warning due to Virtualmin\u0026rsquo;s use of a self-signed SSL certificate. This is normal. Proceed by accepting the warning or adding an exception to access the site (the process varies depending on the browser). Login screen\nOnce the Virtualmin login page loads, you will see fields to enter your username and password: Enter credentials\nType in your Virtualmin username and password. These credentials may differ from your server\u0026rsquo;s root or admin password. Access Virtualmin\nAfter entering your credentials, click the Sign in button or press Enter. You should now be logged into the Virtualmin dashboard, where you can manage your hosting environment. Troubleshooting Incorrect credentials: If you can\u0026rsquo;t log in, check to ensure you\u0026rsquo;re using the correct username and password. Can\u0026rsquo;t access Virtualmin URL: Ensure the server is running and the correct IP address or domain is used. Check if the port 10000 is open and not blocked by any firewall. Browser issues: If the page doesn\u0026rsquo;t load correctly, try clearing your browser cache or use a different browser. ","permalink":"https://www.virtualmin.com/docs/getting-started/how-to-log-in-to-virtualmin/","summary":"\u003cp\u003eThis guide provides step-by-step instructions on how to log into the Virtualmin control panel. Virtualmin is a powerful web hosting and website management tool that allows you to manage multiple virtual hosts from a single interface.\u003c/p\u003e\n\u003cp\u003eLogging into Virtualmin is a simple process that allows you to access a wide range of server and website management tools. Once logged in, you can begin managing your virtual hosts, setting up websites, creating email accounts, and more.\u003c/p\u003e","title":"How to Log In to Virtualmin"},{"content":"This tutorial covers the basics of navigating Virtualmin, designed for a range of user roles from administrators to domain owners and resellers. Upon logging in, you\u0026rsquo;ll find a user-friendly, dual-pane interface that facilitates easy navigation.\nThe key is to understand the layout and switch between Webmin and Virtualmin tabs to access different functionalities. Virtualmin adeptly caters to diverse management needs, offering comprehensive system control for administrators and focused website management tools for domain owners and resellers.\nInterface overview Virtualmin is structured into two main panes:\nLeft menu pane: This contains the primary navigation options. Most common operations and features are accessible from here. Right content pane: Displays details and settings based on the selected menu option. User roles and access levels Root and sudo-capable users: If logged in as root or a sudo-capable user with ALL privileges, you\u0026rsquo;ll have access to every Virtualmin function, all domain accounts, as well as the full suite of Webmin features. Domain owner accounts: Users in this role manage all their top-level and sub-servers (domains) under a single Unix system user. This focused approach ensures that domain management is centralized and secure, with all associated servers tied to one Unix user account. Their access can be adjusted by the root user, adding or reducing privileges based on needs and trust. Reseller accounts: Reseller is the feature only available in Virtualmin Professional. Resellers accounts sit between root and domain owner accounts in terms of privileges. Reseller accounts have the ability to create new domain owner accounts, each with their own distinct Unix user. This added privilege allows resellers to manage multiple domain owners, each operating under separate Unix system users, providing a layer of customization and control for various domains. Navigating between Webmin and Virtualmin Switching tabs: At the top of the left-hand menu, you will find tabs to switch between Webmin and Virtualmin. Webmin tab: Offers general systems management features such as user/group management, process monitoring, package management, network and firewall settings. Virtualmin tab: Focuses on domain account management, including creating domain accounts, managing databases, and installing applications. Managing virtual servers Under the Virtualmin tab, you\u0026rsquo;ll find a list of domains at the top of the navigation menu. Select a domain from this list to manage its specific settings. This section allows access to features such as domain editing, website configuration, and database management, tailored for each selected virtual server. System configuration In addition to the Webmin tab, which offers a range of system settings and monitoring tools, the Virtualmin tab also includes important system-wide configuration options. These options are located below the search bar in the Virtualmin navigation menu, where the search bar serves as a logical separator. The top section of the menu focuses on virtual server-specific settings, while the bottom section (below the search bar) contains broader system-wide settings. Notable features under the Virtualmin tab, in the system-wide settings section, include Account Plans, Server Templates, Addresses and Networking configuration, and Email Settings. This area also includes essential tools for server Limits and Validation, as well as Migration tools, which facilitate migration from platforms such as Plesk, cPanel, and DirectAdmin. Additionally, comprehensive Backup and Restore features are available, providing a full suite of options for managing and safeguarding your data. This layout in Virtualmin provides a comprehensive and integrated approach to managing both server-specific settings for each virtual server and broader, system-wide configurations.\n","permalink":"https://www.virtualmin.com/docs/getting-started/how-to-navigate-in-virtualmin/","summary":"\u003cp\u003eThis tutorial covers the basics of navigating Virtualmin, designed for a range of user roles from administrators to domain owners and resellers. Upon logging in, you\u0026rsquo;ll find a user-friendly, dual-pane interface that facilitates easy navigation.\u003c/p\u003e\n\u003cp\u003eThe key is to understand the layout and switch between Webmin and Virtualmin tabs to access different functionalities. Virtualmin adeptly caters to diverse management needs, offering comprehensive system control for administrators and focused website management tools for domain owners and resellers.\u003c/p\u003e","title":"How to Navigate in Virtualmin"},{"content":"This quick guide details the process of creating new virtual servers.\nBefore proceeding, it is strongly recommended to gain an understanding of the various virtual server types in Virtualmin — including Top-level servers, Sub-servers, and Aliases — as this knowledge is crucial for effective domain management. How to create a top-level virtual server Log into Virtualmin. Select Create Virtual Server from the main menu. Enter the domain name and other relevant details: Click Create Server. How to create a sub-server Log into Virtualmin. Choose the parent domain from the drop-down box. Click Create Virtual Server, then select Sub-server. Enter the domain name and description for the Sub-server: How to create virtual server alias Log into Virtualmin.\nSelect the domain you wish to create an alias for.\nClick Create Virtual Server, then select Alias of example.com.\nEnter the domain name and description for the alias: Click Create Server.\n","permalink":"https://www.virtualmin.com/docs/getting-started/how-to-create-virtual-servers/","summary":"\u003cp\u003eThis quick guide details the process of creating new virtual servers.\u003c/p\u003e\n\n\n\n\n\n      \u003cdiv class=\"alert alert-primary\"\u003e\n        \u003ci class=\"wm wm-fw wm-sm wm-exclamation\"\u003e\u003c/i\u003e \u003cstrong\u003e\u003c/strong\u003e\u003cbr\u003e\n        Before proceeding, it is strongly recommended to gain an understanding of the various virtual server types in Virtualmin — including \u003ca href=\"/docs/getting-started/understanding-virtual-server-and-account-types/#understanding-top-level-virtual-servers\"\u003e\u003cstrong\u003eTop-level servers\u003c/strong\u003e\u003c/a\u003e, \u003ca href=\"/docs/getting-started/understanding-virtual-server-and-account-types/#understanding-sub-servers\"\u003e\u003cstrong\u003eSub-servers\u003c/strong\u003e\u003c/a\u003e, and \u003ca href=\"/docs/getting-started/understanding-virtual-server-and-account-types/#understanding-virtual-server-aliases\"\u003e\u003cstrong\u003eAliases\u003c/strong\u003e\u003c/a\u003e — as this knowledge is crucial for effective domain management.\n      \u003c/div\u003e\n\n\n\u003ch4 id=\"how-to-create-a-top-level-virtual-server\"\u003eHow to create a top-level virtual server\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003eLog into Virtualmin.\u003c/li\u003e\n\u003cli\u003eSelect \u003cstrong\u003eCreate Virtual Server\u003c/strong\u003e from the main menu.\u003c/li\u003e\n\u003cli\u003eEnter the domain name and other relevant details:\n\u003ca href=\"/images/docs/screenshots/light/create-top-level-virtual-server.png\"\u003e\n\n\n\n\u003cimg loading=\"lazy\" src=\"/images/docs/screenshots/light/create-top-level-virtual-server.png\" alt=\"\"  title=\"Create Top-Level Virtual Server Screenshot\"  style=\"aspect-ratio: 2134 / 1516;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eCreate Server\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"how-to-create-a-sub-server\"\u003eHow to create a sub-server\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003eLog into Virtualmin.\u003c/li\u003e\n\u003cli\u003eChoose the parent domain from the drop-down box.\u003c/li\u003e\n\u003cli\u003eClick \u003cstrong\u003eCreate Virtual Server\u003c/strong\u003e, then select \u003cstrong\u003eSub-server\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003eEnter the domain name and description for the Sub-server:\n\u003ca href=\"/images/docs/screenshots/light/create-sub-server.png\"\u003e\n\n\n\n\u003cimg loading=\"lazy\" src=\"/images/docs/screenshots/light/create-sub-server.png\" alt=\"\"  title=\"Create Sub-Server Screenshot\"  style=\"aspect-ratio: 1966 / 1174;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"how-to-create-virtual-server-alias\"\u003eHow to create virtual server alias\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eLog into Virtualmin.\u003c/p\u003e","title":"How to Create Virtual Servers"},{"content":"Understanding the different virtual server and account types in Virtualmin is essential for effective web hosting and domain management. Virtualmin provides a flexible platform, allowing various configurations to suit different hosting needs.\nIntroduction to virtual server types In Virtualmin, there are several ways to manage and host domains, each serving different purposes. Understanding these types — Top-level servers, Sub-servers, and Aliases — is crucial for effective domain management.\nUnderstanding top-level virtual servers A top-level virtual server often referred to as just a virtual server, is the foundational account in Virtualmin. It includes a website, email, and FTP access, all associated with its own unique domain name. Crucially, each top-level virtual server operates under a dedicated Unix user, distinguishing it from sub-servers and aliases. The virtual server owner, who administers this server, can create additional email addresses, FTP accounts, and websites, subject to the limits set by the master administrator or reseller.\nUnderstanding sub-servers A sub-server is a secondary domain hosted within the same virtual server owner. It can have its own domain name, email addresses, and FTP accounts but operates under the Unix name and group of its parent virtual server. New users are created for a sub-server, assigned separate Unix user but still operate under the Unix group of the parent virtual server. Sub-servers are often used for hosting subdomains or additional domains under the same administration.\nUnderstanding virtual server aliases An alias allows a domain to act exactly like another, sharing the same website and email addresses. This is useful for having multiple domains like example.com and example.net display the same website content.\nOverview of account types in Virtualmin Master administrator The root user with rights to manage all aspects of the server.\nReseller This user is created by the master administrator. They have rights to create virtual servers accounts for other users. Reseller accounts are a feature only available in Virtualmin Professional.\nVirtual server owner A virtual server owner is the administrative user of a virtual server and any of its sub-servers and aliases. This user is created by either the master administrator or reseller.\nMail/FTP users These users belong to a particular virtual server, and are setup to have email access, FTP access, or both. These users are generally created by the virtual server owner, though they can also be created by resellers and the Master Administrator.\n","permalink":"https://www.virtualmin.com/docs/getting-started/understanding-virtual-server-and-account-types/","summary":"\u003cp\u003eUnderstanding the different virtual server and account types in Virtualmin is essential for effective web hosting and domain management. Virtualmin provides a flexible platform, allowing various configurations to suit different hosting needs.\u003c/p\u003e\n\u003ch3 id=\"introduction-to-virtual-server-types\"\u003eIntroduction to virtual server types\u003c/h3\u003e\n\u003cp\u003eIn Virtualmin, there are several ways to manage and host domains, each serving different purposes. Understanding these types — \u003ca href=\"#understanding-top-level-virtual-servers\"\u003e\u003cstrong\u003eTop-level servers\u003c/strong\u003e\u003c/a\u003e, \u003ca href=\"#understanding-sub-servers\"\u003e\u003cstrong\u003eSub-servers\u003c/strong\u003e\u003c/a\u003e, and \u003ca href=\"#understanding-virtual-server-aliases\"\u003e\u003cstrong\u003eAliases\u003c/strong\u003e\u003c/a\u003e — is crucial for effective domain management.\u003c/p\u003e\n\u003ch3 id=\"understanding-top-level-virtual-servers\"\u003eUnderstanding top-level virtual servers\u003c/h3\u003e\n\u003cp\u003eA \u003cstrong\u003etop-level virtual server\u003c/strong\u003e often referred to as just a virtual server, is the foundational account in Virtualmin. It includes a website, email, and FTP access, all associated with its own unique domain name. Crucially, each top-level virtual server operates under a dedicated Unix user, distinguishing it from sub-servers and aliases. The virtual server owner, who administers this server, can create additional email addresses, FTP accounts, and websites, subject to the limits set by the master administrator or reseller.\u003c/p\u003e","title":"Understanding Virtual Server and Account Types"},{"content":"This tutorial provides a concise guide on changing the password of a virtual server owner in Virtualmin.\nHow to change the owner\u0026rsquo;s password A virtual server owner\u0026rsquo;s password is crucial for virtual server administration and security. Follow these steps to update it:\nSelect domain\nUse the dropdown box on the top-left corner to select the domain whose virtual server owner\u0026rsquo;s password you want to change.\nEdit Virtual Server\nNavigate to Edit Virtual Server to access the server settings.\nConfigurable Settings\nGo to Configurable Settings to find password options: Password reset\nLocate the Administration password and select the Set to radio button to enable editing a new password.\nEnter new password\nInput the new password in the text area adjacent to Set to.\nSave changes\nClick Save Virtual Server to apply the new password.\nMake sure the new password is strong and secure to protect the server from unauthorized access.\n","permalink":"https://www.virtualmin.com/docs/getting-started/how-to-change-virtual-server-owner-password/","summary":"\u003cp\u003eThis tutorial provides a concise guide on changing the password of a virtual server owner in Virtualmin.\u003c/p\u003e\n\u003ch3 id=\"how-to-change-the-owners-password\"\u003eHow to change the owner\u0026rsquo;s password\u003c/h3\u003e\n\u003cp\u003eA virtual server owner\u0026rsquo;s password is crucial for virtual server administration and security. Follow these steps to update it:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSelect domain\u003c/strong\u003e\u003cbr\u003e\nUse the dropdown box on the top-left corner to select the domain whose virtual server owner\u0026rsquo;s password you want to change.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eEdit Virtual Server\u003c/strong\u003e\u003cbr\u003e\nNavigate to \u003cstrong\u003eEdit Virtual Server\u003c/strong\u003e to access the server settings.\u003c/p\u003e","title":"How to Change Virtual Server Owner’s Password"},{"content":"This tutorial provides a straightforward method for changing the password of a SSH, FTP, mailbox, database or webserver user for the given virtual server in Virtualmin.\nHow to change a user\u0026rsquo;s password Changing a user\u0026rsquo;s password is a necessary task for maintaining security and user access management in Virtualmin. Here\u0026rsquo;s how to accomplish this:\nSelect domain\nLocate the dropdown box on the top-left corner and select the domain associated with the user whose password needs to be updated.\nEdit user\nClick on Edit Users to view the list of users.\nChoose user\nIdentify and click on the user whose password requires changing.\nPassword reset\nNext to the Password field, select the Set to radio button to enable password editing: Enter new password\nIn the textbox adjacent to Set to, type in the new password.\nSave changes\nConfirm the update by clicking Save.\nEnsure you use a strong, secure password to maintain the integrity of user accounts.\n","permalink":"https://www.virtualmin.com/docs/getting-started/how-to-change-virtual-server-users-password/","summary":"\u003cp\u003eThis tutorial provides a straightforward method for changing the password of a SSH, FTP, mailbox, database or webserver user for the given virtual server in Virtualmin.\u003c/p\u003e\n\u003ch3 id=\"how-to-change-a-users-password\"\u003eHow to change a user\u0026rsquo;s password\u003c/h3\u003e\n\u003cp\u003eChanging a user\u0026rsquo;s password is a necessary task for maintaining security and user access management in Virtualmin. Here\u0026rsquo;s how to accomplish this:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSelect domain\u003c/strong\u003e\u003cbr\u003e\nLocate the dropdown box on the top-left corner and select the domain associated with the user whose password needs to be updated.\u003c/p\u003e","title":"How to Change User Password"},{"content":"This tutorial guides you through the process of using Virtualmin\u0026rsquo;s web app installer to add applications to your domain.\nGetting started with Manage Web Apps After logging into Virtualmin, follow these steps to install a web app:\nSelect your domain\nChoose the domain where you want to install the web app by selecting it from the dropdown menu in the top-left corner.\nAccess Manage Web Apps\nLook for the Manage Web Apps option in the menu. This brings up a list of available web apps organized by categories such as blogs, content management systems, and forums.\nChoose a web app to install\nFind the web app you want to install; for example, to add WordPress, locate and select it by clicking the corresponding radio button.\nInstallation options\nScroll to the bottom and click Show Install Options. This section allows you to configure installation details. Usually, the default options are suitable for most installations.\nInitiate the installation\nClick Install Now to begin the installation process. Virtualmin will handle the rest, setting up the web app on your domain.\nPost-installation\nOnce the web app is installed, Virtualmin will provide you with a URL. Visit this URL to manage your new web app installation, where you can start customizing your site.\nTips for web app management The Installed Web Apps tab shows web apps already set up in your domain, allowing for easy management and updates. The Available Web Apps tab lists all applications available for installation, complete with descriptions and categories for convenience. Some web apps offer Unsupported Version installations, which you can find under the respective tab. These are typically older versions not tested with the current version of Virtualmin and might pose compatibility or security risks. Remember to check the web app\u0026rsquo;s requirements and ensure your server environment matches them for optimal performance and security.\n","permalink":"https://www.virtualmin.com/docs/getting-started/how-to-install-web-apps/","summary":"\u003cp\u003eThis tutorial guides you through the process of using Virtualmin\u0026rsquo;s web app installer to add applications to your domain.\u003c/p\u003e\n\u003ch3 id=\"getting-started-with-manage-web-apps\"\u003eGetting started with Manage Web Apps\u003c/h3\u003e\n\u003cp\u003eAfter logging into Virtualmin, follow these steps to install a web app:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSelect your domain\u003c/strong\u003e\u003cbr\u003e\nChoose the domain where you want to install the web app by selecting it from the dropdown menu in the top-left corner.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eAccess Manage Web Apps\u003c/strong\u003e\u003cbr\u003e\nLook for the \u003cstrong\u003eManage Web Apps\u003c/strong\u003e option in the menu. This brings up a list of available web apps organized by categories such as blogs, content management systems, and forums.\u003c/p\u003e","title":"How to Install a Web App"},{"content":"This tutorial provides guidance on utilizing the System Statistics feature in Virtualmin Pro, which offers graphical insights into your server\u0026rsquo;s performance and operations.\nAccessing System Statistics To access the System Statistics, you should already be logged into Virtualmin. Look for System Statistics in the bottom-left of the navigation menu and click on it to open the statistics dashboard.\nUnderstanding the System Statistics Dashboard The System Statistics page presents a variety of information in graphical form:\nHistoric Values Graph\nDisplays a time-series graph showing statistics for a specific metric, such as CPU load (1 min). You can adjust the time range to view data from the last hour up to the past year. Hovering over the graph provides a tooltip with exact values at specific times. For raw data analysis, there is an option to download the data set. Selecting Statistics to Display\nBelow the graph, you\u0026rsquo;ll find checkboxes for different metrics that you can display on the graph. These metrics include CPU load over various intervals, CPU utilization details, email statistics, and system resource usage. Check the boxes next to the metrics you are interested in to customize the graph to show only relevant data. Configurable Display Options\nYou can choose which metrics to view, such as CPU utilization, email messages, system statistics, and counts specific to Virtualmin like the number of virtual servers or mail and FTP users. There\u0026rsquo;s an option to scale the vertical axis of the graph linearly or logarithmically, depending on the nature of the data you\u0026rsquo;re reviewing. Using System Statistics To monitor server performance, you might regularly check CPU loads, memory usage, and disk I/O statistics. For email server monitoring, you can track the number of emails delivered, received, bounced, or marked as spam per minute. System resource checks might include tracking buffer cache usage, memory limits, running processes, and swap space utilization. By customizing which statistics to display and analyzing the provided graphs, you can gain a better understanding of your server\u0026rsquo;s performance trends and potential bottlenecks. This data can be crucial for proactive system management and troubleshooting.\n","permalink":"https://www.virtualmin.com/docs/getting-started/how-to-use-system-statistics/","summary":"\u003cp\u003eThis tutorial provides guidance on utilizing the System Statistics feature in Virtualmin Pro, which offers graphical insights into your server\u0026rsquo;s performance and operations.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/images/docs/screenshots/professional-features/light/system-statistics.png\"\u003e\n\n\n\n\u003cimg loading=\"lazy\" src=\"/images/docs/screenshots/professional-features/light/system-statistics.png\" alt=\"\"  title=\"System Statistics Screenshot\"  style=\"aspect-ratio: 2268 / 1002;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"accessing-system-statistics\"\u003eAccessing System Statistics\u003c/h3\u003e\n\u003cp\u003eTo access the System Statistics, you should already be logged into Virtualmin. Look for \u003cstrong\u003eSystem Statistics\u003c/strong\u003e in the bottom-left of the navigation menu and click on it to open the statistics dashboard.\u003c/p\u003e\n\u003ch3 id=\"understanding-the-system-statistics-dashboard\"\u003eUnderstanding the System Statistics Dashboard\u003c/h3\u003e\n\u003cp\u003eThe System Statistics page presents a variety of information in graphical form:\u003c/p\u003e","title":"How to Use System Statistics"},{"content":"This tutorial provides a straightforward method for setting up a cron job in Virtualmin. Cron is used to schedule commands to run at specific intervals.\nHow to create a cron job Scheduling cron jobs is a fundamental aspect of system administration for automating repetitive tasks. Here\u0026rsquo;s how to set up a cron job in Virtualmin:\nClick Webmin\nSelect Webmin in the top-left corner.\nClick System\nNavigate to System to access system-related modules.\nClick Scheduled Cron Jobs\nChoose Scheduled Cron Jobs to manage cron tasks.\nClick Create a new scheduled cron job\nStart the process by selecting Create a new scheduled cron job:\nChoose user to run as\nSpecify the user who will execute the cron job in Execute cron job as. For administrative tasks, input root.\nEnter the command\nIn the Command field, type the command you want to schedule. For example, ps auxw to list all running processes.\nSet frequency\nDecide how often the command should run. The default setting is Hourly, which runs the command at the top of each hour.\nCreate the Cron job\nTo finalize and activate the cron job, click Create.\nThe output from the cron job will be sent to the root user\u0026rsquo;s email by default.\n","permalink":"https://www.virtualmin.com/docs/getting-started/how-to-setup-cron-jobs/","summary":"\u003cp\u003eThis tutorial provides a straightforward method for setting up a cron job in Virtualmin. Cron is used to schedule commands to run at specific intervals.\u003c/p\u003e\n\u003ch3 id=\"how-to-create-a-cron-job\"\u003eHow to create a cron job\u003c/h3\u003e\n\u003cp\u003eScheduling cron jobs is a fundamental aspect of system administration for automating repetitive tasks. Here\u0026rsquo;s how to set up a cron job in Virtualmin:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eClick Webmin\u003c/strong\u003e\u003cbr\u003e\nSelect \u003cstrong\u003eWebmin\u003c/strong\u003e in the top-left corner.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eClick System\u003c/strong\u003e\u003cbr\u003e\nNavigate to \u003cstrong\u003eSystem\u003c/strong\u003e to access system-related modules.\u003c/p\u003e","title":"How to Setup Cron Jobs"},{"content":"This tutorial guides you through the use of the web-based HTML file manager within Virtualmin, which is a versatile tool for file management on your server.\nAccessing and navigating the file manager The file manager in Virtualmin is a powerful interface for administrators and users to access and modify files.\nClick Virtualmin\nSelect the Virtualmin section located on the top-left of the dashboard.\nOpen File Manager\nFind and click the File Manager link to view the files within the document root directory of the virtual server:\nFile manager features The file manager interface allows you to perform a variety of file operations. Here\u0026rsquo;s how you can use the features depicted in the screenshot provided above:\nDirectory tree: On the left panel, you\u0026rsquo;ll see a directory tree that lists all the directories you have access to. You can navigate through these directories by clicking on them.\nFile and directory listing: The main pane shows the contents of the selected directory, including files and subdirectories.\nSelecting items: You can select files or directories for further actions by checking the box next to their names.\nFile management options: With the selected file(s), you can perform tasks such as:\nCreate new symbolic link: Establish a symbolic link to another file or directory within the server. Create new file: Initiate a blank file or script from scratch. Create new directory: Organize your files better by adding new directories. Create new archive: Compress files and directories into an archive for efficient storage and transfer. Transfer: Seamlessly upload and download files to the server. Copy/cut/paste: Duplicate or move files within the server. Delete: Remove files or directories. Rename: Change the name of a file or directory. Download: Save files to your local computer. Encrypt: Secure your files by encryption. Properties: View and modify file attributes, such as permissions or ownership. File information: The bottom section of the file manager displays the details of the selected file, such as name, size, owner, permissions, and last modification date.\nActions menu: The top toolbar contains actions like Select all, Invert selection, Refresh, and other quick options to manage files efficiently.\nFile manager keyboard shortcuts In the file manager, alongside standard point-and-click operations, you can use the following keyboard shortcuts for quick actions.\nQuick search: Start typing to search for files immediately. Cursor navigation: Use the up/down arrows, pgup/pgdn, home, and end to move the cursor. Directory navigation: Press enter to open a directory and backspace to go back to the previous directory. Context menu: Right-click or use ⌥Alt + right-click to open the context menu for more options. Select/Deselect files: Use ⌘Ctrl + A to select all, ⌘Ctrl + ⇧Shift + A to deselect all, or * to invert selection. File operations: Press F2 to change permissions, F3 to view, F4 to edit, F6 to rename, F7 to create a new directory, and F8 to delete. File properties: Press ⌘Ctrl + I or ⌥Alt + Enter to show file properties. Manual path entry: Use ⌘Ctrl + L to enter a path manually. Creating new items: Use ⇧Shift + F4 to create a new file and ⇧Shift + F7 for search functionality. Compress/decompress: Use ⌥Alt + F5 to compress and ⌥Alt + F6 to decompress files. Data management: Use ⌘Ctrl + S to calculate selected size and F9/F10 for downloading/uploading to the current directory. Tab management: Open a new tab with ⌘Ctrl + spacebar, close it with ⌘Ctrl + ⇧Shift + spacebar, switch tabs with ⌘Ctrl + ⏴ or ⌘Ctrl + ⏵, and jump to a tab using ⌘Ctrl + 1..9. Clipboard operations: Use ⌘Ctrl + ⌥Alt + C to copy the file path, and ⌘Ctrl + C, ⌘Ctrl + X, and ⌘Ctrl + V for copy, cut, and paste operations. Refresh: Refresh the current directory with F5 or ⌘Ctrl + R. By familiarizing yourself with these features, you can effectively manage your server\u0026rsquo;s files directly from your web browser.\n","permalink":"https://www.virtualmin.com/docs/getting-started/how-to-use-file-manager/","summary":"\u003cp\u003eThis tutorial guides you through the use of the web-based HTML file manager within Virtualmin, which is a versatile tool for file management on your server.\u003c/p\u003e\n\u003ch3 id=\"accessing-and-navigating-the-file-manager\"\u003eAccessing and navigating the file manager\u003c/h3\u003e\n\u003cp\u003eThe file manager in Virtualmin is a powerful interface for administrators and users to access and modify files.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eClick Virtualmin\u003c/strong\u003e\u003cbr\u003e\nSelect the \u003cstrong\u003eVirtualmin\u003c/strong\u003e section located on the top-left of the dashboard.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eOpen File Manager\u003c/strong\u003e\u003cbr\u003e\nFind and click the \u003cstrong\u003eFile Manager\u003c/strong\u003e link to view the files within the document root directory of the virtual server:\u003c/p\u003e","title":"How to Use File Manager"},{"content":"This tutorial walks you through using the Upload and Download module, which is a convenient tool for transferring files to and from your server.\nGetting started Before proceeding, make sure you\u0026rsquo;ve logged into Virtualmin. Click on Webmin in the top-left corner of the dashboard, navigate to Tools, and select Upload and Download.\nDownloading files to your server The Upload and Download module provides a straightforward way to download files from the internet directly to your server:\nURLs to download\nIn the Download from web tab, you\u0026rsquo;ll find a text area labeled URLs to download. Enter the full URL of the file you wish to download here, such as https://example.com/downloads/myfile.tar.gz.\nDestination directory\nSpecify the target directory in the Download to file or directory field. For instance, to save to the root user\u0026rsquo;s home directory, input /root.\nDownload options\nChoose your download preferences, such as creating a directory if it doesn\u0026rsquo;t exist, setting file ownership, and deciding whether to download immediately or schedule for later.\nInitiate download\nClick on Download URLs to start the download process. If you\u0026rsquo;ve scheduled it for later, the module will handle this automatically at the specified time.\nUploading files from your computer to your server Uploading files is just as easy with the module\u0026rsquo;s user-friendly interface:\nUpload to server tab\nSwitch to the Upload to server tab. Here you can drag and drop files or click to select files through the file browser.\nSelect files\nUse the provided file selection area to choose the file(s) from your computer that you want to upload.\nDestination directory\nIn the File or directory to upload to field, enter the path where you want the files to be saved on the server, like /root.\nUpload preferences\nDetermine whether to create the directory if it doesn\u0026rsquo;t exist, set ownership, and whether to extract archives upon upload.\nStart upload\nPress the Upload button to transfer the files from your computer to the specified directory on the server.\nAdditional options Download from server: Use this feature to download files from your server to your computer. Enter the file path on the server, and click Download. Email notifications: Optionally, you can set the module to send you an email notification when the download or upload completes. Simply select the appropriate option and provide an email address.\nFile management after transfer: The module allows you to extract compressed files after upload or delete the archive, as well as perform similar actions after downloading, like changing file permissions or ownership.\nBy following these steps, you can efficiently manage file transfers between the web, your local computer, and your server.\n","permalink":"https://www.virtualmin.com/docs/getting-started/how-to-use-upload-and-download-module/","summary":"\u003cp\u003eThis tutorial walks you through using the Upload and Download module, which is a convenient tool for transferring files to and from your server.\u003c/p\u003e\n\u003ch3 id=\"getting-started\"\u003eGetting started\u003c/h3\u003e\n\u003cp\u003eBefore proceeding, make sure you\u0026rsquo;ve logged into Virtualmin. Click on \u003cstrong\u003eWebmin\u003c/strong\u003e in the top-left corner of the dashboard, navigate to \u003cstrong\u003eTools\u003c/strong\u003e, and select \u003cstrong\u003eUpload and Download\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"downloading-files-to-your-server\"\u003eDownloading files to your server\u003c/h3\u003e\n\u003cp\u003eThe Upload and Download module provides a straightforward way to download files from the internet directly to your server:\u003c/p\u003e","title":"How to Use Upload and Download Module"},{"content":"This guide will take you through the steps to change the interface theme in Virtualmin.\nSetting a new theme for all users If you\u0026rsquo;re the server administrator and wish to update the theme for all users, follow these instructions:\nLog in as administrator\nAccess your Virtualmin panel by logging in as the Master Administrator, typically using the root account credentials.\nNavigate to Webmin section\nIn the top-left corner of your dashboard, click on Webmin to access the Webmin module.\nAccess Webmin Configuration\nFrom the navigation menu on the left, click on Webmin Configuration to view various settings related to your Webmin interface.\nSelect Webmin Themes\nWithin the Webmin Configuration options, find and click on Webmin Themes to proceed to the theme selection.\nChange theme\nWithin the Change theme tab, you\u0026rsquo;ll see a dropdown list where you can choose from available themes. The Authentic Theme is set as the new default for a modern and responsive design, whereas the Framed Theme was the old default.\nApply theme\nAfter picking your desired theme, hit the Change button to apply your new selection.\nRefresh your browser\nTo see the theme changes take effect, you may need to refresh your browser window.\nSetting a new theme for the current user Changing the theme for your own account is a straightforward process:\nLog in\nAccess your Virtualmin panel.\nNavigate to Change Language and Theme\nLook for the Change Language and Theme module. This module allows individual users to customize their language and locale settings and interface theme.\nSelect your theme\nIn the Theme section of this module, you will find a radio button labeled Personal choice. Select this option to reveal a dropdown menu with the available themes. The Authentic Theme is set as the new default for a modern and responsive design, whereas the Framed Theme was the old default.\nApply your theme\nFrom the dropdown menu, choose the theme you wish to apply to your account. This setting will change the appearance of the Webmin interface only for you and will not affect other users.\nRefresh your browser\nAfter selecting your new theme, the change should be immediate. However, if you do not see the change, try refreshing your browser to load the new theme.\nThis documentation provides a quick and easy guide for individual users to change their Webmin interface theme, offering a more personalized experience while working within Virtualmin.\n","permalink":"https://www.virtualmin.com/docs/getting-started/how-to-change-theme/","summary":"\u003cp\u003eThis guide will take you through the steps to change the interface theme in Virtualmin.\u003c/p\u003e\n\u003ch3 id=\"setting-a-new-theme-for-all-users\"\u003eSetting a new theme for all users\u003c/h3\u003e\n\u003cp\u003eIf you\u0026rsquo;re the server administrator and wish to update the theme for all users, follow these instructions:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eLog in as administrator\u003c/strong\u003e\u003cbr\u003e\nAccess your Virtualmin panel by logging in as the \u003ca href=\"/docs/getting-started/understanding-virtual-server-and-account-types/#master-administrator\"\u003eMaster Administrator\u003c/a\u003e, typically using the \u003cem\u003eroot\u003c/em\u003e account credentials.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eNavigate to Webmin section\u003c/strong\u003e\u003cbr\u003e\nIn the top-left corner of your dashboard, click on \u003cstrong\u003eWebmin\u003c/strong\u003e to access the Webmin module.\u003c/p\u003e","title":"How to Change Theme"},{"content":"This guide provides administrators with a quick overview of setting up automatic DNS secondary configuration features for enhanced DNS server redundancy.\nIntroduction Virtualmin enables the automatic management of DNS secondary servers. With this setup, Virtualmin will create secondary zones on other servers and update them automatically when changes occur on the primary Virtualmin server. For this configuration, you need Virtualmin on your primary server and Webmin (available for free) on your secondary server(s).\nSetting up secondary server Setting up Webmin If Virtualmin is not installed on your secondary servers, you\u0026rsquo;ll need to install Webmin:\nDownload Webmin, choosing the correct package format for your server. Follow the installation instructions provided on the Downloading and Installing page on Webmin website. After installation, verify that Webmin is functioning correctly and that its access is not blocked by a firewall. Installing BIND BIND is required on your secondary servers. Installation procedures vary by operating system but are generally straightforward, and handled for you by Webmin. Configuring BIND Some systems may require additional configuration for BIND to start after installation. In Webmin, navigate to Servers ⇾ BIND DNS Server. Webmin can often perform necessary initial configurations. Ensure BIND is also running and set to start on boot using the System ⇾ Bootup and Shutdown module. Configuring the Virtualmin primary server On the primary Virtualmin server:\nMake sure the secondary server\u0026rsquo;s firewall does not block ports 10001-10010, needed for RPC calls made by Webmin. In Webmin, click Webmin ⇾ Webmin Servers Index. Register the secondary server, providing its hostname and operating system. For SSL-enabled Webmin on the secondary, make sure to set SSL server? option to Yes. Choose a link type set to Login via Webmin with username and password, and enter the admin credentials. Enable Make fast RPC calls? option to Yes. Click Save button to add the new server. Enabling DNS cluster secondary servers To configure automatic management of secondary zones:\nIn Servers ⇾ BIND DNS Server, click on the Cluster Secondary Servers icon. Add your secondary server, ensuring Create secondary on slave when creating locally? option set to Yes. To propagate existing master zones, set Create all existing master zones on secondary? option to Yes. For a custom NS record name, ensure it correctly points to your secondary server. Click Add Now button to add the secondary server to the cluster. Setting the primary IP address Ensure the primary server uses the correct IP for zone transfers:\nIn the BIND DNS Server module, click Module config button. In Cluster slave servers, enter the external IP of your primary server in Default master server IP for remote secondary zones field. Click Save button. Customizing the primary NS record name If you prefer a different naming convention for the primary NS record (by default, it uses your server\u0026rsquo;s hostname), you can modify it in Virtualmin:\nNavigate to Server Templates in Virtualmin, and select the template you\u0026rsquo;re using. In the BIND DNS domain section, look for the field labeled Primary DNS server hostname. Enter your preferred name for the primary NS record. Ensure this new name is valid and resolves correctly. Incorrect or invalid NS record names can lead to unreliable or non-functional name service. Conclusion Your Virtualmin server is now configured to automatically include your secondary DNS server in the NS records for each new domain.\n","permalink":"https://www.virtualmin.com/docs/server-components/how-to-configure-secondary-dns/","summary":"\u003cp\u003eThis guide provides administrators with a quick overview of setting up automatic DNS secondary configuration features for enhanced DNS server redundancy.\u003c/p\u003e\n\u003ch3 id=\"introduction\"\u003eIntroduction\u003c/h3\u003e\n\u003cp\u003eVirtualmin enables the automatic management of DNS secondary servers. With this setup, Virtualmin will create secondary zones on other servers and update them automatically when changes occur on the primary Virtualmin server. For this configuration, you need Virtualmin on your primary server and Webmin (available for free) on your secondary server(s).\u003c/p\u003e","title":"How to Configure Secondary DNS"},{"content":"For users looking to integrate Cloudflare with Virtualmin Pro, the process is straightforward and enhances your domain\u0026rsquo;s DNS management capabilities. Here’s a simple guide to help you configure Virtualmin Pro with Cloudflare:\nInitial Cloudflare configuration Before diving into domain-specific settings, you need to establish the connection between Virtualmin Pro and Cloudflare.\nNavigate to Addresses and Networking ⇾ Cloud DNS Providers. Here, you’ll find a list of supported cloud DNS providers. Select Cloudflare and configure your account details to allow Virtualmin to interact with your Cloudflare account. Upon selecting Cloudflare, you’ll be prompted to enter authentication details such as your Cloudflare account Email and API key or API token. For the API token to be functional, it must be configured with at least the minimum required permissions, which include read access to Account Settings, and edit access to Zone:Zone and Zone:DNS. For additional details on how to generate an API key or token, refer to relevant Cloudflare\u0026rsquo;s documentation. Configuring DNS for existing domains Once Cloudflare is set up in Virtualmin, you can proceed to adjust DNS settings for your existing domains.\nGo to DNS Settings ⇾ DNS Options for the domain you wish to configure. In the Hosting for DNS records dropdown, select Cloudflare. This action moves the DNS hosting from local to Cloudflare. Note: Prior to making this modification, you must update the nameservers associated with your domain at your domain registrar to the nameservers provided by Cloudflare. This is a necessary step before you can proceed with the change. Setting up DNS for new domains For new domains, you can automate the DNS configuration process by setting defaults in server templates.\nGo to System Settings ⇾ Server Templates and select the template you’re using for new domains. Find the DNS domain section. Choose the appropriate Cloud DNS provider in the Create new DNS zones on option. This determines whether DNS zones for new virtual servers are set up locally or with on of the supported cloud DNS providers. Additional Cloudflare-specific options The server templates in Virtualmin also include options for Cloudflare-specific configurations:\nTake over existing zone when creating: If enabled, Virtualmin will take over existing Cloudflare zones for new domains, without throwing an error. Enable proxying on new records: For new DNS records, decide whether they should use Cloudflare\u0026rsquo;s proxying feature. You can apply proxying to all created records or selectively, such as only to the website records. Remember, when you enable Cloudflare DNS hosting for a domain, ensure that you update the nameservers records with your domain registrar to reflect the changes. For more information on how to do this, refer to relevant Cloudflare\u0026rsquo;s documentation.\n","permalink":"https://www.virtualmin.com/docs/server-components/how-to-configure-cloudflare-dns/","summary":"\u003cp\u003eFor users looking to integrate Cloudflare with Virtualmin Pro, the process is straightforward and enhances your domain\u0026rsquo;s DNS management capabilities. Here’s a simple guide to help you configure Virtualmin Pro with Cloudflare:\u003c/p\u003e\n\u003ch3 id=\"initial-cloudflare-configuration\"\u003eInitial Cloudflare configuration\u003c/h3\u003e\n\u003cp\u003eBefore diving into domain-specific settings, you need to establish the connection between Virtualmin Pro and Cloudflare.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eNavigate to \u003cstrong\u003eAddresses and Networking\u003c/strong\u003e ⇾ \u003cstrong\u003eCloud DNS Providers\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003eHere, you’ll find a list of supported cloud DNS providers. Select Cloudflare and configure your account details to allow Virtualmin to interact with your Cloudflare account.\u003c/li\u003e\n\u003cli\u003eUpon selecting Cloudflare, you’ll be prompted to enter authentication details such as your Cloudflare account \u003cstrong\u003eEmail and API key\u003c/strong\u003e or \u003cstrong\u003eAPI token\u003c/strong\u003e. For the API token to be functional, it must be configured with at least the minimum required permissions, which include \u003cem\u003eread\u003c/em\u003e access to \u003cem\u003eAccount Settings\u003c/em\u003e, and \u003cem\u003eedit\u003c/em\u003e access to \u003cem\u003eZone:Zone\u003c/em\u003e and \u003cem\u003eZone:DNS\u003c/em\u003e. For additional details on how to generate an API key or token, refer to relevant \u003ca href=\"https://developers.cloudflare.com/fundamentals/api/\"\u003eCloudflare\u0026rsquo;s documentation\u003c/a\u003e.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"configuring-dns-for-existing-domains\"\u003eConfiguring DNS for existing domains\u003c/h3\u003e\n\u003cp\u003eOnce Cloudflare is set up in Virtualmin, you can proceed to adjust DNS settings for your existing domains.\u003c/p\u003e","title":"How to Configure Cloudflare DNS"},{"content":"Virtualmin provides a plugin to automate domain registration, streamlining the process of setting up a new virtual server with an immediately accessible website and domain.\nSupported registrars The plugin is compatible with Namecheap, Register.com, and Gandi APIs. Use existing accounts or create new ones through plugin\u0026rsquo;s interface. Installing the plugin For EL systems dnf install wbm-virtualmin-registrar For Debian and derivatives apt-get install webmin-virtualmin-registrar Enabling plugin Log in as the master administrator. Navigate to System Settings ⇾ Features And Plugins page. Check Domain Registration and click Save button. Optionally, you can enable it by default for new virtual servers using the Default? column setting. Account management Creating a new account\nVisit the selected registrar\u0026rsquo;s website to create a new account. Follow the website\u0026rsquo;s instructions, entering your personal and billing information as required. Ensure to enable the remote API feature during account setup. Adding an existing account\nGo to Addresses and Networking ⇾ Domain Registrars page. Select your registrar and enter the API account details. Validate the login credentials for proper setup. Editing or removing accounts\nEdit details or remove accounts as needed. Removal accounts from plugin does not cancel the account with the registrar. Registering domains Domain registration\nEnable Register domain feature when creating or editing a virtual server. The domain will be registered and configured with previously chosen nameservers. Domain de-registration\nDe-registration will occur only if the Attempt to de-register domains when deleting option is enabled in the plugin configuration. To de-register a domain, either uncheck the Register domain option or delete the virtual server. This action will make the domain inaccessible online, unless it is re-registered. Domain management Editing contacts: Manage billing, administrative, and technical contacts for each registered domain.\nRenewing domains: Renew domains directly from the plugin page.\nAssociating or disassociating existing domains: Link or unlink domains previously registered outside for management within the platform.\nThis plugin simplifies domain registration, making the process of setting up and managing virtual servers more efficient and integrated within the Virtualmin environment.\n","permalink":"https://www.virtualmin.com/docs/server-components/domain-registration/","summary":"\u003cp\u003eVirtualmin provides a plugin to automate domain registration, streamlining the process of setting up a new virtual server with an immediately accessible website and domain.\u003c/p\u003e\n\u003ch4 id=\"supported-registrars\"\u003eSupported registrars\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eThe plugin is compatible with \u003cstrong\u003eNamecheap\u003c/strong\u003e, \u003cstrong\u003eRegister.com\u003c/strong\u003e, and \u003cstrong\u003eGandi\u003c/strong\u003e APIs.\u003c/li\u003e\n\u003cli\u003eUse existing accounts or create new ones through plugin\u0026rsquo;s interface.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"installing-the-plugin\"\u003eInstalling the plugin\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eFor EL systems\u003c/strong\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednf install wbm-virtualmin-registrar\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFor Debian and derivatives\u003c/strong\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eapt-get install webmin-virtualmin-registrar\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"enabling-plugin\"\u003eEnabling plugin\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003eLog in as the master administrator.\u003c/li\u003e\n\u003cli\u003eNavigate to \u003cstrong\u003eSystem Settings ⇾ Features And Plugins\u003c/strong\u003e page.\u003c/li\u003e\n\u003cli\u003eCheck \u003cstrong\u003eDomain Registration\u003c/strong\u003e and click \u003cstrong\u003eSave\u003c/strong\u003e button.\u003c/li\u003e\n\u003cli\u003eOptionally, you can enable it by default for new virtual servers using the \u003cstrong\u003eDefault?\u003c/strong\u003e column setting.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"account-management\"\u003eAccount management\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eCreating a new account\u003c/p\u003e","title":"Domain Registration"},{"content":"This guide addresses a common questions and issues in Virtualmin related to DNS configuration.\nHow do I setup nameservers for my server By carefully setting up and registering your custom nameservers, and configuring them correctly in Virtualmin, you can achieve a more personalized and professional setup for your hosting environment.\nWhen setting up custom nameservers in Virtualmin, it\u0026rsquo;s important to properly configure both your domain registrar settings and your server settings. This ensures that your server can effectively handle DNS requests for your domain.\nConfiguring nameservers at your domain registrar Start by registering your server as a nameserver with your domain registrar. For example, you might use names like ns1.example.com and ns2.example.com. Assign these nameservers to the IP addresses of your server. This step is crucial as it tells the global DNS system where to find the DNS information for domains hosted on your server. The registration process varies among registrars. Typically, it involves logging into your domain registrar\u0026rsquo;s control panel and entering your nameserver details. Check your registrar\u0026rsquo;s support documentation for specific instructions. Setting up nameservers in Virtualmin After registering your nameservers:\nCreate DNS records for existing domain:\nIn Virtualmin, select your primary domain, e.g. example.com. Navigate to DNS Settings ⇾ DNS Records page. Add A - IPv4 Address records for ns1.example.com and ns2.example.com, pointing to your server\u0026rsquo;s IP addresses. Configure DNS template for new domains:\nGo to System Settings ⇾ Server Templates ⇾ Default Settings ⇾ DNS domain page. In the Primary DNS server hostname, input the primary nameserver, e.g. ns1.example.com. In the Additional manually configured nameservers field, list any additional nameservers, such as ns2.example.com. This setup tells Virtualmin to include these nameservers in the DNS records for all new domains created on the server. Important considerations DNS propagation: After making changes to your DNS settings or nameserver configuration, allow some time for these changes to propagate across the internet. This process can take anywhere from a few hours to up to 48 hours. Consistency and accuracy: Ensure that the nameserver names and IP addresses are consistent and accurately entered both in your registrar\u0026rsquo;s settings and in Virtualmin. Errors in this setup can lead to DNS resolution issues for your domains. Resolving DNS issues DNS issues are commonly encountered in virtual hosting systems due to the multiple systems that need to cooperate. Correct DNS settings are crucial for the smooth operation of various services on a hosting system.\nGlue records Glue records are essential for DNS functionality and need to be correct at your domain registrar:\nUse the whois command to check glue records: whois example.com Look for the \u0026ldquo;name server\u0026rdquo; records. These should list your DNS servers. Remember, Virtualmin cannot modify your registrar\u0026rsquo;s records. Any necessary changes must be made using your registrar\u0026rsquo;s tools. NS records NS (Name Server) records on your Virtualmin server should align with your glue records:\nVerify NS records using: host -t NS example.com Mismatches between NS records and glue records can cause intermittent DNS resolution issues. A records A (Address) records map domain names to IP addresses:\nCheck A records with: host example.com To specify a nameserver for the query: host example.com ns1.example.com Or use an IP if the nameserver\u0026rsquo;s IP address is uncertain: host example.com 192.168.1.1 MX records MX (Mail Exchanger) records direct how emails should be routed:\nUse the following command to inspect MX records: host -t MX example.com Further resources For more detailed troubleshooting, refer to the BIND Troubleshooting Tools in the Webmin documentation. Remember, DNS issues often stem from misconfigurations across different systems, including your domain registrar and your Virtualmin server. Ensuring consistency and correctness in these configurations is key to resolving DNS-related problems.\nUsing cloud DNS providers When utilizing cloud-based DNS providers like Cloudflare, it\u0026rsquo;s important to understand how their proxy services interact with your server\u0026rsquo;s configuration. Specifically, services like Webmin and mail may become inaccessible if they\u0026rsquo;re running on ports not supported by Cloudflare\u0026rsquo;s proxy.\nCloudflare proxy and port limitations Cloudflare enhances security and performance by acting as a proxy between your server and the internet. However, it only proxies specific ports, which can affect access to services running on non-standard ports such as Webmin and mail services.\nDefault port issue: By default, Webmin listens on port 10000, which is not among the ports that Cloudflare proxies. Similarly, mail services (SMTP, IMAP, POP3) use ports that are not supported by Cloudflare\u0026rsquo;s proxy.\nSupported ports: Cloudflare proxies the following ports:\nHTTP ports: 80, 8080, 8880, 2052, 2082, 2086, 2095 HTTPS ports: 443, 2053, 2083, 2087, 2096, 8443 To keep Webmin accessible through Cloudflare\u0026rsquo;s proxy, you need to configure Webmin to listen on one of these supported ports, such as 8443.\nChanging Webmin ports for Cloudflare compatibility To ensure Webmin remains accessible while using Cloudflare\u0026rsquo;s proxy services, adjust the port Webmin listens on to one that is supported.\nAccess Webmin configuration:\nLog in to your Webmin interface. Navigate to Webmin ⇾ Webmin Configuration. Modify listening port:\nClick on Ports and Addresses. In the Listen on port field, enter an allowed port, e.g., 8443. Click Save to apply the new settings. Mail services and Cloudflare Mail services (SMTP, IMAP, POP3) are not supported by Cloudflare\u0026rsquo;s proxy. If you enable the proxy (orange cloud icon) for your mail-related DNS records, email delivery will fail.\nEnsure that the DNS records for your mail services have the proxy disabled (gray cloud icon). This applies to:\nMX records: Direct mail servers for your domain. Mail-related A records: Such as mail.example.com, which should have the proxy disabled. By disabling the proxy for these records, mail traffic will bypass Cloudflare and connect directly to your server, ensuring proper mail delivery.\nImportant considerations Firewall adjustments: Update your server\u0026rsquo;s firewall settings to allow incoming connections on the new port 8443 after changing Webmin\u0026rsquo;s port. Additional resources Supported ports: For a complete list of ports and additional details, refer to Cloudflare\u0026rsquo;s official documentation.\nWebmin configuration guidance: For more information on adjusting Webmin settings, see the Webmin Configuration documentation.\n","permalink":"https://www.virtualmin.com/docs/server-components/troubleshooting-dns/","summary":"\u003cp\u003eThis guide addresses a common questions and issues in Virtualmin related to DNS configuration.\u003c/p\u003e\n\u003ch3 id=\"how-do-i-setup-nameservers-for-my-server\"\u003eHow do I setup nameservers for my server\u003c/h3\u003e\n\u003cp\u003eBy carefully setting up and registering your custom nameservers, and configuring them correctly in Virtualmin, you can achieve a more personalized and professional setup for your hosting environment.\u003c/p\u003e\n\u003cp\u003eWhen setting up custom nameservers in Virtualmin, it\u0026rsquo;s important to properly configure both your domain registrar settings and your server settings. This ensures that your server can effectively handle DNS requests for your domain.\u003c/p\u003e","title":"Troubleshooting DNS"},{"content":"This tutorial provides a straightforward guide on creating an email account in Virtualmin, which can be accessed via POP, IMAP, or webmail. Following a few simple steps, you\u0026rsquo;ll learn how to select the appropriate domain, navigate to user management, and set up a new email account with a custom address and secure password.\nCreating an email Creating an email account in Virtualmin is a simple process, allowing you to quickly add new email capabilities to your domain. Here\u0026rsquo;s how to do it:\nSelect the Domain: After logging into Virtualmin, start by choosing the domain for which you want to create the email account. This can be done by selecting the domain name from the drop-down box located at the top-left corner of the left menu.\nAccess user management: In the domain\u0026rsquo;s left menu, click on Edit Users. This will take you to the user management section where you can manage existing accounts and add new ones.\nAdd a new user: Click on Add a user to this server. This opens a form where you can define the new email account: Enter account details: In the form, specify the desired email address and a secure password. These details are essential for creating a unique and secure email account.\nCreate the account: Once all the details are filled in, click Create. Virtualmin will then process the information and set up the new email account on your server.\nThis email account can now be accessed through various methods like POP, IMAP, or webmail, providing flexible options for communication.\n","permalink":"https://www.virtualmin.com/docs/server-components/how-to-create-an-email-account/","summary":"\u003cp\u003eThis tutorial provides a straightforward guide on creating an email account in Virtualmin, which can be accessed via POP, IMAP, or webmail. Following a few simple steps, you\u0026rsquo;ll learn how to select the appropriate domain, navigate to user management, and set up a new email account with a custom address and secure password.\u003c/p\u003e\n\u003ch3 id=\"creating-an-email\"\u003eCreating an email\u003c/h3\u003e\n\u003cp\u003eCreating an email account in Virtualmin is a simple process, allowing you to quickly add new email capabilities to your domain. Here\u0026rsquo;s how to do it:\u003c/p\u003e","title":"How to Create an Email Account"},{"content":"Learn how to configure a catch-all email account in Virtualmin, designed to receive all emails sent to your domain that do not match any existing account or alias.\nCreate catch-all email account A catch-all email account serves as a useful tool for domain email management by capturing all messages sent to your domain, including those addressed to non-existent email addresses. This setup ensures that no email sent to your domain is missed. Here\u0026rsquo;s how to set it up in Virtualmin:\nSelect the domain: After logging into Virtualmin, choose the domain for which you want to set up a catch-all email address. This is done by selecting the domain name from the drop-down box in the top-left corner of the left menu.\nNavigate to user management: Click on Edit Users in the domain section of the menu. This will take you to the section where you can manage email accounts for that domain.\nChoose an email account: Select the email account you wish to designate as the catch-all account. This is done by clicking on the name of the desired email account in the user list.\nAccess email settings: Within the user\u0026rsquo;s settings, click on Email Settings to modify its properties.\nConfigure catch-all: In the Additional email addresses field, enter @yourdomain.com, replacing yourdomain.com with your actual domain name: This setting directs all emails sent to your domain, which don\u0026rsquo;t match other accounts, to this specified account.\nSave the settings: Click Save to apply the changes. This email account is now set as the default (catch-all) for your domain, receiving all undirected emails sent to it. By following these steps, you can easily set up a catch-all email account in Virtualmin, ensuring that no emails sent to your domain are bounced due to non-existent accounts.\n","permalink":"https://www.virtualmin.com/docs/server-components/how-to-configure-a-catch-all-email-account/","summary":"\u003cp\u003eLearn how to configure a catch-all email account in Virtualmin, designed to receive all emails sent to your domain that do not match any existing account or alias.\u003c/p\u003e\n\u003ch3 id=\"create-catch-all-email-account\"\u003eCreate catch-all email account\u003c/h3\u003e\n\u003cp\u003eA catch-all email account serves as a useful tool for domain email management by capturing all messages sent to your domain, including those addressed to non-existent email addresses. This setup ensures that no email sent to your domain is missed. Here\u0026rsquo;s how to set it up in Virtualmin:\u003c/p\u003e","title":"How to Configure a Catch-All Email Account"},{"content":"A catch-all email address is used to receive or reject emails sent to invalid addresses within your domain. However, implementing a catch-all address is generally not recommended due to several drawbacks:\nIt prevents the mail server from rejecting unwanted emails early in the delivery process. Your server could face increased load from processing full spam messages and viruses, impacting overall performance. A better practice is to create specific aliases as needed, which allows for more efficient email handling and reduces the risk of spam. Creating a catch-all alias in Virtualmin If you decide a catch-all address is necessary, here’s how to set one up in Virtualmin:\nSelect the domain\nFrom Virtualmin’s dropdown menu, choose the domain for which you want to set up the catch-all address.\nEdit Mail Aliases\nNavigate to Edit Mail Aliases to manage email routing for the selected domain.\nAdd alias\nClick Add an alias to this domain to create a new email alias. This will open a new page where you can configure the alias: Configure alias\nSet the Name field to All users to designate this alias as a catch-all. Configure the delivery settings as you normally would, typically directing to a local mailbox. Bounce option\nIf you wish to bounce emails sent to invalid addresses, enable the Bounce mail option.\nSave changes\nOnce configured, save the new alias to activate the catch-all functionality.\nDisabling the catch-all alias To stop the catch-all behavior and prevent the bouncing of emails to invalid addresses, simply delete the catch-all alias you previously created.\n","permalink":"https://www.virtualmin.com/docs/server-components/how-to-configure-a-catch-all-alias-account/","summary":"\u003cp\u003eA catch-all email address is used to receive or reject emails sent to invalid addresses within your domain. However, implementing a catch-all address is generally not recommended due to several drawbacks:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIt prevents the mail server from rejecting unwanted emails early in the delivery process.\u003c/li\u003e\n\u003cli\u003eYour server could face increased load from processing full spam messages and viruses, impacting overall performance.\u003c/li\u003e\n\u003cli\u003eA better practice is to create specific aliases as needed, which allows for more efficient email handling and reduces the risk of spam.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"creating-a-catch-all-alias-in-virtualmin\"\u003eCreating a catch-all alias in Virtualmin\u003c/h3\u003e\n\u003cp\u003eIf you decide a catch-all address is necessary, here’s how to set one up in Virtualmin:\u003c/p\u003e","title":"How to Configure a Catch-All Alias Account"},{"content":"This tutorial demonstrates how to set up an email auto-responder in Virtualmin, a useful tool for automatically sending a pre-defined reply to incoming emails. Ideal for notifying senders when you\u0026rsquo;re unavailable or providing immediate automated responses, this guide will walk you through selecting a domain, choosing a user, and configuring the auto-responder settings.\nWhether for vacation notices or customer service responses, this step-by-step process makes creating an auto-responder straightforward and effective.\nSet up an email auto-responder An email auto-responder is a convenient feature in Virtualmin that sends automated replies to incoming emails.\nSelect the domain: Log into Virtualmin and choose the domain where you want to add the auto-responder. Select the domain name from the drop-down box in the top-left corner of the left menu.\nNavigate to user management: Click on Edit Users. This option allows you to manage the user accounts associated with the selected domain.\nChoose an email account: From the list of users, click on the name of the account for which you want to set up the auto-responder.\nAccess mail forwarding settings: In the user’s settings, click on Mail forwarding settings. Here, you will find the options for configuring the auto-responder: Enable auto-responder: Check the box next to Send automatic reply. This activates the auto-responder feature for the selected email account.\nCompose your message: In the text area below Send automatic reply, enter the message you wish to be sent automatically. You can use plain text or HTML (start the message with \u0026lt;HTML\u0026gt; for HTML formatting).\nSave the settings: Click Save to apply your auto-responder settings. The configured message will now be sent as an automatic reply to any incoming email until the Send automatic reply option is unchecked.\nBy setting up an auto-responder, you ensure that every sender receives an immediate response, even when you\u0026rsquo;re not available to reply in person. This feature is especially useful for out-of-office notifications or as an instant acknowledgment for customer inquiries.\n","permalink":"https://www.virtualmin.com/docs/server-components/how-to-create-an-auto-responder/","summary":"\u003cp\u003eThis tutorial demonstrates how to set up an email auto-responder in Virtualmin, a useful tool for automatically sending a pre-defined reply to incoming emails. Ideal for notifying senders when you\u0026rsquo;re unavailable or providing immediate automated responses, this guide will walk you through selecting a domain, choosing a user, and configuring the auto-responder settings.\u003c/p\u003e\n\u003cp\u003eWhether for vacation notices or customer service responses, this step-by-step process makes creating an auto-responder straightforward and effective.\u003c/p\u003e","title":"How to Create an Auto-Responder"},{"content":"This guide outlines the process of setting up email forwarding in Virtualmin, enabling you to redirect emails from one account to other email addresses. Ideal for managing communications and ensuring important messages are received in multiple inboxes.\nHow to set up email forwarding Email forwarding in Virtualmin allows you to automatically send copies of incoming emails to other addresses. Here’s how to configure it:\nSelect the domain: After logging into Virtualmin, choose the domain where you want to set up email forwarding. This can be done by selecting the domain name from the drop-down box located in the top-left corner of the left menu.\nNavigate to user management: Click on Edit Users. This option is for managing email accounts associated with the domain.\nChoose an email account: Select the email account you want to set up forwarding for by clicking on the user’s name.\nAccess mail forwarding settings: In the user’s settings, find and click on Mail forwarding settings. Here, you will find options to configure email forwarding: Enable forwarding: Check the box next to Forward to other addresses. This activates the email forwarding feature.\nEnter forwarding addresses: In the text area below Forward to other addresses, input the email addresses you want the emails forwarded to, placing one address per line.\nSave the settings: Click Save to apply the forwarding settings. Emails to this account will now be automatically forwarded to the specified addresses.\nSetting up email forwarding in Virtualmin is a straightforward way to ensure that emails reach additional recipients, whether for backup, convenience, or collaborative purposes.\n","permalink":"https://www.virtualmin.com/docs/server-components/how-to-setup-email-forwarding/","summary":"\u003cp\u003eThis guide outlines the process of setting up email forwarding in Virtualmin, enabling you to redirect emails from one account to other email addresses. Ideal for managing communications and ensuring important messages are received in multiple inboxes.\u003c/p\u003e\n\u003ch3 id=\"how-to-set-up-email-forwarding\"\u003eHow to set up email forwarding\u003c/h3\u003e\n\u003cp\u003eEmail forwarding in Virtualmin allows you to automatically send copies of incoming emails to other addresses. Here’s how to configure it:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSelect the domain\u003c/strong\u003e: After logging into Virtualmin, choose the domain where you want to set up email forwarding. This can be done by selecting the domain name from the drop-down box located in the top-left corner of the left menu.\u003c/p\u003e","title":"How to Setup Email Forwarding"},{"content":"Virtualmin automates the configuration of Dovecot for IMAP/POP3 services and configures Cyrus saslauthd for SMTP authentication, facilitating compatibility with various email clients.\nPOP3/IMAP username details Usernames for accessing email services can be located within Virtualmin\u0026rsquo;s virtual server environment. On the Edit Users page, click the Show Email Client Settings button to reveal detailed login credentials including the username.\nUsername conventions Virtualmin has updated its approach, moving away from the practice of utilizing system login names with a period separator. Now, by default, it adopts just the first part of the domain name for virtual server owner logins. The settings for username format are customizable and can be adjusted by navigating to System Settings ⇾ Virtualmin Configuration, selecting the Defaults for new domains section, and setting the desired format in the Domain name style in username field.\nSupport for full email-style usernames, i.e. user@domain.tld is a standard feature in Virtualmin. Unlike before, Postfix now handles @ in email addresses without the need for creating auxiliary usernames. Although, the settings for username format are customizable and can be adjusted by navigating to System Settings ⇾ Server Templates, selecting the Mail for domain section, and setting the desired format in the Format for usernames that include domain field.\nAutomatic configuration of saslauthd Previously, enabling SMTP authentication for email-style usernames required manual configuration:\nOn EL systems, this was done by adding the -r flag to FLAGS= in /etc/sysconfig/saslauthd. On Debian and derivatives, you would add the -r flag to PARAMS= in /etc/default/saslauthd. These configurations ensured that saslauthd could interpret user@domain.tld formatted usernames.\nCurrent automated setup Now, the virtualmin-config-system automates this setup process, without manual intervention. This is part of Virtualmin\u0026rsquo;s commitment to ease of use and efficiency.\nConfirming your configuration After setting up your email clients, verify access using the provided credentials. SMTP authentication should work seamlessly with your user@domain.tld usernames in all modern setups.\n","permalink":"https://www.virtualmin.com/docs/server-components/pop-and-imap/","summary":"\u003cp\u003eVirtualmin automates the configuration of Dovecot for IMAP/POP3 services and configures Cyrus \u003ccode\u003esaslauthd\u003c/code\u003e for SMTP authentication, facilitating compatibility with various email clients.\u003c/p\u003e\n\u003ch3 id=\"pop3imap-username-details\"\u003ePOP3/IMAP username details\u003c/h3\u003e\n\u003cp\u003eUsernames for accessing email services can be located within Virtualmin\u0026rsquo;s virtual server environment. On the \u003cstrong\u003eEdit Users\u003c/strong\u003e page, click the \u003cstrong\u003eShow Email Client Settings\u003c/strong\u003e button to reveal detailed login credentials including the username.\u003c/p\u003e\n\u003ch3 id=\"username-conventions\"\u003eUsername conventions\u003c/h3\u003e\n\u003cp\u003eVirtualmin has updated its approach, moving away from the practice of utilizing system login names with a period separator. Now, by default, it adopts just the first part of the domain name for virtual server owner logins. The settings for username format are customizable and can be adjusted by navigating to \u003cstrong\u003eSystem Settings ⇾ Virtualmin Configuration\u003c/strong\u003e, selecting the \u003cstrong\u003eDefaults for new domains\u003c/strong\u003e section, and setting the desired format in the \u003cstrong\u003eDomain name style in username\u003c/strong\u003e field.\u003c/p\u003e","title":"IMAP/POP3 and SMTP Authentication"},{"content":"Virtualmin allows you to enable spam and virus scanning for email on a per-virtual-server basis, and to configure what happens to email classifies as spam or virus-laden. Under the hood, it scans email using the popular SpamAssassin package for spam detection, and ClamAV for viruses.\nSpamAssassin assigns each message it scans a score indicating how spammy it is, based on the content and servers it was sent from. Typically, anything with a score above 5 is regarded as most likely spam. ClamAV however just compares the message contents with a database of know virus signatures, and reports if any were found or not.\nTurning on spam and virus scanning In a typical Virtualmin installation, you can enable filtering for a new or existing virtual server by just selecting the Spam filtering enabled? and Virus filtering enabled? checkboxes in the features section of the Create or Edit Virtual Server page.\nIf they do not appear, make sure that these features are enabled globally on your system. This can be done as follows:\nLogin as root, open the System Settings category on the left menu, and click on Features and Plugins. Check the boxes next to Spam filtering and Virus filtering. Click Save. If you see any error messages about SpamAssassin or ClamAV not being installed, you\u0026rsquo;ll need to install their packages on your system first. Spam and virus filtering and Procmail Internally, Virtualmin creates an /etc/procmailrc file that in turn runs a Procmail include file under /etc/webmin/virtual-server/procmail directory, depending on the domain to which each email received is sent. This then invokes the spamassassin and clamscan commands, then uses their output to decide if email should be delivered to a special folder or deleted.\nSpamAsssassin is run with command-line parameters that tell it to use configuration files under /etc/webmin/virtual-server/spam, which can be different for each domain. This way, domain owners can customize their own SpamAssassin rules, spam levels and message modification settings.\nChanging delivery destinations By default, email classified as spam as delivered to the ~/Maildir/.spam file under each user\u0026rsquo;s home directory. This shows up as a folder named spam in users\u0026rsquo; mail clients, and in Usermin. Email that is detected as containing viruses is deleted by default, as virus detection is almost 99.99% accurate.\nHowever, you can change these destinations on a per-domain basis using Virtualmin. Some users may prefer that spam be deleted outright, or delivered normally so that it can be filtered by their mail clients. To change the delivery rules, the steps to follow are:\nLogin to Virtualmin as root or as the domain owner. Select the domain from the left menu. Open the Server Configuration category, and click on Spam and Virus Delivery. Change the Destination for spam emails and Destination for virus emails to whatever you want. Click Save. The changes will take effect for email delivered from now on. You can also select to have email whose virus score is above some threshold deleted instead of being delivered to a spam folder. This can be used to stop the delivery of messages that are obviously spam, saving on disk spam and the bandwidth used to download them.\nTo delete high-scoring spam, just follow the steps above and set the Delete spam if score is above field to some number like 10.\nDefault delivery destinations If you have spam and virus delivery destinations that you want used for all new domains, you can set them as follows:\nLogin to Virtualmin as root. Open the System Settings category on the left menu, and click on Module Config. Select the Spam filtering options section. Change the Default delivery for spam and Default delivery for viruses to whatever you want. Click Save. To make changes for all existing domains, use the modify-spam.pl command-line API script.\nAutomatic spam clearing If Virtualmin is configured to deliver spam to a separate folder for each user, this can end up consuming a lot of disk space and disk quotas. To keep usage down, it is possible have Virtualmin automatically delete users\u0026rsquo; spam that is more than a certain number of days old, or is taking up more than some amount of disk space.\nTo set this up for a single domain, the steps to follow are:\nSelect the domain from Virtualmin\u0026rsquo;s left menu. Open the Server Configuration category, and click on Spam and Virus Delivery. In the Automatically delete spam? field, select Yes, if older than and enter a number of days into the adjacent text box. I suggest 5 days, which is more than enough time for users to periodically check their spam folders for false positives. Click Save. If you prefer to delete based on disk usage, select Yes, when mailbox exceeds instead and enter a maximum size for the spam folder. When this is exceeded, messages will be deleted oldest first until it is smaller than the specified size.\nThe default setting for new virtual servers can be set on the Module Config page in the Spam filtering options section. To make changes for all existing domains, use the modify-spam.pl command-line API script.\nReducing CPU load with Clamd In the default Virtualmin configuration, each email received is processed with the clamscan command to check if it contains viruses. Unfortunately, this can take anywhere from seconds to minutes to run, particularly on VPS systems that have limited IO bandwidth or CPU resources. Most of this time is spent loading the virus database, which is continually growing as new viruses are found by the ClamAV authors.\nSlowness running clamscan can cause email delivery to be delayed by several minutes, during which messages stay in the Postfix mail queue. It can also lead to high CPU load on the system, which then slows down other services like Apache or MySQL.\nFortunately, there is a fix. The clamd server process, which loads the virus database just once and then stays running. When email arrives, the clamdscan command connects to it, passes over the message to be scanned, then reads back the results. This typically only takes a seconds, even on a system with limited resources.\nIf your system is receiving a large amount of email, it\u0026rsquo;s recommended the use of clamd. It probably isn\u0026rsquo;t worth running on a system used primarily as a web server though, as it consumes about 2G of RAM at all times. ClamAV is not suitable for use on a low-memory system.\nTo enable the use of the ClamAV server process, follow these steps:\nLogin to Virtualmin as root. Open the Email Messages category on the left menu, and click on Spam and Virus Scanning. At the bottom of the page you should see a button labelled Enable ClamAV Server. Click it. If the button isn\u0026rsquo;t visible, this means that Virtualmin doesn\u0026rsquo;t know how to configure clamd on your operating system, and you will need to do it manually. After clicking, check the messages that appear to make sure that no errors were reported. If all went well, return to the Spam and Virus Scanning page. Change the Virus scanning program to Local server scanner (clamd) , and click Save. Virtualmin will check if clamd and clamdscan are working properly, and if so configure all virtual servers to use it for virus classification from now on.\nCommon ClamAV problems If Virtualmin reports that the clamscan command is not working on your system, here are some things to try:\nRun freshclam to download the virus database. On some systems, the standard ClamAV packages do not include any virus data files, so clamscan cannot run. Remove the Example line from freshclam.conf. On some systems this line exists by default, to intentionally prevent freshclam from running! Make sure that the virus database path in clamd.conf matches the directory updated by freshclam. If not, clamd will not start due to the lack of data files. Moving spam and virus scanning to another system SpamAssassin and ClamAV can use up a lot of CPU time, which on a system that receives a lot of email can significantly slow down email processing. However, it is possible to move some of this load to a separate system, by making use of spamd and clamd, the SpamAssassin and ClamAV server processes.\nThese can be run on one or two other systems on your network, and Virtualmin on the master system that actually receives email configured to offload scanning to them.\nIn the instructions below, serverip is the IP address of the system that will be running spamd, and virtualminip is the IP of the Virtualmin machine.\nSetting up Spamd on EL systems Login to the system you want to run spamd on as root.\nInstall SpamAssassin with:\ndnf install spamassassin Edit the file /etc/sysconfig/spamassassin and add the following to the SPAMDOPTIONS line:\n-i serverip -A virtualminip An example file would look like: # Options to spamd SPAMDOPTIONS=\u0026#34;-d -c -m5 -H -i 193.9.101.242 -A 193.9.101.104\u0026#34; Run the following commands to start spamd server:\nsystemctl enable --now spamassassin If you are using a firewall on this system, open up port 783 to enable connections to SpamAssassin\nSetting up Spamd on Debian and derivatives Login to the system you want to run spamd on as root.\nInstall SpamAssassin with:\napt-get install spamassassin Edit the file /etc/default/spamassassin , and change the line ENABLED=0 to ENABLED=1.\nIn the same file, add the following to the OPTIONS line:\n-i serverip -A virtualminip An example completed line would look like: OPTIONS=\u0026#34;--create-prefs --max-children 5 --helper-home-dir -i 193.9.101.120 -A 193.9.101.104\u0026#34; Run the following commands to start spamd server:\nsystemctl enable --now spamassassin If you are using a firewall on this system, open up port 783 to enable connections to SpamAssassin\nConfiguring Virtualmin to use a remote Spamd Once spamd is running on the remote system, you can configure Virtualmin to use it as follows. Note that this will prevent domains and mailboxes from having their own SpamAssassin rules, unless you setup spam to fetch them from a MySQL/MariaDB or LDAP database.\nLogin to Virtualmin as root, and go to Email Messages ⇾ Spam and Virus Scanning. Change the SpamAssassin client program menu to spamc. Set the Server host for spamc to the IP address of the remote server you setup above. Click Save. Now try sending email to a mailbox in one of the domains with spam filtering enabled on your Virtualmin server, and check if SpamAssassin X-Spam headers are added. If not, check /var/log/mail* on both the Virtualmin and spam scanning systems for error messages, and /var/log/procmail.log as well.\nSetting up Clamd on a remote system The easiest way to setup clamd is to use Virtualmin\u0026rsquo;s built-in support for configuring it. The steps to do this are:\nInstall Virtualmin GPL or Pro on the system to be used for running clamd. You don\u0026rsquo;t need to create any domains, or run any other servers like MySQL/MariaDB or Postfix. Login to the new Virtualmin, and go to Email Messages ⇾ Spam and Virus Scanning. Click the Enable ClamAV Server button. SSH into the system as root, and edit the file clamd.conf and make sure the line TCPSocket 3310 exists and is not commented out. Ensure that the TCPAddr line is set to the IP address to which system connections to clamd will be directed. On systems with systemd socket activation, run systemctl edit clamav-daemon.socket, add ListenStream=0.0.0.0:3310 under the new [Socket] section, then restart the socket and service to apply the change. Note: Avoid using 0.0.0.0 in production; instead, bind ClamAV to a specific trusted IP to reduce exposure. Run the command systemctl restart clamd@scan on EL systems or systemctl restart clamav-daemon on Debian and derivatives to apply the configuration changes. If you are using a firewall on this system, open up port 3310 to enable connections to ClamAV. Configuring Virtualmin to use a remote Clamd You can now configure Virtualmin to use it as follows:\nLogin to Virtualmin as root, and go to Email Messages ⇾ Spam and Virus Scanning. Change the Virus scanning program to Remote server scanner. In the Server host for remote scanner field, enter the hostname of the system running Clamd that you setup in the previous section. Click Save. ","permalink":"https://www.virtualmin.com/docs/server-components/spam-and-virus-scanning/","summary":"\u003cp\u003eVirtualmin allows you to enable spam and virus scanning for email on a per-virtual-server basis, and to configure what happens to email classifies as spam or virus-laden. Under the hood, it scans email using the popular \u003ca href=\"https://spamassassin.apache.org\"\u003eSpamAssassin\u003c/a\u003e package for spam detection, and \u003ca href=\"https://www.clamav.net\"\u003eClamAV\u003c/a\u003e for viruses.\u003c/p\u003e\n\u003cp\u003eSpamAssassin assigns each message it scans a score indicating how spammy it is, based on the content and servers it was sent from. Typically, anything with a score above 5 is regarded as most likely spam. ClamAV however just compares the message contents with a database of know virus signatures, and reports if any were found or not.\u003c/p\u003e","title":"Spam and Virus Scanning"},{"content":"DomainKeys Identified Mail (DKIM) is a standard that enhances email security by enabling the signing of email messages. This signature allows the recipient\u0026rsquo;s mail server to verify the sender\u0026rsquo;s email address, helping to detect sender address forgery commonly used in spam.\nHow DKIM works Signing process: Emails are signed with a private key on the sender\u0026rsquo;s server, corresponding to a public key published in the sender\u0026rsquo;s DNS records. Verification by recipients: Recipients use the public key obtained from the DNS of the From address domain to verify the email\u0026rsquo;s signature, confirming it originated from the stated domain. Virtualmin uses a milter (mail filter) for DKIM signing and verification. This background process interacts with Postfix to apply DKIM signatures to outgoing messages from domains with DKIM enabled. All emails relayed through Virtualmin, regardless of the client used, will be signed if DKIM is activated for their domain.\nInstalling DKIM packages Virtualmin facilitates DKIM configuration on supported systems, which provide the necessary DKIM milter packages.\nAutomated installation in Virtualmin Log in to Virtualmin as root. Navigate to Email Messages ⇾ DomainKeys Identified Mail. If DKIM is not yet configured, an error message about a missing configuration file will appear. Use the Install Now button to automatically install the required package. Manual installation via command line On EL systems:\ndnf install opendkim On Debian and derivatives:\napt-get install opendkim Enabling DKIM in Virtualmin To activate DKIM for outgoing emails:\nAccess Virtualmin as root and go to Email Settings ⇾ DomainKeys Identified Mail. Set Signing of outgoing mail enabled? to Yes. In Selector for DKIM record name, enter a name to identify the signing key, like the current year and month, e.g. 202312. Click Save. Virtualmin will display the steps taken to configure and activate DKIM. Note that DKIM is enabled only for virtual servers with both DNS and email features active, as the mail server requires a private signing key corresponding to a public key in DNS.\nDKIM verification and disabling By default, Virtualmin configures the DKIM milter to verify incoming emails with valid DKIM signatures. Emails with incorrect or unverifiable signatures might be bounced or delayed. To disable verification, set Verify DKIM signatures on incoming email? to No. To turn off DKIM signing completely:\nNavigate to Email Settings ⇾ DomainKeys Identified Mail. Change Signing of outgoing mail enabled? to No. Click Save. This action removes the public key from all domains and stops DKIM signing.\n","permalink":"https://www.virtualmin.com/docs/server-components/dkim/","summary":"\u003cp\u003eDomainKeys Identified Mail (DKIM) is a standard that enhances email security by enabling the signing of email messages. This signature allows the recipient\u0026rsquo;s mail server to verify the sender\u0026rsquo;s email address, helping to detect sender address forgery commonly used in spam.\u003c/p\u003e\n\u003ch3 id=\"how-dkim-works\"\u003eHow DKIM works\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eSigning process\u003c/strong\u003e: Emails are signed with a private key on the sender\u0026rsquo;s server, corresponding to a public key published in the sender\u0026rsquo;s DNS records.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVerification by recipients\u003c/strong\u003e: Recipients use the public key obtained from the DNS of the \u003ccode\u003eFrom\u003c/code\u003e address domain to verify the email\u0026rsquo;s signature, confirming it originated from the stated domain.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVirtualmin uses a \u003cstrong\u003emilter\u003c/strong\u003e (mail filter) for DKIM signing and verification. This background process interacts with Postfix to apply DKIM signatures to outgoing messages from domains with DKIM enabled. All emails relayed through Virtualmin, regardless of the client used, will be signed if DKIM is activated for their domain.\u003c/p\u003e","title":"DomainKeys Identified Mail"},{"content":"In a standard setup, your mail server uses the system\u0026rsquo;s default IP address for SMTP connections, typically associated with eth0. This is the case even for emails sent from domains with dedicated private IP addresses. However, with specific configurations in Virtualmin and Postfix, you can alter this behavior so that outgoing emails from a domain use its assigned private IP address.\nBenefits of using domain-specific outgoing IPs Domain isolation: Helps in separating email traffic for domains, as viewed by other mail servers. Reverse DNS setup: Facilitates setting up per-domain reverse DNS records, which can improve email deliverability and reputation. Configuring Postfix SSH into the server: Access your server as root using SSH.\nEdit Postfix configuration:\nOpen the Postfix configuration file located at /etc/postfix/main.cf. Check for an existing line starting with sender_dependent_default_transport_maps. If it\u0026rsquo;s present, your system is ready. If not, add the following line: sender_dependent_default_transport_maps = hash:/etc/postfix/dependent Create dependent file:\nExecute the command: touch /etc/postfix/dependent Then, run postmap hash:/etc/postfix/dependent to apply the changes. Enabling domain-specific outgoing IPs After configuring Postfix, you can enable the use of a domain\u0026rsquo;s IP address for outgoing SMTP connections within Virtualmin:\nNavigate in Virtualmin: Go to Mail Options -\u0026gt; Email Settings.\nAdjust outgoing IP settings: Change Send outgoing email for domain from IP to Virtual server\u0026rsquo;s address.\nSave changes: Click the Save button to apply the new configuration.\nUsing the API This feature can also be enabled via Virtualmin\u0026rsquo;s API. Use the modify-mail command with the --outgoing-ip flag to automate this process programmatically.\n","permalink":"https://www.virtualmin.com/docs/server-components/sender-dependent-outgoing-ip-address/","summary":"\u003cp\u003eIn a standard setup, your mail server uses the system\u0026rsquo;s default IP address for SMTP connections, typically associated with \u003ccode\u003eeth0\u003c/code\u003e. This is the case even for emails sent from domains with dedicated private IP addresses. However, with specific configurations in Virtualmin and Postfix, you can alter this behavior so that outgoing emails from a domain use its assigned private IP address.\u003c/p\u003e\n\u003ch3 id=\"benefits-of-using-domain-specific-outgoing-ips\"\u003eBenefits of using domain-specific outgoing IPs\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eDomain isolation\u003c/strong\u003e: Helps in separating email traffic for domains, as viewed by other mail servers.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eReverse DNS setup\u003c/strong\u003e: Facilitates setting up per-domain reverse DNS records, which can improve email deliverability and reputation.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"configuring-postfix\"\u003eConfiguring Postfix\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSSH into the server\u003c/strong\u003e: Access your server as \u003ccode\u003eroot\u003c/code\u003e using SSH.\u003c/p\u003e","title":"Sender Dependent Outgoing IP Address"},{"content":"Amazon Simple Email Service (SES) can be used by Virtualmin Pro as a cloud mail delivery provider. When enabled, Virtualmin still hosts the domain\u0026rsquo;s mailboxes locally, but outgoing mail for selected domains is relayed through Amazon SES instead of being delivered directly by your server.\nThis is useful when your server is on a network with poor mail reputation, a dynamic IP address, or outbound delivery restrictions. It can also help centralize bounce, complaint, and sending reputation management in AWS.\nNote: Amazon SES in Virtualmin is for outgoing mail delivery. You do not need to point your domain\u0026rsquo;s MX records at Amazon SES unless you are also configuring SES to receive inbound mail, which is a separate AWS feature. Requirements Before configuring Virtualmin, make sure you have:\nVirtualmin Pro, as cloud mail delivery providers are a Pro feature. Postfix installed and enabled as the mail server. The AWS CLI installed on the Virtualmin system, available as the aws command. An Amazon SES region with an SMTP endpoint selected for sending mail. AWS credentials that can manage SES identities and quotas in that region. Either SES SMTP credentials, or an AWS access key and secret key from which Virtualmin can derive the SES SMTP password. Amazon SES SMTP credentials are region-specific. If you change the SES region later, update the credentials or let Virtualmin derive them again for the new region.\nNote: New Amazon SES accounts start in the SES sandbox for each AWS region. In sandbox mode, SES can only send to verified identities and has low sending limits. Request production access in AWS before using SES for real customer mail. Prepare Amazon SES Log in to the Amazon SES console. Select the AWS region that you want to use for outgoing mail. Make sure it has an SES SMTP endpoint in Amazon\u0026rsquo;s SES endpoints and quotas reference. If the account is still in sandbox mode, request production access using Amazon\u0026rsquo;s Request production access guide. Create SES SMTP credentials in the SES console, or prepare an AWS access key and secret key for an IAM user that can send mail through SES. If your domains\u0026rsquo; DNS is not managed by Virtualmin, verify each sending domain in SES before enabling SES for that domain in Virtualmin. When using an AWS access key as the SMTP user, the IAM user must be allowed to send through SES, typically with permission for ses:SendRawEmail. If Virtualmin is also creating and checking domain identities, the credentials also need access to SES identity and quota APIs.\nAmazon documents both SMTP credential creation and conversion from AWS access keys in Obtaining Amazon SES SMTP credentials.\nConfigure SES in Virtualmin Log in to Virtualmin as root. Go to Email Settings ⇾ Cloud Mail Delivery Providers. Click Amazon SES. Enter the AWS Access key and Secret key, unless Virtualmin reports that AWS credentials are already available from EC2 metadata. Set Default API location to the SES region you selected in AWS. For SES SMTP credentials, choose one of the following: Derive from access key if you entered a permanent AWS access key and secret key above. Custom username if you created SMTP credentials in the Amazon SES console, or if Virtualmin is using EC2 metadata credentials for the AWS API. Optionally allow resellers or virtual server owners to use the provider. Click Save. Virtualmin checks that the AWS CLI can access SES in the selected region. It then configures Postfix to authenticate to the SES SMTP endpoint for that region, using STARTTLS on port 587.\nEnable SES for a domain To use SES for an existing virtual server:\nSelect the virtual server in Virtualmin. Go to Email Settings. Set Cloud mail delivery provider to Amazon SES. Click Save. When SES is enabled for a domain, Virtualmin:\nCreates or reuses the Amazon SES domain identity. Adds the SES verification TXT records when DNS for the domain is hosted by Virtualmin. Adds include:amazonses.com to the domain\u0026rsquo;s SPF record. Configures Postfix sender-dependent delivery for the domain through email-smtp.REGION.amazonaws.com on port 587. Stores the SES identity token and region with the virtual server. If the domain\u0026rsquo;s DNS is not managed by Virtualmin, the domain identity must already exist and be verified in Amazon SES before SES can be enabled for it. In that case, create the domain identity in the Amazon SES console, publish the _amazonses.\u0026lt;domain\u0026gt; TXT verification record at your DNS provider using the token shown in AWS, wait for SES to report the identity as verified, and then enable the provider for the domain in Virtualmin. Virtualmin will reuse the existing verified identity instead of creating a new one.\nUse SES for new domains by default To make SES the default outgoing delivery provider for new virtual servers:\nGo to System Settings ⇾ Server Templates. Select the template used for new domains. Open the Mail for domain section. Set Default cloud mail delivery provider to Amazon SES. Click Save. New domains created with that template will be set up for SES when the mail feature is enabled.\nDKIM, SPF, and DMARC Virtualmin automatically updates SPF for domains using SES by adding include:amazonses.com. This records Amazon SES as an approved sender, though DMARC SPF alignment may still require configuring a custom MAIL FROM domain in SES.\nFor DKIM, you can use Virtualmin\u0026rsquo;s own DomainKeys Identified Mail signing, Amazon SES Easy DKIM, or both. If you enable Easy DKIM in the SES console, publish the CNAME records shown by AWS in the domain\u0026rsquo;s DNS. Amazon\u0026rsquo;s Creating and verifying identities documentation explains the SES-side DKIM records.\nIf you enforce DMARC, consider also configuring a custom MAIL FROM domain in SES. Amazon\u0026rsquo;s default MAIL FROM domain is under amazonses.com; a custom MAIL FROM domain gives you more control over SPF alignment for DMARC. See Amazon\u0026rsquo;s Using a custom MAIL FROM domain guide for the required MX and TXT records.\nTroubleshooting If Cloud Mail Delivery Providers reports that the aws command is missing, install the AWS CLI package for your operating system and re-check the provider.\nIf Virtualmin reports that the SES account is still in sandbox mode, request production access in the same AWS region selected in Default API location. Sandbox status and sending limits are per-region.\nIf domain verification does not complete, check that the _amazonses TXT record exists in public DNS. DNS changes can take time to propagate, and Amazon can take additional time to process them.\nIf Virtualmin reports that Amazon SES verification is not complete and shows the expected DNS TXT record name and value, the SES domain identity exists but Amazon has not yet seen the matching record. Publish the shown _amazonses.\u0026lt;domain\u0026gt; TXT record at your DNS provider with the exact value Virtualmin displays, and wait for SES to mark the identity as verified before retrying.\nIf sending fails after setup, check Postfix logs while sending a test message:\njournalctl -u postfix -f Common causes include an SES SMTP username or password from the wrong or unsupported region, AWS credentials without SES sending permission, outbound firewall rules blocking port 587, or a domain identity that is not yet verified in SES.\n","permalink":"https://www.virtualmin.com/docs/server-components/how-to-configure-amazon-ses/","summary":"\u003cp\u003eAmazon Simple Email Service (SES) can be used by Virtualmin Pro as a cloud mail delivery provider. When enabled, Virtualmin still hosts the domain\u0026rsquo;s mailboxes locally, but outgoing mail for selected domains is relayed through Amazon SES instead of being delivered directly by your server.\u003c/p\u003e\n\u003cp\u003eThis is useful when your server is on a network with poor mail reputation, a dynamic IP address, or outbound delivery restrictions. It can also help centralize bounce, complaint, and sending reputation management in AWS.\u003c/p\u003e","title":"How to Configure Amazon SES for Outgoing Email"},{"content":"A secondary MX (Mail Exchange) server acts as a backup for handling emails if the primary mail server goes offline. This setup is essential for maintaining continuous mail service. Virtualmin Professional is required on the primary server, while either Virtualmin Professional or Virtualmin GPL can be used on the secondary mail server.\nPre-requisites for configuration Effective implementation requires:\nVirtualmin Professional on the primary server with an operational mail and DNS server. Virtualmin Professional or GPL on the secondary mail server with a functional mail server. Postfix mail server across both servers, correctly configured in Virtualmin. Preventing backscatter spam Virtualmin can set up the secondary mail server to accept emails only for addresses existing on the primary server. To configure Postfix on the secondary mail server:\nEdit /etc/postfix/main.cf and add: relay_recipient_maps = hash:/etc/postfix/relay_recipients Create and map an empty file: touch /etc/postfix/relay_recipients ; postmap hash:/etc/postfix/relay_recipients Restart Postfix: systemctl restart postfix Configuring Virtualmin on the primary server Adding the secondary mail server to Webmin Access Webmin: Click on the Webmin link in Virtualmin\u0026rsquo;s left menu. Webmin servers index: Under Webmin, select Webmin Servers Index. Register new server: Click Register a new server, provide the secondary mail server\u0026rsquo;s hostname and Webmin port, choose Login via Webmin with username and password, and enter the admin credentials. Save the server: Click Save to add the secondary mail server to the index. Enabling secondary mail server in Virtualmin Virtualmin settings: In Virtualmin, click on Addresses and Networking and select Secondary Mail Servers. Activate the server: Choose the newly added server and enable it as a secondary mail server. Apply to existing domains: Optionally, select Add all existing mail domains to secondary MX servers if you want to apply this to existing domains. Save changes: Click Save. Synchronizing allowed addresses To synchronize valid email addresses from the primary to secondary mail servers, SSH into the primary server as root and run:\nvirtualmin syncmx-domain --all-domains This command updates the secondary mail server with valid addresses to prevent backscatter spam.\nUnderstanding the technical details This feature in Virtualmin Professional leverages mail RFCs to enhance mail delivery reliability:\nAdditional MX record: An extra MX record with a lower priority than the primary is created. Mail relay entry: The secondary mail server is set to relay mail for the domain, holding emails in its queue if the primary is offline. Automatic resending: The secondary mail server will periodically try resending emails to the primary. If the primary remains offline for an extended period, emails are bounced back to the sender. By following these steps, you can set up a reliable secondary MX server, ensuring continuous mail service even during primary server downtime.\n","permalink":"https://www.virtualmin.com/docs/server-components/hold-and-forward-backup-mail-server/","summary":"\u003cp\u003eA secondary MX (Mail Exchange) server acts as a backup for handling emails if the primary mail server goes offline. This setup is essential for maintaining continuous mail service. Virtualmin Professional is required on the primary server, while either Virtualmin Professional or Virtualmin GPL can be used on the secondary mail server.\u003c/p\u003e\n\u003ch3 id=\"pre-requisites-for-configuration\"\u003ePre-requisites for configuration\u003c/h3\u003e\n\u003cp\u003eEffective implementation requires:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVirtualmin Professional on the primary server with an operational mail and DNS server.\u003c/li\u003e\n\u003cli\u003eVirtualmin Professional or GPL on the secondary mail server with a functional mail server.\u003c/li\u003e\n\u003cli\u003ePostfix mail server across both servers, correctly configured in Virtualmin.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"preventing-backscatter-spam\"\u003ePreventing backscatter spam\u003c/h3\u003e\n\u003cp\u003eVirtualmin can set up the secondary mail server to accept emails only for addresses existing on the primary server. To configure Postfix on the secondary mail server:\u003c/p\u003e","title":"Hold and Forward Backup Mail Server"},{"content":"Email functionality in Virtualmin involves various components, making it a complex system. Key elements include a Postfix mail transfer agent, a Procmail mail delivery agent, Dovecot IMAP/POP3 retrieval, ClamAV anti-virus, SpamAssassin anti-spam, and mail log analysis tools. If any of these components fail, it can disrupt mail services for certain tasks or entirely.\nVerifying email server connectivity Port 25 is essential for mail servers inter-communication. It enables email transfers between servers, and if it\u0026rsquo;s blocked, this key inter-server communication will be disrupted.\nTo check if port 25 is blocked on your network, use the telnet command like this:\ntelnet smtp.gmail.com 25 A successful connection shows a \u0026ldquo;Connected to smtp.gmail.com\u0026rdquo; message, while a failure displays \u0026ldquo;Unable to connect to remote host: Connection refused\u0026rdquo; or gives no response.\nISPs often block this port to curb spam, but they might unblock it if requested. It\u0026rsquo;s advisable to check with your ISP regarding the possibility of unblocking it.\nTroubleshooting SASL authentication To check if the SASL authentication daemon, i.e. saslauthd is running properly and can authenticate users as it should, you can use the testsaslauthd command, with the -s option, which can take smtp or imap or any other actual service name as an argument.\nFor SMTP authentication testsaslauthd -u user -p pass -s smtp For IMAP authentication testsaslauthd -u user -p pass -s imap In these commands:\n-u user should be replaced with the actual username you want to test. -p pass should be replaced with the password for that user. -s smtp or -s imap specifies the service you\u0026rsquo;re testing authentication for, either SMTP or IMAP. Note: In Debian and derivative operating systems, when testing connection to SMTP or IMAP, you might need to specify the -f /var/spool/postfix/var/run/saslauthd/mux option. This is used to direct the system to the correct location of the saslauthd communication socket for proper authentication handling. Understanding test results Success: A successful authentication test will output:\n0: OK \u0026#34;Success.\u0026#34; This output means that saslauthd successfully authenticated the user with the provided credentials, indicating that your SASL authentication setup for the specified service (SMTP or IMAP) is correctly configured.\nFailed: A failed authentication test will show:\n0: NO \u0026#34;authentication failed\u0026#34; This message indicates that saslauthd was unable to authenticate the user. This could be due to incorrect credentials, permission issues, or configuration problems in your SASL or email server setup.\nIf you encounter a failed test, it\u0026rsquo;s advisable to double-check the user credentials. Checking server logs can also offer more insights into the failure.\nChecking logs for email issues With modern systems employing systemd, the approach to log inspection has evolved. Traditional log files like /var/log/maillog or /var/log/mail.log are no longer the primary resources for troubleshooting. Instead, journalctl provides a centralized and more efficient method to access logs from all systemd services.\nChecking SMTP logs with Postfix For SMTP issues, use:\njournalctl -u postfix This command shows logs related to Postfix, which is commonly used for SMTP.\nChecking IMAP/POP3 logs with Dovecot For problems with email retrieval via IMAP or POP3, use:\njournalctl -u dovecot Dovecot logs provide insights into issues with retrieving emails from mail servers.\nChecking authentication logs with saslauthd For authentication problems, particularly related to SMTP, use:\njournalctl -u saslauthd This displays logs from saslauthd, which handles authentication for various services including SMTP.\nReal-time debugging For real-time log monitoring, which can be useful when testing connections or replicating issues, add the -f parameter to any of the above commands. For example:\njournalctl -u postfix -f This command tails the Postfix logs, showing new log entries in real time.\nAnalyzing logs When analyzing logs:\nLook for error messages: Identify error codes or descriptive messages that can indicate the cause of the problem. Check timestamps: Ensure the logs correspond to the time when the issue occurred. Note behavior patterns: Recurring issues or patterns in the logs can offer clues to underlying problems. Taking further action Based on your log analysis:\nAdjust configurations: Modify settings as needed to resolve identified issues. Restart services: Some problems may require restarting the affected service. Consult resources: If logs don’t provide clear answers, consult Virtualmin’s support documentation or forums for more specific assistance. DNS resolution for mail troubleshooting Many email delivery problems can stem from incorrect DNS configurations. Ensuring that DNS is correctly set up for your domain is a critical step in troubleshooting mail issues. Key aspects to verify include the MX (Mail Exchange) record and the resolution of the domain names it points to.\nTesting DNS resolution To check DNS configurations, you can use the host and dig commands, which provide information about various DNS records associated with a domain.\nChecking MX records\nStart by examining the MX record for your domain:\nhost -t mx yourdomain.com This command retrieves the MX record for yourdomain.com. The output should indicate which mail server handles emails for the domain. For example:\nyourdomain.com mail is handled by 5 mail.yourdomain.com. Verifying address resolution\nNext, check the address resolution of the mail server:\nhost mail.yourdomain.com This command should return the IP address of mail.yourdomain.com. A successful response confirms that the mail server\u0026rsquo;s domain name is resolving correctly:\nmail.yourdomain.com has address 1.2.3.4 Reverse DNS resolution\nReverse DNS resolution can also be important for mail servers. Many email servers on the Internet use reverse DNS lookup as a method to combat spam. To check reverse resolution:\nhost 1.2.3.4 Replace 1.2.3.4 with the IP address of your mail server. The server should reverse resolve to a domain name, although the specific domain it resolves to is less important than the fact that it resolves:\n4.3.2.1.in-addr.arpa domain name pointer mailserver.example.com. Considerations for DNS testing Running these commands on your Virtualmin server might not provide a complete picture of DNS for external hosts. Incorrect glue records at your registrar could lead to different DNS results for external queries. To thoroughly check glue records and other DNS configurations, you might need to use whois or consult the BIND documentation in Webmin, particularly the BIND Troubleshooting Tools section. Managing reverse DNS resolution for email servers Reverse DNS resolution plays an important role in email delivery. Many mail servers reject emails from servers lacking correct reverse resolution. Understanding and managing this aspect is key to ensuring reliable email communication.\nUnderstanding reverse resolution Reverse DNS resolution (rDNS) differs from forward DNS resolution. It involves resolving an IP address back to a domain name. The authority for reverse resolution lies with the IP address owner, typically your hosting provider or ISP.\nImportance of rDNS Spam prevention: Incorrect or absent rDNS is often flagged by spam filters and mail servers, leading to email rejection. Server credibility: A correctly set up reverse DNS entry adds legitimacy to your server, enhancing its trustworthiness in the eyes of other mail servers. Setting up reverse DNS Virtualmin doesn\u0026rsquo;t directly handle reverse DNS due to its complexities, especially on servers with multiple virtual hosts sharing a single IP. Here\u0026rsquo;s how to approach setting up reverse DNS:\nIdentify the authoritative entity:\nDetermine who controls your IP addresses. This is usually your hosting provider. Use whois to find details about your IP address, including authoritative servers for PTR records. whois 1.2.3.4 Replace 1.2.3.4 with your server\u0026rsquo;s actual IP address. Contact your provider:\nRequest your provider to set up a reverse DNS entry for your IP address. If possible, ask them to delegate the zone to your DNS servers. Setting up rDNS on your server:\nIf your provider delegates the reverse DNS zone to your server, set up the necessary PTR records using BIND. Verify rDNS setup:\nOnce set up, you can verify the reverse DNS entry by using various online tools or the host command: host 1.2.3.4 Considerations One entry per IP: Typically, you create one reverse DNS entry per IP address, not per virtual host. Coordination is key: Successfully setting up reverse DNS often requires cooperation with your network provider. Verifying spam filtering effectiveness If you\u0026rsquo;re receiving an overwhelming amount of spam, it\u0026rsquo;s possible that SpamAssassin, the primary tool for spam filtering in Virtualmin, might not be configured correctly, or there could be issues with Procmail, the mail processing utility. To determine if your emails are being adequately filtered for spam, you should inspect the headers of your received messages.\nChecking email headers Email headers contain valuable information about the processing journey of an email, including any spam filtering actions. To view these headers:\nUsing Usermin or Webmin read mail module:\nOpen an email and look for the View Full Headers link, usually located in the upper right corner of the email interface. Clicking this will reveal the complete set of headers for that message. Using other mail clients:\nMost email clients provide a way to view the full headers or the raw message. This option is often found in the settings or options menu when viewing an individual email. Identifying spam filter headers When inspecting the headers, look for headers that start with X-Spam-. These are added by SpamAssassin and indicate that the email has been processed for spam. Examples of such headers include:\nX-Spam-Status: Shows the spam status of the email. X-Spam-Score: Indicates the spam score assigned to the email. What if spam headers are missing? If these X-Spam- headers are absent, it suggests a few possible issues:\nSpamAssassin disabled: SpamAssassin might be disabled for the domain or the specific user. Procmail misconfiguration: If Procmail is not configured correctly, it might not be routing emails through SpamAssassin as expected. Check Procmail rules and settings to ensure proper integration. Domain-level settings: Ensure that spam filtering is enabled at the domain level. Each domain in Virtualmin can have individual spam filtering settings. Confirming the functionality of virus scanning A simple and effective way to test this is by using the EICAR test string, a non-malicious string recognized by antivirus programs as a virus signature.\nTesting with the EICAR test string The EICAR test string is a standardized set of characters developed by the European Institute for Computer Antivirus Research (EICAR) to safely test virus detection capabilities. Here\u0026rsquo;s how to use it:\nCreate a test email:\nWrite an email to yourself or another account on your server. Attach a file containing the EICAR test string. This string is specifically designed to be detected as a virus by antivirus programs, despite being harmless. Send and observe:\nSend the email with the EICAR test attachment. If the email arrives in your inbox with the attachment intact, it indicates that the antivirus scanning is not functioning correctly on your server. If the email is blocked or arrives without the attachment, it signifies that the virus scanning process is operational. Where to find the EICAR test string The EICAR test string can be obtained from the EICAR official website. Follow the instructions on their website to download or copy the test string. What to do if virus scanning fails If the test email with the EICAR string passes through to the inbox, it\u0026rsquo;s essential to troubleshoot the virus scanning setup on your server:\nCheck ClamAV configuration: Ensure that ClamAV, the usual antivirus tool used in Virtualmin, is correctly installed, configured, and integrated with your email system. Update virus definitions: Regularly update the virus definitions for ClamAV to ensure it can detect the latest threats. Review email processing rules: Verify that your mail processing rules (like those in Procmail) are set to pass emails through ClamAV for scanning. Addressing \u0026ldquo;No Space Left on Device\u0026rdquo; errors in Mail Systems Mail processing, delivery, and retrieval can encounter issues on systems with disk quotas, often manifesting as errors about disk space even when ample space seems available. These problems are frequently related to ClamAV processing and Dovecot\u0026rsquo;s mail retrieval.\nSpamAssassin and ClamAV processing and disk quotas When using SpamAssassin and ClamAV for mail processing, the operations can be temporarily disk space-intensive, potentially exceeding disk quotas despite apparent available space.\nSolution:\nSeparate /tmp directory: Configure ClamAV or clamd to use a /tmp directory on a separate partition from /home. This separation allows ClamAV to utilize the necessary space for decompression and processing without being hindered by disk quotas. Recommended partitioning: For installations with disk quotas, it\u0026rsquo;s advisable to have an independent /home partition, distinct from /, /tmp, and /var. Dovecot index management on full disks Dovecot may encounter issues managing its index files when disk quotas are filled, leading to challenges in mail retrieval.\nSolution:\nAlternate index location: Configure Dovecot to store its index files in a different location from the mailboxes. This approach alleviates issues caused by full disks and allows Dovecot to function correctly.\nDovecot configuration: Modify the dovecot.conf file to set an alternate location for index and control files, use the following configuration:\nmail_location = maildir:~/Maildir:INDEX=/var/cache/dovecot/index/%u:CONTROL=/var/cache/dovecot/control/%u Prepare Directories: Ensure the directories /var/cache/dovecot/index and /var/cache/dovecot/control exist and are set to mode 6777 before applying these changes.\nRestart Dovecot: After making these changes, restart the Dovecot service to apply them.\nWhy is all incoming email bouncing? Bounced emails can be a symptom of discrepancies between your server\u0026rsquo;s actual hostname and the hostname recorded in your configuration files. To resolve this, you need to ensure consistency across your system settings.\nSteps to resolve email bouncing Verify server hostname\nConnect to your server via SSH as the root user. Run the hostnamectl --static command to display the current system hostname.\nCheck hosts file\nOpen the /etc/hosts file and confirm that the hostname from the previous step is listed next to your server\u0026rsquo;s external IP address. This file maps hostnames to IP addresses and must include your server\u0026rsquo;s hostname for proper resolution.\nInspect Postfix configuration\nExamine the /etc/postfix/main.cf file, particularly the mydestination parameter. This line should list the hostname that the hostname command returned. The mydestination setting defines what domains this Postfix instance will deliver locally, rather than forwarding.\nApply changes\nIf you\u0026rsquo;ve made any changes to the /etc/hosts or /etc/postfix/main.cf files, you\u0026rsquo;ll need to restart Postfix to apply them. You can do this with the following command:\nsystemctl restart postfix Finalizing the configuration After restarting Postfix, send a test email to verify that the issue has been resolved. The server should now correctly accept incoming emails instead of bouncing them.\n","permalink":"https://www.virtualmin.com/docs/server-components/troubleshooting-emails/","summary":"\u003cp\u003eEmail functionality in Virtualmin involves various components, making it a complex system. Key elements include a Postfix mail transfer agent, a Procmail mail delivery agent, Dovecot IMAP/POP3 retrieval, ClamAV anti-virus, SpamAssassin anti-spam, and mail log analysis tools. If any of these components fail, it can disrupt mail services for certain tasks or entirely.\u003c/p\u003e\n\u003ch3 id=\"verifying-email-server-connectivity\"\u003eVerifying email server connectivity\u003c/h3\u003e\n\u003cp\u003ePort \u003cem\u003e25\u003c/em\u003e is essential for mail servers inter-communication. It enables email transfers between servers, and if it\u0026rsquo;s blocked, this key inter-server communication will be disrupted.\u003c/p\u003e","title":"Troubleshooting Emails"},{"content":"This guide explains how to password-protect a directory within your website using Virtualmin, adding an extra layer of security and ensuring that only authorized users can access sensitive content.\nHow to password protect a directory The ability to password-protect a directory at the moment is only available in systems with Apache installed. Here\u0026rsquo;s how to set it up:\nSelect the domain: Log into Virtualmin and choose the domain where you want to add password protection. Do this by selecting the domain name from the drop-down box in the top-left corner of the left menu.\nNavigate to directory protection: Click on Web Configuration and then select Protected Directories. This section allows you to manage access to various parts of your website: Choose directory scope: Decide whether you want to protect the entire website, a specific sub-directory, or a section of the cgi-bin. This choice depends on which part of your site you want to secure.\nIf choosing a sub-directory or cgi-bin, enter the relative directory name. For instance, for a directory located at https://example.com/secret/, you would enter secret. Set the authentication realm: Enter a name in the Authentication Realm field. This name is what users will see when prompted for a password, serving as an identifier for the protected area.\nCreate the protected directory: Click Create to establish the password-protected area: Assign user permissions: Go to Edit Users, then select a username, and navigate to Other User Permissions. In the Allow access to web directories section, specify which directories the user should have access to by double-clicking on the desired directory name displayed on the left side of the selection pane: After double-clicking, the directory granted access will move from the left pane to the right. This step is crucial for granting or restricting access to the protected directory.\n","permalink":"https://www.virtualmin.com/docs/server-components/how-to-password-protect-directory/","summary":"\u003cp\u003eThis guide explains how to password-protect a directory within your website using Virtualmin, adding an extra layer of security and ensuring that only authorized users can access sensitive content.\u003c/p\u003e\n\u003ch3 id=\"how-to-password-protect-a-directory\"\u003eHow to password protect a directory\u003c/h3\u003e\n\n\n\n\n\n      \u003cdiv class=\"alert alert-primary\"\u003e\n        \u003ci class=\"wm wm-fw wm-sm wm-exclamation\"\u003e\u003c/i\u003e \u003cstrong\u003e\u003c/strong\u003e\u003cbr\u003e\n        The ability to password-protect a directory at the moment is only available in systems with Apache installed.\n      \u003c/div\u003e\n\n\n\u003cp\u003eHere\u0026rsquo;s how to set it up:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSelect the domain\u003c/strong\u003e: Log into Virtualmin and choose the domain where you want to add password protection. Do this by selecting the domain name from the drop-down box in the top-left corner of the left menu.\u003c/p\u003e","title":"How to Password Protect a Directory"},{"content":"This guide provides a comprehensive overview of setting up URL redirects in Virtualmin. Perfect for website administrators looking to redirect traffic from one URL to another.\nHow to set up URL redirects URL redirects are a crucial tool for guiding traffic to the right place on your website. Whether you\u0026rsquo;re redirecting old URLs to new ones or consolidating web pages, here\u0026rsquo;s how to manage URL redirects in Virtualmin:\nSelect the domain: After logging into Virtualmin, choose the domain where you wish to add a URL redirect. This can be done by selecting the domain name from the drop-down box in the top-left corner of the left menu.\nAccess server configuration: Click on Web Configuration in the domain\u0026rsquo;s menu. This section lets you modify various settings related to your server.\nNavigate to website redirects: Select Website Redirects. This option is specifically for managing how URLs are redirected within your domain.\nAdd a new redirect: Click on Add a new website redirect. This will open a form where you can specify the details of the URL redirect: Configure source URL: In the Source URL path field, enter the path of the URL you want to redirect. This could be a root directory (/) or a specific path (e.g., /foo/bar).\nSet destination URL: In the Destination field determines where the source URL will redirect to. Options include:\nURL at other website: Redirects to a specified external URL. If a sub-directory of the path is accessed, the redirect includes that path. URL on this website: Redirects to another path within the same domain. URL at this website with new protocol: Changes the protocol (like HTTP to HTTPS) while keeping the same domain and path. Directory on this system: Serves content from a specified directory within the domain\u0026rsquo;s home directory, ideally under public_html. HTTP redirect type: Customizes the HTTP status code for redirects. This is relevant when redirecting to an external URL and can be set to different codes like 302 or 301, depending on your needs.\nRedirect sub-directories to: Controls how sub-paths under the source URL are handled. Options include:\nSame sub-directory under destination URL: Redirects a path like /foo/bar to http://foo.com/bar. Just destination URL: Redirects all sub-paths to the main destination URL. Ignore sub-directories: Only the exact source path is redirected; sub-paths are not affected. Note: This option should be used when Source URL path is set to / to avoid redirect loop. Enable redirect for: Selects whether the redirect applies to SSL, non-SSL, or both types of websites. This is useful for enforcing SSL connections by redirecting all non-SSL traffic to the SSL version of a site.\nCreate the redirect: Click Create to finalize the setup. Your URL redirect is now active, and visitors to the source URL will be automatically redirected to the destination URL.\nBy following these steps, you can efficiently manage URL redirects in Virtualmin, ensuring users are navigated correctly and improving the overall user experience on your website.\n","permalink":"https://www.virtualmin.com/docs/server-components/how-to-manage-url-redirects/","summary":"\u003cp\u003eThis guide provides a comprehensive overview of setting up URL redirects in Virtualmin. Perfect for website administrators looking to redirect traffic from one URL to another.\u003c/p\u003e\n\u003ch3 id=\"how-to-set-up-url-redirects\"\u003eHow to set up URL redirects\u003c/h3\u003e\n\u003cp\u003eURL redirects are a crucial tool for guiding traffic to the right place on your website. Whether you\u0026rsquo;re redirecting old URLs to new ones or consolidating web pages, here\u0026rsquo;s how to manage URL redirects in Virtualmin:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSelect the domain\u003c/strong\u003e: After logging into Virtualmin, choose the domain where you wish to add a URL redirect. This can be done by selecting the domain name from the drop-down box in the top-left corner of the left menu.\u003c/p\u003e","title":"How to Manage URL Redirects"},{"content":"This guide simplifies the process of viewing website access and error logs in Virtualmin.\nHow to view website access and error logs Monitoring your website\u0026rsquo;s access and error logs is crucial for understanding traffic patterns and identifying potential issues. Virtualmin makes this process straightforward. Here\u0026rsquo;s how to do it:\nSelect the domain: Log into Virtualmin and choose the domain whose logs you want to view. Select the domain name from the drop-down box in the top-left corner of the left menu.\nNavigate to logs and reports: Click on Logs and Reports. This section is dedicated to various logs and reports related to your domain\u0026rsquo;s performance and activities.\nAccess Apache access log: To view the access log, which contains records of all requests made to your website (like page or image requests), click on Apache Access Log. This log is helpful for understanding your website\u0026rsquo;s traffic and user behavior.\nAccess Apache error log: For the error log, which records errors encountered by the server (such as file not found errors or script issues), click on Apache Error Log. Reviewing this log is essential for troubleshooting and resolving issues on your website.\nBy following these steps, you can effectively monitor both the access and error logs for your website in Virtualmin, helping you stay informed about its performance and quickly address any problems.\n","permalink":"https://www.virtualmin.com/docs/server-components/how-to-view-website-logs/","summary":"\u003cp\u003eThis guide simplifies the process of viewing website access and error logs in Virtualmin.\u003c/p\u003e\n\u003ch3 id=\"how-to-view-website-access-and-error-logs\"\u003eHow to view website access and error logs\u003c/h3\u003e\n\u003cp\u003eMonitoring your website\u0026rsquo;s access and error logs is crucial for understanding traffic patterns and identifying potential issues. Virtualmin makes this process straightforward. Here\u0026rsquo;s how to do it:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSelect the domain\u003c/strong\u003e: Log into Virtualmin and choose the domain whose logs you want to view. Select the domain name from the drop-down box in the top-left corner of the left menu.\u003c/p\u003e","title":"How to View Website Access and Error Logs"},{"content":"This guide streamlines the process of adding SSL certificates, whether free or commercial, to your Virtualmin-hosted domains, making it easier to secure your website and meet various needs.\nNotes Self-signed certificate: Initially, a self-signed certificate is created by Virtualmin, which can trigger security warnings in a browser. This is normal and expected behavior. It doesn\u0026rsquo;t make your website any less secure, but it is recommended to replace the self-signed certificate with a valid SSL certificate as soon as possible. No dedicated IP needed: Modern SSL setups don\u0026rsquo;t require a dedicated IP per domain. Adding a free ACME-compatible SSL certificate Log into Virtualmin: Access your Virtualmin panel with your administrator credentials. Select domain: From the navigation menu, choose the domain to secure. Navigate to SSL options: Go to Manage Virtual Server ⇾ Setup SSL Certificate page for this domain. Switch to SSL Providers tab: Click on SSL Providers tab. Configure SSL provider options: Request certificate for: By default, Virtualmin will request a certificate for your main domain and any aliases. Make sure all the domain variations you want covered are listed in additional Domain names listed here text box. Wildcard certificate: Extra option Also request wildcard certificate is used to obtain certificates that cover all the subdomains associated with this server. Note: This option is available only if DNS is controlled by Virtualmin. SSL certificate provider: Choose Let’s Encrypt or another ACME-compatible provider. Note: Only Virtualmin Pro supports ACME-compatible providers beyond Let’s Encrypt, including ZeroSSL, Google Trust Services, Buypass, SSL.com, Sectigo, and others. Automatically renew certificate: It is recommended to enable automatic renewal of the SSL certificate. Free SSL certificates typically have a 90-day validity period. Certificate Hash Type: Choose between RSA and EC (Elliptic curve) options. RSA is widely compatible and traditionally used, while EC offers stronger security in a smaller key size, leading to potentially better performance. Check connectivity first: This feature performs preliminary checks to ensure that your domain is correctly set up and accessible over the internet before proceeding with the SSL certificate request to avoid reaching rate limits. Request certificate: Click Request Certificate. Virtualmin handles the rest. Verify installation: Visit https://yourdomain.com to check. Force HTTPS: Optionally, redirect HTTP to HTTPS in Web Configuration ⇾ Website Options page. Enabling SSL for hostname If needed, and if your hostname resolves correctly, enable Setup SSL certificate from provider for hostname on the System Settings ⇾ Virtualmin Configuration: SSL settings page. Save the changes, then re-run the configuration check to initiate SSL setup.\nTroubleshooting common issues Keep in mind that Virtualmin is designed to automatically handle SSL certificate requests and installations from any ACME-compatible provider. However, if there have been manual changes made to the configuration files or specific server settings, these could interfere with the process. If you encounter issues, consider the following points for troubleshooting:\nDNS: If SSL provider cannot verify your domain, ensure your DNS settings are correct and propagated. To obtain SSL certificates via DNS validation—including wildcard certificates—Virtualmin must manage your domain’s DNS zone. This is required to add the temporary DNS records necessary for the validation process. Verify DNS records: Ensure that both the A (IPv4) and AAAA (IPv6) DNS records for your domain are correctly pointing to your server\u0026rsquo;s IP addresses. These records should be configured with your domain registrar or DNS provider. Consistency between DNS and web server: IPv4 and IPv6 consistency: Make sure that both the IPv4 and IPv6 addresses in your DNS records match the IP addresses configured on your web server. Virtual Host configuration: In Virtualmin, check that your virtual host configuration for the domain includes settings for both IPv4 and IPv6 if applicable. This is often relevant for Apache or Nginx webservers. Check for propagation: After making any changes to DNS records, wait for them to propagate. This can take anywhere from a few minutes to 48 hours, depending on the TTL (Time To Live) settings of your DNS records. Check for HTTP to HTTPS redirection: Before requesting an SSL certificate, ensure that your server is not redirecting HTTP traffic to HTTPS for the domain in question. A provider needs to access a specific URL on your domain (e.g. http://yourdomain.com/.well-known/acme-challenge/) to verify domain ownership. If all traffic is redirected to HTTPS before the certificate is installed, this verification can fail.\nCorrect virtual host configuration: Make sure the Apache or Nginx virtual host for your domain is correctly configured and pointing to the right document root.\nIf you encounter any errors during the process, the error messages provided by Virtualmin are often helpful in diagnosing the issue. Be sure to check them if anything goes wrong.\nAdding a commercial SSL certificate Select domain: From the navigation menu, choose the domain to secure. Generate CSR: Go to Manage Virtual Server ⇾ Setup SSL Certificate page, choose Create Signing Request tab, and fill in the required details to generate a CSR. Obtain certificate: Use the CSR to acquire an SSL certificate from a certificate authority. Install certificate: Set up issued SSL certificate in Update Certificate and Key tab. CA bundle: Optionally, install any provided CA bundle or intermediate certificate. Verify installation: Visit https://yourdomain.com to check. Reverting to default self-signed SSL certificate on failure If Webmin’s webserver (miniserv) fails to start due to SSL errors, you can reset it to use its default self-signed SSL certificate:\nOpen /etc/webmin/miniserv.conf, and remove any outdated certificate entries starting with ipcert_ or ipkey_ for non-existent domains.\nIf the issue persists, revert to the default certificate by removing the certfile= and extracas= entries, and setting keyfile= to:\nkeyfile=/etc/webmin/miniserv.pem Save the file and restart Webmin by running:\nsystemctl restart webmin Webmin will now use the default SSL certificate, keeping the interface secure and accessible even if SSL renewal issues occur.\n","permalink":"https://www.virtualmin.com/docs/server-components/how-to-add-an-ssl-certificate/","summary":"\u003cp\u003eThis guide streamlines the process of adding SSL certificates, whether free or commercial, to your Virtualmin-hosted domains, making it easier to secure your website and meet various needs.\u003c/p\u003e\n\u003ch3 id=\"notes\"\u003eNotes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eSelf-signed certificate\u003c/strong\u003e: Initially, a self-signed certificate is created by Virtualmin, which can trigger security warnings in a browser. This is normal and expected behavior. It doesn\u0026rsquo;t make your website any less secure, but it is recommended to replace the self-signed certificate with a valid SSL certificate as soon as possible.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNo dedicated IP needed\u003c/strong\u003e: Modern SSL setups don\u0026rsquo;t require a dedicated IP per domain.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"adding-a-free-acme-compatible-ssl-certificate\"\u003eAdding a free ACME-compatible SSL certificate\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eLog into Virtualmin\u003c/strong\u003e: Access your Virtualmin panel with your administrator credentials.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSelect domain\u003c/strong\u003e: From the navigation menu, choose the domain to secure.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNavigate to SSL options\u003c/strong\u003e: Go to \u003cstrong\u003eManage Virtual Server ⇾ Setup SSL Certificate\u003c/strong\u003e page for this domain.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSwitch to SSL Providers tab\u003c/strong\u003e: Click on \u003cstrong\u003eSSL Providers\u003c/strong\u003e tab.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eConfigure SSL provider options\u003c/strong\u003e:\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRequest certificate for\u003c/strong\u003e: By default, Virtualmin will request a certificate for your main domain and any aliases. Make sure all the domain variations you want covered are listed in additional \u003cstrong\u003eDomain names listed here\u003c/strong\u003e text box.\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eWildcard certificate\u003c/strong\u003e: Extra option \u003cstrong\u003eAlso request wildcard certificate\u003c/strong\u003e is used to obtain certificates that cover all the subdomains associated with this server.\n\n   \n   \n   \n   \n         \u003cp class=\"text-note\"\u003e\n           \u003ci class=\"text-note-icon wm wm-fw wm-sm wm-exclamation\"\u003e\u003c/i\u003e \u003cspan class=\"text-note-title\"\u003eNote:\u003c/span\u003e\n           \u003cspan class=\"text-note-body\"\u003eThis option is available only if DNS is controlled by Virtualmin.\u003c/span\u003e\n         \u003c/p\u003e","title":"How to Add an SSL Certificate"},{"content":"By default, Virtualmin creates an SSL website record in the webserver configuration and automatically tries to request a Let’s Encrypt certificate when setting up a new virtual server.\nUse the steps below to either create HTTP-only site or keep SSL but disable ACME at creation time.\nHTTP-only website In UI\nGo to System Settings → Features and Plugins, find Apache SSL website, uncheck Default?, and save. On Create Virtual Server, leave Setup Apache SSL website unchecked.\nIn CLI\nOmit the --ssl flag:\nvirtualmin create-domain \\ --domain domain.tld \\ --pass \u0026#39;password-for-new-domain\u0026#39; \\ --unix --dir --webmin --web --logrotate Disable ACME during creation time In UI\nGo to System Settings → Server Templates, select your template, open SSL website for domain, set Request SSL certificate from provider at domain creation time to No, and save.\nIn CLI\nUse --acme-never with --ssl:\nvirtualmin create-domain \\ --domain domain.tld \\ --pass \u0026#39;password-for-new-domain\u0026#39; \\ --unix --dir --webmin --web --logrotate \\ --ssl --acme-never Notes Re-enabling Default? for Apache SSL website hides the checkbox again (SSL chained to non-SSL sites). After DNS is live, you can enable SSL and request Let’s Encrypt from Manage Virtual Server ⇾ Setup SSL Certificate page. ","permalink":"https://www.virtualmin.com/docs/server-components/disable-automatic-ssl-website-creation/","summary":"\u003cp\u003eBy default, Virtualmin creates an SSL website record in the webserver\nconfiguration and automatically tries to\nrequest a Let’s Encrypt certificate when setting up a new virtual server.\u003c/p\u003e\n\u003cp\u003eUse the steps below to either create \u003cstrong\u003eHTTP-only\u003c/strong\u003e site or keep SSL but\n\u003cstrong\u003edisable ACME\u003c/strong\u003e at creation time.\u003c/p\u003e\n\u003ch4 id=\"http-only-website\"\u003eHTTP-only website\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eIn UI\u003c/p\u003e\n\u003cp\u003eGo to \u003cstrong\u003eSystem Settings → Features and Plugins\u003c/strong\u003e, find \u003cstrong\u003eApache SSL website\u003c/strong\u003e,\nuncheck \u003cstrong\u003eDefault?\u003c/strong\u003e, and save. On \u003cstrong\u003eCreate Virtual Server\u003c/strong\u003e, leave \u003cstrong\u003eSetup\nApache SSL website\u003c/strong\u003e unchecked.\u003c/p\u003e","title":"Disable automatic SSL website creation"},{"content":"Document root directory The HTML content and PHP applications for your website are typically located in the public_html directory within the home directory of the virtual server. For instance, the website content for example.com would be in /home/example/public_html.\nSub-servers have their content within a sub-directory under their parent virtual server home. For example, sub.example.com would be in /home/example/domains/sub.example.com/public_html.\nCGI scripts CGI scripts are located in the cgi-bin directory within the virtual server home directory. For instance, CGI applications for example.com would be in /home/example/cgi-bin.\nDirectory listings differences When managing files on a Virtualmin server, it\u0026rsquo;s important to understand how directory listings can vary depending on the service used to access the server:\nSSH service\nSSH allows navigation through the entire filesystem, subject to user permissions. FTP service\nThe root directory shown in FTP/FTP with SFTP clients is often the user\u0026rsquo;s home directory, not the root of the entire filesystem. FTP/FTP with SFTP access might be restricted to specific directories, depending on the server configuration and user permissions. Uploading files There are multiple methods to upload content to your Virtualmin account:\nSSH, SCP, and SFTP (FTP over SSH) Virtualmin provides flexible options for secure file transfers:\nStandard SSH: Typically available on port 22 for secure shell access, SCP, and SFTP. FTP with SFTP: Configured to use port 2222, offering SFTP capabilities. Windows SCP clients pscp: A command-line SCP client related to PuTTY, a popular SSH client, can be downloaded from Putty\u0026rsquo;s official website. Usage example: C:\\\u0026gt; pscp.exe myfile.htm user@example.com:/home/user/public_html Windows, macOS, and Linux Graphical FTP Clients FileZilla: A versatile and free graphical FTP client that supports SFTP, FileZilla is available for Windows, macOS, and Linux. It can be downloaded from the Filezilla Project website.\nTo configure FileZilla, follow these steps: Download and install FileZilla. Open FileZilla and navigate to File ⇾ Site Manager. Click New Site and give it a name like example. For Protocol, choose SFTP - SSH File Transfer Protocol. In the Host box, enter example.com. Set Logon Type to Normal and fill in the User and Password fields with your Virtualmin account details. You can now connect and transfer files to and from your Virtualmin server. WinSCP (Windows Only): Another reliable option for FTP over SSH is WinSCP, available for Windows. Visit the WinSCP Home Page for more information and to download the client.\nAfter installation, enter your server, username, and password details to connect and manage files in your Virtualmin account. macOS and Linux SCP Clients scp: Both macOS and Linux include the scp command, part of the OpenSSH suite. Use it to securely transfer files to and from your Virtualmin server.\nExample usage: $ scp myfile.htm user@example.com:/home/user/public_html gftp (Linux only): A popular Gnome-based graphical FTP client that also supports SCP and SFTP. Available in most Linux distributions\u0026rsquo; repositories or on the gftp GitHub page.\nFTP and FTPS (FTP over TLS) Virtualmin also supports FTP and FTPS:\nFTP: The traditional unencrypted file transfer protocol, typically on port 21. FTP over TLS: Offers encrypted FTP (FTPS) over the same port 21, enhancing security for file transfers. Webmin File Manager For file management within the user interface, refer to the detailed documentation in the Webmin File Manager documentation.\n","permalink":"https://www.virtualmin.com/docs/server-components/uploading-and-editing-website-data/","summary":"\u003ch3 id=\"document-root-directory\"\u003eDocument root directory\u003c/h3\u003e\n\u003cp\u003eThe HTML content and PHP applications for your website are typically located in the \u003ccode\u003epublic_html\u003c/code\u003e directory within the home directory of the virtual server. For instance, the website content for \u003ccode\u003eexample.com\u003c/code\u003e would be in \u003ccode\u003e/home/example/public_html\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eSub-servers have their content within a sub-directory under their parent virtual server home. For example, \u003ccode\u003esub.example.com\u003c/code\u003e would be in \u003ccode\u003e/home/example/domains/sub.example.com/public_html\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"cgi-scripts\"\u003eCGI scripts\u003c/h4\u003e\n\u003cp\u003eCGI scripts are located in the \u003ccode\u003ecgi-bin\u003c/code\u003e directory within the virtual server home directory. For instance, CGI applications for \u003ccode\u003eexample.com\u003c/code\u003e would be in \u003ccode\u003e/home/example/cgi-bin\u003c/code\u003e.\u003c/p\u003e","title":"Uploading and Editing Website Data"},{"content":"Configure Roundcube as default webmail To use Roundcube instead of Usermin:\nInstall Roundcube: Choose a virtual server to host Roundcube. Install it using the Manage Web Apps feature. Setup webmail redirects: In Virtualmin, navigate to System Settings ⇾ Server Templates ⇾ Default Settings ⇾ Website for domain. Find URL for webmail redirect and set it to your Roundcube URL (e.g., https://company.com/roundcube). Update existing virtual servers: Disable existing webmail redirects: virtualmin modify-web --no-webmail --all-domains Re-enable with new settings: virtualmin modify-web --webmail --all-domains Now, accessing webmail.example.com for any domain on your server will redirect users to the Roundcube installation. ","permalink":"https://www.virtualmin.com/docs/server-components/setting-up-roundcube-as-default-webmail/","summary":"\u003ch3 id=\"configure-roundcube-as-default-webmail\"\u003eConfigure Roundcube as default webmail\u003c/h3\u003e\n\u003cp\u003eTo use Roundcube instead of Usermin:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eInstall Roundcube\u003c/strong\u003e: Choose a virtual server to host Roundcube. Install it using the \u003cstrong\u003eManage Web Apps\u003c/strong\u003e feature.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSetup webmail redirects\u003c/strong\u003e:\n\u003cul\u003e\n\u003cli\u003eIn Virtualmin, navigate to \u003cstrong\u003eSystem Settings ⇾ Server Templates ⇾ Default Settings ⇾ Website for domain\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003eFind \u003cstrong\u003eURL for webmail redirect\u003c/strong\u003e and set it to your Roundcube URL (e.g., \u003ccode\u003ehttps://company.com/roundcube\u003c/code\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUpdate existing virtual servers\u003c/strong\u003e:\n\u003cul\u003e\n\u003cli\u003eDisable existing webmail redirects:\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin modify-web --no-webmail --all-domains\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003eRe-enable with new settings:\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin modify-web --webmail --all-domains\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003eNow, accessing \u003ccode\u003ewebmail.example.com\u003c/code\u003e for any domain on your server will redirect users to the Roundcube installation.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e","title":"Setting Up Roundcube as Default Webmail"},{"content":"Overview Nginx is a high-performance web server known for its speed and efficiency, particularly well-suited for sites with high static content or environments with limited memory. For more details on Nginx, visit the Nginx Wiki.\nUsing Nginx Once Nginx support is configured, you can manage virtual servers similar to Apache:\nVirtual server creation: When creating a new virtual server, select Nginx website enabled under Enabled features, instead of Apache website enabled. CLI API: Use --virtualmin-nginx flag instead of --web for non-SSL websites and --virtualmin-nginx-ssl instead of --ssl for SSL-enabled sites. Remote API: Use the virtualmin-nginx= parameter instead of web=. Configuring Nginx support in Virtualmin Clean installation as LEMP stack Automated installation: During Virtualmin installation, use the --bundle LEMP option with the virtualmin-install.sh script. This sets up a LEMP (Linux, Nginx, MariaDB, PHP) stack. For more information, see the LAMP vs. LEMP documentation. Manual webserver switch Warning!\nManual switching requires advanced configuration and is typically not recommended for most users because of its technical complexity. Manual switch from Apache to Nginx Disable Apache: Disable Apache. Debian and derivatives systemctl disable --now apache2 EL systems systemctl disable --now httpd Disable Apache website feature for all existing virtual servers virtualmin disable-feature --all-domains --web --ssl --status --virtualmin-awstats Note: Dependent features such as status and virtualmin-awstats must also be disabled, as they rely on the webserver feature. Depending on your setup, there may be others. Adjust the command flags as needed. Disable Apache and dependent Virtualmin global features virtualmin set-global-feature --disable-feature web --disable-feature ssl --disable-feature virtualmin-htpasswd Note: Dependent features such as virtualmin-htpasswd must also be disabled, as they rely on the webserver feature. Install Nginx and dependencies: Install Nginx and Nginx Virtualmin modules from your repository. Debian and derivatives apt-get install nginx-full webmin-virtualmin-nginx webmin-virtualmin-nginx-ssl EL systems dnf install nginx webmin-virtualmin-nginx webmin-virtualmin-nginx-ssl Configure Virtualmin for Nginx virtualmin-config-system --include Nginx Enable Nginx as Virtualmin global feature virtualmin set-global-feature --enable-feature virtualmin-nginx --enable-feature virtualmin-nginx-ssl Note: Dependent features such as virtualmin-htpasswd should also be re-enabled if they were previously enabled and needed. Enable Nginx website feature for all existing virtual servers virtualmin enable-feature --all-domains --virtualmin-nginx --virtualmin-nginx-ssl Note: You may also need to re-enable other features that were disabled in step 2, depending on your configuration. Switching from Nginx to Apache Disable Nginx: Disable Nginx. EL systems and Debian derivatives systemctl disable --now nginx Disable Nginx website feature for all existing virtual servers virtualmin disable-feature --all-domains --virtualmin-nginx --virtualmin-nginx-ssl --status --virtualmin-awstats Note: Dependent features such as status and virtualmin-awstats must also be disabled, as they rely on the webserver feature. Depending on your setup, there may be others. Adjust the command flags as needed. Disable Nginx and dependent Virtualmin global features virtualmin set-global-feature --disable-feature virtualmin-nginx --disable-feature virtualmin-nginx-ssl --disable-feature virtualmin-htpasswd Note: Dependent features such as virtualmin-htpasswd must also be disabled, as they rely on the webserver feature. Install Apache: Install the Apache package along with necessary modules. Debian and derivatives apt-get install apache2 libapache2-mod-fcgid apache2-suexec-custom EL systems dnf install httpd mod_fcgid mod_ssl mod_http2 Configure Virtualmin for Apache virtualmin-config-system --include Apache Enable Apache as Virtualmin global feature virtualmin set-global-feature --enable-feature web --enable-feature ssl Note: Dependent features such as virtualmin-htpasswd should also be re-enabled if they were previously enabled and needed. Enable Apache website feature for all existing virtual servers virtualmin enable-feature --all-domains --web --ssl Note: You may also need to re-enable other features that were disabled in step 2, depending on your configuration. ","permalink":"https://www.virtualmin.com/docs/server-components/configuring-nginx-as-default-webserver/","summary":"\u003ch3 id=\"overview\"\u003eOverview\u003c/h3\u003e\n\u003cp\u003eNginx is a high-performance web server known for its speed and efficiency, particularly well-suited for sites with high static content or environments with limited memory. For more details on Nginx, visit the \u003ca href=\"https://www.nginx.com/resources/wiki/\"\u003eNginx Wiki\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"using-nginx\"\u003eUsing Nginx\u003c/h3\u003e\n\u003cp\u003eOnce Nginx support is configured, you can manage virtual servers similar to Apache:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eVirtual server creation\u003c/strong\u003e: When creating a new virtual server, select \u003cstrong\u003eNginx website enabled\u003c/strong\u003e under \u003cstrong\u003eEnabled features\u003c/strong\u003e, instead of \u003cstrong\u003eApache website enabled\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCLI API\u003c/strong\u003e: Use \u003ccode\u003e--virtualmin-nginx\u003c/code\u003e flag instead of \u003ccode\u003e--web\u003c/code\u003e for non-SSL websites and \u003ccode\u003e--virtualmin-nginx-ssl\u003c/code\u003e instead of \u003ccode\u003e--ssl\u003c/code\u003e for SSL-enabled sites.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRemote API\u003c/strong\u003e: Use the \u003ccode\u003evirtualmin-nginx=\u003c/code\u003e parameter instead of \u003ccode\u003eweb=\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"configuring-nginx-support-in-virtualmin\"\u003eConfiguring Nginx support in Virtualmin\u003c/h3\u003e\n\u003ch4 id=\"clean-installation-as-lemp-stack\"\u003eClean installation as LEMP stack\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eAutomated installation\u003c/strong\u003e: During Virtualmin installation, use the \u003ccode\u003e--bundle LEMP\u003c/code\u003e option with the \u003ccode\u003evirtualmin-install.sh\u003c/code\u003e script. This sets up a LEMP (Linux, Nginx, MariaDB, PHP) stack. For more information, see the \u003ca href=\"/docs/installation/automated/#lamp-apache-vs-lemp-nginx\"\u003eLAMP vs. LEMP documentation\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"manual-webserver-switch\"\u003eManual webserver switch\u003c/h4\u003e\n\n\n\n\n\n      \u003cdiv class=\"alert alert-warning\"\u003e\n        \u003ci class=\"wm wm-fw wm-sm wm-exclamation\"\u003e\u003c/i\u003e \u003cstrong\u003eWarning!\u003c/strong\u003e\u003cbr\u003e\n        Manual switching requires advanced configuration and is typically not recommended for most users because of its technical complexity.\n      \u003c/div\u003e\n\n\n\u003ch5 id=\"manual-switch-from-apache-to-nginx\"\u003eManual switch from Apache to Nginx\u003c/h5\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eDisable Apache\u003c/strong\u003e: Disable Apache.\n\u003cul\u003e\n\u003cli\u003eDebian and derivatives\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esystemctl disable --now apache2\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003eEL systems\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esystemctl disable --now httpd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDisable Apache website feature for all existing virtual servers\u003c/strong\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin disable-feature --all-domains --web --ssl --status --virtualmin-awstats\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n      \n      \n      \n      \n            \u003cp class=\"text-note\"\u003e\n              \u003ci class=\"text-note-icon wm wm-fw wm-sm wm-notification\"\u003e\u003c/i\u003e \u003cspan class=\"text-note-title\"\u003eNote:\u003c/span\u003e\n              \u003cspan class=\"text-note-body\"\u003eDependent features such as \u003ccode\u003estatus\u003c/code\u003e and \u003ccode\u003evirtualmin-awstats\u003c/code\u003e must also be disabled, as they rely on the webserver feature. Depending on your setup, there may be others. Adjust the command flags as needed.\u003c/span\u003e\n            \u003c/p\u003e","title":"Configuring Nginx as Default Webserver"},{"content":"Virtualmin offers a robust application deployment stack for PHP, supporting multiple PHP versions. The recommended and default execution mode for PHP is PHP-FPM (FastCGI Process Manager), which provides improved performance, stability, and resource management for PHP applications.\nPHP execution modes Virtualmin configures PHP applications to execute with user-level isolation by utilizing FPM (PHP-FPM) and FCGId/CGI wrapper (suEXEC) execution modes:\nThis architecture replaces the need for mod_php. PHP-FPM allows for PHP scripts to run as long-lived processes, which significantly reduces overhead and improves performance, bringing it on par with the speed of mod_php while maintaining a high level of security.\nRecommended PHP execution mode PHP-FPM is recommended for executing PHP scripts due to its improved isolation, which provides separate process pools for each website, enhancing security in shared hosting environments. It offers superior performance and scalability, efficiently handling high loads and dynamically adjusting resources to match website demands. PHP-FPM\u0026rsquo;s advanced features include adaptive process spawning and emergency restarts, alongside flexible configuration options for resource limits and PHP settings on a per-website basis. It is compatible with both Apache and Nginx webservers, adding to its versatility, and its ease of use is augmented by Virtualmin, which simplifies its setup and management.\nPrecautions regarding mod_php When managing multiple PHP versions in Virtualmin, it\u0026rsquo;s crucial to understand the implications of installing mod_php:\nAvoid mod_php: This Apache module embeds PHP directly into the server. It poses significant security risks, especially in shared environments. mod_php doesn\u0026rsquo;t isolate scripts between different sites, potentially allowing one site to affect others on the same server.\nIdentifying mod_php installation\nIn Debian and derivatives, mod_php is typically part of packages like libapache2-mod-php (or other version numbers like libapache2-mod-php8.3). In EL systems, look for packages named php, php83-php or similar, depending on the PHP version. Uninstalling mod_php To remove mod_php and avoid numerous issues, you can uninstall it using your package manager.\nFor Debian and derivatives apt-get remove libapache2-mod-php* For EL systems dnf remove $(dnf list installed | awk -F. \u0026#39;{print $1}\u0026#39; | grep -E \u0026#39;^php$|^php[0-9]+-php$\u0026#39;) After uninstallation, restart Apache to apply the changes.\nIndividual PHP configuration A significant advantage of running PHP in either PHP-FPM or FCGId/CGI wrapper execution mode is that it allows each virtual server to have its unique configuration. This setup provides the flexibility to customize the PHP environment according to the specific requirements of individual applications.\nFor PHP-FPM, individual pool configurations for virtual servers are typically found in the /etc/php-fpm.d directory. These pools are specific to the PHP-FPM mode and facilitate the management of different PHP configurations for each virtual server separately.\nOn the other hand, in FCGId/CGI wrapper modes, the php.ini files, which are located under virtual server home, i.e. in the ~/etc/php directory, allow for distinct PHP configurations.\nThese settings can either be adjusted under the Web Configuration menu for each domain and even can be directly modified using a text editor:\nNote: Changes to the system-wide /etc/php.ini will not affect the php.ini of individual virtual servers. To make system-wide changes, you may consider using the /etc/php.d directory, where files are automatically included by PHP. Adding a new .ini file in this directory with your directives can propagate changes across all PHP versions. Updating PHP configurations Updates to PHP configurations across multiple virtual servers can be done using mass update feature from List Virtual Servers page (available only in Virtualmin Professional) or using Virtualmin CLI.\nFor example, to increase the memory_limit for all domains to 256M, the following command can be executed:\nvirtualmin modify-php-ini --all-domains --ini-name memory_limit --ini-value 256M Default PHP version When creating new virtual servers, you can choose a default PHP execution mode and version by adjusting the server template settings in System Settings ⇾ Server Templates ⇾ PHP Options page.\nFor deprecated versions such as PHP 7.4, it is highly recommended to upgrade to a supported version to ensure the security and performance of your PHP applications.\n","permalink":"https://www.virtualmin.com/docs/server-components/php-execution-modes/","summary":"\u003cp\u003eVirtualmin offers a robust application deployment stack for PHP, supporting \u003ca href=\"/docs/web/configuring-multiple-php-versions/\"\u003emultiple PHP versions\u003c/a\u003e. The recommended and default execution mode for PHP is PHP-FPM (FastCGI Process Manager), which provides improved performance, stability, and resource management for PHP applications.\u003c/p\u003e\n\u003ch3 id=\"php-execution-modes\"\u003ePHP execution modes\u003c/h3\u003e\n\u003cp\u003eVirtualmin configures PHP applications to execute with user-level isolation by utilizing FPM (PHP-FPM) and FCGId/CGI wrapper (suEXEC) execution modes:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/images/docs/screenshots/light/php-options.png\"\u003e\n\n\n\n\u003cimg loading=\"lazy\" src=\"/images/docs/screenshots/light/php-options.png\" alt=\"\"  title=\"PHP Options Screenshot\"  style=\"aspect-ratio: 2304 / 1026;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis architecture replaces the need for \u003ccode\u003emod_php\u003c/code\u003e. PHP-FPM allows for PHP scripts to run as long-lived processes, which significantly reduces overhead and improves performance, bringing it on par with the speed of \u003ccode\u003emod_php\u003c/code\u003e while maintaining a high level of security.\u003c/p\u003e","title":"PHP Execution Modes"},{"content":"Virtualmin allows the selection of different PHP versions and execution modes for each domain. The recommended execution mode is FPM, but CGI/FCGId is also available, enabling per-directory PHP version settings.\nInstalling additional PHP versions On RHEL, Alma, Rocky, Oracle, CentOS Stream and Fedora Linux Install Remi repository . /etc/os-release \u0026amp;\u0026amp; repo_dir=$([ \u0026#34;$ID\u0026#34; = \u0026#34;fedora\u0026#34; ] \u0026amp;\u0026amp; echo \u0026#34;fedora\u0026#34; || echo \u0026#34;enterprise\u0026#34;) \u0026amp;\u0026amp; sudo dnf -y install \u0026#34;https://rpms.remirepo.net/$repo_dir/remi-release-$(rpm -E %$ID).rpm\u0026#34; \u0026amp;\u0026amp; sudo dnf clean all Install PHP packages sudo dnf install php81-php-{cli,fpm,pdo,gd,mbstring,mysqlnd,opcache,curl,xml,zip} Replace php81 with the desired PHP version, e.g., php83. Check available PHP versions and extensions in the Remi Repository or use dnf search php. On Debian Enable Sury/PHP repository sudo apt-get -y install apt-transport-https lsb-release ca-certificates curl \u0026amp;\u0026amp; sudo curl -sSL -o /usr/share/keyrings/debsuryorg-archive-keyring.gpg https://packages.sury.org/php/apt.gpg \u0026amp;\u0026amp; sudo sh -c \u0026#39;echo \u0026#34;deb [signed-by=/usr/share/keyrings/debsuryorg-archive-keyring.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main\u0026#34; \u0026gt; /etc/apt/sources.list.d/sury-debian-php-$(lsb_release -sc).list\u0026#39; \u0026amp;\u0026amp; sudo apt-get update Install PHP packages sudo apt-get install php8.1-{cgi,cli,fpm,pdo,gd,mbstring,mysqlnd,opcache,curl,xml,zip} Replace php8.1 with the desired version, e.g., php8.3. Check available PHP versions and extensions on the SURY website or via apt-cache search --names-only ^php. On Ubuntu Enable Ondrej/PHP repository sudo env LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php \u0026amp;\u0026amp; sudo apt-get update Install PHP packages sudo apt-get install php8.1-{cgi,cli,fpm,pdo,gd,mbstring,mysqlnd,opcache,curl,xml,zip} Replace php8.1 with the specific version, e.g., php8.3. Check available PHP versions and extensions on the Ondrej PPA website or via apt-cache search --names-only ^php. Installing additional PHP extensions In order to add additional PHP extensions, for all PHP versions installed on the system, use the following command:\nDebian and derivatives for php in $(ls /etc/php); do sudo apt-get install -y \u0026#34;php$php-\u0026#34;{curl,intl}; done EL systems for php in $(scl list-collections 2\u0026gt;/dev/null | grep \u0026#39;php\u0026#39; | sed \u0026#39;s/$/-php/\u0026#39;) php; do for ext in curl intl; do sudo dnf -y install \u0026#34;${php}-${ext}\u0026#34;; done; done A command above will install the curl and intl extensions for all PHP versions installed on the system. You can replace the names of the extensions with the ones you need to have installed.\nConfiguring default PHP version After installing another PHP version:\nVerify in Virtualmin: Log in, go to System Settings ⇾ Re-Check Configuration. Among other information, you should see available PHP versions and execution modes.\nSet default PHP version: Configure the default version for new virtual servers in System Settings ⇾ Server Templates ⇾ PHP Options page. For specific virtual server, set the PHP version in Web Configuration ⇾ PHP Options page.\n","permalink":"https://www.virtualmin.com/docs/server-components/configuring-multiple-php-versions/","summary":"\u003cp\u003eVirtualmin allows the selection of different PHP versions and execution modes for each domain. The recommended execution mode is FPM, but CGI/FCGId is also available, enabling per-directory PHP version settings.\u003c/p\u003e\n\u003ch3 id=\"installing-additional-php-versions\"\u003eInstalling additional PHP versions\u003c/h3\u003e\n\u003ch4 id=\"on-rhel-alma-rocky-oracle-centos-stream-and-fedora-linux\"\u003eOn RHEL, Alma, Rocky, Oracle, CentOS Stream and Fedora Linux\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eInstall Remi repository\u003c/strong\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e. /etc/os-release \u0026amp;\u0026amp; repo_dir=$([ \u0026#34;$ID\u0026#34; = \u0026#34;fedora\u0026#34; ] \u0026amp;\u0026amp; echo \u0026#34;fedora\u0026#34; || echo \u0026#34;enterprise\u0026#34;) \u0026amp;\u0026amp; sudo dnf -y install \u0026#34;https://rpms.remirepo.net/$repo_dir/remi-release-$(rpm -E %$ID).rpm\u0026#34; \u0026amp;\u0026amp; sudo dnf clean all\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eInstall PHP packages\u003c/strong\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo dnf install php81-php-{cli,fpm,pdo,gd,mbstring,mysqlnd,opcache,curl,xml,zip}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eReplace \u003ccode\u003ephp81\u003c/code\u003e with the desired PHP version, e.g., \u003ccode\u003ephp83\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eCheck available PHP versions and extensions in the \u003ca href=\"https://rpms.remirepo.net/\"\u003eRemi Repository\u003c/a\u003e or use \u003ccode\u003ednf search php\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"on-debian\"\u003eOn Debian\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eEnable Sury/PHP repository\u003c/strong\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo apt-get -y install apt-transport-https lsb-release ca-certificates curl \u0026amp;\u0026amp; sudo curl -sSL -o /usr/share/keyrings/debsuryorg-archive-keyring.gpg https://packages.sury.org/php/apt.gpg \u0026amp;\u0026amp; sudo sh -c \u0026#39;echo \u0026#34;deb [signed-by=/usr/share/keyrings/debsuryorg-archive-keyring.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main\u0026#34; \u0026gt; /etc/apt/sources.list.d/sury-debian-php-$(lsb_release -sc).list\u0026#39; \u0026amp;\u0026amp; sudo apt-get update\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eInstall PHP packages\u003c/strong\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo apt-get install php8.1-{cgi,cli,fpm,pdo,gd,mbstring,mysqlnd,opcache,curl,xml,zip}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eReplace \u003ccode\u003ephp8.1\u003c/code\u003e with the desired version, e.g., \u003ccode\u003ephp8.3\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eCheck available PHP versions and extensions on the \u003ca href=\"https://deb.sury.org/#php-packages\"\u003eSURY website\u003c/a\u003e or via \u003ccode\u003eapt-cache search --names-only ^php\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"on-ubuntu\"\u003eOn Ubuntu\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eEnable Ondrej/PHP repository\u003c/strong\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo env LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php \u0026amp;\u0026amp; sudo apt-get update\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eInstall PHP packages\u003c/strong\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo apt-get install php8.1-{cgi,cli,fpm,pdo,gd,mbstring,mysqlnd,opcache,curl,xml,zip}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eReplace \u003ccode\u003ephp8.1\u003c/code\u003e with the specific version, e.g., \u003ccode\u003ephp8.3\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eCheck available PHP versions and extensions on the \u003ca href=\"https://launchpad.net/~ondrej/+archive/ubuntu/php\"\u003eOndrej PPA website\u003c/a\u003e or via \u003ccode\u003eapt-cache search --names-only ^php\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"installing-additional-php-extensions\"\u003eInstalling additional PHP extensions\u003c/h3\u003e\n\u003cp\u003eIn order to add additional PHP extensions, for all PHP versions installed on the system, use the following command:\u003c/p\u003e","title":"Configuring Multiple PHP Versions"},{"content":"After setting up a virtual server in Virtualmin, a default landing page is automatically generated. This page serves as an indicator of the website\u0026rsquo;s status and provides insights into the server\u0026rsquo;s overall configuration.\nWarning!\nAny concerns about account status or disabled sites should be directed to the hosting provider. Virtualmin is a server control panel tool and does not directly serve web pages; it facilitates website management. Types of default landing pages Enabled page Indicates that the virtual server or website is active and correctly configured. The domain name displayed should match the one used in the URL. If there\u0026rsquo;s a discrepancy, it may suggest a configuration error. Disabled page Virtualmin enables administrators to disable virtual servers for various reasons. When disabled, the default page will reflect this status, offering clarity to both administrators and visitors. Host default page This page is a confirmation that the webserver is running. It appears after setting up the host\u0026rsquo;s default domain in Virtualmin. If this page appears in a production environment and the domain in the URL doesn\u0026rsquo;t match the one displayed, it could indicate a problem with the webserver\u0026rsquo;s configuration. Customizing default landing page The /etc/skel directory is used by Virtualmin to initialize the home directory of new virtual servers. It contains files and directories that are automatically copied over when a new server is created.\nCustomizing the landing page:\nTo change the default landing page for new virtual servers, you can place a custom index.html file within the public_html directory inside /etc/skel. For example, creating /etc/skel/public_html/index.html with your desired content will ensure that this page is used as the default landing page for all newly created servers. Effectiveness: This method allows for a standardized and personalized initial web page, reflecting either branding or specific messaging appropriate for your environment.\nTroubleshooting guidelines Domain match: Ensure that the domain name mentioned on the default page matches the domain name used in the URL. A mismatch might hint at a misconfiguration. Verify that the IP address for the webserver and DNS are correctly configured. If IPv6 is enabled, ensure that both IPv4 and IPv6 addresses are configured correctly and consistently for both the webserver and DNS.\nDomain propagation: If you\u0026rsquo;ve recently set up or moved your domain, ensure that it has fully propagated. Domain propagation can take anywhere from a few hours to 48 hours. Make sure that the DNS settings are correctly pointing to your server. Misconfigured DNS can lead to issues in reaching the intended website.\nWebserver logs: Consult server logs for any errors or hints regarding the misconfiguration. They can provide detailed insights into what might be going wrong.\nShould you continue to face issues, consider reaching out to Virtualmin support community or your hosting provider for more specialized assistance.\n","permalink":"https://www.virtualmin.com/docs/server-components/website-default-page/","summary":"\u003cp\u003eAfter setting up a virtual server in Virtualmin, a default landing page is automatically generated. This page serves as an indicator of the website\u0026rsquo;s status and provides insights into the server\u0026rsquo;s overall configuration.\u003c/p\u003e\n\n\n\n\n\n      \u003cdiv class=\"alert alert-warning\"\u003e\n        \u003ci class=\"wm wm-fw wm-sm wm-exclamation\"\u003e\u003c/i\u003e \u003cstrong\u003eWarning!\u003c/strong\u003e\u003cbr\u003e\n        Any concerns about account status or disabled sites should be directed to the hosting provider. Virtualmin is a server control panel tool and does not directly serve web pages; it facilitates website management.\n      \u003c/div\u003e\n\n\n\u003ch4 id=\"types-of-default-landing-pages\"\u003eTypes of default landing pages\u003c/h4\u003e\n\u003ch5 id=\"enabled-page\"\u003eEnabled page\u003c/h5\u003e\n\u003cul\u003e\n\u003cli\u003eIndicates that the virtual server or website is active and correctly configured.\u003c/li\u003e\n\u003cli\u003eThe domain name displayed should match the one used in the URL. If there\u0026rsquo;s a discrepancy, it may suggest a configuration error.\n\u003ca href=\"/images/docs/screenshots/light/default-website-enabled.png\"\u003e\n\n\n\n\u003cimg loading=\"lazy\" src=\"/images/docs/screenshots/light/default-website-enabled.png\" alt=\"\"  title=\"Default Website Enabled Page Screenshot\"  style=\"aspect-ratio: 1754 / 1554;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch5 id=\"disabled-page\"\u003eDisabled page\u003c/h5\u003e\n\u003cul\u003e\n\u003cli\u003eVirtualmin enables administrators to disable virtual servers for various reasons.\u003c/li\u003e\n\u003cli\u003eWhen disabled, the default page will reflect this status, offering clarity to both administrators and visitors.\n\u003ca href=\"/images/docs/screenshots/light/default-website-disabled.png\"\u003e\n\n\n\n\u003cimg loading=\"lazy\" src=\"/images/docs/screenshots/light/default-website-disabled.png\" alt=\"\"  title=\"Default Website Disabled Page Screenshot\"  style=\"aspect-ratio: 1754 / 1358;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch5 id=\"host-default-page\"\u003eHost default page\u003c/h5\u003e\n\u003cul\u003e\n\u003cli\u003eThis page is a confirmation that the webserver is running.\u003c/li\u003e\n\u003cli\u003eIt appears after setting up the host\u0026rsquo;s default domain in Virtualmin.\u003c/li\u003e\n\u003cli\u003eIf this page appears in a production environment and the domain in the URL doesn\u0026rsquo;t match the one displayed, it could indicate a problem with the webserver\u0026rsquo;s configuration.\n\u003ca href=\"/images/docs/screenshots/light/host-default-website.png\"\u003e\n\n\n\n\u003cimg loading=\"lazy\" src=\"/images/docs/screenshots/light/host-default-website.png\" alt=\"\"  title=\"Default Website Enabled Page Screenshot\"  style=\"aspect-ratio: 1754 / 1504;\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"customizing-default-landing-page\"\u003eCustomizing default landing page\u003c/h4\u003e\n\u003cp\u003eThe \u003ccode\u003e/etc/skel\u003c/code\u003e directory is used by Virtualmin to initialize the home directory of new virtual servers. It contains files and directories that are automatically copied over when a new server is created.\u003c/p\u003e","title":"Website Default Page"},{"content":"Web server configuration Troubleshooting web server issues involves checking various elements, from configuration settings to log files. Common problems are not always evident as errors in error_log, so a comprehensive approach is needed.\nWebserver logs The first step in troubleshooting is to examine the log files. Each virtual server or sub-server in Virtualmin has its own log files located in /home/example/logs (replace example with your server name). The error_log is typically the most informative, but access_log may also provide useful insights.\nThe wrong site shows up If visiting a domain on your server shows incorrect content, it could be due to an IP address mismatch:\nCheck Server IP Addresses:\nUse ip addr to list the IP addresses on your server. Review Apache configuration:\nCheck the VirtualHost settings in Apache configuration: grep -i \u0026#39;virtualhost\u0026#39; /etc/apache2/sites-enabled/*.conf 2\u0026gt;/dev/null || grep -i \u0026#39;virtualhost\u0026#39; /etc/httpd/conf/httpd.conf 2\u0026gt;/dev/null Ensure that the IP addresses listed match those from ip addr. Verify that each VirtualHost block lists an IP address, not an asterisk (i.e. *). Restart Apache:\nFor EL systems: systemctl restart httpd. For Debian and derivatives: systemctl restart apache2. Virtualmin configuration settings Review Virtualmin settings to ensure new records are correctly created:\nNetwork settings\nSystem Settings ⇾ Virtualmin Configuration ⇾ Network settings: Can be opened from the navigation menu. Network interface for virtual addresses: Should typically be the primary IP address of your server (commonly enp0s5 or eth0). Default virtual server IPv4/IPv6 address: Recommended to leave as From Network Interface. Default IP address for DNS records: Set to Automatically detect external address if behind a NAT router. Defaults for new domains\nSystem Settings ⇾ Virtualmin Configuration ⇾ Defaults for new domains: Can be opened from the navigation menu. Address format for Apache virtual hosts: Use Always use * for dynamic IPs, otherwise Always use IP. Default is set to Decide automatically. Internal server error Specifically, 500 Internal Server Errors is common error often does not provide clear messages in error_log. Key areas to check:\nPermissions: Scripts with permissions set too loosely (e.g., 777) won\u0026rsquo;t execute in a suEXEC environment. Correct permissions are 750 or less. Script bugs: Check for syntax errors or compatibility issues with PHP. Test syntax: php -l scriptname.php. File ownership: Ensure files are owned by the domain owner. Incorrect ownership can lead to access issues for the suEXEC process. Correct ownership: chown -R domainname:domainname scriptdirectory. Previewing websites before DNS updates Previewing within Virtualmin Virtualmin provides a convenient way to preview a site before DNS records are fully propagated. To do this:\nLog into Virtualmin. Navigate to Web Configuration ⇾ Preview Website. Virtualmin will retrieve and display the website within the control panel, allowing you to navigate and interact with it. Using an alias for preview A recommended approach is to set up an alias so that users can access their site through a URL like https://username.example.com. To configure this:\nGo to System Settings ⇾ Server Templates ⇾ Default Template ⇾ Virtual Server Creation. In the Automatically create alias domain field, add your primary domain. This setting ensures that every new virtual server created will have an alias domain that customers can use before DNS points to your server. Discouraging UserDir feature Virtualmin strongly discourages the use of the Apache UserDir feature (i.e. https://www.example.com/~username) due to potential security issues, particularly in shared hosting environments. For those who still wish to explore this option, refer to the relative Apache documentation.\n","permalink":"https://www.virtualmin.com/docs/server-components/troubleshooting-websites/","summary":"\u003ch3 id=\"web-server-configuration\"\u003eWeb server configuration\u003c/h3\u003e\n\u003cp\u003eTroubleshooting web server issues involves checking various elements, from configuration settings to log files. Common problems are not always evident as errors in \u003ccode\u003eerror_log\u003c/code\u003e, so a comprehensive approach is needed.\u003c/p\u003e\n\u003ch4 id=\"webserver-logs\"\u003eWebserver logs\u003c/h4\u003e\n\u003cp\u003eThe first step in troubleshooting is to examine the log files. Each virtual server or sub-server in Virtualmin has its own log files located in \u003ccode\u003e/home/example/logs\u003c/code\u003e (replace \u003ccode\u003eexample\u003c/code\u003e with your server name). The \u003ccode\u003eerror_log\u003c/code\u003e is typically the most informative, but \u003ccode\u003eaccess_log\u003c/code\u003e may also provide useful insights.\u003c/p\u003e","title":"Troubleshooting Websites"},{"content":"This guide offers a straightforward approach to creating an FTP account for a virtual server in Virtualmin.\nHow to create an FTP account Creating an FTP account in Virtualmin is a simple task that allows users to manage files on a server. Here’s how to set one up:\nSelect the domain\nLog into Virtualmin and choose the domain for which you want to create an FTP account. Select the domain name from the drop-down box located in the top-left corner of the left menu.\nNavigate to user management\nClick on Edit Users. This option is for managing and adding users to your domain.\nAdd an FTP user\nClick on Add FTP user button which will open a new page containing the form for creating a new FTP account.\nEnter account details\nUsername: Enter the username for the FTP account. This username must be unique within the domain. Password: Choose a secure password or use Virtualmin’s auto-generated one. Home directory: By default, the home directory is set to the domain\u0026rsquo;s base web directory. You can change this to a sub-directory to restrict the user\u0026rsquo;s access to only that directory. Ensure that your FTP server is configured to restrict clients to their home directories. Create the account\nClick Create to finalize the creation of the new FTP account.\nOnce created, this FTP account can be used to upload, download, and manage files on the server for the specified domain.\n","permalink":"https://www.virtualmin.com/docs/server-components/how-to-create-ftp-account/","summary":"\u003cp\u003eThis guide offers a straightforward approach to creating an FTP account for a virtual server in Virtualmin.\u003c/p\u003e\n\u003ch3 id=\"how-to-create-an-ftp-account\"\u003eHow to create an FTP account\u003c/h3\u003e\n\u003cp\u003eCreating an FTP account in Virtualmin is a simple task that allows users to manage files on a server. Here’s how to set one up:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSelect the domain\u003c/strong\u003e\u003cbr\u003e\nLog into Virtualmin and choose the domain for which you want to create an FTP account. Select the domain name from the drop-down box located in the top-left corner of the left menu.\u003c/p\u003e","title":"How to Create an FTP Account"},{"content":"Troubleshooting FTP listing issues FTP connection problems, such as difficulties in listing files or changing directories, are often related to the FTP passive mode, especially when the server is behind a firewall or NAT.\nFTP Passive Mode Passive mode challenges: In passive mode, the FTP server tells the client which port to connect to for data transfers. If these ports are not properly configured or allowed through the firewall, it can result in errors like Connection timed out or Failed to retrieve directory listing. Configure firewall for passive mode ports Before trying anything else, ensure your firewall allows the necessary port range for FTP passive mode:\nPassive mode port range: Typically, FTP passive mode uses ports 49152-65535. Firewall settings: Modify your firewall to permit inbound connections on this port range. The configuration steps will vary based on your firewall software or system setup. Using extra kernel module if nessesary If configuring the firewall does not resolve the FTP connection issues, the next step is to consider enabling the ip_conntrack_ftp module. The modprobe ip_conntrack_ftp command is used to load the ip_conntrack_ftp module on Linux servers. This module is part of the Netfilter framework, which provides connection tracking and network address translation capabilities for the Linux kernel.\nRole of ip_conntrack_ftp Connection tracking: The module helps track FTP connections and understand the FTP protocol\u0026rsquo;s workings, including the negotiation of data ports in passive mode. Address translation assistance: It assists NAT devices (like routers) in altering the payload of FTP control messages so that the client receives the correct IP address and port number for passive mode connections, even when the server is behind NAT. Resolving passive mode issues: By enabling this module, issues related to passive mode FTP connections, such as directory listing failures, are often resolved. Enabling ip_conntrack_ftp To load the ip_conntrack_ftp module:\nRun the command: As root, execute: modprobe ip_conntrack_ftp Immediate effect: This command immediately loads the module into the running kernel, without requiring a reboot. Persisting the change: To ensure the module is loaded on system boot, add ip_conntrack_ftp to your module loading configuration (e.g., /etc/modules on Debian and derivatives or create a file in /etc/modules-load.d/ on EL systems). Post-Configuration After enabling the ip_conntrack_ftp module, test your FTP connection again. In most cases, issues related to passive mode should be resolved, allowing for successful file listings and directory navigation.\n","permalink":"https://www.virtualmin.com/docs/server-components/troubleshooting-ftp/","summary":"\u003ch3 id=\"troubleshooting-ftp-listing-issues\"\u003eTroubleshooting FTP listing issues\u003c/h3\u003e\n\u003cp\u003eFTP connection problems, such as difficulties in listing files or changing directories, are often related to the FTP passive mode, especially when the server is behind a firewall or NAT.\u003c/p\u003e\n\u003ch4 id=\"ftp-passive-mode\"\u003eFTP Passive Mode\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePassive mode challenges\u003c/strong\u003e: In passive mode, the FTP server tells the client which port to connect to for data transfers. If these ports are not properly configured or allowed through the firewall, it can result in errors like \u003ccode\u003eConnection timed out\u003c/code\u003e or \u003ccode\u003eFailed to retrieve directory listing\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch5 id=\"configure-firewall-for-passive-mode-ports\"\u003eConfigure firewall for passive mode ports\u003c/h5\u003e\n\u003cp\u003eBefore trying anything else, ensure your firewall allows the necessary port range for FTP passive mode:\u003c/p\u003e","title":"Troubleshooting FTP"},{"content":"This guide provides a straightforward approach to creating a new MySQL/MariaDB or PostgreSQL database in Virtualmin.\nHow to create a new database Creating a database is a common requirement for website development and application management. Virtualmin provides an easy way to set up a new MySQL/MariaDB or PostgreSQL database. Here’s how to do it:\nSelect the domain\nAfter logging into Virtualmin, choose the domain for which you want to create the database. Do this by selecting the domain name from the drop-down box in the top-left corner of the left menu.\nNavigate to database management\nClick on Edit Databases, which is where you manage all database-related settings for your domain.\nCreate a new database\nClick on Create a new database. This will open a form to set up your new database:\nConfigure database settings\nDatabase name: Choose a name for your database and enter it in the Database name field. This name should be unique and descriptive. Database server type: In the Database server type field, select either MySQL/MariaDB or PostgreSQL. If you\u0026rsquo;re unsure which to choose, MySQL/MariaDB is a popular choice for its ease of use and broad compatibility. Create the database\nClick Create. Virtualmin will process your input and establish the new database.\nOnce successfully created, this new database will be associated with your selected virtual server.\n","permalink":"https://www.virtualmin.com/docs/server-components/how-to-create-database/","summary":"\u003cp\u003eThis guide provides a straightforward approach to creating a new MySQL/MariaDB or PostgreSQL database in Virtualmin.\u003c/p\u003e\n\u003ch3 id=\"how-to-create-a-new-database\"\u003eHow to create a new database\u003c/h3\u003e\n\u003cp\u003eCreating a database is a common requirement for website development and application management. Virtualmin provides an easy way to set up a new MySQL/MariaDB or PostgreSQL database. Here’s how to do it:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSelect the domain\u003c/strong\u003e\u003cbr\u003e\nAfter logging into Virtualmin, choose the domain for which you want to create the database. Do this by selecting the domain name from the drop-down box in the top-left corner of the left menu.\u003c/p\u003e","title":"How to Create a New Database"},{"content":"This tutorial outlines the process for managing databases within Virtualmin.\nHow to manage your database Managing databases is essential for website and application management. Virtualmin streamlines the database management process. Here\u0026rsquo;s how to do it:\nSelect domain\nFrom the top-left corner dropdown box, choose the domain which database you wish to manage.\nEdit databases\nClick on Edit Databases to proceed with database management.\nDatabase management\nTo manage a specific database, click the Manage link next to the database name.\nOpened page will provide the following database operations:\nCreate a new table\nBegin defining a new table by specifying the number of fields and clicking Create a new table.\nCreate view\nConstruct a new view for running specific queries by clicking Create View.\nDrop database\nRemove the entire database from the system by selecting Drop Database.\nBackup database\nSafeguard your data by creating a backup with the Backup Database option.\nExecute SQL\nRun custom SQL queries on your database by selecting Execute SQL.\nFollow these simple steps to effectively manage databases within Virtualmin.\n","permalink":"https://www.virtualmin.com/docs/server-components/managing-databases/","summary":"\u003cp\u003eThis tutorial outlines the process for managing databases within Virtualmin.\u003c/p\u003e\n\u003ch3 id=\"how-to-manage-your-database\"\u003eHow to manage your database\u003c/h3\u003e\n\u003cp\u003eManaging databases is essential for website and application management. Virtualmin streamlines the database management process. Here\u0026rsquo;s how to do it:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSelect domain\u003c/strong\u003e\u003cbr\u003e\nFrom the top-left corner dropdown box, choose the domain which database you wish to manage.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eEdit databases\u003c/strong\u003e\u003cbr\u003e\nClick on \u003cstrong\u003eEdit Databases\u003c/strong\u003e to proceed with database management.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eDatabase management\u003c/strong\u003e\u003cbr\u003e\nTo manage a specific database, click the \u003cstrong\u003eManage\u003c/strong\u003e link next to the database name.\u003c/p\u003e","title":"Managing Databases"},{"content":"For busy web hosts looking to optimize their resources, offloading the database server to a separate system can be beneficial. Virtualmin fully support this setup, and the following guide outlines how to configure it.\nThis process is ideally performed on a system without domains or, at least, domains that do not yet have databases. The outlined steps will not transfer existing databases or database users to the new system.\nThere are a few considerations to keep in mind when moving database to a remote system:\nDatabase access may be slower due to network overhead. Disk usage by database will not count towards domain quotas since it\u0026rsquo;s on a different system and outside Unix quotas set by Virtualmin. Database shutdown or startup operations cannot be managed from Virtualmin and must be done directly on the remote system. Virtualmin simplifies managing remote database servers with its built-in functionality. You can add and manage remote databases directly from the Virtualmin interface, allowing for centralized control of your data across multiple servers.\nConfiguring a remote database server Prepare the remote system Ensure that another system where you intend to host the remote databases also has Virtualmin installed. Configure the remote system to allow connections from your primary Virtualmin server. This typically involves adjusting firewall settings to allow incoming connections on the database port (default 3306 for MySQL/MariaDB) from the IP address of your primary Virtualmin server. Enable remote database access On the remote Virtualmin system, navigate to Edit Databases ⇾ Remote Hosts. This page lists the remote hosts that are allowed to connect to databases owned by this virtual server. You can enter hostnames, IP addresses, or network patterns to specify which systems can connect. Ensure that your primary Virtualmin server\u0026rsquo;s IP is listed here to permit connections. Save the changes to apply the new remote access rules. Adding a remote database server To connect to a remote database server, follow these steps:\nNavigate to System Settings ⇾ Database Servers in Virtualmin. In the New database server options section, select the type of your database server, such as MariaDB or MySQL. Choose the Remote host option and provide the necessary details, including the hostname or IP address of the remote server, port number (if not using the default), and credentials for authentication. You can also specify whether to connect using SSL for enhanced security. After filling in the details, click Create to add the remote database server. Managing remote databases Once you\u0026rsquo;ve successfully added a remote database server, you can manage it directly from Virtualmin:\nIn the Database Servers page, you\u0026rsquo;ll see a list of configured database servers, including local and remote ones. For each virtual server, you can also configure database-related settings under Edit Databases. You can select a server from the list to perform various management tasks, such as modifying existing database settings, like user permissions, database names, and passwords, to maintain or update the databases hosted on the remote server. ","permalink":"https://www.virtualmin.com/docs/server-components/running-database-on-a-remote-system/","summary":"\u003cp\u003eFor busy web hosts looking to optimize their resources, offloading the database server to a separate system can be beneficial. Virtualmin fully support this setup, and the following guide outlines how to configure it.\u003c/p\u003e\n\u003cp\u003eThis process is ideally performed on a system without domains or, at least, domains that do not yet have databases. The outlined steps will not transfer existing databases or database users to the new system.\u003c/p\u003e\n\u003cp\u003eThere are a few considerations to keep in mind when moving database to a remote system:\u003c/p\u003e","title":"Running Database on a Remote System"},{"content":"Handling memory issues and preventing crashes This troubleshoot aims to provide practical steps to troubleshoot and fix memory-related crashes in MySQL/MariaDB.\nIdentifying memory issues Check for OOM killer activity\nUse journalctl -k | grep -i 'out of memory' or dmesg -T | grep -i 'killed process' to check if the OOM killer has been terminating processes. Look for lines mentioning MySQL or MariaDB. Monitor memory usage\nUse free -mh to view available and used memory. Use top or htop to monitor real-time memory usage. Reducing memory usage Tune MySQL/MariaDB settings\nCheck innodb_buffer_pool_size: This setting controls the size of the buffer pool. It specifies the size of the buffer pool, where InnoDB caches table and index data. A larger buffer pool allows more data to be held in memory, reducing disk I/O but using more RAM. Check key_buffer_size: This parameter is significant for MyISAM tables. It defines the size of the buffer used for index blocks. Increasing this value can improve the speed of index reads for MyISAM tables. Check sort_buffer_size: This is the per-connection buffer used for sorting. Each client connection gets its own sort buffer of this size. Modify max_connections: Decrease this if too many simultaneous connections are causing memory issues. Increasing available memory Add physical memory (RAM): If the server is consistently running out of memory, consider adding more physical RAM.\nConfigure swap space: As a temporary solution, add or increase swap space.\nImplement monitoring tools Set up special tools like Zabbix to monitor system and database performance. Configure MySQL/MariaDB monitor and/or alerts for high memory usage in Webmin / Tools ⇾ System and Server Status module. Why can all of my users see a database named test? MySQL and MariaDB, in their earlier versions, prior to 5.6, used to create a test database by default. This database was accessible by any user, and it was primarily intended for testing purposes. However, the creation of this database by default was eventually seen as a security risk, and more recent versions of these systems have stopped including it by default.\n","permalink":"https://www.virtualmin.com/docs/server-components/troubleshooting-databases/","summary":"\u003ch3 id=\"handling-memory-issues-and-preventing-crashes\"\u003eHandling memory issues and preventing crashes\u003c/h3\u003e\n\u003cp\u003eThis troubleshoot aims to provide practical steps to troubleshoot and fix memory-related crashes in MySQL/MariaDB.\u003c/p\u003e\n\u003ch4 id=\"identifying-memory-issues\"\u003eIdentifying memory issues\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck for OOM killer activity\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUse \u003ccode\u003ejournalctl -k | grep -i 'out of memory'\u003c/code\u003e or \u003ccode\u003edmesg -T | grep -i 'killed process'\u003c/code\u003e to check if the OOM killer has been terminating processes.\u003c/li\u003e\n\u003cli\u003eLook for lines mentioning MySQL or MariaDB.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eMonitor memory usage\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUse \u003ccode\u003efree -mh\u003c/code\u003e to view available and used memory.\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003etop\u003c/code\u003e or \u003ccode\u003ehtop\u003c/code\u003e to monitor real-time memory usage.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"reducing-memory-usage\"\u003eReducing memory usage\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003eTune MySQL/MariaDB settings\u003c/strong\u003e\u003c/p\u003e","title":"Troubleshooting Databases"},{"content":"This tutorial provides detailed guidance on creating and restoring backups for virtual servers in Virtualmin, including steps for setting up scheduled, differential, and encrypted backups, purging old backups, and backing up global settings.\nVirtualmin provides multiple tools to help you keep good backups automatically. The first step after any installation of Virtualmin should probably be thinking about your backup procedures and setting up Virtualmin to automate those procedures for you. Introduction to domain level backups The simplest way to backup your virtual servers is to use the backup feature built into the Virtualmin user interface, which can save them to local or remote files domain by domain. This allows you to restore the state of an entire virtual server (including all databases, users, and aliases), without affecting other parts of the system.\nEach virtual server\u0026rsquo;s backup is typically a single file in tar.gz format. This contains one or more files per Virtualmin feature that is included in the backup, such as the contents of databases, DNS records, Apache directives or the virtual server\u0026rsquo;s home directory. It is also possible for a single backup file to contain multiple servers, although this format is generally not as easy to work with.\nBy default, only the master administrator (typically root or admin) can perform backups, but it is possible to grant backup and restore rights to resellers and domain owners too. Only the master admin can restore all virtual server settings though, as some (such as the Apache configuration) could harm other system functions if a corrupt or malicious backup was restored.\nBackup destinations Before you can backup anything, you need to decide where your backups are going to be stored. The simplest destination is a directory on the system running Virtualmin, such as /backup, but clearly this isn\u0026rsquo;t going to be useful if the whole system dies. If you do want to backup to local files, at least make sure they are on a different hard drive than the home containing your /home directory.\nA better alternative is to backup to another system, perhaps owned by you or maybe provided by your colocation company. The backup files can be transferred either via FTP or SSH, depending on which protocol the destination system supports. Almost all Unix systems will allow SSH logins, but some network attached storage devices will only support FTP.\nAnother option is to use one of the supported cloud storage providers. This is probably the safest option.\nScheduling backups The best way to have your system backed up is to have Virtualmin do it automatically on a regular schedule, such as once per day. The steps to set this up are:\nLogin to Virtualmin as the master administrator, typically root. Open the Backup and Restore category on the left menu, and click on Scheduled Backups. Click on the Add a new backup schedule link to open the backup creation form. From the Servers to save menu, choose the domains that you want to backup. Selecting them all is generally the best bet. In the Features and settings section, make sure Backup all features is selected. In the Backup destination box, choose if you want to backup to a local file or a remote SSH or FTP server. For remote systems, you must enter the login details for the destination system. If you want to save each domain to a separate file (recommended), the destination path must be an existing directory like /backup. For the Backup format, select One file per server. In the Schedule and reporting section, enter your email address in the Email backup report to field. Unless you want to get email every time a backup is done, check the Only send email on failure box. In the Scheduled backup time section, select a schedule. It is recommended to just choose Daily (at midnight) option, but more complex times and dates can be chosen using the Complex schedule option. Click the Create Schedule button. Once this is done, your virtual servers will be safely backed up every night. To force an immediate backup for testing purposes, go to the Scheduled Backups page and click on the Backup link next to your new schedule.\nOne-off backups Sometimes you just want to backup a few virtual servers to a different destination a single time, rather than on a regular schedule. To do this, click on the Backup Virtual Servers link on the left menu, and fill in the backup form as described above. When you click the Backup Now button then selected domains will be immediately backed up, and their progress displayed in your browser.\nRestoring virtual servers If a virtual server has been accidentally deleted, or lost files, database content or users, you can restore some or all of its data from a backup. In the case where the whole domain is gone, Virtualmin will re-create it for you as part of the restore process.\nThe steps to restore a domain are:\nOpen the Backup and Restore category on the left menu, and click on Restore Virtual Servers. In the Restore source section, enter the local or remote path to restore from. If you are just restoring one server, it is best to enter the full path to its backup file, like /backup/example.com.tar.gz. Under Features and settings, you can control if all attributes of the virtual server are restored (overwriting any that it currently has), or just some. For example, if you wanted to restore just the domain\u0026rsquo;s databases, you could select Only those selected below and then check the box next to the MySQL feature. By default, everything will be restored. Click the Show What Will Be Restored button at the bottom of the page. After this step, the backup will be downloaded from its source FTP or SSH server and a confirmation page displayed showing which domains and features will be restored. Be careful when restoring existing domains, as any aliases, databases or mailboxes that they have will be removed and replaced with those in the backup.\nIf everything looks okay, click the Restore Now to begin the restore process. As it runs, the progress of each domain and feature will be displayed by Virtualmin.\nBackups by domain owners Individual virtual server owners can backup their own top-level domains and sub-servers, if granted permission on the Edit Owner Limits page in the Allowed capabilities and features section. They can even be given the rights to run scheduled backups, although that right should not be granted to users you don\u0026rsquo;t trust not to abuse it, as a large number of scheduled backups could overwhelm the system.\nThe user interface for server owner backups is almost identical to that for the master administrator, with the exception that local backups can only be made to the .virtualmin-backup directory under their top-level server\u0026rsquo;s home directory. There are no limits on remote FTP, SSH and cloud backups though.\nWhen allowed, restored features by domain owners are even more limited to prevent configuration file corruption or hacking attempts by corrupt backups, only home directory and database contents can be restored, and local restores can only be from the .virtualmin-backup directory, not any file on the system.\nDifferential backups If your system hosts virtual servers that contain a large amount of content in their home directories which does not change often (such as images, PDFs or video files), backing them up daily will be both slow and wasteful. Almost all the contents of each backup will be identical to the previous run, so most of the data transferred is not really necessary.\nFortunately, Virtualmin has a solution by utilizing differential backups. These contain only files that have changed or been added since the last full (non-differential) backup, and are thus much faster. Typically you should schedule a full backup for once a week, and a differential backup for the same domains every night but to a different directory.\nEnabling differential mode for a scheduled backup is as simple as changing the Backup level option to Differential. This will only apply to home directory contents, as Virtualmin does not support detection of differential changes to databases, so if your virtual servers have a large amount of data in a database, the saving will probably be minimal.\nThe differential backup connects to the latest full backup for the domain, regardless of its destination. Virtualmin currently does not support multiple full and differential schedules for different destinations, but multiple destinations can be set up using the state-preserving option “Neither (all files, and don’t update the state)” for compatibility. When restoring, the latest full backup must be restored first, followed by the latest differential. This ensures that all files are returned to their state at the time the differential backup was made.\nDate-based backups If you have enough disk space, keeping backups made over several days or months is a good idea, as it allows you to return virtual servers to their state before some disaster occurred, which may not have been immediately noticed. The standard way to do this in Virtualmin is to use a backup path that contains special tokens that vary based on the current date and time.\nFor example, the path /backup/%Y-%m-%d would be converted to /backup/2024-01-14 on January 14, 2024. All tokens supported by the Unix strftime function can be used in backup paths, but the most useful are:\n%Y - Year, as a 4 digit number %m - Month of the year, padded to 2 digits %d - Day of the month, padded to 2 digits %H - Hour of the day, padded to 2 digits %M - Minute of the hour, 2 digits %a - The short weekday name, like Sat To use these tokens in backup paths, you must check both the Do strftime-style time substitutions on file or directory name and Create destination directory boxes on the backup form.\nPurging old backups The only problem with keeping old backups around using date-based paths is the amount of disk space consumed. However, removing those older than some number of days is relatively easy to setup in Virtualmin. When creating or editing a scheduled backup, use the Delete old backups field to enter a maximum age in days before backups are removed.\nThis can only be used if your backup path contains date substitution tokens, like /backup/virtualmin-%Y-%m-%d. If not, Virtualmin will not be able to work out which files and directories are backups that it made in order to safely delete them.\nIn addition, it is recommended against using the same directory to store backups made using other programs, as if their filenames are similar to Virtualmin backups they may be deleted as well if too old.\nUsing backups to transfer virtual servers If you have more than one system running Virtualmin, backups and restores can be used to transfer domains between them easily. The restore process will even re-create the virtual servers on the target system, and adjust the backups to match the target\u0026rsquo;s mailbox format, mail server, home directory base and other system-specific settings.\nThe steps to transfer a virtual server between systems are:\nCreate a backup on the source system containing the top-level server you want to transfer, and all sub-servers. The Include sub-servers checkbox on the backup form makes this easy. Copy the backup file(s) across to the target system, if they weren\u0026rsquo;t already transferred directly as part of the backup process. Use the restore form to re-create the domains from the backup files. If you select them all at once, any top-level servers will be restored before sub-servers, and their hierarchy correctly preserved. Update DNS entries or change nameservers at your registrar so that the new system serves the domains. Verify that everything is working on the new system, paying particular attention to PHP applications that may have unexpected dependencies on the old system. Delete the virtual servers from the source system. Encrypted backups Virtualmin Pro supports the encryption and signing of backups with GPG keys. This can be used to protect the contents of a sensitive backup from prying eyes or modification if stored on an un-trusted remote system.\nBefore a backup can be encrypted, you must create or import at least one key at Backup and Restore ⇾ Backup Encryption Keys page. A key can either be generated by Virtualmin, or imported from an existing GPG secret key file in ASCII format.\nOnce a key has been created, it can be selected on the one-time or scheduled backup form using the Encrypt backup with key field. When the backup is restored, the same key must also be selected using the field with the same name on the restore form.\nIn case a backup key is lost, any backups made using it will not be recoverable! For this reason, you should save the ASCII format key text separately. This can be found on the Backup Encryption Keys page, by clicking on a key. This way if your Virtualmin system fails and you need to restore backups onto a new system, the key can be imported first. Backing up global settings In addition to virtual servers, backups made by the master administrator can also contain Virtualmin settings that apply to the whole system, such as templates and custom fields. If you have created your own templates or heavily customized the module configuration, you should back these settings up too as follows:\nCreate a new scheduled backup, as described above. In the Servers to save, choose the Only selected option but do not select any domains. Under Features and settings, check all the boxes in the Virtualmin settings to also backup section. Or if you only want to save some global settings, just check the ones you want. Select a backup destination as normal. This can either be a single tar.gz file which will contain all the global settings, or a directory. In the latter case, a file named virtualmin.tar.gz will be created in the target directory to store the global configuration backup. Select a schedule, and click the Create Schedule button. It is also possible to include global Virtualmin settings in your backups of virtual servers, by selecting the ones to include in the Virtualmin settings to also backup field.\nRestoring global settings The various global Virtualmin configuration settings can be restored in exactly the same way as you would restore domains. Just select the virtualmin.tar.gz file as the source to restore from, and in the Virtualmin settings to restore section check the types of global settings to include.\nThis can even be used to migrate templates, custom fields, web app installers, content styles, resellers and email messages to a new system.\nCommand line backup tools If you prefer to work at the command line, backups and restores can be done using the tools listed on the Backup and Restore API page. These allow you to create your own scripts for backing up on complex schedules, emailing backups to somewhere, using rsync to transfer home directory contents, or whatever you can come up with.\n","permalink":"https://www.virtualmin.com/docs/backup-and-migration/how-to-backup-virtual-servers/","summary":"\u003cp\u003eThis tutorial provides detailed guidance on creating and restoring backups for virtual servers in Virtualmin, including steps for setting up scheduled, differential, and encrypted backups, purging old backups, and backing up global settings.\u003c/p\u003e\n\n\n\n\n\n      \u003cdiv class=\"alert alert-primary\"\u003e\n        \u003ci class=\"wm wm-fw wm-sm wm-exclamation\"\u003e\u003c/i\u003e \u003cstrong\u003e\u003c/strong\u003e\u003cbr\u003e\n        Virtualmin provides multiple tools to help you keep good backups automatically. The first step after any installation of Virtualmin should probably be thinking about your backup procedures and setting up Virtualmin to automate those procedures for you.\n      \u003c/div\u003e\n\n\n\u003ch3 id=\"introduction-to-domain-level-backups\"\u003eIntroduction to domain level backups\u003c/h3\u003e\n\u003cp\u003eThe simplest way to backup your virtual servers is to use the backup feature built into the Virtualmin user interface, which can save them to local or remote files domain by domain. This allows you to restore the state of an entire virtual server (including all databases, users, and aliases), without affecting other parts of the system.\u003c/p\u003e","title":"How to Backup and Restore Virtual Servers"},{"content":"This tutorial helps Virtualmin users understand what\u0026rsquo;s inside a Virtualmin backup file, explaining how backup files are named, what each file represents, and how file structures differ depending on your chosen backup format.\nVirtualmin backups store your server data in a single downloadable file, which, when extracted, reveals multiple smaller files. Knowing how these files are organized makes troubleshooting, manual restores, or accessing specific data easier.\nBackup file formats Virtualmin creates backup archives using different compression formats based on your selection:\nTAR with GZ: Creates .tar.gz files using GNU Tar with gzip compression TAR with BZIP2: Creates .tar.bz2 files with better compression but slower processing TAR: Creates uncompressed .tar archives with no compression ZIP: Creates .zip files with compression, compatible with most systems TAR with ZSTD: Creates .tar.zst files with modern, efficient compression Understanding the file structure When you extract a Virtualmin backup, you\u0026rsquo;ll see lots of files with names like domain.tld_* or virtualmin_*. These files are divided into two main groups: those related to your domain and those for the global Virtualmin system configuration. Let\u0026rsquo;s break it down.\nDomain-specific files Each virtual server (domain) has its own set of files, all prefixed with the domain name. For example, if your domain is domain.tld, you\u0026rsquo;ll see files ending with an underscore followed by the Virtualmin feature name, for example:\ndomain.tld_dir Contains the entire home directory of the domain, including all website files, user data, and mail directories. This is typically the largest file in the backup.\ndomain.tld_dns Stores DNS configuration for the domain, including zone file settings and nameserver records.\ndomain.tld_logrotate Log rotation configuration that determines how your server logs (like webserver access and error logs) are rotated and stored.\ndomain.tld_mail_* Multiple files handling email configuration.\ndomain.tld_mysql Database server configuration.\ndomain.tld_mysql_[dbname] Individual database dumps. Each database gets its own file containing all tables and data.\ndomain.tld_spam_* Spam filtering configurations including SpamAssassin rules and user preferences.\ndomain.tld_ssl_* SSL certificate files.\ndomain.tld_virtualmin Contains domain-specific configuration, including domain user and group, assigned IP addresses, enabled features, and other domain-related settings.\ndomain.tld_virtualmin-[plugin] Configuration or actual backup files for Virtualmin plugins like AWStats or WP Workbench.\ndomain.tld_web Apache webserver configuration for the domain.\ndomain.tld_web_[ae]log Access and error log files.\ndomain.tld_webmin Webmin access permission settings for the domain owner for different Webmin modules.\nDepending on the features selected during backup, you might see more or fewer files in this section. Global configuration files Virtualmin system-wide settings are stored in files beginning with virtualmin_, for example:\nvirtualmin_config Main Virtualmin module config containing global settings and feature defaults.\nvirtualmin_templates Server templates that define default settings for new domains.\nvirtualmin_templates_plans Account plans with resource limits and feature sets.\nvirtualmin_mailserver_* Global mail server configuration for Postfix, OpenDKIM, and other mail-related settings.\nvirtualmin_resellers Reseller account information and permissions.\nvirtualmin_scheds Scheduled backup configurations.\nvirtualmin_scripts Script installer data and configurations.\nvirtualmin_email Email templates for automated messages.\nDepending on the selected backup options, you may find more or fewer global configuration files in this section. Backup modes and file organization Virtualmin offers two backup modes that organize your backup files a little differently within the main archive.\nSingle archive file mode This is the standard backup mode. All components are stored as separate files in the main archive, as described above, for example:\nbackup-file.tar.gz ├── domain.tld_dir ├── domain.tld_dns ├── domain.tld_mysql ├── domain.tld_web ├── virtualmin_config └── [other component files] One file per server mode This mode reorganizes the backup for direct access to website files. The home directory contents are placed directly at the archive root. All other components are moved to a .backup directory. For example:\nbackup-file.tar.gz ├── .backup/ │ ├── domain.tld_dir (empty) │ ├── domain.tld_dns │ ├── domain.tld_mysql │ ├── domain.tld_web │ ├── virtualmin_config │ └── [other component files] ├── Maildir/ ├── bin/ ├── cgi-bin/ ├── domains/ ├── etc/ ├── homes/ ├── logs/ ├── public_html/ ├── tmp/ ├── .bash_history ├── .bash_logout ├── .bash_profile └── .bashrc The internal file names and content stay the same in both modes; only the organization within the archive changes.\nCompression format of nested archives The format of nested archives within the backup matches your chosen compression method, but regardless of whether \u0026ldquo;tar\u0026rdquo; or \u0026ldquo;zip\u0026rdquo; is used, these nested archives remain uncompressed, as they simply group files together without reducing their size. The internal structure stays consistent; only the archive handling varies based on your selection.\nConclusion Virtualmin backup files have a clear structure that makes managing your data easy. Files starting with your domain name contain specific data and settings, like website files, DNS records, or databases, while other files contain settings that apply globally across the entire Virtualmin system.\nNo matter which compression method you choose, the internal organization stays consistent.\n","permalink":"https://www.virtualmin.com/docs/backup-and-migration/understanding-backup-file-structure/","summary":"\u003cp\u003eThis tutorial helps Virtualmin users understand what\u0026rsquo;s inside a Virtualmin\nbackup file, explaining how backup files are named, what each file represents,\nand how file structures differ depending on your chosen backup format.\u003c/p\u003e\n\u003cp\u003eVirtualmin backups store your server data in a single downloadable file,\nwhich, when extracted, reveals multiple smaller files. Knowing how these files\nare organized makes troubleshooting, manual restores, or accessing specific data\neasier.\u003c/p\u003e\n\u003ch2 id=\"backup-file-formats\"\u003eBackup file formats\u003c/h2\u003e\n\u003cp\u003eVirtualmin creates backup archives using different compression formats based on\nyour selection:\u003c/p\u003e","title":"Exploring Backup Structure"},{"content":"Migrating your Virtualmin installation to a new server involves several steps, such as backups and restores, testing, and going live. This document is designed to help you navigate through this process. The process of migrating your Virtualmin installation is versatile, and unaffected by differences in operating system, version, or architecture. For example, you can smoothly transition from an Alma-based LAMP stack to a Debian-based LEMP stack, or from a LAMP stack on Ubuntu to a LEMP stack on Rocky.\nLower DNS TTL Start by reducing the DNS Time-to-Live (TTL) settings to minimize caching issues during the switch. Execute the following command on your current server about 48 hours before the migration:\nvirtualmin modify-dns --all-domains --ttl 300 This sets the TTL to 5 minutes, instructing DNS servers to refresh their cache of your domain information more frequently.\nSet up the new server Install a preferred Linux distribution on your new machine. While it doesn’t need to match your old server\u0026rsquo;s OS, sticking to a Grade A supported OS is wise for optimal compatibility and performance.\nInstall Virtualmin Next, install Virtualmin using the virtualmin-install.sh script. During the migration phase, it\u0026rsquo;s acceptable to run Virtualmin Pro on both servers temporarily. Ignore any alerts about duplicate license usage; these will resolve once you decommission the old server.\nGenerate and transfer backups On your current server, create a backup directory and back up all virtual servers using these commands:\nmkdir /root/backups virtualmin backup-domain --dest /root/backups/ --all-domains --all-features --newformat --all-virtualmin Transfer the backups to your new server with secure copy:\nscp -r /root/backups root@new-server.com:/root/ Restore domains Now the exciting part, restoring domains onto the new server. Run these commands, and be patient, it can take a while:\nvirtualmin restore-domain --source /root/backups/virtualmin.tar.gz --all-virtualmin virtualmin restore-domain --source /root/backups/ --all-domains --all-features This process restores your Virtualmin settings first, then all your virtual servers.\nTesting phase Test each site to ensure functionality. Use the Preview Website feature in Virtualmin, since DNS still points to the old server. If issues arise, check $HOME/logs/error_log for error messages that can help identify missing dependencies or other problems.\nRefresh backups (optional) If substantial time has passed during testing, consider making fresh backups to capture recent data changes. Generate incremental backups on the old server with:\nvirtualmin backup-domain --dest /root/backups/ --all-domains --all-features --newformat --all-virtualmin --incremental Going live When you\u0026rsquo;re satisfied with the testing, update your domain\u0026rsquo;s nameserver IP addresses to point to the new server. This is the big switch.\nPost-live testing After going live, continue testing. Most issues should be straightforward to fix. If anything major comes up, you can temporarily revert the nameserver IP addresses back to the old server while you troubleshoot.\nReset DNS TTL When confident everything is stable, increase the DNS TTL back to normal to optimize DNS resolution performance:\nvirtualmin modify-dns --all-domains --ttl 3600 Final steps With successful testing and DNS updates, your migration is complete! Enjoy your new server setup, and consider keeping the old one as a temporary backup during the transition period.\nIn addition, here are some suggestions to consider:\nUser notification: Inform your users about planned downtimes and expected changes in service availability during the migration process. Security review: Post-migration, conduct a security audit to ensure that the new server adheres to your security policies and that all services are running as expected. Remember, thorough planning and testing are the keys to a smooth migration.\n","permalink":"https://www.virtualmin.com/docs/backup-and-migration/how-to-migrate-to-a-new-server/","summary":"\u003cp\u003eMigrating your Virtualmin installation to a new server involves several steps, such as backups and restores, testing, and going live. This document is designed to help you navigate through this process. The process of migrating your Virtualmin installation is versatile, and unaffected by differences in operating system, version, or architecture. For example, you can smoothly transition from an Alma-based LAMP stack to a Debian-based LEMP stack, or from a LAMP stack on Ubuntu to a LEMP stack on Rocky.\u003c/p\u003e","title":"How to Migrate to a New Server"},{"content":"Virtualmin supports various cloud storage providers for backing up your virtual servers. Here\u0026rsquo;s how you can configure each of them.\nAmazon S3 and compatible services Amazon S3 (Simple Storage Service) provides scalable object storage suitable for backup and archival of data. To set up Amazon S3 with Virtualmin, you need to have your security credentials ready and configure your Virtualmin system accordingly.\nLog into the AWS Management Console.\nNavigate to the Security Credentials page in your AWS account.\nHere, you can find your access key ID and secret access key. If you have not created an access key yet, you can do so on this page. Make sure to download and safely store the provided credentials, as the secret access key is only displayed once and cannot be retrieved again.\nIn Virtualmin, go to Backup and Restore ⇾ Cloud Storage Providers ⇾ Amazon S3 page. Enter the AWS access key ID and secret access key that you obtained from the AWS Security Credentials page. Furthermore, take into account the following:\nS3-compatible server hostname\nIf you are using a service with an API compatible with Amazon S3, input the API endpoint URL here. This will apply to all backups to that service.\nDefault S3 login\nSet the default login and password for Amazon S3 to avoid entering them for each backup. These credentials are also used by the S3 API and shell commands if no keys are specified.\nS3 bucket management\nVirtualmin can manage S3 bucket settings, like access control lists and lifecycle policies, to set up permissions, automatic deletions, or movement to Amazon Glacier. These settings can be accessed through the Backup and Restore ⇾ Amazon S3 Buckets page. Alternatively, you can configure your bucket setting on AWS, by selecting the appropriate S3 bucket where you wish to store your backups. If you haven\u0026rsquo;t created a bucket yet, you can do this through the S3 Management Console on AWS. Note: Choose the correct region that corresponds with your S3 bucket location. This is crucial as AWS S3 operates in multiple geographical regions around the world. Azure Blob Storage To use Azure Blob Storage:\nCreate an Azure Account, sign up for an account with Microsoft Azure if you don\u0026rsquo;t have one already. You can do this at the Azure Portal page.\nInstall the Azure Command-Line Interface (CLI) on the system where Virtualmin is running. The Azure CLI is a set of commands used to manage Azure resources. The installation guide is available on the Azure CLI documentation.\nAfter installing the Azure CLI, open your command-line interface and enter the following command to log in to your Azure account:\naz login --use-device-code A device code will be provided, which you need to enter at the prompted Microsoft page to authenticate your CLI session.\nOnce authenticated, you\u0026rsquo;ll need follow on-screen instructions to complete the setup.\nBackblaze B2 To configure Backblaze B2 as a backup destination:\nIf you are not already a Backblaze user, sign up for an account at Backblaze. This account will provide you with access to Backblaze\u0026rsquo;s storage solutions. Once you have a Backblaze account, log in and navigate to the My Settings page. Look for the B2 Cloud Storage option and enable it under Enabled Products section. Go to the Application Keys page within your Backblaze B2 dashboard, and create a new application key. Ensure that you grant all necessary capabilities to this key so that Virtualmin can perform backup and restore operations without any permission issues. In Virtualmin, head over to Backup and Restore ⇾ Cloud Storage Providers ⇾ Backblaze. Enter the key ID and application key that you generated from the Backblaze B2 dashboard. Dropbox To configure Dropbox as a backup destination:\nRegister a Dropbox account unless you already have one. In Virtualmin, navigate to Backup and Restore ⇾ Cloud Storage Providers ⇾ Dropbox and input your Dropbox account email address. You will further need to authorize Virtualmin from Dropbox to allow access. Google Cloud Storage To use Google Cloud Storage for backups, connect your account to Virtualmin as follows:\nLog in to the Google Cloud Console and note your project ID. Navigate to APIs \u0026amp; Services ⇾ Credentials, and create an OAuth 2.0 client ID. In Virtualmin, go to Backup and Restore ⇾ Cloud Storage Providers ⇾ Google Cloud Storage and fill in the details as instructed to complete the process. Begin the OAuth 2.0 enrollment process, authorize Virtualmin, and enter the provided code back in Virtualmin. Google Drive For Google Drive backups follow similar steps provided above for Google Cloud Storage.\nRackspace Cloud Files To configure Rackspace Cloud Files as a backup destination:\nIf you don\u0026rsquo;t already have a Rackspace account, you will need to register one. This account will provide you with access to Rackspace services, including Cloud Files. In Virtualmin, navigate to Backup and Restore ⇾ Cloud Storage Providers ⇾ Rackspace Cloud Files page. Input your Rackspace username and Rackspace API key into the designated fields. These credentials are used by Virtualmin to authenticate with Rackspace and manage cloud storage resources. ","permalink":"https://www.virtualmin.com/docs/backup-and-migration/cloud-storage-providers/","summary":"\u003cp\u003eVirtualmin supports various cloud storage providers for backing up your virtual servers. Here\u0026rsquo;s how you can configure each of them.\u003c/p\u003e\n\u003ch3 id=\"amazon-s3-and-compatible-services\"\u003eAmazon S3 and compatible services\u003c/h3\u003e\n\u003cp\u003eAmazon S3 (Simple Storage Service) provides scalable object storage suitable for backup and archival of data. To set up Amazon S3 with Virtualmin, you need to have your security credentials ready and configure your Virtualmin system accordingly.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eLog into the \u003ca href=\"https://console.aws.amazon.com/\"\u003eAWS Management Console\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNavigate to the \u003ca href=\"https://console.aws.amazon.com/iam/home#/security_credentials\"\u003eSecurity Credentials\u003c/a\u003e page in your AWS account.\u003c/p\u003e","title":"Cloud Storage Providers"},{"content":"A default installation of Virtualmin is optimized for performance rather than minimal memory usage. This configuration can lead to issues on systems with 1GB or less RAM, especially on VPS without swap space.\nEfficient memory management is essential for optimal performance. In terms of RAM usage, SpamAssassin can easily consume 1GB, while ClamAV often requires at least 2GB. MySQL or MariaDB usually require upwards of 400MB of memory, dependent on configuration settings. Apache can consume around 250MB, and BIND\u0026rsquo;s memory usage can surpass 100MB, influenced by the number of hosted zones and its role as a recursive DNS server. PHP\u0026rsquo;s memory consumption typically exceeds 100MB and also varies significantly based on its configuration settings. At the lower end, Virtualmin uses about 30MB and Postfix remains around 5MB.\nReduce SpamAssassin and ClamAV memory usage Basic mail services are lightweight in terms of memory usage, but incorporating spam and antivirus filtering, like SpamAssassin and ClamAV, significantly ramps up resource demands. For systems constrained by limited memory, a viable solution is to delegate spam and antivirus filtering tasks to an external server or to fully offsite email service.\nVirtualmin offers a solution for remote management of ClamAV and SpamAssassin, allowing several servers to share a centralized scanning server, which efficiently allocates resources as described in the Spam and Virus Scanning documentation.\nFor setups where local mail delivery is crucial and external filtering isn\u0026rsquo;t an option, the most effective way to save memory is to disable SpamAssassin and ClamAV completely. It\u0026rsquo;s important to note that using these services on-demand might seem like a way to reduce memory usage, but this can lead to increased CPU usage and longer processing times. As a result, the overall performance can be negatively impacted, particularly in environments with limited CPU and memory resources.\nTo disable both SpamAssassin and ClamAV to optimize memory usage and system performance, follow these steps to accomplish this:\nLog in as the master administrator. Go to Email Settings ⇾ Spam and Virus Scanning page. Disable and stop the services for spam and virus scanning. Save the changes. Furthermore, you should disable spam and antivirus features in Virtualmin by following these steps:\nLog in as the master administrator. Go to System Settings ⇾ Features and Plugins. Disable the spam and antivirus features. Save the changes. By disabling both SpamAssassin and ClamAV, you can free up significant memory and processing resources, ensuring the efficiency and stability of your low-memory system.\nReduce MySQL/MariaDB memory usage Optimizing MySQL or MariaDB for a low-memory or resource-constrained system involves making careful adjustments to your database configuration. These adjustments are aimed at reducing memory usage while maintaining acceptable performance.\nFinding the main configuration file for MySQL or MariaDB is essential for customizing database settings, so at first, locate the main configuration file for MySQL or MariaDB where the [mysqld] section is located. The exact location and naming of the configuration file can vary depending on the operating system and the specific installation package used.\nSearch for the [mysqld] section\nRun the following command to find files containing the [mysqld] section in the /etc directory:\ngrep -Rsi \u0026#39;\\[mysqld\\]\u0026#39; /etc This section indicates MySQL/MariaDB configuration. Be careful not to confuse it with the [mysql] section (for client settings) or similar-looking sections in other services like Fail2ban or Logrotate.\nReview the search results: Look for files typically located at /etc/mysql, /etc/my.cnf.d or within /etc/mysql/mariadb.conf.d.\nProceed with caution: Always back up the configuration file before making any changes. After editing, restart the MySQL/MariaDB service to apply your changes.\nAdd or change the following directives to the [mysqld] section\ninnodb_buffer_pool_size = 32M innodb_log_buffer_size = 4M innodb_flush_log_at_trx_commit = 2 query_cache_type = 0 query_cache_size = 0 max_connections = 50 max_user_connections = 50 key_buffer_size = 4M max_allowed_packet = 2M table_open_cache = 16 sort_buffer_size = 64K read_buffer_size = 32K read_rnd_buffer_size = 128K net_buffer_length = 2K thread_stack = 256K These directives are designed to reduce memory usage while maintaining acceptable performance. The values can be adjusted further based on your specific server\u0026rsquo;s performance and the nature of the traffic it handles.\nReduce Apache memory usage Managing memory usage in Apache is also important for optimizing performance and stability on low-memory systems.\nNote that Nginx consumes less RAM compared to Apache, making it a more suitable choice for systems with limited memory. That\u0026rsquo;s why the Virtualmin LEMP bundle is often recommended for setups where keeping memory use low is important. Apache\u0026rsquo;s memory usage is directly related to the number of processes and modules loaded.\nReduce persistent connections Persistent connections are connections that remain open after a request is completed. This can reduce the number of processes required to handle requests, thereby reducing memory usage. The KeepAlive and KeepAliveTimeout directives can be adjusted to optimize memory usage. These directives are used to manage persistent connections. The KeepAlive directive enables persistent connections, while the KeepAliveTimeout directive sets the time in seconds that Apache waits for a new request from a client before closing the connection. The default value for KeepAliveTimeout is 5 seconds. Reducing this value can reduce the number of processes required to handle requests, thereby reducing memory usage.\nThis adjustment is made in the main Apache\u0026rsquo;s configuration file, which varies depending on the operating system.\nEL systems: Edit the /etc/httpd/conf/httpd.conf file. Debian and Derivatives: Modify the /etc/apache2/apache2.conf file. To make this adjustment, open the correct to your operating system Apache configuration file and add or modify the following directives:\nKeepAlive On KeepAliveTimeout 3 Reduce processes The number of processes used by Apache can be reduced by adjusting the directive mentioned below. These directives are used to manage the number of processes used by Apache. The default values for these directives vary depending on the operating system. Adjusting these values can reduce the number of processes required to handle requests, thereby reducing memory usage.\nMulti-Processing Modules (MPMs), responsible for handling incoming requests, vary in type — \u0026ldquo;prefork\u0026rdquo;, \u0026ldquo;worker\u0026rdquo;, or \u0026ldquo;event\u0026rdquo; — depending on the default settings of your operating system distribution and its version. For a newer operating system distributions, the default MPM for Apache is typically set to \u0026ldquo;event\u0026rdquo;, known for its efficiency in handling requests.\nBefore modifying your Apache configuration, it\u0026rsquo;s crucial to identify which MPM is currently enabled and which configuration file is used for it. To determine which MPM is enabled, run the following command:\napachectl -V | grep MPM MPM: \u0026ldquo;prefork\u0026rdquo; and \u0026ldquo;worker\u0026rdquo; Note that \u0026ldquo;prefork\u0026rdquo; and \u0026ldquo;worker\u0026rdquo; MPMs are mutually exclusive, and only one can be enabled and used at a time. Adjust the values from the sample configuration based on your current MPM. Configuration files may vary depending on the operating system.\nFor example, in Debian and derivatives, the configuration file is /etc/apache2/mods-available/mpm_prefork.conf for \u0026ldquo;prefork\u0026rdquo; MPM and /etc/apache2/mods-available/mpm_worker.conf for \u0026ldquo;worker\u0026rdquo; MPM. In EL systems, the configuration file is /etc/httpd/conf.modules.d/00-mpm.conf, however any custom directives for either \u0026ldquo;prefork\u0026rdquo; or \u0026ldquo;worker\u0026rdquo; MPM should be placed in a custom file under the /etc/httpd/conf.d/ directory.\nHere is a sample configuration to optimize memory usage on low-memory systems for \u0026ldquo;prefork\u0026rdquo; MPM:\n\u0026lt;IfModule prefork.c\u0026gt; StartServers 2 MinSpareServers 2 MaxSpareServers 5 MaxRequestWorkers 50 MaxConnectionsPerChild 500 \u0026lt;/IfModule\u0026gt; And, here is a sample configuration to optimize memory usage on low-memory systems for \u0026ldquo;worker\u0026rdquo; MPM:\n\u0026lt;IfModule worker.c\u0026gt; StartServers 2 MinSpareThreads 8 MaxSpareThreads 16 ThreadLimit 64 ThreadsPerChild 12 MaxRequestWorkers 50 MaxConnectionsPerChild 500 \u0026lt;/IfModule\u0026gt; MPM: \u0026ldquo;event\u0026rdquo; The \u0026ldquo;event\u0026rdquo; MPM works similarly to the \u0026ldquo;worker\u0026rdquo; MPM but is more efficient in handling a large number of keep-alive connections. It uses a dedicated thread to manage keep-alive connections, freeing up worker threads to handle other requests. This can reduce memory usage and increase efficiency, especially in environments with limited resources.\nBelow is a sample configuration designed to optimize memory usage in low-memory systems:\n\u0026lt;IfModule event.c\u0026gt; StartServers 1 MinSpareThreads 10 MaxSpareThreads 25 ThreadLimit 64 ThreadsPerChild 10 MaxRequestWorkers 50 MaxConnectionsPerChild 500 \u0026lt;/IfModule\u0026gt; Remember to restart Apache after making changes to the configuration. This can be done using systemctl restart httpd on EL systems, or systemctl restart apache2 on Debian and derivatives.\nThis configuration aims to balance the need for responsiveness with the limitations of low-memory environments. It should provide a good starting point, but you may need to tweak the settings further based on your specific server\u0026rsquo;s performance and the nature of the traffic it handles.\nRemove modules To further reduce memory usage, consider disabling unused Apache modules. This can have a significant impact on memory consumption, but identifying which modules are not in use can be challenging. We recommend disabling modules one at a time and monitoring the server\u0026rsquo;s performance to determine which modules are safe to disable.\nReduce PHP memory usage To optimize PHP memory usage, you can make the following adjustments:\nLower the maximum memory allocation option in the PHP configuration. This can be done in the Web Configuration ⇾ PHP-FPM Configuration: Resource Limits page. Be aware that modifying this setting will impact the memory usage of all PHP scripts running on the server.\nSwitch to PHP-FPM execution mode, which is often more efficient in terms of memory usage and performance. You can do this in the Web Configuration ⇾ PHP Options page. Additionally, choose the appropriate process manager mode based on your needs:\ndynamic: This mode spawns child processes based on demand, providing a good balance between performance and memory usage.\nstatic: This mode keeps a fixed number of child processes, which can be memory efficient if you set a low number of processes.\nondemand: This mode starts processes only when needed, saving memory when your site has low traffic. However, there might be a performance hit on initial requests as processes are spawned.\nLimit the number of sub-processes. The default recommendation is usually a good starting point, but you can adjust this number based on your actual traffic and workload.\nVirtualmin library pre-loading On systems with limited memory, it may be helpful to disable the Webmin libraries\u0026rsquo; preloading feature to reduce memory consumption. Although preloading can enhance Virtualmin\u0026rsquo;s responsiveness, especially with multiple users, the trade-off in memory efficiency may not justify the speed benefit on systems with limited memory, where preventing swapping is crucial for maintaining overall performance.\nTo disable preloading of Webmin libraries in Virtualmin, do the following:\nLog in as the master administrator. In the left menu, go to System Settings ⇾ Virtualmin Configuration. In the Server settings section, set Preload Virtualmin libraries at startup? to No. Save changes and re-check the Virtualmin configuration. Enable swap To optimize memory usage, it is important to have a configured swap file or partition, especially on systems with limited RAM. If you don\u0026rsquo;t have a swap partition or swap file, you can create one as follows:\nCreating swap Create a swap file\nUse the fallocate command to create a swap file. For example, to create a 4 GB swap file:\nfallocate -l 4G /swapfile Set correct permissions\nchmod 600 /swapfile Note: Only the root user should have read and write permissions to the swap file for security reasons. Make the file a swap file\nConvert the file into a swap space:\nmkswap /swapfile Enable the swap file\nActivate the swap file:\nswapon /swapfile Make the swap file permanent\nEdit /etc/fstab to add the swap file:\necho \u0026#39;/swapfile none swap sw 0 0\u0026#39; | tee -a /etc/fstab Enlarging swap If you already have a swap file and need to enlarge it:\nTurn off existing swap\nDisable the current swap file:\nswapoff -v /swapfile Note: Actual swap file name may vary. To find the swap file name, run cat /proc/swaps command. Resize the swap file\nIf you want to increase the swap size to 8 GB, for example:\nfallocate -l 8G /swapfile Make the file a swap file\nmkswap /swapfile Turn on swap\nswapon /swapfile Update /etc/fstab if needed\nIf the swap file path or name changes, update /etc/fstab accordingly.\nConsiderations Ensure your system has enough free space to accommodate the swap file. The performance of swap space on a disk drive is typically much slower than physical RAM. For resizing a swap partition, it\u0026rsquo;s more complex and may involve resizing disk partitions, which is riskier and should be done with caution and backups. Disable unused services to free up memory before trying to increase swap space. This can be accomplished in Virtualmin under System Settings ⇾ Features and Plugins, and in Webmin through System ⇾ Bootup and Shutdown. Services such as the Postgres database or Mailman should be disabled if they are not in use. If SSH/SFTP is available, it\u0026rsquo;s recommended to disable ProFTPd. Furthermore, if your DNS is hosted externally, consider disabling the BIND DNS server. Always back up important data before performing such operations, as mistakes can lead to data loss. Additionally, consider the impact on your system\u0026rsquo;s performance and storage when adjusting swap space. For a better performance, it\u0026rsquo;s recommended to add more RAM instead of increasing swap space.\nUnderstanding memory usage with the OOM Killer The Out-Of-Memory (OOM) Killer in Linux-based systems is a mechanism that is invoked when the system is critically low on memory. The process that the OOM Killer terminates first depends on several factors, primarily the calculated OOM score of the processes running on the system.\nHow the OOM Killer selects a process to terminate The OOM Killer evaluates all processes on the system and assigns each one an OOM score, which determines the likelihood of the process being terminated during an out-of-memory event. The calculation is based on:\nMemory usage\nProcesses consuming more memory generally have higher scores.\nOOM score oom_score_adj adjustment\nProcesses can have their score explicitly adjusted via /proc/\u0026lt;pid\u0026gt;/oom_score_adj, with values ranging from -1000 (never kill) to 1000 (high likelihood of being killed).\nCritical system processes\nKernel threads and certain root-owned processes are deprioritized unless no other options are available.\nImpact of termination\nThe OOM Killer prioritizes processes whose termination will free the most memory while minimizing disruption.\nTo view the OOM score of a running process:\ncat /proc/\u0026lt;pid\u0026gt;/oom_score To see the adjustment value:\ncat /proc/\u0026lt;pid\u0026gt;/oom_score_adj Processes with a higher OOM score are more likely to be terminated, but factors like process priority and system configuration can influence this decision.\nAutomatic adjustments based on process activity The OOM score can automatically increase for processes that appear “idle” or less active, but this is indirectly influenced by memory usage trends and process behavior rather than a direct “idle detection.” For example:\nProcesses holding large amounts of memory but not actively using it may see their OOM score increase over time.\nBackground or low-priority processes (e.g., daemons, detached sessions) may become higher-priority candidates for termination because they are often deemed “less critical” to the system’s immediate performance.\nInactive processes consuming significant portions of file cache or buffer memory can also gain higher badness scores because freeing their memory benefits the system.\nDebugging memory usage If you suspect that the OOM Killer is terminating processes on your system, you can use the following steps to investigate the issue:\nThe journalctl command is used to query and display messages from the systemd journal, which is a centralized log management system. To specifically check for out-of-memory issues, use the following command:\njournalctl -k | grep -i \u0026#39;Out of memory\u0026#39; This command filters kernel messages for entries related to out-of-memory conditions. It’s a primary tool for investigating if the Out-Of-Memory (OOM) Killer has been activated and which processes were affected.\nIf journalctl does not provide the needed information, or if you are working on a system where systemd is not present, use the dmesg command. This command displays messages from the kernel ring buffer, which includes messages about processes being killed:\ndmesg -T | grep -i \u0026#39;killed process\u0026#39; The -T option in dmesg displays human-readable timestamps, making it easier to correlate events with system issues. This command is particularly useful for identifying processes terminated by the kernel, including those affected by the OOM Killer.\nDon\u0026rsquo;t forget to correlate the findings from system logs with application-specific logs. If a particular application was killed, its own logs might contain valuable information preceding the termination.\nWhile focusing on logs, it\u0026rsquo;s also a good idea to use system monitoring tools like top, htop, or custom monitoring solutions to understand the overall resource utilization trends over time.\n","permalink":"https://www.virtualmin.com/docs/system-optimization/low-memory/","summary":"\u003cp\u003eA default installation of Virtualmin is optimized for performance rather than minimal memory usage. This configuration can lead to issues on systems with 1GB or less RAM, especially on VPS without swap space.\u003c/p\u003e\n\u003cp\u003eEfficient memory management is essential for optimal performance. In terms of RAM usage, SpamAssassin can easily consume 1GB, while ClamAV often requires at least 2GB. MySQL or MariaDB usually require upwards of 400MB of memory, dependent on configuration settings. Apache can consume around 250MB, and BIND\u0026rsquo;s memory usage can surpass 100MB, influenced by the number of hosted zones and its role as a recursive DNS server. PHP\u0026rsquo;s memory consumption typically exceeds 100MB and also varies significantly based on its configuration settings. At the lower end, Virtualmin uses about 30MB and Postfix remains around 5MB.\u003c/p\u003e","title":"Low Memory"},{"content":"In situations where a single system isn\u0026rsquo;t sufficient for hosting a website due to high traffic or reliability concerns, replicating the site across multiple systems is a viable solution. This can be done using a front-end load balancer or multiple DNS entries to distribute traffic.\nVirtualmin supports domain replication using backup and restore processes. Replication in Virtualmin is one-way, with a master system acting as the source of truth, and its state periodically copied to one or more replica systems.\nRequirements for domain replication For effective replication, all Virtualmin systems should share domain home directories from a central server, typically using NFS. A databases should also be stored remotely, accessible by all Virtualmin systems. This setup is crucial for dynamic websites to keep application states synchronized. For static content sites, file sharing setup might be optional.\nSetting up remote database and NFS This involves configuring remote database access and exporting/mounting directories via NFS. Detailed guides can be found here:\nRunning Database on a Remote System Exporting Directories via NFS Mounting Filesystems using NFS When databases and home directories are shared, only domain metadata needs replication.\nReplicating your first domain Once all systems are set up with shared storage, follow these steps to replicate a domain:\nCreate and test domain on master\nSet up your domain, for example domain.com on the master system named master.hostname.com\nTransfer domain to replica\nSSH into the master system as root. Run the command: virtualmin transfer-domain --domain domain.com --host replica.hostname.com --replication --output --overwrite Note: If SSH keys are not set up, use the --pass flag to specify the password for the root user on the replica system (not recommended). Update DNS or load balancer\nUpdate any DNS records or load balancer configuration for the domain.com domain to use the IPs of both master.hostname.com and replica.hostname.com systems.\nTest the site\nTest that the site is accessible and functions correctly when traffic is being sent to both systems.\nScheduled replication After successful manual replication, set up regular scheduled replication to keep settings in sync:\nCreate a cron job on the master system to run: virtualmin transfer-domain --domain domain.com --host replica.hostname.com --replication --overwrite If shared storage is used for home directories and databases, a frequent schedule (e.g., every 10 minutes) is feasible, as the amount of data to transfer will be small. Deleting domains When deleting a domain from a replica:\nUse the --preserve-remote flag in the delete-domain API command or the corresponding UI checkbox to avoid removing shared contents. For complete removal, delete the domain from all replicas first, then from the master system. A built-in domain synchronization feature in Cloudmin will automatically use replication mode when the destination system is running Virtualmin. ","permalink":"https://www.virtualmin.com/docs/system-optimization/replication-and-shared-storage/","summary":"\u003cp\u003eIn situations where a single system isn\u0026rsquo;t sufficient for hosting a website due to high traffic or reliability concerns, replicating the site across multiple systems is a viable solution. This can be done using a front-end load balancer or multiple DNS entries to distribute traffic.\u003c/p\u003e\n\u003cp\u003eVirtualmin supports domain replication using backup and restore processes. Replication in Virtualmin is one-way, with a master system acting as the source of truth, and its state periodically copied to one or more replica systems.\u003c/p\u003e","title":"Replication and Shared Storage"},{"content":"PCI DSS (Payment Card Industry Data Security Standard) is a set of security standards designed to ensure that all companies that accept, process, store, or transmit credit card information maintain a secure environment. If your business handles credit card transactions, it\u0026rsquo;s crucial to be compliant with PCI standards to protect cardholder data against breaches and fraud.\nSteps to achieve PCI compliance The process of becoming PCI compliant involves a self-assessment questionnaire and a security assessment by a third-party. Here, we focus on server-related changes to pass the security assessment.\nDisabling insecure protocols and ciphers Older protocols and ciphers like are considered insecure and must be disabled across all services, including Webmin, Apache, Nginx, Postfix, Dovecot and ProFTPD.\nWebmin configuration Go to Webmin Configuration ⇾ SSL Encryption page. Choose all SSL protocol versions to reject, which will leave only TLSv1.3 enabled. Select Only strong PCI-compliant ciphers option. Save the changes. Apache configuration Edit the Apache configuration file: On EL systems /etc/httpd/conf.d/ssl.conf file. On Debian and derivatives /etc/apache2/mods-enabled/ssl.conf file. Set the following directives: SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2 SSLHonorCipherOrder off SSLSessionTickets off Restart Apache running: On EL systems systemctl reload httpd command. On Debian and derivatives systemctl reload apache2 command. Nginx configuration Edit /etc/nginx/nginx.conf or the specific server block file under /etc/nginx/conf.d/ directory. Add or modify the following lines: ssl_protocols TLSv1.3; ssl_prefer_server_ciphers off; Restart Nginx by running systemctl restart nginx command. Postfix configuration Edit /etc/postfix/main.cf file. Add or modify the following lines: smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, !TLSv1.2 smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, !TLSv1.2 tls_preempt_cipherlist = no Restart Postfix by running systemctl restart postfix command. Dovecot configuration Edit /etc/dovecot/dovecot.conf file. Add or modify the following lines: ssl_min_protocol = TLSv1.3 ssl_prefer_server_ciphers = no Restart Dovecot by running systemctl restart dovecot command. As of November 2024, Microsoft Outlook does not support TLS 1.3. To maintain compatibility with Outlook clients, keep TLS 1.2 enabled alongside TLS 1.3 in your Postfix and Dovecot configurations. ProFTPD configuration Edit the ProFTPD configuration file: On EL systems /etc/proftpd/mod_tls.conf file. On Debian and derivatives /etc/proftpd/tls.conf file. Set the following directives: TLSProtocol TLSv1.3 TLSServerCipherPreference off TLSSessionTickets off Restart ProFTPD by running systemctl restart proftpd command. Hardening services Apache hardening To prevent Apache from revealing sensitive information:\nEdit the Apache configuration file as mentioned above. Include the following directives: ServerTokens Prod ServerSignature Off TraceEnable Off Restart Apache as mentioned above. Secure SSH Disable SSH protocol 1, which is insecure:\nEdit /etc/ssh/sshd_config.\nFind or add the line:\nProtocol 2 Note: On all modern systems, Protocol 2 should be the default enabled protocol for SSH already. This is a standard security measure, as Protocol 2 is significantly more secure than the older Protocol 1. Therefore, it\u0026rsquo;s uncommon to encounter Protocol 1 in use on modern installations. Restart SSH by using systemctl restart sshd command.\nAdditional Considerations Ensure that your system is up-to-date with the latest security patches. Review all services running on your server to disable unnecessary ones and to secure the necessary ones. Regularly audit your system\u0026rsquo;s security and monitor logs for any suspicious activity. Becoming PCI compliant is not a one-time event but an ongoing process that requires continuous attention and updates to your security measures.\nRemember that these steps might vary slightly based on the specific versions of software you\u0026rsquo;re running, and you might need additional measures to fully comply with PCI DSS requirements. Always consult with a PCI compliance expert to ensure that all aspects of your environment meet the standards.\n","permalink":"https://www.virtualmin.com/docs/security/pci-compliance/","summary":"\u003cp\u003ePCI DSS (Payment Card Industry Data Security Standard) is a set of security standards designed to ensure that all companies that accept, process, store, or transmit credit card information maintain a secure environment. If your business handles credit card transactions, it\u0026rsquo;s crucial to be compliant with PCI standards to protect cardholder data against breaches and fraud.\u003c/p\u003e\n\u003ch3 id=\"steps-to-achieve-pci-compliance\"\u003eSteps to achieve PCI compliance\u003c/h3\u003e\n\u003cp\u003eThe process of becoming PCI compliant involves a self-assessment questionnaire and a security assessment by a third-party. Here, we focus on server-related changes to pass the security assessment.\u003c/p\u003e","title":"PCI Compliance"},{"content":"Podman is a Virtualmin plugin for deploying and managing application containers per virtual server. It gives you a domain-aware workflow for containers and pods, with registry search, proxy paths, logs, browser terminal access, image-aware defaults, and runtime controls that fit naturally into the rest of Virtualmin.\nIt is designed to keep container management practical on shared hosting style systems too, where the domain owner, home directory, website proxy paths, and access permissions all matter.\nDeveloper Preview\nCurrently this plugin is available only to Virtualmin Pro users through the development download channel at download.virtualmin.dev, not the standard production repositories yet. For current availability and install details, see the announcement thread. Installation This plugin is currently distributed only through the Virtualmin development download channel for Virtualmin Pro users.\nFor Debian and derivatives:\ncurl -u \u0026#39;SERIAL:KEY\u0026#39; https://download.virtualmin.dev/webmin-virtualmin-podman-latest.deb -o /tmp/webmin-virtualmin-podman-latest.deb apt install /tmp/webmin-virtualmin-podman-latest.deb podman skopeo For EL systems:\ncurl -u \u0026#39;SERIAL:KEY\u0026#39; https://download.virtualmin.dev/webmin-virtualmin-podman-latest.rpm -o /tmp/webmin-virtualmin-podman-latest.rpm dnf install /tmp/webmin-virtualmin-podman-latest.rpm podman skopeo podman is required. skopeo is strongly recommended, because it is used for remote image metadata lookups and better image defaults detection.\nThe Virtualmin Podman plugin is only available to Virtualmin Pro subscribers. Accessing After installation, List Managed Containers appears in the left navigation menu for global management across all virtual servers.\nFor each virtual server that has the Podman containers feature enabled, Manage Containers appears in that domain\u0026rsquo;s navigation. This is where you create and manage that virtual server\u0026rsquo;s containers and pods.\nDomain owners and resellers can use this plugin only if the master administrator enables access in module configuration. Pod access can also be allowed only for master administrators, enabled for everyone, or disabled completely. Getting started Make sure the target virtual server has the Podman containers feature enabled. Open Manage Containers for that virtual server. Decide whether you need a single standalone container or a pod with multiple grouped containers. Search for an image, review the suggested defaults, and adjust ports, mounts, environment variables, and lifecycle options. If the app should be reachable through the domain, enable proxying and pick the published TCP port to use. After deployment, use logs, status, inspect metadata, and the browser terminal for day-to-day management. When to use a container vs a pod Use a standalone container when one app image can run by itself with its own ports, mounts, and restart policy. Use a pod when several containers should share networking, published ports, and a closer grouped lifecycle. Working with containers The per-domain containers page gives you a quick operational view of everything managed for that virtual server. Depending on your configured columns, you can see ports, proxy paths, volumes, environment summaries, status, health, runtime mode, uptime, logs, console access, restart policy, runtime IDs, and optional CPU and memory usage.\nBulk actions are available for Start Selected, Stop Selected, and Delete Selected containers.\nInstalling a container The container install form starts with the essentials and can expand into more advanced panels when needed.\nCore fields include:\nImage search: Start typing an image name to search the configured registry. The module checks architecture compatibility and can show metadata such as stars, pull counts, last update time, size, platforms, and overview text. Suggested defaults: The form can pre-fill ports, mounts, environment variables, health checks, and proxy hints using local image inspection, remote metadata, bundled presets, and optional custom presets. Name and description: Use a clear container name and optional description. Pod selection: A container can be created inside an existing pod that matches the selected runtime mode. Ports and proxying: Add one or more host-to-container port mappings. Leaving the host port blank lets the plugin allocate one automatically from the configured base port. If the virtual server supports website proxying, you can also proxy the app to a URL path under the domain. Volumes: Add one or more host path to container path mappings with read-write or read-only mode. Environment variables: Add variables in KEY=VALUE format. If a container is added to a pod, published ports and proxy settings belong to the pod instead of the container, while volumes remain container-specific.\nAdvanced container options The module can expose the following extra panels on create and edit pages:\nLifecycle: Pull-before-install, restart policy, max retries for on-failure, stop timeout, and stop signal. Health check: Health command, interval, timeout, start period, retries, and what to do when the container becomes unhealthy. Resource limits: Memory, swap, reservation, CPU shares, CPU limits, PID limits, shared memory, CPU pinning, NUMA memory nodes, block I/O weight, device throttling, ulimits, and optional user-slice cgroup-parent mode. Command behavior: Override the image\u0026rsquo;s default command or entrypoint when an application needs a different startup process. Extra run flags: Add advanced per-container podman run flags when needed. Module-managed flags are still protected and cannot be overridden here. Privileged and host access: Extra capabilities, no-new-privileges, read-only root filesystem, privileged mode, host PID/IPC access, and overrides for outside-home or sensitive mounts. Some resource limits, cgroup settings, and networking options depend on the selected runtime mode and host support. The most advanced resource controls are primarily intended for domain user (rootful) mode. Editing and operating containers The edit page is meant for both routine operations and troubleshooting.\nActions: Save, start, stop, restart, and delete. Quick tools: View logs and open a browser terminal. Runtime details: Current status, runtime ID, proxy URL, image, ports, mounts, and other container settings. Inspect metadata: Runtime inspect summary, create command, networks, mounts, environment variables, labels, image defaults, digests, and raw runtime or image inspect JSON. When you save container settings, the module reapplies them by reinstalling the container so the runtime configuration and the saved metadata stay in sync.\nThe browser terminal uses Webmin\u0026rsquo;s xterm module and is available only when the container is running.\nWorking with pods Pods are useful when an application stack should behave like a group instead of as isolated standalone containers. In this module, a pod can own the shared published ports, reverse proxy path, networking behavior, and common host bind mounts, while member containers stay easy to inspect and manage.\nPods can be managed per virtual server and, when enabled, through the global Pods view as well.\nPod list and lifecycle The Pods tab shows a configurable table with columns such as shared ports, proxy path, volumes, networks, network mode, status, runtime mode, member container count, restart policy, exit policy, uptime, creation time, and pod ID.\nBulk actions are available for Start Selected, Stop Selected, and Delete Selected pods.\nCreating a pod The main pod form covers the shared pieces first:\nName and description Port mappings Optional reverse proxy path under the virtual server\u0026rsquo;s domain Host bind mounts The advanced pod panels add deeper control:\nRuntime: Runtime mode, user namespace mode, infra container, hostname, and shared namespaces. Network: Default network, a specific Podman network, host networking, or no networking. Advanced networking: Static IPv4 or IPv6, MAC address, network aliases, DNS servers, DNS search domains, DNS options, extra host entries, and no-hosts or no-resolv behavior where supported. Lifecycle: Restart policy, exit policy, stop timeout, and replace-existing-pod behavior. Resources: Apply user-slice defaults or set pod-level CPU, memory, and shared memory limits. Mounts: SELinux relabeling and ownership shift behavior for pod bind mounts. You can also create and delete Podman networks directly from the pod form, in the selected runtime context, without leaving the page.\nViewing and cloning pods Each pod has a details page that shows:\nCurrent status, uptime, creation time, and runtime ID Shared ports, proxy settings, and mounted paths Runtime configuration and networking details Resource and mount settings Member containers with direct links to their logs and, when available, their console From the pod details page you can:\nOpen pod logs Clone the pod into a new pre-filled create form Pods are not edited in place because Podman does not support updating an existing pod definition in place. Instead, Clone Pod opens a new form pre-filled from the current pod, so you can adjust ports, paths, networking, mounts, or other settings and then create a new pod from that definition. If you want the new definition to take over the old one, use the pod lifecycle option to replace an existing pod with the same name.\nCloning is especially helpful when you want to duplicate a stack layout, tweak settings safely, or rebuild a pod definition without starting from scratch.\nGlobal views and downloaded images The global List Managed Containers page gives you a cross-domain view of all managed containers. If pod support is enabled for your account, the same page also includes a Pods tab for all module-managed pods across domains.\nThis makes it easier to:\nSpot which domain owns a given container or pod Review status and proxy paths across multiple sites Jump into the right virtual server quickly Use bulk lifecycle actions without opening each domain one by one The global area also includes Manage Downloaded Images, which shows the images currently present on the server, including tags, image IDs, digests, creation time, size, and how many containers use each image. You can remove unused images from there when cleaning up the host.\nRuntime modes This plugin supports two runtime modes:\nImage user (rootless): Podman runs as the virtual server owner and the container keeps the image\u0026rsquo;s user model. Domain user (rootful): Podman runs through the rootful runtime and the container process runs as the virtual server UID and GID. Recommended\nImage user (rootless) is the default and recommended mode for most deployments. The master administrator can expose runtime mode as:\nA user-selectable toggle A fixed informational note A hidden setting that still applies the configured default This matters because discovery of containers, pods, and Podman networks is runtime-aware, and some features are available only in certain runtime or network combinations.\nPermissions and safety behavior The module tries to keep container management safe by default while still giving administrators deeper controls when they need them.\nDomain owners can be limited to mounts inside their own virtual server home directory. Sensitive host paths are blocked by default unless an administrator explicitly allows them. Host namespace access and privileged mode are treated as advanced options. Reverse proxying requires a website-enabled virtual server and at least one published TCP port. Pod and container access can be granted separately through module configuration. Module configuration The configuration page is organized into a few practical sections.\nGeneral settings Podman command path Default runtime mode Runtime mode selector display policy Whether to forward the original HTTP hostname when proxying Access for domain owners and resellers Default number of log lines shown in viewers User interface settings Visible columns for container lists Visible columns for pod lists Visible panels on container create and edit pages Visible panels on the pod create page Registry and discovery Default registry used for image search Maximum number of registry search results per query Preset source mode The preset system can use bundled presets only, or merge them with your own custom JSON. Custom presets are stored at:\n/etc/webmin/virtualmin-podman/presets.json\nWhen custom mode is enabled, bundled and custom presets are merged, and your custom rules take precedence.\nContainer defaults Default restart policy Base port for auto-assigned host ports Whether to apply limits from the user slice by default Default extra capabilities Default hardening options Default host access options Default extra Podman run flags Pod defaults Whether pods are available to master administrators only, to everyone, or disabled Default infra container behavior Default user namespace mode Default shared namespaces Default network mode Default restart, exit, and stop-timeout behavior Default user-slice, CPU, memory, and shared memory settings Default SELinux relabeling and ownership shift behavior for pod mounts Default extra Podman create flags Requirements and notes This plugin requires Virtualmin Pro. podman must be installed and reachable by the configured command path. skopeo is recommended for richer remote image metadata and defaults detection. Webmin\u0026rsquo;s xterm module is required for browser console access. Proxy paths work only for virtual servers with website support enabled. There is no virtualmin command integration available for this plugin yet. Enabling CPU and memory usage columns adds one extra runtime stats query to the list page. For single-container apps, the module keeps deployment quick. For more complex stacks, pods add the extra structure you need without losing the per-domain Virtualmin workflow.\n","permalink":"https://www.virtualmin.com/docs/plugins/podman/","summary":"\u003cp\u003ePodman is a Virtualmin plugin for deploying and managing application\ncontainers per virtual server. It gives you a domain-aware workflow for\ncontainers and pods, with registry search, proxy paths, logs, browser terminal\naccess, image-aware defaults, and runtime controls that fit naturally into the\nrest of Virtualmin.\u003c/p\u003e\n\u003cp\u003eIt is designed to keep container management practical on shared hosting style\nsystems too, where the domain owner, home directory, website proxy paths, and\naccess permissions all matter.\u003c/p\u003e","title":"Podman"},{"content":"WP Workbench is a specially crafted Virtualmin plugin that simplifies WordPress management. It lets you manage core settings, update plugins and themes, run instant or scheduled backups to local or remote cloud storage, clone sites, search and replace across databases, and more, all from one place.\nWhether you have one site or many across local and remote servers, you can use the same interface or the CLI without having to log into each WordPress admin dashboard.\nInstallation This plugin is available in the standard Virtualmin Pro repositories and can be easily installed using your system\u0026rsquo;s package manager.\nFor Debian and derivatives:\napt install webmin-virtualmin-wp-workbench For EL systems:\ndnf install wbm-virtualmin-wp-workbench Accessing After installation, \u0026ldquo;WP Workbench Manager\u0026rdquo; appears in the left navigation menu for multi-site management (local and remote). \u0026ldquo;WP Workbench\u0026rdquo; is on each domain\u0026rsquo;s \u0026ldquo;Manage WordPress\u0026rdquo; page, accessible from that domain\u0026rsquo;s \u0026ldquo;Manage Web Apps\u0026rdquo; list.\nThe WP Workbench plugin is only available to Virtualmin Pro subscribers. Getting started Bulk-site management Go to \u0026ldquo;WP Workbench Manager\u0026rdquo; by clicking the link at the navigation menu Click \u0026ldquo;Find Instances\u0026rdquo; to scan for WordPress installations on local and remote systems View all your WordPress instances in the \u0026ldquo;Instances\u0026rdquo; tab Use the \u0026ldquo;Plugins\u0026rdquo;, \u0026ldquo;Themes\u0026rdquo;, or \u0026ldquo;Backups\u0026rdquo; tabs for bulk operations Click on any instance\u0026rsquo;s settings icon for individual management Click on any instance\u0026rsquo;s login icon for direct access to the WordPress admin area Use \u0026ldquo;Import Instances\u0026rdquo; to add WordPress sites not installed through Virtualmin Single-site management In the domain section, go to \u0026ldquo;Manage Web Apps\u0026rdquo; and choose the WordPress site to manage Select the tab corresponding to the task you want to perform Make your changes and click \u0026ldquo;Apply\u0026rdquo; to save them Use \u0026ldquo;Login to WordPress\u0026rdquo; for direct access to the WordPress admin area Access to WP Workbench for virtual server owners is only available if the master administrator has granted them permission to manage web apps. Bulk-site management WP Workbench Manager lets you manage multiple WordPress sites in one place, across local and remote servers.\nCentralized control: Manage multiple WordPress sites from one interface Speed: View and update core, plugins, and themes in bulk Safety: Schedule backups and easily restore them using local or cloud storage Remote management: Manage sites on remote systems connected via the \u0026ldquo;Webmin ⇾ Webmin Servers Index\u0026rdquo; module Performance monitoring: Track PHP versions, memory usage, and disk usage Convenience: One-click WordPress admin access without passwords Automation: Robust CLI for scripting common tasks with full integration with Virtualmin User interface tabs Instances The main dashboard shows all your WordPress sites across local and remote servers with comprehensive details:\nSite information: Title, URL, location (local/remote) WordPress version: Current version with update indicators Resource usage: PHP version, memory limits, disk space Plugin/theme counts: Number installed with update status Security status: Brute-force and password protection indicators Backup information: Number and total size of backups Quick actions: Settings, login, and management buttons per instance Bulk actions available:\nBulk apply System Enable/disable brute-force login failure protection Enable/disable password protection for admin dashboard Set automatic core updates (disabled/minor versions/major and minor versions) Backups Backup both files and database Backup only files Backup only database Development Set debug mode (disabled/display errors/log errors) Enable/disable maintenance mode Enable/disable cron job scheduler Check integrity Check for updates Upgrade selected instances Special features of this tab:\nRefresh Instances: Refresh the cache for all collected instances, both local and remote, to detect new installations or changes to existing instances Indexing creates the list of instances from local and remote servers. On larger setups, this may take some time. Until it\u0026rsquo;s done, sites won\u0026rsquo;t appear, and sites changed externally may show outdated info until the next refresh. Import Instances: Import existing installations that were created outside of Virtualmin to manage them alongside other sites Plugins Comprehensive plugin management across all instances:\nConsolidated view: All plugins from all sites in one table Version tracking: Current version and available updates highlighted Usage information: See which sites use each plugin Upgrade selected: Upgrade selected plugins across all sites Bulk actions available:\nBulk apply Activate Deactivate Delete Enable/disable auto-updates Special feature of this tab:\nUpgrade All Available Plugins: Upgrade all available plugins for all your instances in one go Themes Centralized theme management:\nUnified listing: All themes from all instances Version control: Track installed and available versions Usage tracking: Identify which sites use each theme Upgrade selected: Upgrade selected themes across all sites Bulk actions available:\nBulk apply Activate Delete Enable/disable auto-updates Special feature of this tab:\nUpgrade All Available Themes: Upgrade all available themes for all your instances in one go Backups Advanced scheduled backup management:\nScheduled backups: Create automated backups with flexible scheduling Multiple destinations: Local file system and cloud storage support Backup types: Full, database-only, or files-only Schedule options: Hourly, daily, weekly, monthly, or complex cron schedule Email notifications: Configure alerts for backup success or failure Retention policies: Automatic cleanup of old backups Backup logs: View and restore from backup history Multi-destination support: Send backups to multiple locations Configurable options Customize WP Workbench Manager using module config:\nRemote server support: Enable/disable remote instance management Note\nIf turned on, this feature lets you manage WordPress installations on remote servers listed in the \u0026ldquo;Webmin ⇾ Webmin Servers Index\u0026rdquo; module. Those servers need to be running Virtualmin Pro and have the \u0026ldquo;WP Workbench\u0026rdquo; plugin installed and active. After refreshing the instances, WordPress installations from remote servers listed in the module\u0026rsquo;s index page will appear and be manageable—just as if they were hosted on the local server. Background caching: Update instance data automatically Column visibility: Choose which information to display Sorting preferences: Default column sorting options Include extra columns: Show more details for plugins and themes tabs Site preview services: Select thumbnail provider for site previews among Automatic/Microlink/Thumb WP-CLI updates: Automatically upgrade WP-CLI with core updates Disk space calculation: Include disk space usage information Credential storage: Save admin login information securely Display options: Customize backup destination display format Single-site management WP Workbench offers a simple interface for in-depth control of a single WordPress site:\nSimplified management: Easily control the main WordPress site settings Time-saving: Perform bulk operations on plugins and themes Safety: Backup and restore options in a few clicks Enhanced security: Brute-force protection and password protection for admin dashboard Developer-friendly: Access to cloning, debugging tools, and database search-and-replace operations Convenience: One-click WordPress admin access Automation: Robust CLI for scripting common tasks with full integration with Virtualmin User interface tabs Dashboard This tab provides comprehensive site information:\nVisual site preview: Thumbnail preview of your WordPress site Web app details: WordPress core version with update status Plugin and theme counts with available updates Backup size and count Files and database size Memory usage limits SSL certificate expiry WP-CLI version: Installed command-line tool version Installation details: Site name and URLs Installation date and directory PHP version information Database credentials and table prefix Quick actions: Show detailed information Check integrity Check for updates Re-install WordPress core Update cache Login to WordPress admin Re-install dependencies Un-install web app System This tab helps you optimize WordPress performance and security:\nMemory limit: Set how much memory each script can use (default: 40M)\nFor small to medium sites, the default might be enough. Increase this if you have many plugins or complex functionality.\nAdmin memory limit: Allocate more memory for admin tasks (default: 256M)\nThis higher limit ensures plugin installations, updates, and admin tasks run smoothly.\nEnable brute-force login failure protection: Guard against brute force attacks\nMonitors failed login attempts and temporarily blocks suspicious IP addresses.\nEnable password protection for the admin dashboard: Add an extra layer of security\nRequires an additional username and password before accessing the WP admin dashboard login page. If enabled, the \u0026ldquo;Login to WordPress\u0026rdquo; button will only work after you enter this extra username and password. For convenience, you can save these credentials in your browser so automatic login always works. WordPress auto-updates: Control update behavior\nChoose between disabling all auto-updates, allowing only minor updates, or enabling all updates.\nSettings Manage core WordPress settings without accessing the WordPress dashboard:\nSite URL: Set where WordPress core files are located\nThis is the address where your WordPress site\u0026rsquo;s files and resources are accessed by users.\nHome URL: Set your site\u0026rsquo;s front page address\nThis URL points to the front page of your site.\nSite name: Your website\u0026rsquo;s title\nAppears in browser tabs, search results, and typically in the header area.\nSite tagline: Brief description of your site\nHelps visitors and search engines understand your site\u0026rsquo;s purpose.\nPermalink structure: Customize your URL format\nCreate user and SEO-friendly URLs for better navigation and search rankings.\nAdministrator settings: Manage admin credentials\nUpdate the selected administrator\u0026rsquo;s password and email address for the site.\nSearch engine visibility: Control indexing\nAllow or prevent search engines from listing your site.\nComment settings: Manage pingbacks and trackbacks\nControl how your site interacts with other blogs when linking content.\nFile editing: Enable or disable code editing in WordPress\nDisabling adds security by preventing plugin/theme code edits from the admin area.\nPlugins Comprehensive plugin management in one place:\nView all plugins: See installed version and update status Bulk actions: Easily manage multiple plugins at once Activate Deactivate Update Delete Enable/disable auto-updates Manage in WordPress: Direct link to WordPress plugin management Themes Keep your site\u0026rsquo;s appearance up-to-date and secure:\nView all themes: See installed version and update status Choose theme: Change active theme Bulk actions: Apply changes to multiple themes Activate Update Delete Enable/disable auto-updates Manage in WordPress: Direct link to WordPress theme management Backup and restore Protect your WordPress site with comprehensive backup and restore tools:\nBackup options: Full site backup (files and database) Files-only backup Database-only backup Restore capability: Recover from any available backup Backup management: Delete outdated backups Backup details: View size, date, and backup type information Clone Duplicate your WordPress site for testing or development:\nClone target options: Same domain (different directory) New subdomain New top-level domain Existing domain Customization options: Site URL (automatic or custom) Site name Administrator email Administrator password The domain name of the new clone is applied automatically, and all database tables are updated to match. The ability to clone a WordPress instance to a new sub-server is only available if the master administrator has granted the virtual server owner permission to create sub-servers and aliases. The ability to clone to top-level virtual servers is available to master administrators and resellers only. The tab to clone a WordPress instance will not be available to the virtual server owner unless the master administrator has granted them database management permissions. Development Control technical settings for troubleshooting and optimization:\nDebug mode: Three options for error handling\nDisabled (production sites) Display errors on screen (active development) Log errors to file (troubleshooting live sites) Maintenance mode: Show maintenance notice to visitors\nCan be customized with a custom maintenance.php file in wp-content directory.\nCron job scheduler: Enable/disable WordPress task scheduler\nUseful during migrations or when using external cron jobs.\nScripts concatenation: Combine JavaScript files\nImproves page load times by reducing HTTP requests.\nDatabase replacements: Search and replace strings in database\nA powerful tool for bulk database operations. Features include:\nTest mode for previewing changes Regular expression support Table and column filtering options Support for serialized data Command line interface Here are some examples of how to use the WP Workbench CLI to manage WordPress sites, either in bulk across multiple instances or individually on a local system.\nBulk-site management Use the virtualmin configure-all-scripts to manage multiple WordPress instances in bulk on either local or remote systems from the command line.\nBasic operations # Refresh instances cache virtualmin configure-all-scripts --app wordpress --refresh-instances # Import instances created outside Virtualmin virtualmin configure-all-scripts --app wordpress --import-instances # List all instances virtualmin configure-all-scripts --app wordpress --list instances # List all plugins across instances virtualmin configure-all-scripts --app wordpress --list plugins # List all themes across instances virtualmin configure-all-scripts --app wordpress --list themes System management # Enable brute-force protection for specific domains virtualmin configure-all-scripts --app wordpress \\ --domain domain.tld --domain example.org --action enable-fail2ban # Enable password protection for all domains virtualmin configure-all-scripts --app wordpress \\ --all-domains --action enable-httpdauth # Set auto-updates to minor versions only virtualmin configure-all-scripts --app wordpress \\ --all-domains --action enable-minor-updates # Upgrade WordPress core for selected domains virtualmin configure-all-scripts --app wordpress \\ --domain domain.tld --domain example.org --action upgrade-core # Check integrity of all installations virtualmin configure-all-scripts --app wordpress \\ --all-domains --action check-integrity Backup management # Create full backup for specific domain virtualmin configure-all-scripts --app wordpress \\ --domain domain.tld --action backup-full # Backup only database for all domains virtualmin configure-all-scripts --app wordpress \\ --all-domains --action backup-db # Backup only files for multiple domains virtualmin configure-all-scripts --app wordpress \\ --domain site1.com --domain site2.com --action backup-files Plugin management # Activate specific plugins across all sites virtualmin configure-all-scripts --app wordpress \\ --all-domains --action activate-plugins akismet,wordfence # Update all plugins on specific domains virtualmin configure-all-scripts --app wordpress \\ --domain domain.tld --action update-plugins # Enable auto-updates for specific plugins virtualmin configure-all-scripts --app wordpress \\ --all-domains --action enable-plugins-auto-updates jetpack,woocommerce # Deactivate and delete unused plugins virtualmin configure-all-scripts --app wordpress \\ --all-domains --action deactivate-plugins hello.php virtualmin configure-all-scripts --app wordpress \\ --all-domains --action delete-plugins hello.php Theme management # Update all themes across all sites virtualmin configure-all-scripts --app wordpress \\ --all-domains --action update-themes # Activate a specific theme on multiple sites virtualmin configure-all-scripts --app wordpress \\ --domain site1.com --domain site2.com --action activate-themes twentytwentyfour # Enable auto-updates for themes virtualmin configure-all-scripts --app wordpress \\ --all-domains --action enable-themes-auto-updates Development settings # Enable debug mode for development sites virtualmin configure-all-scripts --app wordpress \\ --domain domain.tld --action enable-debug # Enable maintenance mode during updates virtualmin configure-all-scripts --app wordpress \\ --all-domains --action enable-maintenance # Disable cron jobs for troubleshooting virtualmin configure-all-scripts --app wordpress \\ --domain domain.tld --action disable-cron-jobs For more details, just use the virtualmin configure-all-scripts --app wordpress command.\nSingle-site management Use the virtualmin configure-script to manage individual WordPress instances on the local system from the command line.\nSystem settings virtualmin configure-script --app wordpress --domain domain.tld \\ --apply \u0026#39;wp_memory_limit 512M\u0026#39; virtualmin configure-script --app wordpress --domain domain.tld \\ --apply \u0026#39;wp_admin_memory_limit 768M\u0026#39; WordPress settings virtualmin configure-script --app wordpress --domain domain.tld \\ --apply \u0026#39;blogname \u0026#34;My Site Name\u0026#34;\u0026#39; virtualmin configure-script --app wordpress --domain domain.tld \\ --apply \u0026#39;blogdescription \u0026#34;My Site Tagline\u0026#34;\u0026#39; Plugin management virtualmin configure-script --app wordpress --domain domain.tld \\ --apply \u0026#39;plugins activate plugin1,plugin2\u0026#39; virtualmin configure-script --app wordpress --domain domain.tld \\ --apply \u0026#39;plugins deactivate plugin1\u0026#39; virtualmin configure-script --app wordpress --domain domain.tld \\ --apply \u0026#39;plugins update plugin1,plugin2\u0026#39; Theme management virtualmin configure-script --app wordpress --domain domain.tld \\ --apply \u0026#39;themes activate twentytwentyfour\u0026#39; virtualmin configure-script --app wordpress --domain domain.tld \\ --apply \u0026#39;themes update theme1,theme2\u0026#39; Backup operations virtualmin configure-script --app wordpress --domain domain.tld \\ --apply \u0026#39;backup full\u0026#39; virtualmin configure-script --app wordpress --domain domain.tld \\ --apply \u0026#39;backup files\u0026#39; virtualmin configure-script --app wordpress --domain domain.tld \\ --apply \u0026#39;backup database\u0026#39; Site cloning virtualmin configure-script --app wordpress --domain domain.tld \\ --apply \u0026#39;clone same --dir=wordpress-clone\u0026#39; virtualmin configure-script --app wordpress --domain domain.tld \\ --apply \u0026#39;clone subdomain --subdomain=staging\u0026#39; WP-CLI management # Install or upgrade WP-CLI virtualmin configure-script --app wordpress --domain domain.tld \\ --wpi install # Get detailed instance information virtualmin configure-script --app wordpress --domain domain.tld \\ --wpi info For more details, just use the virtualmin configure-script --app wordpress command.\n","permalink":"https://www.virtualmin.com/docs/plugins/wp-workbench/","summary":"\u003cp\u003eWP Workbench is a specially crafted Virtualmin plugin that simplifies WordPress\nmanagement. It lets you manage core settings, update plugins and themes, run\ninstant or scheduled backups to local or remote cloud storage, clone sites,\nsearch and replace across databases, and more, all from one place.\u003c/p\u003e\n\u003cp\u003eWhether you have one site or many across local and remote servers, you can use\nthe same interface or the CLI without having to log into each WordPress admin\ndashboard.\u003c/p\u003e","title":"WP Workbench"},{"content":"This documentation explains how Virtualmin can be setup to store users and mail aliases in an LDAP database, rather than using files in /etc as it does by default. It is particularly useful when you want to spread the load of virtual hosting across multiple systems, and need to them to all stay in sync.\nThe information presented on this documentation page may no longer reflect the most current developments or practices. For accuracy and the benefit of all users, this content should be reviewed and updated. Contributions are welcome; if you have the updated information, please consider submitting it through a pull request (PR) to our GitHub repository to help us keep our documentation current. Introduction to LDAP LDAP (Lightweight Directory Access Protocol) is a way for clients to query and update a flexibly structured hierarchial database. In the Unix world, it is most commonly used to distribute user and group information from a central server to many client systems, so that users can login to any client. Typically it is combined with NFS, which makes user home directories available on all clients too.\nEach object in the database has a DN (distinguished name), which is formatted like:\ncn=joe,dc=example,dc=com As you can see, the DN is split into components, each of which is one element of the hierarchy. Most DNs are based on an internet domain name, although it is possible to use an organization\u0026rsquo;s structure instead.\nEach object in an LDAP database has one or more object classes. These determine what type of user it is, such as posixAccount for a Unix user, or posixGroup for a group. Users who have additional shadow password information will have the class shadowAccount too.\nEach object has a list of attributes, each of which has a name and value. Typical attributes for Unix users are uid for the username, homeDirectory, loginShell and userPassword. The attributes allowed for each object differ depending on the object\u0026rsquo;s classes.\nLDAP Access Control When a client connects to an LDAP server, it can either authenticate itself with a DN and password, or connect anonymously. The server\u0026rsquo;s configuration determines which are allowed, and which objects and attributes a client is allowed to read or write based on this DN.\nThe popular OpenLDAP server has a special root DN which has read/write access to everything in the database. This DN does not even have to exist in the database, as it is defined in the server\u0026rsquo;s configuration file.\nInstalling an LDAP Server An LDAP server is responsible for managing the data files that make up an LDAP database, and providing access to that data to clients via the network. The most popular free LDAP server is OpenLDAP (http://www.openldap.org/), which is available for pretty much all Unix-like operating systems.\nIf you are running EL system, such as Alma, Rocky, Fedora, Oracle or Red Hat, OpenLDAP can be installed with the command :\ndnf install openldap openldap-servers openldap-devel openldap-clients perl-LDAP To start and enable the server, run the following command :\nsystemctl enable --now slapd On an Ubuntu or Debian system, the command to use is :\napt-get install slapd libnet-ldap-perl On other operating systems, you will probably have to download, compile and install OpenLDAP manually. You should also install the Net::LDAP Perl module, which Webmin and Virtualmin need to talk to the server.\nSetting up Webmin\u0026rsquo;s LDAP Server Module This module allows you to configure an OpenLDAP server, manage objects in its database, and setup access control for objects. It can be found in Webmin under the Servers category. By default, it should be configured automatically to find the OpenLDAP package provided by the your Linux distribution vendor.\nBefore the LDAP server can be used to store users and groups, a few configuration steps must be performed. These can be skipped if you have already manually setup the server.\nClick on the OpenLDAP Server Configuration icon. In the Root DN for LDAP database field, enter a base DN for your LDAP database. This is typically based on your domain name, so for a domain like foo.com you would enter dc=foo,dc=com . In the Administration login DN field, enter a DN like cn=Manager,dc=foo,dc=com . In the New administration password field, select Set to and enter a new password of your choice. Click Save. Open the Manage Schema page, and make sure the nis schema is checked. If not, check it and click Save. Back on the main page, click Apply Configuration or Start Server. If Webmin prompts you to create the root DN you just specified, click the button to do so. Verify that the server is running and serving your base DN by clicking on the Browse Database icon. You should see the attributes of your new base object, which will have a class like domain.\nSince we want the LDAP server to remain running from now on, on the module\u0026rsquo;s main page select Yes next to the Start at boot button, and click it. This will enable the /etc/init.d script provided by your Linux distribution.\nCreating LDAP Trees Now you have a root DN, you will want to create another DN under it to contain your LDAP users. This can be considered like a sub-directory, and even though you could create all objects under one DN, it isn\u0026rsquo;t particularly neat and will slow down database searches.\nTo create a new DN for users, do the following :\nClick on the Create Tree icon. Select Distinguished name, and in the adjacent text field enter something like dc=Users,dc=foo,dc=com . Change Create example object under new DN? to Unix user. Click Create. If all goes well, the Users DN will be created, and an example Unix user object created under it. You can see them by navigating around on the Browse Database page.\nYou should then repeat the same steps to create a sub-tree for LDAP groups :\nClick on the Create Tree icon. Select Distinguished name, and in the adjacent text field enter something like dc=Groups,dc=foo,dc=com . Leave Create example object under new DN? set to No. Click Create. Storing Users in LDAP Most Unix-like operating systems (including Linux) can query an LDAP database for user and group information, which is then used by all programs and servers on the system. This means that LDAP users can login via SSH and FTP, own files, run processes and do everything that a user in /etc/passwd can do.\nIntroduction to NSS On Linux, NSS (Name Service Switch) is the library that determines where user and group information comes from. On a typical system only the /etc/passwd and /etc/group files were used, but because NSS is extensible it is possible to add support for any type of data source. Another that is often used is NIS, which has a similar client-server architecture to LDAP, but is losing popularity in favour of LDAP.\nBefore your system can fetch users from an LDAP database, the NSS module for it must be installed. On a Alma, Rocky, Fedora, Oracle or Red Hat system the command to do this is :\ndnf install nss_ldap nss-pam-ldapd openldap-clients While on Debian or Ubuntu Linux, the command to use is :\napt-get install libnss-ldap When run from the command line, this may ask several questions about the hostname of the LDAP server, the root DN and administration login. You should be able to answer them all based on the LDAP server setup done above.\nIntroduction to PAM PAM is a set of libraries and configuration files similar to NSS, but it deals only with passwords. It was designed to make the implementation of alternate authentication types (like RSA tokens or networked user databases) easier. Because you want users in the LDAP database to be able to login, you will need to install the a PAM module for it.\nOn Debian or Ubuntu Linux, the command to install is :\napt-get install libpam-ldap When run from the command line, this may ask several questions about the LDAP root DN and administration login. The answers should be the same as what you gave to the libnss-ldap package.\nFor reasons unknown to me, Debian and Ubuntu systems have two separate configuration files for LDAP integration, one for NSS and one for PAM - even though they really should contain the same information. To reduce your system to using just one, run the commands :\nmv /etc/pam_ldap.conf /etc/pam_ldap.conf.old ln -s /etc/libnss-ldap.conf /etc/pam_ldap.conf On Alma, Rocky, Fedora, Oracle or Red Hat systems the needed PAM libraries are part of the nss_ldap or nss-pam-ldapd package that you should have already installed in the previous step.\nSetting Up an LDAP Client System By now, you should have an LDAP database running with an example user in it. Your system has to be configured to actually use this database, which is best done using Webmin\u0026rsquo;s LDAP Client module (found under the System category).\nFirst, your system has to be told which LDAP server to use. To do this :\nClick on the LDAP Server Configuration icon. In the first row of the LDAP servers table, enter your system\u0026rsquo;s hostname or localhost in the Hostname field. In the Login for root user field, enter the full administrator\u0026rsquo;s DN, like cn=Manager,dc=foo,dc=com . In the Password for root user field, enter the password you selected when setting up the LDAP server. Click Save. Next, your system needs to know where in the LDAP database to find users :\nClick on LDAP Search Bases. In the Global search base field, enter your server\u0026rsquo;s base DN, like dc=foo,dc=com . In Base for Unix users enter the DN for your users\u0026rsquo; sub-tree, like dc=Users,dc=foo,dc=com . Enter the same DN in Base for Unix passwords. Similarly, in Base for Unix groups enter dc=Groups,dc=foo,dc=com . Click Save. At this point, you should be able to click on the LDAP Browser icon in this module and see the user and group sub-trees in your database. If it displays an error, check the settings made in the steps above.\nFinally, the system has to be told to use LDAP to find user and group details. To enable this :\nClick on Services Using LDAP. Click the Unix users entry in the table. On the page that appears, next to Second data source select LDAP, then hit Save. Do the same for Unix groups and Unix shadow passwords. If buttons appear on the module\u0026rsquo;s main page to start the local LDAP daemon and enable it at boot time, do that now.. To verify that everything is really working, click the Validate Configuration button on the main page of the LDAP Client module. It should find and display the example Unix user that was created when you setup your LDAP server. If not, use the error message to work out what might have gone wrong.\nIf you get an error like user does not exist even when you are sure everything is correct, try restarting Webmin with the /etc/webmin/restart command run as root at the command line. On some systems, user and group data sources are cached by running server processes until they are restarted.\nThese same steps can be repeated on any other system on your network that should share users and groups. Naturally, they will also need to NSS and PAM LDAP modules installed too. These other systems should share the base directory for users\u0026rsquo; homes (typically /home) via NFS, so that users can login to any LDAP client and access their files.\nOn some systems (notably Debian and Ubuntu), the www-data user Apache runs as cannot be a member of any domains\u0026rsquo; groups, which prevents websites from working in a default Virtualmin setup. To fix this, edit the /etc/ldap.conf file, find the nss_initgroups_ignoreusers line and remove www-data from it.\nNFS can be setup by using the NFS Exports module to share /home to the other client systems, and the Disk and Network Filesystems module on clients to add an NFS filesystem that mounts it. Typically one system will be both the LDAP and NFS server, but that doesn\u0026rsquo;t strictly have to be case, as long as they can all write to /home.\nSetting up PAM PAM has it\u0026rsquo;s own configuration files that determine when LDAP is used to check and change passwords. Unless they are setup, users created in LDAP will exist but will not be able to login. A command like id -a example will display a user from LDAP, but you will not be able to change his password with a command like passwd example.\nThis can be setup in Webmin\u0026rsquo;s PAM Authentication module, found under the System Category. The exact steps to take differ slightly between Redhat-based and Debian-based distributions though. Once they are done, you should be able to use the passwd command to set a password for the example user.\nPAM Setup On Debian and Ubuntu Debian-based systems have a separate PAM include file for each step. LDAP support needs to be added to each as follows :\nClick on common-account in the list of services. Select pam_ldap.so from the Add step for menu, then click the button. Change the Failure level to Sufficient, then click Create. Use the up arrow to move the new pam_ldap.so step above the existing pam_unix.so entry. These same steps should then be repeated for the common-auth, common-password and common-session services.\nPAM Setup on Alma, Rocky, Fedora, Oracle or Red Hat Redhat-based systems have a single common PAM service that is called by all others. LDAP support can be added to it as follows :\nClick on system-auth in the list of services. In the Authentication steps section, select pam_ldap.so from the Add step for menu, then click the button. Change the Failure level to Sufficient, then click Create. Use the up arrow to move the new pam_ldap.so step above the existing pam_unix.so entry. Repeat 1,2 and 3 in the Account verification, Session setup and Password change steps on the same page. Setting Up Webmin\u0026rsquo;s LDAP Users and Groups Module Even though you could theoretically add a user to an LDAP database using the LDAP Server module\u0026rsquo;s browser, it is much easier to use a Webmin module that takes care of selecting all the correct attributes for you. The LDAP Users and Groups module under the System category is similar to the more commonly used Users and Groups module, but operates directly on a local or remote LDAP database.\nAssuming that your system has been setup as an LDAP client, when you open the module it should display a list of existing users and groups, including the example user. If it displays an error about connecting to the database or searching for users, you may need to adjust settings on the Module Config page.\nTo ensure that user creation is working, try clicking on Add a new LDAP user, filling in the Username, Real name and Password, and clicking Create. If the user is added to the list with no errors, and if you can SSH into the system as the user, congratulations!\nIf you get an error like no strucutural object class provided when adding a user, the cause is almost certainly that your LDAP schema requires that users have the person object class. Webmin versions 1.404 and later add this automatically, but to have it added in older versions you should do the following :\nClick on the Module Config link, and enter person in the Other objectClasses to add to new users field. Go to the LDAP attributes section, and in the LDAP properties for all new users box enter sn: ${REAL} Click Save. Re-try creating a user. Creating LDAP Users with Virtualmin Once the LDAP Users and Groups module is working, you can configure Virtualmin to add new domain users and mailboxes to LDAP instead of files in /etc. This can be done as follows :\nOpen the System Settings category on Virtualmin\u0026rsquo;s left menu, and click on Virtualmin Config. Change Store users and groups to LDAP database, and click Save. If prompted, click the button to re-check the Virtualmin configuration. Go to Webmin\u0026rsquo;s Bootup and Shutdown module under the System category, and look for an nscd action. If you see it, check the box next to it and then click Disable Now and On Boot. The Name Service Caching Daemon causes problems for Virtualmin, as it adds delay between when a user is added to the database and when it becomes visible to other programs. Any domains or mailboxes created from now on will be added to LDAP. To avoid confusion, I suggest only making this change on a system that isn\u0026rsquo;t hosting any domains yet, so that they are all added to the same database.\nThe most common error is something like failed to create administration user or administration user was created but does not exist. This means that Virtualmin added an LDAP entry successfully, but when it used the getpwnam system call to check if the user is really known to Unix, he was not found. The most common cause is an incorrect LDAP client configuration, which should be revealed by the Validation Configuration button in the LDAP Client module. Another common cause is the nscd daemon, which adds a delay before users are visible and should be disabled.\nStoring Email Aliases in LDAP Just as users and groups can be stored in LDAP, so can email aliases used by mail servers like Postfix. These can then be read by multiple mail servers sharing the same configuration, to distribute the mail delivery load.\nThese instructions assume that you already have a working LDAP server as explained above, but don\u0026rsquo;t require that the system be setup to use LDAP for users or groups. Also, only Postfix is covered (even though Sendmail has similar capabilities), as only the Postfix Webmin module supports LDAP at the time of writing.\nPostfix\u0026rsquo;s LDAP Suppport Postfix stores aliases, virtual address mappings and other configuration tables in maps, which are typically DBM format files built from text files. However, with the right plugin modules it can use a MySQL or LDAP database instead, which can be queried over the network.\nOn Debian or Ubuntu systems, the command to install LDAP support for Postfix is :\napt-get install postfix-ldap On other systems, Postfix may come with LDAP support already enabled. If not, you may need to download and compile it manually. To check if your Postfix supports LDAP, run the command :\npostconf -m and look for ldap in the output.\nSetting up the LDAP Schema I\u0026rsquo;ve found that there doesn\u0026rsquo;t seem to be any consistent agreement on which LDAP object class and attributes to use for Postfix objects. However, the misc schema that comes with OpenLDAP defines a inetLocalMailRecipient class that is almost good enough.\nTo configure the schema fully, do the following :\nGo to the LDAP Server module, and click on Manage Schema. Check the box next to the misc schema (if it isn\u0026rsquo;t already), and click Save. Go back to the schema page, and click the Edit link next to the misc schema. Find the definition for the inetLocalMailRecipient class, which should be like : objectclass ( 2.16.840.1.113730.3.2.147 NAME \u0026#39;inetLocalMailRecipient\u0026#39; DESC \u0026#39;Internet local mail recipient\u0026#39; SUP top AUXILIARY MAY\t( mailLocalAddress $ mailHost $ mailRoutingAddress ) ) Change the AUXILIARY to STRUCTURAL, and click Save. Go back to the module\u0026rsquo;s main page, and click Apply Configuration. Creating LDAP Trees for Postfix Each Postfix map should have a separate sub-tree in the LDAP database. With Virtualmin, you will need at least trees for the alias and virtual maps, which can be created as follows :\nClick on Create Tree. Select Distinguished name, and in the adjacent field enter something like dc=Aliases,dc=foo,dc=com. Click Create. Repeat these steps to create the dc=Virtual,dc=foo,dc=com tree. Configuring the Webmin Postfix Module Now that the LDAP server is set, Postfix has to be told to talk to it. The first step is to have it use the correct LDAP object class, by doing :\nGo to the Postfix Mail Server module, and click on Module Config. Find the LDAP options section. Change the Object classes for maps to inetLocalMailRecipient . Change the Key attribute for map objects to mailLocalAddress . For Create separate DN for each domain?, select No . Click Save. Now you need to edit the maps for aliases and virtual domains to add LDAP data sources, as follows :\nGo to the Postfix Mail Server module, and click on Mail Aliases. Click the \u0026hellip; button next to Alias databases used by the local delivery agent. By default, this field will just contain something like hash:/etc/aliases. In the popup window, scroll down to the Map source 2 section and select LDAP server. Enter your LDAP server\u0026rsquo;s hostname in the LDAP server hosts field. Set the LDAP search base DN to the DN you created previously, such as dc=Aliases,dc=foo,dc=com . Set the Query filter to mailLocalAddress=%s . Set the Result attribute to mailRoutingAddress . In the Server login field, enter your LDAP server\u0026rsquo;s administration login, like cn=Manager,dc=foo,dc=com . Enter the LDAP administration password in the Server password field. Click Save at the bottom of the popup window. Click Save again back on the Mail Aliases page. It is also possible to use a different login, such as an LDAP account who just has read-write access to the aliases sub-tree.\nYou must now do the same thing on the Virtual Domains page. The only difference should be in the LDAP search base DN field, which should be set to something like dc=Virtual,dc=foo,dc=com .\nTo verify that everything is working, try adding an alias using Webmin and ensure that it shows up in the list of aliases. Then send email to the new alias, and check that it is forwarded correctly. If not, check the Postfix logs in /var/log/mail* for errors that explain why it couldn\u0026rsquo;t talk to the LDAP database.\nCreating LDAP Aliases with Virtualmin Once Webmin\u0026rsquo;s Postfix module is configured to use LDAP, Virtualmin should automatically detect this and create any new aliases in the same LDAP database. To verify that it is all working, click on Re-Check Config on the left menu, and look for any messages about problems talking to the database server.\nIf that all checks out OK, try adding a mail aliases in Virtualmin, sending email to it, and verifying that it is delivered OK. Do the same for a mailbox user, as each has at least one virtual map entry for his address.\nIf you plan to run more than one mail server, each must have the same LDAP map configuration. This can be simplified by just copying across the configuration files in /etc/postfix that you will see referenced in the map definitions.\n","permalink":"https://www.virtualmin.com/docs/advanced-tutorials/how-to-configure-ldap/","summary":"\u003cp\u003eThis documentation explains how Virtualmin can be setup to store users and mail aliases in an LDAP database, rather than using files in \u003ccode\u003e/etc\u003c/code\u003e as it does by default. It is particularly useful when you want to spread the load of virtual hosting across multiple systems, and need to them to all stay in sync.\u003c/p\u003e\n\n\n\n\n\n      \u003cdiv class=\"alert alert-warning\"\u003e\n        \u003ci class=\"wm wm-fw wm-sm wm-exclamation\"\u003e\u003c/i\u003e \u003cstrong\u003e\u003c/strong\u003e\u003cbr\u003e\n        The information presented on this documentation page may no longer reflect the most current developments or practices. For accuracy and the benefit of all users, this content should be reviewed and updated. Contributions are welcome; if you have the updated information, please consider submitting it through a pull request (PR) to our GitHub repository to help us keep our documentation current.\n      \u003c/div\u003e\n\n\n\u003ch2 id=\"introduction-to-ldap\"\u003eIntroduction to LDAP\u003c/h2\u003e\n\u003cp\u003eLDAP (Lightweight Directory Access Protocol) is a way for clients to query and update a flexibly structured hierarchial database. In the Unix world, it is most commonly used to distribute user and group information from a central server to many client systems, so that users can login to any client. Typically it is combined with NFS, which makes user home directories available on all clients too.\u003c/p\u003e","title":"How to Configure LDAP"},{"content":"Overview This feature is designed for environments where the root user navigates through different user home directories. It automatically switches the root user to the appropriate user when entering their home directory and logs out when exiting /home, ensuring correct file ownership and permissions.\nThis feature relies on the /etc/profile.d directory used by Bourne and compatible shells. It might not work in non-compatible shells. Implementation details Script location\nThe script is placed in the /etc/profile.d directory to ensure it is sourced for all users during login.\nScript name\nvirtualmin-switch-user-on-cd.sh\nScript content\n# Extract username from the home directory get_username_from_home() { local home_dir=\u0026#34;$1\u0026#34; local username=$(awk -F: -v home=\u0026#34;$home_dir\u0026#34; \u0026#39;$6 == home {print $1}\u0026#39; /etc/passwd) echo \u0026#34;$username\u0026#34; } # Function to switch user on cd switch_user_on_cd() { # If root is forced under for whatever reason exit if [ -n \u0026#34;$ROOT\u0026#34; ]; then return fi # Check if the current directory is not under /home if [[ \u0026#34;$PWD\u0026#34; != /home/* ]]; then if [[ -n \u0026#34;$ORIGINAL_USER\u0026#34; \u0026amp;\u0026amp; \u0026#34;$(whoami)\u0026#34; != \u0026#34;root\u0026#34; ]]; then exit fi else # Extract the username from the home directory if it\u0026#39;s under /home username=$(get_username_from_home \u0026#34;$PWD\u0026#34;) if [[ -n \u0026#34;$username\u0026#34; ]]; then if [[ \u0026#34;$(whoami)\u0026#34; != \u0026#34;$username\u0026#34; ]]; then export ORIGINAL_USER=$(whoami) export ORIGINAL_USER_PWD=$PWD export ORIGINAL_USER_OLDPWD=$OLDPWD sudo -H -u \u0026#34;$username\u0026#34; bash -c \u0026#39;export ORIGINAL_USER=\u0026#39;\u0026#34;$ORIGINAL_USER\u0026#34;\u0026#39;; \\ export ORIGINAL_USER_PWD=\u0026#39;\u0026#34;$ORIGINAL_USER_PWD\u0026#34;\u0026#39;; \\ export ORIGINAL_USER_OLDPWD=\u0026#39;\u0026#34;$ORIGINAL_USER_OLDPWD\u0026#34;\u0026#39;; \\ exec bash -l\u0026#39; if [ \u0026#34;$PWD\u0026#34; = \u0026#34;$ORIGINAL_USER_PWD\u0026#34; ]; then cd \u0026#34;$ORIGINAL_USER_OLDPWD\u0026#34; fi unset ORIGINAL_USER unset ORIGINAL_USER_PWD unset ORIGINAL_USER_OLDPWD fi fi fi } # Set the PROMPT_COMMAND to call the switch_user_on_cd function PROMPT_COMMAND=switch_user_on_cd Script installation\nsource /etc/profile.d/virtualmin-switch-user-on-cd.sh How it works User detection\nWhen the root user navigates to a directory under /home, the script uses the get_username_from_home function to extract the username based on the home directory path from the /etc/passwd file. The script then switches to the identified user using the sudo -H -u username command. Logout mechanism\nWhen the user navigates outside the /home directory, the script checks if the ORIGINAL_USER variable is set. If set, and the current user is not root, the script logs out the user, reverting control back to the root user. Disable mechanism\nSetting the environment variable ROOT=1 will disable the automatic user switch and logout behavior. This can be done in the shell by executing export ROOT=1. Testing and validation Navigate to a user\u0026rsquo;s home directory\ncd /home/charles Expected result: The shell switches to charles user. Navigate outside the /home directory\ncd / Expected result: The shell logs out the current user if ORIGINAL_USER was set, reverting control back to the root user. Disable automatic switching\nexport ROOT=1 cd /home/charles cd / Expected result: No user switching or logging out occurs due to the ROOT=1 variable. Benefits Ensures correct file ownership and permissions under user home directories. Provides an automated mechanism for user context switching. ","permalink":"https://www.virtualmin.com/docs/advanced-tutorials/auto-user-switch-in-shell-navigation/","summary":"\u003ch3 id=\"overview\"\u003eOverview\u003c/h3\u003e\n\u003cp\u003eThis feature is designed for environments where the \u003cem\u003eroot\u003c/em\u003e user navigates through different user home directories. It automatically switches the \u003cem\u003eroot\u003c/em\u003e user to the appropriate user when entering their home directory and logs out when exiting \u003ccode\u003e/home\u003c/code\u003e, ensuring correct file ownership and permissions.\u003c/p\u003e\n\n\n\n\n\n      \u003cdiv class=\"alert alert-warning\"\u003e\n        \u003ci class=\"wm wm-fw wm-sm wm-exclamation\"\u003e\u003c/i\u003e \u003cstrong\u003e\u003c/strong\u003e\u003cbr\u003e\n        This feature relies on the \u003ccode\u003e/etc/profile.d\u003c/code\u003e directory used by Bourne and compatible shells. It might not work in non-compatible shells.\n      \u003c/div\u003e\n\n\n\u003ch3 id=\"implementation-details\"\u003eImplementation details\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eScript location\u003c/strong\u003e\u003c/p\u003e","title":"Auto User Switch in Shell Navigation"},{"content":"Virtualmin includes a powerful virtualmin command-line script, that can be run from the Unix shell providing nearly all the functionality available in the web interface, facilitating automated management of servers, users, databases, and more.\nKey points of the command-line script Command format\nThe first parameter to the virtualmin command is the operation, like create-domain, followed by additional parameters specific to the operation, typically in the format --domain foo.com. Administrator access required\nThe script must be run as root due to its need for system-level access. For non-root usage, refer to the Remote API documentation. Success and failure indicators\nOperations output messages indicating their outcome, with the exit status (0 for success, non-zero for failure) serving as a reliable indicator. Help options\nUse help with any operation for detailed parameter information, or run virtualmin help for a list of all commands or virtualmin help command for specifics on a command. Example usage These command line snippets for Virtualmin can be put into a text file and executed as a shell script for various administrative tasks on a Virtualmin server.\nList all users, their plan, and email address #!/bin/sh virtualmin list-plans --name-only | while read plan; do echo $plan echo \u0026#34;------------------------------\u0026#34; virtualmin list-domains --multiline --toplevel --plan \u0026#34;$plan\u0026#34; | grep -e \u0026#39;^\\S\u0026#39; -e \u0026#34;Contact email:\u0026#34; | sed -e \u0026#39;s/Contact email: //\u0026#39; echo done Regenerate apache VirtualHost information Update Apache VirtualHost configuration using the latest template data:\n#!/bin/sh doms=`virtualmin list-domains --with-feature web --name-only` for dom in $doms; do virtualmin disable-feature --domain $dom --web --ssl --status --logrotate virtualmin enable-feature --domain $dom --web --ssl --status --logrotate done Convert server to store logs in /var/log/virtualmin/ #!/bin/sh mkdir /var/log/virtualmin/ for dom in `virtualmin list-domains --with-feature web --name-only`; do virtualmin disable-writelogs --domain $dom virtualmin modify-web --domain $dom --access-log /var/log/virtualmin/${dom}_access_log virtualmin modify-web --domain $dom --error-log /var/log/virtualmin/${dom}_error_log done Reset passwords for all virtual server owners Batch reset passwords for all top-level domain owners:\n#!/bin/sh for dom in `virtualmin list-domains --name-only --toplevel`; do virtualmin modify-domain --domain $dom --pass password done Reset passwords for all email, FTP, and database users #!/bin/sh for dom in `virtualmin list-domains --name-only`; do for user in `virtualmin list-users --domain $dom --name-only`; do virtualmin modify-user --user $user --domain $dom --pass password done done Reset passwords for all users, providing auto-generated password #!/bin/sh virtualmin reset-pass --all-domains List all domains and their owners (using domains config) #!/bin/sh for dom in /etc/webmin/virtual-server/domains/* ; do cat \u0026#34;$dom\u0026#34; | sort -t: -k2,2 | grep -E --no-filename \u0026#39;^dom=|^pass=|^user=\u0026#39; ; echo ; done Backup all virtual servers #!/bin/sh virtualmin backup-domain --all-domains --all-features --newformat --dest /backup Enable Postfix SNI for a domain #!/bin/sh virtualmin install-service-cert --domain example.com --add-domain --service postfix Reset Dovecot SNI for all domains #!/bin/sh for dom in `virtualmin list-domains --name-only --with-ssl`; do virtualmin install-service-cert --domain $dom --remove-domain --service dovecot virtualmin install-service-cert --domain $dom --add-domain --service dovecot done Break and re-create the linkage for the SSL sharing #!/bin/sh virtualmin modify-web --domain example.com --break-ssl-cert virtualmin modify-web --domain example.com --link-ssl-cert Generate a new self-signed certificate #!/bin/sh virtualmin generate-cert --domain example.com --self Request a Let’s Encrypt certificate #!/bin/sh virtualmin generate-letsencrypt-cert --domain example.com Renew a Let’s Encrypt certificate #!/bin/sh virtualmin generate-letsencrypt-cert --domain example.com --renew Migrate cPanel backup #!/bin/sh virtualmin migrate-domain --type cpanel --source /path/to/backup.tar.gz Restore Virtualmin domain config file #!/bin/sh virtualmin restore-domain --source /path/to/example.com.tar.gz --domain example.com --feature virtualmin --fix ","permalink":"https://www.virtualmin.com/docs/development/command-line-api/","summary":"\u003cp\u003eVirtualmin includes a powerful \u003ccode\u003evirtualmin\u003c/code\u003e command-line script, that can be run from the Unix shell providing nearly all the functionality available in the web interface, facilitating automated management of servers, users, databases, and more.\u003c/p\u003e\n\u003ch3 id=\"key-points-of-the-command-line-script\"\u003eKey points of the command-line script\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eCommand format\u003c/strong\u003e\u003cbr\u003e\nThe first parameter to the \u003ccode\u003evirtualmin\u003c/code\u003e command is the operation, like \u003ccode\u003ecreate-domain\u003c/code\u003e, followed by additional parameters specific to the operation, typically in the format \u003ccode\u003e--domain foo.com\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAdministrator access required\u003c/strong\u003e\u003cbr\u003e\nThe script must be run as \u003cem\u003eroot\u003c/em\u003e due to its need for system-level access. For non-\u003cem\u003eroot\u003c/em\u003e usage, refer to the Remote API documentation.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSuccess and failure indicators\u003c/strong\u003e\u003cbr\u003e\nOperations output messages indicating their outcome, with the exit status (0 for success, non-zero for failure) serving as a reliable indicator.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHelp options\u003c/strong\u003e\u003cbr\u003e\nUse \u003ccode\u003ehelp\u003c/code\u003e with any operation for detailed parameter information, or run \u003ccode\u003evirtualmin help\u003c/code\u003e for a list of all commands or \u003ccode\u003evirtualmin help command\u003c/code\u003e for specifics on a command.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"example-usage\"\u003eExample usage\u003c/h3\u003e\n\u003cp\u003eThese command line snippets for Virtualmin can be put into a text file and executed as a shell script for various administrative tasks on a Virtualmin server.\u003c/p\u003e","title":"Command Line API"},{"content":"Virtualmin offers both a command-line API and an HTTP-based remote API for extensive server management, including handling servers, users, databases, etc.\nThe command-line API is powerful but might not be ideal in every situation, particularly because it requires Unix shell with root access. For greater flexibility, an HTTP API can be used remotely.\nThe remote API To make remote calls:\nRemote calls must be made through the CGI, e.g: https://yourserver:10000/virtual-server/remote.cgi Provide a program parameter for the command-line program to invoke. Additional parameters can be included in the URL as CGI parameters. Example URL for creating a mail alias: https://yourserver:10000/virtual-server/remote.cgi?program=create-alias\u0026amp;domain=domain.com\u0026amp;from=sales\u0026amp;to=user@domain.com Both GET and POST HTTP requests are supported. POST requests are recommended for security reasons, as they do not expose the command-line program and its parameters in the URL.\nReading output The output from remote.cgi is plain text, including the command-line program\u0026rsquo;s output and an exit status line indicating success or failure.\nJSON and XML output For JSON output, add json=1 to the API call. For XML, use xml=1. Perl format is available with perl=1. Use multiline with any list-* API calls to get detailed output.\nAuthentication The remote API requires authentication using the same system as the web interface. It is accessible only by the master administrator for security reasons. Include HTTP authentication headers in your requests. Example command using wget for authentication: wget -qO- --http-user=root --http-passwd=pass \u0026#39;https://yourserver:10000/virtual-server/remote.cgi?program=list-domains\u0026#39; Example usage PHP example \u0026lt;?php $result = shell_exec(\u0026#34;wget -O - --quiet --http-user=root --http-passwd=pass --no-check-certificate \u0026#39;https://localhost:10000/virtual-server/remote.cgi?program=list-domains\u0026#39;\u0026#34;); echo $result; ?\u0026gt; Perl example #!/usr/bin/perl -w $result = `wget -O - --quiet --http-user=root --http-passwd=pass --no-check-certificate \u0026#39;https://localhost:10000/virtual-server/remote.cgi?program=list-domains\u0026#39;`; print \u0026#34;$result\\n\u0026#34;; Perl LWP example #!/usr/bin/perl -w use strict; use LWP; my $browser = LWP::UserAgent-\u0026gt;new(); $browser-\u0026gt;credentials(\u0026#34;localhost:10000\u0026#34;, \u0026#34;Webmin Server\u0026#34;, \u0026#34;root\u0026#34; =\u0026gt; \u0026#34;pass\u0026#34;); my $result = $browser-\u0026gt;get(\u0026#34;https://localhost:10000/virtual-server/remote.cgi?program=list-domains\u0026#34;); print $result-\u0026gt;content; ","permalink":"https://www.virtualmin.com/docs/development/remote-api/","summary":"\u003cp\u003eVirtualmin offers both a command-line API and an HTTP-based remote API for extensive server management, including handling servers, users, databases, etc.\u003c/p\u003e\n\u003cp\u003eThe command-line API is powerful but might not be ideal in every situation, particularly because it requires Unix shell with \u003cem\u003eroot\u003c/em\u003e access. For greater flexibility, an HTTP API can be used remotely.\u003c/p\u003e\n\u003ch3 id=\"the-remote-api\"\u003eThe remote API\u003c/h3\u003e\n\u003cp\u003eTo make remote calls:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRemote calls must be made through the CGI, e.g:\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehttps://yourserver:10000/virtual-server/remote.cgi\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003eProvide a \u003ccode\u003eprogram\u003c/code\u003e parameter for the command-line program to invoke.\u003c/li\u003e\n\u003cli\u003eAdditional parameters can be included in the URL as CGI parameters.\u003c/li\u003e\n\u003cli\u003eExample URL for creating a mail alias:\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  https://yourserver:10000/virtual-server/remote.cgi?program=create-alias\u0026amp;domain=domain.com\u0026amp;from=sales\u0026amp;to=user@domain.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBoth GET and POST HTTP requests are supported. POST requests are recommended for security reasons, as they do not expose the command-line program and its parameters in the URL.\u003c/p\u003e","title":"Remote API"},{"content":"Virtualmin allows the use of custom scripts (Shell, Perl, Python and etc.) to automate tasks around virtual server management. These scripts can be executed before or after creating, modifying, or deleting a virtual server, enhancing Virtualmin\u0026rsquo;s built-in capabilities or performing validations.\nRunning custom scripts Scripts can be set to run either before or after an action. If a pre-action script fails (returns a non-zero exit status), the planned action is prevented.\nExamples of custom scripts Post-creation script for downloading a file Consider a scenario where you want every new virtual server to download a specific file into its home directory from a website. To achieve this, you would use a script that runs after the server\u0026rsquo;s creation, for example:\n#!/bin/sh if [ \u0026#34;$VIRTUALSERVER_ACTION\u0026#34; = \u0026#34;CREATE_DOMAIN\u0026#34; ]; then cd \u0026#34;$VIRTUALSERVER_HOME\u0026#34; /usr/bin/wget -O somefile.tar.gz https://yourdomain.com/somefile.tar.gz /usr/bin/chown \u0026#34;$VIRTUALSERVER_USER\u0026#34;:\u0026#34;$VIRTUALSERVER_GROUP\u0026#34; somefile.tar.gz fi External database account management To automatically create and delete accounts in an external database for each new domain user, you can apply the following script:\n#!/bin/sh if [ -z \u0026#34;$VIRTUALSERVER_PARENT\u0026#34; ]; then if [ \u0026#34;$VIRTUALSERVER_ACTION\u0026#34; = \u0026#34;CREATE_DOMAIN\u0026#34; ]; then /usr/local/bin/add-to-remote-database.pl \u0026#34;$VIRTUALSERVER_USER\u0026#34; \u0026#34;$VIRTUALSERVER_PASS\u0026#34; fi if [ \u0026#34;$VIRTUALSERVER_ACTION\u0026#34; = \u0026#34;DELETE_DOMAIN\u0026#34; ]; then /usr/local/bin/remove-from-remote-database.pl \u0026#34;$VIRTUALSERVER_USER\u0026#34; fi fi Update SSL certificate for Prosody To automatically update the SSL certificate for Prosody, after a domain\u0026rsquo;s SSL certificate is updated, you can apply the following script:\n#!/bin/sh if [ \u0026#34;$VIRTUALSERVER_ACTION\u0026#34; = \u0026#34;SSL_DOMAIN\u0026#34; ]; then /usr/bin/cp -f /etc/ssl/virtualmin/$VIRTUALSERVER_ID/$VIRTUALSERVER_DOM.key /etc/prosody/certs/$VIRTUALSERVER_DOM.key /usr/bin/cp -f /etc/ssl/virtualmin/$VIRTUALSERVER_ID/$VIRTUALSERVER_DOM.combined /etc/prosody/certs/$VIRTUALSERVER_DOM.combined /usr/bin/chmod 600 /etc/prosody/certs/$VIRTUALSERVER_DOM.key /etc/prosody/certs/$VIRTUALSERVER_DOM.combined /usr/bin/chown prosody:prosody /etc/prosody/certs/$VIRTUALSERVER_DOM.key /etc/prosody/certs/$VIRTUALSERVER_DOM.combined /usr/bin/systemctl restart prosody.service fi Sync SSL certificate with a remote server To sync the SSL certificate with a remote server, you can apply the following script:\n#!/bin/sh if [ \u0026#34;$VIRTUALSERVER_ACTION\u0026#34; = \u0026#34;SSL_DOMAIN\u0026#34; ]; then # Define the base directory for the SSL files BASE_DIR=\u0026#34;/etc/ssl/virtualmin/$VIRTUALSERVER_ID\u0026#34; # Define the key and cert file paths KEY_FILE=\u0026#34;$BASE_DIR/$VIRTUALSERVER_DOM.key\u0026#34; CERT_FILE=\u0026#34;$BASE_DIR/$VIRTUALSERVER_DOM.cert\u0026#34; # Define the remote server\u0026#39;s hostname or IP address and username REMOTE_HOST=\u0026#34;username@remote-server-address\u0026#34; # Define the destination base path (same as the source server) DESTINATION_PATH=\u0026#34;$BASE_DIR/\u0026#34; # Use rsync to transfer the key file rsync -avz \u0026#34;$KEY_FILE\u0026#34; \u0026#34;$REMOTE_HOST\u0026#34;:\u0026#34;$DESTINATION_PATH\u0026#34; # Use rsync to transfer the cert file rsync -avz \u0026#34;$CERT_FILE\u0026#34; \u0026#34;$REMOTE_HOST\u0026#34;:\u0026#34;$DESTINATION_PATH\u0026#34; fi Set default WP Workbench options for new WordPress sites #!/bin/sh # Virtualmin CLI VIRTUALMIN=/usr/sbin/virtualmin [ -x \u0026#34;$VIRTUALMIN\u0026#34; ] || exit 0 # Only for script changes on a domain [ \u0026#34;$VIRTUALSERVER_ACTION\u0026#34; = \u0026#34;SCRIPT_DOMAIN\u0026#34; ] || exit 0 # Only for WordPress script [ \u0026#34;$VIRTUALSERVER_LASTSAVE_SCRIPT\u0026#34; = \u0026#34;wordpress\u0026#34; ] || exit 0 # Only for fresh installs [ \u0026#34;$SCRIPT_UPGRADE\u0026#34; = \u0026#34;1\u0026#34; ] \u0026amp;\u0026amp; exit 0 # Set memory limits for this WordPress site and enable brute-force protection \u0026#34;$VIRTUALMIN\u0026#34; configure-script \\ --app wordpress --app-path $SCRIPT_PATH --domain \u0026#34;$VIRTUALSERVER_DOM\u0026#34; \\ --apply \u0026#39;wp_memory_limit 512M\u0026#39; \\ --apply \u0026#39;wp_max_memory_limit 768M\u0026#39; \\ --apply \u0026#39;fail2ban_foreign true\u0026#39; exit 0 Setting up pre and post modification scripts Log in as the master administrator. Go to System Settings ⇾ Virtualmin Configuration page. Under Actions upon server and user creation section, set: Command to run before making changes to a server for pre-modification Command to run after making changes to a server for post-modification Click Save. Ensure your scripts have executable permissions and that you use absolute paths for their names.\nAvailable variables in scripts Scripts have access to environment variables starting with $VIRTUALSERVER_, similar to those described in Template Variables page. These variables contain details about the virtual server.\nThe action type is specified in $VIRTUALSERVER_ACTION, which can be:\nAction Description CREATE_DOMAIN Creating a new virtual server MODIFY_DOMAIN Modifying a virtual server DELETE_DOMAIN Deleting a virtual server DISABLE_DOMAIN Temporarily disabling a server ENABLE_DOMAIN Re-enabling a server DBNAME_DOMAIN Changing a server\u0026rsquo;s database login DBPASS_DOMAIN Changing a server\u0026rsquo;s database password RESTORE_DOMAIN Restoring a server from backup SSL_DOMAIN Modifying a server\u0026rsquo;s SSL certificate ","permalink":"https://www.virtualmin.com/docs/development/pre-and-post-domain-modification-scripts/","summary":"\u003cp\u003eVirtualmin allows the use of custom scripts (Shell, Perl, Python and etc.) to automate tasks around virtual server management. These scripts can be executed before or after creating, modifying, or deleting a virtual server, enhancing Virtualmin\u0026rsquo;s built-in capabilities or performing validations.\u003c/p\u003e\n\u003ch3 id=\"running-custom-scripts\"\u003eRunning custom scripts\u003c/h3\u003e\n\u003cp\u003eScripts can be set to run either before or after an action. If a pre-action script fails (returns a non-zero exit status), the planned action is prevented.\u003c/p\u003e","title":"Pre and Post Domain Modification Scripts"},{"content":"This page lists many of the template variables that you can use in email messages to domain owners and mailboxes, initial website content, Apache and BIND configurations and many other places in Virtualmin.\nIn all cases, variables like ${DOM} or $DOM will be replaced with the value from the domain or mailbox being created. Additional variables can be found by looking in one of the /etc/webmin/virtual-server/domains files. The parameters found in those files can all be used in the template variables.\nDomain template variables These variables apply to virtual server templates:\nVariable Description $DOM Domain name, e.g., example.com $IDNDOM Domain name in native character set, e.g., παράδειγμα.ευ $USER Virtual server\u0026rsquo;s admin login and Unix username $GROUP Unix group for mailboxes $PASS Plain text password $IP IP address for the virtual server $OWNER Virtual server description $EMAILTO Contact email address $HOME Home directory $ID Unique ID for each domain $PARENT Unique ID for the parent domain, if any $UID Unix UID for the server\u0026rsquo;s Unix user $GID Unix GID for the server\u0026rsquo;s Unix group $PREFIX Prefix/suffix for mailbox users $QUOTA Quota for Unix user and all mailboxes $UQUOTA Quota for Unix user only $BW_LIMIT Monthly bandwidth limit $BW_USAGE Bandwidth used this month $RESELLER Reseller\u0026rsquo;s login name, if any $DB Default database name $MYSQL_USER Username for MySQL login $MYSQL_PASS Password for MySQL login $RESELLER_DESC Reseller\u0026rsquo;s description $DISABLED List of disabled services $DISABLED_WHY Reason for virtual server being disabled When the template is related to a sub-server, variables for the parent server are also available with PARENT_DOMAIN_ prefix, like $PARENT_DOMAIN_HOME and $PARENT_DOMAIN_DOM. Variables corresponding to the custom fields will use the format $VIRTUALSERVER_FIELD_fieldname with fieldname representing the custom field\u0026rsquo;s name.\nDomain feature variables The following variables are available in any virtual server related template, and will be set to 1 if the feature they are related to is enabled, 0 if not. They are most useful in blocks like ${IF-DNS} ... ${ENDIF-DNS}.\nVariable Description $DIR Virtual server has a home directory $UNIX Server has a Unix login $VIRT Private IP address is associated with virtual server $WEB Website enabled $MAIL Email for the domain is accepted $SSL Website with SSL support enabled $DNS DNS domain exists $LOGROTATE Log rotation for web/FTP logs enabled $MYSQL Server has MySQL login/databases $POSTGRES Server has PostgreSQL login $WEBALIZER Web traffic reporting by Webalizer $FTP Virtual anonymous FTP site enabled $SPAM Spam filtering for email enabled $VIRUS Virus filtering enabled $STATUS Website status monitoring active Plugin feature-related variables:\nVariable Description $VIRTUALMIN-DAV DAV access to website $VIRTUALMIN-SVN SVN access to repositories $VIRTUALMIN-MAILMAN Mailing lists for the server $VIRTUALMIN-AWSTATS AWstats web traffic reporting $VIRTUALMIN-GOOGLE-ANALYTICS Analytics tracking $VIRTUALMIN-REGISTRAR DNS domain registration $VIRTUALMIN-SLAVEDNS DNS domain is a slave $VIRTUALMIN-MAILRELAY Email relayed to another server $VIRTUALMIN-INIT Commands run at boot time Mailbox variables Variables for mailbox/FTP user templates:\nVariable Description $USER Full Unix username $MAILBOX Email address\u0026rsquo; first part before @ sign $PASS Encrypted password $PLAINPASS Plain-text password $QUOTA Disk quota $UQUOTA Disk space used $EMAIL Full email address $EXTRA Additional email addresses $HOME Home directory $REAL Real name of the user $SHELL Unix shell $UID Mailbox Unix user\u0026rsquo;s UID $GID Unix user\u0026rsquo;s GID $FTP Set to 1 if FTP access, 0 if not $SSH Set to 1 if SSH access, 0 if not Variables in domain modification scripts If you\u0026rsquo;ve set up Virtualmin to execute a script before or after making modifications to a virtual server, all the variables mentioned on this page are accessible as Unix environment variables. However, they begin with VIRTUALSERVER_ prefix, such as $VIRTUALSERVER_DOM and any dashes are substituted with underscores.\nFor details and examples, see Domain Management API page.\n","permalink":"https://www.virtualmin.com/docs/development/template-variables/","summary":"\u003cp\u003eThis page lists many of the template variables that you can use in email messages to domain owners and mailboxes, initial website content, Apache and BIND configurations and many other places in Virtualmin.\u003c/p\u003e\n\u003cp\u003eIn all cases, variables like \u003ccode\u003e${DOM}\u003c/code\u003e or \u003ccode\u003e$DOM\u003c/code\u003e will be replaced with the value from the domain or mailbox being created. Additional variables can be found by looking in one of the \u003ccode\u003e/etc/webmin/virtual-server/domains\u003c/code\u003e files. The parameters found in those files can all be used in the template variables.\u003c/p\u003e","title":"Template Variables"},{"content":"Introduction to plugins Before starting on a plugin, we suggest that you first read the Webmin module developers guide.\nA Virtualmin plugin is simply a Webmin module that can provide additional features to Virtualmin virtual servers or users. To do this, it must contain a Perl script called virtual_feature.pl which defines certain functions. The plugin module can then be registered by Virtualmin, and the feature it offers will then be available when creating new virtual domains.\nA plugin typically adds a new possible to virtual servers, in addition to the standard features built into Virtualmin (website, DNS domain and so on). For example, it may enable reporting using some new statistics generator, or activate some game server in the virtual domain. Virtualmin will add options to the Create Virtual Server and Edit Virtual Server pages for enabling the plugin\u0026rsquo;s feature, and call functions in its virtual_feature.pl when the feature is activated, de-activated or changed.\nStarting a plugin The steps to start writing your own plugin are similar to those for creating a new Webmin module:\nFind the Webmin root directory, which will be /usr/libexec/webmin on EL systems or /usr/share/webmin on Debian and derivatives.\nPick a directory name for your plugin that is not currently in use by any other Webmin module. Plugin directories typically start with virtualmin- - so for the purposes of this documentation, we will assume that yours is going to be called virtualmin-your-plugin.\nCreate that directory under the Webmin root. Then within it, create help and lang sub-directories.\nCreate a file in the directory called module.info. This should contain lines like:\ndesc=Your Plugin version=1.0 hidden=1 Naturally, the desc= line should be changed to something more meaningful. If you intend for the plugin to be visible in Webmin\u0026rsquo;s module menu, you can remove the hidden=1 line and specify a category for the plugin\u0026rsquo;s placement. However, it\u0026rsquo;s worth noting that in most cases, plugins are primarily accessed through Virtualmin and don\u0026rsquo;t need to appear in Webmin\u0026rsquo;s menu.\nCreate a module library file for your plugin, named virtualmin-your-plugin-lib.pl. Initially, it can contain the following code:\nuse WebminCore; \u0026amp;init_config(); \u0026amp;foreign_require(\u0026#34;virtual-server\u0026#34;); 1; Create a plugin API file called virtual_feature.pl, containing the following initial code:\ndo \u0026#39;virtualmin-your-plugin-lib.pl\u0026#39;; sub feature_name { return \u0026#34;A description of your plugin\u0026#34;; } Open Virtualmin in your browser, and click on Features and Plugins under System Settings on the left menu. Your new plugin should appear in the list of those available. Check its box in the left column, and click Save.\nWith this done, you can now start work on expanding the capabilities of the plugin by implementing the API documented below.\nPackage and distribution Since a plugin is just a Webmin module, the usual process for packaging it still applies. The commands to do this are:\ncd /usr/libexec/webmin tar cvzf /tmp/virtualmin-your-plugin.wbm.gz virtualmin-your-plugin As you can see, a module or plugin is just a tar file of the directory. These can then be installed using the Webmin Configuration module, on the Webmin Modules page.\nIf you prefer to package your plugin as an RPM, this can be done using the makemodulerpm.pl script. It must be run as root as shown below:\ncd /usr/libexec/webmin /usr/local/bin/makemodulerpm.pl --target-dir /tmp virtualmin-your-plugin This will create a file named wbm-virtualmin-your-plugin-1.0-1.noarch.rpm in the /tmp directory.\nA similar script named makemoduledeb.pl exists for Debian and derivatives.\nPlugin CGI scripts Because a plugin is just a Webmin module, it can contain .cgi scripts like any other module. These can be useful for displaying additional information about the feature that the plugin manages, or for managing objects within that feature (such as mailing lists or user accounts). Most plugins will not need to include any CGI scripts, as their functionality is provided entirely by implementing the API functions described below.\nYou can see some examples by looking at the Nginx plugin.\nThe plugin API The core functionality of a plugin lies in its implementation of an API that Virtualmin calls when performing tasks such as enabling or disabling the plugin\u0026rsquo;s feature for a domain. All of these functions must be defined in the file virtual_feature.pl, which should be located in the plugin\u0026rsquo;s directory. The specific functions you define may vary, depending on the functionality your plugin is implementing.\nFor each function the name, supplied parameters, description and an example implementation are shown.\nMany functions are passed a domain object as a parameter. This is simply a hash reference that is used internally by Virtualmin to store information about a virtual server. Some of the useful keys in the hash are:\nParameter Description dom The domain name, like foo.com user The administration username for the domain home The server\u0026rsquo;s home directory ip The server\u0026rsquo;s IP address (which may be virtual or shared) In addition, for each feature the domain has enabled, the code for that feature will be set to 1 in the hash. For example, a domain with a website has web set to 1, for email the code is mail, and for a Webmin login the code is webmin. Virtualmin will add an entry for your plugin when its feature is enabled for the domain, the code for which will be the same as the plugin\u0026rsquo;s directory.\nCore functions Functions in this section must be implemented by all plugins.\nfeature_name() This must return a short name for the feature, like My plugin.\nsub feature_name { return \u0026#34;My plugin name\u0026#34;; } Functions for features The most common use for plugins is to add a new feature that can be selected when a virtual server is created or modified. The functions listed in this section should be implemented in this case, although not all are mandatory.\nfeature_label(edit-form) This must return a longer name for the feature, for display in the server creation and editing pages. The edit-form parameter can be used to determine which page is calling the function.\nsub feature_label { return \u0026#34;Enable my plugin\u0026#34;; } feature_check() This optional function will be called when the plugin is registered by Virtualmin, to check that all of its dependencies are met. It must return undefined if everything is alright, or an error message if some program or service that the plugin depends upon is missing. If not implemented, Virtualmin will assume that the plugin has no dependencies.\nsub feature_check { if (! \u0026amp;has_command(\u0026#34;someprogram\u0026#34;)) { return \u0026#34;The commmand someprogram required by this plugin is not installed\u0026#34;; } else { return undef; } } feature_losing(domain) This should return text to be displayed when this feature is being removed from a domain. The domain parameter is the Virtualmin domain hash reference for the server the feature is being removed from.\nsub feature_losing { return \u0026#34;My plugin for this virtual server will be disabled\u0026#34;; } feature_disname(domain) This optional function should return a description of what will be done when this feature is temporarily disabled. It is only needed if your plugin implements the feature_disable function, indicating that it can be disabled.\nsub feature_disname { return \u0026#34;My plugin will be temporarily de-activated\u0026#34;; } feature_clash(domain) If activating this plugin feature in the given domain would clash with something already on the system, this function must return an error message. Otherwise, it can just return undef.\nsub feature_clash { my ($d) = @_; if (-r \u0026#34;/etc/someprogram/$d-\u0026gt;{\u0026#39;dom\u0026#39;}\u0026#34;) { return \u0026#34;Some program is already enabled for this domain\u0026#34;; } else { return undef; } } feature_depends(domain) If implemented, this function should check if the given domain object has all the features enabled that would be required by this plugin. For example, if your plugin implements something that is accessible via the web, the domain must have the web feature set. If a dependency is missing it must return an error message explaining this, or undefined if everything is alright.\nsub feature_depends { my ($d) = @_; if ($d-\u0026gt;{\u0026#39;web\u0026#39;}) { return undef; } else { return \u0026#34;My plugin requires a website\u0026#34;; } } feature_suitable(parentdom, aliasdom, superdom) This function should check the given parent domain, alias target domain and super-domain objects, to ensure that they are suitable for this feature. It can be useful for preventing the plugin from being enabled in sub-domains or alias domains, where it may not be appropriate. It must return 1 if the feature can be used, or 0 if not. If not implemented, Virtualmin will not allow use of your plugin.\nsub feature_suitable { my ($parent, $alias, $super) = @_; if ($parent \u0026amp;\u0026amp; !$parent-\u0026gt;{\u0026#39;web\u0026#39;}) { return 0; } else { return 1; } } feature_setup(domain) This function will be called when the plugin feature is being enabled for some server, either at creation time or when the server is subsequently modified. It must perform whatever actions are needed, such as modifying config files, running commands and so on. It should notify the user of the features activation by calling the functions first_print and second_print, like so:\nsub feature_setup { my ($d) = @_; \u0026amp;$virtual_server::first_print(\u0026#34;Setting up My plugin..\u0026#34;); my $ex = system(\u0026#34;somecommand --add $d-\u0026gt;{\u0026#39;dom\u0026#39;} \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;); if ($ex) { \u0026amp;$virtual_server::second_print(\u0026#34;.. failed!\u0026#34;); return 0; } else { \u0026amp;$virtual_server::second_print(\u0026#34;.. done\u0026#34;); return 1; } } feature_delete(domain) This function is called when the feature is removed for some server, either at deletion time or when the server is modified. It must perform whatever config file changes or run whatever commands are needed to turn the feature off, and should use the first_print and second_print functions to notify the user about what it is doing.\nsub feature_delete { my ($d) = @_; \u0026amp;$virtual_server::first_print(\u0026#34;Turning off up My plugin..\u0026#34;); system(\u0026#34;somecommand --remove $d-\u0026gt;{\u0026#39;dom\u0026#39;} \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;); \u0026amp;$virtual_server::second_print(\u0026#34;.. done\u0026#34;); } feature_modify(domain, olddomain) Whenever a virtual server is modified, this function will be called in all plugins. It should check if some attribute of the server that the plugin uses has changed (like dom or user), and update the appropriate config files. For example, if your feature configures some program that needs to know the virtual server\u0026rsquo;s domain name, this function must compare $domain→{'dom'} and $olddomain→{'dom'} , and if they differ perform whatever updates are needed. It should only produce output when it actually does something though.\nsub feature_modify { my ($d, $oldd) = @_; if ($d-\u0026gt;{\u0026#39;dom\u0026#39;} ne $oldd-\u0026gt;{\u0026#39;dom\u0026#39;}) { \u0026amp;$virtual_server::first_print(\u0026#34;Changing domain for My plugin ..\u0026#34;); rename(\u0026#34;/etc/someprogram/$oldd-\u0026gt;{\u0026#39;dom\u0026#39;}\u0026#34;, \u0026#34;/etc/someprogram/$d-\u0026gt;{\u0026#39;dom\u0026#39;}\u0026#34;); \u0026amp;$virtual_server::second_print(\u0026#34;.. done\u0026#34;); } } feature_disable(domain) If this function is defined, it will be called when a virtual server with the plugin feature active is disabled. It should temporarily turn off access to the feature in a non-destructive way, so that it can be fixed later by a call to feature_enable.\nsub feature_disable { my ($d) = @_; \u0026amp;$virtual_server::first_print(\u0026#34;Temporariliy disabling My plugin ..\u0026#34;); rename(\u0026#34;/etc/someprogram/$d-\u0026gt;{\u0026#39;dom\u0026#39;}\u0026#34;, \u0026#34;/etc/someprogram/$d-\u0026gt;{\u0026#39;dom\u0026#39;}.disabled\u0026#34;); \u0026amp;$virtual_server::second_print(\u0026#34;.. done\u0026#34;); } feature_enable(domain) This function will be called when a virtual server with the plugin\u0026rsquo;s feature is re-enabled. It should undo whatever changes were made by the feature_disable function. It only needs to be implemented if feature_disable is.\nsub feature_enable { my ($d) = @_; \u0026amp;$virtual_server::first_print(\u0026#34;Re-enabling My plugin ..\u0026#34;); rename(\u0026#34;/etc/someprogram/$d-\u0026gt;{\u0026#39;dom\u0026#39;}.disabled\u0026#34;, \u0026#34;/etc/someprogram/$d-\u0026gt;{\u0026#39;dom\u0026#39;}\u0026#34;); \u0026amp;$virtual_server::second_print(\u0026#34;.. done\u0026#34;); } feature_bandwidth(domain, start, bwhash) If defined, this function should report to Virtualmin the amount of bandwidth used by some virtual server since the given start Unix time. Bandwidth is the total number of bytes uploaded and downloaded, broken down by day. This function should scan whatever log file is available for the feature, extract upload and download counts for the domain, and add to the values in the bwhash hash reference.\nBecause bandwidth is accumulated by day, the bwhash hash is index by the number of days since 1st Jan 1970 GMT, which is simply a Unix time divided by 86400.\nfeature_webmin(domain, other-domains) If you want your plugin to provide access to a Webmin module to the owners of virtual servers that have its feature enabled, this function can be used tell Virtualmin which modules access should be granted to. Typically, a plugin will grant access to its own module, which will have standard CGI scripts for use in further configuring whatever service the plugin enables.\nThis function must return a list of array references, each of which has two values:\nThe directory of a module to grant access to (typically just $module_name)\nA hash reference of ACL values to set in that module for the domain owner. This is typically used to restrict domain owner to just the configurations relevant to the given domain.\nThe domain parameter is the virtual server object that this feature is enabled in, and other-domains is an array reference of other virtual servers that are owned by the same user as domain, and which have the plugin\u0026rsquo;s feature enabled. This latter parameter should be taken into account in order to grant access to configure all of the user\u0026rsquo;s servers.\nsub feature_webmin { my ($d, $all) = @_; my @fdoms = grep { $_-\u0026gt;{$module_name} } @$all; if (@fdoms) { return ( [ $module_name, { \u0026#39;doms\u0026#39; =\u0026gt; join(\u0026#34; \u0026#34;, @fdoms) } ] ); } else { return ( ); } } feature_import(domain-name, user-name, db-name) This function is called when an existing virtual server is being imported into Virtualmin. It should return 1 if the service configured by the plugin is already active for the given domain, perhaps because it was set up manually.\nsub feature_import { my ($dname, $user, $db) = @_; if (-r \u0026#34;/etc/someprogram/$dname\u0026#34;) { return 1; } else { return 0; } } feature_links(domain) This optional function allows the plugin to provide additional links on the left menu when a domain with the feature enabled is selected. It must return a list of hash references, each containing the following keys:\nKey Description mod The module the link is to, typically $module_name desc The text of the link page The CGI within the module that the link is to cat The left-side menu category that this link should appear under, such as services or logs A link to a module that the current Webmin user does not have access to will not be displayed. This means that you should almost always define feature_webmin as well, and make sure it returns the plugin\u0026rsquo;s module.\nsub feature_links { my ($d) = @_; return ( { \u0026#39;mod\u0026#39; =\u0026gt; $module_name, \u0026#39;desc\u0026#39; =\u0026gt; \u0026#34;Manage My plugin\u0026#34;, \u0026#39;page\u0026#39; =\u0026gt; \u0026#39;index.cgi?dom=\u0026#39;.$d-\u0026gt;{\u0026#39;dom\u0026#39;}, \u0026#39;cat\u0026#39; =\u0026gt; \u0026#39;services\u0026#39;, } ); } feature_always_links(domain) This function is similar to feature_links, but is called regardless of which domain is selected. It can be used when you have a page that can be used even for virtual servers that don\u0026rsquo;t have the plugin\u0026rsquo;s feature active.\nfeature_validate(domain) This function is optional, and is used by Virtualmin domain validation page. If implemented, it should check to ensure that all configuration files and other settings specific to the domain are setup properly. If any problems are found it should return an error message string, otherwise undefined.\nsub feature_validate { my ($d) = @_; if (!-r \u0026#34;/etc/someprogram/$d-\u0026gt;{\u0026#39;dom\u0026#39;}\u0026#34;) { return \u0026#34;Missing someprogram configuration file\u0026#34;; } else { return undef; } } virtusers_ignore(domain) This optional function should be implemented by plugins that add and manage email aliases to a domain, for example, one that deals with mailing lists or auto-responders. Because you don\u0026rsquo;t generally want these aliases showing up in the general list of those in the domain, it should return a list of full addresses to hide from the list.\nsub virtusers_ignore { my ($d) = @_; return ( \u0026#34;myplugin@$d-\u0026gt;{\u0026#39;dom\u0026#39;}\u0026#34; ); } Limits and template functions Plugins can define fields that will appear on the owner limits page for a virtual server, and in server templates. Limits are useful if your plugin uses up resources of some kind, such as disk space for databases or memory for server processes. You can then allow the master administrator to define limits on these resources, via functions documented here.\nVirtualmin templates are the location of most configuration settings that are used when creating new virtual servers. If your plugin has some adjustable settings that might be used when it is enabled, you can implement the functions below to add new input fields to templates. These can then be fetched in your plugin\u0026rsquo;s feature_setup function with the get_template call.\nfeature_limits_input(domain) This optional function should return a HTML inputs for limits specific to this plugin\u0026rsquo;s feature. The initial values of those limits should be take from the domain object, where they must be stored in keys starting with the plugin\u0026rsquo;s name (to avoid clashes). The HTML returned must make use of the ui_table_row function to format table columns.\nsub feature_limits_input { my ($d) = @_; if ($d-\u0026gt;{$module_name}) { return \u0026amp;ui_table_row(\u0026#34;Maximum My plugin databases\u0026#34;, \u0026amp;ui_opt_textbox($module_name.\u0026#34;limit\u0026#34;, $d-\u0026gt;{$module_name.\u0026#34;limit\u0026#34;}, 4, \u0026#34;Unlimited\u0026#34;, \u0026#34;At most\u0026#34;)); } } feature_limits_parse(domain, in) This function parses the HTML form inputs generated by feature_limits_input. It should examine the in hash reference and update the domain object to set or clear limits based on the user\u0026rsquo;s selections. If any errors are found it should return an error message string, or undefined if all is alright.\nsub feature_limits_parse { my($d, $in) = @_; if (!$d-\u0026gt;{$module_name}) { # Do nothing } elsif ($in-\u0026gt;{$module_name.\u0026#34;limit_def\u0026#34;}) { delete($d-\u0026gt;{$module_name.\u0026#34;limit\u0026#34;}); } else { $in-\u0026gt;{$module_name.\u0026#34;limit\u0026#34;} =~ /^\\d+$/ || return \u0026#34;Limit must be a number\u0026#34;; $d-\u0026gt;{$module_name.\u0026#34;limit\u0026#34;} = $in-\u0026gt;{$module_name.\u0026#34;limit\u0026#34;}; } return undef; } template_input(template) This optional function must return HTML for editing template settings specific to this plugin. The template parameter is a hash reference to a template object, which contains settings for all features and plugins. Yours should only show and edit keys that start with the plugin\u0026rsquo;s module name, so that they are properly merged when a non-default template is edited. HTML returned must make use of the ui_table_row function to format table columns.\nsub template_input { my ($tmpl) = @_; return \u0026amp;ui_table_row(\u0026#34;Default My plugin database size\u0026#34;, \u0026amp;ui_opt_textbox($module_name.\u0026#34;dbsize\u0026#34;, $tmpl-\u0026gt;{$module_name.\u0026#34;dbsize\u0026#34;}, 5, \u0026#34;Default\u0026#34;).\u0026#34;MB\u0026#34;); } template_parse(template, in) This function must check in for selections made by the user in the fields created by template_input, and then update the template hash reference. If there are any errors in the user\u0026rsquo;s input it should return an error string, or undefined if everything is alright. Template keys must start with the plugin\u0026rsquo;s module name, so that they are properly merged when a non-default template is edited.\nsub template_parse { my ($tmpl, $in) = @_; if ($in-\u0026gt;{$module_name.\u0026#34;dbsize_def\u0026#34;}) { delete($tmpl-\u0026gt;{$module_name.\u0026#34;dbsize\u0026#34;}); } else { $in-\u0026gt;{$module_name.\u0026#34;dbsize\u0026#34;} =~ /^\\d+$/ || return \u0026#34;Database size must be a number\u0026#34;; $tmpl-\u0026gt;{$module_name.\u0026#34;dbsize\u0026#34;} = $in-\u0026gt;{$module_name.\u0026#34;dbsize\u0026#34;}; } } Backup and restore functions In the Virtualmin architecture, each feature and plugin is responsible for backing up and restoring configuration files associated with a domain, but which are stored outside the virtual server\u0026rsquo;s home directory. If your plugin adds a feature to Virtualmin which stores data in some location that won\u0026rsquo;t be included in a domain\u0026rsquo;s regular backup, you should implement the functions in this section to ensure that it is backed up and restored.\nfeature_backup(domain, file, opts, all-opts) This function should copy configuration files associated with the virtual server object domain and copy them to the path given by file. If there is just a single file then it can be copied directly, otherwise, your code should create a tar file of all required files and write it to that path.\nThe first_print and second_print functions should be called to tell the user that the backup is starting, and if it has succeeded or failed. If the copy was successful the function should return 1, or 0 on failure.\nsub feature_backup { my ($d, $file) = @_; \u0026amp;$virtual_server::first_print(\u0026#34;Copying My plugin configuration file ..\u0026#34;); my $ok = \u0026amp;copy_source_dest(\u0026#34;/etc/someprogram/$d-\u0026gt;{\u0026#39;dom\u0026#39;}\u0026#34;, $file); if ($ok) { \u0026amp;$virtual_server::second_print(\u0026#34;.. done\u0026#34;); return 1; } else { \u0026amp;$virtual_server::second_print(\u0026#34;.. copy failed!\u0026#34;); return 0; } } feature_restore(domain, file, opts, all-opts) This function is the opposite of feature_backup. It should take the data in the file passed in with the file parameter, and update local config files or databases for the virtual server defined in domain to restore those settings. The format of file will be exactly the same as whatever your plugin created in the feature_backup function, although it may be in a different location.\nThe first_print and second_print functions should be called to tell the user that the restore is starting, and if it has succeeded or failed. If the process was successful the function should return 1 or 0 on failure.\nsub feature_restore { my ($d, $file) = @_; \u0026amp;$virtual_server::first_print(\u0026#34;Restoring My plugin configuration file ..\u0026#34;); my $ok = \u0026amp;copy_source_dest($file, \u0026#34;/etc/someprogram/$d-\u0026gt;{\u0026#39;dom\u0026#39;}\u0026#34;); if ($ok) { \u0026amp;$virtual_server::second_print(\u0026#34;.. done\u0026#34;); return 1; } else { \u0026amp;$virtual_server::second_print(\u0026#34;.. copy failed!\u0026#34;); return 0; } } Other user interface functions These functions aren\u0026rsquo;t really related to any feature or capability that the plugin provides, instead, the allow it to add elements to the Virtualmin user interface.\nsettings_links If implemented, this function should return a list of hash references, each of which defines a new link under the System Settings menu. These are only accessible to the master administrator, and appear regardless of which domain is selected. They typically link to global configuration pages for the plugin.\nEach hash must contain the following keys:\nKey Description link The URL path to link to, relative to the Webmin root title The text of the link icon URL path to an icon for the link (deprecated) cat The category for this settings link, such as setting or email or ip sub settings_links { return ( { \u0026#39;link\u0026#39; =\u0026gt; \u0026#34;/$module_name/edit_config.cgi\u0026#34;, \u0026#39;title\u0026#39; =\u0026gt; \u0026#34;My plugin configuration\u0026#34;, \u0026#39;icon\u0026#39; =\u0026gt; \u0026#34;/$module_name/images/config.gif\u0026#34;, \u0026#39;cat\u0026#39; =\u0026gt; \u0026#39;setting\u0026#39; } ); } theme_sections Theme displays various information on the right-hand system information page after you login, such as the status of servers, available updates and comparative quota use. This function allows your plugin to add sections of its own, typically to display global status information.\nIf defined, it must return a list of hash references, each containing the following keys:\nKey Description title The title of the section html The HTML to appear within the section when it is opened. Forms that submit to CGIs within the plugin are perfectly fine status Set to 1 if you want the section to be open by default, 0 if not for_master This must be set to 1 if the section should be visible to the master administrator for_reseller Set to 1 if it should be visible to resellers for_owner Set to 1 if it should be visible to individual domain owners sub theme_sections { return ( { \u0026#39;title\u0026#39; =\u0026gt; \u0026#39;My plugin status\u0026#39;, \u0026#39;html\u0026#39; =\u0026gt; \u0026amp;is_server_running() ? \u0026#39;Some program is running fine\u0026#39; : \u0026#39;Some program is down!\u0026#39;, \u0026#39;status\u0026#39; =\u0026gt; 0, \u0026#39;for_master\u0026#39; =\u0026gt; 1 } ); } Functions for mailboxes A Virtualmin plugin can also provide extra capabilities to virtual server users. This is done by implementing additional functions in the virtual_feature.pl file, similar to those used for adding a new server feature. This can be used for granting users access to some new service, like a game server or database, which is not supported natively by Virtualmin.\nWhen a plugin adds capabilities to a user, additional inputs will typically appear on the user editing page. In additional, the plugin can define extra columns to appear in the user list, to display the status of the new user capabilities.\nMost of the functions above take a user details hash reference as a parameter. Some of the useful keys in this hash are:\nField Description user The full Unix username of the user, which may have the domain name appended real The real name of the user, such as Jamie Cameron home The user\u0026rsquo;s home directory, which is typically under the virtual server\u0026rsquo;s home pass The user\u0026rsquo;s encrypted Unix password plainpass If the user\u0026rsquo;s password has just been changed or set, this field will contain the plain text password. It is not always available though, for example when editing a user without changing the password The functions that can be added to virtual_feature.pl to support user capabilities are:\nmailbox_inputs(user, new, domain) This function is called when the page for editing a virtual server user is displayed. The user parameter is a hash reference of user details, such as the login name, real name and home directory. The new parameter will be set to 1 if this is a new user, or 0 if editing an existing user. The domain parameter is a hash reference of virtual server information, as used in the plugin functions documented above.\nThis function must return HTML for the additional inputs to display, formatted to fit inside a 2-column table. This is best done with functions from ui-lib.pl, like:\nsub mailbox_inputs { my ($user, $new, $d) = @_; my $access = \u0026amp;check_user_access($user); return \u0026amp;ui_table_row(\u0026#34;Allow access to My plugin?\u0026#34;, \u0026amp;ui_yesno_radio(\u0026#34;myplugin\u0026#34;, $access)); } It should detect the current state of the user, and use this information to determine the values of the inputs.\nmailbox_validate(user, olduser, in, new, domain) This function is called when the user form is saved, but before any changes are actually committed. It should check the form inputs in the in hash reference to make sure they are valid, and return either undefined on success, or an error message if there is some problem.\nmailbox_save(user, olduser, in, new, domain) This function must save the actual settings selected for this user, by updating whatever configuration files are needed for this capability. The user parameter is the update user details hash, containing his new username, password, real name and other attributes. The olduser parameter is the user hash from before the changes were made, and can be compared with user to detect username and other changes. in is the form inputs hash, new is a flag indicating if this is a new or edited user, and domain is the details of the virtual server this user is in.\nsub mailbox_save { my ($user, $olduser, $in, $new, $d) = @_; if ($user-\u0026gt;{\u0026#39;user\u0026#39;} ne $olduser-\u0026gt;{\u0026#39;user\u0026#39;}) { \u0026amp;set_user_access($olduser, 0); } \u0026amp;set_user_access($user, $in-\u0026gt;{\u0026#39;myplug\u0026#39;} ? 1 : 0); } mailbox_delete(user, domain) This function is called when a user is deleted. It should check to see if he has the capability managed by this plugin enabled, and if so perform whatever tasks are needed to remove it. The parameters are the same as those for the mailbox_save function.\nsub mailbox_save { my ($user, $d) = @_; \u0026amp;set_user_access($user, 0); } mailbox_modify(user, olduser, domain) This function gets called when a user is modified by some part of Virtualmin other than the Edit Users page, for example by the modify-user.pl command-line script. It should compare the old and new user objects to see if anything that this plugin uses has changed, such as the username or password. If so, it must update whatever configuration files the plugin uses.\nsub mailbox_modify { my ($user, $olduser, $d) = @_; if ($user-\u0026gt;{\u0026#39;user\u0026#39;} ne $olduser-\u0026gt;{\u0026#39;user\u0026#39;}) { my $oldaccess = \u0026amp;get_user_access($olduser); \u0026amp;set_user_access($olduser, 0); \u0026amp;set_user_access($user, $oldaccess); } } mailbox_header(domain) If you want an additional column to appear in the user list indicating the state of this plugin\u0026rsquo;s capability for users, this function should return the title for the column. Otherwise, it should just return undefined. If you don\u0026rsquo;t need to define any extra column, then you don\u0026rsquo;t even need to implement it.\nsub mailbox_header { return \u0026#34;Plugin access\u0026#34;; } mailbox_column(user, domain) When a column exists for this plugin in the user list, this function will be called once for each user. It must return the text to display. If mailbox_header is not implemented, then this function doesn\u0026rsquo;t need to be either.\nsub mailbox_column { my ($user, $d) = @_; return \u0026amp;check_user_access($user) ? \u0026#34;Yes\u0026#34; : \u0026#34;No\u0026#34;; } mailbox_defaults_inputs(defs, domain) Virtualmin Pro allows users to define various defaults for new users added to domains, on a per-domain basis. If your plugin wants to be able to add to these defaults, you can implement this function. The defs parameters is a hash reference for a user object containing the defaults, which should be checked to find the current status for your settings.\nsub mailbox_defaults_inputs { my ($defs, $d) = @_; return \u0026amp;ui_table_row(\u0026#34;Allow access to My plugin by default?\u0026#34;, \u0026amp;ui_yesno_radio(\u0026#34;myplugin\u0026#34;, $defs-\u0026gt;{\u0026#39;myplugin\u0026#39;})); } mailbox_defaults_parse(defs, domain, in) This function is the counterpart to mailbox_defaults_inputs. It should check form inputs in in and use them to update the default settings object defs.\nsub mailbox_defaults_parse { my ($defs, $d, $in) = @_; $defs-\u0026gt;{\u0026#39;myplugin\u0026#39;} = $in-\u0026gt;{\u0026#39;myplugin\u0026#39;}; } Database Functions In the core package, Virtualmin supports MySQL/MariaDB and PostgreSQL databases. However, the plugin architecture allows developers to add new database types which can then be associated with virtual servers. Typically a plugin that adds databases will also implement the feature_ functions, so that the new database type can be enabled for new or existing virtual servers, just as is the case for MySQL/MariaDB and PostgreSQL.\nBecause Virtualmin allows mailbox users to have access to some database types, the plugin can also include support for creating, listing and managing additional users associated with each database. Because not all database systems support granting a user full access to a database, implementation of the user-related functions is optional.\ndatabase_name() This function must return the name of the database type.\nsub database_name { return \u0026#34;FooSQL\u0026#34;; } database_list(domain) This function must return a list of the names of databases owned by the given domain object, each of which is a hash reference containing the following keys:\nKey Description name The unique database name type The database type code, typically set to $module_name desc A description of the database type, usually the same as returned by database_name users A flag, set to 1 if the database supports multiple users, 0 if not link A URL path for managing the database\u0026rsquo;s contents. If you have not implemented this, it this key can be left out Typically the list of databases for a domain will be stored in the domain hash itself, in a key named db_$module_name. This removes the need for the plugin to store the domain-database mapping separately.\nsub database_list { my ($d) = @_; my @rv; foreach my $db (split(/\\s+/, $d-\u0026gt;{\u0026#39;db_\u0026#39;.$module_name})) { push(@rv, { \u0026#39;name\u0026#39; =\u0026gt; $db, \u0026#39;type\u0026#39; =\u0026gt; $module_name, \u0026#39;desc\u0026#39; =\u0026gt; \u0026amp;database_name(), \u0026#39;link\u0026#39; =\u0026gt; \u0026#34;/$module_name/edit_dbase.cgi?db=$db\u0026#34; }); } return @rv; } databases_all() This function should return a list of all databases known to the database server the plugin manages, even those not associated with any domain. Its return format should be the same as database_list.\nsub databases_all { my @rv; foreach my $dbname (\u0026amp;list_foosql_databases()) { push(@rv, { \u0026#39;name\u0026#39; =\u0026gt; $dbname, \u0026#39;type\u0026#39; =\u0026gt; $module_name, \u0026#39;desc\u0026#39; =\u0026gt; \u0026amp;database_name() }); } return @rv; } database_clash(domain, name) This function must check if a database of the type managed by the plugin with the given name already exists, and if so return 1. It is used by Virtualmin to prevent database name collisions at creation time. If no clash exists, it must return 0.\nsub database_clash { my ($d, $name) = @_; foreach my $db (\u0026amp;list_foosql_databases()) { return 1 if ($db eq $name); } return 0; } database_create(domain, name) This function is where the real work of creating a new database should happen. It must perform all the work needed to add a database and associate it with the virtual server, typically by adding it to the db_$module_name key in the domain hash reference. It should use first_print to output a message before creation starts, and second_print to display success or failure when done. It should return 1 if creation was successful, 0 if not.\nAccess to the new database must be granted to the virtual server\u0026rsquo;s owner. For databases managed by some kind of server (like MySQL/MariaDB and PostgreSQL), the domain\u0026rsquo;s username and password must be able to login to access the new database. These can be found in the domain hash in the user and pass keys.\nsub database_create { my ($d, $name) = @_; \u0026amp;$virtual_server::first_print(\u0026#34;Creating FooSQL database $name ..\u0026#34;); my $err = \u0026amp;create_foosql_database($name); if ($err) { \u0026amp;$virtual_server::second_print(\u0026#34;.. failed : $err\u0026#34;); return 0; } else { \u0026amp;$virtual_server::second_print(\u0026#34;.. done\u0026#34;); $d-\u0026gt;{\u0026#39;db_\u0026#39;.$module_name} .= \u0026#34; \u0026#34;.$name; return 1; } } database_delete(domain, name) This function must delete a database of the type managed by this plugin, and remove access to it from the virtual server. Like database_create, it should use the print functions to display progress and status to the user.\nsub database_delete { my ($d, $name) = @_; \u0026amp;$virtual_server::first_print(\u0026#34;Deleting FooSQL database $name ..\u0026#34;); my $err = \u0026amp;delete_foosql_database($name); if ($err) { \u0026amp;$virtual_server::second_print(\u0026#34;.. failed : $err\u0026#34;); return 0; } else { \u0026amp;$virtual_server::second_print(\u0026#34;.. done\u0026#34;); $d-\u0026gt;{\u0026#39;db_\u0026#39;.$module_name} =~ s/\\s+\\Q$name\\E//g; return 1; } } database_size(domain, name) This function is called by Virtualmin when a user displays information about a database, and when computing a virtual server\u0026rsquo;s total disk usage. It must return two numbers:\nThe size of the database on disk, in bytes.\nThe number of tables in the database.\nsub database_size { my ($d, $name) = @_; my $size = \u0026amp;disk_usage_kb(\u0026#34;/var/foosql/$name\u0026#34;); my @tables = \u0026amp;list_foosql_tables($name); return ( $size*1024, scalar(@tables) ); } database_users(domain, name) If the plugin\u0026rsquo;s database type supports multiple logins, this function can be implemented to return a list of array references, each of which contains a login and password. Only users associated with domain and with access to the database specified by the name parameter need to be returned. If the password is encrypted, it is fine to use that as the second element of each array ref.\nsub database_users { my ($d, $name) = @_; return \u0026amp;execute_foosql_sql($name, \u0026#34;select login,password from users where db = \u0026#39;$name\u0026#39;\u0026#34;); } database_create_user(domain, database, user, password) This function must create a new database with with access to the database specified by the database parameter, which is a hash reference returned by database_list. The new user must have the login set by the user parameter, and password specified by password. If something goes wrong, it should call error function.\nsub database_create_user { my ($d, $db, $user, $pass) = @_; \u0026amp;execute_foosql_sql($db-\u0026gt;{\u0026#39;name\u0026#39;}, \u0026#34;create user \u0026#39;$user\u0026#39; with password \u0026#39;$pass\u0026#39;\u0026#34;); } database_modify_user(domain, old-database, database, old-user, user, password) This function must modify the user in the database specified by the old-database parameter and named old-user, changing his login to user and password to password (if provided). If the modification fails, it should call error function.\nsub database_modify_user { my ($db, $olddb, $db, $olduser, $user, $pass) = @_; if ($user ne $olduser) { \u0026amp;execute_foosql_sql($olddb-\u0026gt;{\u0026#39;name\u0026#39;}, \u0026#34;rename user \u0026#39;$olduser\u0026#39; to \u0026#39;$user\u0026#39;\u0026#34;); } if (defined($pass)) { \u0026amp;execute_foosql_sql($olddb-\u0026gt;{\u0026#39;name\u0026#39;}, \u0026#34;alter user \u0026#39;$user\u0026#39; password \u0026#39;$pass\u0026#39;\u0026#34;); } } database_delete_user(domain, user) This function should delete the database user specified by the user parameter from all databases owned by the virtual server in domain.\nsub database_delete_user { my ($d, $user) = @_; foreach my $name (\u0026amp;list_foosql_databases()) { \u0026amp;execute_foosql_sql($name, \u0026#34;delete user \u0026#39;$user\u0026#39;\u0026#34;); } } database_user(name) Some database servers impose limits on the length or allowed characters in database logins. This function should check if the given name exceeds any such restrictions, and if so truncate or modify it to be valid. It should then return the modified version.\nsub database_user { my ($name) = @_; if (length($name) \u0026gt; 16) { $name = substr($name, 0, 16); } return $name; } ","permalink":"https://www.virtualmin.com/docs/development/creating-plugins/","summary":"\u003ch3 id=\"introduction-to-plugins\"\u003eIntroduction to plugins\u003c/h3\u003e\n\u003cp\u003eBefore starting on a plugin, we suggest that you first read the Webmin \u003ca href=\"https://webmin.com/docs/development/creating-modules\"\u003emodule developers\u003c/a\u003e guide.\u003c/p\u003e\n\u003cp\u003eA Virtualmin plugin is simply a Webmin module that can provide additional features to Virtualmin virtual servers or users. To do this, it must contain a Perl script called \u003ccode\u003evirtual_feature.pl\u003c/code\u003e which defines certain functions. The plugin module can then be registered by Virtualmin, and the feature it offers will then be available when creating new virtual domains.\u003c/p\u003e","title":"Creating Plugins"},{"content":"A Virtualmin web app installer is a small program that contains the information needed to install a web application into a virtual server\u0026rsquo;s home directory and set it up to run with that server\u0026rsquo;s permissions and database. Most web app installers are for PHP apps like WordPress or phpMyAdmin, but you can also create installers for Node.js, Perl, or Python apps.\nVirtualmin Pro ships with a large number of built-in installers, which domain owners can add to their websites using the Manage Web Apps link on the left menu. However, there are many applications that are not covered yet, simply because we don\u0026rsquo;t have time to implement installers for them or they are used too rarely or too specific. For this reason, Virtualmin provides an API for adding your own web app installers.\nWeb app installer files and directories Each web app installer is a single file containing a set of Perl functions. Those that ship with Virtualmin Pro can be found in the virtual-server/pro/scripts directory under the Webmin root, which is usually /usr/libexec/webmin or /usr/share/webmin. If you open up one of those files (such as phpbb.pl) in a text editor, you will see a series of functions like:\nsub script_phpbb_desc { return \u0026#34;phpBB\u0026#34;; } sub script_phpbb_uses { return ( \u0026#34;php\u0026#34; ); } sub script_phpbb_longdesc { return \u0026#34;A high powered, fully scalable, and highly customizable Open Source bulletin board package.\u0026#34;; } Your own web app installers will be in files of a similar format - the major difference will be the app ID, which appears in each function name after the word script_, like phpbb in the example above.\nWeb app installers that are local to your Virtualmin installation are stored in the /etc/webmin/virtual-server/scripts directory. In most cases, each installer is just a single .pl file, but it is possible for other source or support files to be part of the installer too. In general though, most web app installers download the files they need from the website of the application that they are installing.\nWeb app installer IDs Every web app installer has a unique ID, which must consist of only letters, numbers and the underscore character. The ID determines both the installer filename (i.e. phpbb.pl), and the names of functions within the installer (which must be like script_phpbb_desc as in the example above).\nThe same ID cannot be used by two different installers on the same system, even if one is built-in to Virtualmin and one is custom. For this reason, when writing an installer you should select an ID that is unlikely to clash with any that might be included in Virtualmin in the future.\nThe lifetime of a web app Virtualmin allows multiple instances of a single web app to be installed, either on different domains or in different directories of the same domain. The installer defines the steps that must be taken to setup an app in some directory, in object-oriented coding parlance, it is like a class, while installed web apps are objects.\nWhen a web app is installed via the web interface, Virtualmin performs the following steps :\nChecks if all required dependencies are satisfied, such as required commands, a database and a website. If the script uses PHP, checks that the versions it supports are available on the system. Displays a form asking for installation options, such as the destination directory and database. Parses inputs from the form. Checks if the same web app is already installed in the selected directory. Configures the domain\u0026rsquo;s website to use the correct PHP version. Downloads files needed by the web app, such as its source code. Installs any needed PHP, Node.js, Perl or Python modules. Calls the installer\u0026rsquo;s install function. This typically does the following:\n- Records the fact that the web app has been installed.\n- Configures PHP for the domain, to set any options that the web app has requested.\n- Restarts Apache. Web app installer implementation In this section, the functions that each web app installer must implement will be covered. Not all functions are mandatory, as some deal with PHP dependencies that make no sense if your app does not use PHP or if it has no non-core modules. The example code for each function is taken from the WordPress blog installer, in wordpress.pl. This is a PHP application whose installation process is relatively simple, yet common to many other PHP programs.\nIn your own installer, you would of course replace scriptname with the app ID you have selected. Also, just like a Perl module, make sure your installer file ends with the line:\n1; script_scriptname_desc This function must return a short name for the script, usually a couple of words at most.\nsub script_wordpress_desc { return \u0026#34;WordPress\u0026#34;; } script_scriptname_longdesc This function must return a longer description of the script, which will be displayed to users when they are selecting which script to install.\nsub script_wordpress_longdesc { return \u0026#34;A semantic personal publishing platform with a focus on aesthetics, web standards, and usability\u0026#34;; } script_scriptname_uses This must return a list of the languages the script uses. Supported language codes are php, perl and cgi. Most scripts will return only one.\nsub script_wordpress_uses { return ( \u0026#34;php\u0026#34; ); } script_scriptname_versions Must return a list of versions of the script that the installer supports. Most can only install one, but in some cases you may want to offer the user the ability to install development and stable versions of some application. The version the user chooses will be passed to many other functions as a parameter.\nsub script_wordpress_versions { return ( \u0026#34;6.4.2\u0026#34;, \u0026#34;5.9.3\u0026#34; ); } script_scriptname_release_version If this function exists and returns 1, version numbers are split on a dash character to extract the release number, and compared separately from the version. This is almost never needed in practice.\nsub script_wordpress_release_version { return 1; } script_scriptname_release May return a release number that indicates that a newer version of this web app installer is available, even if the app version itself has not changed.\nsub script_wordpress_release { return 2; } script_scriptname_realversion If the script is typically upgraded outside of Virtualmin, this function must return the script version number by reading it from script\u0026rsquo;s source code. This is used to determine if an upgrade is available, and to display the current version to users. If the script is not upgraded outside of Virtualmin, this function can be omitted.\nsub script_wordpress_realversion { my ($d, $opts, $sinfo) = @_; my $lref = \u0026amp;read_file_lines(\u0026#34;$opts-\u0026gt;{\u0026#39;dir\u0026#39;}/wp-includes/version.php\u0026#34;, 1); foreach my $l (@$lref) { if ($l =~ /wp_version\\s*=\\s*\u0026#39;([0-9\\.]+)\u0026#39;/) { return $1; } } return undef; } script_scriptname_category (optional) This function should return a category for the script, which controls how it is categorized in Virtualmin\u0026rsquo;s list of those available to install. At the time of writing, available categories were Blog, Calendar, Commerce, Community, CMS, Database, Development, Email, Helpdesk, Photos, Projects, Survey, Tracker and Wiki.\nsub script_wordpress_category { return \u0026#34;Blog\u0026#34;; } script_scriptname_php_vers Scripts that use PHP must implement this function, which should return a list of versions the installed application can run under. On systems that have more than one version of PHP installed, Virtualmin will configure the website to use the correct version for the path the script is installed to.\nsub script_wordpress_php_vers { return ( 8 ); } script_scriptname_php_fullver If the web app being installed is written in PHP, this function must return the version this web app installer supports depending on the version of the app being installed. This is used to determine if the correct PHP version is configured for the virtual server, and if not to prevent the app from being installed. For example, the following code fragment from the WordPress installer returns 8.1.27 for versions 6.4.2 and above, and 7.4.33 for older versions.\nsub script_wordpress_php_fullver { my ($d, $ver, $sinfo) = @_; if (\u0026amp;compare_versions($ver, \u0026#34;6.4.2\u0026#34;) \u0026gt;= 0) { return \u0026#34;8.1.27\u0026#34;; } else { return \u0026#34;7.4.33\u0026#34;; } } script_scriptname_php_vars If the script being installed requires any non-default PHP configuration options, this function should return a list of them. The first element of each list entry is the name of the option, the second is its value, and the third is a + or - to indicate if the value should be larger or lower than in order to be added. For example, the following code fragment from the WordPress installer sets the memory_limit and max_execution_time options to 128M and 60 seconds respectively, and enables file uploads and sets the maximum upload size to 10MB:\nsub script_wordpress_php_vars { return ( [ \u0026#39;memory_limit\u0026#39;, \u0026#39;128M\u0026#39;, \u0026#39;+\u0026#39; ], [ \u0026#39;max_execution_time\u0026#39;, 60, \u0026#39;+\u0026#39; ], [ \u0026#39;file_uploads\u0026#39;, \u0026#39;On\u0026#39; ], [ \u0026#39;upload_max_filesize\u0026#39;, \u0026#39;10M\u0026#39;, \u0026#39;+\u0026#39; ], [ \u0026#39;post_max_size\u0026#39;, \u0026#39;10M\u0026#39;, \u0026#39;+\u0026#39; ] ); } script_scriptname_php_modules If the application being installed is written in PHP and requires any non-core PHP modules, this function should return them as a list. Any script that talks to a MySQL database will need the mysql module, or pgsql if it uses PostgreSQL. Virtualmin will attempt to install the required modules if they are missing from the system.\nsub script_wordpress_php_modules { return (\u0026#34;mysql\u0026#34;, \u0026#34;gd\u0026#34;, \u0026#34;json\u0026#34;, \u0026#34;xml\u0026#34; ); } script_scriptname_php_optional_modules The same as script_scriptname_php_modules, but for optional PHP modules. Virtualmin will attempt to install them if they are missing from the system.\nsub script_wordpress_php_optional_modules { return ( \u0026#34;curl\u0026#34;, \u0026#34;ssh2\u0026#34;, \u0026#34;pecl-ssh2\u0026#34;, \u0026#34;date\u0026#34;, \u0026#34;hash\u0026#34;, \u0026#34;imagick\u0026#34;, \u0026#34;pecl-imagick\u0026#34;, \u0026#34;iconv\u0026#34;, \u0026#34;mbstring\u0026#34;, \u0026#34;openssl\u0026#34;, \u0026#34;posix\u0026#34;, \u0026#34;sockets\u0026#34;, \u0026#34;tokenizer\u0026#34; ); } script_scriptname_pear_modules Pear is a repository of additional modules for PHP, which some Virtualmin scripts make use of. If the application you are installing requires some Pear modules, this function can be implemented to return a list of module names. At installation time, Virtualmin will check for and try to automatically install the needed modules.\nsub script_egroupware_pear_modules { return ( \u0026#34;Auth_SASL\u0026#34;, \u0026#34;Net_IMAP\u0026#34;, \u0026#34;Net_Sieve\u0026#34;, \u0026#34;XML_Feed_Parser\u0026#34;, \u0026#34;Log\u0026#34; ); } script_scriptname_perl_modules For scripts written in Perl that require modules that are not part of the standard Perl distribution, you should implement this function to return a list of additional modules required. Virtualmin will try to automatically install them from default system repositories or CPAN where possible, and will prevent the script from being installed if they are missing.\nsub script_twiki_perl_modules { return ( \u0026#34;CGI::Session\u0026#34;, \u0026#34;Net::SMTP\u0026#34; ); } script_scriptname_python_modules For scripts written in Python that require modules that are not part of the standard distribution, you should implement this function to return a list of additional modules required. Virtualmin will try to automatically install them from default system repositories where possible, and will prevent the script from being installed if they are missing.\nsub script_django_python_modules { my ($d, $ver, $opts) = @_; my ($dbtype, $dbname) = split(/_/, $opts-\u0026gt;{\u0026#39;db\u0026#39;}, 2); return ( \u0026#34;setuptools\u0026#34;, $dbtype eq \u0026#34;mysql\u0026#34; ? \u0026#34;MySQLdb\u0026#34; : \u0026#34;psycopg2\u0026#34; ); } script_scriptname_depends(\u0026amp;domain, version) This function must check for any dependencies the script has before it can be installed, such as a MySQL database or virtual server features. It is given two parameters. The domain hash containing details of the virtual server being installed into, and the version number selected.\nsub script_wordpress_depends { my ($d, $ver) = @_; \u0026amp;has_domain_databases($d, [ \u0026#34;mysql\u0026#34; ]) || return \u0026#34;WordPress requires a MySQL database\u0026#34; if (!@dbs); \u0026amp;require_mysql(); if (\u0026amp;compare_versions(\u0026amp;mysql::get_mysql_version(), \u0026#34;5.7\u0026#34;) \u0026lt; 0) { return \u0026#34;WordPress requires MySQL version 5.7 or higher\u0026#34;; } return undef; } Also, this function can return a list of missing dependency error messages instead of a single string, which is more user-friendly as they are all reported to users at once.\nscript_scriptname_dbs(\u0026amp;domain, version) If defined, this function should return a list of database types that the script can use. At least one of these types must be enabled in the virtual server the script is being installed into.\nsub script_wordpress_dbs { my ($d, $ver) = @_; return ( \u0026#34;mysql\u0026#34; ); } script_scriptname_params(\u0026amp;domain, version, \u0026amp;upgrade) This function is responsible for generating the installation form inputs, such as the destination directory and target database. When upgrading (indicated by the upgrade hash being non-null) these are fixed and should just be displayed to the user. Otherwise, it must return inputs for selecting them. The functions return value must be HTML for form fields, generated using the ui_table_row and other ui_ functions.\nThe example below from WordPress is a good source to copy from, as most PHP web apps that you would want to install will need a target directory and a database. The ui_database_select function can be used to generate a menu of databases in the domain, with an option to have a new one created automatically just for this app.\nsub script_wordpress_params { my ($d, $ver, $upgrade) = @_; my $rv; my $hdir = \u0026amp;public_html_dir($d, 1); if ($upgrade) { # Options are fixed when upgrading my ($dbtype, $dbname) = split(/_/, $upgrade-\u0026gt;{\u0026#39;opts\u0026#39;}-\u0026gt;{\u0026#39;db\u0026#39;}, 2); $rv .= \u0026amp;ui_table_row(\u0026#34;Database for WordPress tables\u0026#34;, $dbname); my $dir = $upgrade-\u0026gt;{\u0026#39;opts\u0026#39;}-\u0026gt;{\u0026#39;dir\u0026#39;}; $dir =~ s/^$d-\u0026gt;{\u0026#39;home\u0026#39;}\\///; $rv .= \u0026amp;ui_table_row(\u0026#34;Install directory\u0026#34;, $dir); } else { # Show editable install options my @dbs = \u0026amp;domain_databases($d, [ \u0026#34;mysql\u0026#34; ]); $rv .= \u0026amp;ui_table_row(\u0026#34;Database for WordPress tables\u0026#34;, \u0026amp;ui_database_select(\u0026#34;db\u0026#34;, undef, \\@dbs, $d, \u0026#34;wordpress\u0026#34;)); $rv .= \u0026amp;ui_table_row(\u0026#34;Install sub-directory under \u0026lt;tt\u0026gt;$hdir\u0026lt;/tt\u0026gt;\u0026#34;, \u0026amp;ui_opt_textbox(\u0026#34;dir\u0026#34;, \u0026#34;wordpress\u0026#34;, 30, \u0026#34;At top level\u0026#34;)); } return $rv; } script_scriptname_parse(\u0026amp;domain, version, \u0026amp;in, \u0026amp;upgrade) This function takes the inputs from the form generated by script_scriptname_params, parses them an returns an object containing options that will be used when the installation actually happens. If it detects any errors in the input, it should return an error message string instead.\nAs in the example below, when upgrading the options are almost never changed, so it should return just $upgrade-\u0026gt;{'opts'}, which are the options it was originally installed with. Otherwise, it should look at the hash reference in which will contain all CGI form variables, and use that to construct a hash of options. The most important keys in the hash are dir (the installation target directory) and path (the URL path under the domain\u0026rsquo;s root).\nsub script_wordpress_parse { my ($d, $ver, $in, $upgrade) = @_; if ($upgrade) { # Options are always the same return $upgrade-\u0026gt;{\u0026#39;opts\u0026#39;}; } else { my $hdir = \u0026amp;public_html_dir($d, 0); $in{\u0026#39;dir_def\u0026#39;} || $in{\u0026#39;dir\u0026#39;} =~ /\\S/ \u0026amp;\u0026amp; $in{\u0026#39;dir\u0026#39;} !~ /\\.\\./ || return \u0026#34;Missing or invalid installation directory\u0026#34;; my $dir = $in{\u0026#39;dir_def\u0026#39;} ? $hdir : \u0026#34;$hdir/$in{\u0026#39;dir\u0026#39;}\u0026#34;; my ($newdb) = ($in-\u0026gt;{\u0026#39;db\u0026#39;} =~ s/^\\*//); return { \u0026#39;db\u0026#39; =\u0026gt; $in-\u0026gt;{\u0026#39;db\u0026#39;}, \u0026#39;newdb\u0026#39; =\u0026gt; $newdb, \u0026#39;dir\u0026#39; =\u0026gt; $dir, \u0026#39;path\u0026#39; =\u0026gt; $in{\u0026#39;dir_def\u0026#39;} ? \u0026#34;/\u0026#34; : \u0026#34;/$in{\u0026#39;dir\u0026#39;}\u0026#34;, }; } } script_scriptname_check(\u0026amp;domain, version, \u0026amp;opts, \u0026amp;upgrade) This function must verify the installation options in the opts hash, and return an error message if any are invalid (or undef if they all look alright). Possible problems include a missing or invalid install directory, a clash with an existing install of the same script in the directory, or a clash of tables in the selected database. As the example below shows, the find_database_table function provides a convenient way to search for tables by name or regular expression, for most applications, all tables used will be prefixed by a short code, like wp_ in the case of WordPress.\nIf you are wondering why these checks are not performed in script_scriptname_parse, the reason is that when a script is installed from the command line, that function is never called. Instead, install options are generated using a different method, and then validated by this function.\nsub script_wordpress_check { my ($d, $ver, $opts, $upgrade) = @_; $opts-\u0026gt;{\u0026#39;dir\u0026#39;} =~ /^\\// || return \u0026#34;Missing or invalid install directory\u0026#34;; $opts-\u0026gt;{\u0026#39;db\u0026#39;} || return \u0026#34;Missing database\u0026#34;; if (-r \u0026#34;$opts-\u0026gt;{\u0026#39;dir\u0026#39;}/wp-login.php\u0026#34;) { return \u0026#34;WordPress appears to be already installed in the selected directory\u0026#34;; } my ($dbtype, $dbname) = split(/_/, $opts-\u0026gt;{\u0026#39;db\u0026#39;}, 2); my $clash = \u0026amp;find_database_table($dbtype, $dbname, \u0026#34;wp_.*\u0026#34;); $clash \u0026amp;\u0026amp; return \u0026#34;WordPress appears to be already using the selected database (table $clash)\u0026#34;; return undef; } script_scriptname_files(\u0026amp;domain, version, \u0026amp;opts, \u0026amp;upgrade) This is the function where the web app installer indicates to Virtualmin what files need to be downloaded for the installation to go ahead. Most apps need only one, which contains the source code but it is possible to request any number, even zero.\nThe function must return a list of hash references, each of which should contain the following keys:\nKey Description name A unique name for this file, used later by the script_scriptname_install function file A short filename for the file, to which it will be saved in /tmp/.webmin after being downloaded url The URL that it can be downloaded from nocache Optional, but can be set to 1 to force a download even if the URL is cached by Virtualmin In most cases, the ver parameter is used in the URL and filename to get the correct source archive.\nsub script_wordpress_files { my ($d, $ver, $opts, $upgrade) = @_; my @files = ( { \u0026#39;name\u0026#39; =\u0026gt; \u0026#34;source\u0026#34;, \u0026#39;file\u0026#39; =\u0026gt; \u0026#34;latest.tar.gz\u0026#34;, \u0026#39;url\u0026#39; =\u0026gt; \u0026#34;https://wordpress.org/wordpress-6.4.2.tar.gz\u0026#34;, \u0026#39;nocache\u0026#39; =\u0026gt; 1 } ); return @files; } script_scriptname_commands If your web app installer requires any commands to do its job that may not be available on a typical Unix system, this function should return a list of them. In most cases, it just returns the programs needed to un-compress the tar.gz or zip file containing the source.\nsub script_wordpress_commands { return ( \u0026#34;unzip\u0026#34; ); } script_scriptname_install(\u0026amp;domain, version, \u0026amp;opts, \u0026amp;files, \u0026amp;upgrade, username, password) This function is where the real work of installing a web app actually happens. It is responsible for setting up the database, un-compressing the downloaded source, copying it to the correct directory, modifying configuration files to match the domain and database, and returning a URL that can be used to login. If anything goes wrong, it must return an array whose first element is zero, and the second is an error message.\nUpon success, it must return an an array containing the following elements:\nThe number 1 (indicating success) An HTML message to display to the user. This should include a link that can be used to access the script. A description of where it was installed. The URL that can be used to access the script. The initial administration login, if any. The initial administration password, if any. If given, the username and password parameters should be used to set the initial administrative login for the script. If not, it should default to the domain\u0026rsquo;s login and password.\nThe code snippets below show each step of the install process, taken from the standard WordPress installer. The first part simply parses the database connection options and creates a new DB for the script, if one was requested:\nsub script_wordpress_install { my ($d, $version, $opts, $files, $upgrade) = @_; my ($out, $ex); if ($opts-\u0026gt;{\u0026#39;newdb\u0026#39;} \u0026amp;\u0026amp; !$upgrade) { my $err = \u0026amp;create_script_database($d, $opts-\u0026gt;{\u0026#39;db\u0026#39;}); return (0, \u0026#34;Database creation failed : $err\u0026#34;) if ($err); } my ($dbtype, $dbname) = split(/_/, $opts-\u0026gt;{\u0026#39;db\u0026#39;}, 2); my $dbuser = $dbtype eq \u0026#34;mysql\u0026#34; ? \u0026amp;mysql_user($d) : \u0026amp;postgres_user($d); my $dbpass = $dbtype eq \u0026#34;mysql\u0026#34; ? \u0026amp;mysql_pass($d) : \u0026amp;postgres_pass($d, 1); my $dbphptype = $dbtype eq \u0026#34;mysql\u0026#34; ? \u0026#34;mysql\u0026#34; : \u0026#34;psql\u0026#34;; my $dbhost = \u0026amp;get_database_host($dbtype); my $dberr = \u0026amp;check_script_db_connection($dbtype, $dbname, $dbuser, $dbpass); return ( 0, \u0026#34;Database connection failed : $dberr\u0026#34; ) if ($dberr); The next step is to extract the downloaded source code, and then copy it to the created destination directory. This is done by calling the unzip and cp commands as the Virtualmin domain owner, so that there is no risk of files that he is not supposed to have access to being over-written. The source code temporary file can be found from the files hash reference in the source key, which was defined by the script_scriptname_files function.\nNote how the code checks for expected files after extracting and copying the source, to make sure that the commands called actually succeeded.\n# Create target dir if (!-d $opts-\u0026gt;{\u0026#39;dir\u0026#39;}) { $out = \u0026amp;run_as_domain_user($d, \u0026#34;mkdir -p \u0026#34;.quotemeta($opts-\u0026gt;{\u0026#39;dir\u0026#39;})); -d $opts-\u0026gt;{\u0026#39;dir\u0026#39;} || return ( 0, \u0026#34;Failed to create directory : \u0026lt;tt\u0026gt;$out\u0026lt;/tt\u0026gt;.\u0026#34; ); } # Extract tar file to temp dir my $temp = \u0026amp;transname(); mkdir($temp, 0755); chown($d-\u0026gt;{\u0026#39;uid\u0026#39;}, $d-\u0026gt;{\u0026#39;gid\u0026#39;}, $temp); $out = \u0026amp;run_as_domain_user($d, \u0026#34;cd \u0026#34;.quotemeta($temp). \u0026#34; \u0026amp;\u0026amp; unzip $files-\u0026gt;{\u0026#39;source\u0026#39;}\u0026#34;); my $verdir = \u0026#34;wordpress\u0026#34;; -r \u0026#34;$temp/$verdir/wp-login.php\u0026#34; || return ( 0, \u0026#34;Failed to extract source : \u0026lt;tt\u0026gt;$out\u0026lt;/tt\u0026gt;.\u0026#34; ); # Move html dir to target $out = \u0026amp;run_as_domain_user($d, \u0026#34;cp -rp \u0026#34;.quotemeta($temp).\u0026#34;/$verdir/* \u0026#34;. quotemeta($opts-\u0026gt;{\u0026#39;dir\u0026#39;})); my $cfileorig = \u0026#34;$opts-\u0026gt;{\u0026#39;dir\u0026#39;}/wp-config-sample.php\u0026#34;; my $cfile = \u0026#34;$opts-\u0026gt;{\u0026#39;dir\u0026#39;}/wp-config.php\u0026#34;; -r $cfileorig || return ( 0, \u0026#34;Failed to copy source : \u0026lt;tt\u0026gt;$out\u0026lt;/tt\u0026gt;.\u0026#34; ); Most web apps have a configuration file of some kind that defines where to access the database, what domain they are running under, the URL path, and possibly an initial login and password. The web app installer is responsible for creating or modifying this file to use the database connection details supplied by the opts parameter, as shown in the code snippet below.\nBe careful when upgrading, as in general the existing configuration file will be valid for the new version. This means that it doesn\u0026rsquo;t need to be re-created, and should be preserved during the upgrade process if necessary.\n# Copy and update the config file if (!-r $cfile) { \u0026amp;run_as_domain_user($d, \u0026#34;cp \u0026#34;.quotemeta($cfileorig).\u0026#34; \u0026#34;. quotemeta($cfile)); my $lref = \u0026amp;read_file_lines($cfile); foreach my $l (@$lref) { if ($l =~ /^define\\(\u0026#39;DB_NAME\u0026#39;,/) { $l = \u0026#34;define(\u0026#39;DB_NAME\u0026#39;, \u0026#39;$dbname\u0026#39;);\u0026#34;; } if ($l =~ /^define\\(\u0026#39;DB_USER\u0026#39;,/) { $l = \u0026#34;define(\u0026#39;DB_USER\u0026#39;, \u0026#39;$dbuser\u0026#39;);\u0026#34;; } if ($l =~ /^define\\(\u0026#39;DB_HOST\u0026#39;,/) { $l = \u0026#34;define(\u0026#39;DB_HOST\u0026#39;, \u0026#39;$dbhost\u0026#39;);\u0026#34;; } if ($l =~ /^define\\(\u0026#39;DB_PASSWORD\u0026#39;,/) { $l = \u0026#34;define(\u0026#39;DB_PASSWORD\u0026#39;, \u0026#39;$dbpass\u0026#39;);\u0026#34;; } if ($opts-\u0026gt;{\u0026#39;multi\u0026#39;}) { if ($l =~ /^define\\(\u0026#39;VHOST\u0026#39;,/) { $l = \u0026#34;define(\u0026#39;VHOST\u0026#39;, \u0026#39;\u0026#39;);\u0026#34;; } if ($l =~ /^\\$base\\s*=/) { $l = \u0026#34;\\$base = \u0026#39;$opts-\u0026gt;{\u0026#39;path\u0026#39;}/\u0026#39;;\u0026#34;; } } } \u0026amp;flush_file_lines($cfile); } In some cases, a script will come with a file of SQL statements that can be used to create and populate tables in its database. Others like WordPress do this automatically when they are first accessed. If the application you are installing needs SQL to be run as part of its setup process, you can use code like the fragment below, which was taken from the WebCalendar installer:\nif (!$upgrade) { if ($dbtype eq \u0026#34;mysql\u0026#34;) { my $sqlfile = \u0026#34;$opts-\u0026gt;{\u0026#39;dir\u0026#39;}/install/sql/tables-mysql.sql\u0026#34;; \u0026amp;require_mysql(); my ($err, $out) = \u0026amp;mysql::execute_sql_file($dbname, $sqlfile, $dbuser, $dbpass); $err \u0026amp;\u0026amp; return (0, \u0026#34;Failed to run database setup script : \u0026lt;tt\u0026gt;$out\u0026lt;/tt\u0026gt;.\u0026#34;); } elsif ($dbtype eq \u0026#34;postgres\u0026#34;) { my $sqlfile = \u0026#34;$opts-\u0026gt;{\u0026#39;dir\u0026#39;}/install/sql/tables-postgres.sql\u0026#34;; \u0026amp;require_postgres(); my ($err, $out) = \u0026amp;postgresql::execute_sql_file($dbname, $sqlfile, $dbuser, $dbpass); $err \u0026amp;\u0026amp; return (0, \u0026#34;Failed to run database setup script in $dbname : \u0026lt;tt\u0026gt;$out\u0026lt;/tt\u0026gt;.\u0026#34;); } } The final part of the script_scriptname_install function is returning information to Virtualmin about how to access the new script, and where it is installed. In some cases, a script will have two URLs. The one for administration, which should be references in the second element of the returned array, and the one for general use, which should be in the fourth element.\nmy $url = \u0026amp;script_path_url($d, $opts). ($upgrade ? \u0026#34;wp-admin/upgrade.php\u0026#34; : \u0026#34;wp-admin/install.php\u0026#34;); my $userurl = \u0026amp;script_path_url($d, $opts); my $rp = $opts-\u0026gt;{\u0026#39;dir\u0026#39;}; $rp =~ s/^$d-\u0026gt;{\u0026#39;home\u0026#39;}\\///; return ( 1, \u0026#34;WordPress installation complete. It can be accessed at \u0026lt;a href=\u0026#39;$url\u0026#39;\u0026gt;$url\u0026lt;/a\u0026gt;.\u0026#34;, \u0026#34;Under $rp using $dbphptype database $dbname\u0026#34;, $userurl ); } script_scriptname_uninstall(\u0026amp;domain, version, \u0026amp;opts) This function is responsible for cleaning up all files and database tables created by the install code. It is only called when the user deletes a script from a domain, not when upgrading. If most cases, determining which tables to remove is simple, as they all start with some prefix (like wp_ in the case of WordPress).\nIf the installer has created any cron jobs, server processes, custom Apache configuration entries or email aliases, they must also be removed by this function. On success, it should return a two-element array whose first element is 1, and the second a message to display to the user. On failure, it should return 0 and an error message explaining what went wrong.\nsub script_wordpress_uninstall { my ($d, $version, $opts) = @_; # Remove the contents of the target directory my $derr = \u0026amp;delete_script_install_directory($d, $opts); return (0, $derr) if ($derr); # Remove all wp_ tables from the database my ($dbtype, $dbname) = split(/_/, $opts-\u0026gt;{\u0026#39;db\u0026#39;}, 2); if ($dbtype eq \u0026#34;mysql\u0026#34;) { # Delete from MySQL \u0026amp;require_mysql(); foreach $t (\u0026amp;mysql::list_tables($dbname)) { if ($t =~ /^wp_/) { \u0026amp;mysql::execute_sql_logged($dbname, \u0026#34;drop table \u0026#34;.\u0026amp;mysql::quotestr($t)); } } } else { # Delete from PostgreSQL \u0026amp;require_postgres(); foreach $t (\u0026amp;postgresql::list_tables($dbname)) { if ($t =~ /^wp_/) { \u0026amp;postgresql::execute_sql_logged($dbname, \u0026#34;drop table $t\u0026#34;); } } } # Take out the DB if it was created for this script if ($opts-\u0026gt;{\u0026#39;newdb\u0026#39;}) { \u0026amp;delete_script_database($d, $opts-\u0026gt;{\u0026#39;db\u0026#39;}); } return ( 1, \u0026#34;WordPress directory and tables deleted.\u0026#34; ); } script_scriptname_passmode(\u0026amp;domain, version) Most scripts that setup an initial login and password use those from the virtual server the script is being added to. However, Virtualmin can prompt the user for alternative authentication details if you implement this function. All it has to do is return one of the following numeric codes:\nCode Description 1 Script needs a username and password 2 Script only needs a password 3 Script only needs a username The custom login and password entered by the user will be passed to the script_scriptname_install function. If your web app installer doesn\u0026rsquo;t setup an initial login at all, you can either omit this function or have it return 0.\nAdditionally, this function can return an array containing a numeric code, minimum password length and regular expression that the password must match. For example, the following code fragment from the WordPress installer requires a password that is at least 8 characters long, and contains at least one upper-case letter, one lower-case letter and one digit.\nsub script_wordpress_passmode { return ( 1, 8, \u0026#39;^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d).{8,}$\u0026#39; ); } script_scriptname_db_conn_desc() This function provides a description of the method and location used by the script to store its database connection information. It is particularly utilized by Virtualmin when changes are made to the database credentials. Essentially, the function returns a hash reference. The keys in this hash reference are filenames where the connection details are stored. The values are additional hash references that outline the process for locating and updating old connection details with new ones. To illustrate, let\u0026rsquo;s consider an example from the WordPress installer:\nsub script_wordpress_db_conn_desc { my $db_conn_desc = { \u0026#39;wp-config.php\u0026#39; =\u0026gt; { \u0026#39;dbpass\u0026#39; =\u0026gt; { \u0026#39;replace\u0026#39; =\u0026gt; [ \u0026#39;define\\(\\s*[\\\u0026#39;\u0026#34;]DB_PASSWORD[\\\u0026#39;\u0026#34;],\u0026#39; =\u0026gt; \u0026#39;define(\\\u0026#39;DB_PASSWORD\\\u0026#39;, \\\u0026#39;$$sdbpass\\\u0026#39;);\u0026#39; ], \u0026#39;func\u0026#39; =\u0026gt; \u0026#39;php_quotemeta\u0026#39;, \u0026#39;func_params\u0026#39; =\u0026gt; 1, }, \u0026#39;dbname\u0026#39; =\u0026gt; { \u0026#39;replace\u0026#39; =\u0026gt; [ \u0026#39;define\\(\\s*[\\\u0026#39;\u0026#34;]DB_NAME[\\\u0026#39;\u0026#34;],\u0026#39; =\u0026gt; \u0026#34;define(\u0026#39;DB_NAME\u0026#39;, \u0026#39;\\$\\$sdbname\u0026#39;);\u0026#34; ], }, \u0026#39;dbuser\u0026#39; =\u0026gt; { \u0026#39;replace\u0026#39; =\u0026gt; [ \u0026#39;define\\(\\s*[\\\u0026#39;\u0026#34;]DB_USER[\\\u0026#39;\u0026#34;],\u0026#39; =\u0026gt; \u0026#34;define(\u0026#39;DB_USER\u0026#39;, \u0026#39;\\$\\$sdbuser\u0026#39;);\u0026#34; ], }, \u0026#39;dbhost\u0026#39; =\u0026gt; { \u0026#39;replace\u0026#39; =\u0026gt; [ \u0026#39;define\\(\\s*[\\\u0026#39;\u0026#34;]DB_HOST[\\\u0026#39;\u0026#34;],\u0026#39; =\u0026gt; \u0026#34;define(\u0026#39;DB_HOST\u0026#39;, \u0026#39;\\$\\$sdbhost\u0026#39;);\u0026#34; ], }, } }; return $db_conn_desc; } The above code fragment returns a hash reference with a single key, wp-config.php. This is the name of the file where the database connection details are stored. The file name is relative to the installation directory. The value of this key is another hash reference. This hash reference contains four keys, dbpass, dbname, dbuser and dbhost. These keys correspond to the database connection details that are stored in the file.\nInstallation variants The style of installation code above will work for most scripts that you want to install, but in some cases a slightly different approach is needed. This section covers two of them - scripts with their own configuration generators that cannot be easily replaced by creating the config file yourself, and installers which use a separate server process.\nHTTP requests Many PHP applications come with a script that asks the user a series of questions, like the database login and name, domain name, and initial administration username and password. The script then uses this information to create a config file and perhaps populated the database.\nIdeally, Virtualmin web app installers should create any needed config files directly, but in some cases this is too difficult due to their complexity. Similarly, it may not be possible to create and populate all the needed database tables if no SQL file is provided for doing this. In cases like this, it is simpler for a web app installer to invoke the application\u0026rsquo;s install code directly, by making an HTTP request to the correct URL.\nTo figure out the installation URL and parameters it needs, you will need to install the application manually and run through its install process in a browser. The browser developer tools can be used to see what HTTP requests are made, and what parameters are passed to them.\nThe following code fragment from the script_mybb_install function of the mybb.pl installer gives an example of this:\n# Call database configuration page my $dnengine = $dbtype eq \u0026#34;mysql\u0026#34; ? \u0026#34;mysqli\u0026#34; : \u0026#34;pgsql\u0026#34;; my @params = ( [ \u0026#34;dbengine\u0026#34;, $dnengine ], [ \u0026#34;config[$dnengine][dbhost]\u0026#34;, $dbhost ], $dbtype eq \u0026#34;mysql\u0026#34; ? [ \u0026#34;sql_port\u0026#34;, \u0026#39;3306\u0026#39; ] : [], [ \u0026#34;config[$dnengine][dbuser]\u0026#34;, $dbuser ], [ \u0026#34;config[$dnengine][dbpass]\u0026#34;, $dbpass ], [ \u0026#34;config[$dnengine][dbname]\u0026#34;, $dbname ], [ \u0026#34;config[$dnengine][tableprefix]\u0026#34;, \u0026#34;mybb_\u0026#34; ], [ \u0026#34;config[$dnengine][encoding]\u0026#34;, \u0026#34;utf8\u0026#34; ]); my $params = join(\u0026#34;\u0026amp;\u0026#34;, map { $_-\u0026gt;[0].\u0026#34;=\u0026#34;.\u0026amp;urlize($_-\u0026gt;[1]) } @params); my $ipage = \u0026#34;$opts-\u0026gt;{\u0026#39;path\u0026#39;}/install/index.php?action=create_tables\u0026#34;; my ($iout, $ierror); \u0026amp;post_http_connection($d, $ipage, $params, \\$iout, \\$ierror); if ($ierror) { return ( -1, \u0026#34;Database initialization failed : $ierror\u0026#34; ); } elsif ($iout !~ /all\\s+tables\\s+have\\s+been\\s+created/i) { return ( -1, \u0026#34;Database initialization failed\u0026#34; ); } As you can see, it makes use of the post_http_connection function provided by Virtualmin which makes an HTTP POST request, which is expected by most applications. If the form is submitted using a GET, you could use Webmin\u0026rsquo;s http_download function instead.\nIn some cases, the installation process is a multi-step wizard, which means that you will need to make several POST requests with different parameters, and possibly parse the output from each.\nSeparate server process Setup separate server process Some applications installed by Virtualmin are actually run by a separate server process. For example Node.js applications are run by the Node.js server. To link them up to the domain\u0026rsquo;s actual website, proxy directives are added that pass all requests to a path like /nodejs to a local webserver at a URL like http://127.0.0.1:3000.\nYour installer needs to manage a server process, such as Node.js, which operates independently. To facilitate this, it should automatically create the service and remove it when the script is deleted. This functionality is achieved through the script_setup_service and script_delete_service functions in Virtualmin. Moreover, Virtualmin offers additional commands like script_stop_service, script_start_service, and script_status_service for more granular control of the service.\nFurthermore, your application requires a unique port to operate, which can be assigned using Virtualmin\u0026rsquo;s allocate_proxy_port function. Once the port is allocated, you\u0026rsquo;ll need to set up a proxy to redirect requests from a webserver to your application. This setup is accomplished using the setup_proxy function provided by Virtualmin.\nThe following code fragment from the script_nodejs_install function of the nodejs.pl installer shows how this is done:\n# Pick a free port my $port; if (!$upgrade) { $port = \u0026amp;allocate_port(undef, 1); $opts-\u0026gt;{\u0026#39;port\u0026#39;} = $port; } # Create the server process \u0026amp;script_setup_service($d, { name =\u0026gt; \u0026#39;nodejs\u0026#39;, descname =\u0026gt; \u0026#39;Node.js\u0026#39;, port =\u0026gt; $port, service =\u0026gt; { type =\u0026gt; \u0026#34;simple\u0026#34;, startcmd =\u0026gt; \u0026#34;/home/example/public_html/nodejs/bin/node /home/example/public_html/nodejs/server.js\u0026#34;, logstd =\u0026gt; \u0026#34;$opts-\u0026gt;{\u0026#39;dir\u0026#39;}/node.log\u0026#34;, logerr =\u0026gt; \u0026#34;$opts-\u0026gt;{\u0026#39;dir\u0026#39;}/node.err\u0026#34;, } }); # Start the server process \u0026amp;script_start_service($d, \u0026#34;nodejs\u0026#34;, $port); # Configure webserver to proxy to it \u0026amp;setup_proxy($d, $opts-\u0026gt;{\u0026#39;path\u0026#39;}, $port); Note that the script_setup_service function already takes care of enabling the server process to start automatically at boot.\nRemove separate server process Your script should include the script_scriptname_uninstall function, designed to thoroughly remove all traces of the application. This includes shutting down server process, removing service scripts, and clearing webserver configuration entries. Virtualmin simplifies this task by offering a range of convenience functions, which are demonstrated in the following code example:\nsub script_nodejs_uninstall { my ($d, $version, $opts) = @_; # Shut down and delete the service \u0026amp;script_delete_service($d, \u0026#34;nodejs\u0026#34;, $opts-\u0026gt;{\u0026#39;port\u0026#39;}); # Remove webserver config entry for /nodejs \u0026amp;delete_proxy($d, $opts-\u0026gt;{\u0026#39;path\u0026#39;}); # Remove the contents of the target directory my $derr = \u0026amp;delete_script_install_directory($d, $opts); return ( 0, $derr ) if ($derr); # Deletion complete return ( 1, \u0026#34;Node.js uninstallation complete.\u0026#34; ); } When Virtualmin deletes a domain, it does not call the uninstall functions for any installed web apps, as this would generally be a waste of time, as their directories and databases are going to be removed anyway. In the case of service applications, this is not true, as their service scripts must be cleaned up.\nTo ensure that this happens, your web app installer must implement the script_scriptname_stop function, which only has to shut down server process and remove service script. This function is only called at virtual server deletion time, and is optional for installers that don\u0026rsquo;t require it.\n# Deletes service file upon domain deletion sub script_nodejs_stop { my ($d, $sinfo) = @_; \u0026amp;script_delete_service($d, \u0026#34;nodejs\u0026#34;, $sinfo-\u0026gt;{\u0026#39;opts\u0026#39;}-\u0026gt;{\u0026#39;port\u0026#39;}); } ","permalink":"https://www.virtualmin.com/docs/development/creating-web-app-installer/","summary":"\u003cp\u003eA Virtualmin web app installer is a small program that contains the information needed to install a web application into a virtual server\u0026rsquo;s home directory and set it up to run with that server\u0026rsquo;s permissions and database. Most web app installers are for PHP apps like WordPress or phpMyAdmin, but you can also create installers for Node.js, Perl, or Python apps.\u003c/p\u003e\n\u003cp\u003eVirtualmin Pro ships with a large number of \u003ca href=\"/docs/professional-features/#manage-web-apps\"\u003ebuilt-in installers\u003c/a\u003e, which domain owners can add to their websites using the \u003cstrong\u003eManage Web Apps\u003c/strong\u003e link on the left menu. However, there are many applications that are not covered yet, simply because we don\u0026rsquo;t have time to implement installers for them or they are used too rarely or too specific. For this reason, Virtualmin provides an API for adding your own web app installers.\u003c/p\u003e","title":"Creating Web App Installer"},{"content":"About translation files A complete list of supported languages and language codes can be found in the Webmin translation documentation.\nEach module or plugin contains two types of translation files for each language, which may need to be created if they don\u0026rsquo;t exist yet:\nMain file (e.g., de) - Contains human-reviewed and verified translations Auto file (e.g., de.auto) - Contains machine translations generated automatically using Google Translate. These translations need human review before being moved to the main file. File structure overview virtualmin-gpl/ └── lang/ # Module translations ├── en # Source of truth (English) ├── de # Human-reviewed German translations ├── de.auto # Auto-generated German translations (by Google Translate) ├── fr # Human-reviewed French translations └── fr.auto # Auto-generated French translations (by Google Translate) Contributing translations Using Git # Clone the repository git clone https://github.com/virtualmin/virtualmin-gpl.git cd virtualmin-gpl # Add your fork as a remote (replace YOUR-USERNAME) git remote add fork https://github.com/YOUR-USERNAME/virtualmin-gpl.git # Create a branch for your translations using your language code (e,g., fr) git checkout -b translate-fr # Make your changes, commit and push git commit -m \u0026#34;lang(fr): Update translations\u0026#34; git push origin translate-fr Yes, we can add a section about using GitHub UI right after the Git instructions section. Here\u0026rsquo;s what to add after the Git commands block and before \u0026ldquo;Translation guidelines\u0026rdquo;:\nUsing GitHub UI Create a fork\nVisit https://github.com/virtualmin/virtualmin-gpl Click the \u0026ldquo;Fork\u0026rdquo; button in the top-right corner Wait for your fork to be created Navigate to files\nGo to the lang directory in your fork Find your language files (e.g., de and de.auto) Edit or create files\nIf your language file exists, click it and then the pencil icon to edit If it doesn\u0026rsquo;t exist, click \u0026ldquo;Add file\u0026rdquo; \u0026gt; \u0026ldquo;Create new file\u0026rdquo; and name it with your language code Make your changes following the guidelines below Scroll down and click \u0026ldquo;Commit changes\u0026rdquo; Create Pull Request\nClick \u0026ldquo;Pull requests\u0026rdquo; tab Click \u0026ldquo;New pull request\u0026rdquo; Select \u0026ldquo;virtualmin/virtualmin-gpl\u0026rdquo; as the base repository Add a descriptive title like \u0026ldquo;lang(de): Update translations\u0026rdquo; Click \u0026ldquo;Create pull request\u0026rdquo; Using forum or email If you\u0026rsquo;re not comfortable with Git or GitHub, you can contribute translations in two other ways:\nVirtualmin forum\nVisit the Virtualmin Community Forum Create a new topic in the \u0026ldquo;Development\u0026rdquo; category Include your language code in the title Attach your translation file or paste the translations Email\nSend your translations to developers@virtualmin.dev Include your language code in the email subject Attach the translation file or include translations in the email body Clearly indicate which module or plugin the translations are for Translation guidelines Key rules Maintain exact formatting\n# English source (en): index_version=Nginx version $1 # Correct German translation: index_version=Nginx-Version $1 # WRONG: index_version = Nginx version $1. Handle variables correctly\n# English source (en): opt_missing=Nothing entered for field : $1 # Correct French translation: opt_missing=Aucune valeur saisie pour le champ : $1 # WRONG: opt_missing=Aucune valeur saisie pour le champ : %1 opt_missing=Aucune valeur saisie pour le champ. UTF-8 encoding\nAll files must use UTF-8 encoding Save files without BOM Test special characters display correctly Best practices Review process Use en file for source text Check your language\u0026rsquo;s .auto file for suggestions Move correct translations to main language file Keep technical terms consistent Quality checks Compare with English source Keep dots and colons exactly as in source Preserve all variables ($1, $2, etc.) Maintain HTML tags if present Understanding machine translations The .auto files are automatically generated using machine translation. Here\u0026rsquo;s what you need to know:\nPurpose Provide initial translations as starting point Help translators with basic translations Speed up translation process Usage Create new language file if it doesn\u0026rsquo;t exist Use .auto files as reference if available Review machine translations for accuracy Improve and correct translations Move verified translations to main language file Important notes Machine translations may be literal or incorrect Technical terms might need adjustment Always verify context and meaning Don\u0026rsquo;t blindly copy from .auto files Common pitfalls Don\u0026rsquo;t add/remove punctuation Don\u0026rsquo;t change variable placeholders Don\u0026rsquo;t modify HTML tags Don\u0026rsquo;t add extra spaces Testing Switch language in Webmin interface Check translated strings Verify variables work Test special characters Need help? Create an issue with:\nYour language Source text Current translation What you need help with Thank you for helping improve translations!\n","permalink":"https://www.virtualmin.com/docs/development/translations/","summary":"\u003ch2 id=\"about-translation-files\"\u003eAbout translation files\u003c/h2\u003e\n\u003cp\u003eA complete list of supported languages and language codes can be found in the Webmin \u003ca href=\"https://webmin.com/docs/development/translations/#how-translations-are-made\"\u003etranslation documentation\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eEach module or plugin contains two types of translation files for each language, which may need to be created if they don\u0026rsquo;t exist yet:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMain file (e.g., \u003ccode\u003ede\u003c/code\u003e) - Contains human-reviewed and verified translations\u003c/li\u003e\n\u003cli\u003eAuto file (e.g., \u003ccode\u003ede.auto\u003c/code\u003e) - Contains machine translations generated automatically using Google Translate. These translations need human review before being moved to the main file.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"file-structure-overview\"\u003eFile structure overview\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003evirtualmin-gpl/\n└── lang/          # Module translations\n    ├── en         # Source of truth (English)\n    ├── de         # Human-reviewed German translations\n    ├── de.auto    # Auto-generated German translations (by Google Translate)\n    ├── fr         # Human-reviewed French translations\n    └── fr.auto    # Auto-generated French translations (by Google Translate)\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"contributing-translations\"\u003eContributing translations\u003c/h2\u003e\n\u003ch3 id=\"using-git\"\u003eUsing Git\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# Clone the repository\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit clone https://github.com/virtualmin/virtualmin-gpl.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd virtualmin-gpl\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# Add your fork as a remote (replace YOUR-USERNAME)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit remote add fork https://github.com/YOUR-USERNAME/virtualmin-gpl.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# Create a branch for your translations using your language code (e,g., fr)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit checkout -b translate-fr\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# Make your changes, commit and push\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit commit -m \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;lang(fr): Update translations\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit push origin translate-fr\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eYes, we can add a section about using GitHub UI right after the Git instructions section. Here\u0026rsquo;s what to add after the Git commands block and before \u0026ldquo;Translation guidelines\u0026rdquo;:\u003c/p\u003e","title":"Contributing Translations"},{"content":"Backup one or more virtual servers This program is analogous to the Backup Virtual Servers page in the Virtualmin web interface. It will create either a single backup file or multiple separate files containing the domains specified on the command line, either locally or on a remote SCP or FTP server.\nThe --dest option sets the backup destination, and can be a simple path like /backup/virtualmin.tgz , an FTP URL like ftp://user:pass@server:/backup/virtualmin.tgz , or an SCP URL like ssh://user:pass@server:/backup/virtualmin.tgz . When backing up to a single file, the path specifies a file that will be created. When creating one backup per domain, it specifies a directory instead.\nThe --domain and --all-domains options can be used to control which virtual servers are included in the backup. The --domain parameter followed by a domain name can be given multiple times, to select more than one server.\nAlternately, virtual servers can be selected with the --user flag followed by an administrator\u0026rsquo;s username, --plan followed by a plan name, or -reseller followed by a reseller name. In all cases, all sub-servers will be included too.\nTypically the --all-features option will be used to include all virtual server features in the backup, but you can instead use the --feature option one or more times to control exactly what gets included. In this case, it is wise to use at least --feature dir to include each server\u0026rsquo;s home directory.\nThe --newformat option tells the backup program to create a separate file for each virtual server. As long as the entire domain is being backed up, this format also uses less temporary space as all databases and other additional files are included in the home directory archive.\nUsing the --ignore-errors option means than any errors encountered backing up one feature or server will be reported and ignored, rather than terminating the whole backup as happens by default.\nTo include core Virtualmin settings in the backup, the --all-virtualmin option can be specified as well. Alternately, you can select exactly which settings to include with the --virtualmin parameter. For example, --virtualmin config would only backup the module configuration.\nBy default, backups include all files in each domain\u0026rsquo;s home directory. However, if you use the --incremental parameter, only those changed since the last non-incremental backup will be included. This allows you to reduce the size of backups for large websites that rarely change, but means that when restoring both the full and incremental backups are needed.\nThe alternative parameter --no-incremental can be used by prevent Virtualmin from clearing the list of files that were included in the last full backup. This is used if you have a scheduled incremental backup setup, and don\u0026rsquo;t want to change its behavior by doing an ad-hoc full backup.\nTo exclude some files from each virtual server\u0026rsquo;s home directory from the backup, use the --exclude flag followed by a relative filename, like public_html/stats or .bashrc. Alternately, you can limit the backup to only specific files and directories with the --include flag.\nTo have Virtualmin automatically replace strftime-style date formatting characters in the backup destination, you can use the --strftime flag. When this is enabled, the --purge flag can also be given, followed by a number of days. The command will then delete backups in the same desination directory older than the specified number of days. To see more detail about which files were consisered for purging, add the --purge-debug flag.\nOn a Virtualmin Pro system, you can use the --key flag followed by a backup key ID or description to select the key to encrypt this backup with. Keys can be found using the list-backup-keys API call.\nBy default, only one backup to the same destination can be running at the same time - the second backup will immediately fail. You can invert this behavior with the --kill-running flag, which terminates the first backup and allows this one to continue. Or you can use the --wait-running flag to delay the backup until the first one completes.\nTo override the default compression format set on the Virtualmin Configuration page, use the --compression flag followed by one of gzip, bzip2, tar or zip.\nCommand line help virtualmin backup-domain [--dest file]+ [--test] [--domain name] | [--all-domains] [--user name] [--reseller name] [--plan name] [--feature name] | [--all-features] [--except-feature name] [--ignore-errors] [--newformat] [--onebyone] [--strftime] [--purge days] [--incremental] | [--no-incremental] [--all-virtualmin] | [--virtualmin config] | [--except-virtualmin config] [--option \u0026#34;feature name value\u0026#34;] [--as-owner] [--exclude file]* [--include file]* [--purge days] [--purge-debug] [--key id] [--kill-running | --wait-running] [--compression gzip|bzip2|tar|zip] Multiple domains may be specified with multiple --domain parameters. Features must be specified using their short names, like web and dns.\nThe destination can be one of:\nA local file, like /backup/yourdomain.com.tgz A local directory can be given while passing --newformat option, like /backup/ An FTP destination, like ftp://login:pass@server/backup/yourdomain.com.tgz An SSH destination, like ssh://login:pass@server/backup/yourdomain.com.tgz An S3 bucket, like s3://accesskey:secretkey@bucket A Rackspace container, like rs://user:apikey@container A Google Cloud Storage bucket, like gcs://bucket A Dropbox folder, like dropbox://folder Multiple destinations can be given, if they are all remote.\n","permalink":"https://www.virtualmin.com/docs/development/api-programs/backup-domain/","summary":"\u003ch3 id=\"backup-one-or-more-virtual-servers\"\u003eBackup one or more virtual servers\u003c/h3\u003e\n\u003cp\u003eThis program is analogous to the Backup Virtual Servers page in the Virtualmin web interface. It will create either a single backup file or multiple separate files containing the domains specified on the command line, either locally or on a remote SCP or FTP server.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003e--dest\u003c/code\u003e option sets the backup destination, and can be a simple path like \u003ccode\u003e/backup/virtualmin.tgz\u003c/code\u003e , an FTP URL like \u003ccode\u003eftp://user:pass@server:/backup/virtualmin.tgz\u003c/code\u003e , or an SCP URL like \u003ccode\u003essh://user:pass@server:/backup/virtualmin.tgz\u003c/code\u003e . When backing up to a single file, the path specifies a file that will be created. When creating one backup per domain, it specifies a directory instead.\u003c/p\u003e","title":"backup-domain"},{"content":"Outputs a list of scheduled backups By default, this program displays a table of all scheduled backups on the system. You can limit it to those owned by some virtual server with the --domain or --user flag, or to a reseller with the --reseller flag. These must be followed by a domain name, administration username or reseller login respectively.\nTo switch to a more detailed and parsable output format, add the --multiline flag to the command line. To show only scheduled backup IDs, use the --id-only flag.\nCommand line help virtualmin list-scheduled-backups [--domain domain.name | --user name | --reseller name] [--multiline | --id-only] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-scheduled-backups/","summary":"\u003ch3 id=\"outputs-a-list-of-scheduled-backups\"\u003eOutputs a list of scheduled backups\u003c/h3\u003e\n\u003cp\u003eBy default, this program displays a table of all scheduled backups on the system. You can limit it to those owned by some virtual server with the \u003ccode\u003e--domain\u003c/code\u003e or \u003ccode\u003e--user\u003c/code\u003e flag, or to a reseller with the \u003ccode\u003e--reseller\u003c/code\u003e flag. These must be followed by a domain name, administration username or reseller login respectively.\u003c/p\u003e\n\u003cp\u003eTo switch to a more detailed and parsable output format, add the \u003ccode\u003e--multiline\u003c/code\u003e flag to the command line. To show only scheduled backup IDs, use the \u003ccode\u003e--id-only\u003c/code\u003e flag.\u003c/p\u003e","title":"list-scheduled-backups"},{"content":"Restore one or more virtual servers To restore a Virtualmin backup from the command line, you will need to use this program. It takes very similar parameters to backup-domain, with the exceptions that --dest is replace with --source, and the --separate and --ignore-errors options are not used.\nThe extra option --no-reuid can be specified prevent the re-allocation of Unix UIDs and GIDs for virtual servers that are created by the restore process, so that UIDs the original system are preserved. Conversely, the flag --reuser will force re-allocation of Unix user and group names if necessary for the new system.\nSpecific features to restore can be selected with the --feature flag, followed by a feature name like dns to just restore a domain\u0026rsquo;s DNS records. However in most cases you will want to a full restore, in which case the --all-features parameter should be given.\nRestore options for specific features can be set with the --option flag followed by a feature name (like mail), an option name and value. Some of the more useful options are :\n--option mail mailuser username - restores only the mailbox username.\n--option dir dirnohomes 1 - exclude the homes subdirectory from backups.\n--option dir delete 1 - delete files that were not in the original backup.\nIf a virtual server that does not currently exist is selected to be restored, it will be created as part of the restore process. Be careful using this program, as it will not prompt for confirmation before restoring, which will over-write the contents of restored directories, databases and configuration files.\nYou can limit the restore to only domains that do not yet exist yet with the --only-missing flag. Conversely, you can specify only domains that already exist with the --only-existing flag, to prevent any new virtual servers in the backup from being created.\nIf a virtual server is re-created as part of the restore, you can use the --only-features flag to limit the features it is created with to those that are being restored. Otherwise, it will be created with all original features regardless of whether or not they were backed up.\nTo restore core Virtualmin settings (if included in the backup), the --all-virtualmin option can be specified as well. Alternately, you can select exactly which settings to include with the --virtualmin parameter. For example, --virtualmin config would only restore the module configuration.\nWhen restoring a virtual server that originally had a private IP address, the same address will be used by default. However, this may not be what you want if you are restoring a domain on a different system that is not on the same network. To use the system\u0026rsquo;s default shared IP address the --default-ip flag should be given. To use a different IP address, the --ip flag can be given followed by an address. Or you can use the --allocate-ip flag to have Virtualmin select one automatically, assuming that an allocation range is defined in the template used.\nIf restoring multiple domains, some of which were on shared IP addresses and some of which had private IPs, the --original-ip flag can be used to force IP allocation for domains that had a private address originally. Domains which were on the old system\u0026rsquo;s shared IP will be assigned this system\u0026rsquo;s default address.\nWhen the restored server was on a shared address, it will by default be given the system\u0026rsquo;s default shared IP. However, if you have defined additional shared addresses, a different one can be selected with the --shared-ip flag followed by an address.\nFlags similar to all those above also exist for IPv6, if your system supports it. The equivalent flags are named --default-ip6, --ip6, --allocate-ip6, --original-ip6 and --shared-ip6 respectively. You can also use --no-ip6 to turn off IPv6 for the domain entirely, even if it was enabled when the backup was taken.\nBy default, if any non-fatal warnings encountered during the restore process will cause the restore to fail. However, you can force it to continue with the --skip-warnings flag. Similarly, the failure of any one domain will abort the entire restore unless the --continue-on-error flag is given.\nOn a Virtualmin Pro system, you can use the --key flag followed by a backup key ID or description to select the key to decrypt this backup with. This must be the same key that the backup was originally encrypted with.\nBy default, if the domain already exists Virtualmin will just restore the backup over it. This means that any files in the domain\u0026rsquo;s home directory that were not included in the backup will still exist after the restore. To force the domain to be deleted before restoring, use the --delete-existing flag.\nWhen restoring a backup on a system that shares a home directory, MySQL database server or LDAP user database with the system the backup was take from, you can use the --replication flag to tell Virtualmin that it is expected that the directories, databases or users may already exist.\nCommand line help virtualmin restore-domain --source file [--test] [--domain name] | [--all-domains] [--feature name] | [--all-features] [--except-feature name] [--reuid | --no-reuid] [--fix] [--option \u0026#34;feature name value\u0026#34;] [--all-virtualmin] | [--virtualmin config] [--only-features] [--default-ip | --shared-ip address | --ip address | --allocate-ip | --original-ip] [--default-ip6 | --shared-ip6 address | --ip6 address | --allocate-ip6 | --original-ip6 | --no-ip6] [--only-missing | --only-existing] [--skip-warnings] [--continue-on-error] [--delete-existing] [--replication] [--key id] Multiple domains may be specified with multiple \u0026ndash;domain parameters. Features must be specified using their short names, like web and dns.\nThe source can be one of:\nA local file, like /backup/yourdomain.com.tgz An FTP destination, like ftp://login:pass@server/backup/yourdomain.com.tgz An SSH destination, like ssh://login:pass@server/backup/yourdomain.com.tgz An S3 bucket, like s3://accesskey:secretkey@bucket A Rackspace container, like rs://user:apikey@container A Google Cloud Storage bucket, like gcs://bucket A Dropbox folder, like dropbox://folder ","permalink":"https://www.virtualmin.com/docs/development/api-programs/restore-domain/","summary":"\u003ch3 id=\"restore-one-or-more-virtual-servers\"\u003eRestore one or more virtual servers\u003c/h3\u003e\n\u003cp\u003eTo restore a Virtualmin backup from the command line, you will need to use this\nprogram. It takes very similar parameters to \u003ccode\u003ebackup-domain\u003c/code\u003e, with the\nexceptions that \u003ccode\u003e--dest\u003c/code\u003e is replace with \u003ccode\u003e--source\u003c/code\u003e, and the \u003ccode\u003e--separate\u003c/code\u003e and\n\u003ccode\u003e--ignore-errors\u003c/code\u003e options are not used.\u003c/p\u003e\n\u003cp\u003eThe extra option \u003ccode\u003e--no-reuid\u003c/code\u003e can be specified prevent the re-allocation of\nUnix UIDs and GIDs for virtual servers that are created by the restore process,\nso that UIDs the original system are preserved. Conversely, the flag \u003ccode\u003e--reuser\u003c/code\u003e\nwill force re-allocation of Unix user and group names if necessary for the new\nsystem.\u003c/p\u003e","title":"restore-domain"},{"content":"Lists all available backup encryption keys When run with no flags, this command outputs a table of backup keys for use by scheduled and manula backups. To get a more parsable format with full details for each shell, use the --multiline parameter. Or to only output key IDs, use the --id-only flag.\nCommand line help virtualmin list-backup-keys [--multiline] [--id-only] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-backup-keys/","summary":"\u003ch3 id=\"lists-all-available-backup-encryption-keys\"\u003eLists all available backup encryption keys\u003c/h3\u003e\n\u003cp\u003eWhen run with no flags, this command outputs a table of backup keys for use by scheduled and manula backups. To get a more parsable format with full details for each shell, use the \u003ccode\u003e--multiline\u003c/code\u003e parameter. Or to only output key IDs, use the \u003ccode\u003e--id-only\u003c/code\u003e flag.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin list-backup-keys [--multiline]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                            [--id-only]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"list-backup-keys"},{"content":"Create a virtual server This program can be used to create a new top-level, child or alias virtual server. It is typically called with parameters something like:\nvirtualmin create-domain --domain example.com --pass password --desc \u0026#34;example.com top-level server\u0026#34; --unix --dir --webmin --web --ssl --dns --mail --limits-from-plan This would create a server called example.com with the Unix login, home directory, Webmin login, website, DNS domain and email features enabled, and disk quotas based on those set in the default plan. If you run this program with the --help option, you can see all of the other command-line options that it supports. The most commonly used are those for enabling features for the new server, such as --mysql and --logrotate.\nTo create a virtual server with a private IP address, you can use the --ip option to specify it explicitly. If your Virtualmin is configured to automatically allocate IP addresses, use the --allocate-ip option instead, to have a free address chosen from the allocation ranges. If you want to use a virtual IP that is already active on the system, you must add the --ip-already command-line option.\nIf your system supports IPv6, Virtualmin can also add a IPv6 address for a new virtual server with the --ip6 flag followed by an address in the correct format. If you have IPv6 allocation enabled in the server templates, instead use the --allocate-ip6 flag to have Virtualmin select a free address automatically.\nTo create a server that is owned by an existing user, use the --parent option, followed by the name of the virtual server to create under. In this case, the --pass , --unix , --webmin and --quota options are not needed, as a user for the new server already exists.\nTo create an alias of an existing virtual server, use the --alias option, followed by the domain name of the target server. For alias servers, the --pass , --unix , --webmin , --dir and --quota options are not needed. A variation is the --alias-with-mail option, which creates an alias virtual server that can still have mailboxes and email aliases.\nTo create a sub-domain, use the --subdom flag followed by the parent domain, which the domain being created must be under. The optional --subprefix flag can be used to set the directory under public_html of the parent domain for the sub-domains\u0026rsquo;s HTML files.\nYou can specify limits on the number of aliases, sub-servers, mailboxes and databases for the new domain owner using the --max-aliases, --max-doms, --max-mailboxes and --max-dbs options. Alternately, you can choose to have all limits (including quotas) set based on the plan using the --limits-from-plan command line flag.\nIf the virtual server has the MySQL/MariaDB or PostgreSQL features enabled, by default the password for the server\u0026rsquo;s accounts will be the same as its administration login. However, you can specify a different password with the --mysql-pass or --postgres-pass flags, each of which are followed by the password to set for that database type. These options are only available for top-level virtual servers though.\nIf your system supports chroot jails with Jailkit, the --enable-jail flag can be used to force all commands run by the domain to execute in a jail. Conversely, this can be turned off with the --disable-jail flag.\nBy default, virtual server creation will be blocked if any warnings are detected, such as an existing database or SSL certificate conflict. These can be overridden with the --skip-warnings flag.\nIf you have configured additional remote (or local) MySQL/MariaDB servers, you can select which one this domain will use with the --mysql-server flag followed by a hostname, hostname:port or socket file. Similarly, a remote PostgreSQL server can be selected with the --postgres-server flag.\nBy default, the Cloud DNS provider chosen in the specified template will be used. However, you can override this with the --cloud-dns flag followed by either local to host locally, services to use Cloudmin services, or the ID of one of the supported providers like route53 or google.\nUse the --letsencrypt flag to request an auto-renewable Let\u0026rsquo;s Encrypt certificate. To do the same but skip connectivity checks, use --letsencrypt-always flag instead.\nCommand line help virtualmin create-domain --domain domain.name --pass \u0026#34;password-for-new-domain\u0026#34; | --passfile password-file [--hashpass] [--parent domain.name | --alias domain.name | --alias-with-mail domain.name | --superdom domain.name] [--desc description-for-domain] [--email contact-email] [--user new-unix-user] [--group new-unix-group] [--unix] [--dir] [--dns] [--mail] [--web] [--ssl] [--logrotate] [--mysql] [--spam] [--status] [--webmin] [--virtualmin-awstats] [--default-features] | [--features-from-plan] [--allocate-ip | --ip virtual.ip.address | --shared-ip existing.ip.address] [--ip-already] [--default-ip6 | --shared-ip6 existing.ip.address | --allocate-ip6 | --ip6 virtual.ip.address] [--ip6-already] [--dns-ip address | --no-dns-ip] [--max-doms domains|*] [--max-aliasdoms domains] [--max-realdoms domains] [--max-mailboxes boxes] [--max-dbs databases] [--max-aliases aliases] [--quota quota-for-domain|UNLIMITED] [--uquota quota-for-unix-user|UNLIMITED] [--template \u0026#34;name\u0026#34;] [--plan \u0026#34;name\u0026#34;] [--limits-from-plan] [--suffix username-prefix] [--db database-name] [--fwdto email-address] [--reseller name] [--content text|filename] [--mysql-pass password] [--skip-warnings] [--letsencrypt] [--letsencrypt-always] [--field-name value]* [--enable-jail | --disable-jail] [--mysql-server hostname] [--postgres-server hostname] [--cloud-dns provider|\u0026#34;services\u0026#34;|\u0026#34;local\u0026#34;] [--separate-dns-subdomain | --any-dns-subdomain] [--break-ssl-cert | --link-ssl-cert] [--ssl-redirect] [--generate-ssl-cert] [--generate-ssh-key | --use-ssh-key file|data] [--append-style format] [--shell command] [--subprefix directory] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/create-domain/","summary":"\u003ch3 id=\"create-a-virtual-server\"\u003eCreate a virtual server\u003c/h3\u003e\n\u003cp\u003eThis program can be used to create a new top-level, child or alias virtual server. It is typically called with parameters something like:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin create-domain --domain example.com --pass password --desc \u0026#34;example.com top-level server\u0026#34; --unix --dir --webmin --web --ssl --dns --mail --limits-from-plan\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis would create a server called \u003ccode\u003eexample.com\u003c/code\u003e with the Unix login, home directory, Webmin login, website, DNS domain and email features enabled, and disk quotas based on those set in the default plan. If you run this program with the \u003ccode\u003e--help\u003c/code\u003e option, you can see all of the other command-line options that it supports. The most commonly used are those for enabling features for the new server, such as \u003ccode\u003e--mysql\u003c/code\u003e and \u003ccode\u003e--logrotate\u003c/code\u003e.\u003c/p\u003e","title":"create-domain"},{"content":"Duplicates an existing virtual server with a new name This command will duplicate an existing virtual server with a new domain name. Any web content, DNS records, mailboxes, mail aliases, databases and other settings associated with the original domain will be duplicated, where possible.\nThe virtual server to clone is selected with the --domain flag, and the new name is set with the --newdomain parameter. When cloning a top-level server the --newuser and --newpass flags can be used to set the login and password of the new user that will be created as part of the cloning process.\nIf the cloned virtual server has a private IP address, Virtualmin will allocate a new IP for the clone from the configured IP allocation range. If no ranges are defined or you want to use a specific address, the --ip flag can be given instead, followed by the address for the new domain to use.\nThe cloning process will copy any databases associated with the original domain under new names, and duplicate their contents. However, it will not update any scripts installed into the original domain that are configured to use the original databases - this must be done manually.\nCommand line help virtualmin clone-domain --domain domain.name --newdomain new.name [--newuser name] [--newpass password] [--ip address [--ip-already]] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/clone-domain/","summary":"\u003ch3 id=\"duplicates-an-existing-virtual-server-with-a-new-name\"\u003eDuplicates an existing virtual server with a new name\u003c/h3\u003e\n\u003cp\u003eThis command will duplicate an existing virtual server with a new domain name. Any web content, DNS records, mailboxes, mail aliases, databases and other settings associated with the original domain will be duplicated, where possible.\u003c/p\u003e\n\u003cp\u003eThe virtual server to clone is selected with the \u003ccode\u003e--domain\u003c/code\u003e flag, and the new name is set with the \u003ccode\u003e--newdomain\u003c/code\u003e parameter. When cloning a top-level server the \u003ccode\u003e--newuser\u003c/code\u003e and \u003ccode\u003e--newpass\u003c/code\u003e flags can be used to set the login and password of the new user that will be created as part of the cloning process.\u003c/p\u003e","title":"clone-domain"},{"content":"Delete one or more virtual servers To delete one or many servers (and all of their sub-servers and alias domains) from the system, use this program. The domains to remove can be specified with the --domain flag, which can be given multiple times. Alternately, you can select virtual servers by username, using the --user flag.\nThe --only option can be used to not actually delete the servers, but instead simply remove them from the control of Virtualmin. Similarly, the --preserve-remote flag tells Virtualmin to not delete any databases, home directories or users stored on remote systems. This can be useful when removing a domain that is replicated across multiple hosts with shared storage.\nBe careful with this program, as unlike the server deletion function in the Virtualmin web interface, it will not prompt for confirmation!\nCommand line help virtualmin delete-domain [--domain domain.name]* [--user username]* [--only] [--preserve-remote] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-domain/","summary":"\u003ch3 id=\"delete-one-or-more-virtual-servers\"\u003eDelete one or more virtual servers\u003c/h3\u003e\n\u003cp\u003eTo delete one or many servers (and all of their sub-servers and alias domains) from the system, use this program. The domains to remove can be specified with the \u003ccode\u003e--domain\u003c/code\u003e flag, which can be given multiple times. Alternately, you can select virtual servers by username, using the \u003ccode\u003e--user\u003c/code\u003e flag.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003e--only\u003c/code\u003e option can be used to not actually delete the servers, but instead simply remove them from the control of Virtualmin. Similarly, the \u003ccode\u003e--preserve-remote\u003c/code\u003e flag tells Virtualmin to not delete any databases, home directories or users stored on remote systems. This can be useful when removing a domain that is replicated across multiple hosts with shared storage.\u003c/p\u003e","title":"delete-domain"},{"content":"Temporarily disable a virtual server When a server is disabled, it will become temporarily unavailable without being completely deleted. This program can be used to disable one server, specified with the --domain option. The exact features that will be disabled for the server are set on the module configuration page.\nThe optional --why parameter can be followed by a description explaining why the domain has been disabled, which will be shown when anyone tries to edit it in Virtualmin.\nTo have all sub-servers owned by the same user as the specified server disabled as well, use the --subservers flag.\nCommand line help virtualmin disable-domain --domain domain.name [--why \u0026#34;explanation for disable\u0026#34;] [--subservers] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/disable-domain/","summary":"\u003ch3 id=\"temporarily-disable-a-virtual-server\"\u003eTemporarily disable a virtual server\u003c/h3\u003e\n\u003cp\u003eWhen a server is disabled, it will become temporarily unavailable without being completely deleted. This program can be used to disable one server, specified with the \u003ccode\u003e--domain\u003c/code\u003e option. The exact features that will be disabled for the server are set on the module configuration page.\u003c/p\u003e\n\u003cp\u003eThe optional \u003ccode\u003e--why\u003c/code\u003e parameter can be followed by a description explaining why the domain has been disabled, which will be shown when anyone tries to edit it in Virtualmin.\u003c/p\u003e","title":"disable-domain"},{"content":"Re-enable one virtual server This program reverses the disable process done by disable-domain , or in the Virtualmin web interface. It will restore the server to the state it was in before being disabled.\nTo have all sub-servers owned by the same user as the specified server enabled as well, use the --subservers flag.\nCommand line help virtualmin enable-domain --domain domain.name [--subservers] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/enable-domain/","summary":"\u003ch3 id=\"re-enable-one-virtual-server\"\u003eRe-enable one virtual server\u003c/h3\u003e\n\u003cp\u003eThis program reverses the disable process done by \u003ccode\u003edisable-domain\u003c/code\u003e , or in the Virtualmin web interface. It will restore the server to the state it was in before being disabled.\u003c/p\u003e\n\u003cp\u003eTo have all sub-servers owned by the same user as the specified server enabled as well, use the \u003ccode\u003e--subservers\u003c/code\u003e flag.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin enable-domain --domain domain.name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        [--subservers]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"enable-domain"},{"content":"Imports a virtual server from some other product Virtualmin has the capability to import servers from other hosting programs, such as cPanel and Plesk. This program can perform an import from the command line, which will create a new server in Virtualmin with all the same settings and content as the original server.\nThe --source parameter must be followed by the name of the backup or export file to migrate from. The --type parameter must be followed by the short name of the product that originally created the backup, such as cpanel, plesk or directadmin.\nBy default, Virtualmin will attempt to work out the domain name from the backup automatically. However, this can be overridden with the --domain parameter, which must be followed by a domain name. Similarly, the original username and password will be used unless set with --user and --pass respectively. Some migration formats do not contain the password, in which case --pass must be given, as an error will be displayed if it is missing.\nTo migrate a server under the ownership of an existing Virtualmin user, use the --parent parameter to specify the name of the parent domain. The optional --webmin parameter will cause a Webmin login to be created for the migrated server, which is typically what you want unless using --parent.\nIf the original server had a private IP address, either the --ip or --allocate-ip parameter should be used to create an IP for the new virtual server. Failure to do this may cause the migration attempt to be rejected, or for features of the migrated server to not work properly, such as its SSL virtual website. If you want to use a virtual IP that is already active on the system, you must add the --ip-already command-line option.\nWhen the migrated server was on a shared address, it will by default be given the system\u0026rsquo;s default shared IP. However, if you have defined additional shared addresses, a different one can be selected with the --shared-ip flag followed by an address.\nFlags similar to all those above also exist for IPv6, if your system supports it. The equivalent flags are named --ip6, --allocate-ip6, --original-ip6 and --shared-ip6 respectively.\nThe --template parameter can be used to specify a Virtualmin template by name to use when creating the migrated virtual server. If not given, the default settings template will be used.\nCommand line help virtualmin migrate-domain --source file --type cpanel|plesk|directadmin --domain name [--user username] [--pass \u0026#34;password\u0026#34;] [--webmin] [--template name] [--parent domain] [--prefix string] [--delete-existing] [--shared-ip address | --ip address | --allocate-ip] [--default-ip6 | --shared-ip6 address | --ip6 address | --allocate-ip6] [--test] The source can be one of:\nA local file, like /backup/yourdomain.com.tgz An FTP destination, like ftp://login:pass@server/backup/yourdomain.com.tgz An SSH destination, like ssh://login:pass@server/backup/yourdomain.com.tgz An S3 bucket, like s3://accesskey:secretkey@bucket A Rackspace container, like rs://user:apikey@container A Google Cloud Storage bucket, like gcs://bucket A Dropbox folder, like dropbox://folder ","permalink":"https://www.virtualmin.com/docs/development/api-programs/migrate-domain/","summary":"\u003ch3 id=\"imports-a-virtual-server-from-some-other-product\"\u003eImports a virtual server from some other product\u003c/h3\u003e\n\u003cp\u003eVirtualmin has the capability to import servers from other hosting programs, such as cPanel and Plesk. This program can perform an import from the command line, which will create a new server in Virtualmin with all the same settings and content as the original server.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003e--source\u003c/code\u003e parameter must be followed by the name of the backup or export\nfile to migrate from. The \u003ccode\u003e--type\u003c/code\u003e parameter must be followed by the short name\nof the product that originally created the backup, such as \u003ccode\u003ecpanel\u003c/code\u003e, \u003ccode\u003eplesk\u003c/code\u003e or\n\u003ccode\u003edirectadmin\u003c/code\u003e.\u003c/p\u003e","title":"migrate-domain"},{"content":"Change parameters of a virtual server This command can be used to modify various settings for an existing virtual server from the command line. The only mandatory parameter is --domain, which must be followed by the domain name of the server to update. The actual changes to make are specified by the other optional parameters, such as --pass to set a new password, --desc to change the server description, and --quota and --uquota to change the disk quota.\nTo add a private IP address to a virtual server that currently does not have one, the --ip or --allocate-ip options can be used, as described in the section on create-domain.\nTo revert a server with a private IP back to the system\u0026rsquo;s default shared address, use the --default-ip flag. If the system has more than one shared address, the --shared-ip flag can be used to change it.\nTo add an IPv6 address to a virtual server that currently does not have one, the --ip6 or --allocate-ip6 options can be used. To remove a v6 address, you can use --no-ip6 instead.\nTo change a server\u0026rsquo;s domain name, the --newdomain option can be used. It must be followed by a new domain name, which of course cannot be used by any existing virtual server. When changing the domain name, you may also want to use the --user option to update the administration username for the server. Both of these options will effect sub-servers as well, where appropriate.\nTo change a virtual server\u0026rsquo;s plan and apply quota and other limits from the new plan, use the --apply-plan parameter followed by the plan name or ID. Alternately, you can switch the plan without applying any of it\u0026rsquo;s limits with the --plan flag.\nYou can also have the domain\u0026rsquo;s enabled features updated to match the current or new plan with the --plan-features flag. This will disable or enable features to match those that are allowed on the plan by default.\nIf your system is on an internal network and made available to the Internet via a router doing NAT, the IP address of a domain in DNS may be different from it\u0026rsquo;s IP on the actual system. To set this, the --dns-ip flag can be given, followed by the external IP address to use. To revert to using the real IP in DNS, use --no-dns-ip instead. In both cases, the actual DNS records managed by Virtualmin will be updated.\nIf your system supports chroot jails with Jailkit, the --enable-jail flag can be used to force all commands run by the domain to execute in a jail. Conversely, this can be turned off with the --disable-jail flag. To re-sync files in the Jail, use the --copy-jail flag.\nIf you have configured additional remote (or local) MySQL servers, you can change the one used by this domain with the --mysql-server flag followed by a hostname, hostname:port or socket file. All databases and users will be migrated to the new server.\nTo specify an alias server that will be used for any links inside Virtualmin to this server, use the --link-domain flag followed by a domain name. To revert to the normal behavior, use --no-link-domain.\nBy default, virtual server plan changes that modify features will be blocked if any warnings are detected, such as an existing database or SSL certificate conflict. These can be overridden with the --skip-warnings flag.\nTo update actual filesystem quotas to match what Virtualmin thinks the domain should have, use the --apply-quotas flag. Or use --apply-all-quotas to also re-apply quotas for mailbox users. These flags are useful if underlying quotas have been corrupted or lost, for example via a filesystem move.\nCommand line help virtualmin modify-domain --domain domain.name [--desc new-description] [--user new-username] [--pass \u0026#34;new-password\u0026#34; | --passfile password-file] [--email new-email] [--quota new-quota|UNLIMITED] [--uquota new-unix-quota|UNLIMITED] [--apply-quotas | --apply-all-quotas] [--newdomain new-name] [--bw bytes|NONE] [--reseller reseller|NONE] [--add-reseller reseller]* [--delete-reseller reseller]* [--ip address] | [--allocate-ip] | [--default-ip | --shared-ip address] [--ip6 address | --allocate-ip6 | --no-ip6 | --default-ip6 | --shared-ip6 address] [--prefix name] [--template name|id] [--plan name|id | --apply-plan name|id] [--plan-features] [--add-exclude directory]* [--remove-exclude directory]* [--add-db-exclude db|db.table]* [--remove-db-exclude db|db.table]* [--dns-ip address | --no-dns-ip] [--enable-jail | --disable-jail] [--mysql-server hostname] [--link-domain domain | --no-link-domain] [--skip-warnings] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-domain/","summary":"\u003ch3 id=\"change-parameters-of-a-virtual-server\"\u003eChange parameters of a virtual server\u003c/h3\u003e\n\u003cp\u003eThis command can be used to modify various settings for an existing virtual server from the command line. The only mandatory parameter is \u003ccode\u003e--domain\u003c/code\u003e, which must be followed by the domain name of the server to update. The actual changes to make are specified by the other optional parameters, such as \u003ccode\u003e--pass\u003c/code\u003e to set a new password, \u003ccode\u003e--desc\u003c/code\u003e to change the server description, and \u003ccode\u003e--quota\u003c/code\u003e and \u003ccode\u003e--uquota\u003c/code\u003e to change the disk quota.\u003c/p\u003e","title":"modify-domain"},{"content":"Change the owner of a virtual server This command can be used to move a sub-server from one parent domain to another, thus changing the administrator who is responsible for it. It can also be used to convert a parent server into a sub-server under some existing owner.\nIn this mode, it takes only two parameters, as --domain followed by the domain name to move, and --parent followed by the domain name of the new parent server. Naturally the new parent must be different from the old one, and a server cannot be moved under itself.\nThis command should be used with care when moving a parent server, as information that is specific to it such as the password, quotas and bandwidth limit will be lost. Instead, the settings from the new parent will apply.\nThe move-domain command can also be used to convert a sub-server into a top-level server. In this case, you must give the --newuser and --newpass parameters, which are followed by the username and password for the new top-level server respectively. The original owner of the domain will no longer have access to it once the command completes.\nCommand line help virtualmin move-domain --domain domain.name [--parent domain.name] [--newuser username] [--newpass password] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/move-domain/","summary":"\u003ch3 id=\"change-the-owner-of-a-virtual-server\"\u003eChange the owner of a virtual server\u003c/h3\u003e\n\u003cp\u003eThis command can be used to move a sub-server from one parent domain to another, thus changing the administrator who is responsible for it. It can also be used to convert a parent server into a sub-server under some existing owner.\u003c/p\u003e\n\u003cp\u003eIn this mode, it takes only two parameters, as \u003ccode\u003e--domain\u003c/code\u003e followed by the domain name to move, and \u003ccode\u003e--parent\u003c/code\u003e followed by the domain name of the new parent server. Naturally the new parent must be different from the old one, and a server cannot be moved under itself.\u003c/p\u003e","title":"move-domain"},{"content":"Change the domain name, home directory or username of a virtual server This command is typically used to rename an existing server, selected with the --domain flag, and changed to the name set with the --new-domain option.\nBy default, the administration username, home directory and prefix for mailboxes will remaining unchanged. You can have these selected automatically based on the new domain name with the --auto-user, --auto-home and --auto-prefix flags. Alternately, you can set them directly with the --new-user, --new-home and --new-prefix flags followed by the settings you want.\nThis command can also be used to change the home directory or username for a domain without even changing the domain name, just set the --new-home or --new-user flags without --new-domain.\nCommand line help virtualmin rename-domain --domain domain.name [--new-domain name] [--new-user login | --auto-user] [--new-home directory | --auto-home] [--new-prefix string | --auto-prefix] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/rename-domain/","summary":"\u003ch3 id=\"change-the-domain-name-home-directory-or-username-of-a-virtual-server\"\u003eChange the domain name, home directory or username of a virtual server\u003c/h3\u003e\n\u003cp\u003eThis command is typically used to rename an existing server, selected with the \u003ccode\u003e--domain\u003c/code\u003e flag, and changed to the name set with the \u003ccode\u003e--new-domain\u003c/code\u003e option.\u003c/p\u003e\n\u003cp\u003eBy default, the administration username, home directory and prefix for mailboxes will remaining unchanged. You can have these selected automatically based on the new domain name with the \u003ccode\u003e--auto-user\u003c/code\u003e, \u003ccode\u003e--auto-home\u003c/code\u003e and \u003ccode\u003e--auto-prefix\u003c/code\u003e flags. Alternately, you can set them directly with the \u003ccode\u003e--new-user\u003c/code\u003e, \u003ccode\u003e--new-home\u003c/code\u003e and \u003ccode\u003e--new-prefix\u003c/code\u003e flags followed by the settings you want.\u003c/p\u003e","title":"rename-domain"},{"content":"Updates allowed relay addresses in one or more domains This command can be used to bring the lists of allowed addresses on secondary MX servers into sync with the master Virtualmin system for some or all domains. In general it should never need to be run, unless email addresses have been modified outside of Virtualmin\u0026rsquo;s control.\nThe only flags it takes are --domain followed by domain name to sync, --user followed by the name of a user who owns domains, or --all-domains.\nCommand line help virtualmin syncmx-domain [--domain domain.name]* [--user username]* ","permalink":"https://www.virtualmin.com/docs/development/api-programs/syncmx-domain/","summary":"\u003ch3 id=\"updates-allowed-relay-addresses-in-one-or-more-domains\"\u003eUpdates allowed relay addresses in one or more domains\u003c/h3\u003e\n\u003cp\u003eThis command can be used to bring the lists of allowed addresses on secondary MX servers into sync with the master Virtualmin system for some or all domains. In general it should never need to be run, unless email addresses have been modified outside of Virtualmin\u0026rsquo;s control.\u003c/p\u003e\n\u003cp\u003eThe only flags it takes are \u003ccode\u003e--domain\u003c/code\u003e followed by domain name to sync, \u003ccode\u003e--user\u003c/code\u003e followed by the name of a user who owns domains, or \u003ccode\u003e--all-domains\u003c/code\u003e.\u003c/p\u003e","title":"syncmx-domain"},{"content":"Move a virtual server to another system This command copies or moves a virtual server to another system, which must also run Virtualmin. The server to move is specified with the --domain flag, and if a top-level server is given all sub-servers will be moved along with it.\nBy default, the transfer to the new system is done via SSH. However, you can switch to using the Webmin RPC protocol with the --webmin flag. The target system is set with the --host flag follow by the hostname or IP of a system that is reachable via the chosen protocol. If the root user requires a password to login, the --pass flag must also be given.\nBy default the domain is simply copied to the target system using Virtualmin\u0026rsquo;s backup and restore functions. However, if the --delete flag is given it will be remove from this system after being copied. Alternately, the --disable flag can be used to disable the domain on the source system without completely removing it.\nIf you are using this command to replicate a domain to another system that shared home directories, a MySQL server or users (via LDAP) with this system, the --replication flag is recommended to prevent the remote system from un-necessarily overwriting shared data.\nIf the --overwrite flag is not given, this command will fail if the domain already exists on the destination system. If you do expect it to exist, the --delete-missing-files flag will cause the restore to remove from the destination domain any files that are not included in the backup.\nWhen transferring a domain with a private IP address and you want a new address allocated on the destination system, use the --allocate-ip flag.\nCommand line help virtualmin transfer-domain --domain domain.name --host hostname [--pass password] [--webmin | --ssh] [--disable | --delete] [--overwrite] [--delete-missing-files] [--replication] [--allocate-ip] [--output] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/transfer-domain/","summary":"\u003ch3 id=\"move-a-virtual-server-to-another-system\"\u003eMove a virtual server to another system\u003c/h3\u003e\n\u003cp\u003eThis command copies or moves a virtual server to another system, which must also run Virtualmin. The server to move is specified with the \u003ccode\u003e--domain\u003c/code\u003e flag, and if a top-level server is given all sub-servers will be moved along with it.\u003c/p\u003e\n\u003cp\u003eBy default, the transfer to the new system is done via SSH. However, you can switch to using the Webmin RPC protocol with the \u003ccode\u003e--webmin\u003c/code\u003e flag. The target system is set with the \u003ccode\u003e--host\u003c/code\u003e flag follow by the hostname or IP of a system that is reachable via the chosen protocol. If the \u003ccode\u003eroot\u003c/code\u003e user requires a password to login, the \u003ccode\u003e--pass\u003c/code\u003e flag must also be given.\u003c/p\u003e","title":"transfer-domain"},{"content":"Convert an alias domain into a sub-server This command can be used to convert an alias server into a sub-server, so that it can have its own separate web pages, mailboxes and mail aliases. Once it is run, the former alias domain will no longer serve the same web pages as the target virtual server, and will no longer forward email.\nThis command takes only one parameter, which is --domain followed by the domain name of the sub-domain to convert.\nCommand line help virtualmin unalias-domain --domain domain.name ","permalink":"https://www.virtualmin.com/docs/development/api-programs/unalias-domain/","summary":"\u003ch3 id=\"convert-an-alias-domain-into-a-sub-server\"\u003eConvert an alias domain into a sub-server\u003c/h3\u003e\n\u003cp\u003eThis command can be used to convert an alias server into a sub-server, so that it can have its own separate web pages, mailboxes and mail aliases. Once it is run, the former alias domain will no longer serve the same web pages as the target virtual server, and will no longer forward email.\u003c/p\u003e\n\u003cp\u003eThis command takes only one parameter, which is \u003ccode\u003e--domain\u003c/code\u003e followed by the domain name of the sub-domain to convert.\u003c/p\u003e","title":"unalias-domain"},{"content":"Convert a sub-domain into a sub-server This command can be used to convert a sub-domain into a sub-server, by moving its web pages to under the virtual server\u0026rsquo;s home directory, and extracting DNS records into a separate domain. Sub-domains are a legacy feature that should not be used in future, and have fewer features available than full sub-servers.\nThis command takes only one parameter, which is --domain followed by the domain name of the sub-domain to convert.\nCommand line help virtualmin unsub-domain --domain domain.name ","permalink":"https://www.virtualmin.com/docs/development/api-programs/unsub-domain/","summary":"\u003ch3 id=\"convert-a-sub-domain-into-a-sub-server\"\u003eConvert a sub-domain into a sub-server\u003c/h3\u003e\n\u003cp\u003eThis command can be used to convert a sub-domain into a sub-server, by moving its web pages to under the virtual server\u0026rsquo;s home directory, and extracting DNS records into a separate domain. Sub-domains are a legacy feature that should not be used in future, and have fewer features available than full sub-servers.\u003c/p\u003e\n\u003cp\u003eThis command takes only one parameter, which is \u003ccode\u003e--domain\u003c/code\u003e followed by the domain name of the sub-domain to convert.\u003c/p\u003e","title":"unsub-domain"},{"content":"Lists all virtual servers This program does not modify the system, but instead simply outputs a list of all existing virtual servers. By default, the list is a reader-friendly format, but the --multiline option can be used to display more details for each server, in a format suitable for parsing by other programs. The --domain option can be used to specify a single virtual server to list, in cases where you know exactly which server you are interested in.\nTo limit the domains to those owned by a single user, the --user parameter can be given, following by a domain owner\u0026rsquo;s name. You can also limit it to particular server types with the --alias, --no-alias, --subserver, --toplevel and --subdomain parameters.\nTo only show domains with a particular feature active, use the --with-feature parameter followed by a feature code like dns or web. Alternately, --without-feature can be used to show only domains without some feature enabled. The similar --with-web and --with-ssl flags can be used to show domains with any kind of website (Apache or Nginx).\nTo limit the list to virtual servers on some plan, use the --plan flag followed by a plan name or ID. Similarly, you can select only virtual servers created using some template with the --template flag, followed by an ID or name.\nTo show only domains owned by some reseller, use the --reseller flag followed by a reseller name. Or to list those not owned by any reseller, use the --no-reseller flag. Finally, to list domains owned by any reseller, you can use the --any-reseller option.\nTo show only domains that are enabled, use the --enabled flag. To show only disabled domains, use --disabled instead.\nTo limit the output to domains using a particular PHP execution mode, use the --php-mode flag followed by one of none, cgi, fcgid or fpm.\nTo search by IPv4 or IPv6 address, use the --ip flag followed by either kind of address. This will find domains using that address either exclusively or shared with other domains.\nTo find the domain that contains a mailbox, use the --mail-user flag followed by the full mailbox username (as used by FTP and IMAP).\nTo get a list of domain names only, use the --name-only parameter. To get just Virtualmin domain IDs, use --id-only. These are useful when iterating through domains in a script. You can also use --user-only to output only usernames, or --home-only to get just home directories, or --simple-multiline to get a faster subset of the information output in --multiline mode.\nCommand line help virtualmin list-domains [--multiline | --name-only | --id-only | --simple-multiline | --user-only | --home-only | --file-only | --ip-only] [--domain name]* [--user name]* [--mail-user name]* [--id number]* [--with-feature feature] [--without-feature feature] [--with-web] [--with-ssl] [--alias domain | --no-alias] [--subserver | --toplevel | --subdomain] [--parent domain] [--plan ID|name] [--template ID|name] [--disabled | --enabled] [--php-mode cgi|fcgid|fpm] [--ip address] [--reseller name | --no-reseller | --any-reseller] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-domains/","summary":"\u003ch3 id=\"lists-all-virtual-servers\"\u003eLists all virtual servers\u003c/h3\u003e\n\u003cp\u003eThis program does not modify the system, but instead simply outputs a list of all existing virtual servers. By default, the list is a reader-friendly format, but the \u003ccode\u003e--multiline\u003c/code\u003e option can be used to display more details for each server, in a format suitable for parsing by other programs. The \u003ccode\u003e--domain\u003c/code\u003e option can be used to specify a single virtual server to list, in cases where you know exactly which server you are interested in.\u003c/p\u003e","title":"list-domains"},{"content":"Send email to some or all virtual server owners This command can be used to send a text format email message to the owners and possibly extra administrators of some or all virtual servers. The servers to notify can be selected with the --domain flag followed by a domain name, which can be given multiple times. Or you can use --user followed by an administrator\u0026rsquo;s username. If neither are given, the email is sent to all virtual servers.\nIf the message is related to some service such as email or web serving, you can use the --with-feature flag followed by a feature code like mail or web to limit the servers notified to those with that feature enabled. Similarly, you can use --without-feature to select only virtual servers that do not have some feature enabled.\nThe message contents are typically read from a file, specified with the --body-file parameter. Or they can be passed as input to the script if the --body-stdin flag is used. Or for very short messages, you can specify the contents on the command line with --body-message. Als, you can set a custom character set for the message body with the optional --charset flag.\nThe email subject line must be set with the --subject flag. The from address defaults to whatever you have configured globally in Virtualmin, but can be overridden with the --from flag.\nBy default only domain owners are notified, but you can include extra admins for the selected virtual servers with the --admins flag. Only admins who have an email address configured will receive the message though.\nCommand line help virtualmin notify-domains [--domain name] [--user login] [--with-feature code] [--without-feature code] --body-file /path/to/file.txt | --body-message \u0026#34;text\u0026#34; | --body-stdin [--charset cs] --subject \u0026#34;subject line\u0026#34; [--from user@domain] [--admins] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/notify-domains/","summary":"\u003ch3 id=\"send-email-to-some-or-all-virtual-server-owners\"\u003eSend email to some or all virtual server owners\u003c/h3\u003e\n\u003cp\u003eThis command can be used to send a text format email message to the owners and possibly extra administrators of some or all virtual servers. The servers to notify can be selected with the \u003ccode\u003e--domain\u003c/code\u003e flag followed by a domain name, which can be given multiple times. Or you can use \u003ccode\u003e--user\u003c/code\u003e followed by an administrator\u0026rsquo;s username. If neither are given, the email is sent to all virtual servers.\u003c/p\u003e","title":"notify-domains"},{"content":"Check the configuration of virtual servers This program can be used to generate a report on selected features for selected virtual servers, to ensure that they are setup correctly. Validation is useful for detecting things such as manually removed Apache virtual hosts or BIND domains, wrong permissions and missing configuration files.\nTo specify the servers to check, you can either supply the --all-domains parameter, or --domain followed by the domain name. Similar, you can select features to check with the --feature parameter followed by a feature name (like web or dns), or the --all-features option. Both --domain and --feature can be given multiple times.\nCommand line help virtualmin validate-domains --domain name | --all-domains [--feature name]* | [--all-features] [--problems] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/validate-domains/","summary":"\u003ch3 id=\"check-the-configuration-of-virtual-servers\"\u003eCheck the configuration of virtual servers\u003c/h3\u003e\n\u003cp\u003eThis program can be used to generate a report on selected features for selected virtual servers, to ensure that they are setup correctly. Validation is useful for detecting things such as manually removed Apache virtual hosts or BIND domains, wrong permissions and missing configuration files.\u003c/p\u003e\n\u003cp\u003eTo specify the servers to check, you can either supply the \u003ccode\u003e--all-domains\u003c/code\u003e parameter, or \u003ccode\u003e--domain\u003c/code\u003e followed by the domain name. Similar, you can select features to check with the \u003ccode\u003e--feature\u003c/code\u003e parameter followed by a feature name (like web or dns), or the \u003ccode\u003e--all-features\u003c/code\u003e option. Both \u003ccode\u003e--domain\u003c/code\u003e and \u003ccode\u003e--feature\u003c/code\u003e can be given multiple times.\u003c/p\u003e","title":"validate-domains"},{"content":"Turn on some features for a virtual server To enable features for one or more servers from the command line, use this program. The features to enable can be specified in the same way as the create-domain program, such as --web, --dns and --virtualmin-svn. The servers to effect can either individually specified with the --domain option, which can occur multiple times, or with --all-domains to update all virtual server.\nWhen updating multiple servers, this program may take some time to run due to the amount of work it needs to do. However, the progress of each server and step will be shown as it runs.\nIf the --associate flag is given, this command will simply make Virtualmin assume that the underlying configuration changes or databases have been already created. This reverses the effect of the --disassociate flag to the disable-feature API command.\nCommand line help virtualmin enable-feature --domain name | --user name | --all-domains [--associate] [--unix] [--dir] [--dns] [--mail] [--web] [--ssl] [--logrotate] [--mysql] [--spam] [--status] [--webmin] [--virtualmin-awstats] [--skip-warnings] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/enable-feature/","summary":"\u003ch3 id=\"turn-on-some-features-for-a-virtual-server\"\u003eTurn on some features for a virtual server\u003c/h3\u003e\n\u003cp\u003eTo enable features for one or more servers from the command line, use this program. The features to enable can be specified in the same way as the \u003ccode\u003ecreate-domain\u003c/code\u003e program, such as \u003ccode\u003e--web\u003c/code\u003e, \u003ccode\u003e--dns\u003c/code\u003e and \u003ccode\u003e--virtualmin-svn\u003c/code\u003e. The servers to effect can either individually specified with the \u003ccode\u003e--domain\u003c/code\u003e option, which can occur multiple times, or with \u003ccode\u003e--all-domains\u003c/code\u003e to update all virtual server.\u003c/p\u003e\n\u003cp\u003eWhen updating multiple servers, this program may take some time to run due to the amount of work it needs to do. However, the progress of each server and step will be shown as it runs.\u003c/p\u003e","title":"enable-feature"},{"content":"Turn off some features for a virtual server This program is very similar to enable-feature, and takes the same command line parameters, but disables the specified features instead. Be careful when using it, as it will not prompt for confirmation before disabling features that may result in the loss of configuration files and other data.\nYou can select the servers to update with the --domain and --user flags, each of which can be given multiple times. The --dns-subdomains flag will also include all DNS sub-domains that share the same zone file of those selected.\nIf the --disassociate flag is given, this command will simply remove the association between the domain and the underlying system configuration or database. For example, if disabling the MySQL/MariaDB with the --disassociate flag set, the underlying databases belonging to the domain would not be removed.\nCommand line help virtualmin disable-feature --domain name | --user name | --all-domains [--dns-subdomains] [--disassociate] [--unix] [--dir] [--dns] [--mail] [--web] [--ssl] [--logrotate] [--mysql] [--spam] [--status] [--webmin] [--virtualmin-awstats] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/disable-feature/","summary":"\u003ch3 id=\"turn-off-some-features-for-a-virtual-server\"\u003eTurn off some features for a virtual server\u003c/h3\u003e\n\u003cp\u003eThis program is very similar to \u003ccode\u003eenable-feature\u003c/code\u003e, and takes the same command line parameters, but disables the specified features instead. Be careful when using it, as it will not prompt for confirmation before disabling features that may result in the loss of configuration files and other data.\u003c/p\u003e\n\u003cp\u003eYou can select the servers to update with the \u003ccode\u003e--domain\u003c/code\u003e and \u003ccode\u003e--user\u003c/code\u003e flags, each of which can be given multiple times. The \u003ccode\u003e--dns-subdomains\u003c/code\u003e flag will also include all DNS sub-domains that share the same zone file of those selected.\u003c/p\u003e","title":"disable-feature"},{"content":"Change DNS settings for virtual servers This program updates DNS-related options for one or more servers, selected using the --domain or --all-domains flags. Or you can select all domains that don\u0026rsquo;t have their own private IP address with --all-nonvirt-domains.\nTo enable SPF for a domain, using --spf option, and to turn it off use --no-spf. By default, the SPF record will be created using the settings from the DNS section of the domain\u0026rsquo;s server template.\nTo add allowed hostname, MX domains or IP addresses, use the --spf-add-a, --spf-add-mx, --spf-add-ip4 and --spf-add-ip6 options respectively. Each of which must be followed by a single host, domain or IP address. Or you can use --spf-add-include followed by a domain name who\u0026rsquo;s SPF policy will be included in this one.\nSimilarly, the --spf-remove-a, --spf-remove-mx, --spf-remove-ip4, --spf-remove-ip6 and --spf-remove-include options will remove the following host, domain or IP address from the allowed list for the specified domains.\nTo control how SPF treats senders not in the allowed hosts list, use one of the --spf-all-disallow, --spf-all-discourage, --spf-all-neutral, --spf-all-allow or --spf-all-default parameters.\nTo enable the DMARC DNS record for a domain, use the --dmarc flag - or to disable it, use --no-dmarc. The DMARC action for other mail servers to perform can be set with the --dmarc-policy flag, and the percentage of messages it should be applied to can be set with --dmarc-percent.\nThis command can also be used to add and remove DNS records from all the selected domains. Adding is done with the --add-record flag, which must be followed by a single parameter containing the record name, type and value. Alternately, you can use --add-record-with-ttl followed by the name, type, TTL and value. If your cloud DNS provider supports proxy records, you can use the --add-proxy-record with the same parameters as --add-record.\nConversely, deletion is done with the --remove-record flag, followed by a single parameter containing the name and type of the record(s) to delete. You can also optionally include the record values, to disambiguate records with the same name but different values (like MX records).\nYou can also update an existing record with the --update-record flag, which must be followed by two parameters. First is the current name and type, and second is the new name, type and values. The record addition, modification and deletion flags can be given multiple times.\nSimilarly, the default TTL for records can be set with the --ttl flag followed by a number in seconds. Suffixes like h, m and d are also allowed to specific a TTL in hours, minutes or days. Alternately, the --all-ttl flag can be used to set the TTL for all records in the domain.\nYou can also add or remove slave DNS servers for this domain, assuming that they have already been setup in Webmin\u0026rsquo;s BIND DNS Server module. To add a specific slave host, use the --add-slave flag followed by a hostname. Or to add them all, use the --add-all-slaves flag.\nTo remove a single slave host, use the --remove-slave command followed by a hostname. Or to remove any slave hosts that are no longer valid (ie. because they were removed from Webmin), use the --sync-all-slaves flag.\nIf your system is on an internal network and made available to the Internet via a router doing NAT, the IP address of a domain in DNS may be different from it\u0026rsquo;s IP on the actual system. To set this, the --dns-ip flag can be given, followed by the external IP address to use. To revert to using the real IP in DNS, use --no-dns-ip instead. In both cases, the actual DNS records managed by Virtualmin will be updated.\nTo add TLSA records (for publishing SSL certs) to selected domains, use the --enable-tlsa flag. Similarly the --disable-tlsa removes them, and the --sync-tlsa updates them in domains where they already exist.\nIf a virtual server is a sub-domain of another server, you can move it\u0026rsquo;s DNS records out into a separate zone file with the --disable-subdomain flag. Or if eligible, you can combine the zones with --enable-subdomain.\nIf this domain has a parent domain also hosted on the same system but not sharding the same zone file, you can use the --add-parent-ds flags to add required DNSSEC DS records to the parent. Alternately you can use --remove-parent-ds to delete them, but this is not recommended as it may break DNSSEC validation.\nIf you have Cloud DNS providers setup, you can move the domain to one with the --cloud-dns flag followed by a provider name like cloudflare or route53. Alternately the domain can be moved back to local hosting with the flag --cloud-dns local.\nSimilarly, the --remote-dns flag followed by a hostname can be used to move this domain to a remote Webmin DNS server, if one is configured. Or to move it back to local hosting, use the --local-dns flag.\nCommand line help virtualmin modify-dns --domain name | --all-domains | --all-nonvirt-domains [--spf | --no-spf] [--spf-add-a hostname]* [--spf-add-mx domain]* [--spf-add-ip4 address]* [--spf-add-ip6 address]* [--spf-remove-a hostname]* [--spf-remove-mx domain]* [--spf-remove-ip4 address]* [--spf-remove-ip6 address]* [--spf-all-disallow | --spf-all-discourage | --spf-all-neutral | --spf-all-allow | --spf-all-default] [--dmarc | --no-dmarc] [--dmarc-policy none|quarantine|reject] [--dmarc-percent number] [--add-record \u0026#34;name type value\u0026#34;] [--add-record-with-ttl \u0026#34;name type TTL value\u0026#34;] [--add-proxy-record \u0026#34;name type value\u0026#34;] [--remove-record \u0026#34;name type value\u0026#34;] [--update-record \u0026#34;oldname oldtype\u0026#34; \u0026#34;name type value\u0026#34;] [--ttl seconds | --all-ttl seconds] [--add-slave hostname]* | [--add-all-slaves] [--remove-slave hostname]* | [--sync-all-slaves] [--dns-ip address | --no-dns-ip] [--enable-dnssec | --disable-dnssec] [--enable-tlsa | --disable-tlsa | --sync-tlsa] [--enable-subdomain | --disable-subdomain] [--cloud-dns provider|\u0026#34;local\u0026#34;] [--remote-dns hostname | --local-dns] [--add-parent-ds | --remove-parent-ds] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-dns/","summary":"\u003ch3 id=\"change-dns-settings-for-virtual-servers\"\u003eChange DNS settings for virtual servers\u003c/h3\u003e\n\u003cp\u003eThis program updates DNS-related options for one or more servers, selected using the \u003ccode\u003e--domain\u003c/code\u003e or \u003ccode\u003e--all-domains\u003c/code\u003e flags. Or you can select all domains that don\u0026rsquo;t have their own private IP address with \u003ccode\u003e--all-nonvirt-domains\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eTo enable SPF for a domain, using \u003ccode\u003e--spf\u003c/code\u003e option, and to turn it off use \u003ccode\u003e--no-spf\u003c/code\u003e. By default, the SPF record will be created using the settings from the DNS section of the domain\u0026rsquo;s server template.\u003c/p\u003e","title":"modify-dns"},{"content":"Change spam filtering and delivery settings for a virtual server This command can be used to change the location than email tagged as spam or virus-laden is delivered to for one or more virtual servers. The servers to act on can be either specified with the --domain parameter, or all domains with spam filtering enabled can be selected with --all-domains.\nThe following parameters control what happens to messages identified as spam:\n--spam-delete - Delete all spam mail\n--spam-deliver - Deliver to user\u0026rsquo;s mailbox normally\n--spam-mailfile- Write to user\u0026rsquo;s ~/mail/spam file in mbox format\n--spam-maildir - Write to user\u0026rsquo;s ~/Maildir/.spam file in Maildir format\n--spam-file - Write to the file following this parameter, which must be relative to the user\u0026rsquo;s home directory\n--spam-email - Forward to the email address following this parameter\n--spam-dest - Write to the absolute file following the parameter\nA similar set of options exist for virus filtering, but starting with --virus instead of --spam.\nVirtualmin has the ability to delete spam from the spam folders of all users in a domain once it passes some threshold, such as age or size. You can enable this with the --spamclear-days parameter followed by the maximum age in days, or --spamclear-size followed by a size in bytes. Or to turn off spam deletion, use the --spamclear-none parameter.\nSimilarly you can enable automatic deletion from trash folders with the --trashclear-days parameter followed by the maximum age in days, or --trashclear-size followed by a size in bytes. Or to turn off trash deletion, use the --trashclear-none parameter.\nSpamAssassin gives each message it scans a numeric score, and typically anything above 5 is considered spam and placed in a separate user folder. However, you can choose to simply delete all incoming spam with a score above some higher threshold (such as 10) using the --spam-delete-level parameter, which must be followed by a number. To turn this behavior off again, use the --spam-no-delete-level flag.\nTo enable the spam-trap and ham-trap aliases for the selected virtual servers, you can use the --spamtrap command-line flag. Similarly, to remove them use the --no-spamtrap flag. When enabled, users will be able to forward spam to spamtrap@theirdomain.com for adding to the domain\u0026rsquo;s blacklist.\nCommand line help virtualmin modify-spam --domain name | --all-domains [--spam-delete | --spam-deliver | --spam-mailfile [folder] | --spam-file file-under-home | --spam-email address | --spam-dest file | --spam-maildir [folder] ] [--spam-delete-level score | --spam-no-delete-level] [--virus-delete | --virus-mailfile [folder] | --virus-file file-under-home | --virus-email address | --virus-dest file --virus-maildir [folder] ] [--spam-whitelist | --no-spam-whitelist] [--use-spamassassin | --use-spamc] [--spamclear-none | --spamclear-days days --spamclear-size bytes] [--trashclear-none | --trashclear-days days --trashclear-size bytes] [--use-clamscan | --use-clamdscan | --use-clamd-stream-client | --use-clamdscan-remote] [--spamtrap | --no-spamtrap] Modifying the SpamAssassin or virus scanning client for individual domains is deprecated.\n","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-spam/","summary":"\u003ch3 id=\"change-spam-filtering-and-delivery-settings-for-a-virtual-server\"\u003eChange spam filtering and delivery settings for a virtual server\u003c/h3\u003e\n\u003cp\u003eThis command can be used to change the location than email tagged as spam or virus-laden is delivered to for one or more virtual servers. The servers to act on can be either specified with the \u003ccode\u003e--domain\u003c/code\u003e parameter, or all domains with spam filtering enabled can be selected with \u003ccode\u003e--all-domains\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThe following parameters control what happens to messages identified as spam:\u003c/p\u003e","title":"modify-spam"},{"content":"Change a virtual server\u0026rsquo;s web configuration This script can update the PHP and web forwarding settings for one or more virtual servers. Like other scripts, the servers to change are selecting using the --domain or --all-domains parameters.\nTo change the method Virtualmin uses to run CGI scripts, use the --mode parameter followed by one of none, cgi, fcgid or fpm. Or you can use --default-mode to switch to the default defined in the domain\u0026rsquo;s template.\nWhen using FPM mode, you can configure process manager mode, like dynamic, static or ondemand with the --php-fpm-mode flag.\nAdditionally, when using FPM mode, you can configure webserver to use a socket file for communication with the FPM server with the --php-fpm-socket flag. Or switch back to using a TCP port with the --php-fpm-port flag.\nIf your system has more than one version of PHP installed, the version to use for a domain can be set with the --php-version parameter, followed by a number (7.4 or 8.2).\nIf Virtualmin runs PHP via FastCGI, you can set the number of PHP sub-processes with the --php-children parameter or using --php-children-no-check parameter to skip recommended checks, or turn off the automatic startup of sub-processes with --no-php-children. Similarly, the maximum run-time of a PHP script can be set with --php-timeout, or set to unlimited with --no-php-timeout.\nPHP error logging can be enabled with the --php-log flag, followed by a path like logs/php.log. Alternately you can opt to use the default path with the --default-php-log flag, or turn logging off with the flag --no-php-log.\nIf your Apache configuration contains unsupported mod_php directives, the --cleanup-mod-php flag can be used to remove them from a virtual server. This is primarily useful if the Apache module has been disabled, but not all directives have been cleaned up.\nThe --proxy parameter can be used to have the website proxy all requests to another URL, which must follow --proxy. To disable this, the --no-proxy parameter must be given.\nThe --framefwd parameter similarly can be used to forward requests to the virtual server to another URL, using a hidden frame rather than proxying. To turn it off, using the --no-framefwd option. To specify a title for the forwarding frame page, use --frametitle.\nIf Ruby is installed, the execution mode for scripts in that language can be set with the --ruby-mode flag, followed by either --mod_ruby, --cgi or --fcgid. This has no effect on scripts using the Rails framework though, as they always run via a Mongrel proxy.\nYou can also replace a website\u0026rsquo;s pages using Virtualmin\u0026rsquo;s content style, If --content parameter is given, it will be used in default style web page.\nTo enable the webmail and admin DNS entries for the selected domains (which redirect to Usermin and Webmin by default), the --webmail flag can be used. This will make both the DNS and Apache configuration changes needed. To turn them off, use the --no-webmail flag.\nTo have Apache configured to accept requests for any sub-domain, use the --matchall command-line flag. This will also add a * DNS entry if needed. To turn this feature off, use the --no-matchall flag.\nTo enable server-side includes for this virtual server, use the --includes flag followed by an extension like .html or .shtml. To disable includes, use the --no-includes flag.\nTo make a virtual server the default served by Apache for its IP address, use the --default-website flag. This lets you control which domain\u0026rsquo;s contents appear if someone accesses your system via a URL with only an IP address, rather than a domain name.\nTo change the HTTP port the selected virtual servers listen on, use the --port flag followed by a port number. For SSL websites, you can also use the --ssl-port flag.\nAlternately, you can change the HTTP port that Virtualmin uses in URLs referencing this domain with the --url-port flag. For SSL websites, you can also use the --ssl-url-port flag.\nIf the domain\u0026rsquo;s SSL certificate was requested from Let\u0026rsquo;s Encrypt, you can turn on automatic renewal when close to expiry with the --letsencrypt-renew flag. Alternately, renewal can be disabled with the --no-letsencrypt-renew parameter.\nIf the domain is sharing an SSL certificate with another domain (because it\u0026rsquo;s CN matches both of them), you can use the --break-ssl-cert flag to stop sharing and allow this domain\u0026rsquo;s cert to be re-generated. Conversely, if the server isn\u0026rsquo;t sharing a cert but could, the --link-ssl-cert flag can be used to enable sharing.\nTo change the domain\u0026rsquo;s HTML directory, use the --document-dir flag followed by a path relative to the domain\u0026rsquo;s home. Alternately, if the Apache config has been modified outside of Virtualmin and you just want to detect the new path, use the --fix-document-dir flag. If you want the directory to be renamed as well as updated in the webserver configuration, use the --move-document-dir flag. Note that this flag cannot be used for sub-domains, as their HTML directory is under the parent\u0026rsquo;s HTML dir.\nHowever, for sub-domains you can adjust the HTML sub-directory with the --subprefix path followed by a directory relative to the parent\u0026rsquo;s public_html dir. Or use --move-subprefix to actually move the directory as well.\nTo force re-generated of TLSA DNS records after the SSL cert is manually modified, use the --sync-tlsa flag.\nIf your system supports FCGIwrap for running CGI scripts, you can use the --enable-fcgiwrap flag to switch to it instead of using suEXEC, or --disable-fcgiwrap to switch back.\nIf your webserver supports multiple HTTP protocols, you can use the --protocols flag to choose which are enabled for the website. This flag must be followed by some combination of http/1.1, h2 and h2c. To revert to the default protocols for your webserver, use the --default-protocols flag.\nCommand line help virtualmin modify-web --domain name | --all-domains [--mode cgi|fcgid|fpm | --default-mode] [--php-children|--php-children-no-check number | --no-php-children] [--php-version num] [--php-timeout seconds | --no-php-timeout] [--php-fpm-port | --php-fpm-socket] [--php-fpm-mode dynamic|static|ondemand] [--php-log filename | --no-php-log | --default-php-log] [--cleanup-mod-php] [--proxy http://... | --no-proxy] [--framefwd http://... | --no-framefwd] [--frametitle \u0026#34;title\u0026#34; ] [--ruby-mode none|mod_ruby|cgi|fcgid] [--content text|filename] [--webmail | --no-webmail] [--matchall | --no-matchall] [--includes extension | --no-includes] [--default-website] [--access-log log-path] [--error-log log-path] [--document-dir subdirectory | --move-document-dir subdirectory | --subprefix subdirectory | --move-subprefix subdirectory | --fix-document-dir] [--port number] [--ssl-port number] [--url-port number] [--ssl-url-port number] [--fix-options] [--letsencrypt-renew | --no-letsencrypt-renew] [--break-ssl-cert | --link-ssl-cert] [--enable-fcgiwrap | --disable-fcgiwrap] [--sync-tlsa] [--add-directive \u0026#34;name value\u0026#34;] [--remove-directive \u0026#34;name value\u0026#34;] [--protocols \u0026#34;proto ..\u0026#34; | --default-protocols] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-web/","summary":"\u003ch3 id=\"change-a-virtual-servers-web-configuration\"\u003eChange a virtual server\u0026rsquo;s web configuration\u003c/h3\u003e\n\u003cp\u003eThis script can update the PHP and web forwarding settings for one or more virtual servers. Like other scripts, the servers to change are selecting using the \u003ccode\u003e--domain\u003c/code\u003e or \u003ccode\u003e--all-domains\u003c/code\u003e parameters.\u003c/p\u003e\n\u003cp\u003eTo change the method Virtualmin uses to run CGI scripts, use the \u003ccode\u003e--mode\u003c/code\u003e parameter followed by one of \u003ccode\u003enone\u003c/code\u003e, \u003ccode\u003ecgi\u003c/code\u003e, \u003ccode\u003efcgid\u003c/code\u003e or \u003ccode\u003efpm\u003c/code\u003e. Or you can use \u003ccode\u003e--default-mode\u003c/code\u003e to switch to the default defined in the domain\u0026rsquo;s template.\u003c/p\u003e","title":"modify-web"},{"content":"Change mail-related settings for some domains This command can be used to configure BCC of outgoing email and set the alias mode for one or more virtual servers. The domains to effect are set by the --domain flag, which can occur multiple times and must be followed by a virtual server name. Or you can use --user followed by an administrator\u0026rsquo;s username to get all his domains, or --all-domains to modify all those on the system with mail enabled.\nIf your mail server supports it, BCC of relayed email by all users in the selected domains can be enabled with the --sender-bcc flag, which must be followed by an email address. To turn this off again, use the --no-sender-bcc flag.\nSimilarly, BCC of incoming email to all users in the selected domains can be enabled with the --recipient-bcc flag, which must be followed by an email address. To turn this off again, use the --no-recipient-bcc flag.\nBy default, Virtualmin implements mail alias domains with catchall aliases, which forward all email to addresses in the alias domain to the same address in the target. However, when using Postfix this prevents email to invalid addresses in the alias from being bounced at the SMTP conversation stage - instead, a bounce email is sent, which is regarded as poor mail server practice and can be abused by spammers.\nTo prevent this, the --alias-copy flag can be used to duplicate Postfix virtual table entries into the alias domain. To revert to the default mode, use the --alias-catchall flag.\nIf supported by your mail server and if the domain has a non-default IP address, the --outgoing-ip flag can be used to have email sent by addresses in the domain use its own IP address for outgoing SMTP connections. This can be useful for separating virtual servers from each other from the point of view of other mail servers. To disable this mode, use the --no-outgoing-ip flag.\nTo enable the Thunderbird or Outlook auto-configuration URL for this domain, use the --autoconfig flag. This allows email clients to find the SMTP and IMAP username, hostname, port and protocol just based on an email address. To turn this feature off, use the --no-autoconfig flag.\nIf DKIM is enabled on the system, by default all virtual servers share the same key for signing outgoing email. However, the --dkim-key flag followed by a path contained a PEM-format key can be used to select an alternate custom key for this domain. Alternately you can revert to the default key with the --default-dkim-key flag, or generate a new random key with the --generate-dkim-key flag.\nTo use a cloud mail filter, specify the --cloud-mail-filter flag followed by the name of a provider. This will update the MX records for the domain to point to that provider\u0026rsquo;s filtering servers (which you typically must sign up for in advance). For some providers Virtualmin also needs to know a customer ID (used in the MX records), which is set with the --cloud-mail-filter-id flag. To revert to using only the local mail server, set the --no-cloud-mail-filter flag.\nIn Virtualmin Pro, to use a cloud SMTP provider, specify the --cloud-smtp flag followed by a provider name like ses. The selected provider must have already been configured in the Virtualmin user interface. To revert to direct email delivery, use the --no-cloud-smtp flag.\nCommand line help virtualmin modify-mail --domain name | --user name | --all-domains [--sender-bcc user@domain] | [--no-sender-bcc] [--recipient-bcc user@domain] | [--no-recipient-bcc] [--alias-copy] | [--alias-catchall] [--outgoing-ip | --no-outgoing-ip] [--autoconfig | --no-autoconfig] [--dkim-key file | --default-dkim-key | --generate-dkim-key] [--cloud-mail-filter name | --no-cloud-mail-filter] [--cloud-mail-filter-id number] [--cloud-smtp name | --no-cloud-smtp] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-mail/","summary":"\u003ch3 id=\"change-mail-related-settings-for-some-domains\"\u003eChange mail-related settings for some domains\u003c/h3\u003e\n\u003cp\u003eThis command can be used to configure BCC of outgoing email and set the alias mode for one or more virtual servers. The domains to effect are set by the \u003ccode\u003e--domain\u003c/code\u003e flag, which can occur multiple times and must be followed by a virtual server name. Or you can use \u003ccode\u003e--user\u003c/code\u003e followed by an administrator\u0026rsquo;s username to get all his domains, or \u003ccode\u003e--all-domains\u003c/code\u003e to modify all those on the system with mail enabled.\u003c/p\u003e","title":"modify-mail"},{"content":"Re-send the signup email for a domain This command re-sends the initial sign-up email to a virtual server owner. It takes only one parameter, --domain followed by a domain name.\nCommand line help virtualmin resend-email --domain domain.name ","permalink":"https://www.virtualmin.com/docs/development/api-programs/resend-email/","summary":"\u003ch3 id=\"re-send-the-signup-email-for-a-domain\"\u003eRe-send the signup email for a domain\u003c/h3\u003e\n\u003cp\u003eThis command re-sends the initial sign-up email to a virtual server owner. It takes only one parameter, \u003ccode\u003e--domain\u003c/code\u003e followed by a domain name.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin resend-email --domain domain.name\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"resend-email"},{"content":"Create a mail, FTP or database user This program adds a new user to an existing virtual server. It is typically called with parameters like :\nvirtualmin create-user --domain example.com --user john --pass password --quota 1024 --real \u0026#39;John Doe\u0026#39; This command would add a user to the server example.com named john with password password and a disk quota of 1MB. The actual POP3 and FTP username may end up as john.example, depending on whether or not domain suffix are always appended to usernames, and what suffix format is used. However, you can force use of the specified username with the --noappend flag.\nThe --ftp option can be used to give the new user an FTP login as well, though by default, a user will only be given an email account. The --noemail option turns off the default email account, which is useful for creating FTP or database-only users. The --db-only flag is used to create a database-only user, with no Unix user, email or FTP access.\nExtra email addresses for the new user can be specified with the --extra option, followed by an email address within the virtual server. This option can be given multiple times if you wish.\nThe new user can be granted access to MySQL databases associated with the virtual server with the --mysql option, which must be followed by a database name. This option can occur multiple times in order to grant access to more than one database. Unfortunately, there is no way to grant access to PostgreSQL databases.\nTo create a user who has only FTP access to the domain\u0026rsquo;s website, use the --web flag. To turn off spam checking for the new user, include --no-check-spam on the command line. To add the user to additional secondary Unix groups, the --group flag followed by a group name can be given multiple times.\nFor more control over the user\u0026rsquo;s login abilities (FTP, SSH or email only), use the --shell parameter followed by a full path to a Unix shell, such as /bin/false. Available shells can be displayed using the list-available-shells command.\nIf you only have a pre-encrypted password that you want the new user to use, the --encpass flag can be used to set it instead of --pass. However, this will prevent Virtualmin from enabling MySQL/MariaDB access for the user, as it needs to know the plaintext password to re-hash it for MySQL.\nAll mail users can have a password recovery address set, used by the forgotten password feature in Virtualmin. For new users, this can be set with the --recovery flag followed by an address.\nCommand line help virtualmin create-user --domain domain.name --user new-username --pass \u0026#34;password-for-new-user\u0026#34; | --encpass encrypted-password | --random-pass | --passfile password-file [--quota quota-in-blocks|\u0026#34;UNLIMITED\u0026#34;] [--real real-name-for-new-user] [--ftp] [--shell /path/to/shell] [--noemail] [--extra email.address@some.domain] [--recovery address@offsite.com] [--mysql db]* [--group name]* [--web] [--no-check-spam] [--no-creation-mail] [--home directory] [--noappend] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/create-user/","summary":"\u003ch3 id=\"create-a-mail-ftp-or-database-user\"\u003eCreate a mail, FTP or database user\u003c/h3\u003e\n\u003cp\u003eThis program adds a new user to an existing virtual server. It is typically called with parameters like :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin create-user --domain example.com --user john --pass password --quota 1024 --real \u0026#39;John Doe\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis command would add a user to the server \u003ccode\u003eexample.com\u003c/code\u003e named \u003ccode\u003ejohn\u003c/code\u003e with password \u003ccode\u003epassword\u003c/code\u003e and a disk quota of 1MB. The actual POP3 and FTP username may end up as \u003ccode\u003ejohn.example\u003c/code\u003e, depending on whether or not domain suffix are always appended to usernames, and what suffix format is used. However, you can force use of the specified username with the \u003ccode\u003e--noappend\u003c/code\u003e flag.\u003c/p\u003e","title":"create-user"},{"content":"Delete a mail, FTP or database user This command deletes one mail, FTP or database user from a virtual server, along with him home directory. It takes only two parameters, both mandatory, as --domain followed by the domain name, and --user followed by the full or short username. Be careful with this program, as it does not prompt for confirmation before deleting.\nCommand line help virtualmin delete-user --domain domain.name --user username ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-user/","summary":"\u003ch3 id=\"delete-a-mail-ftp-or-database-user\"\u003eDelete a mail, FTP or database user\u003c/h3\u003e\n\u003cp\u003eThis command deletes one mail, FTP or database user from a virtual server, along with him home directory. It takes only two parameters, both mandatory, as \u003ccode\u003e--domain\u003c/code\u003e followed by the domain name, and \u003ccode\u003e--user\u003c/code\u003e followed by the full or short username. Be careful with this program, as it does not prompt for confirmation before deleting.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin delete-user --domain domain.name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                       --user username\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"delete-user"},{"content":"Changes the MySQL/MariaDB or PostgreSQL login for some domain This command changes the username that a domain\u0026rsquo;s administrator uses to login to MySQL/MariaDB or PostgreSQL. The domain is selected with the --domain flag, the database type with --type and the new login is set with the --user flag.\nBecause this operation will rename the actual MySQL/MariaDB or PostgreSQL user, any application or scripts in the virtual server\u0026rsquo;s directory that have the database login in their configuration files will be broken until those configurations are updated with the new username.\nCommand line help virtualmin modify-database-user --domain name --type mysql|postgres --user new-name ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-database-user/","summary":"\u003ch3 id=\"changes-the-mysqlmariadb-or-postgresql-login-for-some-domain\"\u003eChanges the MySQL/MariaDB or PostgreSQL login for some domain\u003c/h3\u003e\n\u003cp\u003eThis command changes the username that a domain\u0026rsquo;s administrator uses to login to MySQL/MariaDB or PostgreSQL. The domain is selected with the \u003ccode\u003e--domain\u003c/code\u003e flag, the database type with \u003ccode\u003e--type\u003c/code\u003e and the new login is set with the \u003ccode\u003e--user\u003c/code\u003e flag.\u003c/p\u003e\n\u003cp\u003eBecause this operation will rename the actual MySQL/MariaDB or PostgreSQL user, any application or scripts in the virtual server\u0026rsquo;s directory that have the database login in their configuration files will be broken until those configurations are updated with the new username.\u003c/p\u003e","title":"modify-database-user"},{"content":"Change attributes of a mail, FTP or database user After a user has been created from the command line or web interface, you can use this program to modify or rename him. The virtual server and user to change must be specified with the --domain and --user parameters, which are followed by the server domain name and username respectively.\nTo change the user\u0026rsquo;s password, use the --pass parameter followed by the new password. To modify his real name, use the --real option followed by the new name (which must typically be quoted, in case it contains a space). If you want to change the user\u0026rsquo;s login name, use the --newuser option, followed by the new short username (without a suffix).\nA user can be temporarily disabled with the --disable option, or re-enabled with the --enable option. This will not effect his files or password, but will prevent FTP, IMAP and other logins.\nTo set the user\u0026rsquo;s disk quota, the --quota option must be used, followed by the disk quota in 1 kB blocks. An unlimited quota can be set with the parameters --quota UNLIMITED instead (although of course the user will still be limited by total server quotas).\nA user can be granted or denied FTP access with the --enable-ftp and --disable-ftp options respectively. Similarly, his primary email address can be turned on or off with the --enable-email and --disable-email options.\nExtra email addresses can be added and removed with the --add-email and --remove-email options. Both of these must be followed by an address to add or remove, and both can occur multiple times on the command line.\nAccess to MySQL/MariaDB databases in the domain can be granted with the --add-mysql flag, followed by a database name. Similarly, access can be removed with the --remove-mysql flag.\nTo turn off spam checking for the user, the --no-check-spam flag can be given. This is useful for mailboxes that are supposed to receive all the spam for some domain. To turn spam filtering back on, use the --check-spam command-line flag.\nThe user can also be added to secondary Unix groups with the --add-group flag, followed by a group name. To remove him from a group, use the --del-group parameter followed by the group to take him out of.\nTo add a forwarding email address for this user, use the --add-forward flag followed by an address or username. Conversely, to remove one use the --del-forward flag.\nTo turn off local email delivery for the user, use the --no-local flag. To turn it back on again, use --local.\nTo setup an auto-reply message, use the --autoreply flag followed by the message content. To turn off the auto-responder, use the --no-autoreply parameter.\nTo control when the auto-reply is sent, use the --autoreply-start flag followed by a date in YYYY-MM-DD format, like 2023-01-23. To set the date on which is stops being sent, use the --autoreply-end flag. To limit the rate of replies to the same address, use the --autoreply-period flag followed by a number in minutes.\nAll mail users can have a password recovery address set, used by the forgotten password feature in Virtualmin. This can be set with the --recovery flag followed by an address, or cleared with the --no-recovery flag.\nCommand line help virtualmin modify-user --domain domain.name --user username [--pass \u0026#34;new-password\u0026#34; | --passfile password-file] [--disable | --enable] [--real real-name] [--quota quota-in-blocks] [--add-mysql database] [--remove-mysql database] [--enable-email] [--disable-email] [--add-email address] [--remove-email address] [--recovery address@offsite.domain | --no-recovery] [--newuser new-username] [--enable-ftp] [--disable-ftp] [--add-group group]* [--del-group group]* [--send-update-email] [--no-check-spam | --check-spam] [--add-forward address]* [--del-forward address]* [--local | --no-local] [--autoreply \u0026#34;messsage\u0026#34; | --no-autoreply] [--autoreply-start time | --no-autoreply-start] [--autoreply-end time | --no-autoreply-end] [--autoreply-period secs | --no-autoreply-period] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-user/","summary":"\u003ch3 id=\"change-attributes-of-a-mail-ftp-or-database-user\"\u003eChange attributes of a mail, FTP or database user\u003c/h3\u003e\n\u003cp\u003eAfter a user has been created from the command line or web interface, you can use this program to modify or rename him. The virtual server and user to change must be specified with the \u003ccode\u003e--domain\u003c/code\u003e and \u003ccode\u003e--user\u003c/code\u003e parameters, which are followed by the server domain name and username respectively.\u003c/p\u003e\n\u003cp\u003eTo change the user\u0026rsquo;s password, use the \u003ccode\u003e--pass\u003c/code\u003e parameter followed by the new password. To modify his real name, use the \u003ccode\u003e--real\u003c/code\u003e option followed by the new name (which must typically be quoted, in case it contains a space). If you want to change the user\u0026rsquo;s login name, use the \u003ccode\u003e--newuser\u003c/code\u003e option, followed by the new short username (without a suffix).\u003c/p\u003e","title":"modify-user"},{"content":"Add a user to some protected directory This command adds a user to a protected directory, identified by the --domain and --path flags. The login for the new user must be set with --user, and the initial password with the --pass flag (or --encpass if you have a pre-hashed password in the right format). To create a user that is initially blocked from logging in, use the --disabled flag.\nCommand line help virtualmin create-protected-user --domain name --path directory --user username [--pass password | --encpass hash] [--enabled | --disabled] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/create-protected-user/","summary":"\u003ch3 id=\"add-a-user-to-some-protected-directory\"\u003eAdd a user to some protected directory\u003c/h3\u003e\n\u003cp\u003eThis command adds a user to a protected directory, identified by the \u003ccode\u003e--domain\u003c/code\u003e and \u003ccode\u003e--path\u003c/code\u003e flags. The login for the new user must be set with \u003ccode\u003e--user\u003c/code\u003e, and the initial password with the \u003ccode\u003e--pass\u003c/code\u003e flag (or \u003ccode\u003e--encpass\u003c/code\u003e if you have a pre-hashed password in the right format). To create a user that is initially blocked from logging in, use the \u003ccode\u003e--disabled\u003c/code\u003e flag.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin create-protected-user --domain name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                 --path directory\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                 --user username\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                [--pass password | --encpass hash]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                [--enabled | --disabled]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"create-protected-user"},{"content":"Removes a user from some protected directory This command removes a user from a protected directory, identified by the --domain and --path flags. The user to delete must be selected with the --user flag.\nCommand line help virtualmin delete-protected-user --domain name --path directory --user username ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-protected-user/","summary":"\u003ch3 id=\"removes-a-user-from-some-protected-directory\"\u003eRemoves a user from some protected directory\u003c/h3\u003e\n\u003cp\u003eThis command removes a user from a protected directory, identified by the \u003ccode\u003e--domain\u003c/code\u003e and \u003ccode\u003e--path\u003c/code\u003e flags. The user to delete must be selected with the \u003ccode\u003e--user\u003c/code\u003e flag.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin delete-protected-user --domain name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                 --path directory\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                 --user username\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"delete-protected-user"},{"content":"List users in a virtual server To get a list of users associated with some virtual server, this program can be used. You should typically supply the --domain parameter, which must be followed by the domain name of the server to list users for. This can be given several times, to display users from more than one domain. Or use --all-domains to list users from all virtual servers on the system. Finally, users from domains owned by a particular user can be listed with the --domain-user flag, which must be followed by an administrator\u0026rsquo;s username.\nBy default, it will output a reader-friendly table of users, but you can use the --multiline option to show more detail in a format that is suitable for reading by other programs. To just show the usernames, use the --name-only flag. Or to list all email addresses for all users, use the --email-only flag.\nWhen in multiline mode, any email forwarding destinations setup for the user will be listed in the internal mail server format. To get a more friendly output that includes the contents of auto-reply messages, use the --simple-aliases flag.\nBy default the server owner is not included in the list of users, but if you add the --include-owner command line option, he will be. Also by default the size of each user\u0026rsquo;s mail file is now shown in the multiline mode output, as computing it can be disk-intensive. To display the mail file/directory size, add the --mail-size flag.\nTo limit the display to just one user in the domain, add the --user parameter to the command line, followed by a full or short username.\nCommand line help virtualmin list-users --all-domains | --domain name | --domain-user username [--multiline | --name-only | --email-only] [--include-owner] [--user name] [--simple-aliases] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-users/","summary":"\u003ch3 id=\"list-users-in-a-virtual-server\"\u003eList users in a virtual server\u003c/h3\u003e\n\u003cp\u003eTo get a list of users associated with some virtual server, this program can be used. You should typically supply the \u003ccode\u003e--domain\u003c/code\u003e parameter, which must be followed by the domain name of the server to list users for. This can be given several times, to display users from more than one domain. Or use \u003ccode\u003e--all-domains\u003c/code\u003e to list users from all virtual servers on the system. Finally, users from domains owned by a particular user can be listed with the \u003ccode\u003e--domain-user\u003c/code\u003e flag, which must be followed by an administrator\u0026rsquo;s username.\u003c/p\u003e","title":"list-users"},{"content":"Modify attributes of some or all users for some or all virtual servers This command can be used to mass update attributes of all users --all-users in all existing virtual servers --all-domains in one shot.\nThis command essentially acts as a wrapper for the virtualmin modify-user subprogram. For more details, please check its help documentation.\nFor example, to enable email for all users in all domains, run:\nvirtualmin modify-users --all-domains --all-users --enable-email To disable email for all users in the given domain, run:\nvirtualmin modify-users --domain example.com --all-users --disable-email To modify quota for all joe users in all domains, run:\nvirtualmin modify-users --all-domains --user joe --quota UNLIMITED Command line help virtualmin modify-users --all-domains | --domain name --all-users | --user name [--pass \u0026#34;new-password\u0026#34; | --passfile password-file] [--disable | --enable] [--real real-name] [--quota quota-in-blocks] [--add-mysql database] [--remove-mysql database] [--enable-email] [--disable-email] [--add-email address] [--remove-email address] [--recovery address@offsite.domain | --no-recovery] [--newuser new-username] [--enable-ftp] [--disable-ftp] [--add-group group]* [--del-group group]* [--send-update-email] [--no-check-spam | --check-spam] [--add-forward address]* [--del-forward address]* [--local | --no-local] [--autoreply \u0026#34;messsage\u0026#34; | --no-autoreply] [--autoreply-start time | --no-autoreply-start] [--autoreply-end time | --no-autoreply-end] [--autoreply-period secs | --no-autoreply-period] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-users/","summary":"\u003ch3 id=\"modify-attributes-of-some-or-all-users-for-some-or-all-virtual-servers\"\u003eModify attributes of some or all users for some or all virtual servers\u003c/h3\u003e\n\u003cp\u003eThis command can be used to mass update attributes of all users \u003ccode\u003e--all-users\u003c/code\u003e in all existing virtual servers \u003ccode\u003e--all-domains\u003c/code\u003e in one shot.\u003c/p\u003e\n\u003cp\u003eThis command essentially acts as a wrapper for the \u003ccode\u003evirtualmin modify-user\u003c/code\u003e subprogram. For more details, please check its help documentation.\u003c/p\u003e\n\u003cp\u003eFor example, to enable email for all users in all domains, run:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin modify-users --all-domains --all-users --enable-email\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTo disable email for all users in the given domain, run:\u003c/p\u003e","title":"modify-users"},{"content":"Lists users in some protected directory This command outputs a table of all users with access to some protected directory, identified by the --domain and --path flags. You an also switch to a more easily parsed format with the --multiline flag, or get just a list of usernames with the --name-only flag.\nCommand line help virtualmin list-protected-users --domain name --path directory [--multiline | --name-only] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-protected-users/","summary":"\u003ch3 id=\"lists-users-in-some-protected-directory\"\u003eLists users in some protected directory\u003c/h3\u003e\n\u003cp\u003eThis command outputs a table of all users with access to some protected directory, identified by the \u003ccode\u003e--domain\u003c/code\u003e and \u003ccode\u003e--path\u003c/code\u003e flags. You an also switch to a more easily parsed format with the \u003ccode\u003e--multiline\u003c/code\u003e flag, or get just a list of usernames with the \u003ccode\u003e--name-only\u003c/code\u003e flag.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin list-protected-users --domain name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                --path directory\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                               [--multiline | --name-only]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"list-protected-users"},{"content":"List all shells for use with domain owners and mailboxes When run with no flags, this command outputs a table of shells for use by domain owners and mailbox users. To limit it to just domain owners, the --owner flag can be given. Or to show only shells designated for use by mailboxes, add --mailbox to the command line.\nTo get a more parsable format with full details for each shell, use the --multiline parameter. Or to only output shell paths, use --name-only.\nCommand line help virtualmin list-available-shells [--multiline | --name-only] [--owner | --mailbox | --reseller] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-available-shells/","summary":"\u003ch3 id=\"list-all-shells-for-use-with-domain-owners-and-mailboxes\"\u003eList all shells for use with domain owners and mailboxes\u003c/h3\u003e\n\u003cp\u003eWhen run with no flags, this command outputs a table of shells for use by domain owners and mailbox users. To limit it to just domain owners, the \u003ccode\u003e--owner\u003c/code\u003e flag can be given. Or to show only shells designated for use by mailboxes, add \u003ccode\u003e--mailbox\u003c/code\u003e to the command line.\u003c/p\u003e\n\u003cp\u003eTo get a more parsable format with full details for each shell, use the \u003ccode\u003e--multiline\u003c/code\u003e parameter. Or to only output shell paths, use \u003ccode\u003e--name-only\u003c/code\u003e.\u003c/p\u003e","title":"list-available-shells"},{"content":"Dump inbox email for one user This program is primarily for debugging and testing. It finds the email inbox for the user in the virtual server identified by the --domain flag whose login is set with the --user parameter, and outputs the contents in mbox format. Alternately you can use the --filesonly flag to just have it print all the files containing the user\u0026rsquo;s mail (typically just one if the system using mbox format, or many if Maildir is in use).\nBy default the user\u0026rsquo;s inbox is listed, however you can select any folder owned by the user with the --folder flag followed by either a path or a unique folder ID.\nCommand line help virtualmin list-mailbox --domain domain.name --user name [--folder name|path] [--filesonly] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-mailbox/","summary":"\u003ch3 id=\"dump-inbox-email-for-one-user\"\u003eDump inbox email for one user\u003c/h3\u003e\n\u003cp\u003eThis program is primarily for debugging and testing. It finds the email inbox for the user in the virtual server identified by the \u003ccode\u003e--domain\u003c/code\u003e flag whose login is set with the \u003ccode\u003e--user\u003c/code\u003e parameter, and outputs the contents in \u003ccode\u003embox\u003c/code\u003e format. Alternately you can use the \u003ccode\u003e--filesonly\u003c/code\u003e flag to just have it print all the files containing the user\u0026rsquo;s mail (typically just one if the system using \u003ccode\u003embox\u003c/code\u003e format, or many if \u003ccode\u003eMaildir\u003c/code\u003e is in use).\u003c/p\u003e","title":"list-mailbox"},{"content":"Create a new mail alias This command can be used to add a new email alias to a virtual server. It takes three mandatory parameters as --domain followed by the domain name, --from followed by the name of the alias within that domain, and --to followed by a destination address. For example, to create an alias for sales@example.com that delivers mail to the user joe, you could run:\nvirtualmin create-alias --domain example.com --from sales --to joe@example.com The --to option can be given multiple times, to create more than one destination for the alias. To create an alias for all addresses in the domain that are not matched by another alias or mail user, use the option --from \u0026quot;*\u0026quot;.\nAliases can have short descriptions associated with them, to explain what the alias is for. To set one when creating, you can use the --desc option followed by a one-line description.\nTo more easily create aliases with auto-responders, you should use the create-simple-alias command, which is analogous to the simple alias creation form in Virtualmin user interface.\nCommand line help virtualmin create-alias --domain domain.name --from mailbox|\u0026#34;*\u0026#34; \u0026lt;--to address\u0026gt;+ [--desc \u0026#34;Comment text\u0026#34;] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/create-alias/","summary":"\u003ch3 id=\"create-a-new-mail-alias\"\u003eCreate a new mail alias\u003c/h3\u003e\n\u003cp\u003eThis command can be used to add a new email alias to a virtual server. It takes three mandatory parameters as \u003ccode\u003e--domain\u003c/code\u003e followed by the domain name, \u003ccode\u003e--from\u003c/code\u003e followed by the name of the alias within that domain, and \u003ccode\u003e--to\u003c/code\u003e followed by a destination address. For example, to create an alias for \u003ccode\u003esales@example.com\u003c/code\u003e that delivers mail to the user \u003ccode\u003ejoe\u003c/code\u003e, you could run:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin create-alias --domain example.com --from sales --to joe@example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe \u003ccode\u003e--to\u003c/code\u003e option can be given multiple times, to create more than one destination for the alias. To create an alias for all addresses in the domain that are not matched by another alias or mail user, use the option \u003ccode\u003e--from \u0026quot;*\u0026quot;\u003c/code\u003e.\u003c/p\u003e","title":"create-alias"},{"content":"Adds a mail alias to some domain, with simple parameters This command allows aliases using auto-responders or other more complex destination types to be created more easily. You must supply at least the --domain and --from parameters, followed by a domain name and alias name (without the @ sign) respectively. The optional --desc parameter can be used to set a comment or description for the alias. To create an alias that matches all email in the domain, use the option --from \u0026quot;*\u0026quot;.\nTo just forward email to some other address, the --forward parameter can be used. It can be given multiple times, and each instance must be followed by an email address.\nTo deliver directly to the inbox of some user (bypassing other forwarding), use the --local parameter, followed by a full username like user.example.\nTo bounce mail back to the sender, use the --bounce flag. This is useful if you have a catchall address setup for the domain.\nTo setup an auto-responder, use the --autoreply parameter followed by the text of the automatic reply message. The from address for automatic replies can be set with the optional (but highly recommended) --autoreply-from flag, and the interval in hours between replies to the same address with the --autoreply-period flag.\nFor example:\nvirtualmin create-simple-alias --domain example.com --from user --autoreply `Gone fishing\u0026#34; --autoreply-from user@example.com --autoreply-period 24 Command line help virtualmin create-simple-alias --domain domain.name --from mailbox|\u0026#34;*\u0026#34; [--forward user@domain]* [--local local-user] [--bounce] [--everyone] [--autoreply \u0026#34;some message\u0026#34;] [--autoreply-period hours] [--autoreply-from user@domain] [--desc \u0026#34;Comment text\u0026#34;] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/create-simple-alias/","summary":"\u003ch3 id=\"adds-a-mail-alias-to-some-domain-with-simple-parameters\"\u003eAdds a mail alias to some domain, with simple parameters\u003c/h3\u003e\n\u003cp\u003eThis command allows aliases using auto-responders or other more complex destination types to be created more easily. You must supply at least the \u003ccode\u003e--domain\u003c/code\u003e and \u003ccode\u003e--from\u003c/code\u003e parameters, followed by a domain name and alias name (without the \u003ccode\u003e@\u003c/code\u003e sign) respectively. The optional \u003ccode\u003e--desc\u003c/code\u003e parameter can be used to set a comment or description for the alias. To create an alias that matches all email in the domain, use the option \u003ccode\u003e--from \u0026quot;*\u0026quot;\u003c/code\u003e.\u003c/p\u003e","title":"create-simple-alias"},{"content":"Delete a mail alias This program simply removes a single mail alias from a virtual server. It takes only two parameters, --domain to specify the server domain name, and --from to specify the part of the alias before the @ sign. Be careful using it, as it does not prompt for confirmation before deleting. To delete the catch-all alias for a domain, use the option --from \u0026quot;*\u0026quot;.\nNo program exists for updating existing aliases, but the same thing can be achieved by using the delete-alias and create-alias commands to remove and re-create an alias with new settings.\nCommand line help virtualmin delete-alias --domain domain.name --from mailbox|\u0026#34;*\u0026#34; ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-alias/","summary":"\u003ch3 id=\"delete-a-mail-alias\"\u003eDelete a mail alias\u003c/h3\u003e\n\u003cp\u003eThis program simply removes a single mail alias from a virtual server. It takes only two parameters, \u003ccode\u003e--domain\u003c/code\u003e to specify the server domain name, and \u003ccode\u003e--from\u003c/code\u003e to specify the part of the alias before the \u003ccode\u003e@\u003c/code\u003e sign. Be careful using it, as it does not prompt for confirmation before deleting. To delete the catch-all alias for a domain, use the option \u003ccode\u003e--from \u0026quot;*\u0026quot;\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eNo program exists for updating existing aliases, but the same thing can be achieved by using the \u003ccode\u003edelete-alias\u003c/code\u003e and \u003ccode\u003ecreate-alias\u003c/code\u003e commands to remove and re-create an alias with new settings.\u003c/p\u003e","title":"delete-alias"},{"content":"List aliases for a virtual server This program displays a list of mail aliases that exist in the virtual server specified by the --domain command line option. This may be given multiple times to select more than one domain, or you can have aliases in all virtual servers output using the --all-domains flag. To output aliases in all domains owned by some administrator the --user parameter can be given, followed by a Virtualmin username.\nTo get more details about each alias, use the --multiline flag, which switches the output to a format more easily parsed by other programs. To just list the alias names, use the --name-only parameter. To list full email addresses, use the --email-only flag.\nIn the regular table-format output mode, if an alias has an associated description and multiline mode is enabled, it will be displayed after the alias\u0026rsquo;s from address, separated by a # character.\nSome aliases managed by Virtualmin are not created by users directly, but are instead created as part of some other process, such as the addition of a mailing list. Such aliases are not displayed by default, as editing them can cause problems with the associated mailing list. To include these aliases in the list produced by list-aliases, use the --plugins command line flag.\nCommand line help virtualmin list-aliases --all-domains | --domain name | --user username [--multiline | --name-only | --email-only] [--plugins] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-aliases/","summary":"\u003ch3 id=\"list-aliases-for-a-virtual-server\"\u003eList aliases for a virtual server\u003c/h3\u003e\n\u003cp\u003eThis program displays a list of mail aliases that exist in the virtual server specified by the \u003ccode\u003e--domain\u003c/code\u003e command line option. This may be given multiple times to select more than one domain, or you can have aliases in all virtual servers output using the \u003ccode\u003e--all-domains\u003c/code\u003e flag. To output aliases in all domains owned by some administrator the \u003ccode\u003e--user\u003c/code\u003e parameter can be given, followed by a Virtualmin username.\u003c/p\u003e","title":"list-aliases"},{"content":"Lists mail aliases in a simple format for some domain This program is similar to list-aliases, and takes all the same command-line parameters. However, it simplifies the display of aliases using auto-responders to show the reply content, instead of just the path to the auto-reply file.\nCommand line help virtualmin list-simple-aliases --all-domains | --domain name | --user username [--multiline] [--plugins] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-simple-aliases/","summary":"\u003ch3 id=\"lists-mail-aliases-in-a-simple-format-for-some-domain\"\u003eLists mail aliases in a simple format for some domain\u003c/h3\u003e\n\u003cp\u003eThis program is similar to \u003ccode\u003elist-aliases\u003c/code\u003e, and takes all the same command-line parameters. However, it simplifies the display of aliases using auto-responders to show the reply content, instead of just the path to the auto-reply file.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin list-simple-aliases --all-domains | --domain name | --user username\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                              [--multiline]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                              [--plugins]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"list-simple-aliases"},{"content":"Removes access to some feature or edit capability for some virtual servers This command can be used to deny the owner of some or all virtual servers access to some functions in the Virtualmin user interface. The domains that it applies to can be selected with the --domain flag, which can be given multiple times, or with --all-domains.\nTo prevent owners of matching domains from enabling or disabling some feature, use the feature code as a flag, such as --ssl or --virtualmin-awstats. To take away access to some capability, use flags like --cannot-edit-users or --cannot-edit-dbs.\nCommand line help virtualmin disable-limit --domain name | --all-domains [--dbname] [--unix] [--dir] [--dns] [--mail] [--web] [--ssl] [--logrotate] [--mysql] [--spam] [--status] [--webmin] [--virtualmin-awstats] [--cannot-edit-domain] [--cannot-edit-users] [--cannot-edit-aliases] [--cannot-edit-dbs] [--cannot-edit-scripts] [--cannot-edit-ip] [--cannot-edit-dnsip] [--cannot-edit-ssl] [--cannot-edit-forward] [--cannot-edit-redirect] [--cannot-edit-admins] [--cannot-edit-spam] [--cannot-edit-phpver] [--cannot-edit-phpmode] [--cannot-edit-mail] [--cannot-edit-backup] [--cannot-edit-sched] [--cannot-edit-restore] [--cannot-edit-sharedips] [--cannot-edit-catchall] [--cannot-edit-html] [--cannot-edit-allowedhosts] [--cannot-edit-passwd] [--cannot-edit-spf] [--cannot-edit-records] [--cannot-edit-disable] [--cannot-edit-delete] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/disable-limit/","summary":"\u003ch3 id=\"removes-access-to-some-feature-or-edit-capability-for-some-virtual-servers\"\u003eRemoves access to some feature or edit capability for some virtual servers\u003c/h3\u003e\n\u003cp\u003eThis command can be used to deny the owner of some or all virtual servers access to some functions in the Virtualmin user interface. The domains that it applies to can be selected with the \u003ccode\u003e--domain\u003c/code\u003e flag, which can be given multiple times, or with \u003ccode\u003e--all-domains\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eTo prevent owners of matching domains from enabling or disabling some feature, use the feature code as a flag, such as \u003ccode\u003e--ssl\u003c/code\u003e or \u003ccode\u003e--virtualmin-awstats\u003c/code\u003e. To take away access to some capability, use flags like \u003ccode\u003e--cannot-edit-users\u003c/code\u003e or \u003ccode\u003e--cannot-edit-dbs\u003c/code\u003e.\u003c/p\u003e","title":"disable-limit"},{"content":"Grants access to some feature or edit capability for some virtual servers This command can be used to grant the owner of some or all virtual servers access to some functions in the Virtualmin user interface. The domains that it applies to can be selected with the --domain flag, which can be given multiple times, or with --all-domains.\nTo allow owners of matching domains to enable or disable some feature, use the feature code as a flag, such as --ssl or --virtualmin-awstats. To grant access to some capability, use flags like --can-edit-users or --can-edit-dbs.\nCommand line help virtualmin enable-limit --domain name | --all-domains [--dbname] [--unix] [--dir] [--dns] [--mail] [--web] [--ssl] [--logrotate] [--mysql] [--spam] [--status] [--webmin] [--virtualmin-awstats] [--can-edit-domain] [--can-edit-users] [--can-edit-aliases] [--can-edit-dbs] [--can-edit-scripts] [--can-edit-ip] [--can-edit-dnsip] [--can-edit-ssl] [--can-edit-forward] [--can-edit-redirect] [--can-edit-admins] [--can-edit-spam] [--can-edit-phpver] [--can-edit-phpmode] [--can-edit-mail] [--can-edit-backup] [--can-edit-sched] [--can-edit-restore] [--can-edit-sharedips] [--can-edit-catchall] [--can-edit-html] [--can-edit-allowedhosts] [--can-edit-passwd] [--can-edit-spf] [--can-edit-records] [--can-edit-disable] [--can-edit-delete] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/enable-limit/","summary":"\u003ch3 id=\"grants-access-to-some-feature-or-edit-capability-for-some-virtual-servers\"\u003eGrants access to some feature or edit capability for some virtual servers\u003c/h3\u003e\n\u003cp\u003eThis command can be used to grant the owner of some or all virtual servers access to some functions in the Virtualmin user interface. The domains that it applies to can be selected with the \u003ccode\u003e--domain\u003c/code\u003e flag, which can be given multiple times, or with \u003ccode\u003e--all-domains\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eTo allow owners of matching domains to enable or disable some feature, use the feature code as a flag, such as \u003ccode\u003e--ssl\u003c/code\u003e or \u003ccode\u003e--virtualmin-awstats\u003c/code\u003e. To grant access to some capability, use flags like \u003ccode\u003e--can-edit-users\u003c/code\u003e or \u003ccode\u003e--can-edit-dbs\u003c/code\u003e.\u003c/p\u003e","title":"enable-limit"},{"content":"Changes the owner limits for some virtual server This command allows you to change various limits that apply to the owner of a virtual server when they are logged into the web interface. The domain to effect is selected with the --domain or --user flag, which must be followed by a top-level domain name or administrator\u0026rsquo;s username respectively.\nTo grant the domain owner access to some Virtualmin feature, such as mysql or webalizer, use the --allow flag followed by the feature code. To prevent access, use --disallow instead. Both flags can be given multiple times.\nTo change the number of domains that can be created, use the --max-doms flag followed by a number or the word UNLIMITED. To prevent him from creating domains at all, use --max-doms NONE. Separate limits can be imposed on the number of alias and non-alias domains with the --max-aliasdoms and --max-realdoms flags.\nLimits on the numbers of databases, mailboxes and mail aliases that can be created are set with the --max-dbs, --max-mailboxes and --max-aliases flags respectively. Each must be followed either with a number, or the word UNLIMITED.\nTo grant the domain owner access to Virtualmin user interface capabilities such as editing aliases or users, the --can-edit flag should be used, followed by a capability code. Supported codes and their meanings are:\ndomain - Edit Virtual server details such as the description and password\nusers - Manage mail / FTP users\naliases - Manage email aliases\ndbs - Manage databases\nscripts - List and install web apps\nip - Change the IP address of virtual servers\ndnsip - Change the externally visible (DNS) IP address of virtual servers\nssl - Generate and upload SSL certificates\nforward - Setup proxying and frame forwarding\nredirect - Create and edit website aliases and redirects\nadmins - Manage extra administrators\nspam - Edit spam filtering, delivery and clearing settings\nphpver - Change PHP versions\nphpmode - Change website options and PHP execution mode\nmail - Edit email-related settings\nbackup - Backup virtual servers\nsched - Schedule automatic backups\nrestore - Restore virtual servers (databases and home directories only)\nsharedips - Move to different shared IP addresses\ncatchall - Create catchall email aliases\nhtml - Use the HTML editor\nallowedhosts - Can edit the remote IPs allowed access to MySQL\npasswd - Can change a virtual server\u0026rsquo;s password\nspf - Can edit the DNS sender permitted from record\nrecords - Can edit other DNS records\ndisable - Disable virtual servers\ndelete - Delete virtual servers\nAccess to capabilities can also be taken away with the --cannot-edit flag.\nTo restrict the virtual server owner to only installing certain web apps, you can use the --scripts flag followed by a quoted list of app codes. To grant access to all web app installers, use the --all-scripts flag instead.\nCommand line help virtualmin modify-limits --domain domain.name | --user name [--max-doms max|UNLIMITED|NONE] [--max-aliasdoms max|UNLIMITED] [--max-realdoms max|UNLIMITED] [--max-mailboxes max|UNLIMITED] [--max-dbs max|UNLIMITED] [--max-aliases max|UNLIMITED] [--can-dbname] | [--cannot-dbname] [--can-rename] | [--cannot-rename] [--can-migrate] | [--cannot-migrate] [--force-under] | [--noforce-under] [--safe-under] | [--nosafe-under] [--ipfollow] | [--noipfollow] [--read-only] | [--read-write] [--allow feature]* [--disallow feature]* [--can-edit capability]* [--cannot-edit capability]* [--shell nologin|ftp|ssh] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-limits/","summary":"\u003ch3 id=\"changes-the-owner-limits-for-some-virtual-server\"\u003eChanges the owner limits for some virtual server\u003c/h3\u003e\n\u003cp\u003eThis command allows you to change various limits that apply to the owner of a virtual server when they are logged into the web interface. The domain to effect is selected with the \u003ccode\u003e--domain\u003c/code\u003e or \u003ccode\u003e--user\u003c/code\u003e flag, which must be followed by a top-level domain name or administrator\u0026rsquo;s username respectively.\u003c/p\u003e\n\u003cp\u003eTo grant the domain owner access to some Virtualmin feature, such as \u003ccode\u003emysql\u003c/code\u003e or \u003ccode\u003ewebalizer\u003c/code\u003e, use the \u003ccode\u003e--allow\u003c/code\u003e flag followed by the feature code. To prevent access, use \u003ccode\u003e--disallow\u003c/code\u003e instead. Both flags can be given multiple times.\u003c/p\u003e","title":"modify-limits"},{"content":"Changes resource limits for some virtual servers This program allows you to change limits on processes, memory and CPU time for one or more virtual servers. It is the equivalent of the Resource Limits page in the Virtualmin user interface.\nThe virtual servers to modify can be selected with the --domain flag, which must be followed by a top-level server name. Alternately you can use --user to select domains by administration username, or --all-domains to update every one on the system. Because limits are applied on a per-administration user basis, they apply to all sub-servers of those selected.\nLimits on the number of processes allowed can be set with the --max-procs flag followed by a process count, or remove with --no-max-procs.\nMaximum per-process run time in seconds is set with --max-time, and removed with --no-max-time.\nThe maximum memory each process can use is set the --max-mem, which must be followed by a number in bytes (of at least 1 MB), or removed with --no-max-mem.\nCommand line help virtualmin modify-resources --domain name | --user name | --all-domains [--max-procs num | --no-max-procs] [--max-mem bytes | --no-max-mem] [--max-time minutes | --no-max-time] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-resources/","summary":"\u003ch3 id=\"changes-resource-limits-for-some-virtual-servers\"\u003eChanges resource limits for some virtual servers\u003c/h3\u003e\n\u003cp\u003eThis program allows you to change limits on processes, memory and CPU time for one or more virtual servers. It is the equivalent of the \u003cstrong\u003eResource Limits\u003c/strong\u003e page in the Virtualmin user interface.\u003c/p\u003e\n\u003cp\u003eThe virtual servers to modify can be selected with the \u003ccode\u003e--domain\u003c/code\u003e flag, which must be followed by a top-level server name. Alternately you can use \u003ccode\u003e--user\u003c/code\u003e to select domains by administration username, or \u003ccode\u003e--all-domains\u003c/code\u003e to update every one on the system. Because limits are applied on a per-administration user basis, they apply to all sub-servers of those selected.\u003c/p\u003e","title":"modify-resources"},{"content":"Creates an extra administrator for a virtual server This command creates a new administrator associated with an existing virtual server. You must supply the --domain parameter to specify the server and --name to set the admin login name. The --pass and --desc options should also be given, to specify the initial password and a description for the account respectively. To specify a contact email address for the admin, use the --email flag followed by the address.\nBasic permissions for the account can be added using the --create, --rename, --features and --modules parameters. These allow the admin to create new servers, rename servers, use Webmin modules for server features, and use other Webmin modules, respectively.\nThe extra admin\u0026rsquo;s editing capabilities for virtual servers can be set using the --edit parameter, followed by a capability name, like users or aliases. This can be given multiple times, as in the command below:\nvirtualmin create-admin --domain example.com --name admin1 --pass password --desc `Extra administrator` --edit users --edit aliases That command would create an extra administrator account who can only edit mail users and mail aliases in the virtual server example.com and any sub-servers.\nBy default, the extra administrator will have access to all virtual servers owned by the top-level server it is created in. However, this can be restricted using the --allowed-domain flag followed by a domain name, to which the admin will be limited to. It can be given multiple times to allow access to more than one virtual server.\nCommand line help virtualmin create-admin --domain domain.name --name login [--pass password | --passfile password-file] [--desc description] [--email user@domain] [--create] [--rename] [--features] [--modules] [--edit capability]* [--allowed-domain domain]* ","permalink":"https://www.virtualmin.com/docs/development/api-programs/create-admin/","summary":"\u003ch3 id=\"creates-an-extra-administrator-for-a-virtual-server\"\u003eCreates an extra administrator for a virtual server\u003c/h3\u003e\n\u003cp\u003eThis command creates a new administrator associated with an existing virtual server. You must supply the \u003ccode\u003e--domain\u003c/code\u003e parameter to specify the server and \u003ccode\u003e--name\u003c/code\u003e to set the admin login name. The \u003ccode\u003e--pass\u003c/code\u003e and \u003ccode\u003e--desc\u003c/code\u003e options should also be given, to specify the initial password and a description for the account respectively. To specify a contact email address for the admin, use the \u003ccode\u003e--email\u003c/code\u003e flag followed by the address.\u003c/p\u003e","title":"create-admin"},{"content":"Deletes an extra administrator from a virtual server This command removes one extra administrator from a virtual server. The required parameters are --domain followed by the domain name, and --name followed by the administrator account name.\nCommand line help virtualmin delete-admin --domain domain.name --name login ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-admin/","summary":"\u003ch3 id=\"deletes-an-extra-administrator-from-a-virtual-server\"\u003eDeletes an extra administrator from a virtual server\u003c/h3\u003e\n\u003cp\u003eThis command removes one extra administrator from a virtual server. The required parameters are \u003ccode\u003e--domain\u003c/code\u003e followed by the domain name, and \u003ccode\u003e--name\u003c/code\u003e followed by the administrator account name.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin delete-admin --domain domain.name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        --name login\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"delete-admin"},{"content":"Updates an extra administrator for a virtual server This program can be used to change the details of an extra administrator. The required parameters are --domain followed by the domain name, and --name followed by the administrator account name, which specify the account to change.\nYou can then use the --pass parameter to set a new password, --desc to change the description, and --newname to change the login name. The admin can be allowed to denied the ability to create servers, rename domains, manage features and use other Webmin modules with the --can-create, --cannot-create, --can-rename, --cannot-rename, --can-features, --cannot-features, --can-modules and --cannot-modules options respectively.\nThe extra admin\u0026rsquo;s contact email address can be set or changed with the --email flag followed by an address, or removed with the --no-email parameter.\nEditing capabilities can be granted to the user with the --can-edit option followed by a capability name. Similarly, they can be taken away with the --cannot-edit option.\nTo add a domain to the list of those an extra administrator is allowed to manage, use the --add-domain flag followed by a domain name. If all virtual servers are currently allowed, this will restrict the extra admin to just that virtual server.\nTo remove a server from the allowed list, use the --remove-domain parameter followed by the domain name. To grant access to all virtual servers under the parent server, use the --all-domains flag.\nCommand line help virtualmin modify-admin --domain domain.name --name login [--newname login] [--pass password | --passfile password-file] [--desc description] [--email user@domain | --no-email] [--can-create] | [--cannot-create] [--can-rename] | [--cannot-rename] [--can-features] | [--cannot-features] [--can-modules] | [--cannot-modules] [--can-edit capability]* [--cannot-edit capability]* [--all-domains] [--add-domain name]* [--remove-domain name]* ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-admin/","summary":"\u003ch3 id=\"updates-an-extra-administrator-for-a-virtual-server\"\u003eUpdates an extra administrator for a virtual server\u003c/h3\u003e\n\u003cp\u003eThis program can be used to change the details of an extra administrator. The required parameters are \u003ccode\u003e--domain\u003c/code\u003e followed by the domain name, and \u003ccode\u003e--name\u003c/code\u003e followed by the administrator account name, which specify the account to change.\u003c/p\u003e\n\u003cp\u003eYou can then use the \u003ccode\u003e--pass\u003c/code\u003e parameter to set a new password, \u003ccode\u003e--desc\u003c/code\u003e to change the description, and \u003ccode\u003e--newname\u003c/code\u003e to change the login name. The admin can be allowed to denied the ability to create servers, rename domains, manage features and use other Webmin modules with the \u003ccode\u003e--can-create\u003c/code\u003e, \u003ccode\u003e--cannot-create\u003c/code\u003e, \u003ccode\u003e--can-rename\u003c/code\u003e, \u003ccode\u003e--cannot-rename\u003c/code\u003e, \u003ccode\u003e--can-features\u003c/code\u003e, \u003ccode\u003e--cannot-features\u003c/code\u003e, \u003ccode\u003e--can-modules\u003c/code\u003e and \u003ccode\u003e--cannot-modules\u003c/code\u003e options respectively.\u003c/p\u003e","title":"modify-admin"},{"content":"Lists administrators belonging to a virtual server This program simply displays a list of extra administrators associated with one virtual server. You must supply the --domain followed by the domain name of the server to list. By default the output is in a reader-friendly table, but the --multiline option can be used to switch to a format more suitable for reading by programs.\nTo get a list of just the extra admin\u0026rsquo;s usernames (for use in a script perhaps), add the --name-only command line flag.\nCommand line help virtualmin list-admins --domain domain.name [--multiline] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-admins/","summary":"\u003ch3 id=\"lists-administrators-belonging-to-a-virtual-server\"\u003eLists administrators belonging to a virtual server\u003c/h3\u003e\n\u003cp\u003eThis program simply displays a list of extra administrators associated with one virtual server. You must supply the \u003ccode\u003e--domain\u003c/code\u003e followed by the domain name of the server to list. By default the output is in a reader-friendly table, but the \u003ccode\u003e--multiline\u003c/code\u003e option can be used to switch to a format more suitable for reading by programs.\u003c/p\u003e\n\u003cp\u003eTo get a list of just the extra admin\u0026rsquo;s usernames (for use in a script perhaps), add the \u003ccode\u003e--name-only\u003c/code\u003e command line flag.\u003c/p\u003e","title":"list-admins"},{"content":"List custom fields for virtual servers When this command is run with no parameters, it will display all custom fields set for all virtual servers. The --domain parameter can be used to limit the display to a single named server, while the --names parameter will switch the display to show field codes rather than their full descriptions.\nBy default all fields are shown, but you can use the --field flag followed by a code to show just that field. To further limit the display to just values, use the --value-only flag.\nCommand line help virtualmin list-custom [--domain name]* [--names] [--field name] [--value-only] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-custom/","summary":"\u003ch3 id=\"list-custom-fields-for-virtual-servers\"\u003eList custom fields for virtual servers\u003c/h3\u003e\n\u003cp\u003eWhen this command is run with no parameters, it will display all custom fields set for all virtual servers. The \u003ccode\u003e--domain\u003c/code\u003e parameter can be used to limit the display to a single named server, while the \u003ccode\u003e--names\u003c/code\u003e parameter will switch the display to show field codes rather than their full descriptions.\u003c/p\u003e\n\u003cp\u003eBy default all fields are shown, but you can use the \u003ccode\u003e--field\u003c/code\u003e flag followed by a code to show just that field. To further limit the display to just values, use the \u003ccode\u003e--value-only\u003c/code\u003e flag.\u003c/p\u003e","title":"list-custom"},{"content":"Modify custom fields for a virtual server This program updates the value of one or more fields for a single virtual server. The parameter --domain must be given, and must be followed by the domain name of the server to update. You must also supply the --set parameter at least once, which has to be followed by the code for the field to update and the new value.\nFor menu-type custom fields, the value must be the underlying value, not the one that is displayed to the user. For yes and no fields, the value must be either 1 or 0 respectively.\nCommand line help virtualmin modify-custom --domain name \u0026lt;--set \u0026#34;field value\u0026#34;\u0026gt;+ ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-custom/","summary":"\u003ch3 id=\"modify-custom-fields-for-a-virtual-server\"\u003eModify custom fields for a virtual server\u003c/h3\u003e\n\u003cp\u003eThis program updates the value of one or more fields for a single virtual server. The parameter \u003ccode\u003e--domain\u003c/code\u003e must be given, and must be followed by the domain name of the server to update. You must also supply the \u003ccode\u003e--set\u003c/code\u003e parameter at least once, which has to be followed by the code for the field to update and the new value.\u003c/p\u003e\n\u003cp\u003eFor menu-type custom fields, the value must be the underlying value, not the one that is displayed to the user. For \u003ccode\u003eyes\u003c/code\u003e and \u003ccode\u003eno\u003c/code\u003e fields, the value must be either \u003ccode\u003e1\u003c/code\u003e or \u003ccode\u003e0\u003c/code\u003e respectively.\u003c/p\u003e","title":"modify-custom"},{"content":"Creates a database for a virtual server This command creates a new MySQL/MariaDB or PostgreSQL database, and associates it with an existing virtual server. You must supply the --domain parameter to specify the server, --name to set the database name, and --type followed by either mysql, postgres or some plugin database type. It would typically be run something like:\ncreate-database.pl --domain foo.com --name foo_phpbb --type mysql Some database types support additional creation-time options, specified using the --opt flag. At the time of writing, those available for MySQL/MariaDB are:\n--opt charset name - Sets the character set (like latin2 or euc-jp) for the new database.\nAnd for PostgreSQL, the options are:\n--opt encoding name - Sets the text encoding (like LATIN2 or EUC_JP) for the new database.\nCommand line help virtualmin create-database --domain domain.name --name database-name --type mysql|postgres [--opt \u0026#34;name value\u0026#34;]* ","permalink":"https://www.virtualmin.com/docs/development/api-programs/create-database/","summary":"\u003ch3 id=\"creates-a-database-for-a-virtual-server\"\u003eCreates a database for a virtual server\u003c/h3\u003e\n\u003cp\u003eThis command creates a new MySQL/MariaDB or PostgreSQL database, and associates it with an existing virtual server. You must supply the \u003ccode\u003e--domain\u003c/code\u003e parameter to specify the server, \u003ccode\u003e--name\u003c/code\u003e to set the database name, and \u003ccode\u003e--type\u003c/code\u003e followed by either \u003ccode\u003emysql\u003c/code\u003e, \u003ccode\u003epostgres\u003c/code\u003e or some plugin database type. It would typically be run something like:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecreate-database.pl --domain foo.com --name foo_phpbb --type mysql\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSome database types support additional creation-time options, specified using the \u003ccode\u003e--opt\u003c/code\u003e flag. At the time of writing, those available for MySQL/MariaDB are:\u003c/p\u003e","title":"create-database"},{"content":"Deletes one database To remove a single database from a virtual server and delete all of its contents, you can use this command. It takes the exact same parameters as the create-database command like --domain, --name and --type. Be careful using it, as the complete contents of the specified database will be removed without any prompting for confirmation.\nCommand line help virtualmin delete-database --domain domain.name --name database-name --type mysql|postgres ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-database/","summary":"\u003ch3 id=\"deletes-one-database\"\u003eDeletes one database\u003c/h3\u003e\n\u003cp\u003eTo remove a single database from a virtual server and delete all of its contents, you can use this command. It takes the exact same parameters as the \u003ccode\u003ecreate-database\u003c/code\u003e command like \u003ccode\u003e--domain\u003c/code\u003e, \u003ccode\u003e--name\u003c/code\u003e and \u003ccode\u003e--type\u003c/code\u003e. Be careful using it, as the complete contents of the specified database will be removed without any prompting for confirmation.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin delete-database --domain domain.name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                           --name database-name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                           --type mysql|postgres\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"delete-database"},{"content":"Removes a database from the control of a virtual server This command removes access to a database from the virtual server that owns it, but does not actually delete the database itself. You must provide the --domain flag followed by a virtual server name, --type followed by the DB type (like mysql or postgres), and --name followed by the database name.\nCommand line help virtualmin disconnect-database --domain domain.name --name database-name --type mysql|postgres ","permalink":"https://www.virtualmin.com/docs/development/api-programs/disconnect-database/","summary":"\u003ch3 id=\"removes-a-database-from-the-control-of-a-virtual-server\"\u003eRemoves a database from the control of a virtual server\u003c/h3\u003e\n\u003cp\u003eThis command removes access to a database from the virtual server that owns it, but does not actually delete the database itself. You must provide the \u003ccode\u003e--domain\u003c/code\u003e flag followed by a virtual server name, \u003ccode\u003e--type\u003c/code\u003e followed by the DB type (like \u003ccode\u003emysql\u003c/code\u003e or \u003ccode\u003epostgres\u003c/code\u003e), and \u003ccode\u003e--name\u003c/code\u003e followed by the database name.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin disconnect-database --domain domain.name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                               --name database-name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                               --type mysql|postgres\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"disconnect-database"},{"content":"Adds an existing database to a virtual server This command finds a MySQL/MariaDB or PostgreSQL database that is not currently owned by any virtual server and associates it with the server specified with the --domain parameter.\nThe database to import is set with the --type flag followed by either mysql or postgres , and the --name flag followed by a database name. You cannot import a DB that is owned by another domain, or has a special purpose like the mysql or template0 databases.\nCommand line help virtualmin import-database --domain domain.name --name database-name --type mysql|postgres ","permalink":"https://www.virtualmin.com/docs/development/api-programs/import-database/","summary":"\u003ch3 id=\"adds-an-existing-database-to-a-virtual-server\"\u003eAdds an existing database to a virtual server\u003c/h3\u003e\n\u003cp\u003eThis command finds a MySQL/MariaDB or PostgreSQL database that is not currently owned by any virtual server and associates it with the server specified with the \u003ccode\u003e--domain\u003c/code\u003e parameter.\u003c/p\u003e\n\u003cp\u003eThe database to import is set with the \u003ccode\u003e--type\u003c/code\u003e flag followed by either \u003ccode\u003emysql\u003c/code\u003e or \u003ccode\u003epostgres\u003c/code\u003e , and the \u003ccode\u003e--name\u003c/code\u003e flag followed by a database name. You cannot import a DB that is owned by another domain, or has a special purpose like the \u003ccode\u003emysql\u003c/code\u003e or \u003ccode\u003etemplate0\u003c/code\u003e databases.\u003c/p\u003e","title":"import-database"},{"content":"Lists databases for some virtual server This program simply displays a list of MySQL/MariaDB and PostgreSQL databases that are owned by one server. You must supply the --domain flag followed by the domain name of the server to list. By default the output is in a reader-friendly table, but the --multiline option can be used to switch to a format more suitable for reading by programs and containing more information.\nTo output just a list of database names, use the --name-only flag. To limit the list to databases of a particular type, use --type followed by a code like mysql or postgres.\nCommand line help virtualmin list-databases --domain domain.name [--multiline | --name-only] [--type dbtype] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-databases/","summary":"\u003ch3 id=\"lists-databases-for-some-virtual-server\"\u003eLists databases for some virtual server\u003c/h3\u003e\n\u003cp\u003eThis program simply displays a list of MySQL/MariaDB and PostgreSQL databases that are owned by one server. You must supply the \u003ccode\u003e--domain\u003c/code\u003e flag followed by the domain name of the server to list. By default the output is in a reader-friendly table, but the \u003ccode\u003e--multiline\u003c/code\u003e option can be used to switch to a format more suitable for reading by programs and containing more information.\u003c/p\u003e","title":"list-databases"},{"content":"Adds or removes an allowed MySQL host for some or all domains This command can change the remote hosts that are allowed to login to the MySQL/MariaDB databases owned by some virtual servers and all their sub-servers. The domains to modify are selected with the --domain flag, or you can select all (with MySQL/MariaDB enabled) with the --all-domains command-line parameter. The --type flag must be given, and followed by a database type to modify. Currently, only mysql databases support configuration of allowed remote hosts.\nTo add a remote system to allowed list, use the --add-host flag followed by a hostname, IP address or IP pattern like 192.168.1.%. To take away a host, use --remove-host. To clear all existing remote hosts and specify a new list, use --set-host. All of these flags may appear multiple times, but if you use --set-host the other two cannot be used.\nAccess from the system running Virtualmin is always granted, and cannot be removed.\nCommand line help virtualmin modify-database-hosts --domain name | --all-domains --type mysql|postgres [--add-host ip] [--remove-host ip] [--set-host ip] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-database-hosts/","summary":"\u003ch3 id=\"adds-or-removes-an-allowed-mysql-host-for-some-or-all-domains\"\u003eAdds or removes an allowed MySQL host for some or all domains\u003c/h3\u003e\n\u003cp\u003eThis command can change the remote hosts that are allowed to login to the MySQL/MariaDB databases owned by some virtual servers and all their sub-servers. The domains to modify are selected with the \u003ccode\u003e--domain\u003c/code\u003e flag, or you can select all (with MySQL/MariaDB enabled) with the \u003ccode\u003e--all-domains\u003c/code\u003e command-line parameter. The \u003ccode\u003e--type\u003c/code\u003e flag must be given, and followed by a database type to modify. Currently, only \u003ccode\u003emysql\u003c/code\u003e databases support configuration of allowed remote hosts.\u003c/p\u003e","title":"modify-database-hosts"},{"content":"Create one reseller account This command adds a single reseller account to your Virtualmin system. The required parameters are --name and --pass to specify the login name and password respectively, but you can also use other parameters to set limits on the reseller to control the number of servers and other resources he can use.\nThe optional --email flag can be used to set an email address Virtualmin will use when sending messages to the reseller, such as when a domain is created. The --from flag sets the email address used when Virtualmin sends mail as the reseller.\nThe following command would create a reseller called reseller1 who is allowed to create up to 5 servers and allocate 1 GB in disk quota space. A new reseller will also be granted access to a standard set of virtual server features:\nvirtualmin create-reseller --name reseller1 --pass smeg --desc `Bob Smith` --max-doms 5 --max-quota 1000000 --allow dir --allow unix --allow webmin --allow web --allow ssl --allow dns --allow mysql The --max-doms parameter sets the maximum number of servers that can be created by this reseller, and by the owners of any virtual servers that he manages. Similarly, the --max-dbs option sets a limit on the number of MySQL/MariaDB and PostgreSQL databases that can be created in servers that the reseller owns.\nThe --max-quota option sets the maximum disk quota that the reseller can allocate to virtual servers that he creates. The option --max-mailboxes sets a limit on the number of mail/FTP/database users that can be created in servers managed by the reseller.\nThe --allow option can be given multiple times, each instance of which must be followed by the short code for a feature to allow the reseller to use. Only allowed features can be selected when the reseller is creating a new virtual server.\nIf a plan already exists with the limits you want to apply to the new reseller, you can use the --plan flag followed by a plan name. All domain, mailbox, alias and database limits will be copied, along with quotas, the bandwidth limit and allowed features.\nIf you want the new reseller to use a custom IP address for created virtual servers, this can be specified with the --ip-address option followed by an IPv4 active on your system. For systems that support IPv6, you can use the --ip6-address followed by an active IPv6 address to use for this reseller\u0026rsquo;s name-based servers.\nSimilarly, you can specify custom nameservers for the DNS domains he creates with the --nameserver flag. This can appear multiple times, and each instance must be followed by a valid nameserver hostname.\nTo set the external IP address (used in DNS records) for this reseller\u0026rsquo;s new domains, use the --external-ip-address flag. This is useful if your system has multiple external IPs that are NATd to one or more addresses on the system.\nBy default, resellers are allowed to select from any of the shared IP addresses on the system when creating new domains. However, the --cannot-sharedips flag can be used to prevent this.\nAddition reseller permissions can be granted or removed with the flags:\n--can-schedule-backups - Schedule and run backups\n--can-backups - Run backups manually\n--can-plans or --cannot-plans - Create and edit plans\n--can-admins or --cannot-admins - Create and edit extra admins\n--can-create or --cannot-create - Create virtual servers\n--can-rename or --cannot-rename - Rename virtual servers\n--can-edit or --cannot-edit - Edit virtual servers\n--can-delete or --cannot-delete - Delete virtual servers\n--can-proxy or --cannot-proxy - Manage proxy paths and create proxy virtual servers\nTo create a reseller with an associated Unix login, use the --unix flag to this command. Or to prevent a Unix account from being created, use the --no-unix flag. If none are given, the default configured behavior will be used.\nBy default resellers are not allowed to create or manage other resellers. However, this can be changed with the --can-create-resellers command line flag. Be careful using this though, as it effectively allows a reseller access to all virtual servers.\nCommand line help virtualmin create-reseller --name login --pass password | --passfile password-file [--lock] [--desc description] [--email address] [--from address] [--max-doms number] [--max-topdoms number] [--max-aliasdoms number] [--max-realdoms number] [--max-quota number] [--max-mailboxes number] [--max-aliases number] [--max-dbs number] [--max-bw number] [--allow feature]* [--plan name|id] [--read-only] [--hide] [--subdom forced.parent] [--logo url|\u0026#34;none\u0026#34;] [--link url] [--ip-address address] [--ip6-address ipv6.address] [--can-sharedips | --cannot-sharedips] [--external-ip-address address] [--nameserver hostname]* [--can-plans | --cannot-plans] [--can-admins | --cannot-admins] [--can-create | --cannot-create] [--can-edit | --cannot-edit] [--can-rename | --cannot-rename] [--can-delete | --cannot-delete] [--can-proxy | --cannot-proxy] [--can-create-resellers | --cannot-create-resellers] [--can-schedule-backups | --can-backups | --cannot-backups] [--can-migrate | --cannot-migrate] [--unix | --no-unix] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/create-reseller/","summary":"\u003ch3 id=\"create-one-reseller-account\"\u003eCreate one reseller account\u003c/h3\u003e\n\u003cp\u003eThis command adds a single reseller account to your Virtualmin system. The required parameters are \u003ccode\u003e--name\u003c/code\u003e and \u003ccode\u003e--pass\u003c/code\u003e to specify the login name and password respectively, but you can also use other parameters to set limits on the reseller to control the number of servers and other resources he can use.\u003c/p\u003e\n\u003cp\u003eThe optional \u003ccode\u003e--email\u003c/code\u003e flag can be used to set an email address Virtualmin will use when sending messages to the reseller, such as when a domain is created. The \u003ccode\u003e--from\u003c/code\u003e flag sets the email address used when Virtualmin sends mail as the reseller.\u003c/p\u003e","title":"create-reseller"},{"content":"Delete one reseller This program deletes a single reseller account, specified by the --name parameter. It does not effect any of the virtual servers owned by the reseller, except to mark them as no longer owned by any reseller. It does not prompt for confirmation before deleting either.\nCommand line help virtualmin delete-reseller --name login ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-reseller/","summary":"\u003ch3 id=\"delete-one-reseller\"\u003eDelete one reseller\u003c/h3\u003e\n\u003cp\u003eThis program deletes a single reseller account, specified by the \u003ccode\u003e--name\u003c/code\u003e parameter. It does not effect any of the virtual servers owned by the reseller, except to mark them as no longer owned by any reseller. It does \u003cem\u003enot\u003c/em\u003e prompt for confirmation before deleting either.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin delete-reseller --name login\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"delete-reseller"},{"content":"Modify attributes for an existing reseller This command can be used to change the details of a single reseller. Its only mandatory parameter is --name, which must be followed by the reseller\u0026rsquo;s login name. The other parameters such as --pass, --desc and the --max options are the same as those for the create-reseller command.\nThe --allow parameter can be given multiple times to grant access to additional features to the reseller. Similarly, the --disallow feature can be used to take away access to features. Each instance of --disallow must be followed by the short code for the feature to remove, such as web or dns.\nIf you want the new reseller to use a custom IP address for created virtual servers, this can be specified with the --ip-address option followed by an IP active on your system. To remove any custom IP, use the --no-ip-address flag. For systems that support IPv6, the equivalent flags are --ip6-address and --no-ip6-address. Similarly, the default external IP address (for use in DNS records) can be set with the --external-ip-address and --no-external-ip-address flags.\nSimilarly, you can specify custom nameservers for the DNS domains he creates with the --nameserver flag. This can appear multiple times, and each instance must be followed by a valid nameserver hostname. To force use of the system default nameservers instead, use the --no-nameserver flag.\nBy default, resellers are allowed to select from any of the shared IP addresses on the system when creating new domains. The --cannot-sharedips flag can be used to prevent this, and the --can-sharedips flag to allow it.\nIf a plan already exists with the limits you want to apply to the reseller, you can use the --plan flag followed by a plan name. All domain, mailbox, alias and database limits will be copied, along with quotas, the bandwidth limit and allowed features.\nAddition reseller permissions can be granted or removed with the flags:\n--can-schedule-backups - Schedule and run backups\n--can-backups - Run backups manually\n--can-plans or --cannot-plans - Create and edit plans\n--can-admins or --cannot-admins - Create and edit extra admins\n--can-create or --cannot-create - Create virtual servers\n--can-rename or --cannot-rename - Rename virtual servers\n--can-edit or --cannot-edit - Edit virtual servers\n--can-delete or --cannot-delete - Delete virtual servers\n--can-proxy or --cannot-proxy - Manage proxy paths and create proxy virtual servers\nA Unix account for the reseller can be enabled with the --unix flag, or disabled with the --no-unix flag.\nYou can control whether this reseller is allowed to create and edit other resellers with the --can-create-resellers or --cannot-create-resellers flag.\nCommand line help virtualmin modify-reseller --name login [--pass password | --passfile password-file] [--lock | --unlock] [--desc description] [--email address] [--max-doms number] [--max-topdoms number] [--max-aliasdoms number] [--max-realdoms number] [--max-quota number] [--max-mailboxes number] [--max-aliases number] [--max-dbs number] [--max-bw number] [--allow feature]* [--disallow feature]* [--plan name|id] [--read-only] | [--read-write] [--subdom forced.parent | --no-subdom] [--logo url|\u0026#34;none\u0026#34; | --no-logo] [--link url | --no-link] [--ip-address address | --no-ip-address] [--ip6-address ipv6.address | --no-ip6-address] [--can-sharedips | --cannot-sharedips] [--external-ip-address address | --no-external-ip-address] [--nameserver hostname | --no-nameserver]* [--can-plans | --cannot-plans] [--can-admins | --cannot-admins] [--can-create | --cannot-create] [--can-edit | --cannot-edit] [--can-rename | --cannot-rename] [--can-delete | --cannot-delete] [--can-proxy | --cannot-proxy] [--can-create-resellers | --cannot-create-resellers] [--can-schedule-backups | --can-backups | --cannot-backups] [--can-migrate | --cannot-migrate] [--unix | --no-unix] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-reseller/","summary":"\u003ch3 id=\"modify-attributes-for-an-existing-reseller\"\u003eModify attributes for an existing reseller\u003c/h3\u003e\n\u003cp\u003eThis command can be used to change the details of a single reseller. Its only mandatory parameter is \u003ccode\u003e--name\u003c/code\u003e, which must be followed by the reseller\u0026rsquo;s login name. The other parameters such as \u003ccode\u003e--pass\u003c/code\u003e, \u003ccode\u003e--desc\u003c/code\u003e and the \u003ccode\u003e--max\u003c/code\u003e options are the same as those for the \u003ccode\u003ecreate-reseller\u003c/code\u003e command.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003e--allow\u003c/code\u003e parameter can be given multiple times to grant access to additional features to the reseller. Similarly, the \u003ccode\u003e--disallow\u003c/code\u003e feature can be used to take away access to features. Each instance of \u003ccode\u003e--disallow\u003c/code\u003e must be followed by the short code for the feature to remove, such as \u003ccode\u003eweb\u003c/code\u003e or \u003ccode\u003edns\u003c/code\u003e.\u003c/p\u003e","title":"modify-reseller"},{"content":"List existing resellers When run with no parameters, this program simply displays a reader-friendly table of existing Virtualmin resellers. The only supported options are --multiline, which causes it to show more details about each reseller in a format suitable for reading by other programs, --name-only to dump just a list of reseller usernames, and --simple-multiline to display details that can be computed quickly.\nCommand line help virtualmin list-resellers [--multiline | --simple-multiline | --name-only] [--name username] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-resellers/","summary":"\u003ch3 id=\"list-existing-resellers\"\u003eList existing resellers\u003c/h3\u003e\n\u003cp\u003eWhen run with no parameters, this program simply displays a reader-friendly table of existing Virtualmin resellers. The only supported options are \u003ccode\u003e--multiline\u003c/code\u003e, which causes it to show more details about each reseller in a format suitable for reading by other programs, \u003ccode\u003e--name-only\u003c/code\u003e to dump just a list of reseller usernames, and \u003ccode\u003e--simple-multiline\u003c/code\u003e to display details that can be computed quickly.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin list-resellers [--multiline |\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                           --simple-multiline |\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                           --name-only]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                          [--name username]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"list-resellers"},{"content":"Install one third-party web app This program performs the actual upgrade or install of a web app into a virtual server. The required parameters are --domain (followed by the domain name), --type (followed by the app\u0026rsquo;s short name, like wordpress or phpmyadmin), and --version (followed by the version number or the word latest). Don\u0026rsquo;t use the app\u0026rsquo;s longer description with the --type parameter - only the short name (as shown by list-available-scripts --multiline) will work.\nBy default only versions known to Virtualmin can be installed, but you can override this check with the --unsupported flag. Note that this may cause the web app to fail to download or install, due to inconsistent download URLs or install methods implemented by the app creator.\nAll web apps will also need the --path parameter, which must be followed by a URL path such as /wordpress. This determines the directory where the app is installed. The directory can be overridden by the --force-dir option though, which must be followed by a full path. However, this is not recommended, and should only be used when you have a web server alias setup to map the path to the forced directory.\nThose that use a database require the --db parameter, which must be followed by the database type and name, such as --db mysql dbname. If this is missing and the web app requires it, the install-script command will fail with an error message. By default the database must already exist under the virtual server, but if the --newdb parameter is given it will be created as part of the installation process.\nBy default the exact database name you enter will be used, but when creating a new database for the web app you can use the --prefix-db flag to request that the DB name be prefixed in the same way that it would be when installing an app from the Virtualmin user interface.\nIf upgrading an existing web app in this virtual server, you must supply the --upgrade parameter, followed by the install ID. This can be found from the list-scripts command, documented below.\nIf your system supports multiple proxy balancer backends (as in Apache 2), the --mongrels flag can be given, followed by the number of processes to configure and start to serve the app.\nMost applications that Virtualmin can install have an initial username and password for administration. By default these are taken from the domain\u0026rsquo;s Virtualmin login and password, but they can be overridden with the --user and --pass flags.\nWhen the command is run it will display the progress of the installation process as the needed files are downloaded, validated and installed.\nCommand line help virtualmin install-script --domain domain.name --type name --version number|\u0026#34;latest\u0026#34; [--unsupported] [--path url-path] [--db \u0026#34;type name\u0026#34;] [--prefix-db] [--opt \u0026#34;name value\u0026#34;] [--upgrade id] [--force-dir directory] [--mongrels number] [--user username --pass password] [--log-only] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/install-script/","summary":"\u003ch3 id=\"install-one-third-party-web-app\"\u003eInstall one third-party web app\u003c/h3\u003e\n\u003cp\u003eThis program performs the actual upgrade or install of a web app into a virtual server. The required parameters are \u003ccode\u003e--domain\u003c/code\u003e (followed by the domain name), \u003ccode\u003e--type\u003c/code\u003e (followed by the app\u0026rsquo;s short name, like \u003ccode\u003ewordpress\u003c/code\u003e or \u003ccode\u003ephpmyadmin\u003c/code\u003e), and \u003ccode\u003e--version\u003c/code\u003e (followed by the version number or the word \u003ccode\u003elatest\u003c/code\u003e). Don\u0026rsquo;t use the app\u0026rsquo;s longer description with the \u003ccode\u003e--type\u003c/code\u003e parameter - only the short name (as shown by \u003ccode\u003elist-available-scripts --multiline\u003c/code\u003e) will work.\u003c/p\u003e","title":"install-script"},{"content":"Un-install one script from a virtual server This program completely removes a third-party script from a server. It takes the usual --domain parameter to identify the server, and either --id followed by the install ID, or --type followed by the script\u0026rsquo;s short name. The latter option is more convenient, but only works if there is only one instance of the script in the virtual server. If multiple different versions are installed, you can also use --version to select a specific one to remove.\nBe careful using this program, as it removes all data files, web pages and database tables for the script, without asking for confirmation. If you want to make Virtualmin forget about a script without actually removing it, use the --deregister flag.\nCommand line help virtualmin delete-script --domain domain.name [--type name --version number] | [--id number] [--deregister] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-script/","summary":"\u003ch3 id=\"un-install-one-script-from-a-virtual-server\"\u003eUn-install one script from a virtual server\u003c/h3\u003e\n\u003cp\u003eThis program completely removes a third-party script from a server. It takes the usual \u003ccode\u003e--domain\u003c/code\u003e parameter to identify the server, and either \u003ccode\u003e--id\u003c/code\u003e followed by the install ID, or \u003ccode\u003e--type\u003c/code\u003e followed by the script\u0026rsquo;s short name. The latter option is more convenient, but only works if there is only one instance of the script in the virtual server. If multiple different versions are installed, you can also use \u003ccode\u003e--version\u003c/code\u003e to select a specific one to remove.\u003c/p\u003e","title":"delete-script"},{"content":"Display web apps installed into some virtual server The virtual servers to display web apps for can be specified with the --domain parameter, which must be followed by a domain name and can appear multiple times. Alternately you can use --all-domains to select all of them, or --user to show web apps for virtual servers owned by a specific Virtualmin administrator.\nThe program displays a table of all web apps currently installed, including their install IDs and version numbers. To get more details in a parsable format, use the --multiline parameter. To just get a list of app names, use --name-only.\nTo limit the output to just apps of some type, use the --type flag followed by an app code name, like phpmyadmin.\nCommand line help virtualmin list-scripts --all-domains | --domain name | --user username [--multiline | --name-only] [--type script] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-scripts/","summary":"\u003ch3 id=\"display-web-apps-installed-into-some-virtual-server\"\u003eDisplay web apps installed into some virtual server\u003c/h3\u003e\n\u003cp\u003eThe virtual servers to display web apps for can be specified with the \u003ccode\u003e--domain\u003c/code\u003e parameter, which must be followed by a domain name and can appear multiple times. Alternately you can use \u003ccode\u003e--all-domains\u003c/code\u003e to select all of them, or \u003ccode\u003e--user\u003c/code\u003e to show web apps for virtual servers owned by a specific Virtualmin administrator.\u003c/p\u003e\n\u003cp\u003eThe program displays a table of all web apps currently installed, including their install IDs and version numbers. To get more details in a parsable format, use the \u003ccode\u003e--multiline\u003c/code\u003e parameter. To just get a list of app names, use \u003ccode\u003e--name-only\u003c/code\u003e.\u003c/p\u003e","title":"list-scripts"},{"content":"List known web apps This command simply outputs a list of web apps that can potentially be installed into Virtualmin servers. By default it displays a nicely formatted table, but if the --multiline option is given it will use a more parsable format which shows more information. Or you can use --name-only to show just app names.\nBy default all available web apps are listed, but you can limit the output to only those built into Virtualmin with the --source core parameter. Or show only those you have installed separately with --source custom, or those from plugins with --source plugin.\nCommand line help virtualmin list-available-scripts [--multiline | --name-only] [--source core|custom|plugin|latest] [--type name]* [--available-only] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-available-scripts/","summary":"\u003ch3 id=\"list-known-web-apps\"\u003eList known web apps\u003c/h3\u003e\n\u003cp\u003eThis command simply outputs a list of web apps that can potentially be installed into Virtualmin servers. By default it displays a nicely formatted table, but if the \u003ccode\u003e--multiline\u003c/code\u003e option is given it will use a more parsable format which shows more information. Or you can use \u003ccode\u003e--name-only\u003c/code\u003e to show just app names.\u003c/p\u003e\n\u003cp\u003eBy default all available web apps are listed, but you can limit the output to only those built into Virtualmin with the \u003ccode\u003e--source core\u003c/code\u003e parameter. Or show only those you have installed separately with \u003ccode\u003e--source custom\u003c/code\u003e, or those from plugins with \u003ccode\u003e--source plugin\u003c/code\u003e.\u003c/p\u003e","title":"list-available-scripts"},{"content":"Adds a per-directory proxy to some domain A proxy maps some URL on a virtual server to another webserver. This means that requests for any page under that URL path will be forwarded to the other site, which could be a separate machine or another webserver process on the same system.\nThe --domain parameter must be given and followed by a virtual server\u0026rsquo;s domain name. The --path parameter is also mandatory, and must be followed by a local URL path like /app or even /. Finally, you must give the --url parameter, followed by a URL to forward to like http://www.foo.com.\nIf running Apache 2.0 or later with the mod_proxy_balancer module, the --url parameter can be given multiple times. Your webserver will then round-robin balance requests between all the URLs, which should serve the same content. This is useful for load-balancing between multiple backend servers.\nIf you want to turn off proxying for some URL path, the --no-proxy flag can be given instead of --url. This is useful if you have proxying enabled for / but want to serve content for some sub-directory locally.\nCommand line help virtualmin create-proxy --domain domain.name --path url-path --url destination [--url destination]* [--balancer name] --no-proxy ","permalink":"https://www.virtualmin.com/docs/development/api-programs/create-proxy/","summary":"\u003ch3 id=\"adds-a-per-directory-proxy-to-some-domain\"\u003eAdds a per-directory proxy to some domain\u003c/h3\u003e\n\u003cp\u003eA proxy maps some URL on a virtual server to another webserver. This means that requests for any page under that URL path will be forwarded to the other site, which could be a separate machine or another webserver process on the same system.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003e--domain\u003c/code\u003e parameter must be given and followed by a virtual server\u0026rsquo;s domain name. The \u003ccode\u003e--path\u003c/code\u003e parameter is also mandatory, and must be followed by a local URL path like \u003ccode\u003e/app\u003c/code\u003e or even \u003ccode\u003e/\u003c/code\u003e. Finally, you must give the \u003ccode\u003e--url\u003c/code\u003e parameter, followed by a URL to forward to like \u003ccode\u003ehttp://www.foo.com\u003c/code\u003e.\u003c/p\u003e","title":"create-proxy"},{"content":"Removes a proxy balancer from some domain This command deletes one proxy path from the virtual server identified by the --domain flag. The proxy to remove must be identified by the --path parameter. Any backend services that the proxy previously mapped to will not be halted.\nCommand line help virtualmin delete-proxy --domain domain.name --path url-path ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-proxy/","summary":"\u003ch3 id=\"removes-a-proxy-balancer-from-some-domain\"\u003eRemoves a proxy balancer from some domain\u003c/h3\u003e\n\u003cp\u003eThis command deletes one proxy path from the virtual server identified by the \u003ccode\u003e--domain\u003c/code\u003e flag. The proxy to remove must be identified by the \u003ccode\u003e--path\u003c/code\u003e parameter. Any backend services that the proxy previously mapped to will not be halted.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin delete-proxy --domain domain.name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        --path url-path\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"delete-proxy"},{"content":"Changes a proxy balancer from some domain This command updates one proxy path from the virtual server identified by the --domain flag. The proxy to remove must be identified by the --path parameter.\nThe URL path for the proxy can be changed with the --new-path flag, followed by a path like /foo. The destination URLs can be set with the --url flag followed by a URL, which can be given multiple times.\nCommand line help virtualmin modify-proxy --domain domain.name --path url-path [--new-path url-path] [--no-proxy] [--url http://some-url]* ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-proxy/","summary":"\u003ch3 id=\"changes-a-proxy-balancer-from-some-domain\"\u003eChanges a proxy balancer from some domain\u003c/h3\u003e\n\u003cp\u003eThis command updates one proxy path from the virtual server identified by the \u003ccode\u003e--domain\u003c/code\u003e flag. The proxy to remove must be identified by the \u003ccode\u003e--path\u003c/code\u003e parameter.\u003c/p\u003e\n\u003cp\u003eThe URL path for the proxy can be changed with the \u003ccode\u003e--new-path\u003c/code\u003e flag, followed by a path like \u003ccode\u003e/foo\u003c/code\u003e. The destination URLs can be set with the \u003ccode\u003e--url\u003c/code\u003e flag followed by a URL, which can be given multiple times.\u003c/p\u003e","title":"modify-proxy"},{"content":"Lists web proxy balancers in some domain This command lists all the proxies configured for some domain identified by the --domain parameter. By default the list is in a reader-friendly table format, but can be switched to a more complete and parsable output with the --multiline flag. Or you can have just the proxy paths listed with the --name-only parameter.\nCommand line help virtualmin list-proxies --domain domain.name [--multiline | --name-only] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-proxies/","summary":"\u003ch3 id=\"lists-web-proxy-balancers-in-some-domain\"\u003eLists web proxy balancers in some domain\u003c/h3\u003e\n\u003cp\u003eThis command lists all the proxies configured for some domain identified by the \u003ccode\u003e--domain\u003c/code\u003e parameter. By default the list is in a reader-friendly table format, but can be switched to a more complete and parsable output with the \u003ccode\u003e--multiline\u003c/code\u003e flag. Or you can have just the proxy paths listed with the \u003ccode\u003e--name-only\u003c/code\u003e parameter.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin list-proxies --domain domain.name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                       [--multiline | --name-only]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"list-proxies"},{"content":"Remove any custom version of PHP for some directory If a specific version of PHP has been configured for some directory, it can be removed with this command. The required parameters are --domain followed by a domain name, and --dir followed by a full directory, for example:\nvirtualmin delete-php-directory --domain example.com --dir /home/example/public_html/drupal Command line help virtualmin delete-php-directory --domain domain.name --dir directory|url-path ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-php-directory/","summary":"\u003ch3 id=\"remove-any-custom-version-of-php-for-some-directory\"\u003eRemove any custom version of PHP for some directory\u003c/h3\u003e\n\u003cp\u003eIf a specific version of PHP has been configured for some directory, it can be removed with this command. The required parameters are \u003ccode\u003e--domain\u003c/code\u003e followed by a domain name, and \u003ccode\u003e--dir\u003c/code\u003e followed by a full directory, for example:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin delete-php-directory --domain example.com --dir /home/example/public_html/drupal\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin delete-php-directory --domain domain.name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                --dir directory|url-path\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"delete-php-directory"},{"content":"Set the version of PHP to run in some directory If more than one version of PHP is installed on your system and either CGI or fCGId is used to run PHP scripts in some virtual server, it can be configured to run a different PHP version on a per-directory basis. This is most useful when running PHP applications that only support specific versions.\nTo set a PHP directory, the --domain flag must be used to specify the directory, --dir to set the path and --version to set the version number.\nFor example:\nvirtualmin set-php-directory --domain example.com --dir /home/example/public_html/drupal --version 8.1 Command line help virtualmin set-php-directory --domain domain.name --dir directory|url-path|\u0026#34;.\u0026#34; --version num ","permalink":"https://www.virtualmin.com/docs/development/api-programs/set-php-directory/","summary":"\u003ch3 id=\"set-the-version-of-php-to-run-in-some-directory\"\u003eSet the version of PHP to run in some directory\u003c/h3\u003e\n\u003cp\u003eIf more than one version of PHP is installed on your system and either CGI or fCGId is used to run PHP scripts in some virtual server, it can be configured to run a different PHP version on a per-directory basis. This is most useful when running PHP applications that only support specific versions.\u003c/p\u003e\n\u003cp\u003eTo set a PHP directory, the \u003ccode\u003e--domain\u003c/code\u003e flag must be used to specify the directory, \u003ccode\u003e--dir\u003c/code\u003e to set the path and \u003ccode\u003e--version\u003c/code\u003e to set the version number.\u003c/p\u003e","title":"set-php-directory"},{"content":"List all directories in which a specific version of PHP has been activated By default this command outputs a table of directories for the virtual server specified with the --domain parameter. However, the --multiline flag can be used to output more detail about each directory in a format more easily parsed by other programs. Or if you just want a list of directories, use the --name-only flag.\nBy default only the base version numbers are shown, but you can switch to showing the complete version with the --full-version flag.\nCommand line help virtualmin list-php-directories --domain domain.name [--multiline | --name-only] [--full-version] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-php-directories/","summary":"\u003ch3 id=\"list-all-directories-in-which-a-specific-version-of-php-has-been-activated\"\u003eList all directories in which a specific version of PHP has been activated\u003c/h3\u003e\n\u003cp\u003eBy default this command outputs a table of directories for the virtual server specified with the \u003ccode\u003e--domain\u003c/code\u003e parameter. However, the \u003ccode\u003e--multiline\u003c/code\u003e flag can be used to output more detail about each directory in a format more easily parsed by other programs. Or if you just want a list of directories, use the \u003ccode\u003e--name-only\u003c/code\u003e flag.\u003c/p\u003e\n\u003cp\u003eBy default only the base version numbers are shown, but you can switch to showing the complete version with the \u003ccode\u003e--full-version\u003c/code\u003e flag.\u003c/p\u003e","title":"list-php-directories"},{"content":"Output the certificates for some or all virtual servers The virtual servers to list can be selected with the --domain flag followed by a domain name, or --user followed by an administrator\u0026rsquo;s username - both of which can be given multiple times. Or you can use --all-domains to find certificates for every virtual server with SSL enabled.\nBy default, all known certificates and keys are output. However, you can limit the results to particular certificates with one of more of the following flags:\n--cert - SSL certificate only\n--key - SSL private key\n--ca - SSL chained CA certificate, if there is one\n--csr - SSL certificate signing request, for sending to a CA\n--newkey - SSL private key matching the CSR, but not yet installed\nCommand line help virtualmin list-certs --all-domains | --domain name | --user username [--cert | --key | --ca | --csr | --newkey] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-certs/","summary":"\u003ch3 id=\"output-the-certificates-for-some-or-all-virtual-servers\"\u003eOutput the certificates for some or all virtual servers\u003c/h3\u003e\n\u003cp\u003eThe virtual servers to list can be selected with the \u003ccode\u003e--domain\u003c/code\u003e flag followed by a domain name, or \u003ccode\u003e--user\u003c/code\u003e followed by an administrator\u0026rsquo;s username - both of which can be given multiple times. Or you can use \u003ccode\u003e--all-domains\u003c/code\u003e to find certificates for every virtual server with SSL enabled.\u003c/p\u003e\n\u003cp\u003eBy default, all known certificates and keys are output. However, you can limit the results to particular certificates with one of more of the following flags:\u003c/p\u003e","title":"list-certs"},{"content":"Output the certificates expiry date for matching or all existing virtual servers This program can be used to print SSL expiry dates for all existing domains. The following output controls available :\n--all-domains - All existing domains\n--domain - Domain name or a regex to match\n--sort - Select a column to sort on, either expiry date or domain name\n--sort-order - Sort order applied to selected column, either ascending or descending\nRequired Perl dependencies Text::ASCIITable and Time::Piece will be automatically installed if missing\nCommand line help virtualmin list-certs-expiry --all-domains | --domain regex [--sort [expiry|name] [--sort-order [asc|desc] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-certs-expiry/","summary":"\u003ch3 id=\"output-the-certificates-expiry-date-for-matching-or-all-existing-virtual-servers\"\u003eOutput the certificates expiry date for matching or all existing virtual servers\u003c/h3\u003e\n\u003cp\u003eThis program can be used to print SSL expiry dates for all existing domains. The following output controls available :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e--all-domains\u003c/code\u003e - All existing domains\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e--domain\u003c/code\u003e - Domain name or a regex to match\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e--sort\u003c/code\u003e - Select a column to sort on, either expiry date or domain name\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e--sort-order\u003c/code\u003e - Sort order applied to selected column, either ascending or descending\u003c/p\u003e","title":"list-certs-expiry"},{"content":"Generate a new self-signed cert or CSR for a virtual server A self-signed certificate is one that can be used immediately to protect a virtual server with SSL, but is not validated by a certificate authority. As such, browsers will typically warn the user that it cannot be validated, and thus provides not protection against man-in-the-middle attacks. All Virtualmin server with SSL enabled have a self-signed cert by default, but this command can be used to create a new one, perhaps with different hostnames or more information about the owner.\nThe virtual server to create a cert for must be specified with the --domain parameter, followed by a domain name. You must also supply the --self flag, to indicate that a self-signed cert is being created. Additional details about the certificate\u0026rsquo;s owner can be set with the following optional flags:\n--o - Followed by the name of the organization or person who owns the domain.\n--ou - Sets the department or group within the organization.\n--c - Sets the country.\n--st - Sets the state or province.\n--l - Sets the city or locality.\n--email - Sets the contact email address.\n--cn - Specifies the domain name in the certificate.\nWhen run, the command will create certificate and private key files, and configure Apache to use them. Any existing files will be overwritten.\nBy default the certificate will use the hash format (SHA1 or SHA2) set on the Virtualmin Configuration page. However, to force a particular format like the more secure SHA2, you can use the --sha2 flag. Or you can request creation of an Elliptic Curve certificate with the --ec flag.\nThis command can also create a CSR, or certificate signing request. This is a file that is sent to a certificate authority like Verisign or Thawte along with payment and a request to validate the owner of a domain. The command is run in the same way, except that the --csr flag is used instead of --self, and the generated files are different.\nOnce the CA has validated the certificate, they will send you back a signed cert that can be installed using the install-cert command or the Virtualmin web interface.\nCommand line help virtualmin generate-cert --domain name --self | --csr [--size bits] [--days expiry-days] [--cn domain-name] [--c country] [--st state] [--l city] [--o organization] [--ou organization-unit] [--email email-address] [--alt alternate-domain-name]* [--sha2 | --sha1 | --ec] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/generate-cert/","summary":"\u003ch3 id=\"generate-a-new-self-signed-cert-or-csr-for-a-virtual-server\"\u003eGenerate a new self-signed cert or CSR for a virtual server\u003c/h3\u003e\n\u003cp\u003eA self-signed certificate is one that can be used immediately to protect a virtual server with SSL, but is not validated by a certificate authority. As such, browsers will typically warn the user that it cannot be validated, and thus provides not protection against man-in-the-middle attacks. All Virtualmin server with SSL enabled have a self-signed cert by default, but this command can be used to create a new one, perhaps with different hostnames or more information about the owner.\u003c/p\u003e","title":"generate-cert"},{"content":"Requests and installs a Let\u0026rsquo;s Encrypt cert for a virtual server The server must be specified with the --domain flag, followed by a domain name. By default the certificate will be the for either previously used hostnames for Let\u0026rsquo;s Encrypt, or the default SSL hostnames for the domain. However, you can specify an alternate list of hostnames with the --host flag, which can be given multiple times. Or you can force use of the default SSL hostname list with --default-hosts.\nIf the optional --renew flag is given, automatic renewal will be configured to occur when the certificate is close to expiry.\nTo have Virtualmin attempt to verify external Internet connectivity to your domain before requesting the certificate, use the --check-first flag. This will detect common errors before your Let\u0026rsquo;s Encrypt service quota is consumed.\nTo have Virtualmin perform a local validation check of the domain, use the --validate-first flag. This is automatically enabled when --check-first is set.\nBy default, the standard Let\u0026rsquo;s Encrypt service will be used. However, you can use a different ACME-compatible provider with the --server flag followed by the provider\u0026rsquo;s API URL. The --server-key and --server-hmac flags can be used to specify a login to the provider.\nBy default Virtualmin will attempt to perform an external DNS lookup of all domain names that the certificate is requested for, to make sure they can be resolved by the Let\u0026rsquo;s Encrypt service. To disable this check, use the --skip-dns-check flag. Or to forcible enable it because it was disabled for the domain in the UI, use the --dns-check flag.\nBy default both web and DNS validation will be attempted by Let\u0026rsquo;s Encrypt for domain ownership, but you can select just one with either the --web or --dns flags.\nCommand line help virtualmin generate-letsencrypt-cert --domain name [--host hostname]* [--default-hosts] [--renew] [--size bits] [--staging] [--check-first | --validate-first] [--web | --dns] [--rsa | --ec] [--server url] [--server-key id] [--server-hmac string] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/generate-letsencrypt-cert/","summary":"\u003ch3 id=\"requests-and-installs-a-lets-encrypt-cert-for-a-virtual-server\"\u003eRequests and installs a Let\u0026rsquo;s Encrypt cert for a virtual server\u003c/h3\u003e\n\u003cp\u003eThe server must be specified with the \u003ccode\u003e--domain\u003c/code\u003e flag, followed by a domain name. By default the certificate will be the for either previously used hostnames for Let\u0026rsquo;s Encrypt, or the default SSL hostnames for the domain. However, you can specify an alternate list of hostnames with the \u003ccode\u003e--host\u003c/code\u003e flag, which can be given multiple times. Or you can force use of the default SSL hostname list with \u003ccode\u003e--default-hosts\u003c/code\u003e.\u003c/p\u003e","title":"generate-letsencrypt-cert"},{"content":"Replace the SSL certificate or private key for a virtual server This command is typically used to install a signed certificate that you have received from a CA in response to a signing request, generated with generate-cert. However, it can be used to install any certificate, private key or CA certificate file into a virtual server.\nThe server must be specified with the --domain flag, followed by a domain name. When installing a signed cert, you should use the --cert flag followed by the path to the certificate file, which will be copied into the virtual server\u0026rsquo;s home directory. You should also use the --use-newkey flag to use the key generated at the same time as the CSR.\nAlternately, you can install a new matching key and certificate with the --key and --cert flags. If the key is protected by a passphrase, it must be specified with the --pass parameter. Any errors in the key or certificate format or the match between them will cause the command to fail before the web server configuration is updated.\nFinally, for virtual servers that have an SSL certificate that is not in use, you can delete it with the --remove-cert flag. Be aware that this will delete the key and certificate files permanently! Once this is done, the generate-cert, install-cert or generate-letsencrypt-cert API commands must be used to create a new certificate.\nCommand line help virtualmin install-cert --domain name [--cert file|data] [--key file|data] [--ca file|data] [--csr file|data] [--use-newkey] [--pass key-password] [--remove-cert] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/install-cert/","summary":"\u003ch3 id=\"replace-the-ssl-certificate-or-private-key-for-a-virtual-server\"\u003eReplace the SSL certificate or private key for a virtual server\u003c/h3\u003e\n\u003cp\u003eThis command is typically used to install a signed certificate that you have received from a CA in response to a signing request, generated with \u003ccode\u003egenerate-cert\u003c/code\u003e. However, it can be used to install any certificate, private key or CA certificate file into a virtual server.\u003c/p\u003e\n\u003cp\u003eThe server must be specified with the \u003ccode\u003e--domain\u003c/code\u003e flag, followed by a domain name. When installing a signed cert, you should use the \u003ccode\u003e--cert\u003c/code\u003e flag followed by the path to the certificate file, which will be copied into the virtual server\u0026rsquo;s home directory. You should also use the \u003ccode\u003e--use-newkey\u003c/code\u003e flag to use the key generated at the same time as the CSR.\u003c/p\u003e","title":"install-cert"},{"content":"Copy the cert and key from a virtual server to some other service The domain to copy the cert from is specified with the --domain flag followed by a virtual server name. The services (like dovecot, postfix, mysql, webmin or usermin) to copy it to are set with the --service flag, which can be given multiple times.\nIf the --add-global flag is given, the cert will be used as the default for the selected servers. But if --add-domain is given, it will only be used for requests to the servers on the domain\u0026rsquo;s hostname or IP address. When configured, the per-domain cert will be used in favor of the global default cert for each service, when a client connects using that domain name.\nFinally, the --remove-domain flag will remove any per-domain cert for the service, causing the global default to be used instead.\nCommand line help virtualmin install-service-cert --domain name --add-global | --add-domain | --remove-domain [--service type]+ ","permalink":"https://www.virtualmin.com/docs/development/api-programs/install-service-cert/","summary":"\u003ch3 id=\"copy-the-cert-and-key-from-a-virtual-server-to-some-other-service\"\u003eCopy the cert and key from a virtual server to some other service\u003c/h3\u003e\n\u003cp\u003eThe domain to copy the cert from is specified with the \u003ccode\u003e--domain\u003c/code\u003e flag followed by a virtual server name. The services (like \u003ccode\u003edovecot\u003c/code\u003e, \u003ccode\u003epostfix\u003c/code\u003e, \u003ccode\u003emysql\u003c/code\u003e, \u003ccode\u003ewebmin\u003c/code\u003e or \u003ccode\u003eusermin\u003c/code\u003e) to copy it to are set with the \u003ccode\u003e--service\u003c/code\u003e flag, which can be given multiple times.\u003c/p\u003e\n\u003cp\u003eIf the \u003ccode\u003e--add-global\u003c/code\u003e flag is given, the cert will be used as the default for the selected servers. But if \u003ccode\u003e--add-domain\u003c/code\u003e is given, it will only be used for requests to the servers on the domain\u0026rsquo;s hostname or IP address. When configured, the per-domain cert will be used in favor of the global default cert for each service, when a client connects using that domain name.\u003c/p\u003e","title":"install-service-cert"},{"content":"Creates a template for use by new domains This command can be used to create a new virtual server template, whose name is set by the --name parameter. You can either have the template created completely empty (so that all settings inherit from the default template) with the --empty flag, or you can clone an existing template with the --clone flag followed by a template name.\nCommand line help virtualmin create-template --name template-name --empty | --clone original-name ","permalink":"https://www.virtualmin.com/docs/development/api-programs/create-template/","summary":"\u003ch3 id=\"creates-a-template-for-use-by-new-domains\"\u003eCreates a template for use by new domains\u003c/h3\u003e\n\u003cp\u003eThis command can be used to create a new virtual server template, whose name is set by the \u003ccode\u003e--name\u003c/code\u003e parameter. You can either have the template created completely empty (so that all settings inherit from the default template) with the \u003ccode\u003e--empty\u003c/code\u003e flag, or you can clone an existing template with the \u003ccode\u003e--clone\u003c/code\u003e flag followed by a template name.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin create-template --name template-name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                           --empty | --clone original-name\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"create-template"},{"content":"Removes one virtual server template This command can be used to delete a Virtualmin template, specified either by name with the --name parameter, or by ID with the --id flag. Any virtual servers still using the template will be un-effected.\nCommand line help virtualmin delete-template --name template-name | --id template-id ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-template/","summary":"\u003ch3 id=\"removes-one-virtual-server-template\"\u003eRemoves one virtual server template\u003c/h3\u003e\n\u003cp\u003eThis command can be used to delete a Virtualmin template, specified either by name with the \u003ccode\u003e--name\u003c/code\u003e parameter, or by ID with the \u003ccode\u003e--id\u003c/code\u003e flag. Any virtual servers still using the template will be un-effected.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin delete-template --name template-name | --id template-id\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"delete-template"},{"content":"Outputs all settings in a template This command can be used to output all settings in a Virtualmin template, specified either by name with the --name parameter, or by ID with the --id flag. By default only values actually set in the template are output, but you can add the --inherited flag to include settings from the default template too.\nBy default all settings are output, formatted like:\naliascopy: 1 aliasdomslimit: none aliaslimit: none append_style: 6 default: 1 dns: none ... Any newlines in multi-line values are converted to \\n for the output. However, if you select to output just a single setting with the --setting option followed by a setting name, newlines in it\u0026rsquo;s value will not be converted.\nCommand line help virtualmin get-template --name template-name | --id template-id [--setting name] [--inherited] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/get-template/","summary":"\u003ch3 id=\"outputs-all-settings-in-a-template\"\u003eOutputs all settings in a template\u003c/h3\u003e\n\u003cp\u003eThis command can be used to output all settings in a Virtualmin template, specified either by name with the \u003ccode\u003e--name\u003c/code\u003e parameter, or by ID with the \u003ccode\u003e--id\u003c/code\u003e flag. By default only values actually set in the template are output, but you can add the \u003ccode\u003e--inherited\u003c/code\u003e flag to include settings from the default template too.\u003c/p\u003e\n\u003cp\u003eBy default all settings are output, formatted like:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ealiascopy: 1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ealiasdomslimit: none\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ealiaslimit: none\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eappend_style: 6\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edefault: 1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edns: none\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAny newlines in multi-line values are converted to \u003ccode\u003e\\n\u003c/code\u003e for the output. However, if you select to output just a single setting with the \u003ccode\u003e--setting\u003c/code\u003e option followed by a setting name, newlines in it\u0026rsquo;s value will not be converted.\u003c/p\u003e","title":"get-template"},{"content":"Changes one or more settings in a template This command can be used to change several settings in a Virtualmin template, specified either by name with the --name parameter, or by ID with the --id flag.\nThe setting to change is specified with the --setting flag, followed by a template variable name like uquota. Each occurrence of this flag must be followed by the --value parameter, followed by the value to use for the previously named setting.\nMulti-line values can be instead read from a file, by using the --value-file parameter followed by a full path to a file.\nCommand line help virtualmin modify-template --name template-name | --id template-id [--setting name --value newvalue]+ [--fix-options] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-template/","summary":"\u003ch3 id=\"changes-one-or-more-settings-in-a-template\"\u003eChanges one or more settings in a template\u003c/h3\u003e\n\u003cp\u003eThis command can be used to change several settings in a Virtualmin template, specified either by name with the \u003ccode\u003e--name\u003c/code\u003e parameter, or by ID with the \u003ccode\u003e--id\u003c/code\u003e flag.\u003c/p\u003e\n\u003cp\u003eThe setting to change is specified with the \u003ccode\u003e--setting\u003c/code\u003e flag, followed by a template variable name like \u003ccode\u003euquota\u003c/code\u003e. Each occurrence of this flag must be followed by the \u003ccode\u003e--value\u003c/code\u003e parameter, followed by the value to use for the previously named setting.\u003c/p\u003e","title":"modify-template"},{"content":"List available templates for new domains The command simply outputs a list of available templates for use when creating new virtual servers. For each the ID number and description are displayed.\nTo just display the template names, you can give the --name-only parameter. This is useful when iterating through them in other scripts.\nBy default, deleted templates are not included in the list unless you add the --deleted flag.\nCommand line help virtualmin list-templates [--name-only | --multiline] [--deleted] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-templates/","summary":"\u003ch3 id=\"list-available-templates-for-new-domains\"\u003eList available templates for new domains\u003c/h3\u003e\n\u003cp\u003eThe command simply outputs a list of available templates for use when creating new virtual servers. For each the ID number and description are displayed.\u003c/p\u003e\n\u003cp\u003eTo just display the template names, you can give the \u003ccode\u003e--name-only\u003c/code\u003e parameter. This is useful when iterating through them in other scripts.\u003c/p\u003e\n\u003cp\u003eBy default, deleted templates are not included in the list unless you add the \u003ccode\u003e--deleted\u003c/code\u003e flag.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin list-templates [--name-only | --multiline]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                          [--deleted]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"list-templates"},{"content":"Creates a new account plan for use with virtual servers This command allows you to create a new account plan, which defines limits that can be applied to new or existing virtual servers. The only mandatory parameter is --name, which must be followed by a unique name for the plan to create.\nQuotas for virtual servers on the plan can be set with the --quota or --admin-quota flags, followed by a quota in blocks (typically 1k in size). By default, plan quotas are unlimited.\nRestrictions on the number of virtual servers, mailboxes, aliases and databases can be set with the --max-doms, --max-mailbox, --max-alias and --max-dbs parameters, followed by a number. By default, all of these are unlimited.\nAllowed features for new virtual servers can be set with the --features flag, followed by a space-separated feature code list like web dns mail. Similarly, allowed editing capabilities can be set with --capabilities followed by a list of codes like domain users aliases. In both cases, the lists must be a single quoted parameter.\nScripts that virtual servers on the plan can install can be restricted by the --scripts flag, followed by a quoted list of script codes. To find available codes, use the list-available-scripts API command.\nTo create a plan that is owned by a reseller, use the --owner flag followed by an existing reseller name. To limit use of the plan to only some resellers, use --resellers followed by a list of reseller names. Or use --no-resellers to prevent any resellers from seeing it.\nCommand line help virtualmin create-plan --name plan-name [--owner reseller] [--quota blocks] [--admin-quota blocks] [--max-mailbox limit] [--max-alias limit] [--max-dbs limit] [--max-doms limit] [--max-aliasdoms limit] [--max-realdoms limit] [--max-bw limit] [--max-mongrels limit] [--nodbname] [--norename] [--forceunder] [--safeunder] [--migrate] [--features \u0026#34;web dns mail ...\u0026#34; | --no-features] [--capabilities \u0026#34;domain users aliases ...\u0026#34;] [--scripts \u0026#34;name name ...\u0026#34;] [--no-resellers | --resellers \u0026#34;name name..\u0026#34;] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/create-plan/","summary":"\u003ch3 id=\"creates-a-new-account-plan-for-use-with-virtual-servers\"\u003eCreates a new account plan for use with virtual servers\u003c/h3\u003e\n\u003cp\u003eThis command allows you to create a new account plan, which defines limits that can be applied to new or existing virtual servers. The only mandatory parameter is \u003ccode\u003e--name\u003c/code\u003e, which must be followed by a unique name for the plan to create.\u003c/p\u003e\n\u003cp\u003eQuotas for virtual servers on the plan can be set with the \u003ccode\u003e--quota\u003c/code\u003e or \u003ccode\u003e--admin-quota\u003c/code\u003e flags, followed by a quota in blocks (typically 1k in size). By default, plan quotas are unlimited.\u003c/p\u003e","title":"create-plan"},{"content":"Removes one existing account plan The plan to delete is specified either by ID with the --id parameter followed by a numeric ID, or by name with the --name flag.\nDeletion of plans in use by one or more virtual servers is safe, as in this case Virtualmin will merely flag it as deleted and hide it from the plans list.\nCommand line help virtualmin delete-plan --name plan-name | --id plan-id ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-plan/","summary":"\u003ch3 id=\"removes-one-existing-account-plan\"\u003eRemoves one existing account plan\u003c/h3\u003e\n\u003cp\u003eThe plan to delete is specified either by ID with the \u003ccode\u003e--id\u003c/code\u003e parameter followed by a numeric ID, or by name with the \u003ccode\u003e--name\u003c/code\u003e flag.\u003c/p\u003e\n\u003cp\u003eDeletion of plans in use by one or more virtual servers is safe, as in this case Virtualmin will merely flag it as deleted and hide it from the plans list.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin delete-plan --name plan-name | --id plan-id\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"delete-plan"},{"content":"Modifies an existing account plan for use with virtual servers This command allows you to modify the limits for an existing account plan, and optionally apply it to all virtual servers currently on that plan (with the --apply flag). Its parameters are exactly the same as create-plan, so for full documentation you should refer to that command.\nTo change the name of a plan, use the --new-name flag followed by the new name of your choice.\nCommand line help virtualmin modify-plan --name plan-name | --id number [--new-name plan-name] [--owner reseller | --no-owner] [--quota blocks | --no-quota] [--admin-quota blocks | --no-admin-quota] [--max-mailbox limit | --no-max-mailbox] [--max-alias limit | --no-max-alias] [--max-dbs limit | --no-max-dbs] [--max-doms limit | --no-max-doms] [--max-aliasdoms limit | --no-max-aliasdoms] [--max-realdoms limit | --no-max-realdoms] [--max-bw limit | --no-max-bw] [--max-mongrels limit | --no-max-mongrels] [--nodbname | --no-nodbname] [--norename | --no-norename] [--forceunder | --no-forceunder] [--safeunder | --no-safeunder] [--migrate | --no-migrate] [--features \u0026#34;web dns mail ...\u0026#34; | --auto-features | --no-features] [--capabilities \u0026#34;domain users aliases ...\u0026#34; | --auto-capabilities] [--no-resellers | --resellers \u0026#34;name name..\u0026#34; | --all-resellers] [--apply] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-plan/","summary":"\u003ch3 id=\"modifies-an-existing-account-plan-for-use-with-virtual-servers\"\u003eModifies an existing account plan for use with virtual servers\u003c/h3\u003e\n\u003cp\u003eThis command allows you to modify the limits for an existing account plan, and optionally apply it to all virtual servers currently on that plan (with the \u003ccode\u003e--apply\u003c/code\u003e flag). Its parameters are exactly the same as \u003ccode\u003ecreate-plan\u003c/code\u003e, so for full documentation you should refer to that command.\u003c/p\u003e\n\u003cp\u003eTo change the name of a plan, use the \u003ccode\u003e--new-name\u003c/code\u003e flag followed by the new name of your choice.\u003c/p\u003e","title":"modify-plan"},{"content":"List available account plans for new domains The command simply outputs a list of available plans for use when creating new virtual servers, or for applying to existing servers.\nTo just display the plan names, you can give the --name-only parameter. Or to show full details about each plan in a more machine-readable format, use the --multiline option.\nCommand line help virtualmin list-plans [--name-only | --multiline] [--id number | --name \u0026#34;plan name\u0026#34;] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-plans/","summary":"\u003ch3 id=\"list-available-account-plans-for-new-domains\"\u003eList available account plans for new domains\u003c/h3\u003e\n\u003cp\u003eThe command simply outputs a list of available plans for use when creating new virtual servers, or for applying to existing servers.\u003c/p\u003e\n\u003cp\u003eTo just display the plan names, you can give the \u003ccode\u003e--name-only\u003c/code\u003e parameter. Or to show full details about each plan in a more machine-readable format, use the \u003ccode\u003e--multiline\u003c/code\u003e option.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin list-plans [--name-only | --multiline]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                      [--id number | --name \u0026#34;plan name\u0026#34;]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"list-plans"},{"content":"Creates a new S3 bucket This command adds a bucket to Amazon\u0026rsquo;s S3 service. The login and password for S3 must be set using the --access-key and --secret-key flags, unless defaults have been set in the Virtualmin configuration. The --bucket flag must be given to specify the bucket to created.\nCommand line help virtualmin create-s3-bucket [--access-key key] [--secret-key key] --bucket name ","permalink":"https://www.virtualmin.com/docs/development/api-programs/create-s3-bucket/","summary":"\u003ch3 id=\"creates-a-new-s3-bucket\"\u003eCreates a new S3 bucket\u003c/h3\u003e\n\u003cp\u003eThis command adds a bucket to Amazon\u0026rsquo;s S3 service. The login and password for S3 must be set using the \u003ccode\u003e--access-key\u003c/code\u003e and \u003ccode\u003e--secret-key\u003c/code\u003e flags, unless defaults have been set in the Virtualmin configuration. The \u003ccode\u003e--bucket\u003c/code\u003e flag must be given to specify the bucket to created.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin create-s3-bucket [--access-key key]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                            [--secret-key key]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                             --bucket name\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"create-s3-bucket"},{"content":"Deletes an entire S3 bucket This command removes a bucket from Amazon\u0026rsquo;s S3 service. The login and password for S3 must be set using the --access-key and --secret-key flags, unless defaults have been set in the Virtualmin configuration.\nThe --bucket flag must be given to specify the bucket to be removed. To have files in the bucket removed as well, use the --recursive flag.\nCommand line help virtualmin delete-s3-bucket [--access-key key] [--secret-key key] --bucket name [--recursive] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-s3-bucket/","summary":"\u003ch3 id=\"deletes-an-entire-s3-bucket\"\u003eDeletes an entire S3 bucket\u003c/h3\u003e\n\u003cp\u003eThis command removes a bucket from Amazon\u0026rsquo;s S3 service. The login and password for S3 must be set using the \u003ccode\u003e--access-key\u003c/code\u003e and \u003ccode\u003e--secret-key\u003c/code\u003e flags, unless defaults have been set in the Virtualmin configuration.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003e--bucket\u003c/code\u003e flag must be given to specify the bucket to be removed. To have files in the bucket removed as well, use the \u003ccode\u003e--recursive\u003c/code\u003e flag.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin delete-s3-bucket [--access-key key]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                            [--secret-key key]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                             --bucket name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                            [--recursive]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"delete-s3-bucket"},{"content":"Deletes a single file from an S3 bucket This command removes a single file from Amazon\u0026rsquo;s S3 service. The login and password for S3 must be set using the --access-key and --secret-key flags, unless defaults have been set in the Virtualmin configuration.\nThe --bucket flag must be given to specify the bucket the file is stored in, and the --file flag to choose the filename.\nCommand line help virtualmin delete-s3-file [--access-key key] [--secret-key key] --bucket name --file remote-file ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-s3-file/","summary":"\u003ch3 id=\"deletes-a-single-file-from-an-s3-bucket\"\u003eDeletes a single file from an S3 bucket\u003c/h3\u003e\n\u003cp\u003eThis command removes a single file from Amazon\u0026rsquo;s S3 service. The login and password for S3 must be set using the \u003ccode\u003e--access-key\u003c/code\u003e and \u003ccode\u003e--secret-key\u003c/code\u003e flags, unless defaults have been set in the Virtualmin configuration.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003e--bucket\u003c/code\u003e flag must be given to specify the bucket the file is stored in, and the \u003ccode\u003e--file\u003c/code\u003e flag to choose the filename.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin delete-s3-file [--access-key key]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                          [--secret-key key]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                           --bucket name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                           --file remote-file\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"delete-s3-file"},{"content":"Downloads a single file from an S3 bucket This command downloads a single file from Amazon\u0026rsquo;s S3 service to your Virtualmin system. The login and password for S3 must be set using the --access-key and --secret-key flags, unless defaults have been set in the Virtualmin configuration.\nThe --bucket flag must be given to specify the bucket containing the file, the --dest flag to choose the local file to write, and the --file flag to set the source filename.\nCommand line help virtualmin download-s3-file [--access-key key] [--secret-key key] --dest local-file --bucket name [--file remote-file] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/download-s3-file/","summary":"\u003ch3 id=\"downloads-a-single-file-from-an-s3-bucket\"\u003eDownloads a single file from an S3 bucket\u003c/h3\u003e\n\u003cp\u003eThis command downloads a single file from Amazon\u0026rsquo;s S3 service to your Virtualmin system. The login and password for S3 must be set using the \u003ccode\u003e--access-key\u003c/code\u003e and \u003ccode\u003e--secret-key\u003c/code\u003e flags, unless defaults have been set in the Virtualmin configuration.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003e--bucket\u003c/code\u003e flag must be given to specify the bucket containing the file, the \u003ccode\u003e--dest\u003c/code\u003e flag to choose the local file to write, and the \u003ccode\u003e--file\u003c/code\u003e flag to set the source filename.\u003c/p\u003e","title":"download-s3-file"},{"content":"Lists all buckets owned by an S3 account This command queries Amazon\u0026rsquo;s S3 service for the list of all buckets owned by an S3 account. The login and password for S3 must be set using the --access-key and --secret-key flags, unless defaults have been set in the Virtualmin configuration.\nBy default output is in a human-readable table format, but you can switch to a more parsable output format with the --multiline flag. Or to just get a list of filenames, use the --name-only flag.\nCommand line help virtualmin list-s3-buckets [--multiline | --name-only] [--bucket name] [--access-key key] [--secret-key key] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-s3-buckets/","summary":"\u003ch3 id=\"lists-all-buckets-owned-by-an-s3-account\"\u003eLists all buckets owned by an S3 account\u003c/h3\u003e\n\u003cp\u003eThis command queries Amazon\u0026rsquo;s S3 service for the list of all buckets owned by an S3 account. The login and password for S3 must be set using the \u003ccode\u003e--access-key\u003c/code\u003e and \u003ccode\u003e--secret-key\u003c/code\u003e flags, unless defaults have been set in the Virtualmin configuration.\u003c/p\u003e\n\u003cp\u003eBy default output is in a human-readable table format, but you can switch to a more parsable output format with the \u003ccode\u003e--multiline\u003c/code\u003e flag. Or to just get a list of filenames, use the \u003ccode\u003e--name-only\u003c/code\u003e flag.\u003c/p\u003e","title":"list-s3-buckets"},{"content":"Lists files in one S3 bucket This command queries Amazon\u0026rsquo;s S3 service for the list of files in a bucket, specified using the --bucket flag. The login and password for S3 must be set using the --access-key and --secret-key flags, unless defaults have been set in the Virtualmin configuration.\nBy default output is in a human-readable table format, but you can switch to a more parsable output format with the --multiline flag. Or to just get a list of filenames, use the --name-only flag.\nCommand line help virtualmin list-s3-files [--multiline | --name-only] [--access-key key] [--secret-key key] --bucket name ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-s3-files/","summary":"\u003ch3 id=\"lists-files-in-one-s3-bucket\"\u003eLists files in one S3 bucket\u003c/h3\u003e\n\u003cp\u003eThis command queries Amazon\u0026rsquo;s S3 service for the list of files in a bucket, specified using the \u003ccode\u003e--bucket\u003c/code\u003e flag. The login and password for S3 must be set using the \u003ccode\u003e--access-key\u003c/code\u003e and \u003ccode\u003e--secret-key\u003c/code\u003e flags, unless defaults have been set in the Virtualmin configuration.\u003c/p\u003e\n\u003cp\u003eBy default output is in a human-readable table format, but you can switch to a more parsable output format with the \u003ccode\u003e--multiline\u003c/code\u003e flag. Or to just get a list of filenames, use the \u003ccode\u003e--name-only\u003c/code\u003e flag.\u003c/p\u003e","title":"list-s3-files"},{"content":"Uploads a single file to an S3 bucket This command uploads a file from your Virtualmin system to Amazon\u0026rsquo;s S3 service. The login and password for S3 must be set using the --access-key and --secret-key flags, unless defaults have been set in the Virtualmin configuration.\nThe --bucket flag must be given to specify the bucket to store the file in, the --source flag to choose the file to upload, and the --file flag to set the destination filename. The optional --rrs flag can be used to tell S3 that the file should be stored with reduced redundancy, which is cheaper but has a lower reliability SLA.\nBy default, this command will perform a multi-part S3 upload only for files above 2GB in size. However, you can force multi-part mode with the --multipart flag. Amazon requires that files above 5GB in size be multi-part uploaded.\nBy default each S3 operation will only be tried once. However, you can use the --tries flag to have Virtualmin re-try failed operations some number of times.\nCommand line help virtualmin upload-s3-file [--access-key key] [--secret-key key] --source local-file --bucket name [--file remote-file] [--rrs] [--multipart] [--tries count] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/upload-s3-file/","summary":"\u003ch3 id=\"uploads-a-single-file-to-an-s3-bucket\"\u003eUploads a single file to an S3 bucket\u003c/h3\u003e\n\u003cp\u003eThis command uploads a file from your Virtualmin system to Amazon\u0026rsquo;s S3 service. The login and password for S3 must be set using the \u003ccode\u003e--access-key\u003c/code\u003e and \u003ccode\u003e--secret-key\u003c/code\u003e flags, unless defaults have been set in the Virtualmin configuration.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003e--bucket\u003c/code\u003e flag must be given to specify the bucket to store the file in, the \u003ccode\u003e--source\u003c/code\u003e flag to choose the file to upload, and the \u003ccode\u003e--file\u003c/code\u003e flag to set the destination filename. The optional \u003ccode\u003e--rrs\u003c/code\u003e flag can be used to tell S3 that the file should be stored with reduced redundancy, which is cheaper but has a lower reliability SLA.\u003c/p\u003e","title":"upload-s3-file"},{"content":"Creates a new empty Rackspace container This command creates a new container (directory) on Rackspace\u0026rsquo;s Cloud Files service. The login and API key for Rackspace must be set using the --user and --key flags, unless defaults have been set in the Virtualmin configuration.\nThe --container flag must be given to specify the name of the container to create.\nCommand line help virtualmin create-rs-container [--user name] [--key key] --container name ","permalink":"https://www.virtualmin.com/docs/development/api-programs/create-rs-container/","summary":"\u003ch3 id=\"creates-a-new-empty-rackspace-container\"\u003eCreates a new empty Rackspace container\u003c/h3\u003e\n\u003cp\u003eThis command creates a new container (directory) on Rackspace\u0026rsquo;s Cloud Files service. The login and API key for Rackspace must be set using the \u003ccode\u003e--user\u003c/code\u003e and \u003ccode\u003e--key\u003c/code\u003e flags, unless defaults have been set in the Virtualmin configuration.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003e--container\u003c/code\u003e flag must be given to specify the name of the container to create.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin create-rs-container [--user name]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                               [--key key]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                --container name\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"create-rs-container"},{"content":"Deletes an existing Rackspace container This command deletes a container (directory) from Rackspace\u0026rsquo;s Cloud Files service. The login and API key for Rackspace must be set using the --user and --key flags, unless defaults have been set in the Virtualmin configuration.\nThe --container flag must be given to specify the name of the container to remove. The optional --recursive flag tells the command to delete all files in the container first.\nCommand line help virtualmin delete-rs-container [--user name] [--key key] --container name [--recursive] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-rs-container/","summary":"\u003ch3 id=\"deletes-an-existing-rackspace-container\"\u003eDeletes an existing Rackspace container\u003c/h3\u003e\n\u003cp\u003eThis command deletes a container (directory) from Rackspace\u0026rsquo;s Cloud Files service. The login and API key for Rackspace must be set using the \u003ccode\u003e--user\u003c/code\u003e and \u003ccode\u003e--key\u003c/code\u003e flags, unless defaults have been set in the Virtualmin configuration.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003e--container\u003c/code\u003e flag must be given to specify the name of the container to remove. The optional \u003ccode\u003e--recursive\u003c/code\u003e flag tells the command to delete all files in the container first.\u003c/p\u003e","title":"delete-rs-container"},{"content":"Deletes a single file from a Rackspace container This command deletes a file from Rackspace\u0026rsquo;s Cloud Files service. The login and API key for Rackspace must be set using the --user and --key flags, unless defaults have been set in the Virtualmin configuration.\nThe --container flag must be given to specify the container the file is stored in, and the --file flag to determine the name of the file to remove.\nCommand line help virtualmin delete-rs-file [--user name] [--key key] --container name --file remote-file ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-rs-file/","summary":"\u003ch3 id=\"deletes-a-single-file-from-a-rackspace-container\"\u003eDeletes a single file from a Rackspace container\u003c/h3\u003e\n\u003cp\u003eThis command deletes a file from Rackspace\u0026rsquo;s Cloud Files service. The login and API key for Rackspace must be set using the \u003ccode\u003e--user\u003c/code\u003e and \u003ccode\u003e--key\u003c/code\u003e flags, unless defaults have been set in the Virtualmin configuration.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003e--container\u003c/code\u003e flag must be given to specify the container the file is stored in, and the \u003ccode\u003e--file\u003c/code\u003e flag to determine the name of the file to remove.\u003c/p\u003e","title":"delete-rs-file"},{"content":"Downloads a single file from a Rackspace container This command downloads a file to your Virtualmin system from Rackspace\u0026rsquo;s Cloud Files service. The login and API key for Rackspace must be set using the --user and --key flags, unless defaults have been set in the Virtualmin configuration.\nThe --container flag must be given to specify the container the file is stored in, the --dest flag to choose the file to file, and the --file flag to set the source filename.\nCommand line help virtualmin download-rs-file [--user name] [--key key] --dest local-file --container name --file remote-file ","permalink":"https://www.virtualmin.com/docs/development/api-programs/download-rs-file/","summary":"\u003ch3 id=\"downloads-a-single-file-from-a-rackspace-container\"\u003eDownloads a single file from a Rackspace container\u003c/h3\u003e\n\u003cp\u003eThis command downloads a file to your Virtualmin system from Rackspace\u0026rsquo;s Cloud Files service. The login and API key for Rackspace must be set using the \u003ccode\u003e--user\u003c/code\u003e and \u003ccode\u003e--key\u003c/code\u003e flags, unless defaults have been set in the Virtualmin configuration.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003e--container\u003c/code\u003e flag must be given to specify the container the file is stored in, the \u003ccode\u003e--dest\u003c/code\u003e flag to choose the file to file, and the \u003ccode\u003e--file\u003c/code\u003e flag to set the source filename.\u003c/p\u003e","title":"download-rs-file"},{"content":"Lists all containers owned by a Rackspace account This command queries Rackspace\u0026rsquo;s cloud files for the list of all containers owned by a user. The login and API key for Rackspace must be set using the --user and --key flags, unless defaults have been set in the Virtualmin configuration.\nBy default output is in a human-readable table format, but you can switch to a more parsable output format with the --multiline flag. Or to just get a list of filenames, use the --name-only flag.\nCommand line help virtualmin list-rs-containers [--multiline | --name-only] [--user username] [--key api-key] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-rs-containers/","summary":"\u003ch3 id=\"lists-all-containers-owned-by-a-rackspace-account\"\u003eLists all containers owned by a Rackspace account\u003c/h3\u003e\n\u003cp\u003eThis command queries Rackspace\u0026rsquo;s cloud files for the list of all containers owned by a user. The login and API key for Rackspace must be set using the \u003ccode\u003e--user\u003c/code\u003e and \u003ccode\u003e--key\u003c/code\u003e flags, unless defaults have been set in the Virtualmin configuration.\u003c/p\u003e\n\u003cp\u003eBy default output is in a human-readable table format, but you can switch to a more parsable output format with the \u003ccode\u003e--multiline\u003c/code\u003e flag. Or to just get a list of filenames, use the \u003ccode\u003e--name-only\u003c/code\u003e flag.\u003c/p\u003e","title":"list-rs-containers"},{"content":"Lists all files in a container owned by a Rackspace account This command queries Rackspace\u0026rsquo;s cloud files for the list of all files in some container owned by a user. The login and API key for Rackspace must be set using the --user and --key flags, unless defaults have been set in the Virtualmin configuration. The container name must be specified with the --container flag.\nBy default output is in a human-readable table format, but you can switch to a more parsable output format with the --multiline flag. Or to just get a list of filenames, use the --name-only flag.\nCommand line help virtualmin list-rs-files [--multiline | --name-only] [--user username] [--key api-key] --container name ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-rs-files/","summary":"\u003ch3 id=\"lists-all-files-in-a-container-owned-by-a-rackspace-account\"\u003eLists all files in a container owned by a Rackspace account\u003c/h3\u003e\n\u003cp\u003eThis command queries Rackspace\u0026rsquo;s cloud files for the list of all files in some container owned by a user. The login and API key for Rackspace must be set using the \u003ccode\u003e--user\u003c/code\u003e and \u003ccode\u003e--key\u003c/code\u003e flags, unless defaults have been set in the Virtualmin configuration. The container name must be specified with the \u003ccode\u003e--container\u003c/code\u003e flag.\u003c/p\u003e\n\u003cp\u003eBy default output is in a human-readable table format, but you can switch to a more parsable output format with the \u003ccode\u003e--multiline\u003c/code\u003e flag. Or to just get a list of filenames, use the \u003ccode\u003e--name-only\u003c/code\u003e flag.\u003c/p\u003e","title":"list-rs-files"},{"content":"Uploads a single file to a Rackspace container This command uploads a file from your Virtualmin system to Rackspace\u0026rsquo;s Cloud Files service. The login and API key for Rackspace must be set using the --user and --key flags, unless defaults have been set in the Virtualmin configuration.\nThe --container flag must be given to specify the container to store the file in, the --source flag to choose the file to upload, and the --file flag to set the destination filename.\nThe optional --multipart flag can be used to force a multi-part upload. Otherwise only files above 2GB will be uploaded using Rackspace\u0026rsquo;s multi-part upload protocol.\nCommand line help virtualmin upload-rs-file [--user name] [--key key] --source local-file --container name [--file remote-file] [--multipart] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/upload-rs-file/","summary":"\u003ch3 id=\"uploads-a-single-file-to-a-rackspace-container\"\u003eUploads a single file to a Rackspace container\u003c/h3\u003e\n\u003cp\u003eThis command uploads a file from your Virtualmin system to Rackspace\u0026rsquo;s Cloud Files service. The login and API key for Rackspace must be set using the \u003ccode\u003e--user\u003c/code\u003e and \u003ccode\u003e--key\u003c/code\u003e flags, unless defaults have been set in the Virtualmin configuration.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003e--container\u003c/code\u003e flag must be given to specify the container to store the file in, the \u003ccode\u003e--source\u003c/code\u003e flag to choose the file to upload, and the \u003ccode\u003e--file\u003c/code\u003e flag to set the destination filename.\u003c/p\u003e","title":"upload-rs-file"},{"content":"Change a system\u0026rsquo;s Virtualmin license key This program updates all files that we know contain a Virtualmin license key with a new serial and key. The two required parameters are --serial and --key, which of course are followed by a valid Virtualmin Pro serial number and key code respectively. If these are not actually valid, the program will refuse to apply them, unless the --no-check flag is given. If GPL detection must be disabled use the --force-update flag.\nCommand line help virtualmin change-license --serial number --key id [--no-check] [--force-update] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/change-license/","summary":"\u003ch3 id=\"change-a-systems-virtualmin-license-key\"\u003eChange a system\u0026rsquo;s Virtualmin license key\u003c/h3\u003e\n\u003cp\u003eThis program updates all files that we know contain a Virtualmin license key with a new serial and key. The two required parameters are \u003ccode\u003e--serial\u003c/code\u003e and \u003ccode\u003e--key\u003c/code\u003e, which of course are followed by a valid Virtualmin Pro serial number and key code respectively. If these are not actually valid, the program will refuse to apply them, unless the \u003ccode\u003e--no-check\u003c/code\u003e flag is given. If GPL detection must be disabled use the \u003ccode\u003e--force-update\u003c/code\u003e flag.\u003c/p\u003e","title":"change-license"},{"content":"Downgrade Virtualmin Pro system to GPL version If you want to keep using Virtualmin on the same server but no longer need Virtualmin Pro features, use this command to downgrade to Virtualmin GPL instead of uninstalling Virtualmin.\nThis is not a full uninstall. Your existing virtual servers and other GPL-supported services remain in place. The downgrade switches the system to GPL licensing and repositories, replaces the Pro package with the GPL package, removes Pro-only plugins, and locks reseller accounts.\nCommand line help virtualmin downgrade-license The command asks for confirmation before making changes.\nDowngrade changes The Virtualmin license is changed to GPL Virtualmin repositories are switched to the GPL repositories The Virtualmin Pro package is replaced with the GPL package Pro-only plugins such as Virtualmin Support, Virtualmin WP Workbench and Virtualmin Podman are removed Reseller accounts are locked, because reseller management is a Pro-only feature ","permalink":"https://www.virtualmin.com/docs/development/api-programs/downgrade-license/","summary":"\u003ch3 id=\"downgrade-virtualmin-pro-system-to-gpl-version\"\u003eDowngrade Virtualmin Pro system to GPL version\u003c/h3\u003e\n\u003cp\u003eIf you want to keep using Virtualmin on the same server but no longer need Virtualmin Pro features, use this command to downgrade to Virtualmin GPL instead of uninstalling Virtualmin.\u003c/p\u003e\n\u003cp\u003eThis is not a full uninstall. Your existing virtual servers and other GPL-supported services remain in place. The downgrade switches the system to GPL licensing and repositories, replaces the Pro package with the GPL package, removes Pro-only plugins, and locks reseller accounts.\u003c/p\u003e","title":"downgrade-license"},{"content":"Show license counts for this Virtualmin system This command simply outputs the serial number and license key of the current Virtualmin system, and the number of virtual servers that exist and are allowed by the license.\nCommand line help virtualmin license-info ","permalink":"https://www.virtualmin.com/docs/development/api-programs/license-info/","summary":"\u003ch3 id=\"show-license-counts-for-this-virtualmin-system\"\u003eShow license counts for this Virtualmin system\u003c/h3\u003e\n\u003cp\u003eThis command simply outputs the serial number and license key of the current Virtualmin system, and the number of virtual servers that exist and are allowed by the license.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin license-info\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"license-info"},{"content":"Upgrade Virtualmin GPL system to Pro version This program can be used to upgrade Virtualmin GPL system to Professional version.\nThe serial --serial and key --key params must be set to an actual valid license.\nCommand line help virtualmin upgrade-license --serial number --key id ","permalink":"https://www.virtualmin.com/docs/development/api-programs/upgrade-license/","summary":"\u003ch3 id=\"upgrade-virtualmin-gpl-system-to-pro-version\"\u003eUpgrade Virtualmin GPL system to Pro version\u003c/h3\u003e\n\u003cp\u003eThis program can be used to upgrade Virtualmin GPL system to Professional version.\u003c/p\u003e\n\u003cp\u003eThe serial \u003ccode\u003e--serial\u003c/code\u003e and key \u003ccode\u003e--key\u003c/code\u003e params must be set to an actual valid license.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin upgrade-license --serial number\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                           --key id\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"upgrade-license"},{"content":"Setup Virtualmin repositories This command sets up or repairs Virtualmin software repositories.\nBy default, it uses the currently configured branch, or stable if none is set. You can choose a specific branch with --branch stable, --branch prerelease, or --branch unstable, but prerelease and unstable are not recommended for normal users and should only be used for testing or development.\nYou can also update the license serial and key used for Pro repositories by passing --serial and --key. If these are not provided, the existing values in /etc/virtualmin-license will be used. GPL users normally shouldn\u0026rsquo;t use --serial and --key unless they are switching to Virtualmin Pro repositories.\nIf --serial and --key are given and the license is not valid, the command will return an error unless you also pass --no-check.\nCommand line help virtualmin setup-repos [--branch \u0026lt;stable|prerelease|unstable\u0026gt;] [--serial number] [--key id] [--no-check] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/setup-repos/","summary":"\u003ch3 id=\"setup-virtualmin-repositories\"\u003eSetup Virtualmin repositories\u003c/h3\u003e\n\u003cp\u003eThis command sets up or repairs Virtualmin software repositories.\u003c/p\u003e\n\u003cp\u003eBy default, it uses the currently configured branch, or \u003ccode\u003estable\u003c/code\u003e if none is set. You can choose a specific branch with \u003ccode\u003e--branch stable\u003c/code\u003e, \u003ccode\u003e--branch prerelease\u003c/code\u003e, or \u003ccode\u003e--branch unstable\u003c/code\u003e, but \u003cstrong\u003e\u003ccode\u003eprerelease\u003c/code\u003e and \u003ccode\u003eunstable\u003c/code\u003e are not recommended for normal users\u003c/strong\u003e and should only be used for testing or development.\u003c/p\u003e\n\u003cp\u003eYou can also update the license serial and key used for Pro repositories by passing \u003ccode\u003e--serial\u003c/code\u003e and \u003ccode\u003e--key\u003c/code\u003e. If these are not provided, the existing values in \u003ccode\u003e/etc/virtualmin-license\u003c/code\u003e will be used. GPL users normally shouldn\u0026rsquo;t use \u003ccode\u003e--serial\u003c/code\u003e and \u003ccode\u003e--key\u003c/code\u003e unless they are switching to Virtualmin Pro repositories.\u003c/p\u003e","title":"setup-repos"},{"content":"List configuration file revisions from Git This command lists revisions of configuration files stored in the Git repository under /etc/.git. By default, if you do not pass any other options, it shows the latest revision of files under the Virtualmin /etc/webmin/virtual-server configuration directory.\nThis command was previously named list-config-backups. If you see the older name in changelog entries or examples, use list-config-revisions instead. Use --module to limit the search to a single Webmin module, such as virtual-server or fsdump. When a module is selected, each --file value is treated as a path relative to that module directory. Without --module, file paths are treated as relative to /etc, unless you provide an absolute path.\nThe --file option may be given more than once and can point at a single file, a directory, or a glob like domains/*. By default the command shows only the most recent revision, but --depth can be used to display older revisions as well.\nExamples View the latest revision of the Virtualmin module configuration:\nvirtualmin list-config-revisions View the latest revision of the main Virtualmin config file:\nvirtualmin list-config-revisions --module virtual-server --file config View the last two revisions of /etc/hosts and /etc/fstab:\nvirtualmin list-config-revisions --file hosts --file fstab --depth 2 Command line help virtualmin list-config-revisions [--depth \u0026lt;n\u0026gt;] [--file file]* [--module module] [--git-repo \u0026lt;/path/to/.git\u0026gt;] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-config-revisions/","summary":"\u003ch3 id=\"list-configuration-file-revisions-from-git\"\u003eList configuration file revisions from Git\u003c/h3\u003e\n\u003cp\u003eThis command lists revisions of configuration files stored in the Git repository\nunder \u003ccode\u003e/etc/.git\u003c/code\u003e. By default, if you do not pass any other options, it shows\nthe latest revision of files under the Virtualmin\n\u003ccode\u003e/etc/webmin/virtual-server\u003c/code\u003e configuration directory.\u003c/p\u003e\n\n\n\n\n\n      \u003cdiv class=\"alert alert-warning\"\u003e\n        \u003ci class=\"wm wm-fw wm-sm wm-exclamation\"\u003e\u003c/i\u003e \u003cstrong\u003e\u003c/strong\u003e\u003cbr\u003e\n        This command was previously named \u003ccode\u003elist-config-backups\u003c/code\u003e. If you see the older name in changelog entries or examples, use \u003ccode\u003elist-config-revisions\u003c/code\u003e instead.\n      \u003c/div\u003e\n\n\n\u003cp\u003eUse \u003ccode\u003e--module\u003c/code\u003e to limit the search to a single Webmin module, such as\n\u003ccode\u003evirtual-server\u003c/code\u003e or \u003ccode\u003efsdump\u003c/code\u003e. When a module is selected, each \u003ccode\u003e--file\u003c/code\u003e value is\ntreated as a path relative to that module directory. Without \u003ccode\u003e--module\u003c/code\u003e, file\npaths are treated as relative to \u003ccode\u003e/etc\u003c/code\u003e, unless you provide an absolute path.\u003c/p\u003e","title":"list-config-revisions"},{"content":"Restore configuration files from Git revisions This command restores configuration files from the Git repository under /etc/.git. The required --target flag controls where files are written. If the target is /etc, restore will happen directly into the live working tree. That is often the most useful mode when /etc is clean and committed, because you can move to an older revision, test or inspect it, and then restore the newer revision again while keeping the benefits of revision control.\nThis command was previously named restore-config-backups. If you see the older name in changelog entries or examples, use restore-config-revision instead. If the target is any other directory, files are written into date-stamped subdirectories instead. This is mainly useful when you want exported copies outside the live tree, or when you need to inspect revisions on a system where /etc is not clean.\nUse --module to limit the restore to a single Webmin module. When a module is selected, each --file value is treated as relative to that module directory. Without --module, file paths are treated as relative to /etc, unless an absolute path is given. The --file option may be repeated for multiple files or directories.\nBy default the command restores only the most recent revision. With --depth, older revisions are also considered. When restoring to /etc, only the oldest revision at the selected depth is applied. Use --dry-run to preview what would be restored before writing any files.\nExamples Restore the latest Virtualmin module revision into a separate directory for inspection:\nvirtualmin restore-config-revision --module virtual-server --target /root/config-revisions Preview restoring the last five revisions of the main module config file:\nvirtualmin restore-config-revision --depth 5 --module virtual-server \\ --file config --target /root/config-revisions --dry-run Restore the main module config file from ten revisions ago directly into /etc:\nvirtualmin restore-config-revision --depth 10 --module virtual-server \\ --file config --target /etc/ Command line help virtualmin restore-config-revision --target \u0026lt;dir\u0026gt; [--dry-run] [--depth \u0026lt;n\u0026gt;] [--file file]* [--module module] [--git-repo \u0026lt;/path/to/.git\u0026gt;] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/restore-config-revision/","summary":"\u003ch3 id=\"restore-configuration-files-from-git-revisions\"\u003eRestore configuration files from Git revisions\u003c/h3\u003e\n\u003cp\u003eThis command restores configuration files from the Git repository under\n\u003ccode\u003e/etc/.git\u003c/code\u003e. The required \u003ccode\u003e--target\u003c/code\u003e flag controls where files are written. If\nthe target is \u003ccode\u003e/etc\u003c/code\u003e, restore will happen directly into the live working tree.\nThat is often the most useful mode when \u003ccode\u003e/etc\u003c/code\u003e is clean and committed, because\nyou can move to an older revision, test or inspect it, and then restore the\nnewer revision again while keeping the benefits of revision control.\u003c/p\u003e","title":"restore-config-revision"},{"content":"Changes the password of some Virtualmin user Designed to be called from Usermin\u0026rsquo;s Change Passwords module. If you want to change a password from the command line, use the modify-domain command instead.\nCommand line help virtualmin change-password [username] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/change-password/","summary":"\u003ch3 id=\"changes-the-password-of-some-virtualmin-user\"\u003eChanges the password of some Virtualmin user\u003c/h3\u003e\n\u003cp\u003eDesigned to be called from Usermin\u0026rsquo;s Change Passwords module. If you want to change a password from the command line, use the \u003ccode\u003emodify-domain\u003c/code\u003e command instead.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin change-password [username]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"change-password"},{"content":"Run the Virtualmin config check This program checks your system\u0026rsquo;s Virtualmin configuration, outputting the progress of the check as it goes. If any serious problems are found it will halt and display the error found.\nOtherwise, it may also update global settings determined by the Virtualmin configuration, such as Webmin modules granted to domain owners.\nCommand line help virtualmin check-config ","permalink":"https://www.virtualmin.com/docs/development/api-programs/check-config/","summary":"\u003ch3 id=\"run-the-virtualmin-config-check\"\u003eRun the Virtualmin config check\u003c/h3\u003e\n\u003cp\u003eThis program checks your system\u0026rsquo;s Virtualmin configuration, outputting the progress of the check as it goes. If any serious problems are found it will halt and display the error found.\u003c/p\u003e\n\u003cp\u003eOtherwise, it may also update global settings determined by the Virtualmin configuration, such as Webmin modules granted to domain owners.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin check-config\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"check-config"},{"content":"Perform initial configuration of system services This program is used to configure a system for use as a Virtualmin system. It can be used to configure a system for the first time, or to reconfigure a system that has been used for other purposes.\nCommand line help virtualmin config-system --help|-h Print this summary of options and exit --list-bundles|-s List available installation bundles --list-plugins|-p List available plugins --bundle|-b A bundle of plugins to execute --log|-l Path to a file for logging actions --include|-i One or more extra plugins to include --exclude|-x One or more plugins to exclude --test|-t Test services after configured (when available) ","permalink":"https://www.virtualmin.com/docs/development/api-programs/config-system/","summary":"\u003ch3 id=\"perform-initial-configuration-of-system-services\"\u003ePerform initial configuration of system services\u003c/h3\u003e\n\u003cp\u003eThis program is used to configure a system for use as a Virtualmin system. It can be used to configure a system for the first time, or to reconfigure a system that has been used for other purposes.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin config-system  --help|-h          Print this summary of options and exit\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                          --list-bundles|-s  List available installation bundles\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                          --list-plugins|-p  List available plugins\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                          --bundle|-b        A bundle of plugins to execute\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                          --log|-l           Path to a file for logging actions\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                          --include|-i       One or more extra plugins to include\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                          --exclude|-x       One or more plugins to exclude\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                          --test|-t          Test services after configured (when available)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"config-system"},{"content":"Copy mail from one location to another, perhaps converting formats The source mail is specified with the --source flag, and the destination with the --dest parameter. Both must be followed by a full path, which can end with a / to indicate that it is in Maildir format.\nBy default email is just coped, but the --delete flag can be given to have it moved instead.\nCommand line help virtualmin copy-mailbox --source file --dest file [--delete] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/copy-mailbox/","summary":"\u003ch3 id=\"copy-mail-from-one-location-to-another-perhaps-converting-formats\"\u003eCopy mail from one location to another, perhaps converting formats\u003c/h3\u003e\n\u003cp\u003eThe source mail is specified with the \u003ccode\u003e--source\u003c/code\u003e flag, and the destination with the \u003ccode\u003e--dest\u003c/code\u003e parameter. Both must be followed by a full path, which can end with a \u003ccode\u003e/\u003c/code\u003e to indicate that it is in \u003ccode\u003eMaildir\u003c/code\u003e format.\u003c/p\u003e\n\u003cp\u003eBy default email is just coped, but the \u003ccode\u003e--delete\u003c/code\u003e flag can be given to have it moved instead.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin copy-mailbox --source file\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        --dest file\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                        [--delete]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"copy-mailbox"},{"content":"Generates a link that can be used to login to Virtualmin This command can be used to login to Virtualmin as a domain owner without needing to enter a password. When a server is selected with either the --domain or --user flag, a URL will be displayed that when opened in a browser will immediately login as the owner of that server.\nAlternately, you can use the --usermin-user flag to login to Usermin as a mailbox user. This must be followed by the full Unix username of the mailbox.\nIf you want to login as root, use --root flag only.\nCommand line help virtualmin create-login-link [--domain name | --user name | --usermin-user name | --root] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/create-login-link/","summary":"\u003ch3 id=\"generates-a-link-that-can-be-used-to-login-to-virtualmin\"\u003eGenerates a link that can be used to login to Virtualmin\u003c/h3\u003e\n\u003cp\u003eThis command can be used to login to Virtualmin as a domain owner without needing to enter a password. When a server is selected with either the \u003ccode\u003e--domain\u003c/code\u003e or \u003ccode\u003e--user\u003c/code\u003e flag, a URL will be displayed that when opened in a browser will immediately login as the owner of that server.\u003c/p\u003e\n\u003cp\u003eAlternately, you can use the \u003ccode\u003e--usermin-user\u003c/code\u003e flag to login to Usermin as a mailbox user. This must be followed by the full Unix username of the mailbox.\u003c/p\u003e","title":"create-login-link"},{"content":"Adds a web redirect or alias to some domain A redirect maps some URL path like /foo to either a different URL, or a different directory on the same virtual server. This can be used to provide more friendly URL paths on your website, or to cope with the movement of web pages to new locations.\nThis command takes a mandatory --domain parameter, followed by a virtual server\u0026rsquo;s domain name. The --path parameter is also mandatory, and must be followed by a local URL path like /app or even /.\nTo redirect to a different URL, use the --redirect flag followed by a complete URL starting with http or https, or a URL path on this same domain. To map the path to a directory, use the --alias flag followed by a full directory path, ideally under the domain\u0026rsquo;s public_html directory.\nBy default, requests for sub-paths under the URL path will be mapped to the same sub-path in the destination directory or path. However, you can use the --exact flag to only match the given path, or the --regexp flag to ignore sub-paths when redirecting.\nFor domains with both non-SSL and SSL websites, you can use the --http and --https flags to limit the alias or redirect to one website type or the other.\nTo set a custom HTTP status code for the redirect, you can use the --code flag followed by a number. Otherwise the default code of 302 (temporary redirect) will be used.\nCommand line help virtualmin create-redirect --domain domain.name --path url-path --alias directory | --redirect url [--regexp | --exact] [--code number] [--http | --https] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/create-redirect/","summary":"\u003ch3 id=\"adds-a-web-redirect-or-alias-to-some-domain\"\u003eAdds a web redirect or alias to some domain\u003c/h3\u003e\n\u003cp\u003eA redirect maps some URL path like /foo to either a different URL, or a different directory on the same virtual server. This can be used to provide more friendly URL paths on your website, or to cope with the movement of web pages to new locations.\u003c/p\u003e\n\u003cp\u003eThis command takes a mandatory \u003ccode\u003e--domain\u003c/code\u003e parameter, followed by a virtual server\u0026rsquo;s domain name. The \u003ccode\u003e--path\u003c/code\u003e parameter is also mandatory, and must be followed by a local URL path like \u003ccode\u003e/app\u003c/code\u003e or even \u003ccode\u003e/\u003c/code\u003e.\u003c/p\u003e","title":"create-redirect"},{"content":"Adds an IP address for use by multiple virtual servers This command can be used to make an existing IP address on your system available for multiple virtual servers. You must supply the --ip flag, followed by the address of an interface that is already active.\nAlternately, it can select and activate a free IP address with the --allocate-ip and --activate flags. However, you must first have defined an allocation range in the Virtual IP Addresses section of the default server template.\nCommand line help virtualmin create-shared-address --ip address | --allocate-ip [--activate] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/create-shared-address/","summary":"\u003ch3 id=\"adds-an-ip-address-for-use-by-multiple-virtual-servers\"\u003eAdds an IP address for use by multiple virtual servers\u003c/h3\u003e\n\u003cp\u003eThis command can be used to make an existing IP address on your system available for multiple virtual servers. You must supply the \u003ccode\u003e--ip\u003c/code\u003e flag, followed by the address of an interface that is already active.\u003c/p\u003e\n\u003cp\u003eAlternately, it can select and activate a free IP address with the \u003ccode\u003e--allocate-ip\u003c/code\u003e and \u003ccode\u003e--activate\u003c/code\u003e flags. However, you must first have defined an allocation range in the Virtual IP Addresses section of the default server template.\u003c/p\u003e","title":"create-shared-address"},{"content":"Delete one previous logged backup This command removes a Virtualmin backup, which can be identified either using the --id flag followed by a backup log ID (from the list-backup-logs command), or --dest followed by a destination path like /backups/foo.com.tar.gz.\nCommand line help virtualmin delete-backup [--id backup-id] [--dest url] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-backup/","summary":"\u003ch3 id=\"delete-one-previous-logged-backup\"\u003eDelete one previous logged backup\u003c/h3\u003e\n\u003cp\u003eThis command removes a Virtualmin backup, which can be identified either using the \u003ccode\u003e--id\u003c/code\u003e flag followed by a backup log ID (from the \u003ccode\u003elist-backup-logs\u003c/code\u003e command), or \u003ccode\u003e--dest\u003c/code\u003e followed by a destination path like \u003ccode\u003e/backups/foo.com.tar.gz\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin delete-backup [--id backup-id]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                         [--dest url]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"delete-backup"},{"content":"Removes a web redirect or alias from some domain This command deletes one redirect from the virtual server identified by the --domain flag. The redirect to remove must be identified by the --path parameter.\nCommand line help virtualmin delete-redirect --domain domain.name --path url-path ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-redirect/","summary":"\u003ch3 id=\"removes-a-web-redirect-or-alias-from-some-domain\"\u003eRemoves a web redirect or alias from some domain\u003c/h3\u003e\n\u003cp\u003eThis command deletes one redirect from the virtual server identified by the \u003ccode\u003e--domain\u003c/code\u003e flag. The redirect to remove must be identified by the \u003ccode\u003e--path\u003c/code\u003e parameter.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin delete-redirect --domain domain.name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                           --path url-path\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"delete-redirect"},{"content":"Removes an IP address that can be used by virtual servers This command takes a single IP address out of the list available for use by multiple virtual servers, specified with the --ip flag. If the --deactivate flag is also given, the virtual interface associated with the IP will also be shut down.\nCommand line help virtualmin delete-shared-address --ip address [--deactivate] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-shared-address/","summary":"\u003ch3 id=\"removes-an-ip-address-that-can-be-used-by-virtual-servers\"\u003eRemoves an IP address that can be used by virtual servers\u003c/h3\u003e\n\u003cp\u003eThis command takes a single IP address out of the list available for use by multiple virtual servers, specified with the \u003ccode\u003e--ip\u003c/code\u003e flag. If the \u003ccode\u003e--deactivate\u003c/code\u003e flag is also given, the virtual interface associated with the IP will also be shut down.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin delete-shared-address --ip address\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                [--deactivate]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"delete-shared-address"},{"content":"Disable logging via program This command is the opposite enable-writelogs. The domains that it operates on are specified either using the --domain flag (which can appear multiple times), or --all-domains to turn off logging via script for all of them.\nCommand line help virtualmin disable-writelogs --domain name | --all-domains ","permalink":"https://www.virtualmin.com/docs/development/api-programs/disable-writelogs/","summary":"\u003ch3 id=\"disable-logging-via-program\"\u003eDisable logging via program\u003c/h3\u003e\n\u003cp\u003eThis command is the opposite \u003ccode\u003eenable-writelogs\u003c/code\u003e. The domains that it operates on are specified either using the \u003ccode\u003e--domain\u003c/code\u003e flag (which can appear multiple times), or \u003ccode\u003e--all-domains\u003c/code\u003e to turn off logging via script for all of them.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin disable-writelogs --domain name | --all-domains\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"disable-writelogs"},{"content":"Downloads a single file from a Dropbox This command downloads a single file from Dropbox to your Virtualmin system, specified by the --file flag. The destination it will be written to locally is set with the --dest flag.\nCommand line help virtualmin download-dropbox-file --file source-path --dest local-path ","permalink":"https://www.virtualmin.com/docs/development/api-programs/download-dropbox-file/","summary":"\u003ch3 id=\"downloads-a-single-file-from-a-dropbox\"\u003eDownloads a single file from a Dropbox\u003c/h3\u003e\n\u003cp\u003eThis command downloads a single file from Dropbox to your Virtualmin system, specified by the \u003ccode\u003e--file\u003c/code\u003e flag. The destination it will be written to locally is set with the \u003ccode\u003e--dest\u003c/code\u003e flag.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin download-dropbox-file --file source-path\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                 --dest local-path\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"download-dropbox-file"},{"content":"Enable logging via program By default, Virtualmin configures Apache to log to files in each virtual server\u0026rsquo;s home directory, under the logs sub-directory. However, if the domain owner deletes that directory, Apache will be unable to log and will fail to start! To avoid this, Virtualmin can turn on logging via a wrapper script which ignores this problem, which contains the damage. The only cost is a little more memory used by the wrapper programs.\nThe domains that it operates on are specified either using the --domain flag (which can appear multiple times), or --all-domains to turn off logging via script for all of them.\nCommand line help virtualmin enable-writelogs --domain name | --all-domains ","permalink":"https://www.virtualmin.com/docs/development/api-programs/enable-writelogs/","summary":"\u003ch3 id=\"enable-logging-via-program\"\u003eEnable logging via program\u003c/h3\u003e\n\u003cp\u003eBy default, Virtualmin configures Apache to log to files in each virtual server\u0026rsquo;s home directory, under the \u003ccode\u003elogs\u003c/code\u003e sub-directory. However, if the domain owner deletes that directory, Apache will be unable to log and will fail to start! To avoid this, Virtualmin can turn on logging via a wrapper script which ignores this problem, which contains the damage. The only cost is a little more memory used by the wrapper programs.\u003c/p\u003e","title":"enable-writelogs"},{"content":"Set correct permissions on a domain\u0026rsquo;s home directory This command ensures that the ownership and permissions on one or more virtual server\u0026rsquo;s home directories are correct. It can be run either with the --all-domains flag to update all virtual servers, or --domain followed by a single domain name. To include sub-servers of selected domains, you can also add the --subservers flag.\nCommand line help virtualmin fix-domain-permissions --domain name | --all-domains [--subservers] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/fix-domain-permissions/","summary":"\u003ch3 id=\"set-correct-permissions-on-a-domains-home-directory\"\u003eSet correct permissions on a domain\u0026rsquo;s home directory\u003c/h3\u003e\n\u003cp\u003eThis command ensures that the ownership and permissions on one or more virtual server\u0026rsquo;s home directories are correct. It can be run either with the \u003ccode\u003e--all-domains\u003c/code\u003e flag to update all virtual servers, or \u003ccode\u003e--domain\u003c/code\u003e followed by a single domain name. To include sub-servers of selected domains, you can also add the \u003ccode\u003e--subservers\u003c/code\u003e flag.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin fix-domain-permissions --domain name | --all-domains\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                 [--subservers]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"fix-domain-permissions"},{"content":"Set the Unix quotas for some domains to match the Virtualmin configuration This command can be used to bring the Unix quotas for domain owners back into sync with what Virtualmin expects, if the quota file has been lose or manually edited. It can be run either with the --all-domains flag to update all virtual servers, or --domain followed by a single domain name.\nCommand line help virtualmin fix-domain-quota --domain name | --all-domains ","permalink":"https://www.virtualmin.com/docs/development/api-programs/fix-domain-quota/","summary":"\u003ch3 id=\"set-the-unix-quotas-for-some-domains-to-match-the-virtualmin-configuration\"\u003eSet the Unix quotas for some domains to match the Virtualmin configuration\u003c/h3\u003e\n\u003cp\u003eThis command can be used to bring the Unix quotas for domain owners back into sync with what Virtualmin expects, if the quota file has been lose or manually edited. It can be run either with the \u003ccode\u003e--all-domains\u003c/code\u003e flag to update all virtual servers, or \u003ccode\u003e--domain\u003c/code\u003e followed by a single domain name.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin fix-domain-quota --domain name | --all-domains\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"fix-domain-quota"},{"content":"Show information about some command This command outputs information about another API command, such as its supported command-line parameters. It is designed for use by developers writing their own API on top of the Virtualmin remote API.\nCommand line help virtualmin get-command --command name ","permalink":"https://www.virtualmin.com/docs/development/api-programs/get-command/","summary":"\u003ch3 id=\"show-information-about-some-command\"\u003eShow information about some command\u003c/h3\u003e\n\u003cp\u003eThis command outputs information about another API command, such as its supported command-line parameters. It is designed for use by developers writing their own API on top of the Virtualmin remote API.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin get-command --command name\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"get-command"},{"content":"Output all DNS records for a domain For virtual servers with DNS enabled, this command provides an easy way to see what DNS records currently exist. The server is specified with the --domain flag, followed by a domain name.\nBy default, output is in a human-readable table format. However, you can choose to a more easily parsed and complete format with the --multiline flag, or get a list of just record names with the --name-only option.\nNormally the command will output all the DNS records in the domain\u0026rsquo;s zone file, except those used for DNSSEC, but you can request to show only the DNSSEC DS records that should be created in the registrar\u0026rsquo;s zone with the --ds-records flag. Or you can choose to have DNSSEC records included in the output with --dnssec-records.\nBy default the command will list all records, but you can limit it to records with a specific name via the --name flag. Similarly you can limit by type (A, CNAME, MX, etc) with the --type flag.\nCommand line help virtualmin get-dns --domain name [--ds-records] [--dnssec-records] [--multiline | --name-only] [--name record-name | --regexp name-pattern] [--type A|AAAA|CNAME|MX|NS|TXT] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/get-dns/","summary":"\u003ch3 id=\"output-all-dns-records-for-a-domain\"\u003eOutput all DNS records for a domain\u003c/h3\u003e\n\u003cp\u003eFor virtual servers with DNS enabled, this command provides an easy way to see what DNS records currently exist. The server is specified with the \u003ccode\u003e--domain\u003c/code\u003e flag, followed by a domain name.\u003c/p\u003e\n\u003cp\u003eBy default, output is in a human-readable table format. However, you can choose to a more easily parsed and complete format with the \u003ccode\u003e--multiline\u003c/code\u003e flag, or get a list of just record names with the \u003ccode\u003e--name-only\u003c/code\u003e option.\u003c/p\u003e","title":"get-dns"},{"content":"Output webserver logs for a domain Given a domain name with the --domain flag, this command outputs some or all of it\u0026rsquo;s Apache access or error log. The log file to display can be selected with the --access-log, --error-log or --ftp-log flag, and the number of lines to output can be limited with the --tail flag followed by a line count.\nCommand line help virtualmin get-logs --domain name --access-log | --error-log | --ftp-log [--tail lines] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/get-logs/","summary":"\u003ch3 id=\"output-webserver-logs-for-a-domain\"\u003eOutput webserver logs for a domain\u003c/h3\u003e\n\u003cp\u003eGiven a domain name with the \u003ccode\u003e--domain\u003c/code\u003e flag, this command outputs some or all of it\u0026rsquo;s Apache access or error log. The log file to display can be selected with the \u003ccode\u003e--access-log\u003c/code\u003e, \u003ccode\u003e--error-log\u003c/code\u003e or \u003ccode\u003e--ftp-log\u003c/code\u003e flag, and the number of lines to output can be limited with the \u003ccode\u003e--tail\u003c/code\u003e flag followed by a line count.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin get-logs --domain name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    --access-log | --error-log | --ftp-log\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                   [--tail lines]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"get-logs"},{"content":"Output SSL certificate information for a domain Given a domain name with the --domain flag, this command outputs information about the SSL certificate currently in use by that virtual server.\nIf the --chain flag is given, details of the CA certificate will be shown instead (if there is one).\nCommand line help virtualmin get-ssl --domain name [--chain] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/get-ssl/","summary":"\u003ch3 id=\"output-ssl-certificate-information-for-a-domain\"\u003eOutput SSL certificate information for a domain\u003c/h3\u003e\n\u003cp\u003eGiven a domain name with the \u003ccode\u003e--domain\u003c/code\u003e flag, this command outputs information about the SSL certificate currently in use by that virtual server.\u003c/p\u003e\n\u003cp\u003eIf the \u003ccode\u003e--chain\u003c/code\u003e flag is given, details of the CA certificate will be shown instead (if there is one).\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin get-ssl --domain name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                  [--chain]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"get-ssl"},{"content":"Show general information about this Virtualmin system This command is useful when debugging or configuring a system that you don\u0026rsquo;t know much about, to fetch general information about Webmin, Virtualmin, IP usage and installed programs.\nBy default it outputs all available data, most of which is generated by Virtualmin\u0026rsquo;s background collection job that runs every 5 minutes. However, you can limit it to a subset by adding command like parameters corresponding to sections of the full output, for example:\n~# virtualmin info host host: hostname: hostname.example.com module root: /usr/share/webmin/virtual-server os: Ubuntu Linux 22.04.2 root: /usr/share/webmin theme version: 21.10 virtualmin version: 7.9.0.pro-1 webmin version: 2.105 Command line help virtualmin info [--search cpu|disk_free|disk_fs|disk_total|disk_used|fcount|ftypes|host|io|ips|ips6|kernel|load|maxquota|mem|poss|procs|progs|reboot|status|vpos] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/info/","summary":"\u003ch3 id=\"show-general-information-about-this-virtualmin-system\"\u003eShow general information about this Virtualmin system\u003c/h3\u003e\n\u003cp\u003eThis command is useful when debugging or configuring a system that you don\u0026rsquo;t know much about, to fetch general information about Webmin, Virtualmin, IP usage and installed programs.\u003c/p\u003e\n\u003cp\u003eBy default it outputs all available data, most of which is generated by Virtualmin\u0026rsquo;s background collection job that runs every 5 minutes. However, you can limit it to a subset by adding command like parameters corresponding to sections of the full output, for example:\u003c/p\u003e","title":"info"},{"content":"Outputs a list of backups that have been run This command by default outputs logs of all backups made using Virtualmin, in a simple table format. To switch to a more detailed and parsable output format, add the --multiline flag to the command line.\nTo limit the display to backups that contain a specific domain, use the --domain flag followed by a virtual server name.\nTo limit to backups made by a particular Virtualmin user, use the --user flag followed by a username.\nTo only show backups made via the web UI, use the --mode cgi flag. To show scheduled backups, use --mode sched. Or to show backups made from the command line or remote API, use --mode api.\nTo only show backups that failed, add the --failed flag to the command line. Or to show backups that worked, use --succeeded. By default both are shown.\nTo limit the display to backups within some time range, use the --start flag followed by a date in yyyy-mm-dd format to only show backups that started on or after this date. Or use --end to only show backups that started before the following date.\nCommand line help virtualmin list-backup-logs [--domain domain.name | [--user name] [--failed | --succeeded] [--mode \u0026#34;cgi\u0026#34;|\u0026#34;sched\u0026#34;|\u0026#34;api\u0026#34;] [--start yyyy-mm-dd] [--end yyyy-mm-dd] [--multiline] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-backup-logs/","summary":"\u003ch3 id=\"outputs-a-list-of-backups-that-have-been-run\"\u003eOutputs a list of backups that have been run\u003c/h3\u003e\n\u003cp\u003eThis command by default outputs logs of all backups made using Virtualmin, in a simple table format. To switch to a more detailed and parsable output format, add the \u003ccode\u003e--multiline\u003c/code\u003e flag to the command line.\u003c/p\u003e\n\u003cp\u003eTo limit the display to backups that contain a specific domain, use the \u003ccode\u003e--domain\u003c/code\u003e flag followed by a virtual server name.\u003c/p\u003e\n\u003cp\u003eTo limit to backups made by a particular Virtualmin user, use the \u003ccode\u003e--user\u003c/code\u003e flag followed by a username.\u003c/p\u003e","title":"list-backup-logs"},{"content":"Shows bandwidth usage for some domain over a date range This command is useful for dumping bandwidth data of Virtualmin (usually used to draw graphs) in CSV format for importing into other programs. This is useful for implementing your own billing system, or generating your own graphs.\nThe domains to dump stats for are selected by either the --domain parameter, which can occur multiple times and which must be followed by a virtual server domain name, or --all-domains to show them all. To include usage by sub-servers of the selected domains, use the --include-subservers flag.\nThe date range to output stats for are selected with the optional --start and --end flags, each of which must be followed by a date formatted like 2001-09-16. If omitted, all available bandwidth information for the domains selected is displayed.\nCommand line help virtualmin list-bandwidth --domain name | --all-domains [--start yyyy-mm-dd] [--end yyyy-mm-dd] [--include-subservers] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-bandwidth/","summary":"\u003ch3 id=\"shows-bandwidth-usage-for-some-domain-over-a-date-range\"\u003eShows bandwidth usage for some domain over a date range\u003c/h3\u003e\n\u003cp\u003eThis command is useful for dumping bandwidth data of Virtualmin (usually used to draw graphs) in CSV format for importing into other programs. This is useful for implementing your own billing system, or generating your own graphs.\u003c/p\u003e\n\u003cp\u003eThe domains to dump stats for are selected by either the \u003ccode\u003e--domain\u003c/code\u003e parameter, which can occur multiple times and which must be followed by a virtual server domain name, or \u003ccode\u003e--all-domains\u003c/code\u003e to show them all. To include usage by sub-servers of the selected domains, use the \u003ccode\u003e--include-subservers\u003c/code\u003e flag.\u003c/p\u003e","title":"list-bandwidth"},{"content":"Lists API scripts available This command lists all API commands available, categorized by type and with a brief summary of each. It is used to produce the output from the Virtualmin --help command. By default the output is in a human-readable format, but you can switch to a more parsable format with the --multiline flag.\nCommand line help virtualmin list-commands [--short] [--multiline | --name-only] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-commands/","summary":"\u003ch3 id=\"lists-api-scripts-available\"\u003eLists API scripts available\u003c/h3\u003e\n\u003cp\u003eThis command lists all API commands available, categorized by type and with a brief summary of each. It is used to produce the output from the Virtualmin \u003ccode\u003e--help\u003c/code\u003e command. By default the output is in a human-readable format, but you can switch to a more parsable format with the \u003ccode\u003e--multiline\u003c/code\u003e flag.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin list-commands [--short]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                         [--multiline | --name-only]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"list-commands"},{"content":"Lists all files under a Dropbox path This command lists all files under a path owner by the cloud storage account currently configured for use by Virtualmin, specified by the --path flag.\nBy default output is in a human-readable table format, but you can switch to a more parsable output format with the --multiline flag. Or to just get a list of filenames, use the --name-only flag.\nCommand line help virtualmin list-dropbox-files [--multiline | --name-only] [--path dir] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-dropbox-files/","summary":"\u003ch3 id=\"lists-all-files-under-a-dropbox-path\"\u003eLists all files under a Dropbox path\u003c/h3\u003e\n\u003cp\u003eThis command lists all files under a path owner by the cloud storage account currently configured for use by Virtualmin, specified by the \u003ccode\u003e--path\u003c/code\u003e flag.\u003c/p\u003e\n\u003cp\u003eBy default output is in a human-readable table format, but you can switch to a more parsable output format with the \u003ccode\u003e--multiline\u003c/code\u003e flag. Or to just get a list of filenames, use the \u003ccode\u003e--name-only\u003c/code\u003e flag.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin list-dropbox-files [--multiline | --name-only]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                              [--path dir]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"list-dropbox-files"},{"content":"Lists features available when creating a domain This command outputs information about Virtualmin features that are available on this system. It is useful for scripts that are designed to run on many systems and need to check if some feature is available before creating a virtual server or enabling it for a domain.\nBy default it lists features available for new top-level servers. However, you can limit it to those that are available for a sub-server with the --parent flag, followed by a top-level server name. Similarly, the --alias and --subdom flags can be used to show features for an alias or sub-domain respectively.\nOutput is in table format by default, but you can switch to a more detailed and easily parsed list with the --multiline flag. Or to just get a list of feature codes, use the --name-only parameter.\nCommand line help virtualmin list-features [--multiline | --name-only] [--parent name | --subdom name | --alias name] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-features/","summary":"\u003ch3 id=\"lists-features-available-when-creating-a-domain\"\u003eLists features available when creating a domain\u003c/h3\u003e\n\u003cp\u003eThis command outputs information about Virtualmin features that are available on this system. It is useful for scripts that are designed to run on many systems and need to check if some feature is available before creating a virtual server or enabling it for a domain.\u003c/p\u003e\n\u003cp\u003eBy default it lists features available for new top-level servers. However, you can limit it to those that are available for a sub-server with the \u003ccode\u003e--parent\u003c/code\u003e flag, followed by a top-level server name. Similarly, the \u003ccode\u003e--alias\u003c/code\u003e and \u003ccode\u003e--subdom\u003c/code\u003e flags can be used to show features for an alias or sub-domain respectively.\u003c/p\u003e","title":"list-features"},{"content":"Lists all buckets owned by the Google Cloud Storage This command lists all buckets under the cloud storage account currently configured for use by Virtualmin. However, you can select a specific bucket to show with the --bucket flag.\nBy default output is in a human-readable table format, but you can switch to a more parsable output format with the --multiline flag. Or to just get a list of filenames, use the --name-only flag.\nCommand line help virtualmin list-gcs-buckets [--multiline | --name-only] [--bucket name] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-gcs-buckets/","summary":"\u003ch3 id=\"lists-all-buckets-owned-by-the-google-cloud-storage\"\u003eLists all buckets owned by the Google Cloud Storage\u003c/h3\u003e\n\u003cp\u003eThis command lists all buckets under the cloud storage account currently configured for use by Virtualmin. However, you can select a specific bucket to show with the \u003ccode\u003e--bucket\u003c/code\u003e flag.\u003c/p\u003e\n\u003cp\u003eBy default output is in a human-readable table format, but you can switch to a more parsable output format with the \u003ccode\u003e--multiline\u003c/code\u003e flag. Or to just get a list of filenames, use the \u003ccode\u003e--name-only\u003c/code\u003e flag.\u003c/p\u003e","title":"list-gcs-buckets"},{"content":"Lists all files in a Google Cloud Storage bucket This command lists all files in a bucket under the cloud storage account currently configured for use by Virtualmin, specified by the --bucket flag.\nBy default output is in a human-readable table format, but you can switch to a more parsable output format with the --multiline flag. Or to just get a list of filenames, use the --name-only flag.\nCommand line help virtualmin list-gcs-files [--multiline | --name-only] --bucket name ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-gcs-files/","summary":"\u003ch3 id=\"lists-all-files-in-a-google-cloud-storage-bucket\"\u003eLists all files in a Google Cloud Storage bucket\u003c/h3\u003e\n\u003cp\u003eThis command lists all files in a bucket under the cloud storage account currently configured for use by Virtualmin, specified by the \u003ccode\u003e--bucket\u003c/code\u003e flag.\u003c/p\u003e\n\u003cp\u003eBy default output is in a human-readable table format, but you can switch to a more parsable output format with the \u003ccode\u003e--multiline\u003c/code\u003e flag. Or to just get a list of filenames, use the \u003ccode\u003e--name-only\u003c/code\u003e flag.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin list-gcs-files [--multiline | --name-only]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                           --bucket name\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"list-gcs-files"},{"content":"Lists all registered remote MySQL servers This command lists all registered MySQL servers that can be used for remote database hosting. Use the --name-only flag to just list hostnames, or --multiline to show full details of each server.\nCommand line help virtualmin list-mysql-servers [--multiline] [--name-only] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-mysql-servers/","summary":"\u003ch3 id=\"lists-all-registered-remote-mysql-servers\"\u003eLists all registered remote MySQL servers\u003c/h3\u003e\n\u003cp\u003eThis command lists all registered MySQL servers that can be used for remote database hosting. Use the \u003ccode\u003e--name-only\u003c/code\u003e flag to just list hostnames, or \u003ccode\u003e--multiline\u003c/code\u003e to show full details of each server.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin list-mysql-servers [--multiline]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                              [--name-only]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"list-mysql-servers"},{"content":"Show PHP variables for some or all domains This command can be used to list the value of a PHP configuration variable (set in the php.ini file) for one or many virtual servers at once. The servers to update can be selected with the --domain or --user flags, or you can choose to modify them all with the --all-domains option.\nIf your system supports multiple PHP versions, you can limit the changes to the config for a specific version with the --php-version flag followed by a number, like 7.4 or 8.2.\nThe variables to show are set with the --ini-name flag, which can be given multiple times to list more than one variable.\nCommand line help virtualmin list-php-ini --domain name | --user name | --all-domains [--php-version number] \u0026lt;--ini-name name\u0026gt;+ \u0026lt;--ini-value value\u0026gt;+ [--name-only] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-php-ini/","summary":"\u003ch3 id=\"show-php-variables-for-some-or-all-domains\"\u003eShow PHP variables for some or all domains\u003c/h3\u003e\n\u003cp\u003eThis command can be used to list the value of a PHP configuration variable (set in the php.ini file) for one or many virtual servers at once. The servers to update can be selected with the \u003ccode\u003e--domain\u003c/code\u003e or \u003ccode\u003e--user\u003c/code\u003e flags, or you can choose to modify them all with the \u003ccode\u003e--all-domains\u003c/code\u003e option.\u003c/p\u003e\n\u003cp\u003eIf your system supports multiple PHP versions, you can limit the changes to the config for a specific version with the \u003ccode\u003e--php-version\u003c/code\u003e flag followed by a number, like 7.4 or 8.2.\u003c/p\u003e","title":"list-php-ini"},{"content":"Lists the available PHP versions on this system This command simply outputs a table of the installed PHP versions on your system. Use the --name-only flag to limit the output to version numbers only, or --multiline to show more details. By default only the base version numbers are shown, but you can switch to showing the complete version with the --full-version flag.\nBy default all versions available on the system will be shown, but you can limit the list to those available for one virtual server with the --domain flag.\nCommand line help virtualmin list-php-versions [--name-only | --multiline] [--domain name] [--full-version] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-php-versions/","summary":"\u003ch3 id=\"lists-the-available-php-versions-on-this-system\"\u003eLists the available PHP versions on this system\u003c/h3\u003e\n\u003cp\u003eThis command simply outputs a table of the installed PHP versions on your system. Use the \u003ccode\u003e--name-only\u003c/code\u003e flag to limit the output to version numbers only, or \u003ccode\u003e--multiline\u003c/code\u003e to show more details. By default only the base version numbers are shown, but you can switch to showing the complete version with the \u003ccode\u003e--full-version\u003c/code\u003e flag.\u003c/p\u003e\n\u003cp\u003eBy default all versions available on the system will be shown, but you can limit the list to those available for one virtual server with the \u003ccode\u003e--domain\u003c/code\u003e flag.\u003c/p\u003e","title":"list-php-versions"},{"content":"Lists TCP ports associated with some virtual server This command lists all TCP ports in use by or allowed to be used by the virtual server selected with the --domain flag. To output a list of just port numbers, use the --port-only flag. Or to show the full details of each port, use --multiline.\nCommand line help virtualmin list-ports --domain name [--multiline] [--port-only] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-ports/","summary":"\u003ch3 id=\"lists-tcp-ports-associated-with-some-virtual-server\"\u003eLists TCP ports associated with some virtual server\u003c/h3\u003e\n\u003cp\u003eThis command lists all TCP ports in use by or allowed to be used by the virtual server selected with the \u003ccode\u003e--domain\u003c/code\u003e flag. To output a list of just port numbers, use the \u003ccode\u003e--port-only\u003c/code\u003e flag. Or to show the full details of each port, use \u003ccode\u003e--multiline\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin list-ports --domain name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                     [--multiline]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                     [--port-only]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"list-ports"},{"content":"Lists web redirects and aliases in some domain This command lists all the aliases configured for some domain identified by the --domain parameter. By default the list is in a reader-friendly table format, but can be switched to a more complete and parsable output with the --multiline flag. Or you can have just the alias paths listed with the --name-only parameter.\nCommand line help virtualmin list-redirects --domain domain.name [--multiline | --name-only] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-redirects/","summary":"\u003ch3 id=\"lists-web-redirects-and-aliases-in-some-domain\"\u003eLists web redirects and aliases in some domain\u003c/h3\u003e\n\u003cp\u003eThis command lists all the aliases configured for some domain identified by the \u003ccode\u003e--domain\u003c/code\u003e parameter. By default the list is in a reader-friendly table format, but can be switched to a more complete and parsable output with the \u003ccode\u003e--multiline\u003c/code\u003e flag. Or you can have just the alias paths listed with the \u003ccode\u003e--name-only\u003c/code\u003e parameter.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin list-redirects --domain domain.name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                         [--multiline | --name-only]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"list-redirects"},{"content":"Outputs the status of all servers managed by Virtualmin This command checks the status of your system\u0026rsquo;s web server, mail server, DNS and others, and reports it.\nCommand line help virtualmin list-server-statuses ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-server-statuses/","summary":"\u003ch3 id=\"outputs-the-status-of-all-servers-managed-by-virtualmin\"\u003eOutputs the status of all servers managed by Virtualmin\u003c/h3\u003e\n\u003cp\u003eThis command checks the status of your system\u0026rsquo;s web server, mail server, DNS and others, and reports it.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin list-server-statuses\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"list-server-statuses"},{"content":"Output a virtual server\u0026rsquo;s certificates used by other services The only required flag is --domain, which must be followed by the domain name to display service certificates for. The optional --multiline param determines if full details of each service are displayed or not.\nCommand line help virtualmin list-service-certs --domain name [--multiline] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-service-certs/","summary":"\u003ch3 id=\"output-a-virtual-servers-certificates-used-by-other-services\"\u003eOutput a virtual server\u0026rsquo;s certificates used by other services\u003c/h3\u003e\n\u003cp\u003eThe only required flag is \u003ccode\u003e--domain\u003c/code\u003e, which must be followed by the domain name to display service certificates for. The optional \u003ccode\u003e--multiline\u003c/code\u003e param determines if full details of each service are displayed or not.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin list-service-certs --domain name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                             [--multiline]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"list-service-certs"},{"content":"Lists shared IP addresses for virtual servers This command outputs a list of shared IP addresses that can be used by new or existing virtual servers.\nOutput is in table format by default, but you can switch to a more detailed and easily parsed list with the --multiline flag. Or to just get a list of addresses, use the --name-only parameter.\nCommand line help virtualmin list-shared-addresses [--multiline | --name-only] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-shared-addresses/","summary":"\u003ch3 id=\"lists-shared-ip-addresses-for-virtual-servers\"\u003eLists shared IP addresses for virtual servers\u003c/h3\u003e\n\u003cp\u003eThis command outputs a list of shared IP addresses that can be used by new or existing virtual servers.\u003c/p\u003e\n\u003cp\u003eOutput is in table format by default, but you can switch to a more detailed and easily parsed list with the \u003ccode\u003e--multiline\u003c/code\u003e flag. Or to just get a list of addresses, use the \u003ccode\u003e--name-only\u003c/code\u003e parameter.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin list-shared-addresses [--multiline | --name-only]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"list-shared-addresses"},{"content":"Update all virtual servers with a new IP address This command updates all virtual servers using the IP address specified with the --old-ip flag, and switches them to using the IP set by --new-ip. It can be useful if your system\u0026rsquo;s IP address has just changed, for example if it is dynamically assigned or was moved to a new network.\nFor convenience, the flag --default-old-ip can be used instead of --old-ip to select the default address used before the last update. Similarly, the flag --detect-new-ip can be used instead of --new-ip to automatically discover the system\u0026rsquo;s current default address.\nCommand line help virtualmin modify-all-ips [--old-ip address | --default-old-ip] [--new-ip address | --detect-new-ip] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-all-ips/","summary":"\u003ch3 id=\"update-all-virtual-servers-with-a-new-ip-address\"\u003eUpdate all virtual servers with a new IP address\u003c/h3\u003e\n\u003cp\u003eThis command updates all virtual servers using the IP address specified with the \u003ccode\u003e--old-ip\u003c/code\u003e flag, and switches them to using the IP set by \u003ccode\u003e--new-ip\u003c/code\u003e. It can be useful if your system\u0026rsquo;s IP address has just changed, for example if it is dynamically assigned or was moved to a new network.\u003c/p\u003e\n\u003cp\u003eFor convenience, the flag \u003ccode\u003e--default-old-ip\u003c/code\u003e can be used instead of \u003ccode\u003e--old-ip\u003c/code\u003e to select the default address used before the last update. Similarly, the flag \u003ccode\u003e--detect-new-ip\u003c/code\u003e can be used instead of \u003ccode\u003e--new-ip\u003c/code\u003e to automatically discover the system\u0026rsquo;s current default address.\u003c/p\u003e","title":"modify-all-ips"},{"content":"Changes the MySQL/MariaDB or PostgreSQL password for some domain This command changes the password that a domain\u0026rsquo;s administrator uses to login to MySQL/MariaDB or PostgreSQL. The domain is selected with the --domain flag, the database type with --type and the new password is set with the --pass flag.\nBecause this operation will change the actual MySQL/MariaDB or PostgreSQL password, any application or scripts in the virtual server\u0026rsquo;s directory that have the database password in their configuration files will be broken until those configurations are updated with the new username.\nCommand line help virtualmin modify-database-pass --domain name --type mysql|postgres --pass new password ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-database-pass/","summary":"\u003ch3 id=\"changes-the-mysqlmariadb-or-postgresql-password-for-some-domain\"\u003eChanges the MySQL/MariaDB or PostgreSQL password for some domain\u003c/h3\u003e\n\u003cp\u003eThis command changes the password that a domain\u0026rsquo;s administrator uses to login to MySQL/MariaDB or PostgreSQL. The domain is selected with the \u003ccode\u003e--domain\u003c/code\u003e flag, the database type with \u003ccode\u003e--type\u003c/code\u003e and the new password is set with the \u003ccode\u003e--pass\u003c/code\u003e flag.\u003c/p\u003e\n\u003cp\u003eBecause this operation will change the actual MySQL/MariaDB or PostgreSQL password, any application or scripts in the virtual server\u0026rsquo;s directory that have the database password in their configuration files will be broken until those configurations are updated with the new username.\u003c/p\u003e","title":"modify-database-pass"},{"content":"Changes PHP variables for some or all domains This command can be used to change the value of a PHP configuration variable (set in the php.ini file and Apache configuration) for one or many virtual servers at once. The servers to update can be selected with the --domain or --user flags, or you can choose to modify them all with the --all-domains option.\nIf your system supports multiple PHP versions, you can limit the changes to the config for a specific version with the --php-version flag followed by a number, like 7.4 or 8.2.\nThe variables to change are set with the --ini-name flag, which can be given multiple times to change more than one variable. The new values are set either with the --ini-value flag (followed by a number or string), or the --no-ini-value flag to completely remove a setting.\nCommand line help virtualmin modify-php-ini --domain name | --user name | --all-domains [--php-version number] \u0026lt;--ini-name name\u0026gt;+ \u0026lt;--ini-value value\u0026gt;+ ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-php-ini/","summary":"\u003ch3 id=\"changes-php-variables-for-some-or-all-domains\"\u003eChanges PHP variables for some or all domains\u003c/h3\u003e\n\u003cp\u003eThis command can be used to change the value of a PHP configuration variable (set in the \u003ccode\u003ephp.ini\u003c/code\u003e file and Apache configuration) for one or many virtual servers at once. The servers to update can be selected with the \u003ccode\u003e--domain\u003c/code\u003e or \u003ccode\u003e--user\u003c/code\u003e flags, or you can choose to modify them all with the \u003ccode\u003e--all-domains\u003c/code\u003e option.\u003c/p\u003e\n\u003cp\u003eIf your system supports multiple PHP versions, you can limit the changes to the config for a specific version with the \u003ccode\u003e--php-version\u003c/code\u003e flag followed by a number, like 7.4 or 8.2.\u003c/p\u003e","title":"modify-php-ini"},{"content":"Change some attributes of a scheduled backup This command can be used to change some attributes of a scheduled backup that has been created in the Virtualmin user interface. The backup must be selected with the --id flag followed by a unique ID, as shown by the list-scheduled-backups command.\nTo stop a backup from running, you can use the --disable flag. Or to re-enable a backup that\u0026rsquo;s been turned off, use the --enable flag.\nCommand line help virtualmin modify-scheduled-backup --id backup-id [--enable | --disable] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/modify-scheduled-backup/","summary":"\u003ch3 id=\"change-some-attributes-of-a-scheduled-backup\"\u003eChange some attributes of a scheduled backup\u003c/h3\u003e\n\u003cp\u003eThis command can be used to change some attributes of a scheduled backup that has been created in the Virtualmin user interface. The backup must be selected with the \u003ccode\u003e--id\u003c/code\u003e flag followed by a unique ID, as shown by the \u003ccode\u003elist-scheduled-backups\u003c/code\u003e command.\u003c/p\u003e\n\u003cp\u003eTo stop a backup from running, you can use the \u003ccode\u003e--disable\u003c/code\u003e flag. Or to re-enable a backup that\u0026rsquo;s been turned off, use the \u003ccode\u003e--enable\u003c/code\u003e flag.\u003c/p\u003e","title":"modify-scheduled-backup"},{"content":"Reset some virtual server feature back to it\u0026rsquo;s default This command resets the configuration for one or more features for selected virtual servers back to their default configurations, while preserving any customization if possible.\nThe servers to reset are selected with the --domain or --user flags, and the features with flags like --web or --dns. By default the command will skip resetting if this would result in the loss of custom settings, but this can be over-ridden with the --skip-warnings flag.\nTo force a complete reset back to defaults for selected features, you can instead use the --full-reset flag.\nCommand line help virtualmin reset-feature --domain name | --user name [--unix] [--dir] [--dns] [--mail] [--web] [--ssl] [--logrotate] [--mysql] [--spam] [--status] [--webmin] [--virtualmin-awstats] [--skip-warnings] [--full-reset] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/reset-feature/","summary":"\u003ch3 id=\"reset-some-virtual-server-feature-back-to-its-default\"\u003eReset some virtual server feature back to it\u0026rsquo;s default\u003c/h3\u003e\n\u003cp\u003eThis command resets the configuration for one or more features for selected virtual servers back to their default configurations, while preserving any customization if possible.\u003c/p\u003e\n\u003cp\u003eThe servers to reset are selected with the \u003ccode\u003e--domain\u003c/code\u003e or \u003ccode\u003e--user\u003c/code\u003e flags, and the features with flags like \u003ccode\u003e--web\u003c/code\u003e or \u003ccode\u003e--dns\u003c/code\u003e. By default the command will skip resetting if this would result in the loss of custom settings, but this can be over-ridden with the \u003ccode\u003e--skip-warnings\u003c/code\u003e flag.\u003c/p\u003e","title":"reset-feature"},{"content":"Resets the password for some or all users in some or all virtual servers This command can be used to mass update the passwords of all users in a virtual server, or just those matching some criteria.\nFor example, to reset the password for all users in the domain example.com, run:\nvirtualmin reset-pass --domain example.com To update the password for just the user joe in example.com, run:\nvirtualmin reset-pass --domain example.com --user joe To update the password for all users in all domains, run:\nvirtualmin reset-pass --all-domains To update the password for all users in all domains except the owners, run:\nvirtualmin reset-pass --all-domains --exclude-owner All passwords will be set to a random value, unless the --pass flag is given, in which case the same password will be used for all users.\nCommand line help virtualmin reset-pass --all-domains | --domain name [--exclude-owner] [--user name] [--pass] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/reset-pass/","summary":"\u003ch3 id=\"resets-the-password-for-some-or-all-users-in-some-or-all-virtual-servers\"\u003eResets the password for some or all users in some or all virtual servers\u003c/h3\u003e\n\u003cp\u003eThis command can be used to mass update the passwords of all users in a virtual server, or just those matching some criteria.\u003c/p\u003e\n\u003cp\u003eFor example, to reset the password for all users in the domain \u003ccode\u003eexample.com\u003c/code\u003e, run:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin reset-pass --domain example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTo update the password for just the user \u003ccode\u003ejoe\u003c/code\u003e in \u003ccode\u003eexample.co\u003c/code\u003em, run:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin reset-pass --domain example.com --user joe\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTo update the password for all users in all domains, run:\u003c/p\u003e","title":"reset-pass"},{"content":"Restarts one of the servers managed by Virtualmin This command stops and re-starts one of the servers managed by Virtualmin, such as Apache or BIND. The server to restart must be set using the --server flag, followed by a feature name like web or dns.\nFor server types that have multiple versions such as FPM, you can select the version to restart with the --version flag. Or use --domain to find automatically select the correct version for the given domain.\nCommand line help virtualmin restart-server --server name [--domain name | --version number] [--quiet] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/restart-server/","summary":"\u003ch3 id=\"restarts-one-of-the-servers-managed-by-virtualmin\"\u003eRestarts one of the servers managed by Virtualmin\u003c/h3\u003e\n\u003cp\u003eThis command stops and re-starts one of the servers managed by Virtualmin, such as Apache or BIND. The server to restart must be set using the \u003ccode\u003e--server\u003c/code\u003e flag, followed by a feature name like \u003ccode\u003eweb\u003c/code\u003e or \u003ccode\u003edns\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eFor server types that have multiple versions such as FPM, you can select the version to restart with the \u003ccode\u003e--version\u003c/code\u003e flag. Or use \u003ccode\u003e--domain\u003c/code\u003e to find automatically select the correct version for the given domain.\u003c/p\u003e","title":"restart-server"},{"content":"Run Webalizer reports for all virtual servers This is designed to be called from Cron, instead of Virtualmin\u0026rsquo;s regular per-domain /etc/webmin/webalizer/webalizer.pl script, which can generate a lot of load if more than one copy runs at the same time. If you decide to use it, change the Setup Webalizer Cron job for each virtual server? option to No on the Module Config page.\nCommand line help virtualmin run-all-webalizer ","permalink":"https://www.virtualmin.com/docs/development/api-programs/run-all-webalizer/","summary":"\u003ch3 id=\"run-webalizer-reports-for-all-virtual-servers\"\u003eRun Webalizer reports for all virtual servers\u003c/h3\u003e\n\u003cp\u003eThis is designed to be called from Cron, instead of Virtualmin\u0026rsquo;s regular per-domain \u003ccode\u003e/etc/webmin/webalizer/webalizer.pl\u003c/code\u003e script, which can generate a lot of load if more than one copy runs at the same time. If you decide to use it, change the \u003cstrong\u003eSetup Webalizer Cron job for each virtual server?\u003c/strong\u003e option to \u003cstrong\u003eNo\u003c/strong\u003e on the \u003cstrong\u003eModule Config\u003c/strong\u003e page.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin run-all-webalizer\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"run-all-webalizer"},{"content":"Executes another API command over multiple servers Some Virtualmin API commands can only run on a single domain at a time, so this command exists as a wrapper to loop over multiple domains easily. It can be run like:\nvirtualmin run-api-command --user foo modify-web --mode cgi Flags to select the domains to operate on must be given before the command to run. All flags after the command will be passed to each invocation of it. You can see the final commands without running them by adding the --test flag.\nBy default it will operate on all virtual servers, but you can choose specific servers with the --domain flag which can be given multiple times. Or to limit the domains to those owned by a single user, the --user parameter can be given, following by a domain owner\u0026rsquo;s name. You can also limit it to particular server types with the --alias, --no-alias, --subserver, --toplevel and --subdomain parameters.\nTo only show domains with a particular feature active, use the --with-feature parameter followed by a feature code like dns or web. Alternately, --without-feature can be used to show only domains without some feature enabled. The similar --with-web and --with-ssl flags can be used to show domains with any kind of website (Apache or Nginx).\nTo limit the list to virtual servers on some plan, use the --plan flag followed by a plan name or ID. Similarly, you can select only virtual servers created using some template with the --template flag, followed by an ID or name.\nTo show only domains owned by some reseller, use the --reseller flag followed by a reseller name. Or to list those not owned by any reseller, use the --no-reseller flag. Finally, to list domains owned by any reseller, you can use the --any-reseller option.\nTo show only domains that are enabled, use the --enabled flag. To show only disabled domains, use --disabled instead.\nCommand line help virtualmin run-api-command [--domain name]* [--user name]* [--id number]* [--with-feature feature] [--without-feature feature] [--with-web] [--with-ssl] [--alias domain | --no-alias] [--subserver | --toplevel | --subdomain] [--parent domain] [--plan ID|name] [--template ID|name] [--disabled | --enabled] [--reseller name | --no-reseller | --any-reseller] [--test] command [flags] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/run-api-command/","summary":"\u003ch3 id=\"executes-another-api-command-over-multiple-servers\"\u003eExecutes another API command over multiple servers\u003c/h3\u003e\n\u003cp\u003eSome Virtualmin API commands can only run on a single domain at a time, so this command exists as a wrapper to loop over multiple domains easily. It can be run like:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin run-api-command --user foo modify-web --mode cgi\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFlags to select the domains to operate on must be given before the command to run. All flags after the command will be passed to each invocation of it. You can see the final commands without running them by adding the \u003ccode\u003e--test\u003c/code\u003e flag.\u003c/p\u003e","title":"run-api-command"},{"content":"Enable or disable DKIM for all domains To enable DKIM signing of outdoing emails, run this command with the --enable flag. Conversely, to turn it off use the --disable. A default key size and selector will be used when DKIM is enabled for the first time, unless specified with the --size and --selector flags.\nBy default incoming email will not be checked for a valid DKIM signature unless the --verify flag is given. To turn off verification, use the --no-verify flag instead.\nVirtualmin enables DKIM for all virtual servers with email and DNS features, but you can add extra domains to sign for with the --add-dkim flag followed by a domain name. Similarly you can remove an extra domain with the --remove-extra flag.\nCommand line help virtualmin set-dkim [--enable | --disable] [--select name] [--size bits] [--verify | --no-verify] [--add-extra domain]* [--remove-extra domain]* ","permalink":"https://www.virtualmin.com/docs/development/api-programs/set-dkim/","summary":"\u003ch3 id=\"enable-or-disable-dkim-for-all-domains\"\u003eEnable or disable DKIM for all domains\u003c/h3\u003e\n\u003cp\u003eTo enable DKIM signing of outdoing emails, run this command with the \u003ccode\u003e--enable\u003c/code\u003e flag. Conversely, to turn it off use the \u003ccode\u003e--disable\u003c/code\u003e. A default key size and selector will be used when DKIM is enabled for the first time, unless specified with the \u003ccode\u003e--size\u003c/code\u003e and \u003ccode\u003e--selector\u003c/code\u003e flags.\u003c/p\u003e\n\u003cp\u003eBy default incoming email will not be checked for a valid DKIM signature unless the \u003ccode\u003e--verify\u003c/code\u003e flag is given. To turn off verification, use the \u003ccode\u003e--no-verify\u003c/code\u003e flag instead.\u003c/p\u003e","title":"set-dkim"},{"content":"Turns on or off some Virtualmin feature or plugin globally This command is the equivalent of the Features and Plugins page in the Virtualmin user interface, as it can be used to enable or disable features and plugins globally. To activate a feature, use the --enable-feature flag followed by a code like web or ftp, as shown by the list-features API command. To turn off a feature, use the --disable-feature flag. In both cases, dependencies will be checked before a change is made, to prevent enabling of features that have missing pre-requisites, or disabling of features that are currently in use.\nTo control if a feature or plugin is enabled by default for new domains, use the --default-on or --default-off flags followed by a feature code. Features that are not globally enabled cannot be turned on by default.\nCommand line help virtualmin set-global-feature --enable-feature name --disable-feature name --default-on name --default-off name ","permalink":"https://www.virtualmin.com/docs/development/api-programs/set-global-feature/","summary":"\u003ch3 id=\"turns-on-or-off-some-virtualmin-feature-or-plugin-globally\"\u003eTurns on or off some Virtualmin feature or plugin globally\u003c/h3\u003e\n\u003cp\u003eThis command is the equivalent of the Features and Plugins page in the Virtualmin user interface, as it can be used to enable or disable features and plugins globally. To activate a feature, use the \u003ccode\u003e--enable-feature\u003c/code\u003e flag followed by a code like \u003ccode\u003eweb\u003c/code\u003e or \u003ccode\u003eftp\u003c/code\u003e, as shown by the \u003ccode\u003elist-features\u003c/code\u003e API command. To turn off a feature, use the \u003ccode\u003e--disable-feature\u003c/code\u003e flag. In both cases, dependencies will be checked before a change is made, to prevent enabling of features that have missing pre-requisites, or disabling of features that are currently in use.\u003c/p\u003e","title":"set-global-feature"},{"content":"Change the root MySQL password, even if the current password is unknown This command can be used for forcibly change the MySQL password (typically for the root user), even when the password is unknown. Be careful using it though, as it will shut down the MySQL server for up to 30 seconds during the password change process.\nCommand line help virtualmin set-mysql-pass --pass password [--user username] [--force password change for non-administrative user] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/set-mysql-pass/","summary":"\u003ch3 id=\"change-the-root-mysql-password-even-if-the-current-password-is-unknown\"\u003eChange the \u003ccode\u003eroot\u003c/code\u003e MySQL password, even if the current password is unknown\u003c/h3\u003e\n\u003cp\u003eThis command can be used for forcibly change the MySQL password (typically for the \u003cem\u003eroot\u003c/em\u003e user), even when the password is unknown. Be careful using it though, as it will shut down the MySQL server for up to 30 seconds during the password change process.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin set-mysql-pass --pass password\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                         [--user username]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                         [--force password change for non-administrative user]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"set-mysql-pass"},{"content":"Change the spam and virus scanners for all domains By default, Virtualmin uses the stand-alone ClamAV and SpamAssassin programs for virus and spam scanning, named clamscan and spamassassin respectively. However, on a system that receives a large amount of email, running these programs for each incoming message can generate significant CPU load.\nThis command can tell Virtualmin to use the background scanning daemons clamd and spamd instead, which are faster but consume additional memory as then run all the time. To enable the ClamAV server, run it like so:\nvirtualmin set-spam --enable-clamd virtualmin set-spam --use-clamdscan To enable and use the SpamAssassin daemon process, run the commands:\nvirtualmin set-spam --enable-spamd virtualmin set-spam --use-spamc However, using spamc makes it impossible to have separate per-domain SpamAssassin configurations in Virtualmin.\nCommand line help virtualmin set-spam [--use-spamassassin | --use-spamc] [--spamc-host hostname | --no-spamc-host] [--spam-max bytes | --no-spam-max] [--use-clamscan | --use-clamdscan | --use-clamd-stream-client | --use-clamdscan-remote | --use-virus command] [--clamd-host hostname] [--enable-clamd | --disable-clamd] [--enable-spamd | --disable-spamd] [--quota-behavior \u0026#34;queue\u0026#34;|\u0026#34;bounce\u0026#34;] [--show] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/set-spam/","summary":"\u003ch3 id=\"change-the-spam-and-virus-scanners-for-all-domains\"\u003eChange the spam and virus scanners for all domains\u003c/h3\u003e\n\u003cp\u003eBy default, Virtualmin uses the stand-alone ClamAV and SpamAssassin programs for virus and spam scanning, named \u003ccode\u003eclamscan\u003c/code\u003e and \u003ccode\u003espamassassin\u003c/code\u003e respectively. However, on a system that receives a large amount of email, running these programs for each incoming message can generate significant CPU load.\u003c/p\u003e\n\u003cp\u003eThis command can tell Virtualmin to use the background scanning daemons \u003ccode\u003eclamd\u003c/code\u003e and \u003ccode\u003espamd\u003c/code\u003e instead, which are faster but consume additional memory as then run all the time. To enable the ClamAV server, run it like so:\u003c/p\u003e","title":"set-spam"},{"content":"Stops, starts or restarts the server process for some script This command can be used to start, stop or restart the server process behind some script, such as one using Node.js. It takes the usual --domain parameter to identify the server, and either --id followed by the install ID, or --type followed by the script\u0026rsquo;s short name. The latter option is more convenient, but only works if there is only one instance of the script in the virtual server. If multiple different versions are installed, you can also use --version to select a specific one to manage.\nThe action to take on the chosen script must be specified with exactly one of the --start , --stop or --restart flags.\nCommand line help virtualmin start-stop-script --domain domain.name [--type name --version number] | [--id number] --start | --stop | --restart ","permalink":"https://www.virtualmin.com/docs/development/api-programs/start-stop-script/","summary":"\u003ch3 id=\"stops-starts-or-restarts-the-server-process-for-some-script\"\u003eStops, starts or restarts the server process for some script\u003c/h3\u003e\n\u003cp\u003eThis command can be used to start, stop or restart the server process behind some script, such as one using Node.js. It takes the usual \u003ccode\u003e--domain\u003c/code\u003e parameter to identify the server, and either \u003ccode\u003e--id\u003c/code\u003e followed by the install ID, or \u003ccode\u003e--type\u003c/code\u003e followed by the script\u0026rsquo;s short name. The latter option is more convenient, but only works if there is only one instance of the script in the virtual server. If multiple different versions are installed, you can also use \u003ccode\u003e--version\u003c/code\u003e to select a specific one to manage.\u003c/p\u003e","title":"start-stop-script"},{"content":"Checks if IMAP login to some server works This is a tool for testing IMAP servers. It takes --server, --user and --pass flags, followed by the IMAP hostname, login and password respectively. The optional --folder flag can be used to select an IMAP folder other than the inbox.\nTo connect to a different IMAP server port, use the --port flag followed by a port number. To make an SSL connection, use the --ssl flag.\nCommand line help virtualmin test-imap --user login [--pass password] [--server hostname] [--port number|name] [--ssl] [--folder name] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/test-imap/","summary":"\u003ch3 id=\"checks-if-imap-login-to-some-server-works\"\u003eChecks if IMAP login to some server works\u003c/h3\u003e\n\u003cp\u003eThis is a tool for testing IMAP servers. It takes \u003ccode\u003e--server\u003c/code\u003e, \u003ccode\u003e--user\u003c/code\u003e and \u003ccode\u003e--pass\u003c/code\u003e flags, followed by the IMAP hostname, login and password respectively. The optional \u003ccode\u003e--folder\u003c/code\u003e flag can be used to select an IMAP folder other than the inbox.\u003c/p\u003e\n\u003cp\u003eTo connect to a different IMAP server port, use the \u003ccode\u003e--port\u003c/code\u003e flag followed by a port number. To make an SSL connection, use the \u003ccode\u003e--ssl\u003c/code\u003e flag.\u003c/p\u003e","title":"test-imap"},{"content":"Checks if POP3 login to some server works This is a tool for testing POP3 servers. It takes --server, --user and --pass flags, followed by the POP3 hostname, login and password respectively.\nCommand line help virtualmin test-pop3 --user login [--pass password] [--server hostname] [--port number|name] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/test-pop3/","summary":"\u003ch3 id=\"checks-if-pop3-login-to-some-server-works\"\u003eChecks if POP3 login to some server works\u003c/h3\u003e\n\u003cp\u003eThis is a tool for testing POP3 servers. It takes \u003ccode\u003e--server\u003c/code\u003e, \u003ccode\u003e--user\u003c/code\u003e and \u003ccode\u003e--pass\u003c/code\u003e flags, followed by the POP3 hostname, login and password respectively.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin test-pop3 --user login\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    [--pass password]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    [--server hostname]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    [--port number|name]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"test-pop3"},{"content":"Checks if the mail server can RCPT to some address This command is debugging tool for mailboxes and aliases, which can be used to check if some address is accepted by your mail server, and if SMTP authentication is working.\nThe --server flag specifies the mail server to test, which defaults to localhost. The --from flag sets the email address used in the MAIL FROM SMTP operation, which defaults to nobody@virtualmin.com. The --to flag is mandatory, and sets the destination email address.\nTo have it try SMTP authentication, use the --user and --pass flags which must be followed a username and password respectively. The --auth flag can be used to set the SMTP authentication type, which defaults to Plain.\nBy default this command will use an unencrypted connection, but you can force use of SSL mode with the --ssl flag or --starttls to attempt to switch to SSL after the connection is made. The --port flag followed by a port number or name can be used to have the SMTP connection made on a port other than the default (25 or 465).\nCommand line help virtualmin test-smtp --to address [--server hostname] [--port number|name] [--ssl | --starttls] [--from address] [--user login --pass password] [--auth method] [--data mail-file] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/test-smtp/","summary":"\u003ch3 id=\"checks-if-the-mail-server-can-rcpt-to-some-address\"\u003eChecks if the mail server can RCPT to some address\u003c/h3\u003e\n\u003cp\u003eThis command is debugging tool for mailboxes and aliases, which can be used to check if some address is accepted by your mail server, and if SMTP authentication is working.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003e--server\u003c/code\u003e flag specifies the mail server to test, which defaults to \u003ccode\u003elocalhost\u003c/code\u003e. The \u003ccode\u003e--from\u003c/code\u003e flag sets the email address used in the \u003ccode\u003eMAIL FROM\u003c/code\u003e SMTP operation, which defaults to \u003ccode\u003enobody@virtualmin.com\u003c/code\u003e. The \u003ccode\u003e--to\u003c/code\u003e flag is mandatory, and sets the destination email address.\u003c/p\u003e","title":"test-smtp"},{"content":"Uploads a single file to Dropbox This command uploads a file from your Virtualmin system to Dropbox, specified using the --source flag. The destination path can be set using the --file flag, which must be a full path.\nCommand line help virtualmin upload-dropbox-file --source local-file --file remote-file [--multipart] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/upload-dropbox-file/","summary":"\u003ch3 id=\"uploads-a-single-file-to-dropbox\"\u003eUploads a single file to Dropbox\u003c/h3\u003e\n\u003cp\u003eThis command uploads a file from your Virtualmin system to Dropbox, specified using the \u003ccode\u003e--source\u003c/code\u003e flag. The destination path can be set using the \u003ccode\u003e--file\u003c/code\u003e flag, which must be a full path.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin upload-dropbox-file --source local-file\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                               --file remote-file\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                              [--multipart]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"upload-dropbox-file"},{"content":"Checks the external accessibility of virtual servers This command will run various tests to ensure that one or more virtual server\u0026rsquo;s web, DNS and mail servers are accessible from the rest of the Internet. This is useful for debugging various connectivity and configuration problems.\nThe virtual servers to check can be specified with the --domain flag followed by a domain name, or the --user flag followed by a Virtualmin administrator\u0026rsquo;s name. Both can be given multiple times.\nCommand line help virtualmin check-connectivity [--domain name]* | [--user username]* ","permalink":"https://www.virtualmin.com/docs/development/api-programs/check-connectivity/","summary":"\u003ch3 id=\"checks-the-external-accessibility-of-virtual-servers\"\u003eChecks the external accessibility of virtual servers\u003c/h3\u003e\n\u003cp\u003eThis command will run various tests to ensure that one or more virtual server\u0026rsquo;s web, DNS and mail servers are accessible from the rest of the Internet. This is useful for debugging various connectivity and configuration problems.\u003c/p\u003e\n\u003cp\u003eThe virtual servers to check can be specified with the \u003ccode\u003e--domain\u003c/code\u003e flag followed by a domain name, or the \u003ccode\u003e--user\u003c/code\u003e flag followed by a Virtualmin administrator\u0026rsquo;s name. Both can be given multiple times.\u003c/p\u003e","title":"check-connectivity"},{"content":"Searches mail server and procmail logs This is the command-line equivant of the Search Mail Logs page in the Virtualmin user interface. It can find email messages delivered or relayed through the system by several different criteria, specified by command-line flags.\nTo search by recipient, use the --dest flag followed by an email address, domain name or Unix username. To search by sender, use the --source flag followed by a sender\u0026rsquo;s email address.\nTo limit the search to a particular date range, use the --start and/or --end flags. Both can be followed by either a date formatted like 2001-09-16, a date and time like 2001-09-16 17:00, or an offset in days into the past from the current time like -5.\nTo filter out spam or viruses from the output, use the --no-spam or --no-virus flags respectively.\nBy default, the output is in a human-readable table format. To switch to one that shows more details and is more easily parsed by other programs, use the --multiline flag.\nCommand line help virtualmin search-mailllogs [--start yyyy-mm-dd:hh:mm:ss] [--end yyyy-mm-dd:hh:mm:ss] [--dest domain|user@domain] [--source domain|user@domain] [--multiline] [--no-spam] [--no-virus] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/search-maillogs/","summary":"\u003ch3 id=\"searches-mail-server-and-procmail-logs\"\u003eSearches mail server and procmail logs\u003c/h3\u003e\n\u003cp\u003eThis is the command-line equivant of the Search Mail Logs page in the Virtualmin user interface. It can find email messages delivered or relayed through the system by several different criteria, specified by command-line flags.\u003c/p\u003e\n\u003cp\u003eTo search by recipient, use the \u003ccode\u003e--dest\u003c/code\u003e flag followed by an email address, domain name or Unix username. To search by sender, use the \u003ccode\u003e--source\u003c/code\u003e flag followed by a sender\u0026rsquo;s email address.\u003c/p\u003e","title":"search-maillogs"},{"content":"Adds protection to a directory owned by some virtual server This command sets up protection for a web directory under a virtual server selected with the --domain flag. The directory to protect is set with the --path flag, which can be followed by either a full path or one relative to the domain\u0026rsquo;s home directory.\nThe optional --desc flag can be used to set the description for the directory shown when an end user accesses it via a web browser. The password hashing format to use can be changed from the default with one of the flags --crypt, --md5, --sha1 or --digest.\nCommand line help virtualmin create-protected-directory --domain name --path directory [--desc \u0026#34;description\u0026#34;] [--crypt | --md5 | --sha1 | --digest] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/create-protected-directory/","summary":"\u003ch3 id=\"adds-protection-to-a-directory-owned-by-some-virtual-server\"\u003eAdds protection to a directory owned by some virtual server\u003c/h3\u003e\n\u003cp\u003eThis command sets up protection for a web directory under a virtual server selected with the \u003ccode\u003e--domain\u003c/code\u003e flag. The directory to protect is set with the \u003ccode\u003e--path\u003c/code\u003e flag, which can be followed by either a full path or one relative to the domain\u0026rsquo;s home directory.\u003c/p\u003e\n\u003cp\u003eThe optional \u003ccode\u003e--desc\u003c/code\u003e flag can be used to set the description for the directory shown when an end user accesses it via a web browser. The password hashing format to use can be changed from the default with one of the flags \u003ccode\u003e--crypt\u003c/code\u003e, \u003ccode\u003e--md5\u003c/code\u003e, \u003ccode\u003e--sha1\u003c/code\u003e or \u003ccode\u003e--digest\u003c/code\u003e.\u003c/p\u003e","title":"create-protected-directory"},{"content":"Removes protection from a directory owned by some virtual server This command turns off protection for a web directory, and removes all users with access to it. The virtual server that owns the directory must be specified with the --domain flag, and the directory path (which can be relative to public_html) with the --path flag.\nCommand line help virtualmin delete-protected-directory --domain name --path directory ","permalink":"https://www.virtualmin.com/docs/development/api-programs/delete-protected-directory/","summary":"\u003ch3 id=\"removes-protection-from-a-directory-owned-by-some-virtual-server\"\u003eRemoves protection from a directory owned by some virtual server\u003c/h3\u003e\n\u003cp\u003eThis command turns off protection for a web directory, and removes all users with access to it. The virtual server that owns the directory must be specified with the \u003ccode\u003e--domain\u003c/code\u003e flag, and the directory path (which can be relative to public_html) with the \u003ccode\u003e--path\u003c/code\u003e flag.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin delete-protected-directory --domain name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                      --path directory\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"delete-protected-directory"},{"content":"Lists protected directories owned by some virtual server This command outputs a table of all protected web directories owned by some virtual server, identified by the --domain flag. You an also switch to a more easily parsed format with the --multiline flag, or get just a list of directories with the --dir-only flag.\nCommand line help virtualmin list-protected-directories --domain name [--multiline | --dir-only] ","permalink":"https://www.virtualmin.com/docs/development/api-programs/list-protected-directories/","summary":"\u003ch3 id=\"lists-protected-directories-owned-by-some-virtual-server\"\u003eLists protected directories owned by some virtual server\u003c/h3\u003e\n\u003cp\u003eThis command outputs a table of all protected web directories owned by some virtual server, identified by the \u003ccode\u003e--domain\u003c/code\u003e flag. You an also switch to a more easily parsed format with the \u003ccode\u003e--multiline\u003c/code\u003e flag, or get just a list of directories with the \u003ccode\u003e--dir-only\u003c/code\u003e flag.\u003c/p\u003e\n\u003ch3 id=\"command-line-help\"\u003eCommand line help\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtualmin list-protected-directories --domain name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                                     [--multiline | --dir-only]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"list-protected-directories"},{"content":" Add a simplified UI for managing website redirects Add support for PHP-FPM workload profiles Add Kanboard and Blesta web app installers for Virtualmin Pro users Add the ability to test two-factor authentication after enrollment Fix PHP-FPM not restarting when certain custom configuration options are used in a template Fix domain expiry notifications occasionally getting stuck Fix to keep local-specific directives when restoring the Postfix configuration Fix the missing message when DKIM is enabled or disabled Fix an issue reading PHP configuration files created by a reseller Update support for Moodle 5.1 and later versions ","permalink":"https://www.virtualmin.com/changelog/virtualmin-8.1.0-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdd a simplified UI for managing website redirects\u003c/li\u003e\n\u003cli\u003eAdd support for PHP-FPM workload profiles\u003c/li\u003e\n\u003cli\u003eAdd Kanboard and Blesta web app installers for Virtualmin Pro users\u003c/li\u003e\n\u003cli\u003eAdd the ability to test two-factor authentication after enrollment\u003c/li\u003e\n\u003cli\u003eFix PHP-FPM not restarting when certain custom configuration options are used in a template\u003c/li\u003e\n\u003cli\u003eFix domain expiry notifications occasionally getting stuck\u003c/li\u003e\n\u003cli\u003eFix to keep local-specific directives when restoring the Postfix configuration\u003c/li\u003e\n\u003cli\u003eFix the missing message when DKIM is enabled or disabled\u003c/li\u003e\n\u003cli\u003eFix an issue reading PHP configuration files created by a reseller\u003c/li\u003e\n\u003cli\u003eUpdate support for Moodle 5.1 and later versions\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 8.1.0 released"},{"content":" Add ability to migrate Webmin monolithic to modular while keeping enabled modules for the new repository ","permalink":"https://www.virtualmin.com/changelog/virtualmin-8.0.1-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdd ability to migrate Webmin monolithic to modular while keeping enabled modules for the new repository\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 8.0.1 released"},{"content":"Usually, getting started with Virtualmin can be done with a few simple steps, using our automated install script. The install script will set up your package manager (dnf or apt), and then download our packages as well as all of the necessary dependencies for running Virtualmin.\nNever run the virtualmin-install.sh script to upgrade or renew or to try to repair an existing Virtualmin system! The virtualmin change-license command is used for license changes and renewals. Check the license FAQ for details. Install your operating system Start with a fresh Grade A supported OS on your server or VPS—Rocky Linux, Debian, and Ubuntu Server LTS are safe choices. For full installs that include mail, set a proper fully qualified domain name. Minimal installs don\u0026rsquo;t require this, because they don\u0026rsquo;t run mail. In all cases, don\u0026rsquo;t name the system the same as any domain you\u0026rsquo;ll host in Virtualmin.\nDon\u0026rsquo;t pre-install or tweak extra packages; the installer expects a clean supported OS, and changes may cause conflicts. The only exceptions are if you prefer MySQL over MariaDB—install MySQL first—or if you plan to use PostgreSQL—see PostgreSQL special instructions. Add any third-party repositories only after installing Virtualmin, and use them with caution. Download and run install script If you have already purchased a Virtualmin Professional license, you can find it in My Account → Dashboard. If not, you can purchase a license or download Virtualmin GPL.\nTry Virtualmin Professional or Download Virtualmin GPL The quickest way to initiate the installation of Virtualmin GPL on your server is to log in via SSH using a terminal, and execute the following pre-prepared command:\nsudo sh -c \u0026#34;$(curl -fsSL https://download.virtualmin.com/virtualmin-install)\u0026#34; -- --bundle LAMP For Virtualmin Professional, use the download link provided on the My Account → Dashboard page.\nTo use Nginx as the webserver use --bundle LEMP, while --type mini installs a mini web-only setup without mail, local DNS, FTP, or Jailkit pre-installed. Install script options You can customize the install with various options. Run the script with --help for a full list, and see the docs for installation bundles and minimal installation mode if you choose something other than the default.\nDuring installation, the script may ask a few questions:\nIf your system doesn\u0026rsquo;t have a fully qualified hostname, full installs that include mail will ask you to set one. For minimal installs, it isn\u0026rsquo;t required. Don\u0026rsquo;t use a name you\u0026rsquo;ll host in Virtualmin—for example, if you\u0026rsquo;ll host the virtualmin.com domain, you can name the system host.virtualmin.com, but not virtualmin.com. If your system doesn\u0026rsquo;t have enough memory for the chosen install type, the installer will offer to create a swap file. After a few minutes, your system will be ready. Log in to Virtualmin by going to https://your-hostname:10000 or https://your-ip:10000 in your browser.\nIn most cases, you won\u0026rsquo;t see an SSL warning, because during installation Virtualmin requests a real certificate for your hostname if it resolves correctly and ports are reachable. If you do see a warning, you can safely continue and fix the certificate after setup.\nFollow the post-install wizard to configure Virtualmin for your environment. Virtualmin will check your system and confirm it\u0026rsquo;s ready to host sites and services.\nWhen you\u0026rsquo;re done, click Create Virtual Server to create your first website in Virtualmin.\nCheck the documentation If your setup doesn\u0026rsquo;t fit these simple steps—for example, you can\u0026rsquo;t start from a fresh OS or can\u0026rsquo;t use a Grade A supported OS—Virtualmin can probably still work. See the installation documentation for more detailed guides and alternative installation methods.\nSign up for announcements To stay up to date with Virtualmin news and updates, subscribe to the News Forum at Virtualmin.com.\n","permalink":"https://www.virtualmin.com/download/","summary":"\u003cp\u003eUsually, getting started with Virtualmin can be done with a few simple steps, using our automated \u003ca href=\"https://download.virtualmin.com/virtualmin-install.sh\"\u003einstall script\u003c/a\u003e. The install script will set up your package manager (\u003ccode\u003ednf\u003c/code\u003e or \u003ccode\u003eapt\u003c/code\u003e), and then download our packages as well as all of the necessary dependencies for running Virtualmin.\u003c/p\u003e\n\n\n\n\n\n      \u003cdiv class=\"alert alert-primary\"\u003e\n        \u003ci class=\"wm wm-fw wm-sm wm-question\"\u003e\u003c/i\u003e \u003cstrong\u003e\u003c/strong\u003e\u003cbr\u003e\n        Never run the \u003ccode\u003evirtualmin-install.sh\u003c/code\u003e script to upgrade or renew or to try to repair an existing Virtualmin system! The \u003ccode\u003evirtualmin change-license\u003c/code\u003e command is used for license changes and renewals. \u003ca href=\"/docs/faq/#license\"\u003eCheck the license FAQ\u003c/a\u003e for details.\n      \u003c/div\u003e\n\n\n\u003ch3 id=\"install-your-operating-system\"\u003eInstall your operating system\u003c/h3\u003e\n\u003cp\u003eStart with a fresh \u003ca href=\"/docs/os-support/\"\u003eGrade A\u003c/a\u003e supported OS on your server or VPS—Rocky Linux, Debian, and Ubuntu Server LTS are safe choices. For full installs that include mail, set a proper \u003ca href=\"/docs/installation/automated#fully-qualified-domain-name\"\u003efully qualified domain name\u003c/a\u003e. Minimal installs don\u0026rsquo;t require this, because they don\u0026rsquo;t run mail. In all cases, don\u0026rsquo;t name the system the same as any domain you\u0026rsquo;ll host in Virtualmin.\u003c/p\u003e","title":"Downloading and Installing"},{"content":" Add support for systemd resource limits for Virtualmin Pro users Add support for SFTP backups and restores, including the ability to purge SFTP backups Add support for paginated display of large user lists Add backup signing improvements, including the ability to skip signing when necessary Add option to forward the original HTTP hostname when proxying requests Add phpMyAdmin integration (if installed) when editing databases for virtual servers Add a row showing when and why a domain was disabled in the virtual server summary Add improvements to ACME service notifications Add reseller access to edit PHP-FPM configs Add improvements to handling of remote/cloud DNS hosting Fix validation of A and AAAA DNS records when using modify-dns CLI Fix reliability of remote backups during long-running tasks using Webmin RPC Fix several DKIM-related issues Fix handling of EC SSL certificates Update the repo setup script and workflow to match the newer packaging/CI layout ","permalink":"https://www.virtualmin.com/changelog/virtualmin-8.0.0-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdd support for \u003cem\u003esystemd\u003c/em\u003e resource limits for Virtualmin Pro users\u003c/li\u003e\n\u003cli\u003eAdd support for SFTP backups and restores, including the ability to purge SFTP backups\u003c/li\u003e\n\u003cli\u003eAdd support for paginated display of large user lists\u003c/li\u003e\n\u003cli\u003eAdd backup signing improvements, including the ability to skip signing when necessary\u003c/li\u003e\n\u003cli\u003eAdd option to forward the original HTTP hostname when proxying requests\u003c/li\u003e\n\u003cli\u003eAdd phpMyAdmin integration (if installed) when editing databases for virtual servers\u003c/li\u003e\n\u003cli\u003eAdd a row showing when and why a domain was disabled in the virtual server summary\u003c/li\u003e\n\u003cli\u003eAdd improvements to ACME service notifications\u003c/li\u003e\n\u003cli\u003eAdd reseller access to edit PHP-FPM configs\u003c/li\u003e\n\u003cli\u003eAdd improvements to handling of remote/cloud DNS hosting\u003c/li\u003e\n\u003cli\u003eFix validation of A and AAAA DNS records when using \u003ccode\u003emodify-dns\u003c/code\u003e CLI\u003c/li\u003e\n\u003cli\u003eFix reliability of remote backups during long-running tasks using Webmin RPC\u003c/li\u003e\n\u003cli\u003eFix several DKIM-related issues\u003c/li\u003e\n\u003cli\u003eFix handling of EC SSL certificates\u003c/li\u003e\n\u003cli\u003eUpdate the repo setup script and workflow to match the newer packaging/CI layout\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 8.0.0 released"},{"content":" Fix to correctly add new virtual hosts in Apache config to prevent wrong site being served Fix DNS NS record update correctly when renaming domain Fix to set a custom DNS address for a subdomain only if it really differs from the primary one Fix mail alias domains to manage users expectedly Fix to correctly show current IPv6 address in the form when changing it Fix the default BIND to listen on port 53 unless already configured Fix redirect all requests to SSL site option work correctly Fix support to manage PHP 8.5 versions ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.50.1-released/","summary":"\u003cul\u003e\n\u003cli\u003eFix to correctly add new virtual hosts in Apache config to prevent wrong site being served\u003c/li\u003e\n\u003cli\u003eFix DNS NS record update correctly when renaming domain\u003c/li\u003e\n\u003cli\u003eFix to set a custom DNS address for a subdomain only if it really differs from the primary one\u003c/li\u003e\n\u003cli\u003eFix mail alias domains to manage users expectedly\u003c/li\u003e\n\u003cli\u003eFix to correctly show current IPv6 address in the form when changing it\u003c/li\u003e\n\u003cli\u003eFix the default BIND to listen on port 53 unless already configured\u003c/li\u003e\n\u003cli\u003eFix redirect all requests to SSL site option work correctly\u003c/li\u003e\n\u003cli\u003eFix support to manage PHP 8.5 versions\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.50.1 released"},{"content":" Add support for Bunny DNS for Virtualmin Pro users Add improvements to external IPv4 and IPv6 address detection Add improvements and simplifications to the post-installation wizard Add pure-Perl implementation for retrieving SSL certificate information Fix to significantly improve support for IPv6 across different services Fix Apache and Dovecot config issues when restoring the backup Fix to stop breaking Apache config if hostname SSL request fails during Virtualmin installation Fix not to smoosh DNS TXT records together when using CLI #1104 Fix to disallow out-of-domain DNS records when using CLI Fix to correctly add IPv6 to SSL virtual hosts Fix incorrect logic when checking IPv4 and IPv6 addresses in the config check Fix mailbox cleanup to correctly handle messages moved between folders, like to trash or spam Fix missing POP port in mail auto-config that caused some email clients to fail automatic configuration Fix to properly use the global Webmin notification email address for alerts Fix to hide localhost DNS record unless explicitly enabled Fix to completely remove the obsolete m DNS record ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.50.0-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdd support for Bunny DNS for Virtualmin Pro users\u003c/li\u003e\n\u003cli\u003eAdd improvements to external IPv4 and IPv6 address detection\u003c/li\u003e\n\u003cli\u003eAdd improvements and simplifications to the post-installation wizard\u003c/li\u003e\n\u003cli\u003eAdd pure-Perl implementation for retrieving SSL certificate information\u003c/li\u003e\n\u003cli\u003eFix to significantly improve support for IPv6 across different services\u003c/li\u003e\n\u003cli\u003eFix Apache and Dovecot config issues when restoring the backup\u003c/li\u003e\n\u003cli\u003eFix to stop breaking Apache config if hostname SSL request fails during Virtualmin installation\u003c/li\u003e\n\u003cli\u003eFix not to smoosh DNS TXT records together when using CLI \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/issues/1104\"\u003e#1104\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix to disallow out-of-domain DNS records when using CLI\u003c/li\u003e\n\u003cli\u003eFix to correctly add IPv6 to SSL virtual hosts\u003c/li\u003e\n\u003cli\u003eFix incorrect logic when checking IPv4 and IPv6 addresses in the config check\u003c/li\u003e\n\u003cli\u003eFix mailbox cleanup to correctly handle messages moved between folders, like to trash or spam\u003c/li\u003e\n\u003cli\u003eFix missing POP port in mail auto-config that caused some email clients to fail automatic configuration\u003c/li\u003e\n\u003cli\u003eFix to properly use the global Webmin notification email address for alerts\u003c/li\u003e\n\u003cli\u003eFix to hide \u003ccode\u003elocalhost\u003c/code\u003e DNS record unless explicitly enabled\u003c/li\u003e\n\u003cli\u003eFix to completely remove the obsolete \u003ccode\u003em\u003c/code\u003e DNS record\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.50.0 released"},{"content":" Add an API for plugins to exclude specific directories from backups Add ability to exclude some backup features to avoid overhead Fix check for safety when restoring a logged backup Fix to handle cases where no username is entered for SSH in backup destination ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.40.1-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdd an API for plugins to exclude specific directories from backups\u003c/li\u003e\n\u003cli\u003eAdd ability to exclude some backup features to avoid overhead\u003c/li\u003e\n\u003cli\u003eFix check for safety when restoring a logged backup\u003c/li\u003e\n\u003cli\u003eFix to handle cases where no username is entered for SSH in backup destination\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.40.1 released"},{"content":" Add built-in password recovery support for the login page Add advanced search for backup logs with fielded queries and multi-field terms Add a new CLI API to manage config file backups with list-config-backups and restore-config-backups commands Add full MTA-STS support Add a template option to ignore specified names during ACME certificate requests Add support for record sets in Amazon Route 53 Add support for adding NS records to parent domain with Route 53 DNS Add a default timeout to allow waiting for scheduled backups to finish instead of failing immediately Add BIND and Apache configs validation during config check Add ability to configure DNS resolvers Add support for IPv6 per-IP certificates for Webmin and Usermin Add support for fully-qualified extra admin usernames Add support for plugin-driven scheduled backups, restore, and backup logs used by upcoming WP Workbench Add support for domain restore with a clashing IDs Improve the navigation menu by using a new layout that prioritizes the \u0026ldquo;Create Virtual Server\u0026rdquo; button Improve local and remote host handling in MySQL/MariaDB, update grant and access logic when moving and restoring a domain Improve relying on the proper API to interact with the Apache config Improve API categorization for Virtualmin CLI Improve ZIP backups to handle feature files inside the archive, use maximum compression, and skip compressing the internal files Improve the \u0026ldquo;SSL Certificate\u0026rdquo; page to display SANs in a more concise and user-friendly way Improve the complex schedule field to display consistently regardless of the schedule Replaced IDNA::Punycode with the actively maintained Net::LibIDN2 for full IDNA2008 support Change Let\u0026rsquo;s Encrypt renewal default to 21 days before expiry Change to use relative dates for last login and days until renewal when applicable Drop legacy S3 Perl modules and now always require using AWS-CLI Drop supporting outdated panels for migration backups, except for cPanel, Plesk, and DirectAdmin Fix Jailkit support for sub-servers #1082 Fix Rackspace endpoint for London Fix alias domains to allow DKIM to be enabled Fix config check to support Postfix configured as a relay Fix displaying chosen values correctly for a multi-server selection field Fix it to correctly use * as the default in an Apache virtual host on new systems Fix it to stop showing details of the installed web app if the plugin provides it, like with WP Workbench Fix missing RewriteEngine directive when creating a proxy path Fix not update max_spare_servers when saving PHP options if children don\u0026rsquo;t change Fix renaming a domain with Route 53 DNS enabled, to delete records from the old domain Fix to remove NS records when deleting a sub-domain from Route 53 DNS Fix reseller updates on all available Webmin modules, since saving the template affects their permissions Fix support for Backblaze API keys may start with plus Fix support for new local IMAP authentication with the Dovecot command in Usermin Fix the Dropbox bugs that occurred when listing backups Fix the automatic renewal of SSL certificates with other ACME providers to work Fix the incorrect FQDN check when creating an SSL certificate for the hostname Fix to allow resellers with a Unix login to access the Terminal module Fix to correctly display DNS-related errors with the original error message Fix to correctly sort and place alias domain next to the parent when listing domains Fix to limit lifetime of sessions to one hour by default when using CLI to create a login link Fix to set -all as the default in DNS SPF records Fix to make sure that in PHP disabled mode, PHP files are not processed Fix the sporadic PHP-FPM service going down unexpectedly on EL systems Fix to not force re-generation of MySQL/MariaDB username when just listing using CLI Fix to prevent mail users from setting up email notifications Fix to roll config back when the DNS move fails, by setting it up again on the old host or locally Fix to run pre and post commands when backing up a domain Fix to use a consistent timestamp throughout the backup Fix up paths in autoreply files when renaming users Fix various IPv6 related bugs ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.40.0-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdd built-in password recovery support for the login page\u003c/li\u003e\n\u003cli\u003eAdd advanced search for backup logs with fielded queries and multi-field terms\u003c/li\u003e\n\u003cli\u003eAdd a new CLI API to manage config file backups with \u003ccode\u003elist-config-backups\u003c/code\u003e and \u003ccode\u003erestore-config-backups\u003c/code\u003e commands\u003c/li\u003e\n\u003cli\u003eAdd full MTA-STS support\u003c/li\u003e\n\u003cli\u003eAdd a template option to ignore specified names during ACME certificate requests\u003c/li\u003e\n\u003cli\u003eAdd support for record sets in Amazon Route 53\u003c/li\u003e\n\u003cli\u003eAdd support for adding NS records to parent domain with Route 53 DNS\u003c/li\u003e\n\u003cli\u003eAdd a default timeout to allow waiting for scheduled backups to finish instead of failing immediately\u003c/li\u003e\n\u003cli\u003eAdd BIND and Apache configs validation during config check\u003c/li\u003e\n\u003cli\u003eAdd ability to configure DNS resolvers\u003c/li\u003e\n\u003cli\u003eAdd support for IPv6 per-IP certificates for Webmin and Usermin\u003c/li\u003e\n\u003cli\u003eAdd support for fully-qualified extra admin usernames\u003c/li\u003e\n\u003cli\u003eAdd support for plugin-driven scheduled backups, restore, and backup logs used by upcoming WP Workbench\u003c/li\u003e\n\u003cli\u003eAdd support for domain restore with a clashing IDs\u003c/li\u003e\n\u003cli\u003eImprove the navigation menu by using a new layout that prioritizes the \u0026ldquo;Create Virtual Server\u0026rdquo; button\u003c/li\u003e\n\u003cli\u003eImprove local and remote host handling in MySQL/MariaDB, update grant and access logic when moving and restoring a domain\u003c/li\u003e\n\u003cli\u003eImprove relying on the proper API to interact with the Apache config\u003c/li\u003e\n\u003cli\u003eImprove API categorization for Virtualmin CLI\u003c/li\u003e\n\u003cli\u003eImprove ZIP backups to handle feature files inside the archive, use maximum compression, and skip compressing the internal files\u003c/li\u003e\n\u003cli\u003eImprove the \u0026ldquo;SSL Certificate\u0026rdquo; page to display SANs in a more concise and user-friendly way\u003c/li\u003e\n\u003cli\u003eImprove the complex schedule field to display consistently regardless of the schedule\u003c/li\u003e\n\u003cli\u003eReplaced \u003ccode\u003eIDNA::Punycode\u003c/code\u003e with the actively maintained \u003ccode\u003eNet::LibIDN2\u003c/code\u003e for full IDNA2008 support\u003c/li\u003e\n\u003cli\u003eChange Let\u0026rsquo;s Encrypt renewal default to 21 days before expiry\u003c/li\u003e\n\u003cli\u003eChange to use relative dates for last login and days until renewal when applicable\u003c/li\u003e\n\u003cli\u003eDrop legacy S3 Perl modules and now always require using AWS-CLI\u003c/li\u003e\n\u003cli\u003eDrop supporting outdated panels for migration backups, except for cPanel, Plesk, and DirectAdmin\u003c/li\u003e\n\u003cli\u003eFix Jailkit support for sub-servers \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/issues/1082\"\u003e#1082\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix Rackspace endpoint for London\u003c/li\u003e\n\u003cli\u003eFix alias domains to allow DKIM to be enabled\u003c/li\u003e\n\u003cli\u003eFix config check to support Postfix configured as a relay\u003c/li\u003e\n\u003cli\u003eFix displaying chosen values correctly for a multi-server selection field\u003c/li\u003e\n\u003cli\u003eFix it to correctly use \u003ccode\u003e*\u003c/code\u003e as the default in an Apache virtual host on new systems\u003c/li\u003e\n\u003cli\u003eFix it to stop showing details of the installed web app if the plugin provides it, like with WP Workbench\u003c/li\u003e\n\u003cli\u003eFix missing \u003ccode\u003eRewriteEngine\u003c/code\u003e directive when creating a proxy path\u003c/li\u003e\n\u003cli\u003eFix not update \u003ccode\u003emax_spare_servers\u003c/code\u003e when saving PHP options if children don\u0026rsquo;t change\u003c/li\u003e\n\u003cli\u003eFix renaming a domain with Route 53 DNS enabled, to delete records from the old domain\u003c/li\u003e\n\u003cli\u003eFix to remove NS records when deleting a sub-domain from Route 53 DNS\u003c/li\u003e\n\u003cli\u003eFix reseller updates on all available Webmin modules, since saving the template affects their permissions\u003c/li\u003e\n\u003cli\u003eFix support for Backblaze API keys may start with plus\u003c/li\u003e\n\u003cli\u003eFix support for new local IMAP authentication with the Dovecot command in Usermin\u003c/li\u003e\n\u003cli\u003eFix the Dropbox bugs that occurred when listing backups\u003c/li\u003e\n\u003cli\u003eFix the automatic renewal of SSL certificates with other ACME providers to work\u003c/li\u003e\n\u003cli\u003eFix the incorrect FQDN check when creating an SSL certificate for the hostname\u003c/li\u003e\n\u003cli\u003eFix to allow resellers with a Unix login to access the Terminal module\u003c/li\u003e\n\u003cli\u003eFix to correctly display DNS-related errors with the original error message\u003c/li\u003e\n\u003cli\u003eFix to correctly sort and place alias domain next to the parent when listing domains\u003c/li\u003e\n\u003cli\u003eFix to limit lifetime of sessions to one hour by default when using CLI to create a login link\u003c/li\u003e\n\u003cli\u003eFix to set \u003ccode\u003e-all\u003c/code\u003e as the default in DNS SPF records\u003c/li\u003e\n\u003cli\u003eFix to make sure that in PHP disabled mode, PHP files are not processed\u003c/li\u003e\n\u003cli\u003eFix the sporadic PHP-FPM service going down unexpectedly on EL systems\u003c/li\u003e\n\u003cli\u003eFix to not force re-generation of MySQL/MariaDB username when just listing using CLI\u003c/li\u003e\n\u003cli\u003eFix to prevent mail users from setting up email notifications\u003c/li\u003e\n\u003cli\u003eFix to roll config back when the DNS move fails, by setting it up again on the old host or locally\u003c/li\u003e\n\u003cli\u003eFix to run pre and post commands when backing up a domain\u003c/li\u003e\n\u003cli\u003eFix to use a consistent timestamp throughout the backup\u003c/li\u003e\n\u003cli\u003eFix up paths in autoreply files when renaming users\u003c/li\u003e\n\u003cli\u003eFix various IPv6 related bugs\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.40.0 released"},{"content":" Add an intro for the new WP Workbench plugin to the dashboard Fix an issue where the latest updated script failed to load WP Workbench API ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.30.8-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdd an intro for the new WP Workbench plugin to the dashboard\u003c/li\u003e\n\u003cli\u003eFix an issue where the latest updated script failed to load WP Workbench API\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.30.8 released"},{"content":" Add missing text string for WP Workbench ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.30.7-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdd missing text string for WP Workbench\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.30.7 released"},{"content":" Fix to improve file saving operations for greater reliability Fix to optimize PHP session cleanup for directories with large numbers of files Add the virtual-server package provide virtualmin ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.30.6-released/","summary":"\u003cul\u003e\n\u003cli\u003eFix to improve file saving operations for greater reliability\u003c/li\u003e\n\u003cli\u003eFix to optimize PHP session cleanup for directories with large numbers of files\u003c/li\u003e\n\u003cli\u003eAdd the \u003ccode\u003evirtual-server\u003c/code\u003e package provide \u003ccode\u003evirtualmin\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.30.6 released"},{"content":" Fix to exclude the default domain from license count Add AWS-CLI and WP Workbench as recommended packages ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.30.5-released/","summary":"\u003cul\u003e\n\u003cli\u003eFix to exclude the default domain from license count\u003c/li\u003e\n\u003cli\u003eAdd AWS-CLI and WP Workbench as recommended packages\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.30.5 released"},{"content":" Fix conditional logic for license re-check ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.30.4-released/","summary":"\u003cul\u003e\n\u003cli\u003eFix conditional logic for license re-check\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.30.4 released"},{"content":" Add a new ClassicPress web app installer Fix missing button text when restarting a script’s service (Node.js, etc.) Fix advertised installable web apps always show the version as “latest” Fix system ID check to address incorrect license identification Fix to ensure files inside backups have the correct extensions Fix to clean up the code that adjusts FPM versions during the config check Fix to remove Webalizer as an option unless it is already installed Fix file locking to prevent disruption of configuration files in rare cases ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.30.3-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdd a new ClassicPress web app installer\u003c/li\u003e\n\u003cli\u003eFix missing button text when restarting a script’s service (Node.js, etc.)\u003c/li\u003e\n\u003cli\u003eFix advertised installable web apps always show the version as “latest”\u003c/li\u003e\n\u003cli\u003eFix system ID check to address incorrect license identification\u003c/li\u003e\n\u003cli\u003eFix to ensure files inside backups have the correct extensions\u003c/li\u003e\n\u003cli\u003eFix to clean up the code that adjusts FPM versions during the config check\u003c/li\u003e\n\u003cli\u003eFix to remove Webalizer as an option unless it is already installed\u003c/li\u003e\n\u003cli\u003eFix file locking to prevent disruption of configuration files in rare cases\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.30.3 released"},{"content":" Fix to ensure the mail log is not read when the mail feature is disabled globally ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.30.2-released/","summary":"\u003cul\u003e\n\u003cli\u003eFix to ensure the mail log is not read when the mail feature is disabled globally\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.30.2 released"},{"content":" Fix the bug to properly check for disabling in-use features and prevent breaking the system ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.30.1-released/","summary":"\u003cul\u003e\n\u003cli\u003eFix the bug to properly check for disabling in-use features and prevent breaking the system\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.30.1 released"},{"content":" Add support for multiple ACME-compatible SSL providers in the Pro version, like ZeroSSL, Sectigo and many other Add comprehensive page for license management in Virtualmin Pro Add numerous improvements to the DirectAdmin migration process Add a new --json flag to the Virtualmin CLI command to enable output in JSON format Add ability to bring supported web apps under Virtualmin control during migration Add an option in the wizard to configure the system default email address Add an option to enable or disable SSL certificate renewal email notifications Add status monitors for Usermin and Postgrey to the dashboard Add template option to create an alias domain with its own DNS zone Add ability for CAA DNS records to be manually edited and created Add ability to edit RUA and RUF DMARC DNS fields Fix numerous DNS-related bugs Fix support for zstd compression in backups Fix an issue with MySQL user creation in certain edge cases Fix config file to set the correct port/socket for Postgrey in EL systems ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.30.0-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdd support for multiple ACME-compatible SSL providers in the Pro version, like ZeroSSL, Sectigo and many other\u003c/li\u003e\n\u003cli\u003eAdd comprehensive page for license management in Virtualmin Pro\u003c/li\u003e\n\u003cli\u003eAdd numerous improvements to the DirectAdmin migration process\u003c/li\u003e\n\u003cli\u003eAdd a new \u003ccode\u003e--json\u003c/code\u003e flag to the Virtualmin CLI command to enable output in JSON format\u003c/li\u003e\n\u003cli\u003eAdd ability to bring supported web apps under Virtualmin control during migration\u003c/li\u003e\n\u003cli\u003eAdd an option in the wizard to configure the system default email address\u003c/li\u003e\n\u003cli\u003eAdd an option to enable or disable SSL certificate renewal email notifications\u003c/li\u003e\n\u003cli\u003eAdd status monitors for Usermin and Postgrey to the dashboard\u003c/li\u003e\n\u003cli\u003eAdd template option to create an alias domain with its own DNS zone\u003c/li\u003e\n\u003cli\u003eAdd ability for CAA DNS records to be manually edited and created\u003c/li\u003e\n\u003cli\u003eAdd ability to edit RUA and RUF DMARC DNS fields\u003c/li\u003e\n\u003cli\u003eFix numerous DNS-related bugs\u003c/li\u003e\n\u003cli\u003eFix support for \u003ccode\u003ezstd\u003c/code\u003e compression in backups\u003c/li\u003e\n\u003cli\u003eFix an issue with MySQL user creation in certain edge cases\u003c/li\u003e\n\u003cli\u003eFix config file to set the correct port/socket for Postgrey in EL systems\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.30.0 released"},{"content":" Fix external DNS filter to consider CNAME and IPv6 records Fix not to trigger DNS filter for existing Let\u0026rsquo;s Encrypt renewals Fix false positive message to move SSL certificate to default location Fix old documentation links ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.20.2-released/","summary":"\u003cul\u003e\n\u003cli\u003eFix external DNS filter to consider CNAME and IPv6 records\u003c/li\u003e\n\u003cli\u003eFix not to trigger DNS filter for existing Let\u0026rsquo;s Encrypt renewals\u003c/li\u003e\n\u003cli\u003eFix false positive message to move SSL certificate to default location\u003c/li\u003e\n\u003cli\u003eFix old documentation links\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.20.2 released"},{"content":" Add support for changing username format to match the local system when restoring a backup Fix a bug that can corrupt the Dovecot config when creation of the default domain fails Fix a bug that can cause CGI scripts to be disabled by default ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.20.1-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdd support for changing username format to match the local system when restoring a backup\u003c/li\u003e\n\u003cli\u003eFix a bug that can corrupt the Dovecot config when creation of the default domain fails\u003c/li\u003e\n\u003cli\u003eFix a bug that can cause CGI scripts to be disabled by default\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.20.1 released"},{"content":"Sales and purchase support If you have a question about your order or need information on reseller discounts, open a new ticket by sending us a private message to discuss.\nRefund and order cancellation A refund is guaranteed within first 30 days of purchase, and can be performed after order cancellation. A request to staff must be filled to process a refund.\nPress and media contacts Please visit our online press kit for press contact information, logo imagery in scalable formats, and screenshots. For questions, contact us using the email address in the link.\nQuestions and bug reports Any other requests, questions and bug reports about our open-source Virtualmin GPL, Cloudmin GPL, Webmin, Usermin and Authentic Theme products should generally be brought up in Virtualmin Community forum. Virtualmin Professional and Cloudmin Professional customers may also request support by sending us a private ticket. We try to respond to tickets within 24 hours, seven days a week, including holidays. Please respect that the private ticket support is only for bug reports or queries from our Professional products customers, and we'll try to keep the response time in the forums as low as possible so you still get reliable and fast help even for our open-source software (but, all support for our OSS projects is provided on an as-available basis with no guarantee about response time).\n","permalink":"https://www.virtualmin.com/contact/","summary":"\u003ch3 id=\"sales-and-purchase-support\"\u003eSales and purchase support\u003c/h3\u003e\n\u003cp\u003eIf you have a question about your order or need information on reseller discounts, open a \u003ca href=\"https://forum.virtualmin.com/new-message?groupname=staff\u0026amp;title=Sales+and+purchase+support+request\"\u003enew ticket\u003c/a\u003e by sending us a private message to discuss.\u003c/p\u003e\n\u003ch3 id=\"refund-and-order-cancellation\"\u003eRefund and order cancellation\u003c/h3\u003e\n\u003cp\u003eA refund is guaranteed within first 30 days of purchase, and can be performed after order cancellation. A request to \u003ca href=\"https://forum.virtualmin.com/new-message?groupname=staff\u0026amp;title=Refund+request\"\u003estaff\u003c/a\u003e must be filled to process a refund.\u003c/p\u003e\n\u003ch3 id=\"press-and-media-contacts\"\u003ePress and media contacts\u003c/h3\u003e\n\u003cp\u003ePlease visit our online \u003ca href=\"/press-kit\"\u003epress kit\u003c/a\u003e for press contact information, logo imagery in scalable formats, and screenshots. For questions, \u003ca href=\"mailto:webmasterATvirtualminDOTcom\"\u003econtact us\u003c/a\u003e using the email address in the link.\u003c/p\u003e","title":"Contact"},{"content":" Add support to record most recent user logins for virtual servers Add ability to disable domains on given schedule Add support for proxying WebSocket with Apache and Nginx proxy paths Add an API to manage scheduled backups Add the ability to enable DKIM even if the mail feature is disabled Add ability to check the resolvability of alternative names before issuing a Let\u0026rsquo;s Encrypt certificate Add an API to move SSL certificates to a new location if it differs from the active template Add an option to the Website Options page to redirect www to non-www and vice versa (currently for Apache systems only) Add support for host-based redirects (currently for Apache systems only) Fix to change the default settings so that records are not proxied by default when using Cloudflare Fix a bug where CGI execution mode was disabled on initial install Fix PHP modes availability depending on the CGI execution mode Fix a bug with default shell selection when a user is created using the CLI Fix the issue where the last login time is not being updated Fix false-positive warnings about missing IPv6 addresses Fix domain locking bugs Drop support for obsolete or not fully supported mail servers like VPopMail, and Exim ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.20-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdd support to record most recent user logins for virtual servers\u003c/li\u003e\n\u003cli\u003eAdd ability to disable domains on given schedule\u003c/li\u003e\n\u003cli\u003eAdd support for proxying WebSocket with Apache and Nginx proxy paths\u003c/li\u003e\n\u003cli\u003eAdd an API to manage scheduled backups\u003c/li\u003e\n\u003cli\u003eAdd the ability to enable DKIM even if the mail feature is disabled\u003c/li\u003e\n\u003cli\u003eAdd ability to check the resolvability of alternative names before issuing a Let\u0026rsquo;s Encrypt certificate\u003c/li\u003e\n\u003cli\u003eAdd an API to move SSL certificates to a new location if it differs from the active template\u003c/li\u003e\n\u003cli\u003eAdd an option to the Website Options page to redirect www to non-www and vice versa (currently for Apache systems only)\u003c/li\u003e\n\u003cli\u003eAdd support for host-based redirects (currently for Apache systems only)\u003c/li\u003e\n\u003cli\u003eFix to change the default settings so that records are not proxied by default when using Cloudflare\u003c/li\u003e\n\u003cli\u003eFix a bug where CGI execution mode was disabled on initial install\u003c/li\u003e\n\u003cli\u003eFix PHP modes availability depending on the CGI execution mode\u003c/li\u003e\n\u003cli\u003eFix a bug with default shell selection when a user is created using the CLI\u003c/li\u003e\n\u003cli\u003eFix the issue where the last login time is not being updated\u003c/li\u003e\n\u003cli\u003eFix false-positive warnings about missing IPv6 addresses\u003c/li\u003e\n\u003cli\u003eFix domain locking bugs\u003c/li\u003e\n\u003cli\u003eDrop support for obsolete or not fully supported mail servers like VPopMail, and Exim\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.20 released"},{"content":"Logos Below, you can find our logos available in vector formats.\nVirtualmin Full Logo\nVirtualmin Product Logo\nVirtualmin Favicon Icon\n","permalink":"https://www.virtualmin.com/press-kit/","summary":"\u003ch3 id=\"logos\"\u003eLogos\u003c/h3\u003e\n\u003cp\u003eBelow, you can find our logos available in vector formats.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/images/logos/virtualmin-logo.svg?target=_blank\"\u003eVirtualmin Full Logo\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/images/logos/virtualmin-product-logo.svg?target=_blank\"\u003eVirtualmin Product Logo\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/images/logos/virtualmin-favicon.svg?target=_blank\"\u003eVirtualmin Favicon Icon\u003c/a\u003e\u003c/p\u003e","title":"Press Kit"},{"content":" Fatal Error: --ERROR-TITLE--\n--ERROR-BODY-- ","permalink":"https://www.virtualmin.com/error/","summary":"\u003cdiv class=\"__maintenance__ __error__ alert alert-danger --ERROR-TYPE--\"\u003e\n  \u003ci class=\"wm wm-fw wm-sm wm-exclamation-triangle\"\u003e\u003c/i\u003e \u003cstrong\u003eFatal Error\u003cspan\u003e:\u003c/span\u003e \u003ctt\u003e--ERROR-TITLE--\u003c/tt\u003e\u003c/strong\u003e\u003cbr\u003e\n  --ERROR-BODY--\n\u003c/div\u003e","title":"Fatal Error"},{"content":" Add S3 account management integration Add reworked Edit Users page with ability to add separate database and webserver users Add support for adding and updating SSH public key for virtual server users Add support for selecting CGI mode for virtual server using Website Options page and CLI Add Google Drive sub-folder support for backups and purging Add support for purging Backblaze date-based buckets Add support for name-based virtual FTP servers Add charset and collation retention for MySQL/MariaDB databases restored from backups Add support for restoring backups from relative paths using Virtualmin CLI Add option to clear spam and trash mail sub-folders Add sanity check for the DNS master IP address Add link from DNS Records page to reset DNS records Fix bugs in syncing of DNS TTL records Fix to re-parent DNS records upon owner change Fix to correctly split long DNS TXT records Fix to include webmail DNS records for Nginx configurations too Fix to further improve auto-discover config feature work correctly in Microsoft Outlook Fix to test if generated password matches the pattern required for installed scripts Fix to switch to System Logs Viewer module for viewing logs Fix wizard to handle MySQL/MariaDB socket authentication Fix to allow Let\u0026rsquo;s Encrypt certificates be requested even without a website Updated terminology now refers to incremental backups as differential backups ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.10-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdd S3 account management integration\u003c/li\u003e\n\u003cli\u003eAdd reworked Edit Users page with ability to add separate database and webserver users\u003c/li\u003e\n\u003cli\u003eAdd support for adding and updating SSH public key for virtual server users\u003c/li\u003e\n\u003cli\u003eAdd support for selecting CGI mode for virtual server using Website Options page and CLI\u003c/li\u003e\n\u003cli\u003eAdd Google Drive sub-folder support for backups and purging\u003c/li\u003e\n\u003cli\u003eAdd support for purging Backblaze date-based buckets\u003c/li\u003e\n\u003cli\u003eAdd support for name-based virtual FTP servers\u003c/li\u003e\n\u003cli\u003eAdd charset and collation retention for MySQL/MariaDB databases restored from backups\u003c/li\u003e\n\u003cli\u003eAdd support for restoring backups from relative paths using Virtualmin CLI\u003c/li\u003e\n\u003cli\u003eAdd option to clear spam and trash mail sub-folders\u003c/li\u003e\n\u003cli\u003eAdd sanity check for the DNS master IP address\u003c/li\u003e\n\u003cli\u003eAdd link from DNS Records page to reset DNS records\u003c/li\u003e\n\u003cli\u003eFix bugs in syncing of DNS TTL records\u003c/li\u003e\n\u003cli\u003eFix to re-parent DNS records upon owner change\u003c/li\u003e\n\u003cli\u003eFix to correctly split long DNS TXT records\u003c/li\u003e\n\u003cli\u003eFix to include webmail DNS records for Nginx configurations too\u003c/li\u003e\n\u003cli\u003eFix to further improve auto-discover config feature work correctly in Microsoft Outlook\u003c/li\u003e\n\u003cli\u003eFix to test if generated password matches the pattern required for installed scripts\u003c/li\u003e\n\u003cli\u003eFix to switch to System Logs Viewer module for viewing logs\u003c/li\u003e\n\u003cli\u003eFix wizard to handle MySQL/MariaDB socket authentication\u003c/li\u003e\n\u003cli\u003eFix to allow Let\u0026rsquo;s Encrypt certificates be requested even without a website\u003c/li\u003e\n\u003cli\u003eUpdated terminology now refers to incremental backups as differential backups\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.10 released"},{"content":" Under Maintenance\nWe're just tidying up a few things for the shop - shouldn't take more than a few minutes. It's all part of the usual upkeep to keep everything running smoothly for you.\nIn the meantime, have you checked out our Forums? It’s a cozy spot to catch up on discussions or share your thoughts. No rush, though, we’ll have the shop up and running for you very soon.\n","permalink":"https://www.virtualmin.com/maintenance/","summary":"\u003cdiv class=\"__maintenance__ alert alert-primary\"\u003e\n  \u003ci class=\"wm wm-fw wm-sm wm-cog\"\u003e\u003c/i\u003e \u003cstrong\u003eUnder Maintenance\u003c/strong\u003e\u003cbr\u003e\n    \u003cp\u003eWe're just tidying up a few things for the shop - shouldn't take more\n      than a few minutes. It's all part of the usual upkeep to keep everything running smoothly for you.\u003c/p\u003e\n\n    \u003cp\u003eIn the meantime, have you checked out our \u003ca href=\"https://forum.virtualmin.com\"\u003eForums\u003c/a\u003e? It’s a\n      cozy spot to catch up on discussions or share your thoughts. No rush, though, we’ll have the shop up and\n      running for you very soon.\u003c/p\u003e","title":"Under Maintenance"},{"content":"Virtualmin includes a convenient module for submitting support requests and providing temporary remote access to developers. This quick guide explains how to install the module and use its features.\nInstalling the support module EL systems:\ndnf install wbm-virtualmin-support Debian and derivatives:\napt-get install webmin-virtualmin-support Submitting a support request To report a bug or request assistance, you can submit a support request directly from Virtualmin. This is the preferred method for requesting support, as it provides developers with important system information that helps them troubleshoot the issue.\nLog in as master administrator, go to System Settings, and click on Virtualmin Support. It make take a few seconds to load, while system information is gathered.\nClick Submit Ticket. A link will open in a new tab, where you can submit your request.\nGranting remote login access For complex issues, if developer intervention has been requested, you can grant temporary remote access to your server. This allows developers to log in to your server and troubleshoot the issue directly.\nIn Virtualmin, under System Settings, click on Virtualmin Support and choose Remote Login Privileges tab.\nChoose Login end date and set a termination date for the access. Provide Associate bug report URL if you have already submitted a bug report or fill in the Additional comments about login for the support team to know what you need help with.\nClick Enable Remote Logins. This action configures developers public SSH keys on your server and grants them root access.\n","permalink":"https://www.virtualmin.com/docs/support-module/","summary":"\u003cp\u003eVirtualmin includes a convenient module for submitting support requests and providing temporary remote access to developers. This quick guide explains how to install the module and use its features.\u003c/p\u003e\n\u003ch3 id=\"installing-the-support-module\"\u003eInstalling the support module\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eEL systems:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ednf install wbm-virtualmin-support\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDebian and derivatives:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eapt-get install webmin-virtualmin-support\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"submitting-a-support-request\"\u003eSubmitting a support request\u003c/h3\u003e\n\u003cp\u003eTo report a bug or request assistance, you can submit a support request directly from Virtualmin. This is the preferred method for requesting support, as it provides developers with important system information that helps them troubleshoot the issue.\u003c/p\u003e","title":"Support Module"},{"content":"We understand that managing servers can be complex, but you\u0026rsquo;re not alone. Our team is dedicated to helping you utilize our products to their fullest potential. Whether you’re troubleshooting, need quick solutions, or require in-depth assistance, the creators of Webmin, Usermin, Virtualmin, Cloudmin, and the Authentic Theme are here at your service.\nQuick Self-Help\nFor quick self-help, begin by searching our forum. A wealth of collective knowledge is available there, as many questions have already been asked and answered. By searching for your issue first, you might find the solution you need in just a few minutes. Premium Support Experience dedicated support as a paid customer. For quick and reliable assistance, feel free to contact our team via private message; your tickets are always free. With your Professional subscription, you\u0026rsquo;re assured of priority handling for all your support tickets. While we guarantee a response time within 24 hours, we often respond much faster.\nCreate Premium Support Ticket Install Support Module Sign In For Premium Support Community Support For GPL users or those who prefer a community-based help, we encourage you to join and engage with our forum, where our staff and community members are always eager to help. Feel free to post your questions there if you\u0026rsquo;re comfortable with a brief wait. Our community, along with the staff, actively participate and are keen to assist. While we prioritize direct support for paid customers, we value each user and strive to contribute to forum discussions as often as possible.\nHowever, before engaging, we encourage you to familiarize yourself with our guidelines to ensure a positive and productive experience.\nJoin the Forum Report a Bug Help improve our products for everyone:\nSpotted a bug? Whether you\u0026rsquo;re a GPL or Pro user, we encourage you to report it. Use the appropriate GitHub issue tracker to report non-security related bugs. For sensitive reports, especially security vulnerabilities, please use the designated security@ email address to ensure responsible handling of the issue. Our forum is also a place to discuss potential bugs; sometimes what seems like a bug might be a configuration issue that the community or our staff can quickly resolve. Remember, your feedback and reports are invaluable. They not only help us improve our software but also enhance the experience for the entire user base. Let\u0026rsquo;s work together to keep it running smoothly.\n","permalink":"https://www.virtualmin.com/support/","summary":"\u003cp\u003eWe understand that managing servers can be complex, but you\u0026rsquo;re not alone. Our team is dedicated to helping you utilize our products to their fullest potential. Whether you’re troubleshooting, need quick solutions, or require in-depth assistance, the creators of Webmin, Usermin, Virtualmin, Cloudmin, and the Authentic Theme are here at your service.\u003c/p\u003e\n\n\n\n\n\n      \u003cdiv class=\"alert alert-primary\"\u003e\n        \u003ci class=\"wm wm-fw wm-sm wm-exclamation\"\u003e\u003c/i\u003e \u003cstrong\u003eQuick Self-Help\u003c/strong\u003e\u003cbr\u003e\n        For quick self-help, begin by searching our \u003ca href=\"https://forum.virtualmin.com\"\u003eforum\u003c/a\u003e. A wealth of collective knowledge is available there, as many questions have already been asked and answered. By searching for your issue first, you might find the solution you need in just a few minutes.\n      \u003c/div\u003e\n\n\n\u003ch3 id=\"premium-support\"\u003ePremium Support\u003c/h3\u003e\n\u003cp\u003eExperience dedicated support as a paid customer. For quick and reliable assistance, feel free to contact our team via private message; your tickets are always free. With your Professional subscription, you\u0026rsquo;re assured of priority handling for all your support tickets. While we guarantee a response time within 24 hours, we often respond much faster.\u003c/p\u003e","title":"Getting Support"},{"content":" Add reworked navigation menu for better usability and accessibility Add support for different PHP-FPM process manager modes (dynamic, static, ondemand) Add Google Drive support as cloud storage provider for Virtualmin Pro users Add enhanced Jailkit domain features for Virtualmin Pro users, including abilities to copy extra commands and sections, and to reset previously configured jail environment Add ability to preserve php_value, php_admin_value, env and pm. settings when changing PHP-FPM version Add Cloudflare API token support for more secure and precise authentication, replacing the need for using global API keys Add API for restarting system or virtual server services using virtualmin restart-server command Add support for showing dynamic placeholder for path/file field in Backup and Restore ⇾ Scheduled Backups page #647 Add ability to use the database character set when performing back up and restore Add improvements to validate domain output page Add various improvements for migrations from cPanel and Plesk Add template substitutions to support variables for the MySQL/MariaDB host and port #666 Add ability to show domain type when listing domains in UI #676 Add support for using Webmin RPC to perform virtual servers transfer to remote systems Add an option to re-allocate usernames when restoring backups Change SPF to default to ~all instead of ?all #696 Extend the GPL version with the capability to edit proxy paths, previously exclusive to Pro users Fix Backblaze clearing old backups #640 Fix issues when performing DNS-based Let\u0026rsquo;s Encrypt renewals, including in wildcard mode Fix auto-discover config feature work correctly in Microsoft Outlook Fix to correctly revoke access to previously allowed MySQL/MariaDB databases Fix renewal errors for Let\u0026rsquo;s Encrypt certificates caused by using incorrect certificate types Fix caching system external IP address for faster API calls Fix issues with base website redirects causing redirect loops in the past Fix to improve virtual servers restore experience Fix DKIM signature issue on Debian and Ubuntu systems Fix auto-reply form not being saved correctly Fix to correctly print years in bandwidth usage reports #689 Fix detecting network interface names on Amazon Linux systems Fix enforcing correct permissions for PHP-FPM socket file Fix to preserve the PHP-FPM socket file when changing versions Fix to make sure all PHP-FPM versions are enabled at boot #644 Fix various issues with file locking ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.9-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdd reworked navigation menu for better usability and accessibility\u003c/li\u003e\n\u003cli\u003eAdd support for different PHP-FPM process manager modes (\u003cem\u003edynamic\u003c/em\u003e, \u003cem\u003estatic\u003c/em\u003e, \u003cem\u003eondemand\u003c/em\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Google Drive support as cloud storage provider for Virtualmin Pro users\u003c/li\u003e\n\u003cli\u003eAdd enhanced Jailkit domain features for Virtualmin Pro users, including abilities to copy extra commands and sections, and to reset previously configured jail environment\u003c/li\u003e\n\u003cli\u003eAdd ability to preserve \u003ccode\u003ephp_value\u003c/code\u003e, \u003ccode\u003ephp_admin_value\u003c/code\u003e, \u003ccode\u003eenv\u003c/code\u003e and \u003ccode\u003epm.\u003c/code\u003e settings when changing PHP-FPM version\u003c/li\u003e\n\u003cli\u003eAdd Cloudflare API token support for more secure and precise authentication, replacing the need for using global API keys\u003c/li\u003e\n\u003cli\u003eAdd API for restarting system or virtual server services using \u003ccode\u003evirtualmin restart-server\u003c/code\u003e command\u003c/li\u003e\n\u003cli\u003eAdd support for showing dynamic placeholder for path/file field in \u003cstrong\u003eBackup and Restore ⇾ Scheduled Backups\u003c/strong\u003e page \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/issues/647#issuecomment-1732368172\"\u003e#647\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd ability to use the database character set when performing back up and restore\u003c/li\u003e\n\u003cli\u003eAdd improvements to validate domain output page\u003c/li\u003e\n\u003cli\u003eAdd various improvements for migrations from cPanel and Plesk\u003c/li\u003e\n\u003cli\u003eAdd template substitutions to support variables for the MySQL/MariaDB host and port \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/issues/666\"\u003e#666\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd ability to show domain type when listing domains in UI \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/pull/676\"\u003e#676\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd support for using Webmin RPC to perform virtual servers transfer to remote systems\u003c/li\u003e\n\u003cli\u003eAdd an option to re-allocate usernames when restoring backups\u003c/li\u003e\n\u003cli\u003eChange SPF to default to \u003ccode\u003e~all\u003c/code\u003e instead of \u003ccode\u003e?all\u003c/code\u003e \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/issues/696\"\u003e#696\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eExtend the GPL version with the capability to edit proxy paths, previously exclusive to Pro users\u003c/li\u003e\n\u003cli\u003eFix Backblaze clearing old backups \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/issues/640\"\u003e#640\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix issues when performing DNS-based Let\u0026rsquo;s Encrypt renewals, including in wildcard mode\u003c/li\u003e\n\u003cli\u003eFix auto-discover config feature work correctly in Microsoft Outlook\u003c/li\u003e\n\u003cli\u003eFix to correctly revoke access to previously allowed MySQL/MariaDB databases\u003c/li\u003e\n\u003cli\u003eFix renewal errors for Let\u0026rsquo;s Encrypt certificates caused by using incorrect certificate types\u003c/li\u003e\n\u003cli\u003eFix caching system external IP address for faster API calls\u003c/li\u003e\n\u003cli\u003eFix issues with base website redirects causing redirect loops in the past\u003c/li\u003e\n\u003cli\u003eFix to improve virtual servers restore experience\u003c/li\u003e\n\u003cli\u003eFix DKIM signature issue on Debian and Ubuntu systems\u003c/li\u003e\n\u003cli\u003eFix auto-reply form not being saved correctly\u003c/li\u003e\n\u003cli\u003eFix to correctly print \u003cem\u003eyears\u003c/em\u003e in bandwidth usage reports \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/issues/689\"\u003e#689\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix detecting network interface names on Amazon Linux systems\u003c/li\u003e\n\u003cli\u003eFix enforcing correct permissions for PHP-FPM socket file\u003c/li\u003e\n\u003cli\u003eFix to preserve the PHP-FPM socket file when changing versions\u003c/li\u003e\n\u003cli\u003eFix to make sure all PHP-FPM versions are enabled at boot \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/issues/644\"\u003e#644\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix various issues with file locking\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.9 released"},{"content":"Origin Virtualmin was founded by Jamie Cameron and Joe Cooper in 2005. We provide virtual host administration products based on Webmin - the world's most popular web-based UNIX and Linux system administration tool, with over 3 million downloads every year.\nHistory As open source developers, we've been working on solving real systems management problems for two decades and written over a half million lines of code in the process. Jamie created Virtualmin, Webmin and Usermin, as well as authored the Bruce Perens' Open Source Series book titled Managing Linux Systems with Webmin: System Administration and Module Development (Prentice Hall PTR, 2003). Joe wrote The Book of Webmin: Or How I Learned to Stop Worrying and Love UNIX (No Starch Press, 2003) and founded Swell Technology LLC, an open source-based web-caching appliance vendor in operation from 1999 to 2005. It is merely an eerie coincidence that both of our initials are JC.\nFacts Virtualmin is in use by more than a thousand hosting providers worldwide. Webmin is the world's most popular web-based system administration tool, and is used by RackSpace.com, Hosting.com, Lycos Europe, University of Texas, and thousands of other companies and individuals world-wide. In 2007, Virtualmin accepted funding from Y Combinator and became a Delaware Corporation. In 2009, we announced Cloudmin, a cloud computing management UI and platform for development of cloud computing services.\nUs In short, Virtualmin is four guys (Eric Andreychek joined us in 2008 and Ilia Rostovtsev (a.k.a Ilia Ross) joined us in 2014) trying to tackle really big problems in hosting and cloud computing management.\n","permalink":"https://www.virtualmin.com/about/","summary":"\u003ch3 id=\"origin\"\u003eOrigin\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eVirtualmin\u003c/strong\u003e was founded by \u003cstrong\u003eJamie Cameron\u003c/strong\u003e and \u003cstrong\u003eJoe Cooper\u003c/strong\u003e in 2005. We provide virtual host administration products based on \u003ca href=\"https://webmin.com/about\"\u003e\u003cstrong\u003eWebmin\u003c/strong\u003e\u003c/a\u003e - the world's most popular web-based UNIX and Linux system administration tool, with over \u003cem\u003e3 million\u003c/em\u003e downloads every year.\u003c/p\u003e\n\u003ch3 id=\"history\"\u003eHistory\u003c/h3\u003e\n\u003cp\u003eAs open source developers, we've been working on solving real systems management problems for two decades and written over a half million lines of code in the process. Jamie created \u003cstrong\u003eVirtualmin\u003c/strong\u003e, \u003cstrong\u003eWebmin\u003c/strong\u003e and \u003cstrong\u003eUsermin\u003c/strong\u003e, as well as authored the \u003cem\u003eBruce Perens' Open Source Series\u003c/em\u003e book titled \u003cem\u003eManaging Linux Systems with Webmin: System Administration and Module Development\u003c/em\u003e (Prentice Hall PTR, 2003). Joe wrote \u003cem\u003eThe Book of Webmin: Or How I Learned to Stop Worrying and Love UNIX\u003c/em\u003e (No Starch Press, 2003) and founded \u003cem\u003eSwell Technology LLC\u003c/em\u003e, an open source-based web-caching appliance vendor in operation from 1999 to 2005. It is merely an eerie coincidence that both of our initials are JC.\u003c/p\u003e","title":"About"},{"content":"Privacy Statement Virtualmin, Inc. is firmly committed to insuring your privacy. The following discloses our information gathering and dissemination practices.\nIP and Computer Information We may use client IP addresses to diagnose problems with our web-site. Client access information is stored for the purposes of monitoring site usage and performance.\nLicense Key and Subscription Purchased software requires a license key, and an active software updates subscription on our updates server, in order to function fully. License keys and subscription IDs are used only for the purpose of verifying license compliance, and notifying customers of upcoming license renewals. This data will not be sold or disclosed to third parties.\nSecurity of Personal and Financial Data Any personal information gathered for the purposes of commerce will be transmitted via a Transport Layer Security (TLS) connection with encryption, using a certificate provided by Let\u0026rsquo;s Encrypt. This information will be kept confidential. Financial and payment details, including credit card numbers, will be collected by our payment processing partners (PayPal or Braintree), and this information will not be received or stored on our servers. We will retain a payment token, provided by our payment process, in order to process recurring payments for your subscription orders at Virtualmin.com.\nEmail Address Your email address will be used to email copies of your order information including order number and details. We do not give away or sell your email address to other companies. We only use this information to contact you regarding your order and to provide better customer support. In the Virtualmin.com community there are many opportunities to subscribe to email notifications and mailing lists, but you will not be subscribed automatically to any email notifications or mailing lists, except those related to your subscriptions. You may unsubscribe from our website notifications or mailing lists at any time. You may control all of your forum subscriptions and notifications My Account ⇾ Preferences ⇾ Notifications in the forums.\nName, Address, and Phone Number Your name, address, and phone number may be stored in our system so that we can better serve you, when you return to our site or file a support issue. Only Virtualmin, Inc. staff members will have access to details beyond your community username (and any information you choose to disclose in the Virtualmin community forums).\n","permalink":"https://www.virtualmin.com/privacy/","summary":"\u003ch3 id=\"privacy-statement\"\u003ePrivacy Statement\u003c/h3\u003e\n\u003cp\u003eVirtualmin, Inc. is firmly committed to insuring your privacy. The following discloses our information gathering and dissemination practices.\u003c/p\u003e\n\u003ch3 id=\"ip-and-computer-information\"\u003eIP and Computer Information\u003c/h3\u003e\n\u003cp\u003eWe may use client IP addresses to diagnose problems with our web-site. Client access information is stored for the purposes of monitoring site usage and performance.\u003c/p\u003e\n\u003ch3 id=\"license-key-and-subscription\"\u003eLicense Key and Subscription\u003c/h3\u003e\n\u003cp\u003ePurchased software requires a license key, and an active software updates subscription on our updates server, in order to function fully. License keys and subscription IDs are used only for the purpose of verifying license compliance, and notifying customers of upcoming license renewals. This data will not be sold or disclosed to third parties.\u003c/p\u003e","title":"Privacy Policy"},{"content":"Downloads and License Information Newly purchased products at Virtualmin.com are available immediately on My Account ⇾ Dashboard page. Install scripts for supported platforms are provided, as well as serial number and license keys for upgrading our open source products to Professional versions or downloading individual components from our software repository.\nGeneral Terms and Conditions Virtualmin, Inc. does not warrant that the contents of our website are error-free. Information on the site may contain inaccuracies or other errors and may be changed at any time without notice. Virtualmin, Inc. may make changes to the products or services or the Partner Program at any time without notice. Virtualmin, Inc. will make reasonable efforts to maintain accurate and up-to-date information on the site but makes no warranty of its accuracy, completeness or timeliness.\nDisclaimer/Limitation of Liability The materials on the Virtualmin.com website are provided as is and without warranties of any kind either express or implied. To the fullest extent possible under applicable law, Virtualmin, Inc. disclaims all warranties expressed or implied, including, but not limited to, implied warranties of merchantability, fitness for a particular purpose, or non-infringement or other violation of rights.\nUnder no circumstances, including but not limited to negligence, will Virtualmin, Inc. be liable to any party for any direct, indirect, special, or other consequential damages for any use of the contents and services on Virtualmin.com, or on any other linked website, including, without limitation, any lost revenue, business interruption, loss of data, even if we are expressly advised of the possibility of such damages.\nDownloadable Software Software that is made available for download from Virtualmin.com, is the copyrighted work of Virtualmin, Inc., and/or its suppliers. Your use of the Software is governed by the terms of the end user license agreement, if any, which accompanies or is included with the Software (License Agreement). You may not install or use any Software that is accompanied by or includes a License Agreement unless you first agree to the License Agreement terms. For any Software not accompanied by a license agreement, Virtualmin, Inc. hereby grants to you, the user, a personal, nontransferable, nonexclusive license to use the Software for viewing and use in accordance with these Terms, and for no other purpose, provided that you keep intact all copyright and other proprietary notices. All Software is owned by Virtualmin, Inc. and/or its suppliers and is protected by copyright laws and international treaty provisions. Any reproduction or redistribution of the Software is expressly prohibited by law, and may result in severe civil and criminal penalties. Violators will be prosecuted to the maximum extent possible.\nPurchasing Software Credit card orders will be processed in real-time, and the purchased software will be available immediately after payment approval at My Account ⇾ Dashboard page. In order to insure you receive the latest version available, purchased software is made available in downloadable form only. No physical media will be delivered to you. If you have trouble downloading or installing your purchased software, please create a customer support issue. Please mark the issue private if you are including any sensitive information, such as license details or install logs, in your ticket.\nRefunds and Cancellation If you are unsatisfied with your Virtualmin, Inc. product or would like to cancel your order, for any reason, you may request a full refund within 30 days of purchase. Your updates subscription and software license key will be invalidated and the charge(s) to your credit card will be refunded. Partnership Program membership, if any, may also be revoked, if your remaining purchases no longer meet the minimum specified for membership. To request a refund, open a support ticket. Please include the serial number of the license you wish to cancel.\n","permalink":"https://www.virtualmin.com/terms-and-conditions/","summary":"\u003ch3 id=\"downloads-and-license-information\"\u003eDownloads and License Information\u003c/h3\u003e\n\u003cp\u003eNewly purchased products at \u003cem\u003eVirtualmin.com\u003c/em\u003e are available immediately on \u003ca href=\"/account/\"\u003eMy Account ⇾ Dashboard\u003c/a\u003e page. Install scripts for supported platforms are provided, as well as serial number and license keys for upgrading our open source products to Professional versions or downloading individual components from our software repository.\u003c/p\u003e\n\u003ch3 id=\"general-terms-and-conditions\"\u003eGeneral Terms and Conditions\u003c/h3\u003e\n\u003cp\u003eVirtualmin, Inc. does not warrant that the contents of our website are error-free. Information on the site may contain inaccuracies or other errors and may be changed at any time without notice. Virtualmin, Inc. may make changes to the products or services or the Partner Program at any time without notice. Virtualmin, Inc. will make reasonable efforts to maintain accurate and up-to-date information on the site but makes no warranty of its accuracy, completeness or timeliness.\u003c/p\u003e","title":"Terms and Conditions"},{"content":" Update host and domain default page #629 Add support for different Let\u0026rsquo;s Encrypt compatible CAs Add checks for PHP FPM port mismatches and collisions Add API to setup Virtualmin default hostname SSL Add mass password update API in Virtualmin CLI Add mass modify users API in Virtualmin CLI Add various improvements and fixes to Cloudflare DNS Add a flag to show more details when purging backups Add support for fetching mail logs from journalctl if there are no regular log files available Changed password hashing to be enabled by default on all new installs Fix to allow domain name check to be skipped in domain creation time Fix backups when DNS zone is hosted on Cloudmin services Fix various bugs for S3 backups Fix syncing of SSL cert to MySQL/MariaDB #571 Fix to break possible linkage to snakeoil cert and key Fix to show progress when checking php.ini files in config check Fix to convert SSL private key to PKCS1 for MySQL/MariaDB Fix various issues when cloning virtual servers Fix to make extra sure that old FPM pool is deleted Fix to ue 127.0.0.1 instead of localhost for DKIM milters Fix placeholder when toggled for create initial web page option Fix to make sure the PHP log file exists for logrotate not fail #596 Fix to make sure that parallel backups don\u0026rsquo;t fail Fix to preserve PHP log when changing PHP version Fix to re-enable connectivity check by default for all new installs Fix to drop creating host default domain in Virtualmin wizard and instead use a new setting in Virtualmin Configuration page, under SSL Settings ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.8-released/","summary":"\u003cul\u003e\n\u003cli\u003eUpdate host and domain default page \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/issues/629\"\u003e#629\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd support for different Let\u0026rsquo;s Encrypt compatible CAs\u003c/li\u003e\n\u003cli\u003eAdd checks for PHP FPM port mismatches and collisions\u003c/li\u003e\n\u003cli\u003eAdd API to setup Virtualmin default hostname SSL\u003c/li\u003e\n\u003cli\u003eAdd mass password update API in Virtualmin CLI\u003c/li\u003e\n\u003cli\u003eAdd mass modify users API in Virtualmin CLI\u003c/li\u003e\n\u003cli\u003eAdd various improvements and fixes to Cloudflare DNS\u003c/li\u003e\n\u003cli\u003eAdd a flag to show more details when purging backups\u003c/li\u003e\n\u003cli\u003eAdd support for fetching mail logs from \u003ccode\u003ejournalctl\u003c/code\u003e if there are no regular log files available\u003c/li\u003e\n\u003cli\u003eChanged password hashing to be enabled by default on all new installs\u003c/li\u003e\n\u003cli\u003eFix to allow domain name check to be skipped in domain creation time\u003c/li\u003e\n\u003cli\u003eFix backups when DNS zone is hosted on Cloudmin services\u003c/li\u003e\n\u003cli\u003eFix various bugs for S3 backups\u003c/li\u003e\n\u003cli\u003eFix syncing of SSL cert to MySQL/MariaDB \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/issues/571\"\u003e#571\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix to break possible linkage to \u003ccode\u003esnakeoil\u003c/code\u003e cert and key\u003c/li\u003e\n\u003cli\u003eFix to show progress when checking \u003ccode\u003ephp.ini\u003c/code\u003e files in config check\u003c/li\u003e\n\u003cli\u003eFix to convert SSL private key to \u003ccode\u003ePKCS1\u003c/code\u003e for MySQL/MariaDB\u003c/li\u003e\n\u003cli\u003eFix various issues when cloning virtual servers\u003c/li\u003e\n\u003cli\u003eFix to make extra sure that old FPM pool is deleted\u003c/li\u003e\n\u003cli\u003eFix to ue \u003ccode\u003e127.0.0.1\u003c/code\u003e instead of \u003ccode\u003elocalhost\u003c/code\u003e for DKIM milters\u003c/li\u003e\n\u003cli\u003eFix placeholder when toggled for create initial web page option\u003c/li\u003e\n\u003cli\u003eFix to make sure the PHP log file exists for logrotate not fail \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/issues/596\"\u003e#596\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix to make sure that parallel backups don\u0026rsquo;t fail\u003c/li\u003e\n\u003cli\u003eFix to preserve PHP log when changing PHP version\u003c/li\u003e\n\u003cli\u003eFix to re-enable connectivity check by default for all new installs\u003c/li\u003e\n\u003cli\u003eFix to drop creating host default domain in Virtualmin wizard and instead use a new setting in Virtualmin Configuration page, under SSL Settings\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.8 released"},{"content":" Fix support for enabling and disabling the HTTP2 protocol Fix several bugs in the creation of AAAA and MX records Fix bugs in the management of secondary mail servers Fix creating mail forwards and auto-replies Add automatic use of Cloud credentials if available when backing up to S3 or GCS running on Amazon EC2 or Google Compute Engine ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.7-released/","summary":"\u003cul\u003e\n\u003cli\u003eFix support for enabling and disabling the \u003ccode\u003eHTTP2\u003c/code\u003e protocol\u003c/li\u003e\n\u003cli\u003eFix several bugs in the creation of \u003ccode\u003eAAAA\u003c/code\u003e and \u003ccode\u003eMX\u003c/code\u003e records\u003c/li\u003e\n\u003cli\u003eFix bugs in the management of secondary mail servers\u003c/li\u003e\n\u003cli\u003eFix creating mail forwards and auto-replies\u003c/li\u003e\n\u003cli\u003eAdd automatic use of Cloud credentials if available when backing up to S3 or GCS running on Amazon EC2 or Google Compute Engine\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.7 released"},{"content":" Add ability to host DNS zones on remote Webmin servers Add support for EC SSL certificates Add support for remote databases for PostgreSQL in the same way as MySQL Add an option to share the same DNS zone file with different owners ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.6-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdd ability to host DNS zones on remote Webmin servers\u003c/li\u003e\n\u003cli\u003eAdd support for EC SSL certificates\u003c/li\u003e\n\u003cli\u003eAdd support for remote databases for PostgreSQL in the same way as MySQL\u003c/li\u003e\n\u003cli\u003eAdd an option to share the same DNS zone file with different owners\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.6 released"},{"content":" Fixed the way PHP extensions are enabled when installing scripts Cpanel migration fixes for parked domains Bugfixes for setting the limit on the number of processes in PHP FPM mode Added support for enabling an SSL website automatically Added buttons to start and stop the SASLauthd server Implemented support for backups to Azure Blob Storage Added support for enabling a PHP log file and a UI for viewing it Added a link to the new Webmin Terminal module for logging in as a domain owner The aws and b2 command paths are now detected automatically Numerous bugfixes in support for Cloud DNS providers ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.5-released/","summary":"\u003cul\u003e\n\u003cli\u003eFixed the way PHP extensions are enabled when installing scripts\u003c/li\u003e\n\u003cli\u003eCpanel migration fixes for parked domains\u003c/li\u003e\n\u003cli\u003eBugfixes for setting the limit on the number of processes in PHP FPM mode\u003c/li\u003e\n\u003cli\u003eAdded support for enabling an SSL website automatically\u003c/li\u003e\n\u003cli\u003eAdded buttons to start and stop the SASLauthd server\u003c/li\u003e\n\u003cli\u003eImplemented support for backups to Azure Blob Storage\u003c/li\u003e\n\u003cli\u003eAdded support for enabling a PHP log file and a UI for viewing it\u003c/li\u003e\n\u003cli\u003eAdded a link to the new Webmin Terminal module for logging in as a domain owner\u003c/li\u003e\n\u003cli\u003eThe \u003ccode\u003eaws\u003c/code\u003e and \u003ccode\u003eb2\u003c/code\u003e command paths are now detected automatically\u003c/li\u003e\n\u003cli\u003eNumerous bugfixes in support for Cloud DNS providers\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.5 released"},{"content":" Bug fixes release ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.4-released/","summary":"\u003cul\u003e\n\u003cli\u003eBug fixes release\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.4 released"},{"content":" Added support for the upcoming WebSockets Terminal module Added support to force-refresh domains expiration status Added a feature to display DNS text records in a column by virtualmin-gpl#468 Added help for --letsencrypt and --letsencrypt-always by virtualmin-gpl#470 Added DKIM records to be shown in suggested list Fixed to allow resellers of virtual servers to change PHP mode too Fixed support for OAuth app enrollment for Google Cloud Storage and DNS ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.3-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdded support for the upcoming WebSockets Terminal module\u003c/li\u003e\n\u003cli\u003eAdded support to force-refresh domains expiration status\u003c/li\u003e\n\u003cli\u003eAdded a feature to display DNS text records in a column by \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/pull/468\"\u003evirtualmin-gpl#468\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdded help for \u003ccode\u003e--letsencrypt\u003c/code\u003e and \u003ccode\u003e--letsencrypt-always\u003c/code\u003e by \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/pull/470\"\u003evirtualmin-gpl#470\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdded DKIM records to be shown in suggested list\u003c/li\u003e\n\u003cli\u003eFixed to allow resellers of virtual servers to change PHP mode too\u003c/li\u003e\n\u003cli\u003eFixed support for OAuth app enrollment for Google Cloud Storage and DNS\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.3 released"},{"content":" Add significant improvements to CloudFlare DNS support including proxying and importing existing zones Add multiple FPM improvements in #425 Add .well-known location work with proxy enabled sites in #422 Add repos check and throw an error if outdated in #434 Add an API command to mass update IPs in b239113 Add DKIM DNS record check and split up table showing DKIM keys Add various DNS related improvements Fix support for WHMCS 8.5.x automatic post-install and upgrades Fix to default to PHP-FPM on new installs Fix to drop adding no longer needed \u0026lt;Proxy *\u0026gt; directives in #423 Fix to use Require all granted directives with Apache 2.4 in #424 Fix to remove download immediately option in #379 Fix to make sure that actual PHP version is set by the script in #437 Fix PHP max children logic in #439 Fix upgrades to Pro work correctly for both Virtualmin 6 and 7 installs Fix to turn off autoconfig when email is disabled for a domain #408 Fix to use correct field for DNS slave servers Fix to include Virtualmin Pro API commands in virtualmin --help output ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.2-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdd significant improvements to CloudFlare DNS support including proxying and importing existing zones\u003c/li\u003e\n\u003cli\u003eAdd multiple FPM improvements in \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/pull/425\"\u003e#425\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd .well-known location work with proxy enabled sites in \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/pull/422\"\u003e#422\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd repos check and throw an error if outdated in \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/pull/434\"\u003e#434\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd an API command to mass update IPs in \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/commit/b239113928997115c617b7a4afa482ecd7815358\"\u003eb239113\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd DKIM DNS record check and split up table showing DKIM keys\u003c/li\u003e\n\u003cli\u003eAdd various DNS related improvements\u003c/li\u003e\n\u003cli\u003eFix support for WHMCS 8.5.x automatic post-install and upgrades\u003c/li\u003e\n\u003cli\u003eFix to default to PHP-FPM on new installs\u003c/li\u003e\n\u003cli\u003eFix to drop adding no longer needed \u003ccode\u003e\u0026lt;Proxy *\u0026gt;\u003c/code\u003e directives in \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/pull/423\"\u003e#423\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix to use Require all granted directives with Apache 2.4 in \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/pull/424\"\u003e#424\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix to remove download immediately option in \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/pull/379\"\u003e#379\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix to make sure that actual PHP version is set by the script in \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/pull/437\"\u003e#437\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix PHP max children logic in \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/pull/439\"\u003e#439\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix upgrades to Pro work correctly for both Virtualmin 6 and 7 installs\u003c/li\u003e\n\u003cli\u003eFix to turn off autoconfig when email is disabled for a domain \u003ca href=\"https://github.com/virtualmin/virtualmin-gpl/issues/408\"\u003e#408\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix to use correct field for DNS slave servers\u003c/li\u003e\n\u003cli\u003eFix to include Virtualmin Pro API commands in \u003ccode\u003evirtualmin --help\u003c/code\u003e output\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.2 released"},{"content":" Fix a bug upon disabling mod_php Fix quota test when installing scripts Fix not to apply self-signed certificate in post-install wizard Fix to test that a domain name cannot be an IP Fix to support detection of a new Debian/Ubuntu repo key format Fix MariaDB error upon wizard setup on RHEL 8.5 and derivatives Fix MariaDB bug upon virtual server restore Fix not to call before/after functions when using a cloud DNS provider Fix to improve detection of default IPv6 address Fix not to email about scripts which cannot be upgraded Update translations ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.1-released/","summary":"\u003cul\u003e\n\u003cli\u003eFix a bug upon disabling \u003ccode\u003emod_php\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eFix quota test when installing scripts\u003c/li\u003e\n\u003cli\u003eFix not to apply self-signed certificate in post-install wizard\u003c/li\u003e\n\u003cli\u003eFix to test that a domain name cannot be an IP\u003c/li\u003e\n\u003cli\u003eFix to support detection of a new Debian/Ubuntu repo key format\u003c/li\u003e\n\u003cli\u003eFix MariaDB error upon wizard setup on RHEL 8.5 and derivatives\u003c/li\u003e\n\u003cli\u003eFix MariaDB bug upon virtual server restore\u003c/li\u003e\n\u003cli\u003eFix not to call before/after functions when using a cloud DNS provider\u003c/li\u003e\n\u003cli\u003eFix to improve detection of default IPv6 address\u003c/li\u003e\n\u003cli\u003eFix not to email about scripts which cannot be upgraded\u003c/li\u003e\n\u003cli\u003eUpdate translations\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.1 released"},{"content":" Add fcgiwrap to execute CGI scripts on systems without suexec Add the reset-feature API command and a tab on the Validate Virtual Servers page Add a configuration option and flag to create-domain to allow SSL linkage across domain owners Add to enable HTTP2 for Apache or Nginx if supported Add support for outgoing SMTP providers like Amazon SES, so that systems with dynamic IPs can reliably send email Add ability to restrict reseller access to rename domains, manage extra admins, configure proxies, create, delete and edit virtual servers Add ability to download backups in the browser via a link displaying the progress Add ability to configure location of SSL certificate and key files at the template level Fix zip format backups to use zip for archive files inside the backup as well Removed Apache mod_php support and is no longer recommended for running PHP Removed the mostly useless configuration check for 127.0.0.1 in /etc/resolv.conf ","permalink":"https://www.virtualmin.com/changelog/virtualmin-7.0-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003efcgiwrap\u003c/code\u003e to execute CGI scripts on systems without \u003ccode\u003esuexec\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAdd the reset-feature API command and a tab on the \u003cstrong\u003eValidate Virtual Servers\u003c/strong\u003e page\u003c/li\u003e\n\u003cli\u003eAdd a configuration option and flag to \u003ccode\u003ecreate-domain\u003c/code\u003e to allow SSL linkage across domain owners\u003c/li\u003e\n\u003cli\u003eAdd to enable HTTP2 for Apache or Nginx if supported\u003c/li\u003e\n\u003cli\u003eAdd support for outgoing SMTP providers like \u003cstrong\u003eAmazon SES\u003c/strong\u003e, so that systems with dynamic IPs can reliably send email\u003c/li\u003e\n\u003cli\u003eAdd ability to restrict reseller access to rename domains, manage extra admins, configure proxies, create, delete and edit virtual servers\u003c/li\u003e\n\u003cli\u003eAdd ability to download backups in the browser via a link displaying the progress\u003c/li\u003e\n\u003cli\u003eAdd ability to configure location of SSL certificate and key files at the template level\u003c/li\u003e\n\u003cli\u003eFix \u003cem\u003ezip\u003c/em\u003e format backups to use \u003cem\u003ezip\u003c/em\u003e for archive files inside the backup as well\u003c/li\u003e\n\u003cli\u003eRemoved Apache \u003ccode\u003emod_php\u003c/code\u003e support and is no longer recommended for running PHP\u003c/li\u003e\n\u003cli\u003eRemoved the mostly useless configuration check for \u003cem\u003e127.0.0.1\u003c/em\u003e in \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 7.0 released"},{"content":" Added a field to the virtual server creation page to use an existing SSH key for logins, or generate a new key. If needed, Virtualmin will configure the exact PHP version required to run scripts when installed. Two-factor authentication for Usermin is setup for domain owners at the same time as Virtualmin. Added the create-login-link API command to login as a domain owner without a password. Massively simplified the SSL Certificate page for services certificates. Added a field for entering an SSH private key file for use in backups, instead of a password. Virtualmin Pro also includes a number of new cloud DNS providers (in addition to Route 53 support that\u0026rsquo;s already been in for a while), including Cloudflare and Google Cloud DNS, which is a preview of features to come in Virtualmin Pro version 7. These are very large new features, and should be considered beta. Don\u0026rsquo;t rely on them in production until you thoroughly test your use case, but do let us know if you find any bugs.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-6.17-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdded a field to the virtual server creation page to use an existing SSH key for logins, or generate a new key.\u003c/li\u003e\n\u003cli\u003eIf needed, Virtualmin will configure the exact PHP version required to run scripts when installed.\u003c/li\u003e\n\u003cli\u003eTwo-factor authentication for Usermin is setup for domain owners at the same time as Virtualmin.\u003c/li\u003e\n\u003cli\u003eAdded the \u003ccode\u003ecreate-login-link\u003c/code\u003e API command to login as a domain owner without a password.\u003c/li\u003e\n\u003cli\u003eMassively simplified the SSL Certificate page for services certificates.\u003c/li\u003e\n\u003cli\u003eAdded a field for entering an SSH private key file for use in backups, instead of a password.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVirtualmin Pro also includes a number of new cloud DNS providers (in addition to Route 53 support that\u0026rsquo;s already been in for a while), including Cloudflare and Google Cloud DNS, which is a preview of features to come in Virtualmin Pro version 7. These are very large new features, and should be considered beta. Don\u0026rsquo;t rely on them in production until you thoroughly test your use case, but do let us know if you find any bugs.\u003c/p\u003e","title":"Virtualmin 6.17 released"},{"content":" Bug fixes release ","permalink":"https://www.virtualmin.com/changelog/virtualmin-6.16-released/","summary":"\u003cul\u003e\n\u003cli\u003eBug fixes release\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 6.16 released"},{"content":"This major update re-designs the PHP options page, adds the ability to request SSL certs for all virtual servers, and allows DNS hosting to be offloaded to Amazon Route 53.\nConsolidated all PHP options into a single page, and moved website options to it\u0026rsquo;s own page in the UI. SSL certificates can now be generated and managed for virtual servers even when they don\u0026rsquo;t have the SSL feature enabled. Added the Cloud DNS Providers page, for configuring Virtualmin to use Route53 to host DNS rather than doing it locally. ","permalink":"https://www.virtualmin.com/changelog/virtualmin-6.15-released/","summary":"\u003cp\u003eThis major update re-designs the PHP options page, adds the ability to request SSL certs for all virtual servers, and allows DNS hosting to be offloaded to Amazon Route 53.\u003c/p\u003e\n\n\n\n\n  \u003cdetails class=\"post-content-indent-details\" open\u003e\n      \u003csummary\u003e\n        \u003cspan class=\"details\"\u003e\n        \u003ci class='wm wm-fw wm-newspaper'\u003e\u003c/i\u003e\n        \u003c/span\u003e\n      \u003c/summary\u003e\n      \u003cdiv class=\"inner\"\u003e\n\n\n\u003cul\u003e\n\u003cli\u003eConsolidated all PHP options into a single page, and moved website options to it\u0026rsquo;s own page in the UI.\u003c/li\u003e\n\u003cli\u003eSSL certificates can now be generated and managed for virtual servers even when they don\u0026rsquo;t have the SSL feature enabled.\u003c/li\u003e\n\u003cli\u003eAdded the Cloud DNS Providers page, for configuring Virtualmin to use Route53 to host DNS rather than doing it locally.\n      \u003c/div\u003e\n  \u003c/details\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 6.15 released"},{"content":"This is a bugfix release to resolve problems in PHP FPM support and the encoding used when sending email.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-6.14-released/","summary":"\u003cp\u003eThis is a bugfix release to resolve problems in PHP FPM support and the encoding used when sending email.\u003c/p\u003e","title":"Virtualmin 6.14 released"},{"content":"This release adds Backblaze backup support, automatic cleanup of PHP session files, Dovecot SSL certificates fixes, much improved support for MySQL user management, IPv6-related bugfixes and much more.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-6.13-released/","summary":"\u003cp\u003eThis release adds Backblaze backup support, automatic cleanup of PHP session files, Dovecot SSL certificates fixes, much improved support for MySQL user management, IPv6-related bugfixes and much more.\u003c/p\u003e","title":"Virtualmin 6.13 released"},{"content":" Added the set-dkim API command to enable and disable DKIM. The compression format can now be selected on a per-backup basis. Scheduled backups can have a descriptive comment for recording their purpose, which is also displayed in backup logs. Per-domain SSL certifcates can now be setup in Postfix, if running version 3.4 or later. Updated the SSL Certificate page to allow more control over per-domain certs for Webmin, Usermin, Postfix and Dovecot. Many language updates. ","permalink":"https://www.virtualmin.com/changelog/virtualmin-6.10-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdded the set-dkim API command to enable and disable DKIM.\u003c/li\u003e\n\u003cli\u003eThe compression format can now be selected on a per-backup basis.\u003c/li\u003e\n\u003cli\u003eScheduled backups can have a descriptive comment for recording their purpose, which is also displayed in backup logs.\u003c/li\u003e\n\u003cli\u003ePer-domain SSL certifcates can now be setup in Postfix, if running version 3.4 or later.\u003c/li\u003e\n\u003cli\u003eUpdated the SSL Certificate page to allow more control over per-domain certs for Webmin, Usermin, Postfix and Dovecot.\u003c/li\u003e\n\u003cli\u003eMany language updates.\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 6.10 released"},{"content":" Bug fixes release ","permalink":"https://www.virtualmin.com/changelog/virtualmin-6.11-released/","summary":"\u003cul\u003e\n\u003cli\u003eBug fixes release\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 6.11 released"},{"content":" Support for systems without suEXEC, like CentOS 8. Simpler UI for turning on redirect to SSL. API command to sync TLSA records. A bunch of other small bugfixes and features. ","permalink":"https://www.virtualmin.com/changelog/virtualmin-6.09-released/","summary":"\u003cul\u003e\n\u003cli\u003eSupport for systems without suEXEC, like CentOS 8.\u003c/li\u003e\n\u003cli\u003eSimpler UI for turning on redirect to SSL.\u003c/li\u003e\n\u003cli\u003eAPI command to sync TLSA records.\u003c/li\u003e\n\u003cli\u003eA bunch of other small bugfixes and features.\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 6.09 released"},{"content":" Fixes for several security issues that could be exploited by domain owners.\nThanks to RACK911 Labs for finding and reporting these!\nMuch improved MariaDB 10.x support.\nVirtual servers to backup can now be selected by reseller.\nFixes for Dropbox backup problems.\nFixes for FPM port collision problem.\nThe Dropbox fix also needs a Webmin update to 1.932 (also rolled out today). The updated MariaDB 10.x support means we can finally support Debian 10 and CentOS 8. Debian 10 support should be announced in a day or two (we\u0026rsquo;re testing and it looks good so far), and CentOS 8 soon after.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-6.08-released/","summary":"\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFixes for several security issues that could be exploited by domain owners.\u003c/p\u003e\n\u003cp\u003eThanks to RACK911 Labs for finding and reporting these!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMuch improved MariaDB 10.x support.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVirtual servers to backup can now be selected by reseller.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixes for Dropbox backup problems.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixes for FPM port collision problem.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe Dropbox fix also needs a Webmin update to 1.932 (also rolled out today). The updated MariaDB 10.x support means we can finally support Debian 10 and CentOS 8. Debian 10 support should be announced in a day or two (we\u0026rsquo;re testing and it looks good so far), and CentOS 8 soon after.\u003c/p\u003e","title":"Virtualmin 6.08 released"},{"content":" Virtual servers to backup can now be selected by reseller. DMARC ordering, RUF and RUA parameter fixes. Fixes for encrypted backups and key generation. Backup and restore fixes for quotas, Dropbox, and alias domains. Many Install Script updates. Various bug fixes. ","permalink":"https://www.virtualmin.com/changelog/virtualmin-6.07-released/","summary":"\u003cul\u003e\n\u003cli\u003eVirtual servers to backup can now be selected by reseller.\u003c/li\u003e\n\u003cli\u003eDMARC ordering, RUF and RUA parameter fixes.\u003c/li\u003e\n\u003cli\u003eFixes for encrypted backups and key generation.\u003c/li\u003e\n\u003cli\u003eBackup and restore fixes for quotas, Dropbox, and alias domains.\u003c/li\u003e\n\u003cli\u003eMany Install Script updates.\u003c/li\u003e\n\u003cli\u003eVarious bug fixes.\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 6.07 released"},{"content":"This release adds support for multiple PHP-FPM versions, the ability to backup via Webmin\u0026rsquo;s RPC protocol, improved MySQL 8 support, the ability to import existing GPG keys, and a bunch of other bugfixes and minor features.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-6.06-released/","summary":"\u003cp\u003eThis release adds support for multiple PHP-FPM versions, the ability to backup via Webmin\u0026rsquo;s RPC protocol, improved MySQL 8 support, the ability to import existing GPG keys, and a bunch of other bugfixes and minor features.\u003c/p\u003e","title":"Virtualmin 6.06 released"},{"content":"This release allows domain owners to restore global backups, adds support for wildcard Let\u0026rsquo;s Encrypt certs, fixes license updates, and allows the domain name used in links from virtualmin to be customized.\nScheduled backups created by root can now be designated as allowing restore by virtual server owners, so that they don\u0026rsquo;t have to maintain their own backups. When used with Webmin 1.900 or above, Let\u0026rsquo;s Encrypt SSL certificates can be requested for wildcard domains. The domain name used in links to a server\u0026rsquo;s website can now be customized to use one of its aliases instead. Many Install Script updates. Bug fixed in change-license CLI command that would prevent it from correctly re-checking the license after changing it. ","permalink":"https://www.virtualmin.com/changelog/virtualmin-6.05-released/","summary":"\u003cp\u003eThis release allows domain owners to restore global backups, adds support for wildcard Let\u0026rsquo;s Encrypt certs, fixes license updates, and allows the domain name used in links from virtualmin to be customized.\u003c/p\u003e\n\n\n\n\n  \u003cdetails class=\"post-content-indent-details\" open\u003e\n      \u003csummary\u003e\n        \u003cspan class=\"details\"\u003e\n        \u003ci class='wm wm-fw wm-newspaper'\u003e\u003c/i\u003e\n        \u003c/span\u003e\n      \u003c/summary\u003e\n      \u003cdiv class=\"inner\"\u003e\n\n\n\u003cul\u003e\n\u003cli\u003eScheduled backups created by root can now be designated as allowing restore by virtual server owners, so that they don\u0026rsquo;t have to maintain their own backups.\u003c/li\u003e\n\u003cli\u003eWhen used with Webmin 1.900 or above, Let\u0026rsquo;s Encrypt SSL certificates can be requested for wildcard domains.\u003c/li\u003e\n\u003cli\u003eThe domain name used in links to a server\u0026rsquo;s website can now be customized to use one of its aliases instead.\u003c/li\u003e\n\u003cli\u003eMany Install Script updates.\u003c/li\u003e\n\u003cli\u003eBug fixed in \u003ccode\u003echange-license\u003c/code\u003e CLI command that would prevent it from correctly re-checking the license after changing it.\n      \u003c/div\u003e\n  \u003c/details\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 6.05 released"},{"content":" Before a DNS zone is updated, BIND will be told to freeze it and thaw afterwards. This ensures that dynamic updates are preserved. Dovecot and Postfix per-IP SSL certificate setup can now be configured on a per-template basis. Redirects for / created using the UI are automatically adjusted to exclude Let’s Encrypt validation paths. Various bugfixes, script updates, typos, and minor UI improvements. ","permalink":"https://www.virtualmin.com/changelog/virtualmin-6.04-released/","summary":"\u003cul\u003e\n\u003cli\u003eBefore a DNS zone is updated, BIND will be told to freeze it and thaw afterwards. This ensures that dynamic updates are preserved.\u003c/li\u003e\n\u003cli\u003eDovecot and Postfix per-IP SSL certificate setup can now be configured on a per-template basis.\u003c/li\u003e\n\u003cli\u003eRedirects for / created using the UI are automatically adjusted to exclude Let’s Encrypt validation paths.\u003c/li\u003e\n\u003cli\u003eVarious bugfixes, script updates, typos, and minor UI improvements.\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 6.04 released"},{"content":"This release includes multiple script installer updates, removes support for PHP 4 but adds 7.2, improves the handling of dynamic DNS zones, and fixes a bunch of small bugs.\nWhen adding an alias to a domain with a Let’s Encrypt SSL certificate, the cert is automatically updated to include the alias domain. Backups from cPanel, Plesk and other control panels can now be migrated even when Nginx is used as a webserver. Numerous Script Installer updates. ","permalink":"https://www.virtualmin.com/changelog/virtualmin-6.03-released/","summary":"\u003cp\u003eThis release includes multiple script installer updates, removes support for PHP 4 but adds 7.2, improves the handling of dynamic DNS zones, and fixes a bunch of small bugs.\u003c/p\u003e\n\n\n\n\n  \u003cdetails class=\"post-content-indent-details\" open\u003e\n      \u003csummary\u003e\n        \u003cspan class=\"details\"\u003e\n        \u003ci class='wm wm-newspaper'\u003e\u003c/i\u003e\n        \u003c/span\u003e\n      \u003c/summary\u003e\n      \u003cdiv class=\"inner\"\u003e\n\n\n\u003cul\u003e\n\u003cli\u003eWhen adding an alias to a domain with a Let’s Encrypt SSL certificate, the cert is automatically updated to include the alias domain.\u003c/li\u003e\n\u003cli\u003eBackups from cPanel, Plesk and other control panels can now be migrated even when Nginx is used as a webserver.\u003c/li\u003e\n\u003cli\u003eNumerous Script Installer updates.\n      \u003c/div\u003e\n  \u003c/details\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 6.03 released"},{"content":" When adding an alias to a domain with a Let\u0026rsquo;s Encrypt SSL certificate, the cert is automatically updated to include the alias domain. Backups from cPanel, Plesk and other control panels can now be migrated even when Nginx is used as a webserver. Many Install Script updates Conversion of WordPress to use WP-CLI when available for many operations Minor Dropbox backups support bug fixes Support per-domain SSL certificates in most services not previously covered (when domain has a dedicated IP address) Numerous other bugfixes and minor enhancements Updates for OwnCloud, Node.js, SuiteCRM, IonCube, Joomla, Mantis, Piwik, LimeSurvey, Drupal, and MediaWiki Fixes for some forms under the new theme version (most importantly Website Options) Minor bugfixes in migrations, backups and validation Remove PHP4 support (this seems more than minor, and is actually a pretty big bunch of code changed/removed, but no one should be running PHP4 at this point, as it has been end-of-lifed by the PHP folks for years and is not supported on any distribution we currently support). ","permalink":"https://www.virtualmin.com/changelog/virtualmin-6.02-released/","summary":"\u003cul\u003e\n\u003cli\u003eWhen adding an alias to a domain with a Let\u0026rsquo;s Encrypt SSL certificate, the cert is automatically updated to include the alias domain.\u003c/li\u003e\n\u003cli\u003eBackups from cPanel, Plesk and other control panels can now be migrated even when Nginx is used as a webserver.\u003c/li\u003e\n\u003cli\u003eMany Install Script updates\u003c/li\u003e\n\u003cli\u003eConversion of WordPress to use WP-CLI when available for many operations\u003c/li\u003e\n\u003cli\u003eMinor Dropbox backups support bug fixes\u003c/li\u003e\n\u003cli\u003eSupport per-domain SSL certificates in most services not previously covered (when domain has a dedicated IP address)\u003c/li\u003e\n\u003cli\u003eNumerous other bugfixes and minor enhancements\u003c/li\u003e\n\u003cli\u003eUpdates for OwnCloud, Node.js, SuiteCRM, IonCube, Joomla, Mantis, Piwik, LimeSurvey, Drupal, and MediaWiki\u003c/li\u003e\n\u003cli\u003eFixes for some forms under the new theme version (most importantly Website Options)\u003c/li\u003e\n\u003cli\u003eMinor bugfixes in migrations, backups and validation\u003c/li\u003e\n\u003cli\u003eRemove PHP4 support (this seems more than minor, and is actually a pretty big bunch of code changed/removed, but no one should be running PHP4 at this point, as it has been end-of-lifed by the PHP folks for years and is not supported on any distribution we currently support).\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 6.02 released"},{"content":" Multiple remote MySQL servers can now be defined, and selected on a per-domain basis at virtual server creation time. This allows some or all domains to easily use different MySQL hosts. Support for rating scripts and viewing existing ratings has been removed, as this was a confusing and rarely-used feature. Installable scripts can now be in multiple categories, and the UI has been updated to reflect this. Fixed WordPress Install Script invisibility on some platforms. New Dropbox API support. Fixed File Manager link for domain owners. A variety of other minor bugfixes. BIND DNS feature bug that leads to “none” being inserted into zones (which is invalid syntax, so causes BIND to not start) Inability to create/delete databases as domain owner user (this was an access control issue, with too little privilege available when performing the action as a domain owner user). Also creates a combined with CA SSL certificate bundle when setting up SSL (which can be used for cases where separate files don’t work). ","permalink":"https://www.virtualmin.com/changelog/virtualmin-6.01-released/","summary":"\u003cul\u003e\n\u003cli\u003eMultiple remote MySQL servers can now be defined, and selected on a per-domain basis at virtual server creation time. This allows some or all domains to easily use different MySQL hosts.\u003c/li\u003e\n\u003cli\u003eSupport for rating scripts and viewing existing ratings has been removed, as this was a confusing and rarely-used feature.\u003c/li\u003e\n\u003cli\u003eInstallable scripts can now be in multiple categories, and the UI has been updated to reflect this.\u003c/li\u003e\n\u003cli\u003eFixed WordPress Install Script invisibility on some platforms.\u003c/li\u003e\n\u003cli\u003eNew Dropbox API support.\u003c/li\u003e\n\u003cli\u003eFixed File Manager link for domain owners.\u003c/li\u003e\n\u003cli\u003eA variety of other minor bugfixes.\u003c/li\u003e\n\u003cli\u003eBIND DNS feature bug that leads to “none” being inserted into zones (which is invalid syntax, so causes BIND to not start)\u003c/li\u003e\n\u003cli\u003eInability to create/delete databases as domain owner user (this was an access control issue, with too little privilege available when performing the action as a domain owner user).\u003c/li\u003e\n\u003cli\u003eAlso creates a combined with CA SSL certificate bundle when setting up SSL (which can be used for cases where separate files don’t work).\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 6.01 released"},{"content":"This mostly a bugfix release, including fixes to bugs found during the beta 5.99 release. The final pieces of Virtualmin 6, the installer, virtualmin-config package, and libraries, will be moved into place later today for a \u0026ldquo;soft launch\u0026rdquo; of Virtualmin 6 (it\u0026rsquo;ll be another day before the docs are fully updated to cover the new stuff).\nRemoved support for Qmail+LDAP as a mail server. Unexpected server processes running as domain users are now detected and included in the validation report, and can optionally be automatically terminated. Added support for using clamdscan for remote virus scanning, so that clamd-stream-client doesn\u0026rsquo;t need to be installed. ","permalink":"https://www.virtualmin.com/changelog/virtualmin-6.00-released/","summary":"\u003cp\u003eThis mostly a bugfix release, including fixes to bugs found during the beta 5.99 release. The final pieces of Virtualmin 6, the installer, virtualmin-config package, and libraries, will be moved into place later today for a \u0026ldquo;soft launch\u0026rdquo; of Virtualmin 6 (it\u0026rsquo;ll be another day before the docs are fully updated to cover the new stuff).\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRemoved support for Qmail+LDAP as a mail server.\u003c/li\u003e\n\u003cli\u003eUnexpected server processes running as domain users are now detected and included in the validation report, and can optionally be automatically terminated.\u003c/li\u003e\n\u003cli\u003eAdded support for using \u003ccode\u003eclamdscan\u003c/code\u003e for remote virus scanning, so that \u003ccode\u003eclamd-stream-client\u003c/code\u003e doesn\u0026rsquo;t need to be installed.\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 6.00 released"},{"content":"This relase includes many script installer updates, Chroot jail support for SSH and FPM, warnings for expired SSL certs, domain-level SSL certs for Webmin and Dovecot, and numerous other bugfixes and feature improvements.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-5.99-released/","summary":"\u003cp\u003eThis relase includes many script installer updates, Chroot jail support for SSH and FPM, warnings for expired SSL certs, domain-level SSL certs for Webmin and Dovecot, and numerous other bugfixes and feature improvements.\u003c/p\u003e","title":"Virtualmin 5.99 released"},{"content":"This release includes PHP-FPM support, the ability to generate SSHFP DNS records, an option to allow resellers to migrate backups from other control panels, API commands to start and stop script servers, and a bunch of bugfixes and other small features.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-5.06-released/","summary":"\u003cp\u003eThis release includes PHP-FPM support, the ability to generate SSHFP DNS records, an option to allow resellers to migrate backups from other control panels, API commands to start and stop script servers, and a bunch of bugfixes and other small features.\u003c/p\u003e","title":"Virtualmin 5.06 released"},{"content":" Bug fixes release ","permalink":"https://www.virtualmin.com/changelog/virtualmin-5.05-released/","summary":"\u003cul\u003e\n\u003cli\u003eBug fixes release\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 5.05 released"},{"content":" SSL versions 2 and 3 and TLS versions 1.0 and 1.1 are disabled by default in the Apache configuration for new domains. In the post-installation wizard, if Virtualmin does not know the current MySQL pasword the admin will be prompted to enter it. Added a config option to redirect HTTP requests to HTTPS for new domains (if they have an SSL website enabled). Backups can now be deleted either from the Backup Logs page, or using the delete-backup API command. ","permalink":"https://www.virtualmin.com/changelog/virtualmin-5.04-released/","summary":"\u003cul\u003e\n\u003cli\u003eSSL versions 2 and 3 and TLS versions 1.0 and 1.1 are disabled by default in the Apache configuration for new domains.\u003c/li\u003e\n\u003cli\u003eIn the post-installation wizard, if Virtualmin does not know the current MySQL pasword the admin will be prompted to enter it.\u003c/li\u003e\n\u003cli\u003eAdded a config option to redirect HTTP requests to HTTPS for new domains (if they have an SSL website enabled).\u003c/li\u003e\n\u003cli\u003eBackups can now be deleted either from the Backup Logs page, or using the delete-backup API command.\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 5.04 released"},{"content":" Bug fixes release ","permalink":"https://www.virtualmin.com/changelog/virtualmin-5.03-released/","summary":"\u003cul\u003e\n\u003cli\u003eBug fixes release\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 5.03 released"},{"content":" Added a new script installer for Rainloop version 1.9.4.415. Added the generate-letsencrypt-cert API command, to request and install a cert from Let\u0026rsquo;s Encrypt. Fixed support for mail server settings autodiscovery for Outlook clients. Added a Virtualmin Configuration setting to request a Let\u0026rsquo;s Encrypt certificate at virtual server creation time. Improved support for Ubuntu 16 and MySQL 5.7. ","permalink":"https://www.virtualmin.com/changelog/virtualmin-5.02-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdded a new script installer for Rainloop version 1.9.4.415.\u003c/li\u003e\n\u003cli\u003eAdded the generate-letsencrypt-cert API command, to request and install a cert from Let\u0026rsquo;s Encrypt.\u003c/li\u003e\n\u003cli\u003eFixed support for mail server settings autodiscovery for Outlook clients.\u003c/li\u003e\n\u003cli\u003eAdded a Virtualmin Configuration setting to request a Let\u0026rsquo;s Encrypt certificate at virtual server creation time.\u003c/li\u003e\n\u003cli\u003eImproved support for Ubuntu 16 and MySQL 5.7.\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 5.02 released"},{"content":" Added support for multiple hostnames and automatic renewal of Let’s Encrypt certificates Updated multiple script installers ","permalink":"https://www.virtualmin.com/changelog/virtualmin-5.01-released/","summary":"\u003cul\u003e\n\u003cli\u003eAdded support for multiple hostnames and automatic renewal of Let’s Encrypt certificates\u003c/li\u003e\n\u003cli\u003eUpdated multiple script installers\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 5.01 released"},{"content":"This is a major new release (thus the 5.0 designator). This release will coincide with changes in the install script happening tonight, to make Authentic Theme the default theme and Filemin the default file manager.\nThere will be some additional announcements about changes in the Virtualmin system as a whole (including instructions for updating your installations to the new defaults, should you want to do so), but, this announcement just covers the virtual-server module itself (which also has major new features and updates).\nMX records for a domain can be pointed to a cloud mail filtering provider on the Email Options page, or using the modify-mail API command. Added the rename-domain API command, to allow changing the domain name, username or home directory of a virtual server from the command line. Removed support for Apache versions older than 2.0. Backup logs are now associated with the scheduled backup that created them, and are linked in the UI. The Excluded Directories page can now also be used to enter MySQL and PostgreSQL databases and tables to exclude from backups. The paths to additional PHP versions can now be entered on the Virtualmin Configuration page, under PHP Options. This also makes it possible to run PHP version 7. Added a tab to the Manage SSL Certificate page to request a certificate from the free Let\u0026rsquo;s Encrypt service. Updated multiple script installers The big changes are PHP 7 and much more flexible support for many PHP versions, as well as better detection of SCL-installed PHP versions, and support for Let\u0026rsquo;s Encrypt! Let\u0026rsquo;s Encrypt provides free domain-validated SSL/TLS certificates in an automated fashion, making it easier and cheaper to secure all of your websites (without the certificate warnings that come from self-signed certificates). Webmin has gotten support for Let\u0026rsquo;s Encrypt, as well, in its latest release.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-5.0-released/","summary":"\u003cp\u003eThis is a major new release (thus the 5.0 designator). This release will coincide with changes in the install script happening tonight, to make Authentic Theme the default theme and Filemin the default file manager.\u003c/p\u003e\n\u003cp\u003eThere will be some additional announcements about changes in the Virtualmin system as a whole (including instructions for updating your installations to the new defaults, should you want to do so), but, this announcement just covers the virtual-server module itself (which also has major new features and updates).\u003c/p\u003e","title":"Virtualmin 5.0 released"},{"content":"This update includes new script installers, fixes a bug when backing up when over quota, adds a button to re-setup a cloud storage provider, support for using the aws command for S3 backups, IDN domain fixes, bugfixes for DKIM setup on CentOS 7, and more.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-4.16-released/","summary":"\u003cp\u003eThis update includes new script installers, fixes a bug when backing up when over quota, adds a button to re-setup a cloud storage provider, support for using the aws command for S3 backups, IDN domain fixes, bugfixes for DKIM setup on CentOS 7, and more.\u003c/p\u003e","title":"Virtualmin 4.16 released"},{"content":"This release adds support for backing up to Dropbox (in the Pro version), a page showing currently running backups, UI fields and API options for edting users\u0026rsquo; password recovery addresses, and a bunch of script installer updates. It also replaces Dkim-Milter with OpenDKIM on CentOS 7 systems.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-4.15-released/","summary":"\u003cp\u003eThis release adds support for backing up to Dropbox (in the Pro version), a page showing currently running backups, UI fields and API options for edting users\u0026rsquo; password recovery addresses, and a bunch of script installer updates. It also replaces Dkim-Milter with OpenDKIM on CentOS 7 systems.\u003c/p\u003e","title":"Virtualmin 4.15 released"},{"content":"This is mostly a bugfix release for backup and theme integration problems, but also adds support for DMARC DNS records and a bunch of script installer updates.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-4.14-released/","summary":"\u003cp\u003eThis is mostly a bugfix release for backup and theme integration problems, but also adds support for DMARC DNS records and a bunch of script installer updates.\u003c/p\u003e","title":"Virtualmin 4.14 released"},{"content":"This is a bugfix for issues backing up the MySQL databases of virtual servers.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-4.132-released/","summary":"\u003cp\u003eThis is a bugfix for issues backing up the MySQL databases of virtual servers.\u003c/p\u003e","title":"Virtualmin 4.132 released"},{"content":"This release centralizes the configuration of cloud storage providers, adds support for backups to Google Cloud Storage (in the Pro version), makes the address in Apache VirtualHost blocks more consistent, and updates a large number of script installers.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-4.12-released/","summary":"\u003cp\u003eThis release centralizes the configuration of cloud storage providers, adds support for backups to Google Cloud Storage (in the Pro version), makes the address in Apache VirtualHost blocks more consistent, and updates a large number of script installers.\u003c/p\u003e","title":"Virtualmin 4.12 released"},{"content":"This release adds a numerous script installer updates, better notification of the impact of password changes on database logins, pre/post reseller change commands, tooltip support for custom fields and more.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-4.09-released/","summary":"\u003cp\u003eThis release adds a numerous script installer updates, better notification of the impact of password changes on database logins, pre/post reseller change commands, tooltip support for custom fields and more.\u003c/p\u003e","title":"Virtualmin 4.09 released"},{"content":"This version adds support for per-domain DKIM keys, allows resellers to create other resellers, and improves support for Ubuntu 14.04 and Apache 2.4. The Pro version also includes numerous script installer updates.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-4.08-released/","summary":"\u003cp\u003eThis version adds support for per-domain DKIM keys, allows resellers to create other resellers, and improves support for Ubuntu 14.04 and Apache 2.4. The Pro version also includes numerous script installer updates.\u003c/p\u003e","title":"Virtualmin 4.08 released"},{"content":"This version allows aliases and redirects to be set separately for SSL and non-SSL websites, improves the mass IP address change form, allows the target of an alias to be moved, and includes a Norwegian translation updates (thanks to Stein-Aksel Basma). For Pro users, a single domain can now be owned by multiple resellers, and reseller accounts can have SSH/FTP logins with access to all the domains that they own.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-4.07-released/","summary":"\u003cp\u003eThis version allows aliases and redirects to be set separately for SSL and non-SSL websites, improves the mass IP address change form, allows the target of an alias to be moved, and includes a Norwegian translation updates (thanks to Stein-Aksel Basma). For Pro users, a single domain can now be owned by multiple resellers, and reseller accounts can have SSH/FTP logins with access to all the domains that they own.\u003c/p\u003e","title":"Virtualmin 4.07 released"},{"content":"This release fixes a security issue related to the post-install wizard, fixes a bug that excluded mailboxes from backups, adds an option to delete un-needed files when restoring a backup, and allows the port used in URLS to be set independently of the actual port.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-4.06-released/","summary":"\u003cp\u003eThis release fixes a security issue related to the post-install wizard, fixes a bug that excluded mailboxes from backups, adds an option to delete un-needed files when restoring a backup, and allows the port used in URLS to be set independently of the actual port.\u003c/p\u003e","title":"Virtualmin 4.06 released"},{"content":"This release adds a page for transferring a domain to another Virtualmin system, updates several script installers, makes SRV DNS record editing possible, adds an API command to fix permissions, and more.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-4.05-released/","summary":"\u003cp\u003eThis release adds a page for transferring a domain to another Virtualmin system, updates several script installers, makes SRV DNS record editing possible, adds an API command to fix permissions, and more.\u003c/p\u003e","title":"Virtualmin 4.05 released"},{"content":"This release adds email rate limiting support (to prevent spammers from abusing your system via a hijacked account or app), DirectAdmin migration, incoming email BCCing, earlier detection of errors when restoring a backup, and more.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-4.04-released/","summary":"\u003cp\u003eThis release adds email rate limiting support (to prevent spammers from abusing your system via a hijacked account or app), DirectAdmin migration, incoming email BCCing, earlier detection of errors when restoring a backup, and more.\u003c/p\u003e","title":"Virtualmin 4.04 released"},{"content":"This release includes multiple script updates, support for shared hosting on a single IPv6 address, Outlook autoconfiguration, Rackspace Cloud Files region selection, and a bunch of other minor bugfixes and improvements.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-4.03-released/","summary":"\u003cp\u003eThis release includes multiple script updates, support for shared hosting on a single IPv6 address, Outlook autoconfiguration, Rackspace Cloud Files region selection, and a bunch of other minor bugfixes and improvements.\u003c/p\u003e","title":"Virtualmin 4.03 released"},{"content":"This release includes multiple script updates, better Apache 2.4 support, German translations from Raymond Vetter, the ability to switch a domain with a private IP to another address, and a bunch of bugfixes.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-4.02-released/","summary":"\u003cp\u003eThis release includes multiple script updates, better Apache 2.4 support, German translations from Raymond Vetter, the ability to switch a domain with a private IP to another address, and a bunch of bugfixes.\u003c/p\u003e","title":"Virtualmin 4.02 released"},{"content":"This release includes the ability to manage expiration, Glacier migration and ACLs on S3 buckets, German translations by Raymond Vetter, a sample DNS records page, and the ability to update slave DNS servers when the master system\u0026rsquo;s IP changes.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-4.01-released/","summary":"\u003cp\u003eThis release includes the ability to manage expiration, Glacier migration and ACLs on S3 buckets, German translations by Raymond Vetter, a sample DNS records page, and the ability to update slave DNS servers when the master system\u0026rsquo;s IP changes.\u003c/p\u003e","title":"Virtualmin 4.01 released"},{"content":"This release includes numerous script installer updates, DKIM bugfixes and improvements, more flexibility in setting up mail client auto-configuration, proper SPF record support and more.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-4.00-released/","summary":"\u003cp\u003eThis release includes numerous script installer updates, DKIM bugfixes and improvements, more flexibility in setting up mail client auto-configuration, proper SPF record support and more.\u003c/p\u003e","title":"Virtualmin 4.00 released"},{"content":"This version adds the ability to enable or disable server-side includes, supports separately install PHP 5.3 and 5.4 packages, makes the DKIM key size configurable, changes default mail folder names, adds an option to change email behavior when a domain is over quota, and much more.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.99-released/","summary":"\u003cp\u003eThis version adds the ability to enable or disable server-side includes, supports separately install PHP 5.3 and 5.4 packages, makes the DKIM key size configurable, changes default mail folder names, adds an option to change email behavior when a domain is over quota, and much more.\u003c/p\u003e","title":"Virtualmin 3.99 released"},{"content":"This version moves all cron jobs into the Webmin server process (to reduce memory use), adds Thunderbird-style mail client autoconfiguration, an option to disable sub-servers at the same time as their parent, and more.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.98-released/","summary":"\u003cp\u003eThis version moves all cron jobs into the Webmin server process (to reduce memory use), adds Thunderbird-style mail client autoconfiguration, an option to disable sub-servers at the same time as their parent, and more.\u003c/p\u003e","title":"Virtualmin 3.98 released"},{"content":"This minor update fixes a problem with the backup level field, and a hang encountered when restoring a virtual server with SSL enabled.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.972-released/","summary":"\u003cp\u003eThis minor update fixes a problem with the backup level field, and a hang encountered when restoring a virtual server with SSL enabled.\u003c/p\u003e","title":"Virtualmin 3.972 released"},{"content":"This release makes the PHP and symlink security fixes optional, improves their coverage, adds a check for insecure SSL keys, and gives you more control over incremental backups.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.97-released/","summary":"\u003cp\u003eThis release makes the PHP and symlink security fixes optional, improves their coverage, adds a check for insecure SSL keys, and gives you more control over incremental backups.\u003c/p\u003e","title":"Virtualmin 3.97 released"},{"content":"This release includes security fixes that prevent execution of scripts with mod_php when disabled for a domain, abuse of symlinks to other virtual server\u0026rsquo;s files, and abuse of the spamtrap and hamtrap email aliases. It also includes an option to automatically clear the trash folders of all users in a domain.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.96-released/","summary":"\u003cp\u003eThis release includes security fixes that prevent execution of scripts with \u003ccode\u003emod_php\u003c/code\u003e when disabled for a domain, abuse of symlinks to other virtual server\u0026rsquo;s files, and abuse of the spamtrap and hamtrap email aliases. It also includes an option to automatically clear the trash folders of all users in a domain.\u003c/p\u003e","title":"Virtualmin 3.96 released"},{"content":"This is mainly a bugfix release, but also includes a change to run pre- and post-backup commands from the web UI, an API command to fix domain quotas, and a bunch of script installer updates.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.95-released/","summary":"\u003cp\u003eThis is mainly a bugfix release, but also includes a change to run pre- and post-backup commands from the web UI, an API command to fix domain quotas, and a bunch of script installer updates.\u003c/p\u003e","title":"Virtualmin 3.95 released"},{"content":"This new version includes Rackspace Cloud Files backup support, the ability to create alias domains with mailboxes, outgoing SMTP IP address control, better dependency installation for Ruby scripts, detection for a system IP address change, and a bunch of bugfixes. Also available is version 8.6 of the Virtualmin theme, such is required by the new Virtualmin module.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.94-released/","summary":"\u003cp\u003eThis new version includes Rackspace Cloud Files backup support, the ability to create alias domains with mailboxes, outgoing SMTP IP address control, better dependency installation for Ruby scripts, detection for a system IP address change, and a bunch of bugfixes. Also available is version 8.6 of the Virtualmin theme, such is required by the new Virtualmin module.\u003c/p\u003e","title":"Virtualmin 3.94 released"},{"content":"This new version includes S3 large file backup support, new API commands for S3, support for multiple contact addresses, OpenDKIM support, S3 backups to sub-directories, the ability to skip failed domains when restoring, and SSL certificate sharing improvements. Also available is a new version of the Virtualmin theme, and the Git and Nginx plugins.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.93-released/","summary":"\u003cp\u003eThis new version includes S3 large file backup support, new API commands for S3, support for multiple contact addresses, OpenDKIM support, S3 backups to sub-directories, the ability to skip failed domains when restoring, and SSL certificate sharing improvements. Also available is a new version of the Virtualmin theme, and the Git and Nginx plugins.\u003c/p\u003e","title":"Virtualmin 3.93 released"},{"content":"This release includes script installer updates, support for re-sending mailbox signup email, and a bunch of bugfixes.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.92-released/","summary":"\u003cp\u003eThis release includes script installer updates, support for re-sending mailbox signup email, and a bunch of bugfixes.\u003c/p\u003e","title":"Virtualmin 3.92 released"},{"content":"This release includes S3 backup support (previously only in Virtualmin Pro), script installer updates, the ability to select an IP address when cloning a domain, simplifies getting JSON/XML output from the remote API, and the usual gang of bugfixes and minor features.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.91-released/","summary":"\u003cp\u003eThis release includes S3 backup support (previously only in Virtualmin Pro), script installer updates, the ability to select an IP address when cloning a domain, simplifies getting JSON/XML output from the remote API, and the usual gang of bugfixes and minor features.\u003c/p\u003e","title":"Virtualmin 3.91 released"},{"content":"This new version improves the speed of restores by creating new meta-information files during backups, updates script installers, allows domain owners to restore backups made by root, improves SNI support, allows backup deletion policy to be set on a per-destination basis, adds the modify-proxy API command, and fixes several bugs.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.90-released/","summary":"\u003cp\u003eThis new version improves the speed of restores by creating new meta-information files during backups, updates script installers, allows domain owners to restore backups made by root, improves SNI support, allows backup deletion policy to be set on a per-destination basis, adds the modify-proxy API command, and fixes several bugs.\u003c/p\u003e","title":"Virtualmin 3.90 released"},{"content":"This new version includes an option to store hashed instead of plaintext passwords, enables checking for script installer updates by default, disables cron jobs when a domain is disabled, allows use of already enabled IPv6 addresses, and fixes numerous small bugs. The pro version also includes a large number of script installer updates.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.88-released/","summary":"\u003cp\u003eThis new version includes an option to store hashed instead of plaintext passwords, enables checking for script installer updates by default, disables cron jobs when a domain is disabled, allows use of already enabled IPv6 addresses, and fixes numerous small bugs. The pro version also includes a large number of script installer updates.\u003c/p\u003e","title":"Virtualmin 3.88 released"},{"content":"This major update includes tracking of IMAP, POP3 and SMTP logins for mailboxes, API improvements for enabling global features, listing backup logs, applying plan features and changing PHP settings, numerous script installer updates, detection of over-committed memory, and improved spam blocking for secondary mail servers.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.87-released/","summary":"\u003cp\u003eThis major update includes tracking of IMAP, POP3 and SMTP logins for mailboxes, API improvements for enabling global features, listing backup logs, applying plan features and changing PHP settings, numerous script installer updates, detection of over-committed memory, and improved spam blocking for secondary mail servers.\u003c/p\u003e","title":"Virtualmin 3.87 released"},{"content":"This is mainly a bugfix release for backup and mass script upgrade issues, but also includes several updated script installers, a fix for an XSS password attack, an API command to change the DNS TTL on multiple zones, and easier entering of CA SSL certificates.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.86-released/","summary":"\u003cp\u003eThis is mainly a bugfix release for backup and mass script upgrade issues, but also includes several updated script installers, a fix for an XSS password attack, an API command to change the DNS TTL on multiple zones, and easier entering of CA SSL certificates.\u003c/p\u003e","title":"Virtualmin 3.86 released"},{"content":"This release includes an installer for WHMCS, ability to edit comments on DNS records, manual DNS record editing, better protection against UID and GID re-use, API commands to change the HTTP and HTTPS ports for a domain, and a page in the post-install wizard for entering nameserver hostnames.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.85-released/","summary":"\u003cp\u003eThis release includes an installer for WHMCS, ability to edit comments on DNS records, manual DNS record editing, better protection against UID and GID re-use, API commands to change the HTTP and HTTPS ports for a domain, and a page in the post-install wizard for entering nameserver hostnames.\u003c/p\u003e","title":"Virtualmin 3.85 released"},{"content":"This major new version includes support for script installers, protection against email consuming all of a user\u0026rsquo;s disk quota, IPv6 reverse address creation, DKIM fixes, scheduled validation of virtual servers, and the ability to clone an existing virtual server with a new domain name.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.84-released/","summary":"\u003cp\u003eThis major new version includes support for script installers, protection against email consuming all of a user\u0026rsquo;s disk quota, IPv6 reverse address creation, DKIM fixes, scheduled validation of virtual servers, and the ability to clone an existing virtual server with a new domain name.\u003c/p\u003e","title":"Virtualmin 3.84 released"},{"content":"This version includes support for the upcoming Cloudmin provisioning server, updates the German translation (thanks to Thomas Suess), fixes bugs related to resellers, plans and quotas, allows backups to IPv6 SSH and FTP servers, makes hidden mail aliases visible, and fixes a heap of bugs.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.83-released/","summary":"\u003cp\u003eThis version includes support for the upcoming Cloudmin provisioning server, updates the German translation (thanks to Thomas Suess), fixes bugs related to resellers, plans and quotas, allows backups to IPv6 SSH and FTP servers, makes hidden mail aliases visible, and fixes a heap of bugs.\u003c/p\u003e","title":"Virtualmin 3.83 released"},{"content":"This is mainly a bugfix release, which resolves problems with DKIM setup and creation of alias domains. It also adds the ability to backup to multiple destinations, control the maximum message size for spam filtering, lets you control which skeleton files get template substituted, and makes the output of API commands that list quotas more programmer-friendly.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.82-released/","summary":"\u003cp\u003eThis is mainly a bugfix release, which resolves problems with DKIM setup and creation of alias domains. It also adds the ability to backup to multiple destinations, control the maximum message size for spam filtering, lets you control which skeleton files get template substituted, and makes the output of API commands that list quotas more programmer-friendly.\u003c/p\u003e","title":"Virtualmin 3.82 released"},{"content":"This new version copies alias domain DNS records from the target, better supports top-level international domain names, makes the bandwidth monitoring schedule more flexible, and fixes a bunch of small bugs.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.80-released/","summary":"\u003cp\u003eThis new version copies alias domain DNS records from the target, better supports top-level international domain names, makes the bandwidth monitoring schedule more flexible, and fixes a bunch of small bugs.\u003c/p\u003e","title":"Virtualmin 3.80 released"},{"content":"This is primarily a bugfix release, but it also adds support for changing the web documents directory for an existing domain.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.79-released/","summary":"\u003cp\u003eThis is primarily a bugfix release, but it also adds support for changing the web documents directory for an existing domain.\u003c/p\u003e","title":"Virtualmin 3.79 released"},{"content":"This new version adds numerous small features, including control over DNS records in the template, a link for extra admins to change their passwords, SSL key validation, French translation updates by Houssin Regis, control over the columns that appear in the virtual server list, and much more.\nIf Postfix relay domains are stored in a hash, update it instead of adding to relay_domains in /etc/postfix/main.cf. Additional allowed MySQL client hosts are now included in backups. Added a warning to the configuration check for systems behind a NAT gateway with an incorrectly configured DNS IP address. Added options to the Module Config page for selecting which columns appear on the List Virtual Servers page, including new ones like the reseller, email address and extra admins. The contents of mailboxes from Windows Plesk backups are now properly migrated. Updated the French translation, thanks to Houssin Regis. Added validation to prevent SSL from being enabled on a virtual server with an invalid certificate or key. Extra administrators can now change their own passwords, via a new link on the left menu. Added a DNS template option to control which A records are added to new domains. Removed the Bring up virtual interfaces? module configuration option, as use of an existing interface can now be done on a per-domain basis. ","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.74-released/","summary":"\u003cp\u003eThis new version adds numerous small features, including control over DNS records in the template, a link for extra admins to change their passwords, SSL key validation, French translation updates by Houssin Regis, control over the columns that appear in the virtual server list, and much more.\u003c/p\u003e\n\n\n\n\n  \u003cdetails class=\"post-content-indent-details\" open\u003e\n      \u003csummary\u003e\n        \u003cspan class=\"details\"\u003e\n        \u003ci class='wm wm-fw wm-newspaper'\u003e\u003c/i\u003e\n        \u003c/span\u003e\n      \u003c/summary\u003e\n      \u003cdiv class=\"inner\"\u003e\n\n\n\u003cul\u003e\n\u003cli\u003eIf Postfix relay domains are stored in a hash, update it instead of adding to \u003ccode\u003erelay_domains\u003c/code\u003e in \u003ccode\u003e/etc/postfix/main.cf\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eAdditional allowed MySQL client hosts are now included in backups.\u003c/li\u003e\n\u003cli\u003eAdded a warning to the configuration check for systems behind a NAT gateway with an incorrectly configured DNS IP address.\u003c/li\u003e\n\u003cli\u003eAdded options to the Module Config page for selecting which columns appear on the List Virtual Servers page, including new ones like the reseller, email address and extra admins.\u003c/li\u003e\n\u003cli\u003eThe contents of mailboxes from Windows Plesk backups are now properly migrated.\u003c/li\u003e\n\u003cli\u003eUpdated the French translation, thanks to Houssin Regis.\u003c/li\u003e\n\u003cli\u003eAdded validation to prevent SSL from being enabled on a virtual server with an invalid certificate or key.\u003c/li\u003e\n\u003cli\u003eExtra administrators can now change their own passwords, via a new link on the left menu.\u003c/li\u003e\n\u003cli\u003eAdded a DNS template option to control which A records are added to new domains.\u003c/li\u003e\n\u003cli\u003eRemoved the \u003cem\u003eBring up virtual interfaces?\u003c/em\u003e module configuration option, as use of an existing interface can now be done on a per-domain basis.\n      \u003c/div\u003e\n  \u003c/details\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 3.74 released"},{"content":"This is mainly a bugfix release, specifically for issues with over-counting of bandwidth usage. It also fixed outgoing address mapping in Sendmail, and allows domain owners to be prevented from changing their passwords.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.73-released/","summary":"\u003cp\u003eThis is mainly a bugfix release, specifically for issues with over-counting of bandwidth usage. It also fixed outgoing address mapping in Sendmail, and allows domain owners to be prevented from changing their passwords.\u003c/p\u003e","title":"Virtualmin 3.73 released"},{"content":"This release adds support for JSON, XML and Perl formats in the remote API, removes deprecated support for logging via a program, fixes Plesk 9 migration, adds an option to include relayed mail in bandwidth reports, and fixes several small bugs.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.72-released/","summary":"\u003cp\u003eThis release adds support for JSON, XML and Perl formats in the remote API, removes deprecated support for logging via a program, fixes Plesk 9 migration, adds an option to include relayed mail in bandwidth reports, and fixes several small bugs.\u003c/p\u003e","title":"Virtualmin 3.72 released"},{"content":"This is mainly a bugfix release, to address issues introduced by the security fixes in the 3.70 version. It also includes support for backups by plan, fixes home-less alias domain backups, and calls the pre-change command before doing a restore.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.71-released/","summary":"\u003cp\u003eThis is mainly a bugfix release, to address issues introduced by the security fixes in the 3.70 version. It also includes support for backups by plan, fixes home-less alias domain backups, and calls the pre-change command before doing a restore.\u003c/p\u003e","title":"Virtualmin 3.71 released"},{"content":"This major release fixes bugs that could allow domain owners to create malicious links that could be used to edit or take ownership of any file on the system, and so should be installed by all Virtualmin admins that created domains for potentially un-trusted users. All plugins should be updated too, as several include the same fixes.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.70-released/","summary":"\u003cp\u003eThis major release fixes bugs that could allow domain owners to create malicious links that could be used to edit or take ownership of any file on the system, and so should be installed by all Virtualmin admins that created domains for potentially un-trusted users. All plugins should be updated too, as several include the same fixes.\u003c/p\u003e","title":"Virtualmin 3.70 released, with security fixes"},{"content":"This release adds IPv6 support (on Debian and Redhat-derivied systems), creates sub-domain DNS records in the parent domain, shows the SSH server status on the system informaiton page, makes website options available to domain owners, allows a virtual server to be made the default for an IP, and fixes numerous small bugs.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.68-released/","summary":"\u003cp\u003eThis release adds IPv6 support (on Debian and Redhat-derivied systems), creates sub-domain DNS records in the parent domain, shows the SSH server status on the system informaiton page, makes website options available to domain owners, allows a virtual server to be made the default for an IP, and fixes numerous small bugs.\u003c/p\u003e","title":"Virtualmin 3.68 released"},{"content":"The major change in this update is support for plans, which are sets of quota, bandwidth, domain and other limits. These can be applied to new or existing virtual servers. Previously this functionality was combined with templates, which made it too complex for the average user.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.66-released/","summary":"\u003cp\u003eThe major change in this update is support for plans, which are sets of quota, bandwidth, domain and other limits. These can be applied to new or existing virtual servers. Previously this functionality was combined with templates, which made it too complex for the average user.\u003c/p\u003e","title":"Virtualmin 3.66 released"},{"content":"This release adds the Change IP Addresses page, adds email aliases that forward to all users in a domain, supports SSL keys with passphrases, fixes the way Clamd\u0026rsquo;s init script is setup, and allows you to use a remote Clamd server with clamd-stream-client.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.63-released/","summary":"\u003cp\u003eThis release adds the Change IP Addresses page, adds email aliases that forward to all users in a domain, supports SSL keys with passphrases, fixes the way Clamd\u0026rsquo;s init script is setup, and allows you to use a remote Clamd server with clamd-stream-client.\u003c/p\u003e","title":"Virtualmin 3.63 released"},{"content":"This update adds a new default sorting mode for Virtual servers (by domain, with sub-servers indented), a template option for SPF included domains, the list-domains.pl API script, Procmail locking to prevent multiple concurrent SpamAssassin processes, the use of GNU TAR on FreeBSD systems, and a bunch of small bugfixes.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.62-released/","summary":"\u003cp\u003eThis update adds a new default sorting mode for Virtual servers (by domain, with sub-servers indented), a template option for SPF included domains, the list-domains.pl API script, Procmail locking to prevent multiple concurrent SpamAssassin processes, the use of GNU TAR on FreeBSD systems, and a bunch of small bugfixes.\u003c/p\u003e","title":"Virtualmin 3.62 released"},{"content":"The biggest new feature in this version of Virtualmin is support for multiple backup schedules, and a new UI for editing them. Domain owners can also schedule, backup and restore (to a limited degree) their domains. Version 3.58 also improves Plesk migration, adds logging for API calls, allows remote MySQL clients to be edited, and adds a full Dutch translation by Gandyman.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.58-released/","summary":"\u003cp\u003eThe biggest new feature in this version of Virtualmin is support for multiple backup schedules, and a new UI for editing them. Domain owners can also schedule, backup and restore (to a limited degree) their domains. Version 3.58 also improves Plesk migration, adds logging for API calls, allows remote MySQL clients to be edited, and adds a full Dutch translation by Gandyman.\u003c/p\u003e","title":"Virtualmin 3.58 released"},{"content":"This new version fixes errors like : Undefined subroutine \u0026amp;main::ui_hr called at /usr/local/webmin-1.410/virtual-server/index.cgi line 167.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.572-released/","summary":"\u003cp\u003eThis new version fixes errors like : \u003ccode\u003eUndefined subroutine \u0026amp;main::ui_hr called at /usr/local/webmin-1.410/virtual-server/index.cgi line 167\u003c/code\u003e.\u003c/p\u003e","title":"Virtualmin 3.572 released"},{"content":"This update adds more variables for pre- and post- change scripts, checks for MySQL and PostgreSQL installs with no root password, ensures that scheduled backup emails are only sent to owners of their respective domains, and fixes a bunch of small bugs.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.57-released/","summary":"\u003cp\u003eThis update adds more variables for \u003cem\u003epre-\u003c/em\u003e and \u003cem\u003epost-\u003c/em\u003e change scripts, checks for MySQL and PostgreSQL installs with no root password, ensures that scheduled backup emails are only sent to owners of their respective domains, and fixes a bunch of small bugs.\u003c/p\u003e","title":"Virtualmin 3.57 released"},{"content":"This new version adds support for custom per-domain fields, fixes many bugs in migrating cPanel and Plesk backups (and reduces memory needed), allows FTP chroot directories to be easily configured, avoids username prefix clashes, and supports internationalized domain names.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.56-released/","summary":"\u003cp\u003eThis new version adds support for custom per-domain fields, fixes many bugs in migrating cPanel and Plesk backups (and reduces memory needed), allows FTP chroot directories to be easily configured, avoids username prefix clashes, and supports internationalized domain names.\u003c/p\u003e","title":"Virtualmin 3.56 released"},{"content":"This Virtualmin update includes many cPanel and Plesk migration fixes and improvements, support for FTP and SSH migration, handling for web logs outside the home directory, the delete-user.pl and migrate-domain.pl command-line scripts, control over library preloading and data collection, and the ability to move virtual servers between owners.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.55-released/","summary":"\u003cp\u003eThis Virtualmin update includes many cPanel and Plesk migration fixes and improvements, support for FTP and SSH migration, handling for web logs outside the home directory, the delete-user.pl and migrate-domain.pl command-line scripts, control over library preloading and data collection, and the ability to move virtual servers between owners.\u003c/p\u003e","title":"Virtualmin 3.55 released"},{"content":"This update improves Plesk migration and adds Windows Plesk support, better validates Sendmail and Qmail configurations, limits deleted MX records to ones created by Virtualmin, and fixes a bunch of other small bugs.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.54-released/","summary":"\u003cp\u003eThis update improves Plesk migration and adds Windows Plesk support, better validates Sendmail and Qmail configurations, limits deleted MX records to ones created by Virtualmin, and fixes a bunch of other small bugs.\u003c/p\u003e","title":"Virtualmin 3.54 released"},{"content":"This release adds protection against a browser stop breaking domain creation, a single SSL website per shared IP address, BIND DNS disabling improvements, deleting of Apache log files outside the home directory, better support for VPopMail with many domains, and more.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.53-released/","summary":"\u003cp\u003eThis release adds protection against a browser stop breaking domain creation, a single SSL website per shared IP address, BIND DNS disabling improvements, deleting of Apache log files outside the home directory, better support for VPopMail with many domains, and more.\u003c/p\u003e","title":"Virtualmin 3.53 released"},{"content":"This update adds a dislay of new features, support for FTP accounts with permissions to edit a domain\u0026rsquo;s web pages, the ability to associate an existing domain with a private IP address, better validation and fixing of IP addresses when restoring backups, outgoing email bandwidth monitoring, and a much improved file locking architecture.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.52-released/","summary":"\u003cp\u003eThis update adds a dislay of new features, support for FTP accounts with permissions to edit a domain\u0026rsquo;s web pages, the ability to associate an existing domain with a private IP address, better validation and fixing of IP addresses when restoring backups, outgoing email bandwidth monitoring, and a much improved file locking architecture.\u003c/p\u003e","title":"Virtualmin 3.52 released"},{"content":"This update allows you to change the IP address of a virtual server, adds support for BCCing outgoing email on a per-domain basis (when using Postfix), fixes bugs with special characters like ; , @ and \u0026amp; in usernames, improves support for AWstats in alias domains, and more.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.51-released/","summary":"\u003cp\u003eThis update allows you to change the IP address of a virtual server, adds support for BCCing outgoing email on a per-domain basis (when using Postfix), fixes bugs with special characters like \u003ccode\u003e;\u003c/code\u003e \u003ccode\u003e,\u003c/code\u003e \u003ccode\u003e@\u003c/code\u003e and \u003ccode\u003e\u0026amp;\u003c/code\u003e in usernames, improves support for AWstats in alias domains, and more.\u003c/p\u003e","title":"Virtualmin 3.51 released"},{"content":"This new release includes extra domain administrator accounts (ported from the Pro version), more control over which shells are available to mailboxes and domains, an improved mail alias mode for alias domains, and many user interface cleanups.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.50-released/","summary":"\u003cp\u003eThis new release includes extra domain administrator accounts (ported from the Pro version), more control over which shells are available to mailboxes and domains, an improved mail alias mode for alias domains, and many user interface cleanups.\u003c/p\u003e","title":"Virtualmin 3.50 released"},{"content":"This version adds support for LDAP and MySQL maps in Postfix, cPanel migration improvements for sub-domains, the --user flag to many command-line scripts, and many small fixes and tweaks.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.49-released/","summary":"\u003cp\u003eThis version adds support for LDAP and MySQL maps in Postfix, cPanel migration improvements for sub-domains, the \u003ccode\u003e--user\u003c/code\u003e flag to many command-line scripts, and many small fixes and tweaks.\u003c/p\u003e","title":"Virtualmin 3.49 released"},{"content":"This update adds SSL chained CA certificate management, better handling of failures creating users or groups, and a bunch of small bugfixes and feature tweaks.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.48-released/","summary":"\u003cp\u003eThis update adds SSL chained CA certificate management, better handling of failures creating users or groups, and a bunch of small bugfixes and feature tweaks.\u003c/p\u003e","title":"Virtualmin 3.48 released"},{"content":"This update adds Plesk 8 migration support, a simpler alias form for mailboxes, the ability to change the MySQL password separate for domains, a new page for managing features and plugins, server validation and much more.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.47-released/","summary":"\u003cp\u003eThis update adds Plesk 8 migration support, a simpler alias form for mailboxes, the ability to change the MySQL password separate for domains, a new page for managing features and plugins, server validation and much more.\u003c/p\u003e","title":"Virtualmin 3.47 released"},{"content":"This large update adds the ability to view historical bandwidth data, an option to block certain domain names, more control over which features are enabled when creating domains from a backup, and options to select which templates are used by default.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.46-released/","summary":"\u003cp\u003eThis large update adds the ability to view historical bandwidth data, an option to block certain domain names, more control over which features are enabled when creating domains from a backup, and options to select which templates are used by default.\u003c/p\u003e","title":"Virtualmin 3.46 released"},{"content":"This major update includes a simpler form for editing aliases, bulk editing of aliases, cPanel migration fixes, the ability to exclude directories from backups, backups that are downloaded directly to the browser, and more.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.45-released/","summary":"\u003cp\u003eThis major update includes a simpler form for editing aliases, bulk editing of aliases, cPanel migration fixes, the ability to exclude directories from backups, backups that are downloaded directly to the browser, and more.\u003c/p\u003e","title":"Virtualmin 3.45 released"},{"content":"The version includes Webalizer stats in cPanel imports, allows control over the creation of catchall aliases, and adds a option to delete aliases when email is disabled for a domain.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.44-released/","summary":"\u003cp\u003eThe version includes Webalizer stats in cPanel imports, allows control over the creation of catchall aliases, and adds a option to delete aliases when email is disabled for a domain.\u003c/p\u003e","title":"Virtualmin 3.44 released"},{"content":"This release adds the ability to change the home directory or administration login for a domain, makes it easier to specify the primary NS, detects password changes made in other modules, shows the status of Dovecot, and allows MySQL permissions to be pushed to multiple servers.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.43-released/","summary":"\u003cp\u003eThis release adds the ability to change the home directory or administration login for a domain, makes it easier to specify the primary NS, detects password changes made in other modules, shows the status of Dovecot, and allows MySQL permissions to be pushed to multiple servers.\u003c/p\u003e","title":"Virtualmin 3.43 released"},{"content":"This version changes the layout of the plugin modules page and makes it possible for a plugin to be installed, but not enabled by default. It also adds a section to the Domain Owner Limits section of the server templates to control which features are granted to owners of new domains.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.42-released/","summary":"\u003cp\u003eThis version changes the layout of the plugin modules page and makes it possible for a plugin to be installed, but not enabled by default. It also adds a section to the Domain Owner Limits section of the server templates to control which features are granted to owners of new domains.\u003c/p\u003e","title":"Virtualmin 3.42 released"},{"content":"This update adds the ability to select the SSL key size and certificate locations, more control of which domains are disabled for exceeding the bandwidth limit, DNS client validation, and more control over backup error email reporting.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.41-released/","summary":"\u003cp\u003eThis update adds the ability to select the SSL key size and certificate locations, more control of which domains are disabled for exceeding the bandwidth limit, DNS client validation, and more control over backup error email reporting.\u003c/p\u003e","title":"Virtualmin 3.41 released"},{"content":"This version adds external commands for setting quotas, better Zones support, template user interface and creation improvements, control over the disabled website HTML and more.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.40-released/","summary":"\u003cp\u003eThis version adds external commands for setting quotas, better Zones support, template user interface and creation improvements, control over the disabled website HTML and more.\u003c/p\u003e","title":"Virtualmin 3.40 released"},{"content":"This new version improves the new mailbox and domain forms, and uses the DenyGroups SSHd directive to block logins by domain owners who don\u0026rsquo;t have a shell.\n","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.38-released/","summary":"\u003cp\u003eThis new version improves the new mailbox and domain forms, and uses the DenyGroups SSHd directive to block logins by domain owners who don\u0026rsquo;t have a shell.\u003c/p\u003e","title":"Virtualmin 3.38 released"},{"content":" 1.81 A Sendmail genericstable or Postfix canonical mapping file can be automatically updated with login name to email address mappings. This is useful for programs like Usermin, which can read such a file to work out From: addresses. The directory for Webalizer statistics can be set on the Apache Website Template page. Domain owners can be granted access to the Read User Mail module, for reading mailboxe\u0026rsquo;s mail. The port to use for normal and SSL virtual websites can now be set on the Apache Website Template page. Virtual servers can now be backed up to one or many tar.gz files, either locally or on a remote FTP server. Backups can also be restored from these tar.gz files, again locally or from an FTP server. The MySQL feature now properly supports usernames longer that 16 characters. A new configuration option has been added for sites that use multiple IP addresses, but always use name-based Apache virtual hosts. Username length and other restrictions are now checked by the create-domain.pl script. Virtualmin now participates in Webmin action logging, so you can see what actions were taken and which files they changed. IP address clash checking for new servers now actually works. Webalizer configuration files and schedule can now be included in backups. 1.91 Catchall mail aliases can now forward mail for any mailbox at their domain to the same mailbox at another domain. Added module configuration options to prevent domain owners from being given access to feature-related modules like Apache Webserver, BIND DNS Server and so on. Added checks to prevent an alias or mailbox being created which clashes with an existing Sendmail or Postfix alias. Added a Module Config option to set the subdirectory used for mailbox user home directories, instead of always using ~/homes. Added Module Config option to specify an different IP address to use in the DNS domain, versus the one used for the webserver. Added the ability to backup and restore to via SSH, as well as FTP. Added a new feature for Virtualmin domains - virtual FTP hosting with ProFTPd. Like Apache virtual hosts, these will be created when the feature is enabled for domain, using directives taken from an editable template. Due to limitations in the FTP protocol, a domain can only have a virtual FTP server if it has its own private IP. 2.00 Added an option to the BIND DNS Template page for selecting a view to add new zones to. Added automatic IP address allocation for virtual servers, out of ranges defined on the Module Config page. A Virtualmin server owner can now create and own multiple domains, if allowed by the master administrator. All such servers are owned by the same Unix user and share the same quota, and any sub-servers are stored in the domains subdirectory of the parent server\u0026rsquo;s home directory. Each server can have its own independent set of features. When a limit on the number of mailboxes has been set, it will apply to the master server and all sub-servers. Added an option to the Apache Website Template page for entering an Apache user to be added to the group for all new servers. This can be useful for getting suexec to work. Added Module Config options to have features disabled by default for new servers. Added Manage SSL Certificate page for creating a CSR and installing a signed SSL certificate using simple forms. Added Change Domain Name page for modifying the name of an existing virtual server. This can also update the server\u0026rsquo;s Unix login and home directory at the same time, if needed. All sub-servers of the modified server are also updated, where appropriate. When restoring a virtual server, if it no longer exists it will be automatically re-created with all the original features before the restore is done. 2.10 Aliases for an existing virtual server can now be created. An alias is a server that simply forwards all web, mail and DNS requests to another server. Alias websites can be created as a virtual server that simply redirects requests or by adding additional ServerAlias directives to the target website. Added a new Bandwidth Monitoring page for setting up regular checking of virtual server web bandwidth usage, and inputs on the server creation and editing forms to specify the amount of bandwidth each can use. When the limit is exceeded, a configurable email is sent to the domain owner and other optional addresses. The monitoring page also displays usage and limits by all servers as a bar graph. Added a new feature - the ability to setup Logrotate to automatically truncate and compress a virtual server\u0026rsquo;s log files, so that they don\u0026rsquo;t consume too much disk space. The subject lines for emails sent when a new virtual server, sub-server and mailbox are created can now be edited, and can include template variables. Email messages send when a virtual server or mailbox is created can now be also Cc\u0026rsquo;d to additional configurable addresses. Added the ability to use new functions in the BIND module to speed up the process of creating slave zones on a remote DNS server. Added a new format for mailbox usernames - mailbox@domain, the same as the email address. This only works when using Sendmail as the mail server though. The Qmail mail server is now fully supported, with all the same capabilities as Postfix and Sendmail. Only a stock install of Qmail is required by Virtualmin - vpopmail or other similar patches are not needed. When a mailbox is created, its empty mail file or directory is automatically created, in a location determined by the configuration of the mail server in use. A virtual server can now be created without a Unix user, as long as it only has a DNS domain or MySQL or PostgreSQL databases. For other features, the Unix user is required. Added an additional way to proxy a virtual server to another URL - frame forwarding. Added the ability to easily edit the forwarding destination for proxy-only or frame forwarding websites, along with the forwarding frame page title or HTML. Moved all template-related settings into the \u0026lsquo;Server Templates\u0026rsquo; section, including directives for Apache websites, FTP virtual servers and DNS domains. Multiple templates can now be defined, and a template can be selected when creating a virtual server. The home directory for a virtual server can now be enabled separate from its Unix user. On systems like FreeBSD in which the username length is limited, the prefix for mailbox usernames is now selectable when creating a server. Added an option to automatically disable a server when it reaches its bandwidth limit. Added an option to send an email message when a server is approaching (within some percentage) its bandwidth limit. Added support for third-party plugin feature modules. Added support for mailbox user plugins, which can add additional inputs and capabilities to a mail user. Added a restore.pl script to restore domains and features from the command line. Fixed a bug when attempting to rename a PostgreSQL user on older versions that don\u0026rsquo;t allow it. Added a Module Config option for a jailed FTP shell. 2.30 Fixed several bugs related to creating and restoring backups. Moved bandwidth graphs to separate page, and added mode to show sub-domain usage. Added the command-line backup-domain.pl script. Added button to domain editing page for viewing latest Webalizer report. Implemented support for using LDAP to store domain and mailbox users and groups, by calling functions in Webmin\u0026rsquo;s LDAP user management module. Requires that the system be set up to use LDAP for NSS and PAM. Clash checking is now done when enabling new features for an existing server. When creating a server, if a feature fails for some reason the rest will still be processed. This avoids the problem of a server being partially created and unknown to Virtualmin. Similarly, when deleting a server any failure will be ignored, to avoid the problem of features being left around when the server has been removed from Virtualmin. A database name can be specified when creating a server, rather than the default which is computed from the domain name. Added form on plugins page for editing the configuration of plugins that have a config.info file. Added the enable-feature.pl and disable-feature.pl script, for activating and turning off features for a virtual server from the command line. Added the enable-limit.pl and disable-limit.pl scripts, for updating server owner limits from the command line. Created the Custom Fields page, for defining your own fields that can be edited for each virtual server. Added a button to the Edit Server page for displaying just the usage for that server. This is available to server owners as well as the master administrator. Added a new limit for domain owners to prevent them from choosing the name for new domain databases. 2.40 Fixed bug related to multiple IF- blocks for the same variable in templates. Added support for Qmail+LDAP as a new mail system. If selected, all mail users and aliases will be stored in LDAP automatically. Thanks to Omar Amas for sponsoring this feature. Added extra domain owner limits to force sub-domains to be under parent domains, and to prevent renaming. Added support for Qmail+VPOPMail as a new mail system. When enabled, all mailboxes and aliases are created in VPOPMail instead of using Unix users. Thanks to Linulex for sponsoring this one. When editing the forwarding destinations for email to a user, the user\u0026rsquo;s mailbox can be explicitly selected as a destination. On the server template page, default aliases for new users in domains using that template can be specified. Added an option to exclude the logs directory from backups. The default MySQL database name, wildcard and allowed hosts can now be set on the server templates page. A virtual server can now have more than one MySQL or PostgreSQL database, which can be managed using the Edit Databases button on the Edit Server page. Thanks to Olimont for sponsoring this feature, and the backup changes. The create-domain.pl script can now create sub-servers and alias servers too. Added a Module Config option to have domain and mailbox users created in other modules. Added options on the restore page to fix up the DNS and Apache IP addresses when restoring. Useful when transferring a domain from another server. 2.50 When using VPOPMail as the mail server and a domain uses an existing Unix group, no extra group for mailboxes is created. Default quotas and other limits for a new domain can now be specified in templates, instead of globally. Added support for the VPOPMail autoresponder program. FTP server logs can now be used for bandwidth accounting as well, so that anonymous downloads and files downloaded by domain owners count towards bandwidth usage totals. Thanks to Olimont.com for sponsoring this feature, and the mail log support. Mail server logs (in Sendmail, Postfix or Qmail formats) can now be checked to include mail sent to mailboxes and aliases in a domain in bandwidth totals. Usage graphs now show bandwidth used by each feature in a different colour, and can show usage by day or month as well as by domain. Creation of an initial MySQL or PostgreSQL database for a server is now optional. Instead, you can choose to just have a login created instead. Add file writes now use the new Webmin API to prevent truncation if a disk space shortage or other error occurs. Added an option to the domain creation form to generate a password randomly. Domain names and usernames can now start with a number. The permissions on the public_html directory can now be edited on the server template page. Added an option on the template page for doing web logging via a program, which silently ignores problems writing to the logs. This prevents Apache from failing to re-start if a user deletes his ~/logs directory. The Webalizer statistics directory can now be password protected, via an option on the Server Templates page. Added an option to the Bandwidth Monitoring page to disable it for selected servers, such as those that have extremely large logs. When Webmin 1.201 or later is installed, there is an additional option on the Server Templates page to have Webmin and Usermin per-IP SSL certificates added to match those used for the Apache SSL virtual server. Made available an option on the template page for turning off the automatic synchronization between a server\u0026rsquo;s password and that of its MySQL login. Added an option on the template page for defining default mail aliases for new servers. 2.60 Added a button to the Edit Server page for re-sending the signup email. Created a page for updating the IP addresses for all non-private virtual servers at once, for use when a system\u0026rsquo;s primary IP address changes. The IP address for a private virtual server can now be changed using the Change IP Address button on the Edit Server page. Slave zones can now be added to multiple servers, when using Webmin version 1.203 or later. When a server\u0026rsquo;s home directory is renamed, any protected web directories within it will be properly updated too. Added command-line programs called enable-writelogs.pl and disable-writelogs.pl to turning on or off logging via a program for existing domains, or all domains. Quotas and bandwidth limits on the templates page now have proper units like kB or MB, rather than being in bytes. Added support for resellers, which are users who can create top-level virtual servers up to limits imposed by the master administrator. Each reseller can be limited in the number of servers, mailboxes and databases he can own, and the total quota he can assign to all owned servers. Added support for third-party script installation, such as PHP-Nuke, Formmail and other common web tools. These can be installed and managed using the Install Scripts button on the Edit Server page. Created a new feature - per-domain Spam filtering using SpamAssassin and Procmail. Each server can have its own SpamAssassin settings and spam delivery action. Added a similar feature for per-domain Virus filtering using ClamAV. Added an icon on the main page and a button on the Edit Server page for emailing all server owners and all mailboxes in a domain respectively. Ranges for automatic IP allocation can now be defined in a more user-friendly way on the Server Templates page. Added built-in support for granting mail/FTP users access to MySQL databases. Templates can now be restricted to some, all or no resellers. All quota fields now have an option for selecting the units, rather than always being entered in kB. Added a new option on the Edit Owner Limits page, to put a server into demo mode. In this mode, the owner cannot make changes to any settings, only view them. On the Server Template page, added an option to create an SPF DNS record in new domains. Virtual servers without mail enabled can now create and manage users, for database and FTP access purposes. Server owners can backup their own virtual servers, but only to a remote FTP or SSH server. Added a new feature - status monitoring for a virtual server\u0026rsquo;s website, which will notify the server owner if it is down. Third-party script installers can now be added using the Script Installers icon on the module\u0026rsquo;s main page. Added command-line programs for deleting virtual servers and users, and disabling and enabling servers. Added the modify-domain.pl command-line program, for changing various attributes of a virtual server. Added a system information display to the main page, showing the versions of the various programs that Virtualmin uses. A virtual server with a private IP address can now have it removed on the Edit Server page (assuming that it doesn\u0026rsquo;t have an SSL website or virtual FTP server). Added help pages for the template, reseller, IP allocation, plugin and custom fields pages. Added command-line programs for listing, creating and deleting mail aliases. Added command-line programs for listing and modifying users. Database names can now be restricted to start with the server\u0026rsquo;s domain name, using a new option on the server template page. Added command-line programs for listing, creating and deleting databases. Added command-line programs for listing, creating and deleting resellers. Created a method for executing Virtualmin command-line programs via HTTP requests, by calling virtual-server/remote.cgi Added the modify-limits.pl command-line program, for setting a server owner\u0026rsquo;s limits. Added command-line programs for listing and setting custom fields. Added the migrate-domain.pl command-line program for importing a backup from another control panel, such as Plesk. Added a Module Config option to add an /etc/procmailrc entry to force delivery to the default destination, to prevent mailbox users from running commands via .procmailrc files. On Sendmail systems, you can specify the bounce message for aliases whose destination is set to Bounce mail. The Change IP Address page can now also be used to set a different port for a server\u0026rsquo;s normal and SSL websites. This can be useful for running an SSL server on a non-standard port, without needing a private IP. The template for an existing virtual server can now be changed. However, this does not immediately effect any of its settings. Space used by databases is now included in the disk quota displays, although it is not actually enforced. 2.80 Proxying and frame forwarding can be enabled, disabled and configured more easily for existing web virtual servers using the Edit Proxy Website and Edit Forwarding Frame buttons on the Edit Server page. The import feature now supports SSL Apache virtual servers too. Added the Disk Quota Monitoring page, for setting up automatic email notification on servers that are approaching or have reached their disk quota. Added buttons to the user and alias lists for deleting several of each at once. 2.83 Added script installers for Horde, IMP, Kronolith and Gollem. 2.84 Added an option on the Server Templates page for setting secondary groups that users with email, ftp and database access will be granted to. This can be useful for controlling their visible modules in Usermin. Virtual server mail/FTP/database users can also be assigned to arbitrary secondary groups, defined on the Server Templates page. 2.85 Network interfaces are now identified by address rather than name, to avoid problems with interface numbers changing on operating systems like Gentoo and FreeBSD. Added a new backup format that doesn\u0026rsquo;t create files in /tmp when not needed, instead using only each server\u0026rsquo;s home directory. 2.87 Added help on the Backup Virtual Servers page. Fixed some messages and small bugs reported by users. 2.88 Fixed bug in new backup format that prevents PostgreSQL dumps from working. The default mail user quota is now settable on a per-template basis. Added a button on the user list page for updating quotas and email in multiple users at once. Moved the option for hard or soft quotas to the server templates page, so that different types of quotas can be used for different domains. 2.89 When importing a virtual server, a parent server can be specified to control the new domain in Virtualmin. Added a button below the user list, which brings up a page for defining defaults for new users in that virtual server. This can be used to define initial quotas, FTP access, databases and mail forwarding. 2.90 When disabling a virtual server, the accounts for any mail users are locked too. The \u0026lsquo;Home directory\u0026rsquo; and \u0026lsquo;Unix users\u0026rsquo; are now always enabled, unless you select to make them optional on the Module Config page. These are needed for almost all virtual servers, so it makes little sense to show the option. Added a button for re-checking the license immediately if a problem was detected during a regularly scheduled check. Mail users can have their logins temporarily enabled or disabled, using the web or command-line interfaces. Limits can now be placed on the number of aliases a virtual server can have, at the server owner and reseller levels. In addition, plugins can specify that certain aliases should not count towards this limit (or be displayed to the user). The method by which the domain name is appended or prepended to a mail user\u0026rsquo;s name can now be set on a per-template basis. Plugins can now define their own limits to be configured on the Edit Owner Limits form, such as a restriction on the number of mailing lists a server can have. Added support for plugins that define new database types. 2.92 Added an option to email a mailbox user with his new account details upon saving, and a template page for editing the message sent. Added a form to the Script Installers page for upgrading some script on several virtual servers at once. Extra Webmin modules can be specified for server owners on the Edit Owner Limits page. Virtual server functions that a server own can access (like databases, scripts, users and aliases) can now be individually controlled on the Edit Owner Limits page, rather than being automatically determined based on his ability to create servers. Resellers can now have their own IP allocation ranges defined, which will apply to all virtual servers that they create or manage. Added a template option to have an alias server under another domain when a server is created. This can be useful when a new domain has not yet been registered, to allow it to be accessed under the provider\u0026rsquo;s domain. When restoring a single virtual server, you can select to restore just one mail/FTP user instead of all of them. You can also choose to just re-import a server whose /etc/webmin/virtual-server/domains file is missing. Added a new type of mail/FTP user who can manage the virtual server\u0026rsquo;s website files. This user has the same permissions as the server owner, but is restricted to it\u0026rsquo;s web files directory. 2.94 Feature selection when adding or editing a virtual server is now done using checkboxes rather than Yes/No radio buttons. Added a section to the Server Template page for specifiying the logrotate directives for a new server, rather than always using Virtualmin\u0026rsquo;s automatically generated directives. Server owners can be prevented from editing the schedule and directory for their Webalizer reports, using a new option on the Server Template page. Added a button for creating a sub-domain, which is like a sub-server but is always under the parent domain, and uses a sub-directory of its web files directory as the document root. By default, settings that used to be on the Create Server page with are set in the template (such as the quota, bandwidth limit and mailbox/alias/database limits) are no longer displayed. Instead, the settings from the selected template are used. The old behaviour can be restored using a setting on the Module Config page. 2.96 The message displayed on the website of a disabled virtual server is now configurable on the server template page, rather than being fixed. A new server template option allows disabled websites to redirect the browser to a different URL, rather than service a local HTML page. When backing up virtual servers, you can also include core Virtualmin configuration settings, such as templates, resellers, the module configuration and so on. The restore page also has options to extract these from a backup. This new feature allows all data relevant to Virtualmin to be backed up from a single place. 2.97 Added buttons to the list of virtual servers for deleting several at once, and updating settings such as the quota, bandwidth limit and enabled features on several at once. The same form can be also used to disable or enable multiple virtual servers. Extra PHP variables to be added to a server\u0026rsquo;s Apache config when a third-party script is installed can be set on the Server Templates page. Added a new configuration page available to the master administrator for specifying Webmin servers with Virtualmin installed to be used as secondary MX\u0026rsquo;s. Once this is done, any new mail domains will be relayable through those servers. 2.98 The FTP server can be stopped and started, like the mail, DNS and web servers. 2.99 Multiple databases can be deleted at once from a virtual server. Updated the modify-limits.pl command line program to allow setting of editing limits and maximum aliases. When adding or removing Sendmail domains to accept email for, comments in the local domains file in /etc/mail are now preserved. Plugins can now define additional inputs to display on the Server Template page, such as defaults for limits on the number of mailing lists, repositories and so on. Extra administration logins can be created for virtual servers, who have a subset of the permissions granted to the main administrator. This allows server owners to delegate some of their powers to other people, without giving out the main password for the virtual server. Limits can be set at the server owner and reseller levels on the number of alias and non-alias servers, which are imposed in addition to the overall limit on servers. This allows users to be given separate higher limits on alias servers. Added command-line programs to list and manage extra administrators. 3.00 When renaming a domain that has users in user@domain format, the users will be renamed too. 3.01 Server owner limits can be updated for multiple users at once on the Update Virtual Servers page. The email addreses to send status monitoring messages to can be set on the Server Templates page. When restoring a backup, the home directory of any virtual servers created is re-allocated to use the directory and rules defined on the destination system. If the Apache module has been configured to create a symlink for a new virtual host\u0026rsquo;s file in a separate directory (sites-enabled on Debian), Virtualmin will too. 3.02 Added a script installed for CivicSpace. Mail users in the user@domain format are now supported when using Postfix, by creating extra Unix users without the @ for mail delivery. 3.03 Added script installers for FormMail and cgiemail. 3.04 Added Restart buttons when using the new Virtualmin theme. Long domain names are now shortened when displayed in lists and menus, to a length settable on the Module Config page. Plain text passwords are stored for all new and modified mailbox/FTP users, which allows MySQL, DAV and SVN access to be enabled for users without their passwords needing to be reset. 3.05 Added PHP module checking to the Horde script installer, and updated it and other dependent scripts to the latest versions. Added script installers for MediaWiki and TWiki. Webmin users created by Virtualmin are marked as non-editable, and so cannot be manually modified in the Webmin Users module. 3.06 Added script installers for the Turba, Ingo, Nag and Mnemo Horde components. Added a script installer for DokuWiki. Fixed a bug that prevented additional database access for mail users from being properly restored. The displayed mailbox size for users with Maildir format inboxes includes all sub-folders and other files within the directory. The size of mailboxes is calculated from the number of blocks used rather than the byte file sizes, which is more accurate as it reflects the true quota usage. Added a script installer for Moodle (thanks to Kevin Rauth). Added a script installer for phpAdsNew. Added command-line programs for listing, installing and removing third-party scripts. Added online help for the Server Owner Limits page. Added a work-around for the problem of mail being delivered with ownership root by the procmail wrapper. 3.07 The CGI directory for sub-domains is now set to be a sub-directory of the parents cgi-bin, and the log files are set to be the same as the parent server\u0026rsquo;s. Webmin ACL files for Virtual server owners and extra admins can now be included in backups. Added a server template option to force extra administrator usernames to begin with some prefix, such as the virtual server\u0026rsquo;s username. Plugin modules data can now be included in Virtualmin backups, such as Mailman mailing lists, AWstats config files and SVN repositories. Added script installers for Mambo and Joomla, thanks to Kevin Rauth. Bandwidth stats are now included in backups. Fixed a bug that prevented mailbox user quotas from being backed up. 3.08 Added a script installer for phpWebSite. Added a button to the Edit Server page for moving sub-servers to a different owner. When a process (such as a domain setup) requires Apache to be restarted, it will not be re-configured as well. Added script installer for osCommerce. Updated the function for moving virtual servers to allow a parent server to be converted to a sub-server, and create a command-line script for moving servers. Added a new page available to the master administator for validating virtual servers, by checking that all enabled features are actually properly configured. Added a button the server template pages for viewing scripts associated with a template, for installation when a server is created. This allows common third-party scripts to be automatically setup for new servers. Updated the installer to have Webmin pre-load several Virtualmin and Webmin libraries, speeding up the user interface. Added a link to the left-side frame for viewing a domain\u0026rsquo;s website, using a HTTP request tunnelled through Webmin. This is useful if the domain name has not been fully registered in the DNS yet. The Command Shell module is now available to server owners - but can be disabled on the Module Config page. Removed the Logrotate and Webalizer features for sub-domains, which share log files with the parent domain. 3.09 Proxying to SSL websites now works when using Apache 2 or later. When moving a sub-server, you now have the option to convert it to a top-level server with a new username and password. When email is enabled or disabled for an existing virtual server, MX records are added to or removed from the DNS domain. Virtual server owners are no longer allowed to change the Apache server name or aliases for their websites, as this can confuse Virtualmin. Changed the way ClamAV is called from Procmail so that it doesn\u0026rsquo;t reject mail when some error occurs, such as a shortage of disk space for scanning. Added checks for ownership to directory validation. Added script installer for IntegraMOD. When moving a server, if a vital feature fails (like the home directory or Unix user), the entire process is halted. Added the command-line script validate-domains.pl, for checking the configuration of virtual server features. Added a Module Config option to validate the Apache configuration before applying it, to prevent config errors from halting the web server. 3.10 Fixed a bug that caused an error message about postfix_installed to be displayed at install time. 3.11 Added a new Spam and Virus Delivery page for modifying the destinations for messages classified as spam or containing viruses, after a virtual server has been created. Added the modify-spam.pl program for changing the spam and virus delivery actions from the command line, and updated the list-domains.pl program to show the current delivery settings. The Running Processes extra modules config option now allows you to choose if a domain admin can see other users\u0026rsquo; processes. A custom prefix can be specified when importing or migrating a virtual server. 3.12 Added support for finding the mail log from syslog-ng, if using Webmin 1.270. Resellers and server owners without editing access can now change their passwords through the Virtualmin interface. When making a backup to a remote server, the connection is tested before the backup is actually started. All script installers that use a database will now be configured to connect to the correct remote database server, if one has been setup in the MySQL or PostgreSQL modules. If a mailbox user\u0026rsquo;s password is changed by the passwd command or some other program, Virtualmin will detect this and realize that the plain-text password stored for the user is no longer valid. Fixed a bug that prevented SuExec directives from being added to sub-server Apache configurations. When deleting a virtual server, its webalizer config files are removed too. Added an option when creating a virtual server with a private IP address to enter an IP that is already active on the system. MySQL database names containing the _ or % characters are now properly escaped in the db table, to prevent their owners from accessing or creating other databases. Added the \u0026ndash;force-dir option to install-script.pl. 3.13 Adde a section to the List Databases page for changing the database login name for an existing virtual server. This allows servers whose default database names would clash to be more easily created. Added a new Batch Create Servers page for creating multiple virtual servers at once from a simple text batch file. The virtual server validation function now checks to ensure that mail user home directories exist and have the correct ownerships. New and modified mailbox messages can use blocks like $IF-VIRTUALMIN-DAV to display different messages depending on whether or not plugin features like DAV are enabled. When importing a virtual server, users can be found by a regular expression as well as just matching by primary group. Fixed a bug that could cause mailbox users\u0026rsquo; home directories to be owned by the server administrator. The rarely-used \u0026lsquo;Group for Unix user\u0026rsquo; option on the server creation page is now hidden by default. Added a new Batch Create Users page for creating multiple mail / FTP users at once from a simple text batch file. Fixed incorrect URLs in the PHPSupport script installer, and added support for version 2.1. Added highlighting to all tables, when using the latest theme. 3.14 Fixed bug with spamassassin command. 3.15 Added caching to the lookup-domain.pl script, to speed up processing when mail is delivered. Added a template option to have PHP scripts run as the domain owner, via a CGI wrapper script. Added support for phpMyAdmin 2.8.1. When backing up a virtual server, the cron jobs for the Unix user are included too. 3.16 Added a check for new-format backups of domains without home directories (such as aliases), which previously failed. Updated Joomla installer to 1.0.9, and phpBB to 2.0.21. Optimized the bandwidth accounting code for email to only scan the maillog once for all domains, which should speed up the bw.pl process on systems with large mail logs. Added a checkbox on the backup page to have the destination directory automatically created. 3.17 Added \u0026ndash;user parameter to list-users.pl. When adding a virtual server with a website, a root-owned file is created in ~/logs to prevent deletion of that directory. Added an option to create destination directories to the single-domain backup page. Mailbox, alias, databases and domains limits are set from the template if not specified explicitly in create-domain.pl. If an extra administrator username does not match the prefix specified in the domain\u0026rsquo;s template, the master administrator is now allowed to change it. Added a script installer for NMS, a FormMail replacement. Domain owners and resellers can now view actions they have taken in the Webmin Actions Log module (if enabled on the Module Config page). Extra administrators for a virtual server cannot change the server owner\u0026rsquo;s password in the Change Passwords module. Made the bandwidth usage page visible to resellers (for their managed domains). Updated Squirrelmail installer to version 1.4.6, DokuWiki to to 2006-03-09, MediaWiki to 1.6.7, phpMyAdmin to 2.6.4-pl4, phpPgAdmin to 4.0.1, phpWiki to 1.2.10 and 1.3.12p2, TikiWiki to 1.9.4, WebCalendar to 1.0.4, and Joomla to 1.0.10. Added a field to the Edit Server page and an option to modify-domain.pl for changing the mailbox username prefix for servers that don\u0026rsquo;t have any mailboxes yet. Non-standard ports for SCP and FTP backups can be specified by putting :port after the hostname on the backup form. Added options on the New Mailbox Email page to have the message sent to the domain owner and reseller as well. Optimized the writelogs.pl program to use less memory. 3.18 Updated Squirrelmail installer to version 1.4.7. The licensed domains limit no longer includes alias domains. Added a script installed for DaDaBIK 3.2. Added a simpler form for setting up mail aliases which only forward to another address, deliver locally and/or send an auto-reply. The old form is still available though. Merged the code base with Virtualmin GPL (this should not have any effect on Virtualmin Pro features). Added checkboxes and a button to the reseller list page for deleting several at once. Fixed a bug that caused mail bandwidth usage to be counted more than once. 3.19 Comments on mail aliases can be edited, and will appear in the list on the Mail Aliases page. The create-alias.pl program has also been updated to allow comments to be set, and the list-aliases.pl program to show them. When email is set to a new or modified mailbox, the From: address is that of the domain owner. Added Module Config options for commands to run before and after an alias is created, modified or deleted. When a domain owner is granted access to the Webmin Actions Log module, he can also view actions taken by extra admins. Added script installed for DaDaBiK 4.0 beta 2. Fixed a bug that prevented DNS zones from being added to a file other than named.conf, even if specified in the BIND module. Changed the layout of the script installers page to show more information, and added checkboxes and a button for un-installing several at once. For scripts that have more than one version available, a description of the meaning of each version (such as stable or development) is displayed. Updated script installers for Drupal to versions 4.7.2 and 4.6.8, phpMyAdmin to 2.8.2 and WordPress to 2.0.4. Sub-domains with DNS enabled are now added by default as records in the parent DNS zone, rather than as a completely new zone. The server template editing page is now broken down into sections, selectable using a menu. This reduces the size of the form, and makes it easier to find settings that you are interested in. Removed un-needed code to support versions of Webmin below 1.290. Added a script installer for AROUNDMe 0.6.9. Added check for a global SpamAssassin call in /etc/procmailrc, which can interfere with Virtualmin\u0026rsquo;s per-domain SpamAssassin settings. Improved support for running within a Solaris zone (thanks to Textdrive). Added an option on the Backup Virtual Servers page to have each server\u0026rsquo;s backup file transfered by SCP or FTP after it is created, rather than doing them all at the end of the backup. This saves on temporary local disk space on the server running Virtualmin. Virtusers associated with mailboxes are not un-necessarily removed and re-added when no email related changes are made. 3.20 Updated CivicSpace script installer to version 0.8.5, Coppermine to 1.4.9, dotProject to 2.0.4, Drupal to 4.7.3 and 4.6.9, Gallery to 1.5.4 and 2.1.2, HelpCenter to 2-1-2, Mambo to 4.5.4, MediaWiki to 1.7.1 and 1.6.8, Moodle to 1.5.4, osCommerce to 2.2ms2-060817, phpAdsNew to 2.0.8, phpCOIN to 1.2.3, PHPlist to 2.10.2, phpMyAdmin to 2.8.2.4, PHP-Nuke to 7.8, PHPsupport to 2.2, PHPsurveyor to 1.0, TWiki to 4.0.4, Xoops to 2.0.15, and ZenCart to 1.3.0.2. Updated all script installers for Horde and related applications to their latest stable versions. Added script installers for the Horde applications MIMP, Chora and Passwd, Forwards and Vacation. Quota in email messages to domain owners and mailboxes (using the $QUOTA variable) now use nicer units, like 300 MB. On the Secondary Mail Servers page, you can now specify a hostname to use in the MX record for each server (like secmx.yourdomain.com) instead of having Virtualmin just use the server\u0026rsquo;s hostname. Updated the \u0026lsquo;Default delivery for spam\u0026rsquo; and virus options on the Module Config page to allow an arbitrary file or email address to be entered. Domain owners can now perform backups to the virtualmin-backup directory under their home (which does not get included in future backups). When adding a DNS zone inside a view that uses an include statement, the included file will be used if specified in the BIND module configuration. When installing a script that requires a database, an option is available from the databases menu to create a new one specifically for the script (if permitted by the users\u0026rsquo; limits). Added the \u0026ndash;newdb option to the install-script.pl program, for creating a database for use by a newly installed script. Added a Module Config option to compress backups using the bzip2 format, which is more efficient. On the script installers page, available scripts are listed by category (such as Email, Blog, etc.) to make them easier to find. 3.21 Updated ZenCart script installer to 1.3.5, PHPCoin to v124, and TikiWiki to 1.9.5. The \u0026lsquo;Full path to clamscan command\u0026rsquo; option on the Module Config page can now take a command with arguments. The start and stop buttons for MySQL and PostgreSQL are not shown when it is not running locally. Access to the default templates can be denied to virtual server owners, just as it can be for other templates. Added a Save and Next button to the server template page, for easily moving to the next section. Added the \u0026ndash;limits-from-template option to create-domain.pl, to inherit default limits from template settings. Added the list-templates.pl command-line script. Added a checkbox to the email section of the server templates to bounce email to new domains that does not match a specific alias or user. Added a section to the limits section of the server templates for selecting what capabilities are enabled by default for new domains (like being able to manage aliases, databases and so on). Added an option to the Spam and Virus Delivery page to automatically whitelist all mailboxes in a domain. Also update the modify-spam.pl script to be able to set this same setting. 3.22 Updated Mambo script installer to 4.6, phpMyAdmin to 2.9.0, and PHP-Nuke to 7.9. When adding a secondary mail server, all existing mail domains can be optionally added to the server. This will update MX records as well. When removing a secondary mail server, all secondary domains that were created on it will be removed, and all MX records referring to it deleted. Bandwidth limits can now be imposed on resellers, which limits the total amount of bandwidth the reseller can allocate to his customer\u0026rsquo;s domains. Fixed bugs that prevented suexec PHP from working properly in sub-domains. Outgoing address mapping (generics) entries are added for new domain owners. User mail directory sizes are now displayed correctly. Added the \u0026ndash;mail-size option to the list-users.pl program. Displayed disk usage for virtual servers is now taken from the group quota (when enabled), to ensure consistency. Added a new left-side Disk Usage link which shows usage for each directory, mailbox and sub-server under a virtual server. 3.23 Added upload fields on the SSL certificate form, for using an existing certificate in a file. Updated phpMyAdmin script installer to 2.9.0.1. The Disk Usage page now shows mailbox in sub-domains too. 3.24 Updated phpMyAdmin script installer to 2.9.0.2, DaDaBiK to 4.0, PHPlist to 2.10.3, MediaWiki to 1.8.0, and Mambo to 4.6.1. Added a Module Config option to control categorization for domain owner\u0026rsquo;s Webmin modules. Added preloading for the main virtual-server-lib.pl library, to speed up Virtualmin CGI programs. The creation date and creator (if available) is shown when editing a virtual server. MySQL backups are now compressed with gzip, to save on disk space from the original SQL format. The license expired message is only displayed to the master administrator, rather than all users. When log rotation is set to always enabled, it will follow the virtual website setting. Added options to the Spam and Virus Delivery page to write spam to ~/Maildir/spam/. Changed default Apache log format to combined. 3.25 Added text fields to the single and multiple domain disable forms for entering a reason why the disable was done. Also updated disable-domain.pl with a new \u0026ndash;why flag. Update the Disk Usage page to include a separate per-directory count of disk space used by the domain owner (versus other users like root or httpd). Updated script installer for Ingo to 1.1.2. Fixed a bug that caused server templates to disappear. 3.26 Creating virtual servers on existing private IPs that are already used by another domain is no longer allowed. Forwarding addresses in users created from batch files are now actually used. Added an option in the server templates in the Webmin login section to specify a Webmin group to which the domain owner is added. This can add new modules and override ACLs on existing ones. Updated script installer for Drupal to versions 4.7.4 and 4.6.10, DaDaBIK to 4.1_beta, Wordpress to 2.0.5, Coppermine to 1.4.10, and MediaWiki to 1.8.2. Domain owners can now view their apache access and error logs, via links on the left menu. When using the Virtualmin framed theme, the module\u0026rsquo;s main menu now only lists domains, rather than showing buttons and icons which already exist in the theme\u0026rsquo;s left menu. Updated the global Script Installers page available to the master administrator to control which versions can be installed, and to simplify and categorize the user interface. Website FTP users can be created with home directories under ~/public_html, which allows the easy creation of users who can manage only part of a website. Moved download site for Civicspace script installer to download.webmin.com, as the original site is unavailable. Changed the name of the NMS script installer to NMS::FormMail, to be more descriptive of its purpose. Added a new page for checking user and group disk quotas. When PHP scripts are run as the domain owner, session.save_path is set to ~/tmp in the domain\u0026rsquo;s PHP configuration, to ensure that session temp files can be written. Removed action buttons from the Edit Domain and View Domain pages when using the framed theme, as they are already available on the left menu. Added a new Spam filtering section to the Server Templates page, for selecting whether to use spamassassin or spamd for spam classification. Also updated the Spam and Virus Delivery page to allow this to be modified on a per-domain basis, and the modify-spam.pl script to do the same. Updated the phpBB script installer to do database configuration automatically. Password quality restrictions set in the Users and Groups module now apply to mailboxes. Database name restrictions now apply when creating virtual servers too. Added the ability to switch the PHP execution mode (mod_php vs. CGI) on a per-domain basis, using the new PHP Options link on the left menu. This can also be done using the modify-web.pl command line script. Added \u0026ndash;proxy and \u0026ndash;framefwd options to the modify-web.pl script, to configure proxying and frame forwarding from the command line. On systems that have a php-cgi program, it will be used instead of php when PHP scripts are run as CGIs. 3.27 Fixed bug in System Logs module access that allows viewing of all logs. 3.28 When adding a MySQL database through the web and command-line interfaces, the default character set can be selected. A warning is displayed for users who are within 5 MB of their disk quota in domains with spam filtering, indicating that filtering is disabled. In the virtual server list, servers that are using proxy or frame web forwarding have (P) or (F) next to their names. An SPF record can be added to and configured in an existing virtual server using the DNS Options entry in the left menu, or the modify-dns.pl command-line script. The DNS IP address for an existing virtual server can also be set using the DNS Options page, or the modify-dns.pl program. When a virtual server uses spamc for spam processing, mailbox users\u0026rsquo; quotas are not checked at delivery time, as there is no danger of spamassassin failing if a user is close to his quota. 3.29 The cache file used by the lookup-domain.pl program to determine if a mailbox is close to its disk quota is automatically flushed when a user\u0026rsquo;s or domain\u0026rsquo;s quota is changed, which increases the speed at which such changes are detected. When renaming a virtual server, an option is available to rename any mailboxes in the domain that contain the old server name. A city or locality name can be entered when generating a certificate. Added an option to use Spanish to the Joomla script installer. Changed the \u0026lsquo;PHP Options\u0026rsquo; page to \u0026lsquo;Website Options\u0026rsquo;, and added a field for enabling log writing via a program (to protect against a missing ~/logs directory). When restoring template backups, existing templates are no longer deleted. This makes copying templates to new servers easier. Added checkboxes and a button on the Server Templates page to delete several at once. Fixed the osCommerce script installer, so that the admin module works. Virtual server backups can now be made to Amazon\u0026rsquo;s S3 service, which provides online storage (at a price). Similarly, restores can be made from the same service. Before you can use this feature, you must sign up for an account with S3 and get an access key and secret key. Each reseller can have an IP address specified for virtual servers with shared address websites under his ownership to be set up on. All DNS records in the servers\u0026rsquo; domains will use that IP, which allows resellers to appear to have a dedicated server for their customer domains. The change IP address page can now modify the IP of name-based servers, if more than one possibility is available (such as from a reseller IP). Similar, the modify-domain.pl program now takes a \u0026ndash;shared-ip option to do the same thing. 3.30 Added a server template option (enabled by default) to set group ownership on each domain\u0026rsquo;s MySQL database files, so that they are properly counted towards the domain\u0026rsquo;s quota. Updated the Disk Usage page to include the top 10 databases by space used. Added a warning when installing a script into a directory that already contains other files, as they will be deleted when it is removed. Updated the TikiWiki script installer to version 1.9.7, ZenCart to 1.3.6, Xoops to 2.0.16, Kronolith to h3-2.1.4, Turba to h3-2.1.3, Nag to h3-2.1.2, Mnemo to h3-2.1.1, DokuWiki to 2006-11-06, Gallery to 1.5.5-pl1, Squirrelmail to 1.4.9a, phpAdsNew to 2.0.9-pr1, DaDaBiK to 4.1_rc1, ZenPhoto to 1.0.5, and phpMyAdmin to 2.9.1.1. Added script installers for Zenphoto 1.0.3 and bbPress 0.73. Improved the TikiWiki script installer so that the admin no longer has to enter database connection details. Added a new link under Administrative Options for switching to the login of a virtual server owner. This is only available for resellers and the master administrator. Added a section to the Edit Databases page for changing the MySQL and PostgreSQL passwords for a virtual server, to make them independent of the main administration password. The simple mail alias page can now be used to forward to multiple addresses. Password quality restrictions set in the Users and Groups module are not properly enforced. Re-designed the Edit User page to use a cleared sectional layout. Changed the default mail forwarding inputs on the Edit User page to use the same simple layout as the Edit Alias page. Fixed the Change IP Address page so that alias domain IPs are changed in sync with their targets. Backups of mail / FTP users now include their Cron jobs, such as scheduled emails and automatic mail folder clearing. Added an option on the Edit Reseller page to lock a reseller\u0026rsquo;s account. Also added \u0026ndash;lock and \u0026ndash;unlock parameters to create-reseller.pl and modify-reseller.pl. Added install-time checks to ensure that the Apache mod_suexec and mod_actions modules are enabled. Database backups and restores are done by calling functions in the Webmin 1.310 MySQL and PostgreSQL modules, rather than using duplicate built-in code. This prevents the PostgreSQL login prompt from appearing when doing a command-line restore. Email is now also sent when a new alias virtual server is created. Added a field to the DNS section of server templates for specifying BIND directives to be added to the named.conf entry for new domains. 3.31 When changing the home directory of a virtual server, all references to the old home in its Webalizer configuration files are updated to the new location. Similarly, when restoring a backup from a server that uses a different home base, the Weblizer configuration is updated to use the new home. Updated the Default domain owner limits section of the Server Templates page to add defaults for the \u0026lsquo;Can choose database names\u0026rsquo;, \u0026lsquo;Can rename domains\u0026rsquo; and \u0026lsquo;Allow sub-servers not under this domain\u0026rsquo; options. Added a field to the Website Options page to enable or disable suexec on a per-domain basis. Also added equivalent flags to modify-web.pl. Validation of the mail feature now also checks to ensure that any secondary mail servers are actually receiving email for the domain. Fixed a bug that prevents backups from a system using /var/mail for email storage being fully restored on a system that uses ~/Maildir. Owners of domains that have virtual FTP enabled are now able to view their FTP server logs. Fixed bug that prevents custom ports from being entered for FTP and SSH backups. Changed most instances of the word \u0026lsquo;Unix\u0026rsquo; to \u0026lsquo;Administrator\u0026rsquo; in user interface. When PHP via CGI is enabled for a virtual server, the session save path in ~/etc/php.ini is set to ~/tmp. Updated the phpBB script installer to version 2.0.22, phpProjekt to 5.2, Joomla to 1.0.12, phpList to 2.11.2, ZenCart to 1.3.7, Gallery to 2.2-rc-1, Drupal to 4.7.5/4.6.11, WordPress to 2.0.6, bbPress to 0.74, and ZenPhoto to 1.0.6. Changed the \u0026lsquo;Add Apache user to Unix group for new servers?\u0026rsquo; option in the server template to add a working No option. Virtual server owners using the Apache module are now limited to their home directory for alias targets and other Apache directives that specifiy directories. Added support for migrating Ensim backups into Virtualmin domains. Includes website, DNS, MySQL, mail aliases and mailbox migration capabilities. 3.32 Updated MediaWiki script installer to 1.9.0, DaDaBiK to 4.1, WordPress to 2.1, bbPress to 0.75, phpMyAdmin to 2.9.2, TWiki to 4.1.0, phpPgAdmin to 4.1, and phpWiki to 1.3.13rc1. Added support for running PHP scripts via FCGId, which combines speed and domain-level user security. Added a new Custom Links global configuration page, for defining extra links that appear on the left menu. Added an option to the Edit Owner Limits page for controlling if a domain owner can login via FTP, SSH or neither. Also added a corresponding option to the mass server change form, and the modify-limits.pl command-line script. After saving a virtual server, a page showing a confirmation message and common links is displayed, rather than the (slow) Edit Virtual Server screen. Hid most options on the virtual server creation form in an expandable sections. Changed the mail alias creation page to use Javascript to select simple / advanced mode forms. Changed the mail / FTP user page to hide infrequently used options in collapsed sections, and to use Javascript to select simple / advanced mail forwarding modes. Changed all rows of links to put a | between them, increasing readability. Added a help link in the top-left corner on the server creation form. Cleaned up Edit Virtual Server and Virtual Server Details pages to use collapsible sections and more consitent layout. Added a section to the virtual server creation form for selecting an initial style and message for a new website. Also added \u0026ndash;style and \u0026ndash;content options to create-domain.pl, for the same purpose. 3.33 Fixed bug that prevented the email for new sub-servers from being disabled, and added an option to inherit it from the parent template. Updated MediaWiki script installer to 1.9.1, ZenPhoto to 1.0.6, Drupal to 4.7.6, and phpAdsNew to 2.0.11 (and changed its name to Openads). Enhanced the validation for SSL virtual servers to check for the certificate files. Added a new section to the Spam and Virus Delivery page for configuring automatic clearing of mailbox users\u0026rsquo; spam and virus folders. Also added an option in the server templates for setting the default for new servers, and an input on the page for updating multiple servers. Added \u0026ndash;spamclear-days, \u0026ndash;spamclear-size and \u0026ndash;spamclear-none options to modify-spam.pl. When a mailbox or domain owner is deleted, all of his Cron jobs will be removed too. Similarly, the owner of any Cron jobs will be correctly updated when a useris renamed. Broke the Update Virtual Servers page down into more readable collapsed sections. Removed redundant creation buttons from main page, when using the framed theme. Added a link from the Edit Virtual Server page to show a server\u0026rsquo;s current password. Added the PHP Versions page (under Server Configuration on the left menu) for selecting the version of PHP to run for a virtual server. This can also be configured differently on a per-directory basis. Added the list-php-directories.pl, set-php-directory.pl and delete-php-directory.pl scripts for changing PHP version from the command line or remote API. Updated the Update Virtual Servers page to allow the default PHP version and PHP execution mode to be changed on multiple servers at once. Changed the script installer process to automatically use the correct PHP version required by the script, if available. Fixed the PHP Support script installer to automatically setup the database connection details for version 2.2. IMAP passwords for Usermin users are automatically updated when changed in Usermin. 3.34 Updated the MediaWiki script installer to version 1.9.2, and TWiki to version 4.1.1. When a mailbox user\u0026rsquo;s password is changed in other modules, it is also updated in Virtualmin\u0026rsquo;s plain-text password file. Added new pages for easily editing HTML in a virtual server\u0026rsquo;s website. 3.35 PHP and Pear modules needed by script installers are now automatically installed when needed, if supported by the underlying operating system\u0026rsquo;s update service (APT or YUM). Added support for enabling Ruby scripts in a virtual server. This can be done on the Website Options page, with the modify-web.pl script, on the mass domain update page, and set by default in server templates. Both execution via mod_ruby and CGI scripts are supported, assuming that the required software is installed. Updated the lookup-domain.pl script (which is called from Procmail) to communicate with a permanent server process, rather than performing all processing on its own. This will reduce the load when email to multiple recipients arrives at once. Updated the PHProjekt and MediaWiki script installers to setup the database configuration automatically. Changed pages with tabs and hidden sections to be usable by the mobile device theme. Improved detection of multiple scripts being accidentally installed into the same path. Updated DaDaBiK script installer to version 4.2, WordPress to 2.1.1, phpMyAdmin to 2.10.0, phpList to 2.11.3, and MediaWiki to version 1.9.3. Added a button to the Edit Extra Administrator page for switching to his Webmin login without needing to know the password. Added the \u0026ndash;primary-ip option to create-domain.pl, to create an SSL domain on the primary IP. Added the Shared IP Addresses page under System Configuration for defining additional shared addresses that can be selected when creating servers without a private IP. Also updated the server creation page to allow selection of one of these shared IPs, and the create-domain.pl program to use one with the \u0026ndash;shared-ip parameter. Added the New Reseller Email page, for setting up a message to be sent to new reseller accounts. Added the \u0026ndash;email parameter to create-reseller.pl and modify-reseller.pl scripts. Updated many script installers to support PHP 5. All autoreply email message files are now hard linked to from /var/virtualmin-autoreply, and this path is used in the autoresponders. This allows them to continue working even when a domain\u0026rsquo;s home directory is not world-readable. Fixed bug that broke renaming of virtual servers when using debian-style sites-enabled directory for the Apache config. Fixed bug that prevented autoresponders from being updated properly when renaming or moving virtual servers. Fixed the Nucleus script installer so that it actually works, and increased version to 3.24. Fixed the b2evolution script installer to correctly use it\u0026rsquo;s built-in scripts for setting up the config files and database. 3.36 Increased version of Gallery script installer to 2.2-rc-2, ZenPhoto to 1.0.8.2, WebCalendar to 1.0.5, Integramod to 1.4.1, and TWiki to 4.1.2. Change the Module Config option for the Upload and Download module to limit to uploads only. Replaced the HTMLarea widget for editing web pages with Xinha, when using Webmin 1.332 or later. Broke the Bandwidth Monitoring page down into collapsible sections. Added a new page for regularly updating a dynamic IP address, for systems where the primary IP is not static. Updated the \u0026lsquo;Show system information on main page?\u0026rsquo; Module Config option to allow display for resellers too. Autoreply message recipient tracking files are now stored in /var/virtualmin-autoreply, so that they can be accessed by the mail server when a virtual server\u0026rsquo;s home is not world-readable. Plugin modules can now have help links on the virtual server creation and editing pages. Added tabs to the Manage SSL Certificate page. Added the \u0026lsquo;User-configured mail forwarding\u0026rsquo; section to the Edit Mailbox page, to show forwarding setup by the user in their .procmailrc file (using the Mail Filters module in Usermin). Added the \u0026lsquo;Hide limits from server owners\u0026rsquo; option to the reseller page, which prevents his customers from seeing the reseller\u0026rsquo;s limits (although they are still enforced). Also updated the create-reseller.pl and modify-reseller.pl programs to all \u0026ndash;hide options. Added caching to make lookups of domains by parent and user faster. Added tabs and more help text to the Script Installers page. Added several new initial website content styles, such as Refresh, Dreamy, Rounded and Integral. All of these create multiple pages which can then be easily edited with the Edit Web Pages feature. Added a button to the Edit Web Pages page to replace existing content with that generated from a style. Also added the \u0026ndash;style option to modify-web.pl. 3.37 Removed old versions from the PHPmyAdmin script installer. Updated the Drupal script installer to support version 5.1, phpPgAdmin to 4.1.1, and all the Horde scripts to their latest versions. Don\u0026rsquo;t allow extra admins to switch to the domain owner. Added a page for installing third-party content styles, which can then be used for new websites exactly like the built-in styles. When configuring email notification for new mailboxes, resellers and domains, you can now enter a Bcc address as well as a Cc address. Split the Edit Virtual Server page into more sections. Improved the IntegraMod and dotProject script installers to configure the database connection automatically. Moved options for sending email to new and updated mailboxes from the Module Config page to the form for editing the actual messages. Added the list-simple-aliases.pl and create-simple-alias.pl programs for easy alias management from the command line. Fixed bugs related to renaming autoresponder files when renaming a domain. Added the Less Antique content style. Added preview images for content styles, visible via the Preview.. link next to the style menu. Domain owners who cannot login via SSH are automatically added to the deniedssh group, which the SSH server is configured to deny even before checking their shell. The spam and virus filtering features are now enabled by default for new virtual servers. ","permalink":"https://www.virtualmin.com/changelog/virtualmin-3.37-1.81-release-notes/","summary":"\u003cul\u003e\n\u003cli\u003e\n\u003ch4 id=\"181\"\u003e1.81\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eA Sendmail genericstable or Postfix canonical mapping file can be automatically updated with login name to email address mappings. This is useful for programs like Usermin, which can read such a file to work out From: addresses.\u003c/li\u003e\n\u003cli\u003eThe directory for Webalizer statistics can be set on the Apache Website Template page.\u003c/li\u003e\n\u003cli\u003eDomain owners can be granted access to the Read User Mail module, for reading mailboxe\u0026rsquo;s mail.\u003c/li\u003e\n\u003cli\u003eThe port to use for normal and SSL virtual websites can now be set on the Apache Website Template page.\u003c/li\u003e\n\u003cli\u003eVirtual servers can now be backed up to one or many tar.gz files, either locally or on a remote FTP server.\u003c/li\u003e\n\u003cli\u003eBackups can also be restored from these tar.gz files, again locally or from an FTP server.\u003c/li\u003e\n\u003cli\u003eThe MySQL feature now properly supports usernames longer that 16 characters.\u003c/li\u003e\n\u003cli\u003eA new configuration option has been added for sites that use multiple IP addresses, but always use name-based Apache virtual hosts.\u003c/li\u003e\n\u003cli\u003eUsername length and other restrictions are now checked by the create-domain.pl script.\u003c/li\u003e\n\u003cli\u003eVirtualmin now participates in Webmin action logging, so you can see what actions were taken and which files they changed.\u003c/li\u003e\n\u003cli\u003eIP address clash checking for new servers now actually works.\u003c/li\u003e\n\u003cli\u003eWebalizer configuration files and schedule can now be included in backups.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"191\"\u003e1.91\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eCatchall mail aliases can now forward mail for any mailbox at their domain to the same mailbox at another domain.\u003c/li\u003e\n\u003cli\u003eAdded module configuration options to prevent domain owners from being given access to feature-related modules like Apache Webserver, BIND DNS Server and so on.\u003c/li\u003e\n\u003cli\u003eAdded checks to prevent an alias or mailbox being created which clashes with an existing Sendmail or Postfix alias.\u003c/li\u003e\n\u003cli\u003eAdded a Module Config option to set the subdirectory used for mailbox user home directories, instead of always using ~/homes.\u003c/li\u003e\n\u003cli\u003eAdded Module Config option to specify an different IP address to use in the DNS domain, versus the one used for the webserver.\u003c/li\u003e\n\u003cli\u003eAdded the ability to backup and restore to via SSH, as well as FTP.\u003c/li\u003e\n\u003cli\u003eAdded a new feature for Virtualmin domains - virtual FTP hosting with ProFTPd. Like Apache virtual hosts, these will be created when the feature is enabled for domain, using directives taken from an editable template. Due to limitations in the FTP protocol, a domain can only have a virtual FTP server if it has its own private IP.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"200\"\u003e2.00\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded an option to the BIND DNS Template page for selecting a view to add new zones to.\u003c/li\u003e\n\u003cli\u003eAdded automatic IP address allocation for virtual servers, out of ranges defined on the Module Config page.\u003c/li\u003e\n\u003cli\u003eA Virtualmin server owner can now create and own multiple domains, if allowed by the master administrator. All such servers are owned by the same Unix user and share the same quota, and any sub-servers are stored in the domains subdirectory of the parent server\u0026rsquo;s home directory. Each server can have its own independent set of features. When a limit on the number of mailboxes has been set, it will apply to the master server and all sub-servers.\u003c/li\u003e\n\u003cli\u003eAdded an option to the Apache Website Template page for entering an Apache user to be added to the group for all new servers. This can be useful for getting suexec to work.\u003c/li\u003e\n\u003cli\u003eAdded Module Config options to have features disabled by default for new servers.\u003c/li\u003e\n\u003cli\u003eAdded Manage SSL Certificate page for creating a CSR and installing a signed SSL certificate using simple forms.\u003c/li\u003e\n\u003cli\u003eAdded Change Domain Name page for modifying the name of an existing virtual server. This can also update the server\u0026rsquo;s Unix login and home directory at the same time, if needed. All sub-servers of the modified server are also updated, where appropriate.\u003c/li\u003e\n\u003cli\u003eWhen restoring a virtual server, if it no longer exists it will be automatically re-created with all the original features before the restore is done.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"210\"\u003e2.10\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAliases for an existing virtual server can now be created. An alias is a server that simply forwards all web, mail and DNS requests to another server. Alias websites can be created as a virtual server that simply redirects requests or by adding additional ServerAlias directives to the target website.\u003c/li\u003e\n\u003cli\u003eAdded a new Bandwidth Monitoring page for setting up regular checking of virtual server web bandwidth usage, and inputs on the server creation and editing forms to specify the amount of bandwidth each can use. When the limit is exceeded, a configurable email is sent to the domain owner and other optional addresses. The monitoring page also displays usage and limits by all servers as a bar graph.\u003c/li\u003e\n\u003cli\u003eAdded a new feature - the ability to setup Logrotate to automatically truncate and compress a virtual server\u0026rsquo;s log files, so that they don\u0026rsquo;t consume too much disk space.\u003c/li\u003e\n\u003cli\u003eThe subject lines for emails sent when a new virtual server, sub-server and mailbox are created can now be edited, and can include template variables.\u003c/li\u003e\n\u003cli\u003eEmail messages send when a virtual server or mailbox is created can now be also Cc\u0026rsquo;d to additional configurable addresses.\u003c/li\u003e\n\u003cli\u003eAdded the ability to use new functions in the BIND module to speed up the process of creating slave zones on a remote DNS server.\u003c/li\u003e\n\u003cli\u003eAdded a new format for mailbox usernames - mailbox@domain, the same as the email address. This only works when using Sendmail as the mail server though.\u003c/li\u003e\n\u003cli\u003eThe Qmail mail server is now fully supported, with all the same capabilities as Postfix and Sendmail. Only a stock install of Qmail is required by Virtualmin - vpopmail or other similar patches are not needed.\u003c/li\u003e\n\u003cli\u003eWhen a mailbox is created, its empty mail file or directory is automatically created, in a location determined by the configuration of the mail server in use.\u003c/li\u003e\n\u003cli\u003eA virtual server can now be created without a Unix user, as long as it only has a DNS domain or MySQL or PostgreSQL databases. For other features, the Unix user is required.\u003c/li\u003e\n\u003cli\u003eAdded an additional way to proxy a virtual server to another URL - frame forwarding.\u003c/li\u003e\n\u003cli\u003eAdded the ability to easily edit the forwarding destination for proxy-only or frame forwarding websites, along with the forwarding frame page title or HTML.\u003c/li\u003e\n\u003cli\u003eMoved all template-related settings into the \u0026lsquo;Server Templates\u0026rsquo; section, including directives for Apache websites, FTP virtual servers and DNS domains. Multiple templates can now be defined, and a template can be selected when creating a virtual server.\u003c/li\u003e\n\u003cli\u003eThe home directory for a virtual server can now be enabled separate from its Unix user.\u003c/li\u003e\n\u003cli\u003eOn systems like FreeBSD in which the username length is limited, the prefix for mailbox usernames is now selectable when creating a server.\u003c/li\u003e\n\u003cli\u003eAdded an option to automatically disable a server when it reaches its bandwidth limit.\u003c/li\u003e\n\u003cli\u003eAdded an option to send an email message when a server is approaching (within some percentage) its bandwidth limit.\u003c/li\u003e\n\u003cli\u003eAdded support for third-party plugin feature modules.\u003c/li\u003e\n\u003cli\u003eAdded support for mailbox user plugins, which can add additional inputs and capabilities to a mail user.\u003c/li\u003e\n\u003cli\u003eAdded a restore.pl script to restore domains and features from the command line.\u003c/li\u003e\n\u003cli\u003eFixed a bug when attempting to rename a PostgreSQL user on older versions that don\u0026rsquo;t allow it.\u003c/li\u003e\n\u003cli\u003eAdded a Module Config option for a jailed FTP shell.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"230\"\u003e2.30\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eFixed several bugs related to creating and restoring backups.\u003c/li\u003e\n\u003cli\u003eMoved bandwidth graphs to separate page, and added mode to show sub-domain usage.\u003c/li\u003e\n\u003cli\u003eAdded the command-line backup-domain.pl script.\u003c/li\u003e\n\u003cli\u003eAdded button to domain editing page for viewing latest Webalizer report.\u003c/li\u003e\n\u003cli\u003eImplemented support for using LDAP to store domain and mailbox users and groups, by calling functions in Webmin\u0026rsquo;s LDAP user management module. Requires that the system be set up to use LDAP for NSS and PAM.\u003c/li\u003e\n\u003cli\u003eClash checking is now done when enabling new features for an existing server.\u003c/li\u003e\n\u003cli\u003eWhen creating a server, if a feature fails for some reason the rest will still be processed. This avoids the problem of a server being partially created and unknown to Virtualmin.\u003c/li\u003e\n\u003cli\u003eSimilarly, when deleting a server any failure will be ignored, to avoid the problem of features being left around when the server has been removed from Virtualmin.\u003c/li\u003e\n\u003cli\u003eA database name can be specified when creating a server, rather than the default which is computed from the domain name.\u003c/li\u003e\n\u003cli\u003eAdded form on plugins page for editing the configuration of plugins that have a config.info file.\u003c/li\u003e\n\u003cli\u003eAdded the enable-feature.pl and disable-feature.pl script, for activating and turning off features for a virtual server from the command line.\u003c/li\u003e\n\u003cli\u003eAdded the enable-limit.pl and disable-limit.pl scripts, for updating server owner limits from the command line.\u003c/li\u003e\n\u003cli\u003eCreated the Custom Fields page, for defining your own fields that can be edited for each virtual server.\u003c/li\u003e\n\u003cli\u003eAdded a button to the Edit Server page for displaying just the usage for that server. This is available to server owners as well as the master administrator.\u003c/li\u003e\n\u003cli\u003eAdded a new limit for domain owners to prevent them from choosing the name for new domain databases.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"240\"\u003e2.40\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eFixed bug related to multiple IF- blocks for the same variable in templates.\u003c/li\u003e\n\u003cli\u003eAdded support for Qmail+LDAP as a new mail system. If selected, all mail users and aliases will be stored in LDAP automatically. Thanks to Omar Amas for sponsoring this feature.\u003c/li\u003e\n\u003cli\u003eAdded extra domain owner limits to force sub-domains to be under parent domains, and to prevent renaming.\u003c/li\u003e\n\u003cli\u003eAdded support for Qmail+VPOPMail as a new mail system. When enabled, all mailboxes and aliases are created in VPOPMail instead of using Unix users. Thanks to Linulex for sponsoring this one.\u003c/li\u003e\n\u003cli\u003eWhen editing the forwarding destinations for email to a user, the user\u0026rsquo;s mailbox can be explicitly selected as a destination.\u003c/li\u003e\n\u003cli\u003eOn the server template page, default aliases for new users in domains using that template can be specified.\u003c/li\u003e\n\u003cli\u003eAdded an option to exclude the logs directory from backups.\u003c/li\u003e\n\u003cli\u003eThe default MySQL database name, wildcard and allowed hosts can now be set on the server templates page.\u003c/li\u003e\n\u003cli\u003eA virtual server can now have more than one MySQL or PostgreSQL database, which can be managed using the Edit Databases button on the Edit Server page. Thanks to Olimont for sponsoring this feature, and the backup changes.\u003c/li\u003e\n\u003cli\u003eThe create-domain.pl script can now create sub-servers and alias servers too.\u003c/li\u003e\n\u003cli\u003eAdded a Module Config option to have domain and mailbox users created in other modules.\u003c/li\u003e\n\u003cli\u003eAdded options on the restore page to fix up the DNS and Apache IP addresses when restoring. Useful when transferring a domain from another server.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"250\"\u003e2.50\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eWhen using VPOPMail as the mail server and a domain uses an existing Unix group, no extra group for mailboxes is created.\u003c/li\u003e\n\u003cli\u003eDefault quotas and other limits for a new domain can now be specified in templates, instead of globally.\u003c/li\u003e\n\u003cli\u003eAdded support for the VPOPMail autoresponder program.\u003c/li\u003e\n\u003cli\u003eFTP server logs can now be used for bandwidth accounting as well, so that anonymous downloads and files downloaded by domain owners count towards bandwidth usage totals. Thanks to Olimont.com for sponsoring this feature, and the mail log support.\u003c/li\u003e\n\u003cli\u003eMail server logs (in Sendmail, Postfix or Qmail formats) can now be checked to include mail sent to mailboxes and aliases in a domain in bandwidth totals.\u003c/li\u003e\n\u003cli\u003eUsage graphs now show bandwidth used by each feature in a different colour, and can show usage by day or month as well as by domain.\u003c/li\u003e\n\u003cli\u003eCreation of an initial MySQL or PostgreSQL database for a server is now optional. Instead, you can choose to just have a login created instead.\u003c/li\u003e\n\u003cli\u003eAdd file writes now use the new Webmin API to prevent truncation if a disk space shortage or other error occurs.\u003c/li\u003e\n\u003cli\u003eAdded an option to the domain creation form to generate a password randomly.\u003c/li\u003e\n\u003cli\u003eDomain names and usernames can now start with a number.\u003c/li\u003e\n\u003cli\u003eThe permissions on the public_html directory can now be edited on the server template page.\u003c/li\u003e\n\u003cli\u003eAdded an option on the template page for doing web logging via a program, which silently ignores problems writing to the logs. This prevents Apache from failing to re-start if a user deletes his ~/logs directory.\u003c/li\u003e\n\u003cli\u003eThe Webalizer statistics directory can now be password protected, via an option on the Server Templates page.\u003c/li\u003e\n\u003cli\u003eAdded an option to the Bandwidth Monitoring page to disable it for selected servers, such as those that have extremely large logs.\u003c/li\u003e\n\u003cli\u003eWhen Webmin 1.201 or later is installed, there is an additional option on the Server Templates page to have Webmin and Usermin per-IP SSL certificates added to match those used for the Apache SSL virtual server.\u003c/li\u003e\n\u003cli\u003eMade available an option on the template page for turning off the automatic synchronization between a server\u0026rsquo;s password and that of its MySQL login.\u003c/li\u003e\n\u003cli\u003eAdded an option on the template page for defining default mail aliases for new servers.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"260\"\u003e2.60\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded a button to the Edit Server page for re-sending the signup email.\u003c/li\u003e\n\u003cli\u003eCreated a page for updating the IP addresses for all non-private virtual servers at once, for use when a system\u0026rsquo;s primary IP address changes.\u003c/li\u003e\n\u003cli\u003eThe IP address for a private virtual server can now be changed using the Change IP Address button on the Edit Server page.\u003c/li\u003e\n\u003cli\u003eSlave zones can now be added to multiple servers, when using Webmin version 1.203 or later.\u003c/li\u003e\n\u003cli\u003eWhen a server\u0026rsquo;s home directory is renamed, any protected web directories within it will be properly updated too.\u003c/li\u003e\n\u003cli\u003eAdded command-line programs called enable-writelogs.pl and disable-writelogs.pl to turning on or off logging via a program for existing domains, or all domains.\u003c/li\u003e\n\u003cli\u003eQuotas and bandwidth limits on the templates page now have proper units like kB or MB, rather than being in bytes.\u003c/li\u003e\n\u003cli\u003eAdded support for resellers, which are users who can create top-level virtual servers up to limits imposed by the master administrator. Each reseller can be limited in the number of servers, mailboxes and databases he can own, and the total quota he can assign to all owned servers.\u003c/li\u003e\n\u003cli\u003eAdded support for third-party script installation, such as PHP-Nuke, Formmail and other common web tools. These can be installed and managed using the Install Scripts button on the Edit Server page.\u003c/li\u003e\n\u003cli\u003eCreated a new feature - per-domain Spam filtering using SpamAssassin and Procmail. Each server can have its own SpamAssassin settings and spam delivery action.\u003c/li\u003e\n\u003cli\u003eAdded a similar feature for per-domain Virus filtering using ClamAV.\u003c/li\u003e\n\u003cli\u003eAdded an icon on the main page and a button on the Edit Server page for emailing all server owners and all mailboxes in a domain respectively.\u003c/li\u003e\n\u003cli\u003eRanges for automatic IP allocation can now be defined in a more user-friendly way on the Server Templates page.\u003c/li\u003e\n\u003cli\u003eAdded built-in support for granting mail/FTP users access to MySQL databases.\u003c/li\u003e\n\u003cli\u003eTemplates can now be restricted to some, all or no resellers.\u003c/li\u003e\n\u003cli\u003eAll quota fields now have an option for selecting the units, rather than always being entered in kB.\u003c/li\u003e\n\u003cli\u003eAdded a new option on the Edit Owner Limits page, to put a server into demo mode. In this mode, the owner cannot make changes to any settings, only view them.\u003c/li\u003e\n\u003cli\u003eOn the Server Template page, added an option to create an SPF DNS record in new domains.\u003c/li\u003e\n\u003cli\u003eVirtual servers without mail enabled can now create and manage users, for database and FTP access purposes.\u003c/li\u003e\n\u003cli\u003eServer owners can backup their own virtual servers, but only to a remote FTP or SSH server.\u003c/li\u003e\n\u003cli\u003eAdded a new feature - status monitoring for a virtual server\u0026rsquo;s website, which will notify the server owner if it is down.\u003c/li\u003e\n\u003cli\u003eThird-party script installers can now be added using the Script Installers icon on the module\u0026rsquo;s main page.\u003c/li\u003e\n\u003cli\u003eAdded command-line programs for deleting virtual servers and users, and disabling and enabling servers.\u003c/li\u003e\n\u003cli\u003eAdded the modify-domain.pl command-line program, for changing various attributes of a virtual server.\u003c/li\u003e\n\u003cli\u003eAdded a system information display to the main page, showing the versions of the various programs that Virtualmin uses.\u003c/li\u003e\n\u003cli\u003eA virtual server with a private IP address can now have it removed on the Edit Server page (assuming that it doesn\u0026rsquo;t have an SSL website or virtual FTP server).\u003c/li\u003e\n\u003cli\u003eAdded help pages for the template, reseller, IP allocation, plugin and custom fields pages.\u003c/li\u003e\n\u003cli\u003eAdded command-line programs for listing, creating and deleting mail aliases.\u003c/li\u003e\n\u003cli\u003eAdded command-line programs for listing and modifying users.\u003c/li\u003e\n\u003cli\u003eDatabase names can now be restricted to start with the server\u0026rsquo;s domain name, using a new option on the server template page.\u003c/li\u003e\n\u003cli\u003eAdded command-line programs for listing, creating and deleting databases.\u003c/li\u003e\n\u003cli\u003eAdded command-line programs for listing, creating and deleting resellers.\u003c/li\u003e\n\u003cli\u003eCreated a method for executing Virtualmin command-line programs via HTTP requests, by calling virtual-server/remote.cgi\u003c/li\u003e\n\u003cli\u003eAdded the modify-limits.pl command-line program, for setting a server owner\u0026rsquo;s limits.\u003c/li\u003e\n\u003cli\u003eAdded command-line programs for listing and setting custom fields.\u003c/li\u003e\n\u003cli\u003eAdded the migrate-domain.pl command-line program for importing a backup from another control panel, such as Plesk.\u003c/li\u003e\n\u003cli\u003eAdded a Module Config option to add an /etc/procmailrc entry to force delivery to the default destination, to prevent mailbox users from running commands via .procmailrc files.\u003c/li\u003e\n\u003cli\u003eOn Sendmail systems, you can specify the bounce message for aliases whose destination is set to Bounce mail.\u003c/li\u003e\n\u003cli\u003eThe Change IP Address page can now also be used to set a different port for a server\u0026rsquo;s normal and SSL websites. This can be useful for running an SSL server on a non-standard port, without needing a private IP.\u003c/li\u003e\n\u003cli\u003eThe template for an existing virtual server can now be changed. However, this does not immediately effect any of its settings.\u003c/li\u003e\n\u003cli\u003eSpace used by databases is now included in the disk quota displays, although it is not actually enforced.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"280\"\u003e2.80\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eProxying and frame forwarding can be enabled, disabled and configured more easily for existing web virtual servers using the Edit Proxy Website and Edit Forwarding Frame buttons on the Edit Server page.\u003c/li\u003e\n\u003cli\u003eThe import feature now supports SSL Apache virtual servers too.\u003c/li\u003e\n\u003cli\u003eAdded the Disk Quota Monitoring page, for setting up automatic email notification on servers that are approaching or have reached their disk quota.\u003c/li\u003e\n\u003cli\u003eAdded buttons to the user and alias lists for deleting several of each at once.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"283\"\u003e2.83\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded script installers for Horde, IMP, Kronolith and Gollem.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"284\"\u003e2.84\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded an option on the Server Templates page for setting secondary groups that users with email, ftp and database access will be granted to. This can be useful for controlling their visible modules in Usermin.\u003c/li\u003e\n\u003cli\u003eVirtual server mail/FTP/database users can also be assigned to arbitrary secondary groups, defined on the Server Templates page.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"285\"\u003e2.85\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eNetwork interfaces are now identified by address rather than name, to avoid problems with interface numbers changing on operating systems like Gentoo and FreeBSD.\u003c/li\u003e\n\u003cli\u003eAdded a new backup format that doesn\u0026rsquo;t create files in /tmp when not needed, instead using only each server\u0026rsquo;s home directory.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"287\"\u003e2.87\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded help on the Backup Virtual Servers page.\u003c/li\u003e\n\u003cli\u003eFixed some messages and small bugs reported by users.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"288\"\u003e2.88\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eFixed bug in new backup format that prevents PostgreSQL dumps from working.\u003c/li\u003e\n\u003cli\u003eThe default mail user quota is now settable on a per-template basis.\u003c/li\u003e\n\u003cli\u003eAdded a button on the user list page for updating quotas and email in multiple users at once.\u003c/li\u003e\n\u003cli\u003eMoved the option for hard or soft quotas to the server templates page, so that different types of quotas can be used for different domains.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"289\"\u003e2.89\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eWhen importing a virtual server, a parent server can be specified to control the new domain in Virtualmin.\u003c/li\u003e\n\u003cli\u003eAdded a button below the user list, which brings up a page for defining defaults for new users in that virtual server. This can be used to define initial quotas, FTP access, databases and mail forwarding.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"290\"\u003e2.90\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eWhen disabling a virtual server, the accounts for any mail users are locked too.\u003c/li\u003e\n\u003cli\u003eThe \u0026lsquo;Home directory\u0026rsquo; and \u0026lsquo;Unix users\u0026rsquo; are now always enabled, unless you select to make them optional on the Module Config page. These are needed for almost all virtual servers, so it makes little sense to show the option.\u003c/li\u003e\n\u003cli\u003eAdded a button for re-checking the license immediately if a problem was detected during a regularly scheduled check.\u003c/li\u003e\n\u003cli\u003eMail users can have their logins temporarily enabled or disabled, using the web or command-line interfaces.\u003c/li\u003e\n\u003cli\u003eLimits can now be placed on the number of aliases a virtual server can have, at the server owner and reseller levels. In addition, plugins can specify that certain aliases should not count towards this limit (or be displayed to the user).\u003c/li\u003e\n\u003cli\u003eThe method by which the domain name is appended or prepended to a mail user\u0026rsquo;s name can now be set on a per-template basis.\u003c/li\u003e\n\u003cli\u003ePlugins can now define their own limits to be configured on the Edit Owner Limits form, such as a restriction on the number of mailing lists a server can have.\u003c/li\u003e\n\u003cli\u003eAdded support for plugins that define new database types.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"292\"\u003e2.92\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded an option to email a mailbox user with his new account details upon saving, and a template page for editing the message sent.\u003c/li\u003e\n\u003cli\u003eAdded a form to the Script Installers page for upgrading some script on several virtual servers at once.\u003c/li\u003e\n\u003cli\u003eExtra Webmin modules can be specified for server owners on the Edit Owner Limits page.\u003c/li\u003e\n\u003cli\u003eVirtual server functions that a server own can access (like databases, scripts, users and aliases) can now be individually controlled on the Edit Owner Limits page, rather than being automatically determined based on his ability to create servers.\u003c/li\u003e\n\u003cli\u003eResellers can now have their own IP allocation ranges defined, which will apply to all virtual servers that they create or manage.\u003c/li\u003e\n\u003cli\u003eAdded a template option to have an alias server under another domain when a server is created. This can be useful when a new domain has not yet been registered, to allow it to be accessed under the provider\u0026rsquo;s domain.\u003c/li\u003e\n\u003cli\u003eWhen restoring a single virtual server, you can select to restore just one mail/FTP user instead of all of them. You can also choose to just re-import a server whose /etc/webmin/virtual-server/domains file is missing.\u003c/li\u003e\n\u003cli\u003eAdded a new type of mail/FTP user who can manage the virtual server\u0026rsquo;s website files. This user has the same permissions as the server owner, but is restricted to it\u0026rsquo;s web files directory.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"294\"\u003e2.94\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eFeature selection when adding or editing a virtual server is now done using checkboxes rather than Yes/No radio buttons.\u003c/li\u003e\n\u003cli\u003eAdded a section to the Server Template page for specifiying the logrotate directives for a new server, rather than always using Virtualmin\u0026rsquo;s automatically generated directives.\u003c/li\u003e\n\u003cli\u003eServer owners can be prevented from editing the schedule and directory for their Webalizer reports, using a new option on the Server Template page.\u003c/li\u003e\n\u003cli\u003eAdded a button for creating a sub-domain, which is like a sub-server but is always under the parent domain, and uses a sub-directory of its web files directory as the document root.\u003c/li\u003e\n\u003cli\u003eBy default, settings that used to be on the Create Server page with are set in the template (such as the quota, bandwidth limit and mailbox/alias/database limits) are no longer displayed. Instead, the settings from the selected template are used. The old behaviour can be restored using a setting on the Module Config page.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"296\"\u003e2.96\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eThe message displayed on the website of a disabled virtual server is now configurable on the server template page, rather than being fixed.\u003c/li\u003e\n\u003cli\u003eA new server template option allows disabled websites to redirect the browser to a different URL, rather than service a local HTML page.\u003c/li\u003e\n\u003cli\u003eWhen backing up virtual servers, you can also include core Virtualmin configuration settings, such as templates, resellers, the module configuration and so on. The restore page also has options to extract these from a backup. This new feature allows all data relevant to Virtualmin to be backed up from a single place.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"297\"\u003e2.97\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded buttons to the list of virtual servers for deleting several at once, and updating settings such as the quota, bandwidth limit and enabled features on several at once. The same form can be also used to disable or enable multiple virtual servers.\u003c/li\u003e\n\u003cli\u003eExtra PHP variables to be added to a server\u0026rsquo;s Apache config when a third-party script is installed can be set on the Server Templates page.\u003c/li\u003e\n\u003cli\u003eAdded a new configuration page available to the master administrator for specifying Webmin servers with Virtualmin installed to be used as secondary MX\u0026rsquo;s. Once this is done, any new mail domains will be relayable through those servers.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"298\"\u003e2.98\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eThe FTP server can be stopped and started, like the mail, DNS and web servers.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"299\"\u003e2.99\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eMultiple databases can be deleted at once from a virtual server.\u003c/li\u003e\n\u003cli\u003eUpdated the modify-limits.pl command line program to allow setting of editing limits and maximum aliases.\u003c/li\u003e\n\u003cli\u003eWhen adding or removing Sendmail domains to accept email for, comments in the local domains file in /etc/mail are now preserved.\u003c/li\u003e\n\u003cli\u003ePlugins can now define additional inputs to display on the Server Template page, such as defaults for limits on the number of mailing lists, repositories and so on.\u003c/li\u003e\n\u003cli\u003eExtra administration logins can be created for virtual servers, who have a subset of the permissions granted to the main administrator. This allows server owners to delegate some of their powers to other people, without giving out the main password for the virtual server.\u003c/li\u003e\n\u003cli\u003eLimits can be set at the server owner and reseller levels on the number of alias and non-alias servers, which are imposed in addition to the overall limit on servers. This allows users to be given separate higher limits on alias servers.\u003c/li\u003e\n\u003cli\u003eAdded command-line programs to list and manage extra administrators.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"300\"\u003e3.00\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eWhen renaming a domain that has users in user@domain format, the users will be renamed too.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"301\"\u003e3.01\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eServer owner limits can be updated for multiple users at once on the Update Virtual Servers page.\u003c/li\u003e\n\u003cli\u003eThe email addreses to send status monitoring messages to can be set on the Server Templates page.\u003c/li\u003e\n\u003cli\u003eWhen restoring a backup, the home directory of any virtual servers created is re-allocated to use the directory and rules defined on the destination system.\u003c/li\u003e\n\u003cli\u003eIf the Apache module has been configured to create a symlink for a new virtual host\u0026rsquo;s file in a separate directory (sites-enabled on Debian), Virtualmin will too.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"302\"\u003e3.02\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded a script installed for CivicSpace.\u003c/li\u003e\n\u003cli\u003eMail users in the user@domain format are now supported when using Postfix, by creating extra Unix users without the @ for mail delivery.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"303\"\u003e3.03\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded script installers for FormMail and cgiemail.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"304\"\u003e3.04\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded Restart buttons when using the new Virtualmin theme.\u003c/li\u003e\n\u003cli\u003eLong domain names are now shortened when displayed in lists and menus, to a length settable on the Module Config page.\u003c/li\u003e\n\u003cli\u003ePlain text passwords are stored for all new and modified mailbox/FTP users, which allows MySQL, DAV and SVN access to be enabled for users without their passwords needing to be reset.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"305\"\u003e3.05\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded PHP module checking to the Horde script installer, and updated it and other dependent scripts to the latest versions.\u003c/li\u003e\n\u003cli\u003eAdded script installers for MediaWiki and TWiki.\u003c/li\u003e\n\u003cli\u003eWebmin users created by Virtualmin are marked as non-editable, and so cannot be manually modified in the Webmin Users module.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"306\"\u003e3.06\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded script installers for the Turba, Ingo, Nag and Mnemo Horde components.\u003c/li\u003e\n\u003cli\u003eAdded a script installer for DokuWiki.\u003c/li\u003e\n\u003cli\u003eFixed a bug that prevented additional database access for mail users from being properly restored.\u003c/li\u003e\n\u003cli\u003eThe displayed mailbox size for users with Maildir format inboxes includes all sub-folders and other files within the directory.\u003c/li\u003e\n\u003cli\u003eThe size of mailboxes is calculated from the number of blocks used rather than the byte file sizes, which is more accurate as it reflects the true quota usage.\u003c/li\u003e\n\u003cli\u003eAdded a script installer for Moodle (thanks to Kevin Rauth).\u003c/li\u003e\n\u003cli\u003eAdded a script installer for phpAdsNew.\u003c/li\u003e\n\u003cli\u003eAdded command-line programs for listing, installing and removing third-party scripts.\u003c/li\u003e\n\u003cli\u003eAdded online help for the Server Owner Limits page.\u003c/li\u003e\n\u003cli\u003eAdded a work-around for the problem of mail being delivered with ownership root by the procmail wrapper.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"307\"\u003e3.07\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eThe CGI directory for sub-domains is now set to be a sub-directory of the parents cgi-bin, and the log files are set to be the same as the parent server\u0026rsquo;s.\u003c/li\u003e\n\u003cli\u003eWebmin ACL files for Virtual server owners and extra admins can now be included in backups.\u003c/li\u003e\n\u003cli\u003eAdded a server template option to force extra administrator usernames to begin with some prefix, such as the virtual server\u0026rsquo;s username.\u003c/li\u003e\n\u003cli\u003ePlugin modules data can now be included in Virtualmin backups, such as Mailman mailing lists, AWstats config files and SVN repositories.\u003c/li\u003e\n\u003cli\u003eAdded script installers for Mambo and Joomla, thanks to Kevin Rauth.\u003c/li\u003e\n\u003cli\u003eBandwidth stats are now included in backups.\u003c/li\u003e\n\u003cli\u003eFixed a bug that prevented mailbox user quotas from being backed up.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"308\"\u003e3.08\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded a script installer for phpWebSite.\u003c/li\u003e\n\u003cli\u003eAdded a button to the Edit Server page for moving sub-servers to a different owner.\u003c/li\u003e\n\u003cli\u003eWhen a process (such as a domain setup) requires Apache to be restarted, it will not be re-configured as well.\u003c/li\u003e\n\u003cli\u003eAdded script installer for osCommerce.\u003c/li\u003e\n\u003cli\u003eUpdated the function for moving virtual servers to allow a parent server to be converted to a sub-server, and create a command-line script for moving servers.\u003c/li\u003e\n\u003cli\u003eAdded a new page available to the master administator for validating virtual servers, by checking that all enabled features are actually properly configured.\u003c/li\u003e\n\u003cli\u003eAdded a button the server template pages for viewing scripts associated with a template, for installation when a server is created. This allows common third-party scripts to be automatically setup for new servers.\u003c/li\u003e\n\u003cli\u003eUpdated the installer to have Webmin pre-load several Virtualmin and Webmin libraries, speeding up the user interface.\u003c/li\u003e\n\u003cli\u003eAdded a link to the left-side frame for viewing a domain\u0026rsquo;s website, using a HTTP request tunnelled through Webmin. This is useful if the domain name has not been fully registered in the DNS yet.\u003c/li\u003e\n\u003cli\u003eThe Command Shell module is now available to server owners - but can be disabled on the Module Config page.\u003c/li\u003e\n\u003cli\u003eRemoved the Logrotate and Webalizer features for sub-domains, which share log files with the parent domain.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"309\"\u003e3.09\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eProxying to SSL websites now works when using Apache 2 or later.\u003c/li\u003e\n\u003cli\u003eWhen moving a sub-server, you now have the option to convert it to a top-level server with a new username and password.\u003c/li\u003e\n\u003cli\u003eWhen email is enabled or disabled for an existing virtual server, MX records are added to or removed from the DNS domain.\u003c/li\u003e\n\u003cli\u003eVirtual server owners are no longer allowed to change the Apache server name or aliases for their websites, as this can confuse Virtualmin.\u003c/li\u003e\n\u003cli\u003eChanged the way ClamAV is called from Procmail so that it doesn\u0026rsquo;t reject mail when some error occurs, such as a shortage of disk space for scanning.\u003c/li\u003e\n\u003cli\u003eAdded checks for ownership to directory validation.\u003c/li\u003e\n\u003cli\u003eAdded script installer for IntegraMOD.\u003c/li\u003e\n\u003cli\u003eWhen moving a server, if a vital feature fails (like the home directory or Unix user), the entire process is halted.\u003c/li\u003e\n\u003cli\u003eAdded the command-line script validate-domains.pl, for checking the configuration of virtual server features.\u003c/li\u003e\n\u003cli\u003eAdded a Module Config option to validate the Apache configuration before applying it, to prevent config errors from halting the web server.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"310\"\u003e3.10\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eFixed a bug that caused an error message about postfix_installed to be displayed at install time.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"311\"\u003e3.11\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded a new Spam and Virus Delivery page for modifying the destinations for messages classified as spam or containing viruses, after a virtual server has been created.\u003c/li\u003e\n\u003cli\u003eAdded the modify-spam.pl program for changing the spam and virus delivery actions from the command line, and updated the list-domains.pl program to show the current delivery settings.\u003c/li\u003e\n\u003cli\u003eThe Running Processes extra modules config option now allows you to choose if a domain admin can see other users\u0026rsquo; processes.\u003c/li\u003e\n\u003cli\u003eA custom prefix can be specified when importing or migrating a virtual server.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"312\"\u003e3.12\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded support for finding the mail log from syslog-ng, if using Webmin 1.270.\u003c/li\u003e\n\u003cli\u003eResellers and server owners without editing access can now change their passwords through the Virtualmin interface.\u003c/li\u003e\n\u003cli\u003eWhen making a backup to a remote server, the connection is tested before the backup is actually started.\u003c/li\u003e\n\u003cli\u003eAll script installers that use a database will now be configured to connect to the correct remote database server, if one has been setup in the MySQL or PostgreSQL modules.\u003c/li\u003e\n\u003cli\u003eIf a mailbox user\u0026rsquo;s password is changed by the passwd command or some other program, Virtualmin will detect this and realize that the plain-text password stored for the user is no longer valid.\u003c/li\u003e\n\u003cli\u003eFixed a bug that prevented SuExec directives from being added to sub-server Apache configurations.\u003c/li\u003e\n\u003cli\u003eWhen deleting a virtual server, its webalizer config files are removed too.\u003c/li\u003e\n\u003cli\u003eAdded an option when creating a virtual server with a private IP address to enter an IP that is already active on the system.\u003c/li\u003e\n\u003cli\u003eMySQL database names containing the _ or % characters are now properly escaped in the db table, to prevent their owners from accessing or creating other databases.\u003c/li\u003e\n\u003cli\u003eAdded the \u0026ndash;force-dir option to install-script.pl.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"313\"\u003e3.13\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdde a section to the List Databases page for changing the database login name for an existing virtual server. This allows servers whose default database names would clash to be more easily created.\u003c/li\u003e\n\u003cli\u003eAdded a new Batch Create Servers page for creating multiple virtual servers at once from a simple text batch file.\u003c/li\u003e\n\u003cli\u003eThe virtual server validation function now checks to ensure that mail user home directories exist and have the correct ownerships.\u003c/li\u003e\n\u003cli\u003eNew and modified mailbox messages can use blocks like $IF-VIRTUALMIN-DAV to display different messages depending on whether or not plugin features like DAV are enabled.\u003c/li\u003e\n\u003cli\u003eWhen importing a virtual server, users can be found by a regular expression as well as just matching by primary group.\u003c/li\u003e\n\u003cli\u003eFixed a bug that could cause mailbox users\u0026rsquo; home directories to be owned by the server administrator.\u003c/li\u003e\n\u003cli\u003eThe rarely-used \u0026lsquo;Group for Unix user\u0026rsquo; option on the server creation page is now hidden by default.\u003c/li\u003e\n\u003cli\u003eAdded a new Batch Create Users page for creating multiple mail / FTP users at once from a simple text batch file.\u003c/li\u003e\n\u003cli\u003eFixed incorrect URLs in the PHPSupport script installer, and added support for version 2.1.\u003c/li\u003e\n\u003cli\u003eAdded highlighting to all tables, when using the latest theme.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"314\"\u003e3.14\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eFixed bug with spamassassin command.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"315\"\u003e3.15\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded caching to the lookup-domain.pl script, to speed up processing when mail is delivered.\u003c/li\u003e\n\u003cli\u003eAdded a template option to have PHP scripts run as the domain owner, via a CGI wrapper script.\u003c/li\u003e\n\u003cli\u003eAdded support for phpMyAdmin 2.8.1.\u003c/li\u003e\n\u003cli\u003eWhen backing up a virtual server, the cron jobs for the Unix user are included too.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"316\"\u003e3.16\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded a check for new-format backups of domains without home directories (such as aliases), which previously failed.\u003c/li\u003e\n\u003cli\u003eUpdated Joomla installer to 1.0.9, and phpBB to 2.0.21.\u003c/li\u003e\n\u003cli\u003eOptimized the bandwidth accounting code for email to only scan the maillog once for all domains, which should speed up the bw.pl process on systems with large mail logs.\u003c/li\u003e\n\u003cli\u003eAdded a checkbox on the backup page to have the destination directory automatically created.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"317\"\u003e3.17\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded \u0026ndash;user parameter to list-users.pl.\u003c/li\u003e\n\u003cli\u003eWhen adding a virtual server with a website, a root-owned file is created in ~/logs to prevent deletion of that directory.\u003c/li\u003e\n\u003cli\u003eAdded an option to create destination directories to the single-domain backup page.\u003c/li\u003e\n\u003cli\u003eMailbox, alias, databases and domains limits are set from the template if not specified explicitly in create-domain.pl.\u003c/li\u003e\n\u003cli\u003eIf an extra administrator username does not match the prefix specified in the domain\u0026rsquo;s template, the master administrator is now allowed to change it.\u003c/li\u003e\n\u003cli\u003eAdded a script installer for NMS, a FormMail replacement.\u003c/li\u003e\n\u003cli\u003eDomain owners and resellers can now view actions they have taken in the Webmin Actions Log module (if enabled on the Module Config page).\u003c/li\u003e\n\u003cli\u003eExtra administrators for a virtual server cannot change the server owner\u0026rsquo;s password in the Change Passwords module.\u003c/li\u003e\n\u003cli\u003eMade the bandwidth usage page visible to resellers (for their managed domains).\u003c/li\u003e\n\u003cli\u003eUpdated Squirrelmail installer to version 1.4.6, DokuWiki to to 2006-03-09, MediaWiki to 1.6.7, phpMyAdmin to 2.6.4-pl4, phpPgAdmin to 4.0.1, phpWiki to 1.2.10 and 1.3.12p2, TikiWiki to 1.9.4, WebCalendar to 1.0.4, and Joomla to 1.0.10.\u003c/li\u003e\n\u003cli\u003eAdded a field to the Edit Server page and an option to modify-domain.pl for changing the mailbox username prefix for servers that don\u0026rsquo;t have any mailboxes yet.\u003c/li\u003e\n\u003cli\u003eNon-standard ports for SCP and FTP backups can be specified by putting :port after the hostname on the backup form.\u003c/li\u003e\n\u003cli\u003eAdded options on the New Mailbox Email page to have the message sent to the domain owner and reseller as well.\u003c/li\u003e\n\u003cli\u003eOptimized the writelogs.pl program to use less memory.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"318\"\u003e3.18\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated Squirrelmail installer to version 1.4.7.\u003c/li\u003e\n\u003cli\u003eThe licensed domains limit no longer includes alias domains.\u003c/li\u003e\n\u003cli\u003eAdded a script installed for DaDaBIK 3.2.\u003c/li\u003e\n\u003cli\u003eAdded a simpler form for setting up mail aliases which only forward to another address, deliver locally and/or send an auto-reply. The old form is still available though.\u003c/li\u003e\n\u003cli\u003eMerged the code base with Virtualmin GPL (this should not have any effect on Virtualmin Pro features).\u003c/li\u003e\n\u003cli\u003eAdded checkboxes and a button to the reseller list page for deleting several at once.\u003c/li\u003e\n\u003cli\u003eFixed a bug that caused mail bandwidth usage to be counted more than once.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"319\"\u003e3.19\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eComments on mail aliases can be edited, and will appear in the list on the Mail Aliases page. The create-alias.pl program has also been updated to allow comments to be set, and the list-aliases.pl program to show them.\u003c/li\u003e\n\u003cli\u003eWhen email is set to a new or modified mailbox, the From: address is that of the domain owner.\u003c/li\u003e\n\u003cli\u003eAdded Module Config options for commands to run before and after an alias is created, modified or deleted.\u003c/li\u003e\n\u003cli\u003eWhen a domain owner is granted access to the Webmin Actions Log module, he can also view actions taken by extra admins.\u003c/li\u003e\n\u003cli\u003eAdded script installed for DaDaBiK 4.0 beta 2.\u003c/li\u003e\n\u003cli\u003eFixed a bug that prevented DNS zones from being added to a file other than named.conf, even if specified in the BIND module.\u003c/li\u003e\n\u003cli\u003eChanged the layout of the script installers page to show more information, and added checkboxes and a button for un-installing several at once.\u003c/li\u003e\n\u003cli\u003eFor scripts that have more than one version available, a description of the meaning of each version (such as stable or development) is displayed.\u003c/li\u003e\n\u003cli\u003eUpdated script installers for Drupal to versions 4.7.2 and 4.6.8, phpMyAdmin to 2.8.2 and WordPress to 2.0.4.\u003c/li\u003e\n\u003cli\u003eSub-domains with DNS enabled are now added by default as records in the parent DNS zone, rather than as a completely new zone.\u003c/li\u003e\n\u003cli\u003eThe server template editing page is now broken down into sections, selectable using a menu. This reduces the size of the form, and makes it easier to find settings that you are interested in.\u003c/li\u003e\n\u003cli\u003eRemoved un-needed code to support versions of Webmin below 1.290.\u003c/li\u003e\n\u003cli\u003eAdded a script installer for AROUNDMe 0.6.9.\u003c/li\u003e\n\u003cli\u003eAdded check for a global SpamAssassin call in /etc/procmailrc, which can interfere with Virtualmin\u0026rsquo;s per-domain SpamAssassin settings.\u003c/li\u003e\n\u003cli\u003eImproved support for running within a Solaris zone (thanks to Textdrive).\u003c/li\u003e\n\u003cli\u003eAdded an option on the Backup Virtual Servers page to have each server\u0026rsquo;s backup file transfered by SCP or FTP after it is created, rather than doing them all at the end of the backup. This saves on temporary local disk space on the server running Virtualmin.\u003c/li\u003e\n\u003cli\u003eVirtusers associated with mailboxes are not un-necessarily removed and re-added when no email related changes are made.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"320\"\u003e3.20\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated CivicSpace script installer to version 0.8.5, Coppermine to 1.4.9, dotProject to 2.0.4, Drupal to 4.7.3 and 4.6.9, Gallery to 1.5.4 and 2.1.2, HelpCenter to 2-1-2, Mambo to 4.5.4, MediaWiki to 1.7.1 and 1.6.8, Moodle to 1.5.4, osCommerce to 2.2ms2-060817, phpAdsNew to 2.0.8, phpCOIN to 1.2.3, PHPlist to 2.10.2, phpMyAdmin to 2.8.2.4, PHP-Nuke to 7.8, PHPsupport to 2.2, PHPsurveyor to 1.0, TWiki to 4.0.4, Xoops to 2.0.15, and ZenCart to 1.3.0.2.\u003c/li\u003e\n\u003cli\u003eUpdated all script installers for Horde and related applications to their latest stable versions.\u003c/li\u003e\n\u003cli\u003eAdded script installers for the Horde applications MIMP, Chora and Passwd, Forwards and Vacation.\u003c/li\u003e\n\u003cli\u003eQuota in email messages to domain owners and mailboxes (using the $QUOTA variable) now use nicer units, like 300 MB.\u003c/li\u003e\n\u003cli\u003eOn the Secondary Mail Servers page, you can now specify a hostname to use in the MX record for each server (like secmx.yourdomain.com) instead of having Virtualmin just use the server\u0026rsquo;s hostname.\u003c/li\u003e\n\u003cli\u003eUpdated the \u0026lsquo;Default delivery for spam\u0026rsquo; and virus options on the Module Config page to allow an arbitrary file or email address to be entered.\u003c/li\u003e\n\u003cli\u003eDomain owners can now perform backups to the virtualmin-backup directory under their home (which does not get included in future backups).\u003c/li\u003e\n\u003cli\u003eWhen adding a DNS zone inside a view that uses an include statement, the included file will be used if specified in the BIND module configuration.\u003c/li\u003e\n\u003cli\u003eWhen installing a script that requires a database, an option is available from the databases menu to create a new one specifically for the script (if permitted by the users\u0026rsquo; limits).\u003c/li\u003e\n\u003cli\u003eAdded the \u0026ndash;newdb option to the install-script.pl program, for creating a database for use by a newly installed script.\u003c/li\u003e\n\u003cli\u003eAdded a Module Config option to compress backups using the bzip2 format, which is more efficient.\u003c/li\u003e\n\u003cli\u003eOn the script installers page, available scripts are listed by category (such as Email, Blog, etc.) to make them easier to find.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"321\"\u003e3.21\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated ZenCart script installer to 1.3.5, PHPCoin to v124, and TikiWiki to 1.9.5.\u003c/li\u003e\n\u003cli\u003eThe \u0026lsquo;Full path to clamscan command\u0026rsquo; option on the Module Config page can now take a command with arguments.\u003c/li\u003e\n\u003cli\u003eThe start and stop buttons for MySQL and PostgreSQL are not shown when it is not running locally.\u003c/li\u003e\n\u003cli\u003eAccess to the default templates can be denied to virtual server owners, just as it can be for other templates.\u003c/li\u003e\n\u003cli\u003eAdded a Save and Next button to the server template page, for easily moving to the next section.\u003c/li\u003e\n\u003cli\u003eAdded the \u0026ndash;limits-from-template option to create-domain.pl, to inherit default limits from template settings.\u003c/li\u003e\n\u003cli\u003eAdded the list-templates.pl command-line script.\u003c/li\u003e\n\u003cli\u003eAdded a checkbox to the email section of the server templates to bounce email to new domains that does not match a specific alias or user.\u003c/li\u003e\n\u003cli\u003eAdded a section to the limits section of the server templates for selecting what capabilities are enabled by default for new domains (like being able to manage aliases, databases and so on).\u003c/li\u003e\n\u003cli\u003eAdded an option to the Spam and Virus Delivery page to automatically whitelist all mailboxes in a domain. Also update the modify-spam.pl script to be able to set this same setting.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"322\"\u003e3.22\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated Mambo script installer to 4.6, phpMyAdmin to 2.9.0, and PHP-Nuke to 7.9.\u003c/li\u003e\n\u003cli\u003eWhen adding a secondary mail server, all existing mail domains can be optionally added to the server. This will update MX records as well.\u003c/li\u003e\n\u003cli\u003eWhen removing a secondary mail server, all secondary domains that were created on it will be removed, and all MX records referring to it deleted.\u003c/li\u003e\n\u003cli\u003eBandwidth limits can now be imposed on resellers, which limits the total amount of bandwidth the reseller can allocate to his customer\u0026rsquo;s domains.\u003c/li\u003e\n\u003cli\u003eFixed bugs that prevented suexec PHP from working properly in sub-domains.\u003c/li\u003e\n\u003cli\u003eOutgoing address mapping (generics) entries are added for new domain owners.\u003c/li\u003e\n\u003cli\u003eUser mail directory sizes are now displayed correctly.\u003c/li\u003e\n\u003cli\u003eAdded the \u0026ndash;mail-size option to the list-users.pl program.\u003c/li\u003e\n\u003cli\u003eDisplayed disk usage for virtual servers is now taken from the group quota (when enabled), to ensure consistency.\u003c/li\u003e\n\u003cli\u003eAdded a new left-side Disk Usage link which shows usage for each directory, mailbox and sub-server under a virtual server.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"323\"\u003e3.23\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded upload fields on the SSL certificate form, for using an existing certificate in a file.\u003c/li\u003e\n\u003cli\u003eUpdated phpMyAdmin script installer to 2.9.0.1.\u003c/li\u003e\n\u003cli\u003eThe Disk Usage page now shows mailbox in sub-domains too.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"324\"\u003e3.24\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated phpMyAdmin script installer to 2.9.0.2, DaDaBiK to 4.0, PHPlist to 2.10.3, MediaWiki to 1.8.0, and Mambo to 4.6.1.\u003c/li\u003e\n\u003cli\u003eAdded a Module Config option to control categorization for domain owner\u0026rsquo;s Webmin modules.\u003c/li\u003e\n\u003cli\u003eAdded preloading for the main virtual-server-lib.pl library, to speed up Virtualmin CGI programs.\u003c/li\u003e\n\u003cli\u003eThe creation date and creator (if available) is shown when editing a virtual server.\u003c/li\u003e\n\u003cli\u003eMySQL backups are now compressed with gzip, to save on disk space from the original SQL format.\u003c/li\u003e\n\u003cli\u003eThe license expired message is only displayed to the master administrator, rather than all users.\u003c/li\u003e\n\u003cli\u003eWhen log rotation is set to always enabled, it will follow the virtual website setting.\u003c/li\u003e\n\u003cli\u003eAdded options to the Spam and Virus Delivery page to write spam to ~/Maildir/spam/.\u003c/li\u003e\n\u003cli\u003eChanged default Apache log format to combined.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"325\"\u003e3.25\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded text fields to the single and multiple domain disable forms for entering a reason why the disable was done. Also updated disable-domain.pl with a new \u0026ndash;why flag.\u003c/li\u003e\n\u003cli\u003eUpdate the Disk Usage page to include a separate per-directory count of disk space used by the domain owner (versus other users like root or httpd).\u003c/li\u003e\n\u003cli\u003eUpdated script installer for Ingo to 1.1.2.\u003c/li\u003e\n\u003cli\u003eFixed a bug that caused server templates to disappear.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"326\"\u003e3.26\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eCreating virtual servers on existing private IPs that are already used by another domain is no longer allowed.\u003c/li\u003e\n\u003cli\u003eForwarding addresses in users created from batch files are now actually used.\u003c/li\u003e\n\u003cli\u003eAdded an option in the server templates in the Webmin login section to specify a Webmin group to which the domain owner is added. This can add new modules and override ACLs on existing ones.\u003c/li\u003e\n\u003cli\u003eUpdated script installer for Drupal to versions 4.7.4 and 4.6.10, DaDaBIK to 4.1_beta, Wordpress to 2.0.5, Coppermine to 1.4.10, and MediaWiki to 1.8.2.\u003c/li\u003e\n\u003cli\u003eDomain owners can now view their apache access and error logs, via links on the left menu.\u003c/li\u003e\n\u003cli\u003eWhen using the Virtualmin framed theme, the module\u0026rsquo;s main menu now only lists domains, rather than showing buttons and icons which already exist in the theme\u0026rsquo;s left menu.\u003c/li\u003e\n\u003cli\u003eUpdated the global Script Installers page available to the master administrator to control which versions can be installed, and to simplify and categorize the user interface.\u003c/li\u003e\n\u003cli\u003eWebsite FTP users can be created with home directories under ~/public_html, which allows the easy creation of users who can manage only part of a website.\u003c/li\u003e\n\u003cli\u003eMoved download site for Civicspace script installer to download.webmin.com, as the original site is unavailable.\u003c/li\u003e\n\u003cli\u003eChanged the name of the NMS script installer to NMS::FormMail, to be more descriptive of its purpose.\u003c/li\u003e\n\u003cli\u003eAdded a new page for checking user and group disk quotas.\u003c/li\u003e\n\u003cli\u003eWhen PHP scripts are run as the domain owner, session.save_path is set to ~/tmp in the domain\u0026rsquo;s PHP configuration, to ensure that session temp files can be written.\u003c/li\u003e\n\u003cli\u003eRemoved action buttons from the Edit Domain and View Domain pages when using the framed theme, as they are already available on the left menu.\u003c/li\u003e\n\u003cli\u003eAdded a new Spam filtering section to the Server Templates page, for selecting whether to use spamassassin or spamd for spam classification. Also updated the Spam and Virus Delivery page to allow this to be modified on a per-domain basis, and the modify-spam.pl script to do the same.\u003c/li\u003e\n\u003cli\u003eUpdated the phpBB script installer to do database configuration automatically.\u003c/li\u003e\n\u003cli\u003ePassword quality restrictions set in the Users and Groups module now apply to mailboxes.\u003c/li\u003e\n\u003cli\u003eDatabase name restrictions now apply when creating virtual servers too.\u003c/li\u003e\n\u003cli\u003eAdded the ability to switch the PHP execution mode (mod_php vs. CGI) on a per-domain basis, using the new PHP Options link on the left menu. This can also be done using the modify-web.pl command line script.\u003c/li\u003e\n\u003cli\u003eAdded \u0026ndash;proxy and \u0026ndash;framefwd options to the modify-web.pl script, to configure proxying and frame forwarding from the command line.\u003c/li\u003e\n\u003cli\u003eOn systems that have a php-cgi program, it will be used instead of php when PHP scripts are run as CGIs.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"327\"\u003e3.27\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eFixed bug in System Logs module access that allows viewing of all logs.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"328\"\u003e3.28\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eWhen adding a MySQL database through the web and command-line interfaces, the default character set can be selected.\u003c/li\u003e\n\u003cli\u003eA warning is displayed for users who are within 5 MB of their disk quota in domains with spam filtering, indicating that filtering is disabled.\u003c/li\u003e\n\u003cli\u003eIn the virtual server list, servers that are using proxy or frame web forwarding have (P) or (F) next to their names.\u003c/li\u003e\n\u003cli\u003eAn SPF record can be added to and configured in an existing virtual server using the DNS Options entry in the left menu, or the modify-dns.pl command-line script.\u003c/li\u003e\n\u003cli\u003eThe DNS IP address for an existing virtual server can also be set using the DNS Options page, or the modify-dns.pl program.\u003c/li\u003e\n\u003cli\u003eWhen a virtual server uses spamc for spam processing, mailbox users\u0026rsquo; quotas are not checked at delivery time, as there is no danger of spamassassin failing if a user is close to his quota.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"329\"\u003e3.29\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eThe cache file used by the lookup-domain.pl program to determine if a mailbox is close to its disk quota is automatically flushed when a user\u0026rsquo;s or domain\u0026rsquo;s quota is changed, which increases the speed at which such changes are detected.\u003c/li\u003e\n\u003cli\u003eWhen renaming a virtual server, an option is available to rename any mailboxes in the domain that contain the old server name.\u003c/li\u003e\n\u003cli\u003eA city or locality name can be entered when generating a certificate.\u003c/li\u003e\n\u003cli\u003eAdded an option to use Spanish to the Joomla script installer.\u003c/li\u003e\n\u003cli\u003eChanged the \u0026lsquo;PHP Options\u0026rsquo; page to \u0026lsquo;Website Options\u0026rsquo;, and added a field for enabling log writing via a program (to protect against a missing ~/logs directory).\u003c/li\u003e\n\u003cli\u003eWhen restoring template backups, existing templates are no longer deleted. This makes copying templates to new servers easier.\u003c/li\u003e\n\u003cli\u003eAdded checkboxes and a button on the Server Templates page to delete several at once.\u003c/li\u003e\n\u003cli\u003eFixed the osCommerce script installer, so that the admin module works.\u003c/li\u003e\n\u003cli\u003eVirtual server backups can now be made to Amazon\u0026rsquo;s S3 service, which provides online storage (at a price). Similarly, restores can be made from the same service. Before you can use this feature, you must sign up for an account with S3 and get an access key and secret key.\u003c/li\u003e\n\u003cli\u003eEach reseller can have an IP address specified for virtual servers with shared address websites under his ownership to be set up on. All DNS records in the servers\u0026rsquo; domains will use that IP, which allows resellers to appear to have a dedicated server for their customer domains.\u003c/li\u003e\n\u003cli\u003eThe change IP address page can now modify the IP of name-based servers, if more than one possibility is available (such as from a reseller IP). Similar, the modify-domain.pl program now takes a \u0026ndash;shared-ip option to do the same thing.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"330\"\u003e3.30\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdded a server template option (enabled by default) to set group ownership on each domain\u0026rsquo;s MySQL database files, so that they are properly counted towards the domain\u0026rsquo;s quota.\u003c/li\u003e\n\u003cli\u003eUpdated the Disk Usage page to include the top 10 databases by space used.\u003c/li\u003e\n\u003cli\u003eAdded a warning when installing a script into a directory that already contains other files, as they will be deleted when it is removed.\u003c/li\u003e\n\u003cli\u003eUpdated the TikiWiki script installer to version 1.9.7, ZenCart to 1.3.6, Xoops to 2.0.16, Kronolith to h3-2.1.4, Turba to h3-2.1.3, Nag to h3-2.1.2, Mnemo to h3-2.1.1, DokuWiki to 2006-11-06, Gallery to 1.5.5-pl1, Squirrelmail to 1.4.9a, phpAdsNew to 2.0.9-pr1, DaDaBiK to 4.1_rc1, ZenPhoto to 1.0.5, and phpMyAdmin to 2.9.1.1.\u003c/li\u003e\n\u003cli\u003eAdded script installers for Zenphoto 1.0.3 and bbPress 0.73.\u003c/li\u003e\n\u003cli\u003eImproved the TikiWiki script installer so that the admin no longer has to enter database connection details.\u003c/li\u003e\n\u003cli\u003eAdded a new link under Administrative Options for switching to the login of a virtual server owner. This is only available for resellers and the master administrator.\u003c/li\u003e\n\u003cli\u003eAdded a section to the Edit Databases page for changing the MySQL and PostgreSQL passwords for a virtual server, to make them independent of the main administration password.\u003c/li\u003e\n\u003cli\u003eThe simple mail alias page can now be used to forward to multiple addresses.\u003c/li\u003e\n\u003cli\u003ePassword quality restrictions set in the Users and Groups module are not properly enforced.\u003c/li\u003e\n\u003cli\u003eRe-designed the Edit User page to use a cleared sectional layout.\u003c/li\u003e\n\u003cli\u003eChanged the default mail forwarding inputs on the Edit User page to use the same simple layout as the Edit Alias page.\u003c/li\u003e\n\u003cli\u003eFixed the Change IP Address page so that alias domain IPs are changed in sync with their targets.\u003c/li\u003e\n\u003cli\u003eBackups of mail / FTP users now include their Cron jobs, such as scheduled emails and automatic mail folder clearing.\u003c/li\u003e\n\u003cli\u003eAdded an option on the Edit Reseller page to lock a reseller\u0026rsquo;s account. Also added \u0026ndash;lock and \u0026ndash;unlock parameters to create-reseller.pl and modify-reseller.pl.\u003c/li\u003e\n\u003cli\u003eAdded install-time checks to ensure that the Apache mod_suexec and mod_actions modules are enabled.\u003c/li\u003e\n\u003cli\u003eDatabase backups and restores are done by calling functions in the Webmin 1.310 MySQL and PostgreSQL modules, rather than using duplicate built-in code. This prevents the PostgreSQL login prompt from appearing when doing a command-line restore.\u003c/li\u003e\n\u003cli\u003eEmail is now also sent when a new alias virtual server is created.\u003c/li\u003e\n\u003cli\u003eAdded a field to the DNS section of server templates for specifying BIND directives to be added to the named.conf entry for new domains.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"331\"\u003e3.31\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eWhen changing the home directory of a virtual server, all references to the old home in its Webalizer configuration files are updated to the new location. Similarly, when restoring a backup from a server that uses a different home base, the Weblizer configuration is updated to use the new home.\u003c/li\u003e\n\u003cli\u003eUpdated the Default domain owner limits section of the Server Templates page to add defaults for the \u0026lsquo;Can choose database names\u0026rsquo;, \u0026lsquo;Can rename domains\u0026rsquo; and \u0026lsquo;Allow sub-servers not under this domain\u0026rsquo; options.\u003c/li\u003e\n\u003cli\u003eAdded a field to the Website Options page to enable or disable suexec on a per-domain basis. Also added equivalent flags to modify-web.pl.\u003c/li\u003e\n\u003cli\u003eValidation of the mail feature now also checks to ensure that any secondary mail servers are actually receiving email for the domain.\u003c/li\u003e\n\u003cli\u003eFixed a bug that prevents backups from a system using /var/mail for email storage being fully restored on a system that uses ~/Maildir.\u003c/li\u003e\n\u003cli\u003eOwners of domains that have virtual FTP enabled are now able to view their FTP server logs.\u003c/li\u003e\n\u003cli\u003eFixed bug that prevents custom ports from being entered for FTP and SSH backups.\u003c/li\u003e\n\u003cli\u003eChanged most instances of the word \u0026lsquo;Unix\u0026rsquo; to \u0026lsquo;Administrator\u0026rsquo; in user interface.\u003c/li\u003e\n\u003cli\u003eWhen PHP via CGI is enabled for a virtual server, the session save path in ~/etc/php.ini is set to ~/tmp.\u003c/li\u003e\n\u003cli\u003eUpdated the phpBB script installer to version 2.0.22, phpProjekt to 5.2, Joomla to 1.0.12, phpList to 2.11.2, ZenCart to 1.3.7, Gallery to 2.2-rc-1, Drupal to 4.7.5/4.6.11, WordPress to 2.0.6, bbPress to 0.74, and ZenPhoto to 1.0.6.\u003c/li\u003e\n\u003cli\u003eChanged the \u0026lsquo;Add Apache user to Unix group for new servers?\u0026rsquo; option in the server template to add a working No option.\u003c/li\u003e\n\u003cli\u003eVirtual server owners using the Apache module are now limited to their home directory for alias targets and other Apache directives that specifiy directories.\u003c/li\u003e\n\u003cli\u003eAdded support for migrating Ensim backups into Virtualmin domains. Includes website, DNS, MySQL, mail aliases and mailbox migration capabilities.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"332\"\u003e3.32\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated MediaWiki script installer to 1.9.0, DaDaBiK to 4.1, WordPress to 2.1, bbPress to 0.75, phpMyAdmin to 2.9.2, TWiki to 4.1.0, phpPgAdmin to 4.1, and phpWiki to 1.3.13rc1.\u003c/li\u003e\n\u003cli\u003eAdded support for running PHP scripts via FCGId, which combines speed and domain-level user security.\u003c/li\u003e\n\u003cli\u003eAdded a new Custom Links global configuration page, for defining extra links that appear on the left menu.\u003c/li\u003e\n\u003cli\u003eAdded an option to the Edit Owner Limits page for controlling if a domain owner can login via FTP, SSH or neither. Also added a corresponding option to the mass server change form, and the modify-limits.pl command-line script.\u003c/li\u003e\n\u003cli\u003eAfter saving a virtual server, a page showing a confirmation message and common links is displayed, rather than the (slow) Edit Virtual Server screen.\u003c/li\u003e\n\u003cli\u003eHid most options on the virtual server creation form in an expandable sections.\u003c/li\u003e\n\u003cli\u003eChanged the mail alias creation page to use Javascript to select simple / advanced mode forms.\u003c/li\u003e\n\u003cli\u003eChanged the mail / FTP user page to hide infrequently used options in collapsed sections, and to use Javascript to select simple / advanced mail forwarding modes.\u003c/li\u003e\n\u003cli\u003eChanged all rows of links to put a | between them, increasing readability.\u003c/li\u003e\n\u003cli\u003eAdded a help link in the top-left corner on the server creation form.\u003c/li\u003e\n\u003cli\u003eCleaned up Edit Virtual Server and Virtual Server Details pages to use collapsible sections and more consitent layout.\u003c/li\u003e\n\u003cli\u003eAdded a section to the virtual server creation form for selecting an initial style and message for a new website. Also added \u0026ndash;style and \u0026ndash;content options to create-domain.pl, for the same purpose.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"333\"\u003e3.33\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eFixed bug that prevented the email for new sub-servers from being disabled, and added an option to inherit it from the parent template.\u003c/li\u003e\n\u003cli\u003eUpdated MediaWiki script installer to 1.9.1, ZenPhoto to 1.0.6, Drupal to 4.7.6, and phpAdsNew to 2.0.11 (and changed its name to Openads).\u003c/li\u003e\n\u003cli\u003eEnhanced the validation for SSL virtual servers to check for the certificate files.\u003c/li\u003e\n\u003cli\u003eAdded a new section to the Spam and Virus Delivery page for configuring automatic clearing of mailbox users\u0026rsquo; spam and virus folders. Also added an option in the server templates for setting the default for new servers, and an input on the page for updating multiple servers.\u003c/li\u003e\n\u003cli\u003eAdded \u0026ndash;spamclear-days, \u0026ndash;spamclear-size and \u0026ndash;spamclear-none options to modify-spam.pl.\u003c/li\u003e\n\u003cli\u003eWhen a mailbox or domain owner is deleted, all of his Cron jobs will be removed too. Similarly, the owner of any Cron jobs will be correctly updated when a useris renamed.\u003c/li\u003e\n\u003cli\u003eBroke the Update Virtual Servers page down into more readable collapsed sections.\u003c/li\u003e\n\u003cli\u003eRemoved redundant creation buttons from main page, when using the framed theme.\u003c/li\u003e\n\u003cli\u003eAdded a link from the Edit Virtual Server page to show a server\u0026rsquo;s current password.\u003c/li\u003e\n\u003cli\u003eAdded the PHP Versions page (under Server Configuration on the left menu) for selecting the version of PHP to run for a virtual server. This can also be configured differently on a per-directory basis.\u003c/li\u003e\n\u003cli\u003eAdded the list-php-directories.pl, set-php-directory.pl and delete-php-directory.pl scripts for changing PHP version from the command line or remote API.\u003c/li\u003e\n\u003cli\u003eUpdated the Update Virtual Servers page to allow the default PHP version and PHP execution mode to be changed on multiple servers at once.\u003c/li\u003e\n\u003cli\u003eChanged the script installer process to automatically use the correct PHP version required by the script, if available.\u003c/li\u003e\n\u003cli\u003eFixed the PHP Support script installer to automatically setup the database connection details for version 2.2.\u003c/li\u003e\n\u003cli\u003eIMAP passwords for Usermin users are automatically updated when changed in Usermin.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"334\"\u003e3.34\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated the MediaWiki script installer to version 1.9.2, and TWiki to version 4.1.1.\u003c/li\u003e\n\u003cli\u003eWhen a mailbox user\u0026rsquo;s password is changed in other modules, it is also updated in Virtualmin\u0026rsquo;s plain-text password file.\u003c/li\u003e\n\u003cli\u003eAdded new pages for easily editing HTML in a virtual server\u0026rsquo;s website.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"335\"\u003e3.35\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003ePHP and Pear modules needed by script installers are now automatically installed when needed, if supported by the underlying operating system\u0026rsquo;s update service (APT or YUM).\u003c/li\u003e\n\u003cli\u003eAdded support for enabling Ruby scripts in a virtual server. This can be done on the Website Options page, with the modify-web.pl script, on the mass domain update page, and set by default in server templates. Both execution via mod_ruby and CGI scripts are supported, assuming that the required software is installed.\u003c/li\u003e\n\u003cli\u003eUpdated the lookup-domain.pl script (which is called from Procmail) to communicate with a permanent server process, rather than performing all processing on its own. This will reduce the load when email to multiple recipients arrives at once.\u003c/li\u003e\n\u003cli\u003eUpdated the PHProjekt and MediaWiki script installers to setup the database configuration automatically.\u003c/li\u003e\n\u003cli\u003eChanged pages with tabs and hidden sections to be usable by the mobile device theme.\u003c/li\u003e\n\u003cli\u003eImproved detection of multiple scripts being accidentally installed into the same path.\u003c/li\u003e\n\u003cli\u003eUpdated DaDaBiK script installer to version 4.2, WordPress to 2.1.1, phpMyAdmin to 2.10.0, phpList to 2.11.3, and MediaWiki to version 1.9.3.\u003c/li\u003e\n\u003cli\u003eAdded a button to the Edit Extra Administrator page for switching to his Webmin login without needing to know the password.\u003c/li\u003e\n\u003cli\u003eAdded the \u0026ndash;primary-ip option to create-domain.pl, to create an SSL domain on the primary IP.\u003c/li\u003e\n\u003cli\u003eAdded the Shared IP Addresses page under System Configuration for defining additional shared addresses that can be selected when creating servers without a private IP. Also updated the server creation page to allow selection of one of these shared IPs, and the create-domain.pl program to use one with the \u0026ndash;shared-ip parameter.\u003c/li\u003e\n\u003cli\u003eAdded the New Reseller Email page, for setting up a message to be sent to new reseller accounts.\u003c/li\u003e\n\u003cli\u003eAdded the \u0026ndash;email parameter to create-reseller.pl and modify-reseller.pl scripts.\u003c/li\u003e\n\u003cli\u003eUpdated many script installers to support PHP 5.\u003c/li\u003e\n\u003cli\u003eAll autoreply email message files are now hard linked to from /var/virtualmin-autoreply, and this path is used in the autoresponders. This allows them to continue working even when a domain\u0026rsquo;s home directory is not world-readable.\u003c/li\u003e\n\u003cli\u003eFixed bug that broke renaming of virtual servers when using debian-style sites-enabled directory for the Apache config.\u003c/li\u003e\n\u003cli\u003eFixed bug that prevented autoresponders from being updated properly when renaming or moving virtual servers.\u003c/li\u003e\n\u003cli\u003eFixed the Nucleus script installer so that it actually works, and increased version to 3.24.\u003c/li\u003e\n\u003cli\u003eFixed the b2evolution script installer to correctly use it\u0026rsquo;s built-in scripts for setting up the config files and database.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"336\"\u003e3.36\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eIncreased version of Gallery script installer to 2.2-rc-2, ZenPhoto to 1.0.8.2, WebCalendar to 1.0.5, Integramod to 1.4.1, and TWiki to 4.1.2.\u003c/li\u003e\n\u003cli\u003eChange the Module Config option for the Upload and Download module to limit to uploads only.\u003c/li\u003e\n\u003cli\u003eReplaced the HTMLarea widget for editing web pages with Xinha, when using Webmin 1.332 or later.\u003c/li\u003e\n\u003cli\u003eBroke the Bandwidth Monitoring page down into collapsible sections.\u003c/li\u003e\n\u003cli\u003eAdded a new page for regularly updating a dynamic IP address, for systems where the primary IP is not static.\u003c/li\u003e\n\u003cli\u003eUpdated the \u0026lsquo;Show system information on main page?\u0026rsquo; Module Config option to allow display for resellers too.\u003c/li\u003e\n\u003cli\u003eAutoreply message recipient tracking files are now stored in /var/virtualmin-autoreply, so that they can be accessed by the mail server when a virtual server\u0026rsquo;s home is not world-readable.\u003c/li\u003e\n\u003cli\u003ePlugin modules can now have help links on the virtual server creation and editing pages.\u003c/li\u003e\n\u003cli\u003eAdded tabs to the Manage SSL Certificate page.\u003c/li\u003e\n\u003cli\u003eAdded the \u0026lsquo;User-configured mail forwarding\u0026rsquo; section to the Edit Mailbox page, to show forwarding setup by the user in their .procmailrc file (using the Mail Filters module in Usermin).\u003c/li\u003e\n\u003cli\u003eAdded the \u0026lsquo;Hide limits from server owners\u0026rsquo; option to the reseller page, which prevents his customers from seeing the reseller\u0026rsquo;s limits (although they are still enforced). Also updated the create-reseller.pl and modify-reseller.pl programs to all \u0026ndash;hide options.\u003c/li\u003e\n\u003cli\u003eAdded caching to make lookups of domains by parent and user faster.\u003c/li\u003e\n\u003cli\u003eAdded tabs and more help text to the Script Installers page.\u003c/li\u003e\n\u003cli\u003eAdded several new initial website content styles, such as Refresh, Dreamy, Rounded and Integral. All of these create multiple pages which can then be easily edited with the Edit Web Pages feature.\u003c/li\u003e\n\u003cli\u003eAdded a button to the Edit Web Pages page to replace existing content with that generated from a style. Also added the \u0026ndash;style option to modify-web.pl.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ch4 id=\"337\"\u003e3.37\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eRemoved old versions from the PHPmyAdmin script installer.\u003c/li\u003e\n\u003cli\u003eUpdated the Drupal script installer to support version 5.1, phpPgAdmin to 4.1.1, and all the Horde scripts to their latest versions.\u003c/li\u003e\n\u003cli\u003eDon\u0026rsquo;t allow extra admins to switch to the domain owner.\u003c/li\u003e\n\u003cli\u003eAdded a page for installing third-party content styles, which can then be used for new websites exactly like the built-in styles.\u003c/li\u003e\n\u003cli\u003eWhen configuring email notification for new mailboxes, resellers and domains, you can now enter a Bcc address as well as a Cc address.\u003c/li\u003e\n\u003cli\u003eSplit the Edit Virtual Server page into more sections.\u003c/li\u003e\n\u003cli\u003eImproved the IntegraMod and dotProject script installers to configure the database connection automatically.\u003c/li\u003e\n\u003cli\u003eMoved options for sending email to new and updated mailboxes from the Module Config page to the form for editing the actual messages.\u003c/li\u003e\n\u003cli\u003eAdded the list-simple-aliases.pl and create-simple-alias.pl programs for easy alias management from the command line.\u003c/li\u003e\n\u003cli\u003eFixed bugs related to renaming autoresponder files when renaming a domain.\u003c/li\u003e\n\u003cli\u003eAdded the Less Antique content style.\u003c/li\u003e\n\u003cli\u003eAdded preview images for content styles, visible via the Preview.. link next to the style menu.\u003c/li\u003e\n\u003cli\u003eDomain owners who cannot login via SSH are automatically added to the deniedssh group, which the SSH server is configured to deny even before checking their shell.\u003c/li\u003e\n\u003cli\u003eThe spam and virus filtering features are now enabled by default for new virtual servers.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"Virtualmin 3.37-1.81 release notes"},{"content":"","permalink":"https://www.virtualmin.com/template-virtualmin.com/","summary":"","title":""}]