DeepFellow DOCS

DeepFellow Server

As administrator, prepare your administrator credentials (email and password) you want to use for managing DeepFellow Server. Remember your password. You can always reset it if needed.

Installation

To install and configure DeepFellow Server, start with:

deepfellow server install

You will proceed to configure built-in components:

  • Docker network
  • no-sql database (for example MongoDB)
  • connection with DeepFellow Infra
  • vector database and embedding model
  • telemetry
  • Nightshift background worker and RabbitMQ

Docker Network

The installer first asks which Docker network DeepFellow Server will join. Use the same network name you chose during Infra installation so Server and Infra can reach each other:

$ deepfellow server install
💡      Installing DeepFellow Server.
❓      Provide a docker network name (deepfellow-infra-net):

MongoDB

💡      DeepFellow Server requires a MongoDB to be installed.
❓      Install a local MongoDB for DeepFellow Server? [y/n] (y):
💡      A default MongoDB setup is created.

If you choose n instead, you will be asked about credentials and database name first:

❓      Provide username for MongoDB: deepfellow-usr
❓      Provide password for MongoDB:
❓      Provide database name for MongoDB: deepfellow

Then you will be asked to provide the Mongo URL (not mongo connection string!):

❓      Provide host:port for MongoDB e.g. 192.168.1.5:27017: mongo:27017

If you use a service name like mongo, Docker will resolve it to the MongoDB container. Be careful: localhost will not work as it refers to the container's own loopback interface.

Connection with Infra

Next, the installator will proceed to configure connection with Infra:

💡      DeepFellow Server is communicating with DeepFellow Infra.
❓      Provide DeepFellow Infra URL (http://infra:8086):
❓      Provide DeepFellow Infra API KEY:

Docker resolves a name like infra internally to a Compose service name. Be careful: localhost will not work as it refers to the container's own loopback interface.

Vector Database

Next, the installer configures the vector database and embedding model:

💡      DeepFellow Server might use a vector DB. If not provided some features will not work.
❓      Do you want to use a vector database with DeepFellow? [y/n] (y):
❓      Choose embedding type dense
❓      Choose the type of the vector database qdrant
❓      Install a local vector database for DeepFellow Server? [y/n] (y):
💡      DeepFellow will manage a Qdrant instance.
⚠️      Qdrant keeps its index in RAM and can stop responding once the data grows past ~5 GB. It is not suited for large data volumes - choose Milvus (--vectordb-type milvus) for those.
❓      Provide the model for embedding (mxbai-embed-large):
❓      Provide the embedding size (1024):

The available embedding types are dense and sparse. The available vector database backends are qdrant and milvus.

Qdrant keeps its index in memory. When your data grows past about 5 GB, Qdrant slows down and becomes unusable, so it is not suited for large data volumes. For large data volumes, choose milvus.

Answer n to "Install a local vector database?" if you want to connect to an existing instance. You will be asked for its URL:

❓      Install a local vector database for DeepFellow Server? [y/n] (y): n
❓      Provide Qdrant instance URL (http://qdrant:6333):

If you use a service name like qdrant, Docker will resolve it to the Qdrant service. Be careful: localhost will not work as it refers to the container's own loopback interface.

Telemetry

After that, OpenTelemetry configuration will start:

💡      DeepFellow Server might use an Open Telemetry.
❓      Do you have an Open Telemetry server ready? [y/n] (n): n
❓      Do you want to run Open Telemetry from this machine? [y/n] (n): y
💡      Let's configure Open Telemetry
❓      Do you want to export to Elasticsearch? [y/n] (n):

If you answer n to "Do you want to export to Elasticsearch?" (the default), DeepFellow generates a debug-only OTel collector configuration. No Elasticsearch instance is required.

Inspect telemetry via the container log once Server is running:

docker logs -f otel-collector-container

This mode suits local development, workshops, and demo environments.

To export to Elasticsearch, answer y. You will be prompted for your credentials:

❓      Do you want to export to Elasticsearch? [y/n] (n): y
❓      Provide your ElasticSearch endpoint: https://myelastic.com:9200
❓      Provide traces index: my-index
❓      Provide username: elastic_user
❓      Provide password:

In both cases, installation ends with:

⚠️       Open Telemetry configuration stored in file:
        /home/johndoe/.deepfellow/server/otel-collector-config.yaml
        Please review its content before starting the DeepFellow Server.

To use an existing OTel server instead of running one locally, answer y to "Do you have an Open Telemetry server ready?" You will be asked to provide the URL:

❓      Provide OTL url (http://otel-collector:4317):

If you use a service name like otel-collector, Docker will resolve it to the otel-collector service in compose. Be careful: localhost will not work as it refers to the container's own loopback interface.

To set up a local OTel collector without interactive prompts, use --otel-local in non-interactive mode. See Non-Interactive Installation.

By default, the server exports only traces to the collector. To also forward the server's Python log records, set DF_OTEL_LOGGING_ENABLED to true:

deepfellow server env set DF_OTEL_LOGGING_ENABLED true

The server ships logs to the endpoint defined by DF_OTEL_EXPORTER_OTLP_ENDPOINT (default http://localhost:4317). This endpoint must accept the OTLP log signal over insecure gRPC. The server exports logs under the service name llm-audit, which lets you correlate them with existing traces in your observability backend. Tracing and log export are independent. Enable each one with its own variable, DF_OTEL_TRACING_ENABLED and DF_OTEL_LOGGING_ENABLED.

Nightshift and RabbitMQ

The installer always sets up the Nightshift background worker and the RabbitMQ queue it reads from. Nightshift runs Metadata Expansion, Document Summarization, and Knowledge Graph jobs, with retries that survive a server restart. The worker runs in its own nightshift container, from the same image as the server.

First, choose the worker's operating mode:

❓      Choose Nightshift worker operating mode always
  • always: the worker runs continuously. This is the default.
  • shift: the worker runs only between a start hour and a stop hour. Tasks queued outside those hours wait in RabbitMQ until the next start.

shift mode requires a Linux host booted with systemd and a reachable systemd user session. On other hosts, the installer offers only always. If you run the installer from a shell without your user session, for example after su or sudo -u, log in as that user directly, for example over SSH or a console. If you choose shift, the installer asks for both hours, in HH:MM 24-hour format and the host timezone:

❓      Choose Nightshift worker operating mode shift
⚠️      In shift mode, tasks queued outside the worker's active hours wait in RabbitMQ until its next scheduled start - they are not processed by the server in the meantime.
❓      Provide the hour Nightshift worker should start (HH:MM, host timezone) (22:00):
❓      Provide the hour Nightshift worker should stop (HH:MM, host timezone) (06:00):

In shift mode, the installer creates two user-level systemd timers. Both run the same command, which starts or stops the worker to match the schedule. To keep the timers running without a login session, the installer also runs loginctl enable-linger for your user, and skips this step when lingering is already enabled. If the step needs root on your host, the installer asks to retry it with sudo, and sudo asks for your password. In non-interactive mode, the installer runs sudo -n instead, so the step fails if sudo needs a password.

The timer names are the same for every install, so only one install per user can use shift mode. See Nightshift Operating Modes.

In shift mode, if you start the server outside the scheduled hours, the worker stays stopped until the next start hour. See Start.

Next, choose where RabbitMQ runs:

❓      Install a local RabbitMQ for DeepFellow Server? [y/n] (y):
💡      A default RabbitMQ setup is created.

A local RabbitMQ runs in the rabbitmq container, with a generated username and password. The container has the fixed hostname rabbitmq and a 4-hour consumer timeout, so a long job is not redelivered while it runs. A reinstall keeps the existing credentials.

To connect to an existing RabbitMQ instance instead, answer n. You will be asked for its address, username, and password:

❓      Install a local RabbitMQ for DeepFellow Server? [y/n] (y): n
❓      Provide host:port for RabbitMQ e.g. 192.168.1.5:5672: rabbitmq.example.com:5672
❓      Provide RabbitMQ username:
❓      Provide RabbitMQ password:

The username and password cannot contain whitespace or any of the characters @ / : ? # [ ] %, because they are part of the connection URI.

If you run the installer again, the prompts default to the values in the rabbitmq section of config.json, when that section exists, instead of the possibly outdated DF_RABBITMQ_* values in .env. After the first start, change the broker connection with deepfellow server config set, not with deepfellow server env set. See deepfellow server env.

In non-interactive mode, pass the credentials with flags. Passing any --rabbitmq-url other than the default rabbitmq:5672 also selects an existing instance.

To change the mode or the hours after installation, use deepfellow server nightshift mode and deepfellow server nightshift schedule. See deepfellow server nightshift.

After configuring the components, successful installation will be confirmed:

💡      Generated /home/johndoe/.deepfellow/server/.env.
💡      A default Qdrant setup is created.
💡      Updated /home/johndoe/.deepfellow/config.
💡      Saved Docker Compose configuration to /home/johndoe/.deepfellow/server/compose.yaml
✅      DeepFellow Server Installed.
        Call `deepfellow server start`.

Non-Interactive Installation

For scripting and automation, pass --non-interactive with the required options:

deepfellow --non-interactive server install

The installer applies default values for all prompts and auto-generates secrets. To customize any value after installation, use deepfellow server env set. See Envs for the full list of variables.

OpenTelemetry in Non-Interactive Mode

In non-interactive mode, you have two ways to enable tracing:

  • --otel-local – starts a local debug-only OTel collector as part of the Docker Compose stack. No Elasticsearch is required. Use this for development or testing environments where you want tracing enabled without an external OTel backend.
  • --otel-url URL – connects to an existing OTel collector at the given gRPC endpoint.

--otel-local and --otel-url are mutually exclusive. Pass only one.

To install DeepFellow Server with a local OTel collector:

deepfellow --non-interactive server install \
  --infra-url http://infra:8086 \
  --otel-local

The collector writes traces to its debug exporter only. To ship traces to Elasticsearch, use --otel-url and point it at an existing OTel collector configured with an Elasticsearch exporter, or run the interactive installer.

Nightshift in Non-Interactive Mode

In non-interactive mode, the installer runs the Nightshift worker in always mode with a local RabbitMQ. To run the worker on a schedule instead, pass --nightshift-mode shift with the hours. The installer rejects any mode other than always or shift, and any hours where start and stop are equal:

deepfellow --non-interactive server install \
  --nightshift-mode shift \
  --nightshift-start 22:00 \
  --nightshift-stop 06:00

To connect to an existing RabbitMQ instance, pass --rabbitmq-url, --rabbitmq-username, and --rabbitmq-password.

On a reinstall, the installer keeps the stored mode and hours unless you pass the flags again. An explicit --nightshift-mode always replaces a stored shift mode, and the installer removes the timers.

If you omit --nightshift-start or --nightshift-stop, the installer keeps the stored hour, and uses 22:00 or 06:00 only when none is stored.

An install created before Nightshift existed has no worker. The related commands print a hint to run deepfellow server install to add it. See Nightshift Operating Modes.

Published Ports

By default, DeepFellow Server publishes its port, 8000, on all network interfaces of the host. Docker manages its own firewall rules for published ports, so a host firewall such as ufw doesn't block them. The installer warns you about it:

⚠️      DeepFellow Server port is published on all network interfaces, and Docker bypasses host firewalls such as ufw. Set a bind address (e.g. 127.0.0.1) to restrict it.

To publish the port on one address only, pass --bind-address with an IPv4 or IPv6 address:

deepfellow server install --bind-address 127.0.0.1

The installer stores the address in .env as DF_SERVER_BIND_ADDRESS and writes an IPv6 address in brackets, for example [::1]. A reinstall keeps the stored address. To publish the port on all interfaces again, pass --bind-address "". An empty value covers both IPv4 and IPv6. The installer also shows the warning for 0.0.0.0 and ::, but 0.0.0.0 publishes the port on IPv4 interfaces only.

With a bind address, the CLI reaches the server at that address instead of localhost. For example, deepfellow server start prints DeepFellow Server started on http://127.0.0.1:8000.

The bundled MongoDB publishes its port, 27017 by default, on 127.0.0.1 only. With --dev, the installer publishes the ports of the other internal services on 127.0.0.1 too. The containers reach each other over the Docker network, so they don't use these host ports. To reach the internal services from other hosts, set DF_INTERNAL_BIND_ADDRESS to an empty value and confirm the server restart that the command offers:

deepfellow server env set INTERNAL_BIND_ADDRESS ""

DF_INTERNAL_BIND_ADDRESS also accepts a host address. See Deployment Variables.

To change the bind address of an existing install, set the variable with deepfellow server env set and confirm the restart. The command checks the address and writes an IPv6 address in brackets. On an install made with an earlier CLI version, run deepfellow server update first. See Published Ports.

After Installation

Start

$ deepfellow server start
💡      Starting DeepFellow Server
💡      DeepFellow Server started on http://localhost:8000

deepfellow server start also starts RabbitMQ and the Nightshift worker. What happens to the worker depends on its operating mode:

  • always: the worker starts with the rest of the stack. The command waits until the worker passes its health check.

  • shift: the worker starts only if the current local time falls between the start and stop hours. Outside that window, the command leaves the worker stopped and prints:

    💡      Nightshift is in shift mode and outside its scheduled hours - leaving the worker stopped.

    The nightshift-start timer starts the worker at the next start hour. To start it earlier, run deepfellow server nightshift start.

To check whether the worker is running, run deepfellow server status or deepfellow server nightshift status.

If DeepFellow Server passes its health check but the worker fails its own, the command exits with an error. DeepFellow Server keeps running, but background jobs wait in RabbitMQ until the worker recovers. The most common cause is that the worker cannot connect to RabbitMQ:

💀      DeepFellow Server is running, but the Nightshift worker failed its healthcheck, so background jobs are not being processed.
💡      The most common cause is that Nightshift can't connect to RabbitMQ. The server and Nightshift take the RabbitMQ address from the `rabbitmq` section of the server's config.json, not from .env.
💡      See the worker's logs: `docker compose logs nightshift` (in /Users/simplito/.deepfellow/server).
💡      Check the RabbitMQ settings: `deepfellow server config get` (the `rabbitmq` keys).
💡      Fix them without a restart, e.g. `deepfellow server config set 'rabbitmq={"host": "...", "port": 5672, "username": "...", "password": "..."}'` - the keys are the ones `config get` shows, and Nightshift reloads on its own once config.json changes.
💡      If the server image predates the Nightshift healthcheck (no `server.workers.healthcheck` module), the worker can never pass it - update the server image.

If DeepFellow Server itself fails its health check, the command prints only a general error. See the Docker output above it.

To fix the RabbitMQ connection:

Check the worker's logs. Run docker compose logs nightshift in the server installation directory.

Check the RabbitMQ settings with deepfellow server config get. The server and the worker read the broker address from the rabbitmq section of config.json, not from .env.

Correct the settings with deepfellow server config set. Pass only the fields you change:

deepfellow server config set 'rabbitmq={"host": "RABBITMQ_HOST", "port": 5672, "username": "RABBITMQ_USER", "password": "RABBITMQ_PASSWORD"}'

The keys are the same as in the rabbitmq section of the deepfellow server config get output. For the RabbitMQ that the installer sets up, the host is rabbitmq. The server accepts the change only if it reaches the new broker. The worker reloads on its own, without a restart. See RabbitMQ Connection.

The worker's health check needs a DeepFellow Server image from the release that removes DF_NIGHTSHIFT_ENABLED or later. With an older image, for example one set with deepfellow server install --image or deepfellow server update --tag, the worker never passes the health check, and every start ends with the error above. Use a newer image. See Updates.

Create Admin Account

Before creating Admin account the DeepFellow Server should be up. If DeepFellow Server is down, enter deepfellow server start command.

To create Admin account use deepfellow server create-admin command:

$ deepfellow server create-admin
❓      Provide admin name: admin
❓      Provide admin email: admin@example.com
❓      Provide admin password:
💡      Admin account created.

Login

See Logging In to authenticate on DeepFellow Server via CLI.

Reset Password

To reset the password for a DeepFellow Server account, see Resetting a Password.

Configure Email for Invitations

DeepFellow Server sends invitations over email. See Configure Email for Invitations to set up the required SMTP server.

Envs

See Configuration for every variable DeepFellow Server reads, with its config.json field and default value. See Environment Variables (CLI) to inspect and change them from the command line.

Restart

To apply a configuration change or recover the stack without running two commands, restart DeepFellow Server. The restart command stops the whole Docker Compose stack, then starts it again.

$ deepfellow server restart
💡 Restarting DeepFellow Server
💡 DeepFellow Server started on http://localhost:8000

To restart an installation in a non-default location, pass --directory (or --dir).

The first installation without --directory becomes the default location for subsequent commands. Installing another DeepFellow Server without --directory will not change the default; pass --directory to target it explicitly.

Uninstall

See Uninstall to remove DeepFellow Server.

We use cookies on our website. We use them to ensure proper functioning of the site and, if you agree, for purposes such as analytics, marketing, and targeting ads.