<workflowRun _class='org.jenkinsci.plugins.workflow.job.WorkflowRun'><action _class='hudson.model.CauseAction'><cause _class='com.cloudbees.jenkins.GitHubPushCause'><shortDescription>Started by GitHub push by younex1</shortDescription></cause><cause _class='com.cloudbees.jenkins.GitHubPushCause'><shortDescription>Started by GitHub push by younex1</shortDescription></cause><cause _class='hudson.triggers.SCMTrigger$SCMTriggerCause'><shortDescription>Started by an SCM change</shortDescription></cause><cause _class='hudson.triggers.SCMTrigger$SCMTriggerCause'><shortDescription>Started by an SCM change</shortDescription></cause></action><action></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmain _class='hudson.plugins.git.util.Build'><buildNumber>2</buildNumber><marked><SHA1>679906e5db227bfa0d8a3ca5800418269ab474e8</SHA1><branch><SHA1>679906e5db227bfa0d8a3ca5800418269ab474e8</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>679906e5db227bfa0d8a3ca5800418269ab474e8</SHA1><branch><SHA1>679906e5db227bfa0d8a3ca5800418269ab474e8</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>679906e5db227bfa0d8a3ca5800418269ab474e8</SHA1><branch><SHA1>679906e5db227bfa0d8a3ca5800418269ab474e8</SHA1><name>refs/remotes/origin/main</name></branch></lastBuiltRevision><remoteUrl>https://github.com/younex1/blut24-landing.git</remoteUrl><scmName></scmName></action><action></action><action _class='org.jenkinsci.plugins.workflow.cps.EnvActionImpl'><environment><GIT_SHA>679906e</GIT_SHA><RELEASE_DIR>/var/www/blut24.com/web/releases/2-679906e</RELEASE_DIR><RELEASE_ID>2-679906e</RELEASE_ID></environment></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'><artifactsUrl>https://jenkins.younex.de/job/blut24-landing/2/artifact</artifactsUrl><changesUrl>https://jenkins.younex.de/job/blut24-landing/changes</changesUrl><displayUrl>https://jenkins.younex.de/job/blut24-landing/2/</displayUrl><testsUrl>https://jenkins.younex.de/job/blut24-landing/2/testReport</testsUrl></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'><restartEnabled>false</restartEnabled><restartableStage>Checkout</restartableStage><restartableStage>Guard: main only</restartableStage><restartableStage>Ship source to target</restartableStage><restartableStage>Build, health-check and swap</restartableStage><restartableStage>Smoke test</restartableStage></action><action></action><action _class='org.jenkinsci.plugins.workflow.job.views.FlowGraphAction'><node _class='org.jenkinsci.plugins.workflow.graph.FlowStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.graph.FlowEndNode'></node></action><action></action><action></action><action></action><building>false</building><displayName>#2 679906e</displayName><duration>32750</duration><estimatedDuration>28038</estimatedDuration><fullDisplayName>blut24-landing #2 679906e</fullDisplayName><id>2</id><keepLog>false</keepLog><number>2</number><queueId>5442</queueId><result>SUCCESS</result><timestamp>1785218932906</timestamp><url>https://jenkins.younex.de/job/blut24-landing/2/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>deploy/deploy.sh</affectedPath><affectedPath>deploy/bootstrap-server.sh</affectedPath><affectedPath>deploy/ecosystem.config.cjs</affectedPath><commitId>679906e5db227bfa0d8a3ca5800418269ab474e8</commitId><timestamp>1785218244000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@logyou.de</authorEmail><comment>deploy: pin Node v22.22.3, self-heal the install, realign bootstrap to ISPConfig

The first Jenkins build logged EBADENGINE warnings: several transitive deps
(@babel/*, undici) require Node ^22.18 / &gt;=22.19 while the pin was v22.14.0.
Bumped to v22.22.3 — same NODE_MODULE_VERSION 127, so the better-sqlite3 native
build stays compatible and no rebuild-from-scratch is forced.

deploy.sh now runs `nvm install` rather than `nvm use`, so bumping the pin in git
is sufficient; previously a new version would have failed the deploy outright with
"N/A: version not yet installed". It also ensures pm2 exists for that Node build.

bootstrap-server.sh still carried the pre-ISPConfig layout and, worse, would have
written a standalone nginx vhost with the same server_name as the ISPConfig-generated
one - a collision that ISPConfig would regenerate away. It now creates the real
layout (code in the docroot, secrets and SQLite in the site's private/ dir) and only
REPORTS on the proxy block instead of fighting the panel for ownership.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
</comment><date>2026-07-28 07:57:24 +0200</date><id>679906e5db227bfa0d8a3ca5800418269ab474e8</id><msg>deploy: pin Node v22.22.3, self-heal the install, realign bootstrap to ISPConfig</msg><path><editType>edit</editType><file>deploy/deploy.sh</file></path><path><editType>edit</editType><file>deploy/bootstrap-server.sh</file></path><path><editType>edit</editType><file>deploy/ecosystem.config.cjs</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName><id>info</id></culprit><inProgress>false</inProgress><nextBuild><action _class='hudson.model.CauseAction'><cause _class='com.cloudbees.jenkins.GitHubPushCause'><shortDescription>Started by GitHub push by younex1</shortDescription></cause><cause _class='hudson.triggers.SCMTrigger$SCMTriggerCause'><shortDescription>Started by an SCM change</shortDescription></cause><cause _class='hudson.triggers.SCMTrigger$SCMTriggerCause'><shortDescription>Started by an SCM change</shortDescription></cause></action><action></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmain _class='hudson.plugins.git.util.Build'><buildNumber>3</buildNumber><marked><SHA1>3365492e0eebdab580a2e8c2b0c0eea00e89d606</SHA1><branch><SHA1>3365492e0eebdab580a2e8c2b0c0eea00e89d606</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>3365492e0eebdab580a2e8c2b0c0eea00e89d606</SHA1><branch><SHA1>3365492e0eebdab580a2e8c2b0c0eea00e89d606</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>3365492e0eebdab580a2e8c2b0c0eea00e89d606</SHA1><branch><SHA1>3365492e0eebdab580a2e8c2b0c0eea00e89d606</SHA1><name>refs/remotes/origin/main</name></branch></lastBuiltRevision><remoteUrl>https://github.com/younex1/blut24-landing.git</remoteUrl><scmName></scmName></action><action></action><action _class='org.jenkinsci.plugins.workflow.cps.EnvActionImpl'></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'></action><action></action><action _class='org.jenkinsci.plugins.workflow.job.views.FlowGraphAction'></action><action></action><action></action><action></action><building>false</building><displayName>#3 3365492</displayName><duration>32350</duration><estimatedDuration>28038</estimatedDuration><fullDisplayName>blut24-landing #3 3365492</fullDisplayName><id>3</id><keepLog>false</keepLog><number>3</number><queueId>5444</queueId><result>SUCCESS</result><timestamp>1785220314292</timestamp><url>https://jenkins.younex.de/job/blut24-landing/3/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>.env.example</affectedPath><affectedPath>server/utils/registrationValidation.ts</affectedPath><affectedPath>server/api/registration/submit.post.ts</affectedPath><commitId>d91c3a46ec2b1420a63ba8ecab63a9cb21593616</commitId><timestamp>1785219798000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@logyou.de</authorEmail><comment>registration: operator test domains may register for any clinic

Adds REGISTRATION_TEST_DOMAINS (comma-separated). Addresses on those domains skip
the "e-mail domain belongs to the chosen Standort" check, so the flow can be
exercised end-to-end against arbitrary clinics.

That check is the only thing preventing a stranger from registering someone else's
hospital, so it is never relaxed for real users. The bypass therefore:
  - does not exist at all when the variable is empty or unset (the default)
  - never counts as domain-verified (domain_verified stays 0)
  - forces needs_manual_approval and prefixes the note with [TESTREGISTRIERUNG via &lt;domain&gt;]
  - leaves the freemail blocklist and the per-Standort duplicate guard intact

Verified: younex.de/it-beratung.it accepted for a non-matching Charité Standort;
a non-whitelisted business domain and a freemail address both still rejected; and
with the variable unset younex.de is rejected again.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
</comment><date>2026-07-28 08:23:18 +0200</date><id>d91c3a46ec2b1420a63ba8ecab63a9cb21593616</id><msg>registration: operator test domains may register for any clinic</msg><path><editType>edit</editType><file>server/utils/registrationValidation.ts</file></path><path><editType>edit</editType><file>server/api/registration/submit.post.ts</file></path><path><editType>edit</editType><file>.env.example</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>Jenkinsfile</affectedPath><affectedPath>deploy/deploy.sh</affectedPath><commitId>3365492e0eebdab580a2e8c2b0c0eea00e89d606</commitId><timestamp>1785220306000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@logyou.de</authorEmail><comment>ci: move the deploy concurrency guard from Jenkins to the target

Every build after the first sat in the queue as a BlockedItem and never started
until Jenkins was restarted - observed three times on this controller. The only
plausible cause was disableConcurrentBuilds(), so it is removed.

The race it guarded against is two deploys swapping the `current` symlink at the
same time. That resource lives on the TARGET, not on Jenkins, so deploy.sh now
takes an flock on /var/lock/blut24-landing-deploy.lock for the whole run. That is
strictly better: it also covers deploys started by hand or from another controller,
which the Jenkins-side option never did.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
</comment><date>2026-07-28 08:31:46 +0200</date><id>3365492e0eebdab580a2e8c2b0c0eea00e89d606</id><msg>ci: move the deploy concurrency guard from Jenkins to the target</msg><path><editType>edit</editType><file>Jenkinsfile</file></path><path><editType>edit</editType><file>deploy/deploy.sh</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></culprit><inProgress>false</inProgress><nextBuild><number>4</number><url>https://jenkins.younex.de/job/blut24-landing/4/</url></nextBuild><previousBuild><number>2</number><url>https://jenkins.younex.de/job/blut24-landing/2/</url></previousBuild></nextBuild><previousBuild><action _class='hudson.model.CauseAction'><cause _class='com.cloudbees.jenkins.GitHubPushCause'><shortDescription>Started by GitHub push by younex1</shortDescription></cause></action><action></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmain _class='hudson.plugins.git.util.Build'><buildNumber>1</buildNumber><marked><SHA1>091770a6c5138113b51582d5bd5e86c607cbe262</SHA1><branch><SHA1>091770a6c5138113b51582d5bd5e86c607cbe262</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>091770a6c5138113b51582d5bd5e86c607cbe262</SHA1><branch><SHA1>091770a6c5138113b51582d5bd5e86c607cbe262</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>091770a6c5138113b51582d5bd5e86c607cbe262</SHA1><branch><SHA1>091770a6c5138113b51582d5bd5e86c607cbe262</SHA1><name>refs/remotes/origin/main</name></branch></lastBuiltRevision><remoteUrl>https://github.com/younex1/blut24-landing.git</remoteUrl><scmName></scmName></action><action></action><action _class='org.jenkinsci.plugins.workflow.cps.EnvActionImpl'></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'></action><action></action><action _class='org.jenkinsci.plugins.workflow.job.views.FlowGraphAction'></action><action></action><action></action><action></action><building>false</building><displayName>#1 091770a</displayName><duration>30254</duration><estimatedDuration>28038</estimatedDuration><fullDisplayName>blut24-landing #1 091770a</fullDisplayName><id>1</id><keepLog>false</keepLog><number>1</number><queueId>5439</queueId><result>SUCCESS</result><timestamp>1785192514932</timestamp><url>https://jenkins.younex.de/job/blut24-landing/1/</url><inProgress>false</inProgress><nextBuild><number>2</number><url>https://jenkins.younex.de/job/blut24-landing/2/</url></nextBuild></previousBuild></workflowRun>