JournivJourniv
Installation

Quick Start

Quickly install a slim version of Journiv to start trying all the features Journiv provides.

You can quickly run a simple version of Journiv with minimal configuration to try out all the features. For production usage please please use official docker-compose files.

Create a docker-compose.yml file:

services:
  journiv:
    image: swalabtech/journiv-app:latest
    container_name: journiv
    ports:
      - "8000:8000"
    environment:
      - SECRET_KEY=your-secret-key-here
      - DOMAIN_NAME=192.168.1.1
    volumes:
      - journiv_data:/data
    restart: unless-stopped

volumes:
  journiv_data:

Start the container:

docker compose up -d

Alternatively you can also run Journiv with docker run. This is the fastest way to get Journiv running with just one command.

docker run -d \
  --name journiv \
  -p 8000:8000 \
  -e SECRET_KEY=$(openssl rand -base64 32) \
  -e DOMAIN_NAME=192.168.1.1 \
  -v journiv_data:/data \
  --restart unless-stopped \
  swalabtech/journiv-app:latest

Run Journiv using Podman, a daemonless container engine that's compatible with Docker.

Important: When using rootless Podman, use Podman volumes instead of bind mounts to avoid permission issues. The container runs as a non-root user (UID 1000), and rootless Podman remaps UIDs/GIDs, which can cause permission errors with bind-mounted directories.

First, create a Podman volume:

podman volume create journiv_data

Then run the container:

podman run -d \
  --name journiv \
  -v journiv_data:/data \
  -p 8000:8000 \
  -e SECRET_KEY=$(openssl rand -base64 32) \
  -e DOMAIN_NAME=192.168.1.1 \
  docker.io/swalabtech/journiv-app:latest

Note: If you're using an environment file, you can use --env-file instead:

podman run -d \
  --name journiv \
  -v journiv_data:/data \
  -p 8000:8000 \
  --env-file $(pwd)/journiv.env \
  docker.io/swalabtech/journiv-app:latest

Using Podman volumes ensures proper permissions and works reliably across different platforms, including macOS with Podman running in a Linux VM.

After the container starts, visit http://192.168.1.1:8000 to access your Journiv instance. Important: Use a different SECRET_KEY for each instance. Never share your secret key or commit it to version control.

Generate a Secure SECRET_KEY

Before starting, generate a strong secret key:

# Using OpenSSL (recommended)
openssl rand -base64 32

# Using Python
python -c "import secrets; print(secrets.token_urlsafe(32))"

Replace your-secret-key-here in the docker-compose.yml file with the generated key.```

Important: Add .env to .gitignore to prevent committing secrets to version control.

Volume Mounts

The container uses /data as the data directory. Mount this to persist data:

# Named volume (recommended for Docker)
-v journiv_data:/data

# Bind mount (for easy access to files)
# When using bind mounts please ensure permissions are set correctly
-v /path/to/local/data:/data

Data stored in /data:

  • Database file (journiv.db for SQLite)
  • Media files (media/)
  • Logs (logs/)
  • Exports (exports/)
  • Imports (imports/)

Database Configuration

SQLite (Default)

No additional configuration needed. Data is stored in the mounted volume at /data/journiv.db.

Port Configuration

Change the host port if 8000 is already in use:

# Use port 8080 on host, 8000 in container
-p 8080:8000

Access Journiv at http://192.168.1.1:8080 instead.

See Configuration for detailed production setup.