Stirling-PDF icon indicating copy to clipboard operation
Stirling-PDF copied to clipboard

[Feature Request]: Automated install script for people wanting non-docker

Open Frooodle opened this issue 1 year ago • 2 comments

Feature Description

Generate a Automated install script for people wanting non-docker

Why is this feature valuable?

No response

Suggested Implementation

Mostly AI generated and needs testing (i think python side needs work and root vs non root users)

#!/bin/bash

set -e

# Stirling-PDF Installation Script
# Version: 2.4.0

# Function to log messages
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

# Function to detect if script is run with sudo
check_sudo() {
    if [ "$EUID" -ne 0 ]; then
        echo "Please run this script with sudo or as root."
        exit 1
    fi
}

# Function to detect the operating system
detect_os() {
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        OS=$NAME
    elif type lsb_release >/dev/null 2>&1; then
        OS=$(lsb_release -si)
    elif [ -f /etc/lsb-release ]; then
        . /etc/lsb-release
        OS=$DISTRIB_ID
    elif [ -f /etc/debian_version ]; then
        OS=Debian
    elif [ -f /etc/fedora-release ]; then
        OS=Fedora
    elif [ -f /etc/centos-release ]; then
        OS=CentOS
    elif [ "$(uname)" == "Darwin" ]; then
        OS=macOS
    else
        OS=$(uname -s)
    fi
    echo $OS
}

# Function to install packages based on the OS
install_packages() {
    log_message "Starting package installation"
    case $1 in
        Ubuntu|Debian)
            apt-get update
            apt-get install -y git make g++ openjdk-21-jdk
            if [ "$INSTALL_TYPE" = "full" ]; then
                apt-get install -y automake autoconf libtool libleptonica-dev pkg-config zlib1g-dev python3 python3-pip python3-venv libreoffice-writer libreoffice-calc libreoffice-impress unpaper ocrmypdf
            fi
            ;;
        Fedora|CentOS)
            dnf install -y git make gcc-c++ java-21-openjdk
            if [ "$INSTALL_TYPE" = "full" ]; then
                dnf install -y automake autoconf libtool leptonica-devel pkg-config zlib-devel python3 python3-pip python3-virtualenv libreoffice-writer libreoffice-calc libreoffice-impress unpaper ocrmypdf
            fi
            ;;
        macOS)
            brew install git make gcc openjdk@21
            if [ "$INSTALL_TYPE" = "full" ]; then
                brew install automake autoconf libtool leptonica pkg-config zlib [email protected] libreoffice unpaper ocrmypdf
            fi
            ;;
        *)
            echo "Unsupported OS. Please install the required packages manually."
            exit 1
            ;;
    esac
    log_message "Finished package installation"
}

# Function to build and install jbig2enc
install_jbig2enc() {
    if [ "$INSTALL_TYPE" = "full" ]; then
        log_message "Starting jbig2enc installation"
        mkdir -p /tmp/jbig2enc
        cd /tmp/jbig2enc
        git clone https://github.com/agl/jbig2enc.git .
        ./autogen.sh
        ./configure
        make
        make install
        cd /
        rm -rf /tmp/jbig2enc
        log_message "Finished jbig2enc installation"
    fi
}

# Function to clone and build Stirling-PDF
build_stirling_pdf() {
    log_message "Starting Stirling-PDF build"
    mkdir -p /tmp/stirling-pdf
    cd /tmp/stirling-pdf
    git clone https://github.com/Stirling-Tools/Stirling-PDF.git .
    chmod +x ./gradlew
    if [ "$SECURITY_ENABLED" = true ]; then
        export DOCKER_ENABLE_SECURITY=true
    fi
    ./gradlew build
    log_message "Finished Stirling-PDF build"
}

# Function to move Stirling-PDF files to the desired location
move_stirling_pdf() {
    log_message "Starting moving Stirling-PDF files"
    mkdir -p /opt/Stirling-PDF
    mv /tmp/stirling-pdf/build/libs/Stirling-PDF-*.jar /opt/Stirling-PDF/
    if [ "$INSTALL_TYPE" = "full" ]; then
        mv /tmp/stirling-pdf/scripts /opt/Stirling-PDF/
    fi
    rm -rf /tmp/stirling-pdf
    log_message "Finished moving Stirling-PDF files"
}

# Function to setup user and permissions
setup_user_and_permissions() {
    log_message "Starting user and permissions setup"
    local OS=$(detect_os)
    local USER_NAME="stirling-pdf"
    local INSTALL_DIR="/opt/Stirling-PDF"

    if [ "$OS" = "macOS" ]; then
        # On macOS, use the current user
        USER_NAME=$SUDO_USER
    else
        # On Unix-like systems, create a new user if it doesn't exist
        if ! id -u $USER_NAME >/dev/null 2>&1; then
            if useradd -r -s /sbin/nologin -d $INSTALL_DIR $USER_NAME; then
                echo "Created user $USER_NAME for Stirling-PDF"
            else
                echo "Failed to create user $USER_NAME. Using $SUDO_USER instead."
                USER_NAME=$SUDO_USER
            fi
        fi
    fi

    # If $SUDO_USER is empty (running as root), use root as fallback
    if [ -z "$USER_NAME" ]; then
        USER_NAME="root"
        echo "Using root user for Stirling-PDF"
    fi

    # Set ownership and permissions
    chown -R $USER_NAME:$USER_NAME $INSTALL_DIR
    chmod -R 755 $INSTALL_DIR

    # Export USER_NAME for use in other functions
    export STIRLING_USER=$USER_NAME
    log_message "Finished user and permissions setup"
}

# Function to set up Python virtual environment and install packages
setup_python_env() {
    if [ "$INSTALL_TYPE" = "full" ]; then
        log_message "Starting Python environment setup"
        python3 -m venv /opt/Stirling-PDF/venv
        chown -R $STIRLING_USER:$STIRLING_USER /opt/Stirling-PDF/venv
        sudo -u $STIRLING_USER /opt/Stirling-PDF/venv/bin/pip install --upgrade pip
        sudo -u $STIRLING_USER /opt/Stirling-PDF/venv/bin/pip install uno opencv-python-headless unoconv pngquant WeasyPrint
        log_message "Finished Python environment setup"
    fi
}

# Function to provide information about OCR language packs
ocr_lang_pack_info() {
    echo "To install additional OCR language packs, use the following commands based on your system:"
    case $OS in
        Ubuntu|Debian)
            echo "sudo apt-get install tesseract-ocr-<lang>"
            echo "For example, to install German: sudo apt-get install tesseract-ocr-deu"
            echo "To see available language packs: apt-cache search tesseract-ocr"
            ;;
        Fedora|CentOS)
            echo "sudo dnf install tesseract-langpack-<lang>"
            echo "For example, to install German: sudo dnf install tesseract-langpack-deu"
            echo "To see available language packs: dnf search tesseract-langpack"
            ;;
        macOS)
            echo "brew install tesseract-lang"
            echo "This will install all available language packs. You can't select individual languages with Homebrew."
            ;;
    esac
}

# Function to create a desktop entry
create_desktop_entry() {
    local USER_NAME=$([ "$OS" = "macOS" ] && echo $SUDO_USER || echo "stirling-pdf")
    
    mkdir -p /home/$SUDO_USER/.local/share/applications
    cat > /home/$SUDO_USER/.local/share/applications/Stirling-PDF.desktop <<EOF
[Desktop Entry]
Name=Stirling PDF
GenericName=Launch StirlingPDF and open its WebGUI
Category=Office
Exec=bash -c "xdg-open http://localhost:8080 && systemctl --user start stirlingpdf.service"
Icon=/opt/Stirling-PDF/docs/stirling-transparent.svg
Keywords=pdf
Type=Application
NoDisplay=false
Terminal=false
EOF
    chown $SUDO_USER:$SUDO_USER /home/$SUDO_USER/.local/share/applications/Stirling-PDF.desktop
    log_message "Desktop entry created"
}

# Function to create a systemd service
create_systemd_service() {
    mkdir -p /etc/systemd/system
    cat > /etc/systemd/system/stirlingpdf.service <<EOF
[Unit]
Description=Stirling-PDF service
After=network.target

[Service]
Type=simple
User=$STIRLING_USER
Group=$STIRLING_USER
WorkingDirectory=/opt/Stirling-PDF
Environment="DBUS_SESSION_BUS_ADDRESS=unix:path=/tmp/stirling-pdf-dbus"
ExecStart=/bin/bash -c 'source /opt/Stirling-PDF/venv/bin/activate && exec java -jar /opt/Stirling-PDF/Stirling-PDF-*.jar'
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

    systemctl daemon-reload
    systemctl enable stirlingpdf.service
    log_message "Systemd service created and enabled"
}

# Function to create environment file
create_env_file() {
    log_message "Starting environment file creation"
    cat > /opt/Stirling-PDF/.env <<EOF
# Custom environment variables
# APP_HOME_NAME="Stirling PDF"
# SYSTEM_DEFAULTLOCALE="en-US"
EOF
    log_message "Finished environment file creation"
}

# Main installation process
main() {
    check_sudo

    OS=$(detect_os)
    log_message "Detected OS: $OS"

    # Prompt for installation type with default
    read -p "Do you want to install lite or full Stirling PDF? (full/lite) [Default: full]: " install_choice
    install_choice=${install_choice:-full}

    case $install_choice in
        full|Full|FULL) INSTALL_TYPE="full" ;;
        lite|Lite|LITE) INSTALL_TYPE="lite" ;;
        *) echo "Invalid choice. Using default: full"; INSTALL_TYPE="full" ;;
    esac

    # Prompt for security version with default
    read -p "Do you want to install the security version of Stirling-PDF with login? (y/n) [Default: n]: " security_choice
    security_choice=${security_choice:-n}

    case $security_choice in
        [Yy]* ) SECURITY_ENABLED=true ;;
        * ) SECURITY_ENABLED=false ;;
    esac

    log_message "Starting Stirling-PDF installation"

    install_packages $OS
    install_jbig2enc
    build_stirling_pdf
    move_stirling_pdf
    setup_user_and_permissions
    setup_python_env
    create_env_file
    
    if [ "$OS" != "macOS" ]; then
        log_message "Creating desktop entry"
        create_desktop_entry
        log_message "Creating systemd service"
        create_systemd_service
    fi

    log_message "Stirling-PDF installation completed successfully!"

    echo "You can now start the application using the following method:"
    
    if [ "$OS" = "macOS" ]; then
        echo "Run the application manually (service management not available on macOS):"
        echo "source /opt/Stirling-PDF/venv/bin/activate && java -jar /opt/Stirling-PDF/Stirling-PDF-*.jar"
    else
        echo "1. Use the desktop entry (if you're in a graphical environment)"
        echo "2. Start the systemd service: sudo systemctl start stirlingpdf.service"
    fi
    
    echo ""
    echo "Additional notes:"
    echo "- Environment variables can be set in /opt/Stirling-PDF/.env"
    echo "- Stirling-PDF is running as user: $STIRLING_USER"

    if [ "$SECURITY_ENABLED" = true ]; then
        echo "- Security version installed. Please set up your login credentials."
    fi

    echo ""
    ocr_lang_pack_info
}

# Run the main installation process
main

Additional Information

No response

No Duplicate of the Feature

  • [X] I have verified that there are no existing features requests similar to my request.

Frooodle avatar Sep 09 '24 17:09 Frooodle

where to add this script to test it?

Akhil-2020171 avatar Sep 22 '24 13:09 Akhil-2020171

where to add this script to test it?

A new unix based installation

Frooodle avatar Sep 22 '24 13:09 Frooodle

if you clone the repo in /tmp, why not clone with --depth=1 ? and you can improve with this:

`# Convert to lowercase using bash parameter expansion install_choice_lower="${install_choice,,}"

case $install_choice_lower in full) INSTALL_TYPE="full" ;; lite) INSTALL_TYPE="lite" ;; *) echo "Invalid choice. Using default: full"; INSTALL_TYPE="full" ;; esac`

giovannimanzoni avatar Jun 24 '25 20:06 giovannimanzoni

Hi Everyone,

Just to cross-post the issues I found when installing jbig2enc manually today, the instructions on the StirlingPDF website lacked some key steps that might need to be outlined if we're going to continue the manual installation process going without a script or a maintainer for each OS pre-packaging software for apt installation of Stirling PDF.

https://github.com/ocrmypdf/OCRmyPDF/issues/1452

The following dependencies were not described on the website: sudo apt install -y git libtool libleptonica-dev make libjbig2dec0-dev g++ autoconf pkg-config automake autoconf-archive In order to resolve the errors that those missing dependencies caused, I had to run the following commands:

git clean -fdx
./autogen.sh
./configure
make
sudo make install

Thanks,

Tmanok

tmanok avatar Jun 29 '25 02:06 tmanok