[GH-ISSUE #630] sqlite_web does not work with papermerge's default database #493

Closed
opened 2026-02-25 21:32:02 +03:00 by kerem · 3 comments
Owner

Originally created by @WolfgangFahl on GitHub (Aug 25, 2024).
Original GitHub issue: https://github.com/ciur/papermerge/issues/630

Originally assigned to: @ciur on GitHub.

Description
I am trying to add an sqlite_web service to my papermerge script

apermerge_sqlite_web  |     _create_model(table, models)
papermerge_sqlite_web  |   File "/usr/local/lib/python3.7/site-packages/playhouse/reflection.py", line 688, in _create_model
papermerge_sqlite_web  |     _create_model(dest, models)
papermerge_sqlite_web  |   File "/usr/local/lib/python3.7/site-packages/playhouse/reflection.py", line 688, in _create_model
papermerge_sqlite_web  |     _create_model(dest, models)
papermerge_sqlite_web  |   File "/usr/local/lib/python3.7/site-packages/playhouse/reflection.py", line 688, in _create_model
papermerge_sqlite_web  |     _create_model(dest, models)
papermerge_sqlite_web  |   [Previous line repeated 989 more times]
papermerge_sqlite_web  |   File "/usr/local/lib/python3.7/site-packages/playhouse/reflection.py", line 684, in _create_model
papermerge_sqlite_web  |     for foreign_key in database.foreign_keys[table]:
papermerge_sqlite_web  | RecursionError: maximum recursion depth exceeded while calling a Python object

Info:

papermerge script v0.0.5

#!/bin/bash
# WF 2024-08-24
# Setup and manage Papermerge using Docker Compose
VERSION="0.0.5"
pm_root=$HOME/.papermerge
pm_compose=$pm_root/docker-compose.yml
pm_env=$pm_root/.env

# Color definitions
blue='\033[0;34m'
red='\033[0;31m'
green='\033[0;32m'
orange='\033[38;5;208m'  # This is a close approximation of orange
yellow='\033[0;33m'
endColor='\033[0m'

# Function to display colored messages
color_msg() {
  local l_color="$1"
  local l_msg="$2"
  echo -e "${l_color}$l_msg${endColor}"
}

# Function to display errors
error() {
  local l_msg="$1"
  color_msg $red "Error:" 1>&2
  color_msg $red "\t$l_msg" 1>&2
  exit 1
}

# Function to display warnings
warning() {
  local l_msg="$1"
  color_msg $orange "⚠️:$l_msg"
}

# Function to display negative messages
negative() {
  local l_msg="$1"
  color_msg $red "❌:$l_msg"
}

# Function to display positive messages
positive() {
  local l_msg="$1"
  color_msg $green "✅:$l_msg"
}

# Function to display usage information
usage() {
  echo "Usage: $0 [OPTIONS]"
  echo "Options:"
  echo "  -b, --bash             Open a bash shell in the Papermerge container"
  echo "  -c, --config           View current configuration"
  echo "  -d, --debug            Enable debug mode"
  echo "  -dn, --down            Stop Papermerge services"
  echo "  -f, --force            Force setup even if configuration already exists"
  echo "  -h, --help             Show this help message"
  echo "  -l, --logs             View Papermerge logs"
  echo "  -p, --port PORT        Set the port for Papermerge (default: 12000)"
  echo "  --sqlite-port PORT     Set the port for SQLite web interface (default: 8080)"
  echo "  -s, --setup            Setup Papermerge Docker Compose configuration"
  echo "  -t, --token            Create a token for the user specified in .env"
  echo "  -u, --up               Start Papermerge services"
  echo "  -v, --version          Show version information"
  exit 1
}

# Function to setup Papermerge
setup_papermerge() {
  local force=$1

  if [ -f "$pm_compose" ] && [ "$force" != "true" ]; then
    warning "Papermerge configuration already exists."
    warning "Use -f or --force option to override the existing setup."
    return
  fi

  if [ ! -d "$pm_root" ]; then
    color_msg $blue "Creating $pm_root"
    mkdir -p "$pm_root"
  fi

  cat << EOF > "$pm_compose"
x-backend: &common
  platform: linux/x86_64
  image: papermerge/papermerge:3.0.3
  env_file: .env
  volumes:
    - data:/db
    - index_db:/core_app/index_db
    - \${PAPERMERGE_MEDIA:-./media}:/core_app/media

services:
  web:
    <<: *common
    container_name: papermerge_web
    ports:
     - "\${PAPERMERGE_PORT:-12000}:80"
    depends_on:
      - redis

  worker:
    <<: *common
    container_name: papermerge_worker
    command: worker

  redis:
    image: redis:6
    container_name: papermerge_redis

  sqlite_web:
    image: coleifer/sqlite-web
    container_name: papermerge_sqlite_web
    environment:
      - SQLITE_DATABASE=/db/db.sqlite3
    volumes:
      - data:/db
    ports:
      - "\${PAPERMERGE_SQLITE_WEB_PORT:-8080}:8080"
    command: sqlite_web --host 0.0.0.0 /db/db.sqlite3

volumes:
  data:
  index_db:
EOF

  if [ ! -f "$pm_env" ]; then
    warning ".env file not found. Creating a default .env file."
    cat << EOF > "$pm_env"
PAPERMERGE_PORT=12000
PAPERMERGE_SQLITE_WEB_PORT=8080
EOF
  else
    if ! grep -q "PAPERMERGE_PORT" "$pm_env"; then
      echo "PAPERMERGE_PORT=12000" >> "$pm_env"
    fi
    if ! grep -q "PAPERMERGE_SQLITE_WEB_PORT" "$pm_env"; then
      echo "PAPERMERGE_SQLITE_WEB_PORT=8080" >> "$pm_env"
    fi
  fi

  positive "Papermerge Docker Compose configuration has been set up in $pm_root"
}

# Function to set a port in the .env file
set_port() {
  local port_name=$1
  local port_value=$2
  if [ -f "$pm_env" ]; then
    sed -i "/^${port_name}=/d" "$pm_env"
  fi
  echo "${port_name}=${port_value}" >> "$pm_env"
  positive "${port_name} set to ${port_value}"
}

# Function to start Papermerge services
start_services() {
  if [ ! -f "$pm_env" ]; then
    error ".env file not found. Please create $pm_env with the necessary environment variables."
  fi
  cd "$pm_root" && docker compose up -d
  positive "Papermerge services started"
}

# Function to stop Papermerge services
stop_services() {
  cd "$pm_root" && docker compose down
  positive "Papermerge services stopped"
}

# Function to view Papermerge logs
view_logs() {
  cd "$pm_root" && docker compose logs -f
}

# Function to view current configuration
view_config() {
  if [ -f "$pm_compose" ]; then
    cat "$pm_compose"
  else
    negative "docker-compose.yml not found. Please run setup first."
  fi
}

# Function to open a bash shell in the Papermerge container
open_bash() {
  docker exec -it papermerge_web /bin/bash
}

# Function to create a token for the user specified in .env
create_token() {
  if [ ! -f "$pm_env" ]; then
    error ".env file not found. Please create $pm_env with the necessary environment variables."
  fi

  # Read the PAPERMERGE__AUTH__USERNAME variable from .env file
  source "$pm_env"
  if [ -z "$PAPERMERGE__AUTH__USERNAME" ]; then
    error "PAPERMERGE__AUTH__USERNAME not found in .env file. Please specify the username."
  fi

  docker exec papermerge_web create_token.sh "$PAPERMERGE__AUTH__USERNAME"
  positive "Token created for user $PAPERMERGE__AUTH__USERNAME"
}

# Initialize flags
action_performed=false
force_setup=false

# Parse command line arguments
while [[ $# -gt 0 ]]; do
  case $1 in
    -b|--bash)
      open_bash
      action_performed=true
      ;;
    -c|--config)
      view_config
      action_performed=true
      ;;
    -d|--debug)
      set -x
      ;;
    -dn|--down)
      stop_services
      action_performed=true
      ;;
    -f|--force)
      force_setup=true
      ;;
    -h|--help)
      usage
      ;;
    -l|--logs)
      view_logs
      action_performed=true
      ;;
    -p|--port)
      if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
        set_port "PAPERMERGE_PORT" "$2"
        shift
        action_performed=true
      else
        error "Error: Argument for $1 is missing"
      fi
      ;;
    --sqlite-port)
      if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
        set_port "PAPERMERGE_SQLITE_WEB_PORT" "$2"
        shift
        action_performed=true
      else
        error "Error: Argument for $1 is missing"
      fi
      ;;
    -s|--setup)
      setup_papermerge $force_setup
      action_performed=true
      ;;
    -t|--token)
      create_token
      action_performed=true
      ;;
    -u|--up)
      start_services
      action_performed=true
      ;;
    -v|--version)
      echo "Version: $VERSION"
      action_performed=true
      ;;
    *)
      error "Unknown option: $1"
      ;;
  esac
  shift
done

# If no action was performed, show usage
if [ "$action_performed" = false ]; then
  usage
fi
Originally created by @WolfgangFahl on GitHub (Aug 25, 2024). Original GitHub issue: https://github.com/ciur/papermerge/issues/630 Originally assigned to: @ciur on GitHub. **Description** I am trying to add an sqlite_web service to my papermerge script ```bash apermerge_sqlite_web | _create_model(table, models) papermerge_sqlite_web | File "/usr/local/lib/python3.7/site-packages/playhouse/reflection.py", line 688, in _create_model papermerge_sqlite_web | _create_model(dest, models) papermerge_sqlite_web | File "/usr/local/lib/python3.7/site-packages/playhouse/reflection.py", line 688, in _create_model papermerge_sqlite_web | _create_model(dest, models) papermerge_sqlite_web | File "/usr/local/lib/python3.7/site-packages/playhouse/reflection.py", line 688, in _create_model papermerge_sqlite_web | _create_model(dest, models) papermerge_sqlite_web | [Previous line repeated 989 more times] papermerge_sqlite_web | File "/usr/local/lib/python3.7/site-packages/playhouse/reflection.py", line 684, in _create_model papermerge_sqlite_web | for foreign_key in database.foreign_keys[table]: papermerge_sqlite_web | RecursionError: maximum recursion depth exceeded while calling a Python object ``` **Info:** - Papermerge Version [e.g. 3.0.3] see https://github.com/coleifer/sqlite-web/issues/78 **papermerge script v0.0.5** ```bash #!/bin/bash # WF 2024-08-24 # Setup and manage Papermerge using Docker Compose VERSION="0.0.5" pm_root=$HOME/.papermerge pm_compose=$pm_root/docker-compose.yml pm_env=$pm_root/.env # Color definitions blue='\033[0;34m' red='\033[0;31m' green='\033[0;32m' orange='\033[38;5;208m' # This is a close approximation of orange yellow='\033[0;33m' endColor='\033[0m' # Function to display colored messages color_msg() { local l_color="$1" local l_msg="$2" echo -e "${l_color}$l_msg${endColor}" } # Function to display errors error() { local l_msg="$1" color_msg $red "Error:" 1>&2 color_msg $red "\t$l_msg" 1>&2 exit 1 } # Function to display warnings warning() { local l_msg="$1" color_msg $orange "⚠️:$l_msg" } # Function to display negative messages negative() { local l_msg="$1" color_msg $red "❌:$l_msg" } # Function to display positive messages positive() { local l_msg="$1" color_msg $green "✅:$l_msg" } # Function to display usage information usage() { echo "Usage: $0 [OPTIONS]" echo "Options:" echo " -b, --bash Open a bash shell in the Papermerge container" echo " -c, --config View current configuration" echo " -d, --debug Enable debug mode" echo " -dn, --down Stop Papermerge services" echo " -f, --force Force setup even if configuration already exists" echo " -h, --help Show this help message" echo " -l, --logs View Papermerge logs" echo " -p, --port PORT Set the port for Papermerge (default: 12000)" echo " --sqlite-port PORT Set the port for SQLite web interface (default: 8080)" echo " -s, --setup Setup Papermerge Docker Compose configuration" echo " -t, --token Create a token for the user specified in .env" echo " -u, --up Start Papermerge services" echo " -v, --version Show version information" exit 1 } # Function to setup Papermerge setup_papermerge() { local force=$1 if [ -f "$pm_compose" ] && [ "$force" != "true" ]; then warning "Papermerge configuration already exists." warning "Use -f or --force option to override the existing setup." return fi if [ ! -d "$pm_root" ]; then color_msg $blue "Creating $pm_root" mkdir -p "$pm_root" fi cat << EOF > "$pm_compose" x-backend: &common platform: linux/x86_64 image: papermerge/papermerge:3.0.3 env_file: .env volumes: - data:/db - index_db:/core_app/index_db - \${PAPERMERGE_MEDIA:-./media}:/core_app/media services: web: <<: *common container_name: papermerge_web ports: - "\${PAPERMERGE_PORT:-12000}:80" depends_on: - redis worker: <<: *common container_name: papermerge_worker command: worker redis: image: redis:6 container_name: papermerge_redis sqlite_web: image: coleifer/sqlite-web container_name: papermerge_sqlite_web environment: - SQLITE_DATABASE=/db/db.sqlite3 volumes: - data:/db ports: - "\${PAPERMERGE_SQLITE_WEB_PORT:-8080}:8080" command: sqlite_web --host 0.0.0.0 /db/db.sqlite3 volumes: data: index_db: EOF if [ ! -f "$pm_env" ]; then warning ".env file not found. Creating a default .env file." cat << EOF > "$pm_env" PAPERMERGE_PORT=12000 PAPERMERGE_SQLITE_WEB_PORT=8080 EOF else if ! grep -q "PAPERMERGE_PORT" "$pm_env"; then echo "PAPERMERGE_PORT=12000" >> "$pm_env" fi if ! grep -q "PAPERMERGE_SQLITE_WEB_PORT" "$pm_env"; then echo "PAPERMERGE_SQLITE_WEB_PORT=8080" >> "$pm_env" fi fi positive "Papermerge Docker Compose configuration has been set up in $pm_root" } # Function to set a port in the .env file set_port() { local port_name=$1 local port_value=$2 if [ -f "$pm_env" ]; then sed -i "/^${port_name}=/d" "$pm_env" fi echo "${port_name}=${port_value}" >> "$pm_env" positive "${port_name} set to ${port_value}" } # Function to start Papermerge services start_services() { if [ ! -f "$pm_env" ]; then error ".env file not found. Please create $pm_env with the necessary environment variables." fi cd "$pm_root" && docker compose up -d positive "Papermerge services started" } # Function to stop Papermerge services stop_services() { cd "$pm_root" && docker compose down positive "Papermerge services stopped" } # Function to view Papermerge logs view_logs() { cd "$pm_root" && docker compose logs -f } # Function to view current configuration view_config() { if [ -f "$pm_compose" ]; then cat "$pm_compose" else negative "docker-compose.yml not found. Please run setup first." fi } # Function to open a bash shell in the Papermerge container open_bash() { docker exec -it papermerge_web /bin/bash } # Function to create a token for the user specified in .env create_token() { if [ ! -f "$pm_env" ]; then error ".env file not found. Please create $pm_env with the necessary environment variables." fi # Read the PAPERMERGE__AUTH__USERNAME variable from .env file source "$pm_env" if [ -z "$PAPERMERGE__AUTH__USERNAME" ]; then error "PAPERMERGE__AUTH__USERNAME not found in .env file. Please specify the username." fi docker exec papermerge_web create_token.sh "$PAPERMERGE__AUTH__USERNAME" positive "Token created for user $PAPERMERGE__AUTH__USERNAME" } # Initialize flags action_performed=false force_setup=false # Parse command line arguments while [[ $# -gt 0 ]]; do case $1 in -b|--bash) open_bash action_performed=true ;; -c|--config) view_config action_performed=true ;; -d|--debug) set -x ;; -dn|--down) stop_services action_performed=true ;; -f|--force) force_setup=true ;; -h|--help) usage ;; -l|--logs) view_logs action_performed=true ;; -p|--port) if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then set_port "PAPERMERGE_PORT" "$2" shift action_performed=true else error "Error: Argument for $1 is missing" fi ;; --sqlite-port) if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then set_port "PAPERMERGE_SQLITE_WEB_PORT" "$2" shift action_performed=true else error "Error: Argument for $1 is missing" fi ;; -s|--setup) setup_papermerge $force_setup action_performed=true ;; -t|--token) create_token action_performed=true ;; -u|--up) start_services action_performed=true ;; -v|--version) echo "Version: $VERSION" action_performed=true ;; *) error "Unknown option: $1" ;; esac shift done # If no action was performed, show usage if [ "$action_performed" = false ]; then usage fi ```
kerem 2026-02-25 21:32:02 +03:00
  • closed this issue
  • added the
    bug
    label
Author
Owner

@WolfgangFahl commented on GitHub (Aug 25, 2024):

The workaround is in the latest version of the script

papermerge -h

Usage: scripts/papermerge [OPTIONS]
Options:
...
  --sqlite-port PORT     Set the port for SQLite web interface (default: 8080)
  --sqlite-web           Start SQLite web interface
...
papermerge -dn
✅:Papermerge services stopped
papermerge -f -s
✅:Papermerge Docker Compose configuration has been set up in /home/wf/.papermerge
papermerge --up
[+] Running 4/4
 ✔ Network papermerge_default   Created                                                             0.2s 
 ✔ Container papermerge_worker  Started                                                            11.8s 
 ✔ Container papermerge_redis   Started                                                            11.2s 
 ✔ Container papermerge_web     Started                                                             6.5s 
✅:Papermerge services started
papermerge --sqlite-web
Successfully copied 2.05kB to papermerge_web:/run_sqlite_web.sh
Collecting sqlite-web
  Downloading sqlite-web-0.6.4.tar.gz (807 kB)
/usr/local/lib/python3.10/site-packages/playhouse/reflection.py:697: UserWarning: Possible reference cycle found between core_folder and core_basetreenode
  warnings.warn('Possible reference cycle found between '
 * Serving Flask app 'sqlite_web.sqlite_web'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:8080
 * Running on http://172.28.0.4:8080
Press CTRL+C to quit

We still have a warning: : UserWarning: Possible reference cycle found between core_folder and core_basetreenode
warnings.warn('Possible reference cycle found between '

but sqlite_web now is available as expected:
grafik

<!-- gh-comment-id:2308672961 --> @WolfgangFahl commented on GitHub (Aug 25, 2024): The workaround is in the latest version of the script ```bash papermerge -h Usage: scripts/papermerge [OPTIONS] Options: ... --sqlite-port PORT Set the port for SQLite web interface (default: 8080) --sqlite-web Start SQLite web interface ... ``` ```bash papermerge -dn ✅:Papermerge services stopped papermerge -f -s ✅:Papermerge Docker Compose configuration has been set up in /home/wf/.papermerge papermerge --up [+] Running 4/4 ✔ Network papermerge_default Created 0.2s ✔ Container papermerge_worker Started 11.8s ✔ Container papermerge_redis Started 11.2s ✔ Container papermerge_web Started 6.5s ✅:Papermerge services started papermerge --sqlite-web Successfully copied 2.05kB to papermerge_web:/run_sqlite_web.sh Collecting sqlite-web Downloading sqlite-web-0.6.4.tar.gz (807 kB) /usr/local/lib/python3.10/site-packages/playhouse/reflection.py:697: UserWarning: Possible reference cycle found between core_folder and core_basetreenode warnings.warn('Possible reference cycle found between ' * Serving Flask app 'sqlite_web.sqlite_web' * Debug mode: off WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on all addresses (0.0.0.0) * Running on http://127.0.0.1:8080 * Running on http://172.28.0.4:8080 Press CTRL+C to quit ``` We still have a warning: : UserWarning: Possible reference cycle found between core_folder and core_basetreenode warnings.warn('Possible reference cycle found between ' but sqlite_web now is available as expected: <img width="798" alt="grafik" src="https://github.com/user-attachments/assets/6945376d-6b38-4cce-b48b-d4887d806642">
Author
Owner

@ciur commented on GitHub (Aug 26, 2024):

From previous post's comment it looks to me that issue was solved. I am closing this ticket as complete then.

<!-- gh-comment-id:2309366644 --> @ciur commented on GitHub (Aug 26, 2024): From previous post's comment it looks to me that issue was solved. I am closing this ticket as complete then.
Author
Owner

@WolfgangFahl commented on GitHub (Aug 27, 2024):

Yes - you just have to know where the database is and it would IMHO also be possible to mount the /db as a volume and use external access to work with it.

<!-- gh-comment-id:2312627003 --> @WolfgangFahl commented on GitHub (Aug 27, 2024): Yes - you just have to know where the database is and it would IMHO also be possible to mount the /db as a volume and use external access to work with it.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/papermerge#493
No description provided.