From 57188e716175d4d1e8847badeeb8f89343eb53a9 Mon Sep 17 00:00:00 2001 From: Ludy Date: Tue, 11 Mar 2025 15:12:00 +0100 Subject: [PATCH] Add: unoserver and more (#3108) # 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/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/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/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/DeveloperGuide.md#6-testing) for more details. --- .devcontainer/devcontainer.json | 31 +++++++++++--- .devcontainer/git-init.sh | 19 +++++++++ .devcontainer/init-setup.sh | 75 +++++++++++++++++++++++++++++++++ Dockerfile.dev | 37 ++++++++-------- scripts/init-setup.sh | 8 ---- 5 files changed, 137 insertions(+), 33 deletions(-) create mode 100644 .devcontainer/git-init.sh create mode 100644 .devcontainer/init-setup.sh delete mode 100644 scripts/init-setup.sh diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 1bfa99b0..8cc06c75 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -8,11 +8,29 @@ // Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename. "dockerfile": "../Dockerfile.dev" }, + "runArgs": [ + "-e", + "GIT_EDITOR=code --wait", + "--security-opt", + "label=disable" + ], // Use 'forwardPorts' to make a list of ports inside the container available locally. - "appPort": [8080], + "forwardPorts": [8080, 2002, 2003], + "portsAttributes": { + "8080": { + "label": "Stirling-PDF Dev Port" + }, + "2002": { + "label": "unoserver Port" + }, + "2003": { + "label": "UnoConvert Port" + } + }, "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,consistency=delegated", "mounts": [ - "source=logs-volume,target=/workspace/logs,type=volume" + "source=logs-volume,target=/workspace/logs,type=volume", + "source=build-volume,target=/workspace/build,type=volume" ], "workspaceFolder": "/workspace", // Configure tool-specific properties. @@ -97,18 +115,17 @@ "Oracle.oracle-java", // Oracle Java extension with additional features for Java development "streetsidesoftware.code-spell-checker", // Spell checker for code to avoid typos "vmware.vscode-boot-dev-pack", // Developer tools for Spring Boot by VMware - "vmware.vscode-spring-boot", // Spring Boot tools by VMware for enhanced Spring development "vscjava.vscode-java-pack", // Java Extension Pack with essential Java tools for VS Code - "vscjava.vscode-spring-boot-dashboard", // Spring Boot dashboard for managing and visualizing Spring Boot applications - "vscjava.vscode-spring-initializr", // Support for Spring Initializr to create new Spring projects "EditorConfig.EditorConfig", // EditorConfig support for maintaining consistent coding styles "ms-azuretools.vscode-docker", // Docker extension for Visual Studio Code - "charliermarsh.ruff" // Ruff extension for Ruff language support + "charliermarsh.ruff", // Ruff extension for Ruff language support + "github.vscode-github-actions" // GitHub Actions extension for Visual Studio Code ] } }, // Uncomment to connect as an existing user other than the container default. More info: https://aka.ms/dev-containers-non-root. "remoteUser": "devuser", "shutdownAction": "stopContainer", - "postStartCommand": "./scripts/init-setup.sh" + "initializeCommand": "bash ./.devcontainer/git-init.sh", + "postStartCommand": "./.devcontainer/init-setup.sh" } diff --git a/.devcontainer/git-init.sh b/.devcontainer/git-init.sh new file mode 100644 index 00000000..4d34efc1 --- /dev/null +++ b/.devcontainer/git-init.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +GIT_USER=$(git config --get user.name) +GIT_EMAIL=$(git config --get user.email) + +# Exit if GIT_USER or GIT_EMAIL is empty +if [ -z "$GIT_USER" ] || [ -z "$GIT_EMAIL" ]; then + echo "GIT_USER or GIT_EMAIL is not set. Exiting." + exit 1 +fi + +git config --local user.name "$GIT_USER" +git config --local user.email "$GIT_EMAIL" + +# This directory should contain custom Git hooks for the repository +# Set the path for Git hooks to /workspace/hooks +git config --local core.hooksPath '%(prefix)/workspace/hooks' +# Set the safe directory to the workspace path +git config --local --add safe.directory /workspace diff --git a/.devcontainer/init-setup.sh b/.devcontainer/init-setup.sh new file mode 100644 index 00000000..9a96131e --- /dev/null +++ b/.devcontainer/init-setup.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +set -e + +# ============================================================================= +# Dev Container Initialization Script (init-setup.sh) +# +# This script runs when the Dev Container starts and provides guidance on +# how to interact with the project. It prints an ASCII logo, displays the +# current user, changes to the project root, and then shows helpful command +# instructions. +# +# Instructions for future developers: +# +# - To start the application, use: +# ./gradlew bootRun --no-daemon -Dspring-boot.run.fork=true -Dserver.address=0.0.0.0 +# +# - To run tests, use: +# ./gradlew test +# +# - To build the project, use: +# ./gradlew build +# +# - For running pre-commit hooks (if configured), use: +# pre-commit run --all-files +# +# Make sure you are in the project root directory after this script executes. +# ============================================================================= + +echo "Devcontainer started successfully!" + +VERSION=$(grep "^version =" build.gradle | awk -F'"' '{print $2}') +GRADLE_VERSION=$(gradle -version | grep "^Gradle " | awk '{print $2}') +GRADLE_PATH=$(which gradle) +JAVA_VERSION=$(java -version 2>&1 | awk -F '"' '/version/ {print $2}') +JAVA_PATH=$(which java) + +echo """ + ____ _____ ___ ____ _ ___ _ _ ____ ____ ____ _____ +/ ___|_ _|_ _| _ \| | |_ _| \ | |/ ___| | _ \| _ \| ___| +\___ \ | | | || |_) | | | || \| | | _ _____| |_) | | | | |_ + ___) || | | || _ <| |___ | || |\ | |_| |_____| __/| |_| | _| +|____/ |_| |___|_| \_\_____|___|_| \_|\____| |_| |____/|_| +""" +echo -e "Stirling-PDF Version: \e[32m$VERSION\e[0m" +echo -e "Gradle Version: \e[32m$GRADLE_VERSION\e[0m" +echo -e "Gradle Path: \e[32m$GRADLE_PATH\e[0m" +echo -e "Java Version: \e[32m$JAVA_VERSION\e[0m" +echo -e "Java Path: \e[32m$JAVA_PATH\e[0m" + +# Display current active user (for permission/debugging purposes) +echo -e "Current user: \e[32m$(whoami)\e[0m" + +# Change directory to the project root (parent directory of the script) +cd "$(dirname "$0")/.." +echo -e "Changed to project root: \e[32m$(pwd)\e[0m" + +# Display available commands for developers +echo "==================================================================" +echo "Available commands:" +echo "" +echo " To start unoserver: " +echo -e "\e[34m nohup /opt/venv/bin/unoserver --port 2003 --interface 0.0.0.0 > /tmp/unoserver.log 2>&1 &\e[0m" +echo +echo " To start the application: " +echo -e "\e[34m gradle bootRun\e[0m" +echo "" +echo " To run tests: " +echo -e "\e[34m gradle test\e[0m" +echo "" +echo " To build the project: " +echo -e "\e[34m gradle build\e[0m" +echo "" +echo " To run pre-commit hooks (if configured):" +echo -e "\e[34m pre-commit run --all-files -c .pre-commit-config.yaml\e[0m" +echo "==================================================================" diff --git a/Dockerfile.dev b/Dockerfile.dev index dc6f40d7..646bccaf 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -1,53 +1,54 @@ # dockerfile.dev # Basisimage: Gradle mit JDK 17 (Debian-basiert) -FROM gradle:8.12-jdk17 +FROM gradle:8.13-jdk17 # Als Root-Benutzer arbeiten, um benötigte Pakete zu installieren USER root +# Set GRADLE_HOME und füge Gradle zum PATH hinzu +ENV GRADLE_HOME=/opt/gradle +ENV PATH="$GRADLE_HOME/bin:$PATH" + # Update und Installation zusätzlicher Pakete (Debian/Ubuntu-basiert) RUN apt-get update && apt-get install -y \ - wget \ - ca-certificates \ - tzdata \ - tini \ - bash \ - curl \ + sudo \ libreoffice \ poppler-utils \ qpdf \ +# settings.yml | tessdataDir: /usr/share/tesseract-ocr/5/tessdata tesseract-ocr \ tesseract-ocr-eng \ - fonts-dejavu \ - fonts-noto \ - python3 \ - python3-pip \ + fonts-terminus fonts-dejavu fonts-font-awesome fonts-noto fonts-noto-core fonts-noto-cjk fonts-noto-extra fonts-liberation fonts-linuxlibertine \ + python3-uno \ python3-venv \ +# ss -tln + iproute2 \ && apt-get clean && rm -rf /var/lib/apt/lists/* # Setze die Environment Variable für setuptools ENV SETUPTOOLS_USE_DISTUTILS=local # Installation der benötigten Python-Pakete -RUN python3 -m venv /opt/venv \ +RUN python3 -m venv --system-site-packages /opt/venv \ && . /opt/venv/bin/activate \ - && pip install --upgrade setuptools \ && pip install --no-cache-dir WeasyPrint pdf2image pillow unoserver opencv-python-headless pre-commit # Füge den venv-Pfad zur globalen PATH-Variable hinzu, damit die Tools verfügbar sind ENV PATH="/opt/venv/bin:$PATH" -# Erstelle notwendige Verzeichnisse und lege einen Nicht‑Root Benutzer an -RUN mkdir -p /home/devuser/{configs,logs,customFiles,pipeline/watchedFolders,pipeline/finishedFolders} \ - && adduser --disabled-password --gecos '' devuser \ - && chown -R devuser:devuser /home/devuser +COPY . /workspace -RUN mkdir -p /home/devuser/logs /workspace/logs /workspace/scripts /workspace/src/main/resources \ +RUN adduser --disabled-password --gecos '' devuser \ && chown -R devuser:devuser /home/devuser /workspace +RUN echo "devuser ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/devuser \ + && chmod 0440 /etc/sudoers.d/devuser # Setze das Arbeitsverzeichnis (wird später per Bind-Mount überschrieben) WORKDIR /workspace +RUN chmod +x /workspace/.devcontainer/git-init.sh +RUN sudo chmod +x /workspace/.devcontainer/init-setup.sh + # Wechsel zum Nicht‑Root Benutzer USER devuser diff --git a/scripts/init-setup.sh b/scripts/init-setup.sh deleted file mode 100644 index 6b7153cd..00000000 --- a/scripts/init-setup.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -set -e - -whoami - -cd "$(dirname "$0")/.." - -echo "Devcontainer started..."