diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aa98d2a1e..3c8a85782 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,9 +2,9 @@ name: Build repo on: push: - branches: ["main"] + branches: ["main", "V2", "V2-gha"] pull_request: - branches: ["main"] + branches: ["main", "V2", "V2-gha"] permissions: contents: read @@ -114,6 +114,46 @@ jobs: name: openapi-docs path: ./SwaggerDoc.json + frontend-validation: + runs-on: ubuntu-latest + steps: + - name: Harden Runner + uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # v2.12.2 + with: + egress-policy: audit + + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Set up Node.js + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + with: + node-version: '20' + cache: 'npm' + cache-dependency-path: frontend/package-lock.json + + - name: Install frontend dependencies + run: | + cd frontend + npm ci + + - name: Build frontend + run: | + cd frontend + npm run build + + - name: Run frontend tests (if available) + run: | + cd frontend + npm test --passWithNoTests --watchAll=false || true + + - name: Upload frontend build artifacts + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: frontend-build + path: frontend/dist/ + retention-days: 3 + check-licence: runs-on: ubuntu-latest steps: diff --git a/docker/backend/Dockerfile b/docker/backend/Dockerfile index 68dba6108..d3e64a843 100644 --- a/docker/backend/Dockerfile +++ b/docker/backend/Dockerfile @@ -1,11 +1,36 @@ -# Backend Dockerfile - Java Spring Boot with all dependencies +# Backend Dockerfile - Java Spring Boot with all dependencies and build stage +# Build the application +FROM gradle:8.14-jdk21 AS build + +COPY build.gradle . +COPY settings.gradle . +COPY gradlew . +COPY gradle gradle/ +COPY app/core/build.gradle core/. +COPY app/common/build.gradle common/. +COPY app/proprietary/build.gradle proprietary/. +RUN ./gradlew build -x spotlessApply -x spotlessCheck -x test -x sonarqube || return 0 + +# Set the working directory +WORKDIR /app + +# Copy the entire project to the working directory +COPY . . + +# Build the application with DISABLE_ADDITIONAL_FEATURES=false +RUN DISABLE_ADDITIONAL_FEATURES=false \ + STIRLING_PDF_DESKTOP_UI=false \ + ./gradlew clean build -x spotlessApply -x spotlessCheck -x test -x sonarqube + +# Main stage FROM alpine:3.22.0@sha256:8a1f59ffb675680d47db6337b49d22281a139e9d709335b492be023728e11715 # Copy necessary files COPY scripts /scripts COPY pipeline /pipeline COPY app/core/src/main/resources/static/fonts/*.ttf /usr/share/fonts/opentype/noto/ -COPY app/core/build/libs/*.jar app.jar +# first /app directory is for the build stage, second is for the final image +COPY --from=build /app/app/core/build/libs/*.jar app.jar ARG VERSION_TAG @@ -22,7 +47,7 @@ LABEL org.opencontainers.image.version="${VERSION_TAG}" LABEL org.opencontainers.image.keywords="PDF, manipulation, backend, API, Spring Boot" # Set Environment Variables -ENV DISABLE_ADDITIONAL_FEATURES=true \ +ENV DISABLE_ADDITIONAL_FEATURES=false \ VERSION_TAG=$VERSION_TAG \ JAVA_BASE_OPTS="-XX:+UnlockExperimentalVMOptions -XX:MaxRAMPercentage=75 -XX:InitiatingHeapOccupancyPercent=20 -XX:+G1PeriodicGCInvokesConcurrent -XX:G1PeriodicGCInterval=10000 -XX:+UseStringDeduplication -XX:G1PeriodicGCSystemLoadThreshold=70" \ JAVA_CUSTOM_OPTS="" \ @@ -50,7 +75,6 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a tini \ bash \ curl \ - qpdf \ shadow \ su-exec \ openssl \ @@ -63,11 +87,13 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a # pdftohtml poppler-utils \ # OCR MY PDF (unpaper for descew and other advanced features) + unpaper \ tesseract-ocr-data-eng \ tesseract-ocr-data-chi_sim \ tesseract-ocr-data-deu \ tesseract-ocr-data-fra \ tesseract-ocr-data-por \ + ocrmypdf \ # CV py3-opencv \ python3 \ diff --git a/docker/backend/Dockerfile.fat b/docker/backend/Dockerfile.fat index 5d4b73385..0fc2acc77 100644 --- a/docker/backend/Dockerfile.fat +++ b/docker/backend/Dockerfile.fat @@ -77,12 +77,13 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a # pdftohtml poppler-utils \ # OCR MY PDF (unpaper for descew and other advanced featues) - qpdf \ + unpaper \ tesseract-ocr-data-eng \ tesseract-ocr-data-chi_sim \ tesseract-ocr-data-deu \ tesseract-ocr-data-fra \ tesseract-ocr-data-por \ + ocrmypdf \ font-terminus font-dejavu font-noto font-noto-cjk font-awesome font-noto-extra font-liberation font-linux-libertine \ # CV py3-opencv \ diff --git a/docker/backend/Dockerfile.ultra-lite b/docker/backend/Dockerfile.ultra-lite index 6291736e2..8c5e41cc5 100644 --- a/docker/backend/Dockerfile.ultra-lite +++ b/docker/backend/Dockerfile.ultra-lite @@ -1,4 +1,28 @@ -# Backend ultra-lite Dockerfile - Java Spring Boot with minimal dependencies +# Backend ultra-lite Dockerfile - Java Spring Boot with minimal dependencies and build stage +# Build the application +FROM gradle:8.14-jdk21 AS build + +COPY build.gradle . +COPY settings.gradle . +COPY gradlew . +COPY gradle gradle/ +COPY app/core/build.gradle core/. +COPY app/common/build.gradle common/. +COPY app/proprietary/build.gradle proprietary/. +RUN ./gradlew build -x spotlessApply -x spotlessCheck -x test -x sonarqube || return 0 + +# Set the working directory +WORKDIR /app + +# Copy the entire project to the working directory +COPY . . + +# Build the application with DISABLE_ADDITIONAL_FEATURES=true +RUN DISABLE_ADDITIONAL_FEATURES=true \ + STIRLING_PDF_DESKTOP_UI=false \ + ./gradlew clean build -x spotlessApply -x spotlessCheck -x test -x sonarqube + +# Main stage FROM alpine:3.22.0@sha256:8a1f59ffb675680d47db6337b49d22281a139e9d709335b492be023728e11715 ARG VERSION_TAG @@ -18,11 +42,10 @@ ENV DISABLE_ADDITIONAL_FEATURES=true \ TMP=/tmp/stirling-pdf # Copy necessary files -COPY scripts/download-security-jar.sh /scripts/download-security-jar.sh COPY scripts/init-without-ocr.sh /scripts/init-without-ocr.sh COPY scripts/installFonts.sh /scripts/installFonts.sh COPY pipeline /pipeline -COPY app/core/build/libs/*.jar app.jar +COPY --from=build /app/app/core/build/libs/*.jar app.jar # Set up necessary directories and permissions RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories && \ diff --git a/docker/compose/docker-compose.fat.yml b/docker/compose/docker-compose.fat.yml index 764c9604c..8399c4080 100644 --- a/docker/compose/docker-compose.fat.yml +++ b/docker/compose/docker-compose.fat.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: backend: build: @@ -43,8 +41,8 @@ services: frontend: build: - context: ../../frontend - dockerfile: ../docker/frontend/Dockerfile + context: ../.. + dockerfile: docker/frontend/Dockerfile container_name: stirling-pdf-frontend-fat restart: on-failure:5 ports: diff --git a/docker/compose/docker-compose.monolith.yml b/docker/compose/docker-compose.monolith.yml index 06064cdf7..82d40f2bd 100644 --- a/docker/compose/docker-compose.monolith.yml +++ b/docker/compose/docker-compose.monolith.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: stirling-pdf-monolith: build: diff --git a/docker/compose/docker-compose.ultra-lite.yml b/docker/compose/docker-compose.ultra-lite.yml index a16484262..bfbf55861 100644 --- a/docker/compose/docker-compose.ultra-lite.yml +++ b/docker/compose/docker-compose.ultra-lite.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: backend: build: @@ -38,8 +36,8 @@ services: frontend: build: - context: ../../frontend - dockerfile: ../docker/frontend/Dockerfile + context: ../.. + dockerfile: docker/frontend/Dockerfile container_name: stirling-pdf-frontend-ultra-lite restart: on-failure:5 ports: diff --git a/docker/compose/docker-compose.yml b/docker/compose/docker-compose.yml index 3bcdca423..4defef872 100644 --- a/docker/compose/docker-compose.yml +++ b/docker/compose/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: backend: build: @@ -41,8 +39,8 @@ services: frontend: build: - context: ../../frontend - dockerfile: ../docker/frontend/Dockerfile + context: ../.. + dockerfile: docker/frontend/Dockerfile container_name: stirling-pdf-frontend restart: on-failure:5 ports: diff --git a/docker/frontend/Dockerfile b/docker/frontend/Dockerfile index af570b6bb..7a5dc6025 100644 --- a/docker/frontend/Dockerfile +++ b/docker/frontend/Dockerfile @@ -4,13 +4,13 @@ FROM node:20-alpine AS build WORKDIR /app # Copy package files -COPY package*.json ./ +COPY frontend/package*.json ./ # Install dependencies RUN npm ci # Copy source code -COPY . . +COPY frontend . # Build the application RUN npm run build @@ -22,8 +22,8 @@ FROM nginx:alpine COPY --from=build /app/dist /usr/share/nginx/html # Copy nginx configuration and entrypoint -COPY nginx.conf /etc/nginx/nginx.conf -COPY entrypoint.sh /entrypoint.sh +COPY docker/frontend/nginx.conf /etc/nginx/nginx.conf +COPY docker/frontend/entrypoint.sh /entrypoint.sh # Make entrypoint executable RUN chmod +x /entrypoint.sh diff --git a/docker/frontend/nginx.conf b/docker/frontend/nginx.conf index f45f5784b..400ad65f1 100644 --- a/docker/frontend/nginx.conf +++ b/docker/frontend/nginx.conf @@ -17,6 +17,9 @@ http { server_name _; root /usr/share/nginx/html; index index.html index.htm; + + # Global settings for file uploads + client_max_body_size 100m; # Handle client-side routing - support subpaths location / { @@ -32,6 +35,21 @@ http { proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port $server_port; + + # Additional headers for proper API proxying + proxy_set_header Connection ''; + proxy_http_version 1.1; + proxy_buffering off; + proxy_cache off; + + # Timeout settings for large file uploads + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + + # Request size limits for file uploads + client_max_body_size 100m; + proxy_request_buffering off; } # Cache static assets diff --git a/exampleYmlFiles/docker-compose-latest-fat-endpoints-disabled.yml b/exampleYmlFiles/docker-compose-latest-fat-endpoints-disabled.yml deleted file mode 100644 index 827de1e19..000000000 --- a/exampleYmlFiles/docker-compose-latest-fat-endpoints-disabled.yml +++ /dev/null @@ -1,36 +0,0 @@ - -services: - stirling-pdf: - container_name: Stirling-PDF-Fat-Disable-Endpoints - image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest-fat - deploy: - resources: - limits: - memory: 4G - healthcheck: - test: ["CMD-SHELL", "curl -f http://localhost:8080/api/v1/info/status | grep -q 'UP'"] - interval: 5s - timeout: 10s - retries: 16 - ports: - - 8080:8080 - volumes: - - ./stirling/latest/data:/usr/share/tessdata:rw - - ./stirling/latest/config:/configs:rw - - ./stirling/latest/logs:/logs:rw - - ../testing/allEndpointsRemovedSettings.yml:/configs/settings.yml:rw - environment: - DISABLE_ADDITIONAL_FEATURES: "false" - SECURITY_ENABLELOGIN: "false" - PUID: 1002 - PGID: 1002 - UMASK: "022" - SYSTEM_DEFAULTLOCALE: en-US - UI_APPNAME: Stirling-PDF - UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest-fat with all Endpoints Disabled - UI_APPNAMENAVBAR: Stirling-PDF Latest-fat - SYSTEM_MAXFILESIZE: "100" - METRICS_ENABLED: "true" - SYSTEM_GOOGLEVISIBILITY: "true" - SHOW_SURVEY: "true" - restart: on-failure:5 diff --git a/exampleYmlFiles/docker-compose-latest-fat-security-postgres.yml b/exampleYmlFiles/docker-compose-latest-fat-security-postgres.yml deleted file mode 100644 index bbf8a2115..000000000 --- a/exampleYmlFiles/docker-compose-latest-fat-security-postgres.yml +++ /dev/null @@ -1,64 +0,0 @@ -services: - stirling-pdf: - container_name: Stirling-PDF-Security-Fat-Postgres - image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest-fat-postgres - deploy: - resources: - limits: - memory: 4G - depends_on: - - db - healthcheck: - test: [ "CMD-SHELL", "curl -f http://localhost:8080/api/v1/info/status | grep -q 'UP'" ] - interval: 5s - timeout: 10s - retries: 16 - ports: - - 8080:8080 - volumes: - - ./stirling/latest/data:/usr/share/tessdata:rw - - ./stirling/latest/config:/configs:rw - - ./stirling/latest/logs:/logs:rw - environment: - DISABLE_ADDITIONAL_FEATURES: "false" - SECURITY_ENABLELOGIN: "false" - PUID: 1002 - PGID: 1002 - UMASK: "022" - SYSTEM_DEFAULTLOCALE: en-US - UI_APPNAME: Stirling-PDF - UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest-fat with Security and PostgreSQL - UI_APPNAMENAVBAR: Stirling-PDF Latest-fat-PostgreSQL - SYSTEM_MAXFILESIZE: "100" - METRICS_ENABLED: "true" - SYSTEM_GOOGLEVISIBILITY: "true" - SYSTEM_DATASOURCE_ENABLECUSTOMDATABASE: "true" - SYSTEM_DATASOURCE_CUSTOMDATABASEURL: "jdbc:postgresql://db:5432/stirling_pdf" - SYSTEM_DATASOURCE_USERNAME: "admin" - SYSTEM_DATASOURCE_PASSWORD: "stirling" - SHOW_SURVEY: "true" - restart: on-failure:5 - - db: - image: 'postgres:17.2-alpine' - restart: on-failure:5 - container_name: db - ports: - - "5432:5432" - environment: - POSTGRES_DB: "stirling_pdf" - POSTGRES_USER: "admin" - POSTGRES_PASSWORD: "stirling" - shm_size: "512mb" - deploy: - resources: - limits: - memory: 512m - cpus: "0.5" - healthcheck: - test: [ "CMD-SHELL", "pg_isready -U admin stirling_pdf" ] - interval: 1s - timeout: 5s - retries: 10 - volumes: - - ./stirling/latest/data:/pgdata diff --git a/exampleYmlFiles/docker-compose-latest-fat-security.yml b/exampleYmlFiles/docker-compose-latest-fat-security.yml deleted file mode 100644 index 5b07420ff..000000000 --- a/exampleYmlFiles/docker-compose-latest-fat-security.yml +++ /dev/null @@ -1,34 +0,0 @@ -services: - stirling-pdf: - container_name: Stirling-PDF-Security-Fat - image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest-fat - deploy: - resources: - limits: - memory: 4G - healthcheck: - test: ["CMD-SHELL", "curl -f http://localhost:8080/api/v1/info/status | grep -q 'UP'"] - interval: 5s - timeout: 10s - retries: 16 - ports: - - 8080:8080 - volumes: - - ./stirling/latest/data:/usr/share/tessdata:rw - - ./stirling/latest/config:/configs:rw - - ./stirling/latest/logs:/logs:rw - environment: - DISABLE_ADDITIONAL_FEATURES: "false" - SECURITY_ENABLELOGIN: "false" - PUID: 1002 - PGID: 1002 - UMASK: "022" - SYSTEM_DEFAULTLOCALE: en-US - UI_APPNAME: Stirling-PDF - UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest-fat with Security - UI_APPNAMENAVBAR: Stirling-PDF Latest-fat - SYSTEM_MAXFILESIZE: "100" - METRICS_ENABLED: "true" - SYSTEM_GOOGLEVISIBILITY: "true" - SHOW_SURVEY: "true" - restart: on-failure:5 diff --git a/exampleYmlFiles/docker-compose-latest-security-with-sso.yml b/exampleYmlFiles/docker-compose-latest-security-with-sso.yml deleted file mode 100644 index 55ea0893d..000000000 --- a/exampleYmlFiles/docker-compose-latest-security-with-sso.yml +++ /dev/null @@ -1,42 +0,0 @@ -services: - stirling-pdf: - container_name: Stirling-PDF-Security - image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest - deploy: - resources: - limits: - memory: 4G - healthcheck: - test: ["CMD-SHELL", "curl -f http://localhost:8080/api/v1/info/status | grep -q 'UP' && curl -fL http://localhost:8080/ | grep -q 'Please sign in'"] - interval: 5s - timeout: 10s - retries: 16 - ports: - - "8080:8080" - volumes: - - ./stirling/latest/data:/usr/share/tessdata:rw - - ./stirling/latest/config:/configs:rw - - ./stirling/latest/logs:/logs:rw - environment: - DISABLE_ADDITIONAL_FEATURES: "false" - SECURITY_ENABLELOGIN: "true" - SECURITY_OAUTH2_ENABLED: "true" - SECURITY_OAUTH2_AUTOCREATEUSER: "true" # This is set to true to allow auto-creation of non-existing users in Stirling-PDF - SECURITY_OAUTH2_ISSUER: "https://accounts.google.com" # Change with any other provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) end-point - SECURITY_OAUTH2_CLIENTID: ".apps.googleusercontent.com" # Client ID from your provider - SECURITY_OAUTH2_CLIENTSECRET: "" # Client Secret from your provider - SECURITY_OAUTH2_SCOPES: "openid,profile,email" # Expected OAuth2 Scope - SECURITY_OAUTH2_USEASUSERNAME: "email" # Default is 'email'; custom fields can be used as the username - SECURITY_OAUTH2_PROVIDER: "google" # Set this to your OAuth provider's name, e.g., 'google' or 'keycloak' - PUID: 1002 - PGID: 1002 - UMASK: "022" - SYSTEM_DEFAULTLOCALE: en-US - UI_APPNAME: Stirling-PDF - UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest with Security - UI_APPNAMENAVBAR: Stirling-PDF Latest - SYSTEM_MAXFILESIZE: "100" - METRICS_ENABLED: "true" - SYSTEM_GOOGLEVISIBILITY: "true" - SHOW_SURVEY: "true" - restart: on-failure:5 diff --git a/exampleYmlFiles/docker-compose-latest-security.yml b/exampleYmlFiles/docker-compose-latest-security.yml deleted file mode 100644 index c6589ab9c..000000000 --- a/exampleYmlFiles/docker-compose-latest-security.yml +++ /dev/null @@ -1,34 +0,0 @@ -services: - stirling-pdf: - container_name: Stirling-PDF-Security - image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest - deploy: - resources: - limits: - memory: 4G - healthcheck: - test: ["CMD-SHELL", "curl -f http://localhost:8080/api/v1/info/status | grep -q 'UP' && curl -fL http://localhost:8080/ | grep -q 'Please sign in'"] - interval: 5s - timeout: 10s - retries: 16 - ports: - - "8080:8080" - volumes: - - ./stirling/latest/data:/usr/share/tessdata:rw - - ./stirling/latest/config:/configs:rw - - ./stirling/latest/logs:/logs:rw - environment: - DISABLE_ADDITIONAL_FEATURES: "false" - SECURITY_ENABLELOGIN: "true" - PUID: 1002 - PGID: 1002 - UMASK: "022" - SYSTEM_DEFAULTLOCALE: en-US - UI_APPNAME: Stirling-PDF - UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest with Security - UI_APPNAMENAVBAR: Stirling-PDF Latest - SYSTEM_MAXFILESIZE: "100" - METRICS_ENABLED: "true" - SYSTEM_GOOGLEVISIBILITY: "true" - SHOW_SURVEY: "true" - restart: on-failure:5 diff --git a/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml b/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml deleted file mode 100644 index fe839d941..000000000 --- a/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml +++ /dev/null @@ -1,31 +0,0 @@ -services: - stirling-pdf: - container_name: Stirling-PDF-Ultra-Lite-Security - image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest-ultra-lite - deploy: - resources: - limits: - memory: 1G - healthcheck: - test: ["CMD-SHELL", "curl -f http://localhost:8080/api/v1/info/status | grep -q 'UP' && curl -fL http://localhost:8080/ | grep -q 'Please sign in'"] - interval: 5s - timeout: 10s - retries: 16 - ports: - - "8080:8080" - volumes: - - ./stirling/latest/data:/usr/share/tessdata:rw - - ./stirling/latest/config:/configs:rw - - ./stirling/latest/logs:/logs:rw - environment: - DISABLE_ADDITIONAL_FEATURES: "false" - SECURITY_ENABLELOGIN: "true" - SYSTEM_DEFAULTLOCALE: en-US - UI_APPNAME: Stirling-PDF-Lite - UI_HOMEDESCRIPTION: Demo site for Stirling-PDF-Lite Latest with Security - UI_APPNAMENAVBAR: Stirling-PDF-Lite Latest - SYSTEM_MAXFILESIZE: "100" - METRICS_ENABLED: "true" - SYSTEM_GOOGLEVISIBILITY: "true" - SHOW_SURVEY: "true" - restart: on-failure:5 diff --git a/exampleYmlFiles/docker-compose-latest.yml b/exampleYmlFiles/docker-compose-latest.yml deleted file mode 100644 index a68da538a..000000000 --- a/exampleYmlFiles/docker-compose-latest.yml +++ /dev/null @@ -1,31 +0,0 @@ -services: - stirling-pdf: - container_name: Stirling-PDF - image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest - deploy: - resources: - limits: - memory: 4G - healthcheck: - test: ["CMD-SHELL", "curl -f http://localhost:8080/api/v1/info/status | grep -q 'UP' && curl -fL http://localhost:8080/ | grep -qv 'Please sign in'"] - interval: 5s - timeout: 10s - retries: 16 - ports: - - "8080:8080" - volumes: - - ./stirling/latest/data:/usr/share/tessdata:rw - - ./stirling/latest/config:/configs:rw - - ./stirling/latest/logs:/logs:rw - environment: - SECURITY_ENABLELOGIN: "false" - LANGS: "en_GB,en_US,ar_AR,de_DE,fr_FR,es_ES,zh_CN,zh_TW,ca_CA,it_IT,sv_SE,pl_PL,ro_RO,ko_KR,pt_BR,ru_RU,el_GR,hi_IN,hu_HU,tr_TR,id_ID" - SYSTEM_DEFAULTLOCALE: en-US - UI_APPNAME: Stirling-PDF - UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest - UI_APPNAMENAVBAR: Stirling-PDF Latest - SYSTEM_MAXFILESIZE: "100" - METRICS_ENABLED: "true" - SYSTEM_GOOGLEVISIBILITY: "true" - SHOW_SURVEY: "true" - restart: on-failure:5 diff --git a/exampleYmlFiles/test_cicd.yml b/exampleYmlFiles/test_cicd.yml deleted file mode 100644 index 31e24da48..000000000 --- a/exampleYmlFiles/test_cicd.yml +++ /dev/null @@ -1,34 +0,0 @@ -services: - stirling-pdf: - container_name: Stirling-PDF-Security-Fat-with-login - image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest-fat - deploy: - resources: - limits: - memory: 4G - healthcheck: - test: ["CMD-SHELL", "curl -f -H 'X-API-KEY: 123456789' http://localhost:8080/api/v1/info/status | grep -q 'UP'"] - interval: 5s - timeout: 10s - retries: 16 - ports: - - 8080:8080 - volumes: - - ./stirling/latest/data:/usr/share/tessdata:rw - - ./stirling/latest/config:/configs:rw - - ./stirling/latest/logs:/logs:rw - environment: - DISABLE_ADDITIONAL_FEATURES: "false" - SECURITY_ENABLELOGIN: "true" - PUID: 1002 - PGID: 1002 - UMASK: "022" - SYSTEM_DEFAULTLOCALE: en-US - UI_APPNAME: Stirling-PDF - UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest-fat with Security - UI_APPNAMENAVBAR: Stirling-PDF Latest-fat - SYSTEM_MAXFILESIZE: "100" - METRICS_ENABLED: "true" - SYSTEM_GOOGLEVISIBILITY: "true" - SECURITY_CUSTOMGLOBALAPIKEY: "123456789" - restart: on-failure:5 diff --git a/frontend/src/components/pageEditor/PageEditor.tsx b/frontend/src/components/pageEditor/PageEditor.tsx index f1a5dfd3c..4ba56a291 100644 --- a/frontend/src/components/pageEditor/PageEditor.tsx +++ b/frontend/src/components/pageEditor/PageEditor.tsx @@ -21,7 +21,7 @@ import { pdfExportService } from "../../services/pdfExportService"; import { useThumbnailGeneration } from "../../hooks/useThumbnailGeneration"; import { calculateScaleFromFileSize } from "../../utils/thumbnailUtils"; import { fileStorage } from "../../services/fileStorage"; -import './pageEditor.module.css'; +import './PageEditor.module.css'; import PageThumbnail from './PageThumbnail'; import BulkSelectionPanel from './BulkSelectionPanel'; import DragDropGrid from './DragDropGrid'; diff --git a/scripts/init-without-ocr.sh b/scripts/init-without-ocr.sh index 73d9feb4a..bbc1a32ec 100644 --- a/scripts/init-without-ocr.sh +++ b/scripts/init-without-ocr.sh @@ -19,9 +19,8 @@ if [[ "$INSTALL_BOOK_AND_ADVANCED_HTML_OPS" == "true" && "$FAT_DOCKER" != "true" #apk add --no-cache calibre@testing fi -if [[ "$FAT_DOCKER" != "true" ]]; then - /scripts/download-security-jar.sh -fi +# Security jar is now built into the application jar during Docker build +# No need to download it separately if [[ -n "$LANGS" ]]; then /scripts/installFonts.sh $LANGS diff --git a/testing/compose/docker-compose-security-with-login.yml b/testing/compose/docker-compose-security-with-login.yml new file mode 100644 index 000000000..feb91b080 --- /dev/null +++ b/testing/compose/docker-compose-security-with-login.yml @@ -0,0 +1,63 @@ +services: + backend: + build: + context: ../.. + dockerfile: docker/backend/Dockerfile + container_name: Stirling-PDF-Security-with-login + restart: on-failure:5 + deploy: + resources: + limits: + memory: 4G + healthcheck: + test: ["CMD-SHELL", "curl -f http://localhost:8080/api/v1/info/status | grep -q 'UP'"] + interval: 5s + timeout: 10s + retries: 16 + ports: + - "8080:8080" + volumes: + - ../../stirling/latest/data:/usr/share/tessdata:rw + - ../../stirling/latest/config:/configs:rw + - ../../stirling/latest/logs:/logs:rw + environment: + DISABLE_ADDITIONAL_FEATURES: "false" + DOCKER_ENABLE_SECURITY: "true" + SECURITY_ENABLELOGIN: "true" + SECURITY_INITIALLOGIN_USERNAME: "admin" + SECURITY_INITIALLOGIN_PASSWORD: "stirling" + SYSTEM_DEFAULTLOCALE: en-US + UI_APPNAME: Stirling-PDF + UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest with Security and Login + UI_APPNAMENAVBAR: Stirling-PDF Latest + SYSTEM_MAXFILESIZE: "100" + METRICS_ENABLED: "true" + SYSTEM_GOOGLEVISIBILITY: "true" + SECURITY_CUSTOMGLOBALAPIKEY: "123456789" + SHOW_SURVEY: "true" + networks: + - stirling-network + + frontend: + build: + context: ../.. + dockerfile: docker/frontend/Dockerfile + container_name: stirling-pdf-frontend-security-login + restart: on-failure:5 + ports: + - "3000:80" + environment: + BACKEND_URL: http://backend:8080 + depends_on: + - backend + networks: + - stirling-network + +networks: + stirling-network: + driver: bridge + +volumes: + stirling-data: + stirling-config: + stirling-logs: \ No newline at end of file diff --git a/testing/compose/docker-compose-security.yml b/testing/compose/docker-compose-security.yml new file mode 100644 index 000000000..14aedb697 --- /dev/null +++ b/testing/compose/docker-compose-security.yml @@ -0,0 +1,59 @@ +services: + backend: + build: + context: ../.. + dockerfile: docker/backend/Dockerfile + container_name: Stirling-PDF-Security + restart: on-failure:5 + deploy: + resources: + limits: + memory: 4G + healthcheck: + test: ["CMD-SHELL", "curl -f http://localhost:8080/api/v1/info/status | grep -q 'UP'"] + interval: 5s + timeout: 10s + retries: 16 + ports: + - "8080:8080" + volumes: + - ../../stirling/latest/data:/usr/share/tessdata:rw + - ../../stirling/latest/config:/configs:rw + - ../../stirling/latest/logs:/logs:rw + environment: + DISABLE_ADDITIONAL_FEATURES: "false" + SECURITY_ENABLELOGIN: "false" + SYSTEM_DEFAULTLOCALE: en-US + UI_APPNAME: Stirling-PDF + UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest with Security + UI_APPNAMENAVBAR: Stirling-PDF Latest + SYSTEM_MAXFILESIZE: "100" + METRICS_ENABLED: "true" + SYSTEM_GOOGLEVISIBILITY: "true" + SHOW_SURVEY: "true" + networks: + - stirling-network + + frontend: + build: + context: ../.. + dockerfile: docker/frontend/Dockerfile + container_name: stirling-pdf-frontend-security + restart: on-failure:5 + ports: + - "3000:80" + environment: + BACKEND_URL: http://backend:8080 + depends_on: + - backend + networks: + - stirling-network + +networks: + stirling-network: + driver: bridge + +volumes: + stirling-data: + stirling-config: + stirling-logs: \ No newline at end of file diff --git a/exampleYmlFiles/docker-compose-latest-ultra-lite.yml b/testing/compose/docker-compose-ultra-lite.yml similarity index 50% rename from exampleYmlFiles/docker-compose-latest-ultra-lite.yml rename to testing/compose/docker-compose-ultra-lite.yml index a3710ad82..2ea9464a6 100644 --- a/exampleYmlFiles/docker-compose-latest-ultra-lite.yml +++ b/testing/compose/docker-compose-ultra-lite.yml @@ -1,11 +1,14 @@ services: - stirling-pdf: + backend: + build: + context: ../.. + dockerfile: docker/backend/Dockerfile.ultra-lite container_name: Stirling-PDF-Ultra-Lite - image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest-ultra-lite + restart: on-failure:5 deploy: resources: limits: - memory: 1G + memory: 2G healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:8080/api/v1/info/status | grep -q 'UP' && curl -fL http://localhost:8080/ | grep -qv 'Please sign in'"] interval: 5s @@ -14,10 +17,12 @@ services: ports: - "8080:8080" volumes: - - ./stirling/latest/config:/configs:rw - - ./stirling/latest/logs:/logs:rw + - ../../stirling/latest/config:/configs:rw + - ../../stirling/latest/logs:/logs:rw environment: + DISABLE_ADDITIONAL_FEATURES: "true" SECURITY_ENABLELOGIN: "false" + ENDPOINTS_GROUPS_TO_REMOVE: "CLI" SYSTEM_DEFAULTLOCALE: en-US UI_APPNAME: Stirling-PDF-Ultra-lite UI_HOMEDESCRIPTION: Demo site for Stirling-PDF-Ultra-lite Latest @@ -26,4 +31,29 @@ services: METRICS_ENABLED: "true" SYSTEM_GOOGLEVISIBILITY: "true" SHOW_SURVEY: "true" + networks: + - stirling-network + + frontend: + build: + context: ../.. + dockerfile: docker/frontend/Dockerfile + container_name: stirling-pdf-frontend-ultra-lite restart: on-failure:5 + ports: + - "3000:80" + environment: + BACKEND_URL: http://backend:8080 + depends_on: + - backend + networks: + - stirling-network + +networks: + stirling-network: + driver: bridge + +volumes: + stirling-data: + stirling-config: + stirling-logs: \ No newline at end of file diff --git a/testing/test.sh b/testing/test.sh index d4adce375..0876893de 100644 --- a/testing/test.sh +++ b/testing/test.sh @@ -225,8 +225,8 @@ test_compose() { echo "Testing $compose_file configuration..." - # Start up the Docker Compose service - docker-compose -f "$compose_file" up -d + # Start up the Docker Compose service with forced rebuild + docker-compose -f "$compose_file" up -d --build # Wait for the service to become healthy if check_health "$service_name" "$compose_file"; then @@ -276,22 +276,27 @@ main() { EXPECTED_VERSION=$(get_expected_version) echo "Expected version: $EXPECTED_VERSION" - # Building Docker images - # docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t stirlingtools/stirling-pdf:latest -f ./Dockerfile . - docker build --build-arg VERSION_TAG=alpha -t docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest-ultra-lite -f ./Dockerfile.ultra-lite . - # Test each configuration - run_tests "Stirling-PDF-Ultra-Lite" "./exampleYmlFiles/docker-compose-latest-ultra-lite.yml" + run_tests "Stirling-PDF-Ultra-Lite" "./testing/compose/docker-compose-ultra-lite.yml" - echo "Testing webpage accessibility..." - cd "testing" - if ./test_webpages.sh -f webpage_urls.txt -b http://localhost:8080; then - passed_tests+=("Webpage-Accessibility-lite") + echo "Testing basic frontend homepage accessibility..." + if curl -f http://localhost:3000 > /dev/null 2>&1; then + passed_tests+=("Frontend-Homepage-Accessibility-lite") + echo "Frontend homepage accessibility check passed" else - failed_tests+=("Webpage-Accessibility-lite") - echo "Webpage accessibility lite tests failed" + failed_tests+=("Frontend-Homepage-Accessibility-lite") + echo "Frontend homepage accessibility check failed" fi - cd "$PROJECT_ROOT" + + # echo "Testing webpage accessibility..." + # cd "testing" + # if ./test_webpages.sh -f webpage_urls.txt -b http://localhost:8080; then + # passed_tests+=("Webpage-Accessibility-lite") + # else + # failed_tests+=("Webpage-Accessibility-lite") + # echo "Webpage accessibility lite tests failed" + # fi + # cd "$PROJECT_ROOT" echo "Testing version verification..." if verify_app_version "Stirling-PDF-Ultra-Lite" "http://localhost:8080"; then @@ -302,10 +307,11 @@ main() { echo "Version verification failed for Stirling-PDF-Ultra-Lite" fi - docker-compose -f "./exampleYmlFiles/docker-compose-latest-ultra-lite.yml" down - - # run_tests "Stirling-PDF" "./exampleYmlFiles/docker-compose-latest.yml" - # docker-compose -f "./exampleYmlFiles/docker-compose-latest.yml" down + docker-compose -f "./testing/compose/docker-compose-ultra-lite.yml" down + + # Clean up any generated config files + echo "Cleaning up generated config files..." + rm -rf "$PROJECT_ROOT/stirling/" 2>/dev/null || true export DISABLE_ADDITIONAL_FEATURES=false # Run the gradlew build command and check if it fails @@ -319,43 +325,44 @@ main() { EXPECTED_VERSION=$(get_expected_version) echo "Expected version with security enabled: $EXPECTED_VERSION" - # Building Docker images with security enabled - # docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t stirlingtools/stirling-pdf:latest -f ./Dockerfile . - # docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t stirlingtools/stirling-pdf:latest-ultra-lite -f ./Dockerfile.ultra-lite . - docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest-fat -f ./Dockerfile.fat . - - # Test each configuration with security - # run_tests "Stirling-PDF-Ultra-Lite-Security" "./exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml" - # docker-compose -f "./exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml" down - # run_tests "Stirling-PDF-Security" "./exampleYmlFiles/docker-compose-latest-security.yml" - # docker-compose -f "./exampleYmlFiles/docker-compose-latest-security.yml" down + run_tests "Stirling-PDF-Security" "./testing/compose/docker-compose-security.yml" - - run_tests "Stirling-PDF-Security-Fat" "./exampleYmlFiles/docker-compose-latest-fat-security.yml" - - echo "Testing webpage accessibility..." - cd "testing" - if ./test_webpages.sh -f webpage_urls_full.txt -b http://localhost:8080; then - passed_tests+=("Webpage-Accessibility-full") + echo "Testing basic frontend homepage accessibility..." + if curl -f http://localhost:3000 > /dev/null 2>&1; then + passed_tests+=("Frontend-Homepage-Accessibility-full") + echo "Frontend homepage accessibility check passed" else - failed_tests+=("Webpage-Accessibility-full") - echo "Webpage accessibility full tests failed" + failed_tests+=("Frontend-Homepage-Accessibility-full") + echo "Frontend homepage accessibility check failed" fi - cd "$PROJECT_ROOT" + + # echo "Testing webpage accessibility..." + # cd "testing" + # if ./test_webpages.sh -f webpage_urls_full.txt -b http://localhost:8080; then + # passed_tests+=("Webpage-Accessibility-full") + # else + # failed_tests+=("Webpage-Accessibility-full") + # echo "Webpage accessibility full tests failed" + # fi + # cd "$PROJECT_ROOT" echo "Testing version verification..." - if verify_app_version "Stirling-PDF-Security-Fat" "http://localhost:8080"; then - passed_tests+=("Stirling-PDF-Security-Fat-Version-Check") - echo "Version verification passed for Stirling-PDF-Security-Fat" + if verify_app_version "Stirling-PDF-Security" "http://localhost:8080"; then + passed_tests+=("Stirling-PDF-Security-Version-Check") + echo "Version verification passed for Stirling-PDF-Security" else - failed_tests+=("Stirling-PDF-Security-Fat-Version-Check") - echo "Version verification failed for Stirling-PDF-Security-Fat" + failed_tests+=("Stirling-PDF-Security-Version-Check") + echo "Version verification failed for Stirling-PDF-Security" fi - docker-compose -f "./exampleYmlFiles/docker-compose-latest-fat-security.yml" down + docker-compose -f "./testing/compose/docker-compose-security.yml" down + + # Clean up any generated config files + echo "Cleaning up generated config files..." + rm -rf "$PROJECT_ROOT/stirling/" 2>/dev/null || true - run_tests "Stirling-PDF-Security-Fat-with-login" "./exampleYmlFiles/test_cicd.yml" + run_tests "Stirling-PDF-Security-with-login" "./testing/compose/docker-compose-security-with-login.yml" if [ $? -eq 0 ]; then # Create directory for file snapshots if it doesn't exist @@ -368,7 +375,7 @@ main() { DIFF_FILE="$SNAPSHOT_DIR/files_diff.txt" # Define container name variable for consistency - CONTAINER_NAME="Stirling-PDF-Security-Fat-with-login" + CONTAINER_NAME="Stirling-PDF-Security-with-login" capture_file_list "$CONTAINER_NAME" "$BEFORE_FILE" @@ -409,28 +416,12 @@ main() { fi fi - docker-compose -f "./exampleYmlFiles/test_cicd.yml" down + docker-compose -f "./testing/compose/docker-compose-security-with-login.yml" down + + # Clean up any generated config files + echo "Cleaning up generated config files..." + rm -rf "$PROJECT_ROOT/stirling/" 2>/dev/null || true - run_tests "Stirling-PDF-Fat-Disable-Endpoints" "./exampleYmlFiles/docker-compose-latest-fat-endpoints-disabled.yml" - - echo "Testing disabled endpoints..." - if ./testing/test_disabledEndpoints.sh -f ./testing/endpoints.txt -b http://localhost:8080; then - passed_tests+=("Disabled-Endpoints") - else - failed_tests+=("Disabled-Endpoints") - echo "Disabled Endpoints tests failed" - fi - - echo "Testing version verification..." - if verify_app_version "Stirling-PDF-Fat-Disable-Endpoints" "http://localhost:8080"; then - passed_tests+=("Stirling-PDF-Fat-Disable-Endpoints-Version-Check") - echo "Version verification passed for Stirling-PDF-Fat-Disable-Endpoints" - else - failed_tests+=("Stirling-PDF-Fat-Disable-Endpoints-Version-Check") - echo "Version verification failed for Stirling-PDF-Fat-Disable-Endpoints" - fi - - docker-compose -f "./exampleYmlFiles/docker-compose-latest-fat-endpoints-disabled.yml" down # Report results echo "All tests completed in $SECONDS seconds." diff --git a/testing/test2.sh b/testing/test2.sh index b33d2df8c..c8376d288 100644 --- a/testing/test2.sh +++ b/testing/test2.sh @@ -51,29 +51,33 @@ build_and_test() { local dockerfile_name="./Dockerfile" local image_base="stirlingtools/stirling-pdf" local security_suffix="" - local docker_compose_base="./exampleYmlFiles/docker-compose-latest" + local docker_compose_base="./testing/compose/docker-compose" local compose_suffix=".yml" local service_name_base="Stirling-PDF" - if [ "$enable_security" == "true" ]; then - security_suffix="-Security" - docker_compose_base+="-security" # Append to base name for Docker Compose files with security - fi - case "$build_type" in full) - dockerfile_name="./Dockerfile" + dockerfile_name="./docker/backend/Dockerfile" + if [ "$enable_security" == "true" ]; then + compose_file="${docker_compose_base}-fat-security${compose_suffix}" + service_name="Stirling-PDF-Security-Fat" + else + compose_file="${docker_compose_base}-fat${compose_suffix}" + service_name="stirling-pdf-backend-fat" + fi ;; ultra-lite) - dockerfile_name="./Dockerfile.ultra-lite" + dockerfile_name="./docker/backend/Dockerfile.ultra-lite" + if [ "$enable_security" == "true" ]; then + compose_file="${docker_compose_base}-ultra-lite-security${compose_suffix}" + service_name="stirling-pdf-backend-ultra-lite-security" + else + compose_file="${docker_compose_base}-ultra-lite${compose_suffix}" + service_name="Stirling-PDF-Ultra-Lite" + fi ;; esac - # Dynamic image tag and service name based on build type and security - local image_tag="${image_base}:latest${build_type}${security_suffix}" - local service_name="${service_name_base}${build_type^}${security_suffix}" - local compose_file="${docker_compose_base}${build_type}${compose_suffix}" - # Gradle build with or without security echo "Running ./gradlew clean build with security=$enable_security..." ./gradlew clean build @@ -83,10 +87,6 @@ build_and_test() { exit 1 fi - # Building Docker image - echo "Building Docker image $image_tag with Dockerfile $dockerfile_name..." - docker build --build-arg VERSION_TAG=$version_tag -t $image_tag -f $dockerfile_name . - if [ "$run_compose" == "true" ]; then echo "Running Docker Compose for $build_type with security=$enable_security..." docker-compose -f "$compose_file" up -d