<?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[The update check and the live update: feed, verification, window and rollback]]></title><description><![CDATA[<p dir="auto"><em>Written for 6.3.4. hMailServer 6.3.6 (6 October 2026) is signed by the GitLab pipeline at the group path and installs by the live update from 6.3.4 or 6.3.5; from 6.3.6 the Control Panel installs an update with one click where the service is not an administrator, and on Linux a 6.3.4 or 6.3.5 server installs 6.3.6 with its package manager rather than by the live update, whose apply step on those versions is the one 6.3.6 fixes. See <a href="/topic/28276">the 6.3.6 announcement</a>. hMailServer 6.3.7 (17 October 2026), a security release signed at the same group path, was what the feed offered before 6.3.8: from 6.3.6 the live update installs it, with 6.3.6's file as its rollback image and no schema step between them; on Windows a service running as LocalSystem installs it itself, and under <code>NT SERVICE\hMailServer</code> an administrator presses <strong>Install update</strong> on the Control Panel's <em>Server status</em> page on the server, one Windows prompt; on Linux 6.3.6's own helper applies it to the generic packages and both AppImages, while a server from a per-distribution package upgrades with its package manager. From 6.3.4 or 6.3.5 what 6.3.6's notes said still holds, and a server whose <code>UpdateSigningIdentity</code>, <code>UpdateSigningIssuer</code> and <code>UpdateSourceRepository</code> still name the project's first path refuses 6.3.7 until the three are cleared, on 6.3.6 by deleting their lines from <code>[Settings]</code> in <code>hMailServer.ini</code> with an editor run as an administrator (on Linux <code>sudo hmailserver --set-setting &lt;name&gt;=</code>) and restarting the service. In 6.3.7's Control Panel, Updates is a page of its own under Maintenance. See <a href="/topic/28277">the 6.3.7 announcement</a>. hMailServer 6.3.8 (2 November 2026), a security release signed at the same group path, with the project's id, 86730559, in the certificate, is what the feed now offers: from 6.3.7 or 6.3.6 the live update installs it, with the running version's own file as its rollback image and no schema step between them, a service running as LocalSystem by itself and one under <code>NT SERVICE\hMailServer</code> by <strong>Install update</strong> on the server; from 6.3.4 or 6.3.5 what 6.3.7's notes said still holds; a server from one of 6.3.6's or 6.3.7's per-distribution packages is offered the generic package, which apt refuses on Debian 12 and dnf on Enterprise Linux 9, so upgrade it with its release's own package of 6.3.8; the three settings that name the project's first path refuse 6.3.8 too until they are cleared; and a server from 6.2.28 to 6.3.3, or from 6.3.3's AArch64 packages or AppImages, installs 6.3.8 by hand, once. See <a href="/topic/28278">the 6.3.8 announcement</a>.</em></p>
<p dir="auto">This topic covers the update check and the live update as 6.3.4 has them. <strong>The one thing to know first: no live update installs 6.3.4.</strong> It carries an Authenticode signature and no Sigstore bundle, so a server of any version that is offered it says it cannot be verified and downloads nothing. Every server installs 6.3.4 by hand, as <a href="/topic/28193">Upgrading to 6.3.4</a> describes. A server from 6.2.28 to 6.3.3 has a second reason to do it soon: its live update will refuse 6.3.5, the first release to be signed on GitLab.</p>
<h3><a class="anchor-offset" name="four-steps-and-where-each-is-done"></a>Four steps, and where each is done</h3>
<p dir="auto">Each step is separate and opt-in, and only applying runs anything.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Step</th>
<th>Control Panel (Windows)</th>
<th>REST</th>
<th>COM (Windows)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Check</td>
<td><strong>Check for updates</strong> on <em>Server status</em></td>
<td><code>POST /api/v1/update/check</code></td>
<td><code>Status.CheckForUpdate</code></td>
</tr>
<tr>
<td>Download and verify</td>
<td><strong>Download update</strong></td>
<td><code>POST /api/v1/update/download</code></td>
<td><code>Status.DownloadUpdate</code></td>
</tr>
<tr>
<td>Apply</td>
<td><strong>Install update</strong></td>
<td><code>POST /api/v1/update/install</code></td>
<td><code>Status.InstallUpdate</code></td>
</tr>
<tr>
<td>Read the verdict</td>
<td>the Server card of <em>Server status</em></td>
<td><code>GET /api/v1/update</code></td>
<td><code>Status.UpdateState</code>, <code>Status.AvailableVersion</code>, <code>Status.UpdateLastError</code>, <code>Status.UpdateApplyOutcome</code></td>
</tr>
</tbody>
</table>
<p dir="auto">The Control Deck's <strong>Update</strong> view does all four on either platform; on Linux there is no Control Panel and no COM. The state is 0 not checked, 1 up to date, 2 a newer release exists, 3 downloaded and verified, 4 installing, or 5 the last step failed (<code>lastError</code> says why). An on-demand check reads the feed whether or not the scheduled check is on. Starting an install from the Control Panel closes it, because the installer replaces its files.</p>
<h3><a class="anchor-offset" name="turning-the-check-on"></a>Turning the check on</h3>
<p dir="auto"><strong><code>UpdateCheckEnabled</code> is 0 by default</strong>, because a server must not call out to anyone until its administrator says it may. At 1 the server reads the feed at startup and then every <code>UpdateCheckHours</code> (24; below 1 is taken as 1, and the server sets no ceiling although the Control Panel's label says "1 to 168"). <code>UpdateChannel</code> is <code>stable</code> by default; <code>prerelease</code> makes pre-releases eligible.</p>
<p dir="auto"><strong>What it sends.</strong> A plain <code>GET</code> of the feed with nothing but the <code>User-Agent</code> the server always sends: no identifier, no configuration, no counts. Since 6.3.4 it no longer sends GitHub's <code>X-GitHub-Api-Version</code> header.</p>
<p dir="auto"><strong>Where the result shows.</strong> The application log, the Control Panel's <em>Server status</em> page, the Deck's <strong>Update</strong> view, COM, and <code>GET /api/v1/update</code>, which adds the release's page and date, the installer's address, size and digest, and the last apply's outcome.</p>
<p dir="auto"><strong>Setting the keys since 6.3.4.</strong> Use the <strong>Updates</strong> card of the Control Panel's <em>API &amp; monitoring</em> page (in 6.3.7 Updates is a page of its own under <em>Maintenance</em>, and Ctrl+K takes the old title to it), <code>PUT /api/v1/settings/ini/{name}</code> with <code>{"value": "..."}</code> (administrator password only), <code>hmctl ini set</code>, or on Linux <code>hmailserver --set-setting</code>; the Deck has no editor for these keys. Every key here applies when it is saved, but a value stored with <code>--set-setting</code> while the service runs reaches it only at its next save, reinitialise or restart. Do not edit the <code>[Settings]</code> lines in <code>hMailServer.ini</code>: the database is the settings store, and <a href="/topic/28222">Settings: when a save takes effect</a> explains what happens to a line edited in the file.</p>
<pre><code class="language-sh">curl -u Administrator:pw -X PUT -H "Content-Type: application/json" -d '{"value":"1"}' http://127.0.0.1:8443/api/v1/settings/ini/UpdateCheckEnabled
curl -u Administrator:pw -X POST http://127.0.0.1:8443/api/v1/update/check
</code></pre>
<h3><a class="anchor-offset" name="the-feed"></a>The feed</h3>
<p dir="auto">Since 6.3.4 a server reads <code>https://updates.progressiverobot.com</code> without being told: <code>/releases/latest</code>, the newest stable release, on the stable channel, and <code>/releases.json</code>, every release, on the pre-release channel. GitLab Pages serves it from the project's releases. For the rollback the server looks one release up at <code>/releases/tags/v&lt;version&gt;</code>. Every address a server builds is a file answered 200, and <strong>the server follows no redirect</strong>.</p>
<p dir="auto">A release has the shape of GitHub's Releases API, and each installer's Sigstore bundle is an asset of its own, named after its file with <code>.cosign.bundle</code> added. A download is held to the size and the <code>digest</code> the feed gives. <strong>Since 6.3.4, a version with a suffix</strong> (<code>6.3.5-rc1</code>, <code>6.3.5rc1</code>) is a pre-release whatever the feed's <code>prerelease</code> flag says, so the stable channel passes over it.</p>
<p dir="auto"><strong>A mirror.</strong> <code>UpdateFeedUrl</code> points the server at another feed, for a network without Internet access; empty is the built-in feed. It must be https unless it is on this machine. It may serve one release or a list, and the rollback's lookup keeps everything up to <code>/releases</code> of the value and adds <code>/tags/v&lt;version&gt;</code>, so the mirror answers that path too. <strong>A mirror changes where the server looks, not whom it trusts</strong>: every installer is still verified against the signers compiled in.</p>
<p dir="auto"><strong>Through a proxy.</strong> <code>HttpProxy=host:port</code> (or <code>[ipv6]:port</code>) sends every web request the server makes as a client through a forward proxy: the feed, the installer and its bundle, and the JWKS and token-introspection fetches of OAuth 2. An https address is tunnelled with <code>CONNECT</code>, and the certificate is verified against the real host. There is no place for credentials; a proxy that demands them refuses. A refusal reads <code>The proxy &lt;host:port&gt; refused CONNECT to &lt;host:port&gt;: &lt;its status line&gt;</code>, and a value without a port fails with <code>HttpProxy must be host:port (or [ipv6]:port).</code>, never quietly going direct. ACME and the outbound-relay OAuth2 token request do not use it.</p>
<h3><a class="anchor-offset" name="download-and-verification"></a>Download and verification</h3>
<p dir="auto"><strong>Download update</strong>, <code>POST /api/v1/update/download</code>, <code>Status.DownloadUpdate</code> or <code>UpdateAutoDownload=1</code> fetches the installer and its bundle into the data directory's <code>Updates</code> folder (<code>Data\Updates</code> on Windows; on Linux the file is the <code>.deb</code> or <code>.rpm</code> this server was installed from) and checks them without cosign and without the network:</p>
<ul>
<li>the file's SHA-256 is the one signed and the one the transparency log recorded;</li>
<li>the certificate chains to Sigstore's Fulcio authority at the moment the log recorded the signature;</li>
<li>the certificate is one of this project's signers, whole;</li>
<li>the signature verifies under the certificate's key, and the log vouches for the entry under its own key.</li>
</ul>
<p dir="auto">A file that fails is deleted, and the reason is in <code>Status.UpdateLastError</code> and the log. Nothing is run.</p>
<p dir="auto"><strong>The two signers, since 6.3.4.</strong> A certificate must match one entry whole.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th></th>
<th>The GitHub workflow</th>
<th>The GitLab CI pipeline</th>
</tr>
</thead>
<tbody>
<tr>
<td>Signs</td>
<td>Every release from 6.2.19 to 6.3.3</td>
<td>The releases from 6.3.5 on: 6.3.5 at the path the project began at, 6.3.6 and later at the group path <code>hmailserver/hmailserver</code></td>
</tr>
<tr>
<td>Identity begins</td>
<td><code>https://github.com/Progressiverobot/hmailserver/.github/workflows/sign-release.yml@</code></td>
<td><code>https://gitlab.com/Progressiverobot/hmailserver//.gitlab-ci.yml@refs/tags/v</code> for 6.3.5; from 6.3.6, <code>https://gitlab.com/hmailserver/hmailserver//.gitlab-ci.yml@refs/tags/v</code>, the path the project moved to on 29 September 2026</td>
</tr>
<tr>
<td>Issuer</td>
<td><code>https://token.actions.githubusercontent.com</code></td>
<td><code>https://gitlab.com</code></td>
</tr>
<tr>
<td>Repository id</td>
<td><code>1267388815</code>, required</td>
<td><code>86730559</code>, checked when the certificate carries one</td>
</tr>
<tr>
<td>Held to</td>
<td>Certificates issued before 18 September 2026, and releases up to 6.3.3</td>
<td>The tag the certificate names</td>
</tr>
</tbody>
</table>
<p dir="auto">The pipeline is also trusted at the path of the group <code>hmailserver</code> the project is to move to, where the id <code>86730559</code> is required whatever any setting says. <strong>A server from 6.2.28 to 6.3.3 trusts the GitHub workflow alone.</strong></p>
<p dir="auto"><strong>Further checks since 6.3.4.</strong> A file signed for one tag is refused as any other release. On Windows the installer's version resource must name the release it is installed as; on Linux the update helper installs nothing that is not an upgrade. On Windows only SYSTEM, the Administrators and the service's account may change the <code>Updates</code> folder; one that is a link, owned by anyone else or beyond repair is refused with <code>HM6894</code>, and nothing is downloaded or applied: delete it, and the server makes it again.</p>
<p dir="auto"><strong>Authenticode.</strong> <code>UpdateRequireAuthenticode=1</code> adds, on Windows only, a check that the installer carries an Authenticode signature Windows trusts (no revocation check, no publisher pin). The installers have been signed since 6.3.1; 1 refuses earlier ones. It is on top of the Sigstore check, which cannot be turned off.</p>
<p dir="auto"><strong>The trust settings</strong> <code>UpdateTrustRootsFile</code>, <code>UpdateLogPublicKeyFile</code>, <code>UpdateSigningIdentity</code>, <code>UpdateSigningIssuer</code> and <code>UpdateSourceRepository</code> are for a site that signs its own releases. Leave them empty; set, the last three replace their part of every signer.</p>
<h3><a class="anchor-offset" name="applying-an-update"></a>Applying an update</h3>
<p dir="auto">On Windows, <strong>Install update</strong>, <code>POST /api/v1/update/install</code>, <code>Status.InstallUpdate</code> or the unattended window does this, in order:</p>
<ol>
<li>Verifies the downloaded installer once more.</li>
<li>Fetches and verifies the running version's installer as a rollback image, where the feed still offers it.</li>
<li>Issues a single-use token for the database upgrade: 32 random bytes in a file only the machine's administrators can read, good for one hour and one use, given to the installer as <code>/upgradetoken=&lt;hex&gt;</code> in place of the administrator password.</li>
<li>Drains, since 6.3.4: the SMTP, IMAP, POP3 and ManageSieve listeners close at the socket, so senders retry, and the queue pauses. It refuses with <code>already draining</code> while somebody else's drain is in progress: leave it, or wait, and apply again.</li>
<li>Hands the installer to <code>hMailServer.Updater.exe</code>, copied from <code>Bin</code> into <code>Data\Updates</code> because the installer replaces <code>Bin</code>. The helper runs it silently, and only with the SHA-256 the server read; waits <code>UpdateServiceWaitSeconds</code> (180) for the service; and if it does not come back, reinstalls the previous version.</li>
<li>Reports the outcome: one line, in the log, <code>Status.UpdateApplyOutcome</code>, the status page and <code>GET /api/v1/update</code>; since 6.3.4, as soon as the service is back.</li>
</ol>
<p dir="auto">If the helper finishes without stopping the service, the server leaves the drain itself after ten minutes at most (<code>HM7151</code> when the helper wrote nothing); the helper's log is <code>apply-&lt;version&gt;.log</code> in the <code>Updates</code> folder. Set <code>ShutdownDrainSeconds</code> (30 is a reasonable figure) so the stop waits for what is in flight.</p>
<p dir="auto"><strong>What a rollback cannot do.</strong> It reinstalls the previous binaries; it cannot take the database back. When the new version had moved the schema and then failed to start, the previous version refuses the newer schema, and the outcome says so. Every release's notes say whether it moves the schema; before one that does, take a backup (<a href="/topic/28221">Backup and restore</a>). The rollback image is verified like any installer, and 6.3.4's has no bundle. <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/UpdateFeed.md" rel="nofollow ugc">UpdateFeed.md</a> does not say what a 6.3.4 server's first live update does about that, so plan it as one without a rollback image, and take a backup first. In the one case <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/UpdateFeed.md" rel="nofollow ugc">UpdateFeed.md</a> describes, an old server set to the GitLab signer (below), the install runs without a rollback image, the log says <code>no rollback image ... could be had</code>, and a new version that does not start has to be reinstalled by hand.</p>
<p dir="auto"><strong>Under <code>NT SERVICE\hMailServer</code></strong>, the account a new 6.3.4 installation on Windows runs as, the apply is refused before anything happens, before the rollback image and the drain: the installer needs an administrator. The update is still checked, downloaded and verified. REST, COM and the Deck say so, and tell an administrator to download the installer from the release page, check its Authenticode signature (<code>Get-AuthenticodeSignature</code> reports it <code>Valid</code>) and run it; never the copy in <code>Data\Updates</code>, which the service can write. An open unattended window logs <code>HM7463</code> once per process instead of taking a backup for nothing, and the setup checklist carries <code>update_apply_by_administrator</code> while the check is on. An upgraded installation that kept LocalSystem applies as before. <a href="/topic/28227">Installing on Windows</a> covers the account.</p>
<p dir="auto"><strong>On Linux</strong>, since 6.3.4, the service writes a request to <code>/run/hmailserver</code> and the root path unit <code>hmailserver-update.path</code> runs <code>/usr/lib/hmailserver/hmailserver-update</code>, which verifies the package and the rollback image again as root, installs, and rolls back when the service does not come back. No token is involved: the package's post-install step runs the schema upgrade. A server not under systemd is told so and left with the verified file to install by hand. <a href="/topic/28245">The hmailserver command line on Linux</a> has the helper in full. Linux builds from 6.3.0 to 6.3.3 answer <code>This build cannot apply an update</code>.</p>
<h3><a class="anchor-offset" name="unattended-updates"></a>Unattended updates</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Key</th>
<th>Default</th>
<th>What it does</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>UpdateAutoDownload</code></td>
<td>0</td>
<td>1 downloads and verifies a newer release's installer as soon as a check finds it</td>
</tr>
<tr>
<td><code>UpdateWindow</code></td>
<td>empty, never</td>
<td>When a verified update may be applied without a click</td>
</tr>
<tr>
<td><code>UpdateBackupBeforeApply</code></td>
<td>1</td>
<td>An unattended apply backs up to the configured backup destination first, and does not go ahead without a destination or when the backup fails</td>
</tr>
</tbody>
</table>
<p dir="auto"><code>UpdateWindow</code> takes <code>03:00</code> (every day from 03:00, for an hour), <code>Sun 03:00</code> or <code>Sat,Sun 02:00-05:00</code>: English three-letter days, local 24-hour times, and a range that crosses midnight belongs to the day it starts on. An unparsable value is logged once per process and nothing is applied. The backup covers the unattended path only, so take one yourself before an apply you start. Under <code>NT SERVICE\hMailServer</code> a window applies nothing (<code>HM7463</code>). On Linux:</p>
<pre><code class="language-sh">sudo hmailserver --set-setting UpdateCheckEnabled=1
sudo hmailserver --set-setting UpdateAutoDownload=1
sudo hmailserver --set-setting "UpdateWindow=Sun 03:00"
sudo systemctl restart hmailserver
</code></pre>
<h3><a class="anchor-offset" name="a-server-from-6.2.28-to-6.3.3"></a>A server from 6.2.28 to 6.3.3</h3>
<p dir="auto">These versions read GitHub's Releases API, which has answered 404 since GitHub suspended the project's account on 18 September 2026, so their check says <code>The update feed answered HTTP 404.</code> Nothing else breaks. Pointed at the new feed, such a server trusts the re-hosted releases up to 6.3.3, which carry GitHub's bundles, but its check now offers 6.3.8, the newest stable release, signed by the GitLab pipeline, which it cannot verify either: its live update installs nothing until 6.3.4 or later is installed by hand. It will also refuse 6.3.5 (<code>The certificate names https://gitlab.com/Progressiverobot/hmailserver//.gitlab-ci.yml@refs/tags/v..., not this repository's release workflow.</code>). These versions read <code>[Settings]</code> from the file, and a change needs a service restart.</p>
<ol>
<li><strong>Turn automatic download off.</strong> With <code>UpdateAutoDownload=1</code> such a server would download a GitLab-signed installer, about 80 MB, at every check and refuse it every time, because the verification comes after the download. Set it to 0.</li>
<li><strong>Point it at the feed</strong>, with exactly this line under <code>[Settings]</code> in <code>hMailServer.ini</code>, then restart the service:</li>
</ol>
<pre><code class="language-ini">[Settings]
UpdateFeedUrl=https://updates.progressiverobot.com/releases.json
</code></pre>
<p dir="auto">Without <code>.json</code> the address is a directory, answered with a redirect, and the check says <code>The update feed answered HTTP 302.</code> On Windows set it on the <strong>Updates</strong> card and let the Control Panel restart the service; or add it to <code>Bin\hMailServer.INI</code> as an administrator and run <code>net stop hMailServer</code> and <code>net start hMailServer</code> from an elevated prompt. On Linux:</p>
<pre><code class="language-sh">sudoedit /etc/hmailserver/hMailServer.ini     # add the line under [Settings]
sudo systemctl restart hmailserver
</code></pre>
<p dir="auto">An AppImage keeps it in <code>$HMAILSERVER_HOME/hMailServer.ini</code>, or else <code>$XDG_DATA_HOME/hmailserver/hMailServer.ini</code>, normally <code>~/.local/share/hmailserver/hMailServer.ini</code>; start it again after the edit.</p>
<ol start="3">
<li><strong>Check.</strong> The answer should be that the newest release, 6.3.8, is available. Still 404 means the service has not read the line: check the section, the spelling and the restart. <code>The update feed could not be read: ...</code> names what stopped it: no route out, a proxy (<code>HttpProxy</code>), or a certificate the machine does not trust.</li>
<li><strong>Install 6.3.4 by hand</strong>, following <a href="/topic/28193">Upgrading to 6.3.4</a>, with the backup <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/Upgrading.md" rel="nofollow ugc">Upgrading.md</a> describes. The service must have been restarted after your last <code>[Settings]</code> change, or 6.3.4's first start treats that change as an edit (<code>HM5804</code>) and undoes it. 6.3.4 and 6.3.5 had no AppImage and no AArch64 package; 6.3.6, 6.3.7 and 6.3.8 have both again, and such an installation takes the newest release's, 6.3.8's, by hand, once.</li>
<li><strong>Afterwards</strong>, 6.3.4 reads the new feed without being told and trusts both signers. The <code>UpdateFeedUrl</code> line can go, although leaving it changes nothing: clear it in the Control Panel, with <code>DELETE /api/v1/settings/ini/UpdateFeedUrl</code>, or on Linux with <code>hmailserver --set-setting UpdateFeedUrl=</code>, not in the file. Turn <code>UpdateAutoDownload</code> back on if you want it.</li>
</ol>
<p dir="auto"><strong>The other way, Windows only.</strong> <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/UpdateFeed.md" rel="nofollow ugc">UpdateFeed.md</a> gives values for <code>UpdateSigningIdentity</code>, <code>UpdateSigningIssuer</code> and <code>UpdateSourceRepository</code> that let such a server install a GitLab-signed release. While set, they make it refuse every GitHub-signed release, its own rollback image included; they are proved only once a GitLab-signed release exists; and they must stay set until the new version runs, then be cleared as step 5 clears <code>UpdateFeedUrl</code>, or the new version refuses what is signed after the project's move. <strong>Never point them at the group's path</strong>: an old server checks no repository id. Installing 6.3.4 by hand avoids all of this.</p>
<h3><a class="anchor-offset" name="the-download-links-and-checking-a-file-by-hand"></a>The download links, and checking a file by hand</h3>
<p dir="auto"><code>https://updates.progressiverobot.com/download/&lt;name&gt;</code> always leads to a file of the newest stable release, never a pre-release, and <code>/download/</code> to that release's page. GitLab's own <code>/-/releases/permalink/latest</code> follows the release published last, a pre-release included. A server does not read these links.</p>
<p dir="auto"><code>&lt;name&gt;</code> is a file's name without its version: <code>hMailServer-x64.exe</code>, <code>hMailServer-arm64.exe</code>, <code>hmailserver_amd64.deb</code>, <code>hmailserver_arm64.deb</code>, <code>hmailserver.x86_64.rpm</code>, <code>hmailserver.aarch64.rpm</code>, <code>hMailServer-x86_64.AppImage</code> and <code>hMailServer-aarch64.AppImage</code>, each with its bundle at the same name plus <code>.cosign.bundle</code>. A name the release does not carry answers 404, never another release's file. 6.3.4 carries the x64 installer, the amd64 <code>.deb</code> and the x86-64 <code>.rpm</code>, and no bundle.</p>
<p dir="auto"><strong>Checking 6.3.4.</strong> With no bundle to check, 6.3.4 is checked by <code>hmailserver-6.3.4-SHA256SUMS.txt</code>, whose signature <code>hmailserver-6.3.4-SHA256SUMS.txt.sig</code> is made with the key that signs the release tags, and on Windows by the installer's Authenticode signature, which <code>Get-AuthenticodeSignature</code> should answer <code>Valid</code>, signed by Progressive Robot Ltd. <a href="/topic/28218">The 6.3.4 announcement</a> has the commands and what each must answer.</p>
<p dir="auto"><strong>Other releases.</strong> Up to 6.3.3, <code>cosign verify-blob</code> checks a file against its bundle and the GitHub identity (<em>Verifying a release</em> in the Security Policy). From 6.3.5 a release has no <code>.sig</code>; its files are signed with Sigstore, and on Linux <code>hmailserver --verify-update &lt;file&gt;</code> checks a download the way the server does.</p>
<h3><a class="anchor-offset" name="what-it-does-not-do"></a>What it does not do</h3>
<ul>
<li>It does not install 6.3.4, and does not apply under <code>NT SERVICE\hMailServer</code>.</li>
<li>A rollback does not take the database back; a backup does.</li>
<li>It follows no redirect and sends no proxy credentials.</li>
<li>It does not drain a warm-standby pair: the drain is per process, so a pair drains one node at a time (<a href="/topic/28232">Warm standby and high availability</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/-/blob/v6.3.4/hmailserver/docs/UpdateFeed.md" rel="nofollow ugc">UpdateFeed.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/ServiceAccount.md" rel="nofollow ugc">ServiceAccount.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/Upgrading.md" rel="nofollow ugc">Upgrading.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SettingsApply.md" rel="nofollow ugc">SettingsApply.md</a>, and the <em>Update check</em> section of the <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/README.md" rel="nofollow ugc">README</a>.</li>
<li>On the wiki: <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Upgrading-hMailServer" rel="nofollow ugc">Upgrading hMailServer</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Settings-Reference" rel="nofollow ugc">Settings Reference</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/The-REST-API" rel="nofollow ugc">The REST API</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Security-Policy" rel="nofollow ugc">Security Policy</a> and <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Installing-on-Linux" rel="nofollow ugc">Installing on Linux</a>.</li>
<li>The documentation page: <a href="https://www.progressiverobot.com/hmailserver-documentation/#187-staying-up-to-date" rel="nofollow ugc">Staying up to date</a> and <a href="https://www.progressiverobot.com/hmailserver-documentation/#self-update" rel="nofollow ugc">Self-update</a>.</li>
<li>On the forum: <a href="/topic/28193">Upgrading to 6.3.4</a>; <a href="/topic/28235">Upgrading from 5.x, 6.2 or 6.3</a>, for what 6.3.4 changes and rolling back by hand; and <a href="/topic/28192">The Control Deck</a>.</li>
<li>Without a GitLab account, a question or a bug can go to the project's Service Desk, <code>contact-project+hmailserver-hmailserver-86730559-issue-@incoming.gitlab.com</code>. A suspected vulnerability goes only by the routes of <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/SECURITY.md" rel="nofollow ugc">SECURITY.md</a>: a <a href="https://gitlab.com/hmailserver/hmailserver/-/issues/new?issue%5Bconfidential%5D=true" rel="nofollow ugc">confidential GitLab issue</a> or that same address, which GitLab files as a confidential issue.</li>
</ul>
]]></description><link>https://www.hmailserver.co.uk/topic/28234/the-update-check-and-the-live-update-feed-verification-window-and-rollback</link><generator>RSS for Node</generator><lastBuildDate>Fri, 06 Nov 2026 09:05:54 GMT</lastBuildDate><atom:link href="https://www.hmailserver.co.uk/topic/28234.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Sep 2026 19:16:13 GMT</pubDate><ttl>60</ttl></channel></rss>