Self-hosting overview

Compare Docker, Vercel, and Cloudflare Workers deployments and prepare your self-hosted FeedLog instance.

Last updated Sep 21, 2026

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:

sql 复制代码
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

bash 复制代码
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:latest

Vercel

bash 复制代码
vercel env add DATABASE_URL
vercel env add BETTER_AUTH_SECRET       # Generate with: openssl rand -hex 32
vercel env add SYSTEM_ADMIN_EMAILS

Cloudflare Workers

bash 复制代码
# 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_EMAILS

With 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. The vector extension must already exist because /setup
    cannot 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.