InstallDocker Compose

Install with Docker Compose

Install Bekci in /opt/bekci with a docker-compose.yml file. SQLite or external PostgreSQL; updating is a single command.

On this page

With Docker Compose every setting lives in one file (docker-compose.yml). Starting, stopping and updating are single commands; to change a setting you edit the file and restart. Total time: about 5 minutes.

This guide opens the panel at http://SERVER-IP:8080. If you want HTTPS on your own domain, go straight to the HTTPS install (Caddy); that guide uses Compose as well.

1. Check Docker and Compose#

terminal
docker compose version

2. Create a folder#

We'll use /opt/bekci for Bekci's files. You can choose another place; what matters is that you run all later docker compose commands from inside this folder.

terminal
mkdir -p /opt/bekci
cd /opt/bekci

3. Create docker-compose.yml#

Pick your database. If in doubt, choose SQLite: it needs no extra service and is the lightest option (which database?).

Create the file with the nano text editor:

terminal
nano docker-compose.yml

Copy the content below and paste it into the nano window (in most terminals: right-click or Ctrl+Shift+V):

External PostgreSQL

This file also starts a PostgreSQL 18 container next to Bekci. If you'll use your own PostgreSQL server instead, delete the db service and point DATABASE_URL at that server.

/opt/bekci/docker-compose.ymlDownload
# Bekci — install with Docker Compose (external PostgreSQL)
# Guide: https://bekci.app/en/docs/install/docker-compose/
# Change the password in BOTH places the same way (DATABASE_URL and POSTGRES_PASSWORD).
name: bekci
services:
  bekci:
    image: kadirsungurlu/bekci:latest
    restart: unless-stopped
    stop_grace_period: 30s
    ports:
      - "8080:8080"
    environment:
      BASE_URL: http://203.0.113.10:8080   # the address you open the panel at
      TZ: Europe/Istanbul
      DATABASE_URL: postgres://bekci:A-STRONG-PASSWORD@db:5432/bekci?sslmode=disable
    volumes:
      - bekci-data:/data   # backups and temporary files
    depends_on:
      db:
        condition: service_healthy
  db:
    image: postgres:18-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: bekci
      POSTGRES_PASSWORD: A-STRONG-PASSWORD
      POSTGRES_DB: bekci
    volumes:
      - db-data:/var/lib/postgresql
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U bekci -d bekci"]
      interval: 5s
      retries: 10
volumes:
  bekci-data:
  db-data:

Change the highlighted parts: your server's IP address and a strong password, the same in both places. Use only letters and digits in the password (e.g. a random 24-character string); characters such as @, :, /, ? and # break the connection URL.

Save and exit: Ctrl+O, then Enter (save), then Ctrl+X (exit).

4. Start it#

terminal
docker compose up -d

The first time, the image is downloaded from Docker Hub (a few seconds to a minute).

5. Open the panel#

Open http://SERVER-IP:8080 in your browser and create your admin account on the Welcome screen (details). If it doesn't open, allow port 8080/TCP in your provider's firewall (firewall note).

Logs#

terminal
cd /opt/bekci
docker compose logs -f bekci      # follow, Ctrl+C to quit
docker compose logs --tail 50 bekci

Updating#

terminal
cd /opt/bekci
docker compose pull
docker compose up -d

pull downloads the new image and up -d recreates the container with it; your data stays in the volume. Back up before updating and learn how to pin versions: Updates, backups and rollback.

Changing a setting#

After changing something in docker-compose.yml (e.g. BASE_URL), run:

terminal
docker compose up -d

Compose notices the change and recreates the container with the new settings.

Stopping and removing#

terminal
docker compose stop     # stop (the container is kept)
docker compose start    # start again
docker compose down     # remove the container; the data stays in the volume

Your data lives in a volume named bekci_bekci-data (Compose prefixes volume names with the project name). docker volume ls lists volumes.