mirror of
https://github.com/Frooodle/Stirling-PDF.git
synced 2025-11-16 01:21:16 +01:00
# Description of Changes <!-- Please provide a summary of the changes, including: - What was changed - Why the change was made - Any challenges encountered Closes #(issue_number) --> --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md#6-testing) for more details. Co-authored-by: ConnorYoh <40631091+ConnorYoh@users.noreply.github.com>
177 lines
5.6 KiB
Bash
177 lines
5.6 KiB
Bash
#!/bin/bash
|
|
|
|
set -e
|
|
|
|
# Default MODE to BOTH if not set
|
|
MODE=${MODE:-BOTH}
|
|
|
|
echo "==================================="
|
|
echo "Stirling-PDF Unified Container"
|
|
echo "MODE: $MODE"
|
|
echo "==================================="
|
|
|
|
# Function to setup OCR (from init.sh)
|
|
setup_ocr() {
|
|
echo "Setting up OCR languages..."
|
|
|
|
# Copy tessdata
|
|
mkdir -p /usr/share/tessdata
|
|
cp -rn /usr/share/tessdata-original/* /usr/share/tessdata 2>/dev/null || true
|
|
|
|
if [ -d /usr/share/tesseract-ocr/4.00/tessdata ]; then
|
|
cp -r /usr/share/tesseract-ocr/4.00/tessdata/* /usr/share/tessdata 2>/dev/null || true
|
|
fi
|
|
|
|
if [ -d /usr/share/tesseract-ocr/5/tessdata ]; then
|
|
cp -r /usr/share/tesseract-ocr/5/tessdata/* /usr/share/tessdata 2>/dev/null || true
|
|
fi
|
|
|
|
# Install additional languages if specified
|
|
if [[ -n "$TESSERACT_LANGS" ]]; then
|
|
SPACE_SEPARATED_LANGS=$(echo $TESSERACT_LANGS | tr ',' ' ')
|
|
pattern='^[a-zA-Z]{2,4}(_[a-zA-Z]{2,4})?$'
|
|
for LANG in $SPACE_SEPARATED_LANGS; do
|
|
if [[ $LANG =~ $pattern ]]; then
|
|
apk add --no-cache "tesseract-ocr-data-$LANG" 2>/dev/null || true
|
|
fi
|
|
done
|
|
fi
|
|
}
|
|
|
|
# Function to setup user permissions (from init-without-ocr.sh)
|
|
setup_permissions() {
|
|
echo "Setting up user permissions..."
|
|
|
|
export JAVA_TOOL_OPTIONS="${JAVA_BASE_OPTS} ${JAVA_CUSTOM_OPTS}"
|
|
|
|
# Update user and group IDs
|
|
if [ ! -z "$PUID" ] && [ "$PUID" != "$(id -u stirlingpdfuser)" ]; then
|
|
usermod -o -u "$PUID" stirlingpdfuser || true
|
|
fi
|
|
|
|
if [ ! -z "$PGID" ] && [ "$PGID" != "$(getent group stirlingpdfgroup | cut -d: -f3)" ]; then
|
|
groupmod -o -g "$PGID" stirlingpdfgroup || true
|
|
fi
|
|
|
|
umask "$UMASK" || true
|
|
|
|
# Install fonts if needed
|
|
if [[ -n "$LANGS" ]]; then
|
|
/scripts/installFonts.sh $LANGS
|
|
fi
|
|
|
|
# Ensure directories exist with correct permissions
|
|
mkdir -p /tmp/stirling-pdf || true
|
|
|
|
# Set ownership and permissions
|
|
chown -R stirlingpdfuser:stirlingpdfgroup \
|
|
$HOME /logs /scripts /usr/share/fonts/opentype/noto \
|
|
/configs /customFiles /pipeline /tmp/stirling-pdf \
|
|
/var/lib/nginx /var/log/nginx /usr/share/nginx \
|
|
/app.jar 2>/dev/null || echo "[WARN] Some chown operations failed, may run as host user"
|
|
|
|
chmod -R 755 /logs /scripts /usr/share/fonts/opentype/noto \
|
|
/configs /customFiles /pipeline /tmp/stirling-pdf 2>/dev/null || true
|
|
}
|
|
|
|
# Function to configure nginx
|
|
configure_nginx() {
|
|
local backend_url=$1
|
|
echo "Configuring nginx with backend URL: $backend_url"
|
|
sed -i "s|\${BACKEND_URL}|${backend_url}|g" /etc/nginx/nginx.conf
|
|
}
|
|
|
|
# Function to run as user or root depending on permissions
|
|
run_as_user() {
|
|
if [ "$(id -u)" = "0" ]; then
|
|
# Running as root, use su-exec
|
|
su-exec stirlingpdfuser "$@"
|
|
else
|
|
# Already running as non-root
|
|
exec "$@"
|
|
fi
|
|
}
|
|
|
|
# Setup OCR and permissions
|
|
setup_ocr
|
|
setup_permissions
|
|
|
|
# Handle different modes
|
|
case "$MODE" in
|
|
BOTH)
|
|
echo "Starting in BOTH mode: Frontend + Backend on port 8080"
|
|
|
|
# Configure nginx to proxy to internal backend
|
|
configure_nginx "http://localhost:${BACKEND_INTERNAL_PORT:-8081}"
|
|
|
|
# Start backend on internal port
|
|
echo "Starting backend on port ${BACKEND_INTERNAL_PORT:-8081}..."
|
|
run_as_user sh -c "java -Dfile.encoding=UTF-8 \
|
|
-Djava.io.tmpdir=/tmp/stirling-pdf \
|
|
-Dserver.port=${BACKEND_INTERNAL_PORT:-8081} \
|
|
-jar /app.jar" &
|
|
BACKEND_PID=$!
|
|
|
|
# Start unoserver for document conversion
|
|
run_as_user /opt/venv/bin/unoserver --port 2003 --interface 127.0.0.1 &
|
|
UNO_PID=$!
|
|
|
|
# Wait for backend to start
|
|
sleep 3
|
|
|
|
# Start nginx on port 8080
|
|
echo "Starting nginx on port 8080..."
|
|
run_as_user nginx -g "daemon off;" &
|
|
NGINX_PID=$!
|
|
|
|
echo "==================================="
|
|
echo "✓ Frontend available at: http://localhost:8080"
|
|
echo "✓ Backend API at: http://localhost:8080/api"
|
|
echo "✓ Backend running internally on port ${BACKEND_INTERNAL_PORT:-8081}"
|
|
echo "==================================="
|
|
;;
|
|
|
|
FRONTEND)
|
|
echo "Starting in FRONTEND mode: Frontend only on port 8080"
|
|
|
|
# Configure nginx with external backend URL
|
|
BACKEND_URL=${VITE_API_BASE_URL:-http://backend:8080}
|
|
configure_nginx "$BACKEND_URL"
|
|
|
|
# Start nginx on port 8080
|
|
echo "Starting nginx on port 8080..."
|
|
run_as_user nginx -g "daemon off;" &
|
|
NGINX_PID=$!
|
|
|
|
echo "==================================="
|
|
echo "✓ Frontend available at: http://localhost:8080"
|
|
echo "✓ Proxying API calls to: $BACKEND_URL"
|
|
echo "==================================="
|
|
;;
|
|
|
|
BACKEND)
|
|
echo "Starting in BACKEND mode: Backend only on port 8080"
|
|
|
|
# Start backend on port 8080
|
|
echo "Starting backend on port 8080..."
|
|
run_as_user sh -c "java -Dfile.encoding=UTF-8 \
|
|
-Djava.io.tmpdir=/tmp/stirling-pdf \
|
|
-Dserver.port=8080 \
|
|
-jar /app.jar & /opt/venv/bin/unoserver --port 2003 --interface 127.0.0.1" &
|
|
BACKEND_PID=$!
|
|
|
|
echo "==================================="
|
|
echo "✓ Backend API available at: http://localhost:8080/api"
|
|
echo "✓ Swagger UI at: http://localhost:8080/swagger-ui/index.html"
|
|
echo "==================================="
|
|
;;
|
|
|
|
*)
|
|
echo "ERROR: Invalid MODE '$MODE'. Must be BOTH, FRONTEND, or BACKEND"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# Wait for all background processes
|
|
wait
|