Three servers, three lessons the quirk table could not express before.
NATS was the easy one: nats-server takes --port, and the flag wins over
the port in the config the image ships.
RabbitMQ reads RABBITMQ_NODE_PORT, but the port it is given is not the
only one it derives from it — the Erlang distribution port is that plus
20000. A node port above 45535 makes it refuse to boot, and the kernel's
ephemeral range, which freePort draws from, starts at 32768: more than
half of werkdock's choices would have been wrong. A quirk can now cap
what werkdock picks, and werkdock looks for a free port itself below the
cap. A requested port above it is refused with the reason rather than
handed to a server that dies in an Erlang stack trace.
Mosquitto cannot be moved at all. Its port comes from the config the
image ships, whose explicit listener switches off the default one that
-p sets; measured, the flag is simply ignored. Its entry therefore names
a user and no port knob — and it is still worth having, because without
the user mosquitto does not start (it drops privileges itself and cannot
setgroups in a user namespace), and with the entry werkdock reports 1883
unmoved instead of a port nothing answers on.
All five tests for these are in werkprobe, including queue and topic
delivery through RabbitMQ and a topic through MQTT.
Three servers, three lessons the quirk table could not express before.
NATS was the easy one: nats-server takes --port, and the flag wins over
the port in the config the image ships.
RabbitMQ reads RABBITMQ_NODE_PORT, but the port it is given is not the
only one it derives from it — the Erlang distribution port is that plus
20000. A node port above 45535 makes it refuse to boot, and the kernel's
ephemeral range, which freePort draws from, starts at 32768: more than
half of werkdock's choices would have been wrong. A quirk can now cap
what werkdock picks, and werkdock looks for a free port itself below the
cap. A requested port above it is refused with the reason rather than
handed to a server that dies in an Erlang stack trace.
Mosquitto cannot be moved at all. Its port comes from the config the
image ships, whose explicit listener switches off the default one that
-p sets; measured, the flag is simply ignored. Its entry therefore names
a user and no port knob — and it is still worth having, because without
the user mosquitto does not start (it drops privileges itself and cannot
setgroups in a user namespace), and with the entry werkdock reports 1883
unmoved instead of a port nothing answers on.
All five tests for these are in werkprobe, including queue and topic
delivery through RabbitMQ and a topic through MQTT.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Three servers, three lessons the quirk table could not express before.
NATS was the easy one: nats-server takes --port, and the flag wins over
the port in the config the image ships.
RabbitMQ reads RABBITMQ_NODE_PORT, but the port it is given is not the
only one it derives from it — the Erlang distribution port is that plus
20000. A node port above 45535 makes it refuse to boot, and the kernel's
ephemeral range, which freePort draws from, starts at 32768: more than
half of werkdock's choices would have been wrong. A quirk can now cap
what werkdock picks, and werkdock looks for a free port itself below the
cap. A requested port above it is refused with the reason rather than
handed to a server that dies in an Erlang stack trace.
Mosquitto cannot be moved at all. Its port comes from the config the
image ships, whose explicit listener switches off the default one that
-p sets; measured, the flag is simply ignored. Its entry therefore names
a user and no port knob — and it is still worth having, because without
the user mosquitto does not start (it drops privileges itself and cannot
setgroups in a user namespace), and with the entry werkdock reports 1883
unmoved instead of a port nothing answers on.
All five tests for these are in werkprobe, including queue and topic
delivery through RabbitMQ and a topic through MQTT.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
mi
manually merged commit 7af759e0c2 into main2026-09-11 10:20:55 +02:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Three servers, three lessons the quirk table could not express before.
NATS was the easy one: nats-server takes --port, and the flag wins over
the port in the config the image ships.
RabbitMQ reads RABBITMQ_NODE_PORT, but the port it is given is not the
only one it derives from it — the Erlang distribution port is that plus
20000. A node port above 45535 makes it refuse to boot, and the kernel's
ephemeral range, which freePort draws from, starts at 32768: more than
half of werkdock's choices would have been wrong. A quirk can now cap
what werkdock picks, and werkdock looks for a free port itself below the
cap. A requested port above it is refused with the reason rather than
handed to a server that dies in an Erlang stack trace.
Mosquitto cannot be moved at all. Its port comes from the config the
image ships, whose explicit listener switches off the default one that
-p sets; measured, the flag is simply ignored. Its entry therefore names
a user and no port knob — and it is still worth having, because without
the user mosquitto does not start (it drops privileges itself and cannot
setgroups in a user namespace), and with the entry werkdock reports 1883
unmoved instead of a port nothing answers on.
All five tests for these are in werkprobe, including queue and topic
delivery through RabbitMQ and a topic through MQTT.
Co-Authored-By: Claude Opus 5 noreply@anthropic.com