<feed xmlns='http://www.w3.org/2005/Atom'>
<title>guix/gnu/machine, branch master</title>
<subtitle>Transactional package manager, declarative GNU/Linux distribution, reproducible deployment tool, and more! https://guix.gnu.org</subtitle>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/'/>
<entry>
<title>machine: Dynamically retrieve the base server image name.</title>
<updated>2026-05-23T04:29:15+00:00</updated>
<author>
<name>Maxim Cournoyer</name>
<email>maxim@guixotic.coop</email>
</author>
<published>2026-05-01T14:38:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=f98c00ab749e6b82e56a4a34d0789496451cbc59'/>
<id>f98c00ab749e6b82e56a4a34d0789496451cbc59</id>
<content type='text'>
Query the API to find the latest Debian image to deploy the base system with.

* gnu/machine/hetzner/http.scm (null-or): New procedure.
(&lt;hetzner-image&gt;): New JSON record type.
(&lt;hetzner-image-created-from&gt;): Likewise.
(&lt;hetzner-image-protection&gt;): Likewise.
(%hetzner-default-server-image): Change simple variable to a memoized
procedure.
(hetzner-api-server-create): Adjust user accordingly.
(hetzner-api-images): New procedure.

Change-Id: I9544708c878971a2c776c80b9a4ee06078d5ce61
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Query the API to find the latest Debian image to deploy the base system with.

* gnu/machine/hetzner/http.scm (null-or): New procedure.
(&lt;hetzner-image&gt;): New JSON record type.
(&lt;hetzner-image-created-from&gt;): Likewise.
(&lt;hetzner-image-protection&gt;): Likewise.
(%hetzner-default-server-image): Change simple variable to a memoized
procedure.
(hetzner-api-server-create): Adjust user accordingly.
(hetzner-api-images): New procedure.

Change-Id: I9544708c878971a2c776c80b9a4ee06078d5ce61
</pre>
</div>
</content>
</entry>
<entry>
<title>machine: hetzner: Fix initial deploy when ssh-key is #f.</title>
<updated>2026-05-23T04:21:16+00:00</updated>
<author>
<name>Maxim Cournoyer</name>
<email>maxim@guixotic.coop</email>
</author>
<published>2026-04-30T06:28:44+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=3777bf133e00d9ef685e463e51a1fb0350ffb056'/>
<id>3777bf133e00d9ef685e463e51a1fb0350ffb056</id>
<content type='text'>
This fixes a regression introduced in commit a2ef2bcbfd7 ("machine: hetzner:
Allow connections using ssh-agent"), where having no ssh-key would cause the
early Hetzner provisioning to fail due to the lack of SSH authentication.

* gnu/machine/hetzner.scm (%hetzner-ssh-key-file): New parameter.
(&lt;hetzner-configuration&gt;) [ssh-public-key]: Compute default according to the
value of the private ssh-key field.  Introduce an indirection via...
(hetzner-configuration-ssh-public-key): ... this new procedure, to honor
%hetzner-ssh-key-file.
(hetzner-configuration-ssh-key): Likewise for the private ssh-key.
(hetzner-configuration-ssh-key-fingerprint): Rename to...
(public-key-&gt;fingerprint): ... this, taking just the public key as argument.
Update doc.
(hetzner-configuration-ssh-key-public): Rename to...
(public-key-&gt;string-with-type): ...this, for clarity, and accept just a
public-key object.  Update doc.
(hetzner-machine-ssh-key): Exit early with #f when no ssh key is provided.
(temporary-ssh-key-file): New procedure.
(hetzner-machine-ssh-key-create): Assert a public key is defined.  Adjust
calls to renamed procedures, and adjust for the `hetzner-api-server-create'
API change.
(hetzner-machine-enable-rescue-system): Refine doc and fix code path when
ssh-key is #f.
(hetzner-machine-rescue-install-os): Document.
(hetzner-machine-provision): Refine doc. Remove extraneous sleep and #:unwind
argument. Limit ssh-session dynamic scope to where it's needed.
(cleanup-temporary-ssh-key/maybe): New procedure.
(deploy-hetzner): Create and use a temporary SSH key when none is defined, and
clean it up when done or on errors.
* gnu/machine/hetzner/http.scm (hetzner-api-server-create): Make ssh-keys a
keyword argument, and fix execution when it's #f.
(hetzner-api-server-enable-rescue-system): Likewise.
* tests/machine/hetzner.scm ("deploy-machine-mock-with-unprovisioned-server"):
Adjust test.
* tests/machine/hetzner/http.scm (create-server)
("hetzner-api-server-create-unit")
("hetzner-api-server-enable-rescue-system-unit")
("hetzner-api-actions-integration")
("hetzner-api-server-enable-rescue-system-integration"): Likewise.
* doc/guix.texi (Invoking guix deploy): Precise what happens when 'ssh-key' is
 #f in hetzner-configuration, and suggest declaratively authorizing your SSH
key.

Change-Id: I812b348fb553f3b5aebd0bf66850c6ecb9e06653
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This fixes a regression introduced in commit a2ef2bcbfd7 ("machine: hetzner:
Allow connections using ssh-agent"), where having no ssh-key would cause the
early Hetzner provisioning to fail due to the lack of SSH authentication.

* gnu/machine/hetzner.scm (%hetzner-ssh-key-file): New parameter.
(&lt;hetzner-configuration&gt;) [ssh-public-key]: Compute default according to the
value of the private ssh-key field.  Introduce an indirection via...
(hetzner-configuration-ssh-public-key): ... this new procedure, to honor
%hetzner-ssh-key-file.
(hetzner-configuration-ssh-key): Likewise for the private ssh-key.
(hetzner-configuration-ssh-key-fingerprint): Rename to...
(public-key-&gt;fingerprint): ... this, taking just the public key as argument.
Update doc.
(hetzner-configuration-ssh-key-public): Rename to...
(public-key-&gt;string-with-type): ...this, for clarity, and accept just a
public-key object.  Update doc.
(hetzner-machine-ssh-key): Exit early with #f when no ssh key is provided.
(temporary-ssh-key-file): New procedure.
(hetzner-machine-ssh-key-create): Assert a public key is defined.  Adjust
calls to renamed procedures, and adjust for the `hetzner-api-server-create'
API change.
(hetzner-machine-enable-rescue-system): Refine doc and fix code path when
ssh-key is #f.
(hetzner-machine-rescue-install-os): Document.
(hetzner-machine-provision): Refine doc. Remove extraneous sleep and #:unwind
argument. Limit ssh-session dynamic scope to where it's needed.
(cleanup-temporary-ssh-key/maybe): New procedure.
(deploy-hetzner): Create and use a temporary SSH key when none is defined, and
clean it up when done or on errors.
* gnu/machine/hetzner/http.scm (hetzner-api-server-create): Make ssh-keys a
keyword argument, and fix execution when it's #f.
(hetzner-api-server-enable-rescue-system): Likewise.
* tests/machine/hetzner.scm ("deploy-machine-mock-with-unprovisioned-server"):
Adjust test.
* tests/machine/hetzner/http.scm (create-server)
("hetzner-api-server-create-unit")
("hetzner-api-server-enable-rescue-system-unit")
("hetzner-api-actions-integration")
("hetzner-api-server-enable-rescue-system-integration"): Likewise.
* doc/guix.texi (Invoking guix deploy): Precise what happens when 'ssh-key' is
 #f in hetzner-configuration, and suggest declaratively authorizing your SSH
key.

Change-Id: I812b348fb553f3b5aebd0bf66850c6ecb9e06653
</pre>
</div>
</content>
</entry>
<entry>
<title>machine: hetzner: Allow providing the SSH user.</title>
<updated>2026-05-23T04:21:16+00:00</updated>
<author>
<name>Maxim Cournoyer</name>
<email>maxim@guixotic.coop</email>
</author>
<published>2026-05-10T08:03:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=6e7d100ee39bdfdb2ad350633c34bcd2dc4ca73a'/>
<id>6e7d100ee39bdfdb2ad350633c34bcd2dc4ca73a</id>
<content type='text'>
* gnu/machine/hetzner.scm (&lt;hetzner-configuration&gt;)
[user]: New field.
(hetzner-machine-delegate): Use match-record to bind the field values; honor
user.
* doc/guix.texi (Invoking guix deploy): Document it.

Fixes: #8493
Change-Id: I026828c508ea936523fe864e2646ab9e3a1329c4
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* gnu/machine/hetzner.scm (&lt;hetzner-configuration&gt;)
[user]: New field.
(hetzner-machine-delegate): Use match-record to bind the field values; honor
user.
* doc/guix.texi (Invoking guix deploy): Document it.

Fixes: #8493
Change-Id: I026828c508ea936523fe864e2646ab9e3a1329c4
</pre>
</div>
</content>
</entry>
<entry>
<title>machine: hetzner: Introduce the `make-hetzner-os' procedure.</title>
<updated>2026-05-19T05:15:27+00:00</updated>
<author>
<name>Maxim Cournoyer</name>
<email>maxim@guixotic.coop</email>
</author>
<published>2026-05-11T01:27:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=b5e047ff9b400585cff590b7ee2f1629b24f6148'/>
<id>b5e047ff9b400585cff590b7ee2f1629b24f6148</id>
<content type='text'>
All the performance and general purpose newer x86 Hetzner server types like
the 'cpx22' now require an EFI bootloader, while older ones like the 'cx23'
still expect a BIOS bootloader.

Instead of exposing the user to errors when selecting the correct operating
system template to use, provide a procedure that takes returning one based on
the server type name.

* gnu/machine/hetzner.scm (%hetzner-os-arm): Rename to...
(%hetzner-os-arm/efi): ... this.  Adjust for variable name change.
(%hetzner-os-x86): Rename to...
(%hetzner-os-x86/bios): ... this.  Adjust for variable name change.
(%hetzner-os-x86/efi): New variable.
(server-type-name-&gt;arch, server-type-name-&gt;bootloader)
(make-hetzner-os): New procedures.
(%hetzner-os-x86, %hetzner-os-x86): Deprecate variables.
(hetzner-machine-bootstrap-os-form): Use the server type name to infer whether
the EFI or BIOS bootloader should be used, along the EFI partition.
* doc/guix.texi (Invoking guix deploy): Updated doc.

Fixes: #8523
Change-Id: I331a76e12bb3c19f5664dcbe4437a8d1cfe1d363
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
All the performance and general purpose newer x86 Hetzner server types like
the 'cpx22' now require an EFI bootloader, while older ones like the 'cx23'
still expect a BIOS bootloader.

Instead of exposing the user to errors when selecting the correct operating
system template to use, provide a procedure that takes returning one based on
the server type name.

* gnu/machine/hetzner.scm (%hetzner-os-arm): Rename to...
(%hetzner-os-arm/efi): ... this.  Adjust for variable name change.
(%hetzner-os-x86): Rename to...
(%hetzner-os-x86/bios): ... this.  Adjust for variable name change.
(%hetzner-os-x86/efi): New variable.
(server-type-name-&gt;arch, server-type-name-&gt;bootloader)
(make-hetzner-os): New procedures.
(%hetzner-os-x86, %hetzner-os-x86): Deprecate variables.
(hetzner-machine-bootstrap-os-form): Use the server type name to infer whether
the EFI or BIOS bootloader should be used, along the EFI partition.
* doc/guix.texi (Invoking guix deploy): Updated doc.

Fixes: #8523
Change-Id: I331a76e12bb3c19f5664dcbe4437a8d1cfe1d363
</pre>
</div>
</content>
</entry>
<entry>
<title>machine: hetzner: Refine installation with bind mount in rescue.</title>
<updated>2026-05-11T11:31:36+00:00</updated>
<author>
<name>Maxim Cournoyer</name>
<email>maxim@guixotic.coop</email>
</author>
<published>2026-05-07T08:34:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=54e92a3c0553b212b1462df1dbc3f35f47356824'/>
<id>54e92a3c0553b212b1462df1dbc3f35f47356824</id>
<content type='text'>
This reverts commit 3e1befe1d8e ("machine: hetzner: Fix deployment."),
adopting a simpler/correct alternative.

* gnu/machine/hetzner.scm (hetzner-machine-rescue-install-os): Bind mount
/gnu, not /gnu/store.

Change-Id: I09ffb4db8a39b4bcd5e7645aee63427c6bc969a0
Suggested-by: Rutherther &lt;rutherther@ditigal.xyz&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This reverts commit 3e1befe1d8e ("machine: hetzner: Fix deployment."),
adopting a simpler/correct alternative.

* gnu/machine/hetzner.scm (hetzner-machine-rescue-install-os): Bind mount
/gnu, not /gnu/store.

Change-Id: I09ffb4db8a39b4bcd5e7645aee63427c6bc969a0
Suggested-by: Rutherther &lt;rutherther@ditigal.xyz&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>machine: hetzner: Use dhcpcd-service-type.</title>
<updated>2026-05-05T14:48:45+00:00</updated>
<author>
<name>Sören Tempel</name>
<email>soeren+git@soeren-tempel.net</email>
</author>
<published>2026-03-18T14:47:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=1d855b34f65f747a979199f64b5e5fbf159f427f'/>
<id>1d855b34f65f747a979199f64b5e5fbf159f427f</id>
<content type='text'>
Guix 1.5.0 supports dhcpcd-service-type; therefore, (assuming hetzner
already has a Guix 1.5.0 image), it should no longer be necessary to
use dhcp-client-service-type here.  This is one of the few remaining
users of dhcp-client-service-type changing this here will allow to
remove this deprecated service in a future pull request.

* gnu/machine/hetzner.scm (hetzner-machine-bootstrap-os-form): Use
dhcpcd-service-type.

Signed-off-by: Maxim Cournoyer &lt;maxim@guixotic.coop&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Guix 1.5.0 supports dhcpcd-service-type; therefore, (assuming hetzner
already has a Guix 1.5.0 image), it should no longer be necessary to
use dhcp-client-service-type here.  This is one of the few remaining
users of dhcp-client-service-type changing this here will allow to
remove this deprecated service in a future pull request.

* gnu/machine/hetzner.scm (hetzner-machine-bootstrap-os-form): Use
dhcpcd-service-type.

Signed-off-by: Maxim Cournoyer &lt;maxim@guixotic.coop&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>machine: hetzner: Fix default value for hetzner-configuration-delete?</title>
<updated>2026-05-05T14:48:45+00:00</updated>
<author>
<name>Maxim Cournoyer</name>
<email>maxim@guixotic.coop</email>
</author>
<published>2026-05-05T03:35:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=3b05b9d7ac01d7b8f9d5629f27ea742cb825c99c'/>
<id>3b05b9d7ac01d7b8f9d5629f27ea742cb825c99c</id>
<content type='text'>
 #f is to keep the failed provisioned server intact for debugging. The
documented default is #t, so adjust the code accordingly.

* gnu/machine/hetzner.scm (&lt;hetzner-configuration&gt;)
[delete?]: Change default to #t to match documentation.

Change-Id: Iabee105cbf5f5e31e8a8f5cb5db99439a168f174
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
 #f is to keep the failed provisioned server intact for debugging. The
documented default is #t, so adjust the code accordingly.

* gnu/machine/hetzner.scm (&lt;hetzner-configuration&gt;)
[delete?]: Change default to #t to match documentation.

Change-Id: Iabee105cbf5f5e31e8a8f5cb5db99439a168f174
</pre>
</div>
</content>
</entry>
<entry>
<title>machine: hetzner: Fix deployment.</title>
<updated>2026-05-05T14:48:44+00:00</updated>
<author>
<name>Gábor Udvari</name>
<email>mail@gaborudvari.com</email>
</author>
<published>2026-04-24T20:56:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=3e1befe1d8e3e1fae38abd8b5f89db2cd764372b'/>
<id>3e1befe1d8e3e1fae38abd8b5f89db2cd764372b</id>
<content type='text'>
* gnu/machine/hetzner.scm (hetzner)
[hetzner-machine-rescue-install-os]: Fix deployment.

Reported-by: Sylvain Bellemare (https://codeberg.org/gluonix)
Fixes: #6585
Change-Id: Ie16ee541ad5b81d5014b825ad0e35deddd2e497e
Signed-off-by: Maxim Cournoyer &lt;maxim@guixotic.coop&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* gnu/machine/hetzner.scm (hetzner)
[hetzner-machine-rescue-install-os]: Fix deployment.

Reported-by: Sylvain Bellemare (https://codeberg.org/gluonix)
Fixes: #6585
Change-Id: Ie16ee541ad5b81d5014b825ad0e35deddd2e497e
Signed-off-by: Maxim Cournoyer &lt;maxim@guixotic.coop&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>services, tests: Refer to inherited field values where applicable.</title>
<updated>2026-03-20T12:27:16+00:00</updated>
<author>
<name>Ludovic Courtès</name>
<email>ludo@gnu.org</email>
</author>
<published>2026-03-19T17:46:45+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=72e724cef438a7e16052dd1a38bf03027635f2bc'/>
<id>72e724cef438a7e16052dd1a38bf03027635f2bc</id>
<content type='text'>
* gnu/machine/hetzner.scm (operating-system-authorize): Refer to ‘services’
instead of calling ‘operating-system-user-services’.
* gnu/services/virtualization.scm (secret-service-operating-system): Likewise.
* gnu/tests.scm (operating-system-with-console-syslog): Likewise.
* gnu/tests/avahi.scm (%avahi-os): Likewise.
* gnu/tests/base.scm (%test-guix-daemon-unprivileged): Likewise.
* gnu/tests/nfs.scm (%nfs-os): Likewise.
(run-nfs-full-test): Likewise.
* gnu/system/vm.scm (virtualized-operating-system): Refer to ‘initrd-modules’
instead of calling ‘operating-system-initrd-modules’.

Change-Id: I00c5f5c1e171b174bf0ca709b2dbd13a2fe161b5
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* gnu/machine/hetzner.scm (operating-system-authorize): Refer to ‘services’
instead of calling ‘operating-system-user-services’.
* gnu/services/virtualization.scm (secret-service-operating-system): Likewise.
* gnu/tests.scm (operating-system-with-console-syslog): Likewise.
* gnu/tests/avahi.scm (%avahi-os): Likewise.
* gnu/tests/base.scm (%test-guix-daemon-unprivileged): Likewise.
* gnu/tests/nfs.scm (%nfs-os): Likewise.
(run-nfs-full-test): Likewise.
* gnu/system/vm.scm (virtualized-operating-system): Refer to ‘initrd-modules’
instead of calling ‘operating-system-initrd-modules’.

Change-Id: I00c5f5c1e171b174bf0ca709b2dbd13a2fe161b5
</pre>
</div>
</content>
</entry>
<entry>
<title>gnu: hetzner: Fix deploy on hetzner</title>
<updated>2025-11-24T22:22:52+00:00</updated>
<author>
<name>Ashish SHUKLA</name>
<email>ashish.is@lostca.se</email>
</author>
<published>2025-11-16T22:08:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=5e63c9bdb1bf7114d742ba4c07596932e0124188'/>
<id>5e63c9bdb1bf7114d742ba4c07596932e0124188</id>
<content type='text'>
* gnu/machine/hetzner.scm (hetzner-machine-rescue-install-packages): Install
uidmap package too.

Change-Id: I86f638bc65d42cb4e26381cd91140cd92bc90b18
Signed-off-by: Ludovic Courtès &lt;ludo@gnu.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* gnu/machine/hetzner.scm (hetzner-machine-rescue-install-packages): Install
uidmap package too.

Change-Id: I86f638bc65d42cb4e26381cd91140cd92bc90b18
Signed-off-by: Ludovic Courtès &lt;ludo@gnu.org&gt;
</pre>
</div>
</content>
</entry>
</feed>
