Alternatively, create a Compose service, go to Advanced → Import from Base64, and paste this payload:
ewogICJjb21wb3NlIjogIngtd2ViYXBwLWVudjogJndlYmFwcC1lbnZcbiAgTE9HSU5fT1JJR0lOOiAmdHJpZ2dlci11cmwgJHtUUklHR0VSX1BST1RPQ09MOi1odHRwfTovLyR7VFJJR0dFUl9ET01BSU46LWxvY2FsaG9zdDozMDQwfVxuICBBUFBfT1JJR0lOOiAqdHJpZ2dlci11cmxcbiAgREVWX09URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVDogJnRyaWdnZXItb3RlbCAke1RSSUdHRVJfUFJPVE9DT0w6LWh0dHB9Oi8vJHtUUklHR0VSX0RPTUFJTjotbG9jYWxob3N0OjMwNDB9L290ZWxcbiAgRUxFQ1RSSUNfT1JJR0lOOiBodHRwOi8vZWxlY3RyaWM6MzAwMFxuXG54LXdvcmtlci1lbnY6ICZ3b3JrZXItZW52XG4gIFBMQVRGT1JNX0hPU1Q6IHdlYmFwcFxuICBQTEFURk9STV9XU19QT1JUOiAzMDMwXG4gIFNFQ1VSRV9DT05ORUNUSU9OOiBcImZhbHNlXCJcbiAgT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UOiAqdHJpZ2dlci1vdGVsXG5cbnZvbHVtZXM6XG4gIHBvc3RncmVzLWRhdGE6XG4gIHJlZGlzLWRhdGE6XG5cbm5ldHdvcmtzOlxuICB3ZWJhcHA6XG5cbnNlcnZpY2VzOlxuICB3ZWJhcHA6XG4gICAgaW1hZ2U6IGdoY3IuaW8vdHJpZ2dlcmRvdGRldi90cmlnZ2VyLmRldjoke1RSSUdHRVJfSU1BR0VfVEFHOi12M31cbiAgICByZXN0YXJ0OiAke1JFU1RBUlRfUE9MSUNZOi11bmxlc3Mtc3RvcHBlZH1cbiAgICBlbnZfZmlsZTpcbiAgICAgIC0gLmVudlxuICAgIGVudmlyb25tZW50OlxuICAgICAgPDw6ICp3ZWJhcHAtZW52XG4gICAgcG9ydHM6XG4gICAgICAtIDMwMDBcbiAgICBkZXBlbmRzX29uOlxuICAgICAgLSBwb3N0Z3Jlc1xuICAgICAgLSByZWRpc1xuICAgIG5ldHdvcmtzOlxuICAgICAgLSB3ZWJhcHBcblxuICBwb3N0Z3JlczpcbiAgICBpbWFnZTogcG9zdGdyZXM6JHtQT1NUR1JFU19JTUFHRV9UQUc6LTE2fVxuICAgIHJlc3RhcnQ6ICR7UkVTVEFSVF9QT0xJQ1k6LXVubGVzcy1zdG9wcGVkfVxuICAgIHZvbHVtZXM6XG4gICAgICAtIHBvc3RncmVzLWRhdGE6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhL1xuICAgIGVudl9maWxlOlxuICAgICAgLSAuZW52XG4gICAgbmV0d29ya3M6XG4gICAgICAtIHdlYmFwcFxuICAgIHBvcnRzOlxuICAgICAgLSA1NDMyXG4gICAgY29tbWFuZDpcbiAgICAgIC0gLWNcbiAgICAgIC0gd2FsX2xldmVsPWxvZ2ljYWxcblxuICByZWRpczpcbiAgICBpbWFnZTogcmVkaXM6JHtSRURJU19JTUFHRV9UQUc6LTd9XG4gICAgcmVzdGFydDogJHtSRVNUQVJUX1BPTElDWTotdW5sZXNzLXN0b3BwZWR9XG4gICAgdm9sdW1lczpcbiAgICAgIC0gcmVkaXMtZGF0YTovZGF0YVxuICAgIG5ldHdvcmtzOlxuICAgICAgLSB3ZWJhcHBcbiAgICBwb3J0czpcbiAgICAgIC0gNjM3OVxuXG4gIGRvY2tlci1wcm92aWRlcjpcbiAgICBpbWFnZTogZ2hjci5pby90cmlnZ2VyZG90ZGV2L3Byb3ZpZGVyL2RvY2tlcjoke1RSSUdHRVJfSU1BR0VfVEFHOi12M31cbiAgICByZXN0YXJ0OiAke1JFU1RBUlRfUE9MSUNZOi11bmxlc3Mtc3RvcHBlZH1cbiAgICB2b2x1bWVzOlxuICAgICAgLSAvdmFyL3J1bi9kb2NrZXIuc29jazovdmFyL3J1bi9kb2NrZXIuc29ja1xuICAgIHVzZXI6IHJvb3RcbiAgICBuZXR3b3JrczpcbiAgICAgIC0gd2ViYXBwXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIC0gd2ViYXBwXG4gICAgcG9ydHM6XG4gICAgICAtIDkwMjBcbiAgICBlbnZfZmlsZTpcbiAgICAgIC0gLmVudlxuICAgIGVudmlyb25tZW50OlxuICAgICAgPDw6ICp3b3JrZXItZW52XG4gICAgICBQTEFURk9STV9TRUNSRVQ6ICRQUk9WSURFUl9TRUNSRVRcblxuICBjb29yZGluYXRvcjpcbiAgICBpbWFnZTogZ2hjci5pby90cmlnZ2VyZG90ZGV2L2Nvb3JkaW5hdG9yOiR7VFJJR0dFUl9JTUFHRV9UQUc6LXYzfVxuICAgIHJlc3RhcnQ6ICR7UkVTVEFSVF9QT0xJQ1k6LXVubGVzcy1zdG9wcGVkfVxuICAgIHZvbHVtZXM6XG4gICAgICAtIC92YXIvcnVuL2RvY2tlci5zb2NrOi92YXIvcnVuL2RvY2tlci5zb2NrXG4gICAgdXNlcjogcm9vdFxuICAgIG5ldHdvcmtzOlxuICAgICAgLSB3ZWJhcHBcbiAgICBkZXBlbmRzX29uOlxuICAgICAgLSB3ZWJhcHBcbiAgICBwb3J0czpcbiAgICAgIC0gOTAyMFxuICAgIGVudl9maWxlOlxuICAgICAgLSAuZW52XG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICA8PDogKndvcmtlci1lbnZcbiAgICAgIFBMQVRGT1JNX1NFQ1JFVDogJENPT1JESU5BVE9SX1NFQ1JFVFxuXG4gIGVsZWN0cmljOlxuICAgIGltYWdlOiBlbGVjdHJpY3NxbC9lbGVjdHJpYzoke0VMRUNUUklDX0lNQUdFX1RBRzotbGF0ZXN0fVxuICAgIHJlc3RhcnQ6ICR7UkVTVEFSVF9QT0xJQ1k6LXVubGVzcy1zdG9wcGVkfVxuICAgIGVudmlyb25tZW50OlxuICAgICAgREFUQUJBU0VfVVJMOiAke0RBVEFCQVNFX1VSTH0/c3NsbW9kZT1kaXNhYmxlXG4gICAgbmV0d29ya3M6XG4gICAgICAtIHdlYmFwcFxuICAgIGRlcGVuZHNfb246XG4gICAgICAtIHBvc3RncmVzXG4gICAgcG9ydHM6XG4gICAgICAtIDMwMDAiLAogICJjb25maWciOiAiW3ZhcmlhYmxlc11cbm1haW5fZG9tYWluID0gXCIke2RvbWFpbn1cIlxubWFnaWNfbGlua19zZWNyZXQgPSBcIiR7YmFzZTY0OjE2fVwiXG5zZXNzaW9uX3NlY3JldCA9IFwiJHtiYXNlNjQ6MTZ9XCJcbmVuY3J5cHRpb25fa2V5ID0gXCIke2Jhc2U2NDozMn1cIlxucHJvdmlkZXJfc2VjcmV0ID0gXCIke2Jhc2U2NDozMn1cIlxuY29vcmRpbmF0b3Jfc2VjcmV0ID0gXCIke2Jhc2U2NDozMn1cIlxuZGJfcGFzc3dvcmQgPSBcIiR7YmFzZTY0OjI0fVwiXG5kYl91c2VyID0gXCJ0cmlnZ2VydXNlclwiXG5kYl9uYW1lID0gXCJ0cmlnZ2VyZGJcIlxuXG5bY29uZmlnXVxubW91bnRzID0gW11cblxuW1tjb25maWcuZG9tYWluc11dXG5zZXJ2aWNlTmFtZSA9IFwid2ViYXBwXCJcbnBvcnQgPSAzXzAwMFxuaG9zdCA9IFwiJHttYWluX2RvbWFpbn1cIlxuXG5bY29uZmlnLmVudl1cbk5PREVfRU5WID0gXCJwcm9kdWN0aW9uXCJcblJVTlRJTUVfUExBVEZPUk0gPSBcImRvY2tlci1jb21wb3NlXCJcblYzX0VOQUJMRUQgPSBcInRydWVcIlxuVFJJR0dFUl9ET01BSU4gPSBcIiR7bWFpbl9kb21haW59XCJcblRSSUdHRVJfUFJPVE9DT0wgPSBcImh0dHBcIlxuUE9TVEdSRVNfVVNFUiA9IFwiJHtkYl91c2VyfVwiXG5QT1NUR1JFU19QQVNTV09SRCA9IFwiJHtkYl9wYXNzd29yZH1cIlxuUE9TVEdSRVNfREIgPSBcIiR7ZGJfbmFtZX1cIlxuREFUQUJBU0VfVVJMID0gXCJwb3N0Z3Jlc3FsOi8vJHtkYl91c2VyfToke2RiX3Bhc3N3b3JkfUBwb3N0Z3Jlczo1NDMyLyR7ZGJfbmFtZX1cIlxuTUFHSUNfTElOS19TRUNSRVQgPSBcIiR7bWFnaWNfbGlua19zZWNyZXR9XCJcblNFU1NJT05fU0VDUkVUID0gXCIke3Nlc3Npb25fc2VjcmV0fVwiXG5FTkNSWVBUSU9OX0tFWSA9IFwiJHtlbmNyeXB0aW9uX2tleX1cIlxuUFJPVklERVJfU0VDUkVUID0gXCIke3Byb3ZpZGVyX3NlY3JldH1cIlxuQ09PUkRJTkFUT1JfU0VDUkVUID0gXCIke2Nvb3JkaW5hdG9yX3NlY3JldH1cIlxuSU5URVJOQUxfT1RFTF9UUkFDRV9ESVNBQkxFRCA9IFwiMVwiXG5JTlRFUk5BTF9PVEVMX1RSQUNFX0xPR0dJTkdfRU5BQkxFRCA9IFwiMFwiXG5ERUZBVUxUX09SR19FWEVDVVRJT05fQ09OQ1VSUkVOQ1lfTElNSVQgPSBcIjMwMFwiXG5ERUZBVUxUX0VOVl9FWEVDVVRJT05fQ09OQ1VSUkVOQ1lfTElNSVQgPSBcIjEwMFwiXG5ESVJFQ1RfVVJMID0gXCIke0RBVEFCQVNFX1VSTH1cIlxuUkVESVNfSE9TVCA9IFwicmVkaXNcIlxuUkVESVNfUE9SVCA9IFwiNjM3OVwiXG5SRURJU19UTFNfRElTQUJMRUQgPSBcInRydWVcIlxuSFRUUF9TRVJWRVJfUE9SVCA9IFwiOTAyMFwiXG5DT09SRElOQVRPUl9IT1NUID0gXCIxMjcuMC4wLjFcIlxuQ09PUkRJTkFUT1JfUE9SVCA9IFwiJHtIVFRQX1NFUlZFUl9QT1JUfVwiIgp9
The exact Docker Compose and template configuration this template deploys.
MAGIC_LINK_SECRET, SESSION_SECRET, ENCRYPTION_KEY, database credentials, etc.) automatically.webapp service (port 3000).If you serve the app over HTTPS, set TRIGGER_PROTOCOL=https in the Environment tab (the template defaults to http) so that login links use the correct scheme, then redeploy.
Trigger.dev logs you in with magic links sent by email. The template does not configure an email transport by default, so the email is never actually sent. Instead, the magic link is printed to the logs of the webapp container:
https://<your-domain> and enter your email address to request a magic link.webapp container/service..../magic?token=... (search for magic).To have magic links delivered by email, add these variables in the Environment tab and redeploy.
Using SMTP:
EMAIL_TRANSPORT=smtp
[email protected]
[email protected]
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=your-smtp-user
SMTP_PASSWORD=your-smtp-password
Using Resend:
EMAIL_TRANSPORT=resend
[email protected]
[email protected]
RESEND_API_KEY=your-resend-api-key
By default anyone who can reach the webapp can request a magic link. Restrict access with a regex of allowed email addresses:
WHITELISTED_EMAILS=you@example\.com|teammate@example\.com
You can also grant admin rights by email with ADMIN_EMAILS (same regex format).
Dokploy is a free, open source deployment platform. Deploy Trigger.dev and 499+ other templates on your own infrastructure with a single click.