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#
docker compose version2. 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.
mkdir -p /opt/bekci
cd /opt/bekci3. 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:
nano docker-compose.ymlCopy the content below and paste it into the nano window (in most terminals: right-click or Ctrl+Shift+V):
SQLite (recommended)
# Bekci — install with Docker Compose (SQLite)
# Guide: https://bekci.app/en/docs/install/docker-compose/
name: bekci
services:
bekci:
# To pin a version, replace "latest" with e.g. 1.0.0.
# For embedded PostgreSQL: kadirsungurlu/bekci:postgres
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
volumes:
- bekci-data:/data
volumes:
bekci-data:The only thing to change is the highlighted part: replace 203.0.113.10 with your server's IP address.
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.
# 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#
docker compose up -dThe 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#
cd /opt/bekci
docker compose logs -f bekci # follow, Ctrl+C to quit
docker compose logs --tail 50 bekciUpdating#
cd /opt/bekci
docker compose pull
docker compose up -dpull 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:
docker compose up -dCompose notices the change and recreates the container with the new settings.
Stopping and removing#
docker compose stop # stop (the container is kept)
docker compose start # start again
docker compose down # remove the container; the data stays in the volumeYour data lives in a volume named bekci_bekci-data (Compose prefixes volume names with the project name). docker volume ls lists volumes.
Something missing or wrong on this page? Report it on GitHub or email [email protected]