Repository navigation
feat: coolify template for self-hosting - #156
Conversation
|
Important Review skippedToo many files! This PR contains 658 files, which is 558 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. Usage-priced reviews support at most 300 files. ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Advanced Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (658)
You can disable this status message by setting the Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
| reverse_proxy email:8022 | ||
| } | ||
|
|
||
| @removed path /api/credits* /api/tool* /api/admin* |
There was a problem hiding this comment.
In a Coolify deployment, this rule returns 404 for the credits API, but the included dashboard still calls it for usage and billing periods. The Usage page cannot show the organization's balance. The template also omits the credits worker that handles email.sent, so sends do not create billing-audit records or emit quota warnings, even though the mail service still reserves credits.
Knowledge Base Used: Outbound email delivery
| handle @removed { | ||
| respond 404 |
There was a problem hiding this comment.
The Coolify template includes the dashboard's support chat but omits the admin service and returns 404 for its API. Opening chat cannot create a conversation; unread counts and message requests also fail. The deployed dashboard needs that backend or must not offer the unavailable feature.
# Conflicts: # apps/frontend/dashboard/src/features/dashboard/page-header/user-dropdown.tsx # apps/frontend/dashboard/src/features/dashboard/sidebar/animated-campaigns-icon.tsx
| // Only true once role is known as owner/admin, never while pending/unknown. | ||
| const isOrgAdmin = !isPending && (isOwner || isAdmin); | ||
| const canManageTeam = isOrgAdmin; | ||
| const canManageBilling = isOrgAdmin && billingEnabled; |
There was a problem hiding this comment.
Dedicated IP settings become inaccessible
For a self-hosted instance, billingEnabled is false, so this change also denies owners and admins access to Dedicated IP settings. The page redirects before it can show their assigned sending IPs or its new self-hosted state.
Knowledge Base Used: Product interfaces
Summary
Adds a Coolify template (
install/coolify/reloop.yaml) so Reloop can be deployed on Coolify by pasting it into a Docker Compose resource, plus a fullself-host/coolifydocs page. I deployed it on a fresh Coolify 4.3.23 in a VM and went through setup, sending, SMTP submission, inbound, click tracking, restart and redeploy. That turned up a few bugs that hit every self-host install, not just Coolify, so they're fixed here too:drizzle-kit pushre-diffed two unique constraints and three over-long FK names on every run. Once a table had rows it stopped at a TTY prompt and exited 0, so upgrades silently skipped schema changes (Coolify and the VPS installer). Push now reports no changes on both fresh and existing databases.Authorization: Bearerwent out without a DKIM signature because the send routes only readx-api-key.NEXT_PUBLIC_URL) and its fallback redirects pointed athttp://0.0.0.0:3005. The dashboard bakedwss://reloop.shfor template collaboration..env. Auth can now seed the setup key fromADMIN_SETUP_KEY, rotates it until it's used, creates the env file if missing, clears a stale lock on boot, and a failed setup no longer reopens signup.AUTH_INTERNAL_BASE_URLlike the other services.Also removes em dashes from the frontend apps (separate commits), and the matching generated files and sources.
Linked issue
None, this came out of the self-host work. Happy to open one if you want it tracked.
Type of change
fix: bug fixfeat: new featuredocs: documentation onlyrefactor: no feature or fixperf: performance improvementtest: adding or updating testschore: tooling, CI, dependenciesAffected areas
How tested
SERVICE_PASSWORD_64_SETUPKEY, domain verification against a local DNS, API and SMTP sends (DKIM signed), click and open tracking, inbound on 25, websockets, restart, redeploy with pull, setup key rotation.drizzle-kit pushtwice against a fresh Postgres and once against a database created by the old schema: both end with "No changes detected".migrateon the populated VM database printed the same.bun testin packages/auth (170), packages/db (33), be-mail (40), be-tools spoof checker; dashboard vitest (359);tsc --noEmitfor web, dashboard, console, links, mail, auth; biome on touched files.Deploy / breaking notes
fix/self-host-no-plan-limitsis merged.Checklist
bun run checkpasses (lint + format). Ran biome on touched files only; the repo has existing findings.The PR is not ready to merge: Coolify still enforces hosted quotas, and self-hosted sending and settings do not match the new unlimited behavior.
Findings
Summary
The PR adds a Coolify deployment template and self-hosting documentation, fixes setup and mail-delivery behavior, and adds self-hosted quota handling and dashboard presentation. The latest changes also update pricing, testimonials, and disposable-domain data.
Diagram
%%{init: {'theme': 'neutral'}}%% flowchart LR Config[Deployment environment] --> Flag[SELF_HOSTED flag] Flag --> Credits[Credit reservation] Flag --> Resource[Domain and inbox quotas] Credits --> Age[Domain-age send cap] Age --> Send[Mail handoff] Flag --> Usage[Usage response] Usage --> Permission[Dashboard billing permission] Permission --> IP[Dedicated IP settings]Reviews (2) · Last reviewed commit: "Merge remote-tracking branch 'origin/mai..."