Dagger stunnel #316
Closed
opened 2026-05-28 03:15:10 +00:00 by guettli
·
2 comments
No Branch/Tag Specified
main
issue-563-agentloop-validation
dummy-pr-test
issue-560-fix-firebase-run-url
issue-539-stable-imap-uid
issue-533-shared-email-list
plan-issue-555
drop-nix
plan-issue-484
plan-issue-539
plan-issue-535
plan-issue-474
plan-issue-533
fix-dagger-engineless-precommit
issue-521-fix-deploy-yml-wait-time-api
issue-502-fix-email-id-collision-mailbox
issue-492-eliminate-duplicate-build-runner
issue-494-website-change-detection
issue-491-parallelize-check
issue-478-fix-stalwart-dual-stack-bind
issue-475-allowed-addresses-glob
issue-473-search-result-reorder
issue-453-update-agentloop-defaults
issue-466-structured-search
issue-505-exclude-chaos-monkey-from-regular-ci
issue-509-fix-search-result-sorting
fix-ink-sparkle-remaining-tests
issue-506-fix-search-emails-tests
issue-504-runner-wait-time
issue-488-search-notes
issue-472-changelog-issue-links
issue-501-folder-search-local-sqlite
issue-486-fix-stale-test-shader-mismatch
fix/prevent-settled-search-rerun-473
issue-467-fix-search-stale-results
issue-446-installed-versions-in-changelog
issue-462-fix-pr
issue-448-chaos-monkey-test
issue-436-notes-on-emails
issue-429-unify-mail-display
issue-422-move-to-folder-create-new
issue-414-ensure-not-run-as-root
issue-424-unify-email-list-views
issue-419-trusted-senders-page
issue-425-fix-prs
test-foo
issue-421-bug-report
issue-383-fix-ci
issue-394-fix-deploy-flutter-version
issue-391-fix-ci-double-trigger
issue-376-combined-inbox-v2
issue-376-combined-inbox
issue-384-fix-open-prs
sops-migrate
issue-339-safe-first-on-imap-fetch
issue-340-try-catch-measure-height
issue-342-pin-intl-version
issue-341-guard-threademails-last
issue-335-agentloop-code-test
issue-329-fix
issue-315-fix
issue-320-fix
issue-325-fix
issue-312-fix
issue-311-fix
issue-305-fix
issue-304-fix
issue-299-fix
issue-300-fix
issue-298-fix
issue-296-fix
issue-294-fix
issue-289-fix
issue-288-fix
issue-287-fix
issue-286-fix
issue-277-fix
issue-282-fix
issue-280-fix
issue-272-fix
issue-268-fix
issue-267-fix
issue-266-fix
issue-258-fix
issue-260-fix
issue-257-fix
issue-253-fix
issue-216-fix
issue-251-fix
issue-249-fix
issue-question-fixes
issue-235-fix
issue-236-fix-v2
issue-237-fix
issue-236-fix
issue-228-fix
issue-217-fix
issue-214-fix
issue-213-fix
issue-208-fix
issue-205-fix
issue-204-fix
issue-203-fix
issue-202-fix
issue-129-fix
issue-161-fix
issue-160-fix
issue-201-fix
issue-210-fix
issue-198-fix
issue-200-fix
issue-144-fix
issue-199-fix
fix/playstore-upload-use-requests
issue-193-fix
issue-186-fix
issue-185-fix
issue-192-fix
issue-183-fix
issue-175-fix
issue-172-fix
issue-171-fix
issue-167-fix
issue-136-fix
issue-162-fix
issue-179-fix
issue-155-fix
issue-154-fix
issue-152-fix
issue-151-fix
issue-141-fix
issue-150-fix
issue-164-fix
migrate-to-dagger
task/d1-ci-matrix
task/a4-typeconverter-json
task/u7-onboarding-walkthrough
task/d3-sync-doc
task/a5-layer-boundary-lint
task/t5-golden-tests
task/p5-date-cache
task/s4-link-handling
task/p3-html-parse-isolate
task/u8-mark-all-read
task/u3-recent-searches
task/a3-jmap-injectable-http-client
task/r5-tls-error-handling
fix/playstore-redirect-retry
task/t3-repository-contract-tests
task/p2-email-list-pagination
task/p1-fts5-search
fix/playstore-upload-timeout
task/a1-email-detail-notifier
fix/upgrade-workmanager-0.9
fix/android-core-library-desugaring
task/p4-db-indexes
task/r3-html-error-boundary
task/d2-check-coverage
task/a2-email-tile
task/t4-migration-tests
task/t2-widget-tests
task/t1-email-repo-coverage
task/u6-connection-status
task/u4-push-notifications
task/u2-draft-sync
task/u1-list-unsubscribe
task/s2-hostname-validation
task/r6-reliability-fuzz-tests
task/r4-sync-error-banner
task/r2-force-resync
task/r1-undo-history-persistence
No results found.
Labels
Clear labels
NeedSupervisor
State/InProgress
State/Later
State/Planned
automerge
ci-failure
do-not-merge
loop/code
loop/code-ci-pending
loop/code-done
loop/code-in-process
loop/merge
loop/merge-done
loop/merge-in-process
loop/plan
loop/plan-done
loop/plan-in-process
Issue escalated to a human supervisor; agentloop will skip it until cleared.
Eligible for automatic merge by CI
Issue opened by agentloop to track a failing CI workflow; used for deduplication.
Plan PR — review only, do not merge.
Add to run the built-in "code" prompt; override at prompts/code.md.
Prompt "code" finished; waiting for the PR's CI to pass before advancing.
Prompt "code" finished successfully.
Agent for the "code" prompt is currently running on this issue.
Managed by agentloop
Managed by agentloop
Managed by agentloop
Add to run the built-in "plan" prompt; override at prompts/plan.md.
Prompt "plan" finished successfully.
Agent for the "plan" prompt is currently running on this issue.
No labels
State/Planned
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: guettli/sharedinbox#316
Reference in New Issue
Block a user
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.
Show link to code where this gets printed:
Why can that happen?
I thought this is executed inside a container, and can not happen.
Implementation Plan: Remove Plain-TCP Dagger Fallback
Where the message is printed
scripts/setup_dagger_remote.sh, lines 35–48:https://codeberg.org/guettli/sharedinbox/src/branch/main/scripts/setup_dagger_remote.sh#L35-L48
The block tries to run
dagger versionover a plain TCP URL; if that call exits 0, it prints the message and exits 0 — skipping stunnel entirely.Why plain TCP can succeed
The script runs on the self-hosted Forgejo runner, which lives on the same host as the Dagger engine. The engine is configured to listen on
tcp://0.0.0.0:8080(seeDAGGER.md). When the runner job executes inside a container with host networking (or with the host's port reachable via Docker bridge), it can reach the Dagger engine over plain TCP on the local/internal interface — without going through the stunnel TLS path at all.So the author's intuition is half-right: the code is executed inside a (Forgejo runner) container, but that container has network access to the host's Dagger engine port, making plain TCP reachable despite the container boundary.
In short: plain TCP succeeds because the runner and the engine are co-located on the same machine and the engine listens on all interfaces.
Problem with the current design
The plain-TCP fallback was likely added to support a plain-proxy configuration that exists on the host side. However:
DAGGER_CA_CERT/DAGGER_CLIENT_CERT/DAGGER_CLIENT_KEYsecrets) are never exercised when co-located, so those secrets are useless in practice.Proposed implementation
File to change:
scripts/setup_dagger_remote.shOption A — Remove the plain-TCP block entirely (recommended)
Delete lines 34–49 (the "2a. Try plain TCP" block). Let the script always proceed to the stunnel path.
This forces every CI run to go through stunnel, keeping the TLS certs exercised and maintaining mutual authentication.
Risk: If the host-side Dagger engine is not wrapped by a TLS-terminating proxy (i.e., it really is plain TCP on port 8774/8080), the stunnel step will fail. In that case either:
Option B — Guard plain TCP with an explicit env-var opt-in
If plain-TCP access is intentional for local/dev scenarios, gate it behind a flag:
CI secrets never set
DAGGER_ALLOW_PLAIN_TCP, so the stunnel path is always used in CI. A developer on the same host can set the var explicitly.Workflow files to audit
Check whether any of the following also need updating (they all call
setup_dagger_remote.sh):.forgejo/workflows/ci.yml— lines 59–65.forgejo/workflows/deploy.yml— lines 104–110, 143–149, 185–191, 227–233The cleanup step (
rm -rf /tmp/dagger-tls /tmp/stunnel-dagger.conf /tmp/stunnel.pid) remains valid in either option.Open questions
Planning complete. To resume this session: