-
released this
2025-10-17 08:28:30 +02:00 | 133 commits to main since this release📅 Originally published on GitHub: Fri, 17 Oct 2025 07:24:08 GMT
🏷️ Git tag created: Fri, 17 Oct 2025 06:28:30 GMTMinimum supported Tailscale client version: v1.64.0
Database integrity improvements
This release includes a significant database migration that addresses
longstanding issues with the database schema and data integrity that has
accumulated over the years. The migration introduces aschema.sqlfile as the
source of truth for the expected database schema to ensure new migrations that
will cause divergence does not occur again.These issues arose from a combination of factors discovered over time: SQLite
foreign keys not being enforced for many early versions, all migrations being
run in one large function until version 0.23.0, and inconsistent use of GORM's
AutoMigrate feature. Moving forward, all new migrations will be explicit SQL
operations rather than relying on GORM AutoMigrate, and foreign keys will be
enforced throughout the migration process.We are only improving SQLite databases with this change - PostgreSQL databases
are not affected.Please read the PR description for more technical details about the issues and solutions.
SQLite Database Backup Example:
# Stop headscale systemctl stop headscale # Backup sqlite database cp /var/lib/headscale/db.sqlite /var/lib/headscale/db.sqlite.backup # Backup sqlite WAL/SHM files (if they exist) cp /var/lib/headscale/db.sqlite-wal /var/lib/headscale/db.sqlite-wal.backup cp /var/lib/headscale/db.sqlite-shm /var/lib/headscale/db.sqlite-shm.backup # Start headscale (migration will run automatically) systemctl start headscaleDERPMap update frequency
The default DERPMap update frequency has been changed from 24 hours to 3 hours.
If you set thederp.update_frequencyconfiguration option, it is recommended
to change it to3hto ensure that the headscale instance gets the latest
DERPMap updates when upstream is changed.Autogroups
This release adds support for the three missing autogroups:
self
(experimental),member, andtagged. Please refer to the
documentation for a detailed
explanation.autogroup:selfis marked as experimental and should be used with caution, but
we need help testing it. Experimental here means two things; first, generating
the packet filter from policies that useautogroup:selfis very expensive, and
it might perform, or straight up not work on Headscale installations with a
large number of nodes. Second, the implementation might have bugs or edge cases
we are not aware of, meaning that nodes or users might gain more access than
expected. Please report bugs.Node store (in memory database)
Under the hood, we have added a new datastructure to store nodes in memory. This
datastructure is calledNodeStoreand aims to reduce the reading and writing
of nodes to the database layer. We have not benchmarked it, but expect it to
improve performance for read heavy workloads. We think of it as, "worst case" we
have moved the bottle neck somewhere else, and "best case" we should see a good
improvement in compute resource usage at the expense of memory usage. We are
quite excited for this change and think it will make it easier for us to improve
the code base over time and make it more correct and efficient.BREAKING
- Remove support for 32-bit binaries
#2692 - Policy: Zero or empty destination port is no longer allowed
#2606
Changes
- Database schema migration improvements for SQLite
#2617- IMPORTANT: Backup your SQLite database before upgrading
- Introduces safer table renaming migration strategy
- Addresses longstanding database integrity issues
- Add flag to directly manipulate the policy in the database
#2765 - DERPmap update frequency default changed from 24h to 3h
#2741 - DERPmap update mechanism has been improved with retry, and is now failing
conservatively, preserving the old map upon failure.
#2741 - Add support for
autogroup:member,autogroup:tagged
#2572 - Fix bug where return routes were being removed by policy
#2767 - Remove policy v1 code #2600
- Refactor Debian/Ubuntu packaging and drop support for Ubuntu 20.04.
#2614 - Remove redundant check regarding
noiseconfig
#2658 - Refactor OpenID Connect documentation
#2625 - Don't crash if config file is missing
#2656 - Adds
/robots.txtendpoint to avoid crawlers
#2643 - OIDC: Use group claim from UserInfo
#2663 - OIDC: Update user with claims from UserInfo before comparing with allowed
groups, email and domain
#2663 - Policy will now reject invalid fields, making it easier to spot spelling
errors #2764 - Add FAQ entry on how to recover from an invalid policy in the database
#2776 - EXPERIMENTAL: Add support for
autogroup:self
#2789 - Add healthcheck command #2659
Changelog
0512f7c57e.github/ISSUE_TEMPLATE: add node number to environment05996a5048.github/workflow: only run a few selected postgres testsf6c4b338fd.github/workflows: add generate check5ba7120418.github/workflows: prettier4a8d2d9ed3.github/workflows: reduce integration retry to 37f8b14f6f3.github/workflows: remove integration retrye949859d33Add DERP docsbd35fcf338Add FAQ entry about policy migration in the database30d12dafedAdd FAQ entry about the recommended upgrade pathbcd80ee773Add debugging and troubleshooting guide76ca7a2b50Add headscale-console98fc0563acBump version in docs33e9e7a71fCLAUDE: split into agents3f72ee9de8Clarify SIGHUP log message (#2661)51c6367bb1Correctly document the default for dns.override_local_dns2f3c365b68Describe how to remove a DERP region49b3468845Do not ignore config-example.ymlc15aa541bbDocument HEADSCALE_CONFIGb50e10a1beDocument breaking change for dns.override_local_dns30cec3aa2bDocument ports in usec04e17d82eDocument valid log levelscd704570beDrop support for Ubuntu 20.0443c9c50af4Drop syslog.target and systemd-managed /var/runbe337c6a33Enable derp.server.verify_clients by defaulte73b2a9fb9Ensure that a username starts with a letter (#2635)fa619ea9f3Fix CHANGELOG for autogroup:member and autogroup:tagged (#2733)086fcad7d9Fix Internal server error on /verify (#2735)bad783321eFix/machine/mapendpoint vulnerability (#2642)46c59a3fffFix command in bug report templatea8f2eebf66Fix config param name in TLS doce7fe645be5Fix invocation of golangci-lint (#2703)3123d5286bFix typos4e6d42d5bdKeycloak's group format is configurable30a1f7e68eLog registrationID to simplify interactive node registration2d680b5ebbMisc typos and spelling5d8a2c25eaOIDC: Query userinfo endpoint before verifying user4a941a2cb4Refactor Debian/Ubuntu packaged461db3abdRefactor OpenID Connect documentationa2a6d20218Refactor to use reflect.TypeFor8ff5baadbeRefresh OIDC docsb8044c29ddReplace magic-nix-cache-action (#2575)a98d9bd05fThe preauthkeys commands expect a user id instead of a username881a6b9227The sequential prefix allocation uses a best-effort approach3fbde7a1b6Update official.md860a8a597fUpdate tools.md4d61da30d0Use an IPv4 address range suitable for documentationc6427aa296Use group id instead of group name for Entra IDc07cc491bfadd health command (#2659)7fce5065c4all: remove 32 bit support (#2692)73023c2ec3all: use immutable node view in read pathd41fb4d540app: fix sigint hanging8e25f7f9ddbunch of qol (#2748)4668e5dd96changelog: add entry for dbe7a28a14afchangelog: prepare for 0.27.0 (#2797)d29feaef79chore(derp): allow nil regions in DERPMaps630bfd265achore(derp): prioritize loading DERP maps from URLs022098fe4echore: make reg cache expiry tunable081af2674bci: fix golangci-lint flag for v2 compatibility (#2654)3950f8f171cli: use gobuild version handling (#2770)ea7376f522cmd/hi: add integration test runner CLI tool (#2648)afc11e1f0ccmd/hi: fixes and qol (#2649)3326c5b7eccmd/hi: lint and format684239e015cmd/mapresponses: add mini tool to inspect mapresp state from integration2b30a15a68cmd: add option to get and set policy directly from database (#2765)c6736dd6d6db: add sqlite "source of truth" schema50ed24847bdebug: add json and improve38be30b6d4derp: allow override to ip for debug7056fbb63bderp: fix flaky shuffle test (#2772)b87567628aderp: increase update frequency and harden on failures (#2741)3e3c72ea6fdocs(acls): Add example for allow/deny all acl policyded049b905don't crash if config file is missing (#2656)df69840f92feat(tools): Add Go client implementation6750414db1feat: add autogroup:member, autogroup:tagged (#2572)c2a58a304dfeat: add autogroup:self (#2789)d77874373dfeat: add robots.txtd325211617feat: add verify client config for embedded DERP (#2260)1605e2a7a9fix typo in TailSQL's logefc6974017fix typo in parseCapabilityVersion, and removed unused error (#2644) (#2644)43f90d205efix: allow all traffic if acls field is omited from the policy3f6657ae57fix: documentation4927e9d590fix: improve mapresponses and profiles extraction in hi toolc4a8c038cdfix: return valid AuthUrl in followup request on expired reg id3bad5d5590flake.lock: Update (#2585)6220e64978flake.lock: Update (#2669)1a7a2f4196flake.lock: Update (#2699)40b3d54c1fflake.lock: Update (#2755)d311d2e206flake: dont override gopls4de56c40d8flake: goreleaser doesnt follow go nix convention (#2779)39443184d6gen: new proto version22e6094a90golangci: disable varnamelen30525cee0egoreleaser: always do draft (#2595)a975b6a8b1hscontrol: remove go-grpc-middleware v1 dependency (#2653)9b962956b5integration: Eventually, debug output, lint and format044193bf34integration: Use Eventually around external calls (#2685)c87471136bintegration: eventually fixups (#2799)4893cdac74integration: make timestamp constc6d7b512bdintegration: replace time.Sleep with assert.EventuallyWithT (#2680)3b16b75fe6integration: rework retry for waiting for node sync9779adc0b7integration: run headscale with delve and debug symbols (#2689)306d8e1bd4integration: validate expected online status in ping233dffc186lint and leftoverb6d5788231mapper: produce map before polla058bf3cd3mapper: produce map before poll (#2628)ed3a9c8d6dmapper: send change instead of full update (#2775)ccd79ed8d4mcp: add some standard mcp serverbd6ed80936policy/v2: error on missing or zero port (#2606)ee0ef396a2policy: fix ssh usermap, fixing autogroup:nonroot (#2768)2938d03878policy: reject unsupported fields (#2764)a52f1df180policy: remove v1 code (#2600)01c1f6f82apolicy: validate error message for asterix in ssh (#2766)c91b9fc761poll: add missing godoc (#2763)b904276f2bpoll: use nodeview everywhere0303b76e1fpostgres uses more memory855c48aec2remove unneeded check (#2658)fddc7117e4stability and race conditions in auth and node store (#2781)9d236571f4state/nodestore: in memory representation of nodes476f30ab20state: ensure netinfo is preserved and not removed1553f0ab53state: introduce stateb4f7782fd8support force flag for nodes backfillips4912769ab3update dependencies (#2798)81b3e8f743util: harden parsing of tracerouted2879b2b36web: change node registration parameter order (#2607)1b1c989268{policy, node}: allow return paths in route reduction (#2767)
Downloads
- Remove support for 32-bit binaries
mirror of
https://github.com/juanfont/headscale.git
synced 2026-01-11 11:50:30 +01:00