<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Upgrading from 5.x, 6.2 or 6.3: the 24 changes without a switch, and rolling back]]></title><description><![CDATA[<p dir="auto"><em>Written for 6.3.4. hMailServer 6.3.6 (6 October 2026) adds three one-way schema steps (6106 to 6108), changes more without a switch (DANE lookups that do not come back whole, external accounts' days to keep messages, the COM helpers, Windows folder permissions, the REST listener's Host) and installs by the live update from 6.3.4 or 6.3.5: read <a href="/topic/28276">the 6.3.6 announcement</a> before upgrading. hMailServer 6.3.7 (17 October 2026), a security release, adds no schema step (6108 stays, so the live update's rollback from it to 6.3.6 meets no newer schema) and installs by the live update from 6.3.4, 6.3.5 or 6.3.6, with the exceptions its announcement lists; it too changes what an upgraded server does without a switch: an authenticated submission is DKIM-signed as another hosted domain only when the account may send as the From address; a domain's or an account's rule may no longer set From, Sender, Resent-From, Resent-Sender, DKIM-Signature or the loop count, nor a Sieve script add or delete them or send notify from an arbitrary :from; RuleLoopLimit 0 stops out-of-office replies; the serveradmin role with a list of domains is confined to those domains over COM; forwards of outside mail take an envelope sender in the hosted domain only on a DMARC pass; the anti-virus action that removes attachments replaces a single-part attachment message with its note and deletes unreadable mail; SASL PLAIN acting as another account is refused; on Windows <code>/ProtectFolders</code> hardens the program folder, <code>Bin</code> and <code>ControlPanel</code>, the x64 installer's MariaDB Connector/C 3.4.11 drops MySQL Enterprise's Windows authentication, and an upgraded server keeps the .NET 10 Desktop Runtime it had, where the installers carry 10.0.13. See <a href="/topic/28277">the 6.3.7 announcement</a>. hMailServer 6.3.8 (2 November 2026), a security release, adds no schema step either (6108 stays, so the live update's rollback from it meets no newer schema) and installs by the live update from 6.3.4, 6.3.5, 6.3.6 or 6.3.7, with the exceptions its announcement lists; of what it changes without a switch, these are the most likely to need something done before upgrading: <code>TlsMode=verify-full</code> on MySQL or MariaDB without <code>TlsCaFile</code>, to a database server on the same machine, is refused with HM7535; on Windows a file whose path holds characters outside ASCII - the database's <code>TlsCaFile</code> or <code>PostgreSQLSslRootCert</code>, a TLS certificate or private key file, <code>dh2048.pem</code>, a client-certificate CA file, <code>MessageStoreObjectCaFile</code>, <code>OAuth2PublicKeyFile</code> or <code>AcmeCertificateDirectory</code> - may be refused with HM7534 or HM7536; on Linux files are named in UTF-8 whatever <code>LANG</code> says, so where a server ran under a <code>LANG</code> that is not UTF-8, each file or folder named outside ASCII is to be renamed to its UTF-8 name; a sign-in name spelt otherwise than the stored address, in more than the case of the letters A to Z, or with white space at either end, may no longer sign in; an IP range of your own that allows some addresses none of SMTP, POP3 and IMAP now closes the web services listener to them too; a REST body that is not one JSON object within the bounds is answered 400; an <code>AcmeDomains</code> host the certificate lacks is ordered at the first check, and one the CA cannot validate holds the renewal for the others; and on Windows setup refuses with exit code 7 a program folder, <code>Bin</code> or <code>ControlPanel</code>, or a folder or a link on the way to them, that another account controls, and refuses an installation of the original hMailServer's 5.7, which no upgrade step reaches: move such a server's mail over IMAP instead. See <a href="/topic/28278">the 6.3.8 announcement</a>.</em></p>
<p dir="auto">This topic covers what comes after the installer in an upgrade to 6.3.4 (27 September 2026, schema 6104): the 24 changes <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/CHANGELOG.md" rel="nofollow ugc">CHANGELOG.md</a> lists under "What changes on upgrade without a switch", with what to do about each; what else differs coming from 5.x or early 6.x; what the server says when the schema and the server do not match; and how to go back. The path, the slow steps and the backup are in <a href="/topic/28193">Upgrading to 6.3.4</a>.</p>
<p dir="auto"><strong>Know this first: an upgrade cannot undo itself.</strong> An older server refuses a newer schema rather than misread it, so the database backup taken before the installer ran is the only way back. Going back from 6.3.4 can also need the <code>hMailServer.ini</code> you had before the upgrade, as <em>Rolling back from 6.3.4</em> below explains. Keep a copy of both.</p>
<h3><a class="anchor-offset" name="the-24-changes-and-what-to-do-about-each"></a>The 24 changes, and what to do about each</h3>
<p dir="auto">Numbered as <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/CHANGELOG.md" rel="nofollow ugc">CHANGELOG.md</a> numbers them; all are since 6.3.4.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>#</th>
<th>What changes</th>
<th>What to do</th>
<th>Detail</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>The database is the settings store (schema 6042); <code>[Settings]</code> in <code>hMailServer.ini</code> is its copy. A line edited in the file is put back and named as <code>HM5804</code></td>
<td>Do not edit the file to prepare the upgrade; restart the old service once after your last change. Afterwards use the Control Panel, COM (<code>Settings.SetIniSetting</code>), REST (<code>PUT /api/v1/settings/ini/{name}</code>) or, on Linux, <code>hmailserver --set-setting NAME=VALUE</code></td>
<td><a href="/topic/28193">Upgrading to 6.3.4</a>; <a href="/topic/28222">Settings</a></td>
</tr>
<tr>
<td>2</td>
<td>211 keys apply when saved, 28 at a reinitialise, 2 at a restart</td>
<td>A script that counted on nothing happening until the next start now sees its change at once</td>
<td><a href="/topic/28222">Settings: when a save takes effect</a></td>
</tr>
<tr>
<td>3</td>
<td>SPF follows RFC 7208: 127.0.0.0/8 and <code>::1</code> no longer pass before any policy is read. SPF now works on Linux, where every check had been TempError</td>
<td>A content filter that re-injects mail authenticates, or connects from an IP range with anti-spam off</td>
<td><a href="/topic/28248">The anti-spam stack</a></td>
</tr>
<tr>
<td>4</td>
<td>The audit trail is on (schema 6043), kept until a retention is set; alerts are on, but nothing is mailed until <code>AlertRecipient</code> and <code>AlertSenderAddress</code> are set</td>
<td>Set <code>AuditRetentionDays</code>, and the two addresses</td>
<td><a href="/topic/28273">Alerts and the audit trail</a></td>
</tr>
<tr>
<td>5</td>
<td>Compromised-account detection starts in watch mode (schema 6071): it raises <code>account.compromised</code> and holds nothing</td>
<td>Set <code>compromise_detection_mode</code> to <code>enforce</code> when you want a takeover held</td>
<td><a href="/topic/28241">Hardening: compromised-account detection</a></td>
</tr>
<tr>
<td>6</td>
<td>A 421, or a provider's rate-limit 4xx, pauses that destination for <code>OutboundBackoffMinutes</code> (2, doubling to 60)</td>
<td>Nothing; 0 turns it off</td>
<td><a href="/topic/28259">Outbound shaping</a></td>
</tr>
<tr>
<td>7</td>
<td>A backup carries what an account keeps beyond its mail: address book, preferences, calendars, S/MIME keys, keywords and more</td>
<td>Expect larger archives. One from 6.3.3 or earlier restores as it did, without them</td>
<td><a href="/topic/28221">Backup and restore</a></td>
</tr>
<tr>
<td>8</td>
<td>The out-of-office memory is a table (schema 6060)</td>
<td>Nothing: a restart no longer sends everyone the reply again</td>
<td><a href="/topic/28268">Rules and Sieve: vacation replies</a></td>
</tr>
<tr>
<td>9</td>
<td>Collected addresses are suggestions under Other contacts; CardDAV serves only kept contacts</td>
<td>Tell users a phone no longer receives collected addresses; <strong>Keep</strong> makes one a contact</td>
<td><a href="/topic/28252">Calendars and contacts</a></td>
</tr>
<tr>
<td>10</td>
<td>In the container image, <code>HM_SETTING_&lt;key&gt;</code> and <code>HM_PROPERTY_&lt;name&gt;</code> are stored at every start, and the setting is refused to the other interfaces</td>
<td>Remove the variable and start once without it. No container image of 6.3.4 is published</td>
<td><a href="/topic/28246">In a container</a></td>
</tr>
<tr>
<td>11</td>
<td><code>GET /api/v1/me/search</code> goes on from where it stopped</td>
<td>Below</td>
<td>Below</td>
</tr>
<tr>
<td>12</td>
<td>IMAP answers as the RFCs say: <code>NO</code> rather than <code>BAD</code> for a missing mailbox, <code>\Seen</code> set by every <code>BODY[&lt;section&gt;]</code> without <code>.PEEK</code>, SORT and THREAD ordering, APPEND byte for byte</td>
<td>Test clients and scripts that relied on the old answers</td>
<td><a href="/topic/28255">Connecting a mail client</a></td>
</tr>
<tr>
<td>13</td>
<td>MySQL and MariaDB tables become <code>utf8mb4</code> (schema 6102), every table rebuilt</td>
<td>MySQL 5.7.9 or MariaDB 10.2.2 or later, the ALTER privilege on the database, free disk of the order of the largest table</td>
<td><a href="/topic/28193">Upgrading to 6.3.4</a>; <a href="/topic/28247">Databases on Linux: the upgrade floor</a></td>
</tr>
<tr>
<td>14</td>
<td>Schema 6101 adds two columns to <code>hm_messages</code></td>
<td>On a large store, time it on a copy first</td>
<td><a href="/topic/28193">Upgrading to 6.3.4</a></td>
</tr>
<tr>
<td>15</td>
<td>The database connection is encrypted when the database server offers TLS, for MySQL and MariaDB without checking the certificate; PostgreSQL is unchanged</td>
<td>Read the application log at the first start, or run <code>--check-database</code>; <code>TlsMode</code> and <code>TlsCaFile</code> in <code>[Database]</code> choose otherwise</td>
<td><a href="/topic/28228">Choosing a database: encrypting the link</a></td>
</tr>
<tr>
<td>16</td>
<td>The administrator password is hashed again at the first successful administrator sign-in; a browser session made under the old hash ends once</td>
<td>Sign in once. A file the service cannot write keeps the old value (<code>HM7494</code>)</td>
<td><a href="/topic/28241">Hardening a public mail server</a></td>
</tr>
<tr>
<td>17</td>
<td>A COM change to a route, an incoming relay, a DNS black list, an SSL certificate or five more kinds of shared object takes effect at <code>Save()</code></td>
<td>Add <code>Save()</code> where a script relied on setting a property; the Control Panel is not affected</td>
<td><a href="/topic/28262">The COM API on Windows: Save()</a></td>
</tr>
<tr>
<td>18</td>
<td>Mail labelled ISO-8859-1 is decoded as windows-1252</td>
<td>Below</td>
<td>Below</td>
</tr>
<tr>
<td>19</td>
<td>A restore refuses an unsafe archive whole (<code>HM7540</code>)</td>
<td>Nothing: no backup this server writes has such an entry</td>
<td><a href="/topic/28221">Backup and restore</a></td>
</tr>
<tr>
<td>20</td>
<td>A rule's Run function action must name a plain function: otherwise <code>HM5018</code> on Windows, and on Linux nothing runs and the ERROR log has a Script Error line</td>
<td>Rename such functions to ASCII letters, digits, <code>_</code> and <code>$</code>, not starting with a digit</td>
<td><a href="/topic/28261">Event scripts: the 6.3.4 security fix</a>; <a href="/topic/28218">the advisory</a></td>
</tr>
<tr>
<td>21</td>
<td>A domain can no longer be named as one of the server's own directories</td>
<td>Below</td>
<td>Below</td>
</tr>
<tr>
<td>22</td>
<td>A one-time code is taken once, over COM and REST: a TOTP code the server has accepted is refused if it comes again within its window, but not counted as a wrong code, so it locks nobody out</td>
<td>A script that sent the administrator's password and a code with every REST request now has only its first request in each half minute accepted, the others refused with 401: sign it in once with <code>POST /api/v1/session</code> and use the <code>hmailsession</code> cookie, or give it an API key</td>
<td><a href="/topic/28264">The REST API: one-time codes</a></td>
</tr>
<tr>
<td>23</td>
<td>The outbound relay sends its OAuth2 token over TLS only: a route or the SMTP relay whose host is on <code>OutboundOAuth2Hosts</code> and whose connection security is none, or STARTTLS optional against a server that does not offer it, fails with a temporary <code>450 4.7.0</code> (<code>HM5912</code>), and the message waits for the route's retries</td>
<td>Set that connection security to TLS or STARTTLS required. A route to Exchange Online on 587, set up as Microsoft documents it, is not affected</td>
<td><a href="/topic/28269">Routes, relays and smart hosts: OAuth2</a></td>
</tr>
<tr>
<td>24</td>
<td>A hash stored before 6.3.4 of a password with a character above U+00FF is refused</td>
<td>Set such passwords again, and soon</td>
<td><a href="/topic/28193">Upgrading to 6.3.4</a>; <a href="/topic/28241">Hardening a public mail server</a></td>
</tr>
</tbody>
</table>
<h3><a class="anchor-offset" name="three-that-no-table-row-can-hold"></a>Three that no table row can hold</h3>
<p dir="auto"><strong>ISO-8859 (18).</strong> ISO-8859-1 is decoded as windows-1252, as every mail client reads it, and ISO-8859-2 to -9, -13 and -15 by their own code pages. There was no ISO-8859 name in the server's table at all, so a Western Windows server decoded Latin-1 right by accident and decodes it as before, one with another ANSI code page now decodes it right too, and on Linux Latin-1 is no longer turned into replacement characters. There is nothing to set.</p>
<p dir="auto"><strong>Reserved domain names (21).</strong> A domain's mail is kept in the directory named after it under the data directory, beside the server's own stores. So a single-label name such as <code>protected</code>, <code>confidential</code>, <code>recoverable</code>, <code>discovery</code>, <code>quarantine</code>, <code>files</code>, <code>lists</code> or <code>blobs</code>, in any case, or <code>temp</code>, <code>events</code> and <code>database</code>, which the Linux packages put there, is refused for a new domain and for a rename over COM (<code>Domain.Save</code>) and REST, and so in the Deck. The Control Panel already refused every name without a dot. A domain that already has such a name is still saved, so that it can be managed, and is named as <code>HM7597</code> in the error log at every start and as <code>domain_name_reserved</code> on the first-hour checklist. <strong>Rename it</strong>: the rename moves each of its accounts' mailboxes and leaves the store's files where they are. Until then, a domain named <code>recoverable</code>, <code>discovery</code>, <code>confidential</code> or <code>protected</code> has its mail in a folder the backup leaves out.</p>
<p dir="auto"><strong>The search route (11).</strong> Only a client of <code>GET /api/v1/me/search</code> other than the webmail needs to change. A search with more hits than <code>limit</code> answered <code>complete: true, more: true</code> and could not reach the rest; it now answers <code>complete: false, more: true</code> with <code>next_before_id</code>, which <code>before_id</code> continues from. Hits come newest first across every folder by message id, where they came folder by folder (<a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/Performance.md" rel="nofollow ugc">Performance.md</a>).</p>
<h3><a class="anchor-offset" name="coming-from-5.x-or-early-6.x"></a>Coming from 5.x or early 6.x</h3>
<p dir="auto">The 24 apply to you too, and so do the changes of every release in between: section 5 of <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Changes-Since-6210" rel="nofollow ugc">Changes Since 6.2.10</a> lists what came without a switch from 6.2.10 to 6.2.28. On 5.3 to 5.5, back up first and test the restore. Four things are particular to an older installation, all on Windows:</p>
<ul>
<li><strong>The Administrator is replaced by the Control Panel.</strong> <code>hMailAdmin.exe</code> was retired in 6.2. The Control Panel, <code>hMailCP.exe</code>, does everything it did, and its navigation tree mirrors the old layout. Your TOTP secret carries over.</li>
<li><strong>The PHP WebAdmin is gone.</strong> Administer a remote server with the Control Panel, which connects to it directly, or from a browser with <a href="/topic/28192">the Control Deck</a>. The "Administrative tools" component now only registers the COM type library for scripts on another machine.</li>
<li><strong>A pre-5 <code>hMailServer.ini</code> moves into <code>Bin</code>.</strong> The installer copies it from the Windows directory to <code>Bin\hMailServer.ini</code>, leaves a <code>.old</code> copy where it was and deletes the original; the server reads only the one in <code>Bin</code>.</li>
<li><strong>The .NET 10 runtime.</strong> Since the first release after 6.2.18 the Control Panel and the setup tools (<code>DBSetup</code>, <code>DBSetupQuick</code>, <code>DBUpdater</code>) need the .NET 10 Desktop Runtime. The installer bundles <code>windowsdesktop-runtime-10.0-win-x64.exe</code> and installs it <code>/quiet /norestart</code> when it is missing (6.3.7's installers carry 10.0.13 and install it only where no .NET 10 Desktop Runtime is installed at all: an upgraded server keeps the one it had, 10.0.12 where 6.3.4 to 6.3.6 installed it, and brings it to 10.0.13 or later through Microsoft Update or Microsoft's installer).</li>
</ul>
<p dir="auto"><strong>If the runtime does not install.</strong> <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/Upgrading.md" rel="nofollow ugc">Upgrading.md</a> says the server, native code with no .NET dependency, is left working without the Control Panel. The documentation's <a href="https://www.progressiverobot.com/hmailserver-documentation/#185-things-that-changed-and-what-to-do-about-them" rel="nofollow ugc">18.5</a> says otherwise, and for an upgrade to 6.3.4, which always moves the schema, it is right: <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/Upgrading.md" rel="nofollow ugc">Upgrading.md</a> itself says the setup tools need the runtime too, and the server refuses to start against an old schema, so there is no mail server until the schema is moved. Install the runtime (x64) by hand from <code>https://dotnet.microsoft.com/download/dotnet/10.0</code>, run <code>DBUpdater.exe</code> from the installation's <code>Bin</code> folder, then start the service.</p>
<h3><a class="anchor-offset" name="when-it-goes-wrong"></a>When it goes wrong</h3>
<p dir="auto">At every start the server compares the version in <code>hm_dbversion</code> with the one it requires and refuses to run if they differ, in either direction. The ERROR log has one of these:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Code and message</th>
<th>What it means</th>
<th>What to do</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>HM5011</code>: <code>The database is too old for this version of hMailServer. Please run hMailServer Database updater (DBUpdater.exe) to upgrade it.</code></td>
<td>The schema did not get all the way up</td>
<td>Run <code>DBUpdater.exe</code> from the installation's <code>Bin</code> folder</td>
</tr>
<tr>
<td><code>HM5011</code>: <code>The database is too new for this version of hMailServer. Please upgrade hMailServer.</code></td>
<td>An older server against a newer schema: an old binary left in place, or a previous release reinstalled</td>
<td>Install the matching or a newer server. Do not try to downgrade the database</td>
</tr>
<tr>
<td><code>HM5010</code>: <code>Database version could not be detected.</code></td>
<td><code>hm_dbversion</code> could not be read at all</td>
<td>Check the connection details in <code>[Database]</code> and that the login can read the table</td>
</tr>
</tbody>
</table>
<p dir="auto">Both <code>HM5011</code> messages end with <code>Database version: &lt;n&gt;, Required database version: &lt;m&gt;</code>. On Windows the service reports itself running before this check, so a refused start leaves a service Windows calls Running with nothing listening: read the ERROR log. A 6.3.3 server against a 6.3.4 database is the too-new case on purpose: step 6041 to 6042 changes only the version, the fence that keeps a 6.3.3 server, which lets <code>hMailServer.INI</code> win, away from a database that is now the settings store.</p>
<p dir="auto"><strong>Resuming.</strong> DBUpdater picks up from whichever version the database actually reports, so a retry after a partial upgrade resumes rather than restarting. A failed step leaves PostgreSQL exactly as it was and SQL Server normally so; MySQL, MariaDB and SQL Server Compact commit DDL as it executes and keep the steps that ran. The same chain also runs:</p>
<ul>
<li>on Windows, since 6.3.4, as <code>hMailServer.exe --upgrade-database</code> with the service stopped, without DBUpdater's window or the administrator password; it exits 0 (done, or nothing to do), 1 (failed; the output names the step) or 2 (no <code>[Database]</code> configured);</li>
<li>on Linux as <code>hmailserver --upgrade-database</code>, which the <code>.deb</code> and <code>.rpm</code> run after installing;</li>
<li>at the service's own start with <code>UpgradeOnStart=1</code> in <code>[Database]</code> (since 6.3.4, off by default): a failing step refuses the start with <code>HM5011</code> naming the step, and the next start resumes there. It backs nothing up, and belongs on one node at a time (<a href="/topic/28232">Warm standby</a>).</li>
</ul>
<p dir="auto">DBUpdater exits 0 on success, 1 when the upgrade failed, 2 on a configuration error, and 3 when authentication was cancelled or, under <code>/silent</code>, could not be satisfied: see <code>HM_ADMIN_PASSWORD</code> in <a href="/topic/28231">Unattended installs</a>. The installer fails with a non-zero exit code of its own; treat that, or a schema version still on the old value, as the failure:</p>
<pre><code class="language-sql">select value from hm_dbversion;
</code></pre>
<p dir="auto"><strong>Asking for help.</strong> Give the versions you started from, the step DBUpdater stopped on and the database's own error number; <a href="/topic/28185">Read this before you post</a> has the rest. Without a GitLab account, email the Service Desk address, <a href="mailto:contact-project+hmailserver-hmailserver-86730559-issue-@incoming.gitlab.com" rel="nofollow ugc">contact-project+hmailserver-hmailserver-86730559-issue-@incoming.gitlab.com</a>: GitLab files it as a confidential issue, and replies come by email.</p>
<h3><a class="anchor-offset" name="rolling-back-from-6.3.4"></a>Rolling back from 6.3.4</h3>
<ol>
<li><strong>Uninstall 6.3.4.</strong></li>
<li><strong>Restore the pre-upgrade database backup.</strong> This is the essential step: the schema is at 6104, and the release you go back to refuses it.</li>
<li><strong>Put the right <code>hMailServer.ini</code> in place before the older installer runs</strong>, because its <code>/Register</code> reads the file. Which file depends on whether 6.3.4 sealed the stored secrets, that is, whether a stored-secrets key was made:
<ul>
<li><strong>Sealed: restore the pre-upgrade <code>hMailServer.ini</code>.</strong> 6.3.4 writes the <code>[Settings]</code> secrets into the file as <code>HMK1:</code> envelopes, and an older server reads them as they are: its <code>/Register</code> hands <code>ServiceAccountPassword</code>'s envelope to Windows as the service account's password, and the service cannot log on. Its first moments also run SRS, BATV and OAuth2 on the envelopes.</li>
<li><strong>Not sealed: the 6.3.4 file can stay.</strong> Its <code>[Settings]</code> section is a complete copy of the stored settings, and an older server reads the file as the truth, so a setting changed after the upgrade survives, wherever the server could write the file, which a Linux package installation's unit does not allow. Delete the <code>[SettingsStore]</code> section, which older builds ignore. They ignore <code>[SettingsOverride]</code> too, so move any value only it supplied into <code>[Settings]</code>.</li>
</ul>
</li>
<li><strong>Check <code>PasswordPepper</code>.</strong> Since 6.3.4 it is kept in the file only, never sealed and in no backup 6.3.4 writes. The file the older server starts with must carry the value the hashes were made with: no pepper, or a different one, refuses every account hashed with Argon2id or scrypt. PBKDF2, the default, is not peppered.</li>
<li><strong>Install the release you came from.</strong></li>
<li><strong>Sealed, with no pre-upgrade file?</strong> Set <code>ServiceAccountPassword</code>, and any other of those secrets you use, again with the older version's Control Panel, then run <code>hMailServer.exe /Register</code> again.</li>
</ol>
<p dir="auto">The wiki's and the documentation's 18.6 reinstall before they restore the database; <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/Upgrading.md" rel="nofollow ugc">Upgrading.md</a> restores first. Follow <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/Upgrading.md" rel="nofollow ugc">Upgrading.md</a>: the older installer runs DBUpdater, which refuses a database newer than its own build, and its <code>/Register</code> reads the file.</p>
<p dir="auto"><strong>The data directory normally stays.</strong> <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/Upgrading.md" rel="nofollow ugc">Upgrading.md</a> and the wiki's 18.6 say it does not normally need restoring, because no upgrade step rewrites message files; the documentation's 18.6 says to restore it with <code>hMailServer.INI</code>. Left in place, mail that arrived after the backup exists on disk with no metadata row in the restored database, and is invisible. That is what a rollback costs.</p>
<h3><a class="anchor-offset" name="what-it-does-not-do"></a>What it does not do</h3>
<ul>
<li>The rollback above is the Windows one. Chapter 18 and <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/Upgrading.md" rel="nofollow ugc">Upgrading.md</a> give no package command for going back on Linux; the database rule is the same.</li>
<li>No backup carries a <code>[SettingsOverride]</code> value; it lives only in the file of the machine that has it.</li>
<li>Moving to another machine is not an upgrade: <a href="/topic/28194">Moving to new hardware</a>.</li>
</ul>
<h3><a class="anchor-offset" name="where-to-read-more"></a>Where to read more</h3>
<ul>
<li><a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Upgrading-hMailServer" rel="nofollow ugc">Upgrading hMailServer</a>, 18.5 and 18.6; the documentation's <a href="https://www.progressiverobot.com/hmailserver-documentation/#186-rolling-back" rel="nofollow ugc">18.6</a></li>
<li><a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/Upgrading.md" rel="nofollow ugc">Upgrading.md</a> and its wiki copy, <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Upgrading-Guide" rel="nofollow ugc">Upgrading Guide</a></li>
<li><a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/CHANGELOG.md" rel="nofollow ugc">CHANGELOG.md</a>, 6.3.4, and <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Changes-Since-6210" rel="nofollow ugc">Changes Since 6.2.10</a>, section 5</li>
<li><a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SecretsAtRest.md" rel="nofollow ugc">SecretsAtRest.md</a>, "Rolling back", and <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Settings-Overview" rel="nofollow ugc">Settings Overview</a></li>
<li><a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SetupChecklist.md" rel="nofollow ugc">SetupChecklist.md</a> and <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/AccountRecovery.md" rel="nofollow ugc">AccountRecovery.md</a>, for items 21 and 22</li>
<li><a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Troubleshooting" rel="nofollow ugc">Troubleshooting</a>, for a start that fails</li>
</ul>
]]></description><link>https://www.hmailserver.co.uk/topic/28235/upgrading-from-5.x-6.2-or-6.3-the-24-changes-without-a-switch-and-rolling-back</link><generator>RSS for Node</generator><lastBuildDate>Fri, 06 Nov 2026 09:05:55 GMT</lastBuildDate><atom:link href="https://www.hmailserver.co.uk/topic/28235.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Sep 2026 19:17:13 GMT</pubDate><ttl>60</ttl></channel></rss>