[{"data":1,"prerenderedAt":170},["ShallowReactive",2],{"doc:self-host\u002Fcoolify":3},{"title":4,"description":5,"url":6,"markdownPath":7,"file":8,"section":9,"sectionTitle":10,"html":11,"toc":12,"navigation":29,"previous":168,"next":169},"Run a Server on Coolify","Deploy one L4 Server in Coolify from the published image, claim the Owner, add addresses and update by redeploying or pinning a version.","\u002Fdocs\u002Fself-host\u002Fcoolify","\u002Fdocs\u002Fself-host\u002Fcoolify.md","docs\u002Fself-host\u002Fcoolify.md","self-host","Self-host","\u003Cp>The Coolify template runs one standalone L4 Server: L4 on a single celld node with private RustFS storage. Coolify&#39;s proxy owns the domain and TLS. The template uses the published \u003Ccode>ghcr.io\u002Finchidev\u002Fllll\u003C\u002Fcode> image. It is public, so Coolify pulls it without a registry login and nothing is built on your machine.\u003C\u002Fp>\n\u003Cp>The template is \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Finchidev\u002Fllll\u002Fblob\u002Fmain\u002Fself-host\u002Fcoolify\u002Fdocker-compose.yaml\" rel=\"noopener\">\u003Ccode>self-host\u002Fcoolify\u002Fdocker-compose.yaml\u003C\u002Fcode>\u003C\u002Fa>. It is not a published Coolify catalog entry yet.\u003C\u002Fp>\n\u003Ch2 id=\"install\">\u003Ca class=\"heading-anchor\" href=\"#install\">Install\u003C\u002Fa>\u003C\u002Fh2>\n\u003Col>\n\u003Cli>In Coolify, choose \u003Cstrong>New Resource → Docker Compose\u003C\u002Fstrong> and paste the contents of \u003Ccode>docker-compose.yaml\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Set the domain of the \u003Ccode>llll\u003C\u002Fcode> service, on port \u003Ccode>8080\u003C\u002Fcode>, and \u003Ccode>ADMIN_EMAIL\u003C\u002Fcode> (the first Owner&#39;s email). The deployment fails without \u003Ccode>ADMIN_EMAIL\u003C\u002Fcode>. Leave \u003Ccode>LLLL_VERSION\u003C\u002Fcode> unset to run \u003Ccode>latest\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Deploy. The first start takes a few minutes while the database migrations are applied.\u003C\u002Fli>\n\u003Cli>Wait until \u003Ccode>https:\u002F\u002F&lt;your-domain&gt;\u002Fapi\u002Fsetup\u002Fhealth\u003C\u002Fcode> answers with HTTP 200.\u003C\u002Fli>\n\u003Cli>Open \u003Ccode>https:\u002F\u002F&lt;your-domain&gt;\u002Fsetup\u003C\u002Fcode>, paste the setup token and create the Owner. The token is the value of \u003Ccode>SERVICE_PASSWORD_64_SETUPTOKEN\u003C\u002Fcode> in the service&#39;s environment variables in Coolify.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>To skip step 5, also set \u003Ccode>ADMIN_PASSWORD\u003C\u002Fcode> (at least 12 characters) before the first deploy. The first start creates the Owner with \u003Ccode>ADMIN_EMAIL\u003C\u002Fcode> and that password, so you can sign in right away. Change the password after you sign in. Later changes to \u003Ccode>ADMIN_PASSWORD\u003C\u002Fcode> have no effect, and you can remove the variable.\u003C\u002Fp>\n\u003Cp>If the Server does not come up, read the logs of the \u003Ccode>llll\u003C\u002Fcode> container in Coolify; see also \u003Ca href=\"\u002Fdocs\u002Freference\u002Ftroubleshooting\">Troubleshooting\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>Coolify generates these values for the template:\u003C\u002Fp>\n\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Variable\u003C\u002Fth>\n\u003Cth>Used as\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>SERVICE_URL_LLLL_8080\u003C\u002Fcode>, \u003Ccode>SERVICE_FQDN_LLLL_8080\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The Server&#39;s public origin (\u003Ccode>PUBLIC_ORIGIN\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>SERVICE_PASSWORD_64_AUTHSECRET\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>AUTH_SECRET\u003C\u002Fcode>. Signs sessions and encrypts stored credentials.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>SERVICE_PASSWORD_64_SETUPTOKEN\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>SETUP_TOKEN\u003C\u002Fcode>. Entered once on \u003Ccode>\u002Fsetup\u003C\u002Fcode> to create the Owner.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>SERVICE_USER_RUSTFS\u003C\u002Fcode>, \u003Ccode>SERVICE_PASSWORD_64_RUSTFS\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Keys for the private storage bucket.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cblockquote class=\"callout callout-important\">\u003Cp class=\"callout-title\">Important\u003C\u002Fp>\u003Cp>Keep these values private and never regenerate them. A new \u003Ccode>AUTH_SECRET\u003C\u002Fcode> signs out everyone and makes stored credentials unreadable.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Ccode>APP_NAME\u003C\u002Fcode> sets the initial name (default \u003Ccode>L4\u003C\u002Fcode>). You can rename the Server later in Settings.\u003C\u002Fp>\n\u003Ch2 id=\"more-addresses\">\u003Ca class=\"heading-anchor\" href=\"#more-addresses\">More addresses\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>To serve more domains, add them in Coolify and list every origin in \u003Ccode>LLLL_ORIGINS\u003C\u002Fcode>, comma-separated. The Server trusts only listed origins. RustFS has no public port.\u003C\u002Fp>\n\u003Ch2 id=\"updates\">\u003Ca class=\"heading-anchor\" href=\"#updates\">Updates\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>The image is built for \u003Ccode>linux\u002Famd64\u003C\u002Fcode> and \u003Ccode>linux\u002Farm64\u003C\u002Fcode>. Only stable releases are published as images, with three tags: the exact version (for example \u003Ccode>0.3.5\u003C\u002Fcode>), its minor line (\u003Ccode>0.3\u003C\u002Fcode>) and \u003Ccode>latest\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Updates are controlled in Coolify, not in L4:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Follow stable releases.\u003C\u002Fstrong> Leave \u003Ccode>LLLL_VERSION\u003C\u002Fcode> unset to use \u003Ccode>latest\u003C\u002Fcode>. Redeploy the service to pull the newest stable release.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Pin a version.\u003C\u002Fstrong> Set \u003Ccode>LLLL_VERSION\u003C\u002Fcode> to an exact version. Change it and redeploy to update.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>On start, the new version applies its database migrations and skips ones already applied. Migrations only go forward: an older image refuses to start on data a newer one has migrated. If that happens, set a version at least as new as the one in the error.\u003C\u002Fp>\n\u003Cp>In L4, \u003Cstrong>Server settings → Deployment → Updates\u003C\u002Fstrong> shows &quot;Updates are managed outside L4&quot; and tells you when a newer stable release exists.\u003C\u002Fp>\n\u003Cp>\u003Cfigure class=\"doc-shot doc-shot-missing\">\u003Cdiv class=\"doc-shot-frame\" role=\"img\" aria-label=\"Server settings → Deployment → Updates on a Docker Server, showing the &quot;Updates are managed outside L4&quot; notice and a newer release link\">\u003Cspan class=\"doc-shot-label\">Screenshot coming soon\u003C\u002Fspan>\u003Cspan class=\"doc-shot-alt\">Server settings → Deployment → Updates on a Docker Server, showing the &quot;Updates are managed outside L4&quot; notice and a newer release link\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cfigcaption>Docker and Coolify Servers update outside L4\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003C\u002Fp>\n\u003Ch2 id=\"backups\">\u003Ca class=\"heading-anchor\" href=\"#backups\">Backups\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Backups are optional but recommended before an update.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Server settings → Deployment → Backups\u003C\u002Fstrong> downloads the database and files, or sends them to an S3 destination.\u003C\u002Fli>\n\u003Cli>For a full copy, stop the service and archive the \u003Ccode>rustfs-data\u003C\u002Fcode> and \u003Ccode>celld-data\u003C\u002Fcode> volumes. A copy taken while the service runs may be inconsistent.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Keep backups outside these volumes. See \u003Ca href=\"\u002Fdocs\u002Fconcepts\u002Ffiles-and-backups\">Files and backups\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"optional-providers\">\u003Ca class=\"heading-anchor\" href=\"#optional-providers\">Optional providers\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Cloudflare, AI and mail credentials are optional. The template accepts \u003Ccode>CLOUDFLARE_ACCOUNT_ID\u003C\u002Fcode>, \u003Ccode>CLOUDFLARE_API_TOKEN\u003C\u002Fcode>, \u003Ccode>AI_BASE_URL\u003C\u002Fcode>, \u003Ccode>AI_API_KEY\u003C\u002Fcode>, \u003Ccode>AI_MODEL\u003C\u002Fcode>, \u003Ccode>MAIL_GATEWAY_URL\u003C\u002Fcode>, \u003Ccode>MAIL_GATEWAY_TOKEN\u003C\u002Fcode>, \u003Ccode>SMTP_GATEWAY_URL\u003C\u002Fcode>, \u003Ccode>SMTP_GATEWAY_TOKEN\u003C\u002Fcode>, \u003Ccode>LLLL_EMAIL_DOMAINS\u003C\u002Fcode>, \u003Ccode>MAIL_APP_HOSTNAME\u003C\u002Fcode>, \u003Ccode>MAIL_DEFAULT_LOCAL_PART\u003C\u002Fcode>, \u003Ccode>INBOUND_EMAIL_SECRET\u003C\u002Fcode> and \u003Ccode>BROWSER_CDP_URL\u003C\u002Fcode>. See \u003Ca href=\"\u002Fdocs\u002Fself-host\u002Fdocker#optional-providers\">Optional providers\u003C\u002Fa> for what each one does.\u003C\u002Fp>\n",[13,17,20,23,26],{"id":14,"text":15,"depth":16},"install","Install",2,{"id":18,"text":19,"depth":16},"more-addresses","More addresses",{"id":21,"text":22,"depth":16},"updates","Updates",{"id":24,"text":25,"depth":16},"backups","Backups",{"id":27,"text":28,"depth":16},"optional-providers","Optional providers",[30,55,83,95,114,136,158],{"id":31,"title":32,"pages":33},"get-started","Get started",[34,37,40,43,46,49,52],{"title":35,"url":36},"What is L4","\u002Fdocs\u002Fget-started\u002Fwhat-is-l4",{"title":38,"url":39},"Choose how to run your Server","\u002Fdocs\u002Fget-started\u002Fchoose-how-to-run",{"title":41,"url":42},"Create a Server on Cloudflare","\u002Fdocs\u002Fget-started\u002Fcreate-on-cloudflare",{"title":44,"url":45},"Install on a VPS","\u002Fdocs\u002Fget-started\u002Finstall-on-a-vps",{"title":47,"url":48},"Connect to a Server","\u002Fdocs\u002Fget-started\u002Fconnect-a-server",{"title":50,"url":51},"Invite your team","\u002Fdocs\u002Fget-started\u002Finvite-your-team",{"title":53,"url":54},"Create your first Agent","\u002Fdocs\u002Fget-started\u002Ffirst-agent",{"id":56,"title":57,"pages":58},"cloudflare","Cloudflare",[59,62,65,68,71,74,77,80],{"title":60,"url":61},"L4 on Cloudflare","\u002Fdocs\u002Fcloudflare\u002Foverview",{"title":63,"url":64},"Cloudflare access","\u002Fdocs\u002Fcloudflare\u002Faccess",{"title":66,"url":67},"Costs and limits","\u002Fdocs\u002Fcloudflare\u002Fcosts-and-limits",{"title":69,"url":70},"Custom domain","\u002Fdocs\u002Fcloudflare\u002Fcustom-domain",{"title":72,"url":73},"Mail on Cloudflare","\u002Fdocs\u002Fcloudflare\u002Fmail",{"title":75,"url":76},"Update a Cloudflare Server","\u002Fdocs\u002Fcloudflare\u002Fupdates",{"title":78,"url":79},"Backups on Cloudflare","\u002Fdocs\u002Fcloudflare\u002Fbackups",{"title":81,"url":82},"Remove a Cloudflare Server","\u002Fdocs\u002Fcloudflare\u002Fremove-a-server",{"id":9,"title":10,"pages":84},[85,88,91,92],{"title":86,"url":87},"Run a Server on a VPS","\u002Fdocs\u002Fself-host\u002Fvps",{"title":89,"url":90},"Run a Server with Docker Compose","\u002Fdocs\u002Fself-host\u002Fdocker",{"title":4,"url":6},{"title":93,"url":94},"Compute Nodes","\u002Fdocs\u002Fself-host\u002Fcompute-nodes",{"id":96,"title":97,"pages":98},"concepts","Concepts",[99,102,105,108,111],{"title":100,"url":101},"Servers and the Shell","\u002Fdocs\u002Fconcepts\u002Fserver-and-shell",{"title":103,"url":104},"Accounts, Members and Roles","\u002Fdocs\u002Fconcepts\u002Faccounts-members-roles",{"title":106,"url":107},"Agents, Tasks and Runs","\u002Fdocs\u002Fconcepts\u002Fagents-tasks-runs",{"title":109,"url":110},"Files and backups","\u002Fdocs\u002Fconcepts\u002Ffiles-and-backups",{"title":112,"url":113},"Releases and updates","\u002Fdocs\u002Fconcepts\u002Freleases-and-updates",{"id":115,"title":116,"pages":117},"agents","Agents and MCP",[118,121,124,127,130,133],{"title":119,"url":120},"Agents overview","\u002Fdocs\u002Fagents\u002Foverview",{"title":122,"url":123},"Models and Providers","\u002Fdocs\u002Fagents\u002Fmodels-and-providers",{"title":125,"url":126},"Connect an MCP client","\u002Fdocs\u002Fagents\u002Fmcp",{"title":128,"url":129},"External agents","\u002Fdocs\u002Fagents\u002Fexternal-agents",{"title":131,"url":132},"Repositories and code work","\u002Fdocs\u002Fagents\u002Frepositories",{"title":134,"url":135},"Schedules","\u002Fdocs\u002Fagents\u002Fschedules",{"id":137,"title":138,"pages":139},"guides","Guides",[140,143,146,149,152,155],{"title":141,"url":142},"Chat","\u002Fdocs\u002Fguides\u002Fchat",{"title":144,"url":145},"Projects and Tasks","\u002Fdocs\u002Fguides\u002Fprojects-and-tasks",{"title":147,"url":148},"Mail","\u002Fdocs\u002Fguides\u002Fmail",{"title":150,"url":151},"Calls and Live","\u002Fdocs\u002Fguides\u002Fcalls",{"title":153,"url":154},"Notifications","\u002Fdocs\u002Fguides\u002Fnotifications",{"title":156,"url":157},"Telegram","\u002Fdocs\u002Fguides\u002Ftelegram",{"id":159,"title":160,"pages":161},"reference","Reference",[162,165],{"title":163,"url":164},"Glossary","\u002Fdocs\u002Freference\u002Fglossary",{"title":166,"url":167},"Troubleshooting","\u002Fdocs\u002Freference\u002Ftroubleshooting",{"title":89,"url":90},{"title":93,"url":94},1793304298326]