Self-hosting overview
FeedLog can be deployed with Docker, Vercel, or Cloudflare Workers. Each option runs the same application and supports the same product features. The platform determines the runtime environment, upload storage integration, and database migration timing.
Use this page to choose a platform and identify the minimum required configuration. Detailed deployment steps remain in the repository so they stay versioned with the release you deploy.
Before you start
FeedLog requires a PostgreSQL 17 or later database with the vector extension. File storage, transactional email, AI, and OAuth are optional. You can configure them later, although applying a configuration change may require a restart or redeployment, depending on the platform.
Similar-feedback detection uses the vector extension. Neon and Supabase let you enable it from their dashboards. For other providers, run the following statement against the database before deploying FeedLog:
CREATE EXTENSION IF NOT EXISTS vector;Without this extension, the database migration fails when it tries to create a table containing a vector column. The deployment reports this as a migration error.
Choose a platform
| Docker | Vercel | Cloudflare Workers | |
|---|---|---|---|
| Postgres | A database you provide; the bundled Compose file can start one | A database you provide, reachable over the internet | A database you provide, connected through a Hyperdrive binding |
| File uploads | S3-compatible storage or the local filesystem | Vercel Blob | R2 bucket |
| Migrations run | When the container starts | During the build | During initial setup on the first request |
| When to choose it | You want full infrastructure control | You want the least platform setup and per-branch previews | You want a serverless deployment on Cloudflare's network |
Docker is the recommended default for self-hosting. Choose it when the application, database, and uploaded files need to remain on infrastructure you control. It runs on Linux hosts, NAS devices, and Docker-based platforms such as Coolify and Dokploy. The repository includes a compose.yml that starts the application and a Postgres database with vector enabled, so Docker is the only option that does not require you to provision a separate database.
The bundled Compose file uses one replica, a default Postgres password, and a port published to the host. Review and change those settings before using it in production.
Vercel requires the least platform-specific setup. It detects the framework and provides HTTPS and preview deployments for each branch. You provide the Postgres database. Neon and Supabase are available through the Vercel Marketplace and both support the vector extension.
Cloudflare Workers runs FeedLog on Cloudflare's serverless network. It requires more platform-specific configuration: a POSTGRES Hyperdrive binding provides the database connection instead of DATABASE_URL, and an R2 binding provides file storage instead of S3 credentials.
The repository contains the complete instructions for each platform: Docker · Vercel · Cloudflare Workers
Required configuration
Docker and Vercel require three environment variables. On Cloudflare Workers, the POSTGRES Hyperdrive binding replaces DATABASE_URL; the other two values are Worker secrets.
| Variable | Purpose |
|---|---|
DATABASE_URL | PostgreSQL connection string. Do not set it on Cloudflare Workers; configure the POSTGRES Hyperdrive binding instead. |
BETTER_AUTH_SECRET | Protects sessions and cookies. Use at least 32 random characters. Changing it later invalidates all existing sessions. |
SYSTEM_ADMIN_EMAILS | Comma-separated addresses that become Owners of the default workspace when their accounts are created. Configure this before registering an account. |
docker run -d --name feedlog -p 3000:3000 \
-e DATABASE_URL="postgresql://user:password@host:5432/feedlog" \
-e BETTER_AUTH_SECRET="$(openssl rand -hex 32)" \
-e SYSTEM_ADMIN_EMAILS="[email protected]" \
ghcr.io/linkcraftstudio/feedlog:latestvercel env add DATABASE_URL
vercel env add BETTER_AUTH_SECRET # Generate with: openssl rand -hex 32
vercel env add SYSTEM_ADMIN_EMAILS# Bind Hyperdrive as POSTGRES in wrangler.toml; DATABASE_URL is not used.
wrangler secret put BETTER_AUTH_SECRET # Generate with: openssl rand -hex 32
wrangler secret put SYSTEM_ADMIN_EMAILSWith the default authentication settings, FeedLog automatically enables email and password sign-in when no OAuth provider is configured.
Set SYSTEM_ADMIN_EMAILS before registering
FeedLog checks SYSTEM_ADMIN_EMAILS when it creates an account. If the new account's address is on the list, FeedLog adds that account to the default workspace as an Owner.
Adding an address after its account already exists does not change that account's role. Restarting the application does not repeat the check.
If the account already exists
You do not need to edit the database. Add a different address to SYSTEM_ADMIN_EMAILS, apply the configuration change for your platform, and register a new account with that address. The address must not have been used to register on this instance before. Every listed address receives Owner access when its account is created, not only the first address.
When migrations run
Each platform runs database migrations at a different stage. This determines where a migration failure appears:
- Docker: Migrations run when the container starts. Initial setup normally adds about five seconds. If a migration fails, the container does not finish starting; check its logs for the migration error.
- Vercel: Migrations run during the build, before the Nuxt build step. A migration failure stops the deployment, while the previous deployment continues serving traffic.
- Cloudflare Workers: For a new database, the first request opens
/setup. That page runs the migrations and redirects to the application when the schema is ready. Thevectorextension must already exist because/setupcannot install it.
For migration behavior during later releases, see Upgrading and backups.
What to configure next
Before inviting users, review the optional services and prepare an upgrade and backup process.
Configuring external services explains OAuth, transactional email, file storage, and AI, including the behavior when each service is not configured. Without an email provider, password-reset and status notification messages are not delivered to recipients.
Upgrading and backups explains how to deploy a new version, when migrations run, and what to back up first.