mirror of
https://github.com/penpot/penpot.git
synced 2026-06-23 15:52:08 +00:00
* 🐳 Add ImageMagick policy.xml resource limits to backend Docker image Add a restrictive policy.xml to the backend Docker image that caps ImageMagick resource usage: 256MiB memory, 512MiB map, 128MP area, 30s time limit, 16KP max dimensions. Blocks PS/EPS/PDF/XPS coders to prevent Ghostscript attack surface. Co-authored-by: mimo-v2.5-pro <mimo-v2.5-pro@penpot.app> * ✨ Add timeout support to shell/exec! Add optional :timeout parameter (in seconds) that uses Process.waitFor(long, TimeUnit). On timeout, the process is destroyed forcibly and an :internal/:process-timeout exception is raised. Stdout/stderr readers handle IOException from closed streams when the process is killed. Co-authored-by: mimo-v2.5-pro <mimo-v2.5-pro@penpot.app> * ♻️ Rename ::wrk/netty-executor to ::wrk/executor with cached pool Replace DefaultEventExecutorGroup (fixed Netty thread pool) with a cached thread pool (px/cached-executor) for general async task offloading. The cached pool creates threads on demand and reuses idle ones, which is more appropriate for blocking I/O workloads (shell commands, message bus, rate limiting, etc.). Changes: - Rename ::wrk/netty-executor to ::wrk/executor in worker/executor.clj - Switch implementation from DefaultEventExecutorGroup to px/cached-executor - Update all ig/ref wiring in main.clj (msgbus, tmp cleaner, climit, rlimit, rpc) - Remove ::wrk/netty-executor from redis.clj (let lettuce create its own eventExecutorGroup instead of sharing a Netty executor) - Assert executor is present in shell/exec! to prevent silent nil usage - Remove executor-threads config (no longer needed for cached pool) The ::wrk/netty-io-executor (NioEventLoopGroup) remains unchanged as it handles actual non-blocking network I/O for Redis and S3. Co-authored-by: mimo-v2.5-pro <mimo-v2.5-pro@penpot.app> * 🔥 Remove im4java dependency and replace with direct ImageMagick CLI calls - Replace im4java Java library with direct 'magick' CLI calls via shell/exec! - Add PENPOT_IMAGEMAGICK_* config env vars for resource limits (thread, memory, map, area, disk, time, width, height) - Use configurable ImageMagick environment with sensible defaults matching policy.xml - Remove -Dim4java.useV7=true JVM flag from startup scripts - Remove org.im4java/im4java from deps.edn - All ImageMagick commands now use shell/exec! with 60s timeout and resource limits Co-authored-by: mimo-v2.5-pro <mimo-v2.5-pro@penpot.app> * 💄 Rename imagemagick env functions and optimize config reads - Rename imagemagick-defaults -> imagemagick-default-env - Rename imagemagick-env -> get-imagemagick-env - Optimize to avoid double cf/get calls per config key Co-authored-by: mimo-v2.5-pro <mimo-v2.5-pro@penpot.app> * ✨ Add tests for shell/exec! timeout and media processing - Add shell_test.clj: tests for exec! timeout, env vars, stdin, stderr - Add media_test.clj: tests for info, generic-thumbnail, profile-thumbnail - Fix generic-process to prefer explicit format over input mtype - Fix shell/exec! to use cached executor when system has no executor - Fix reduce-kv accumulator in set-env (must return penv) Co-authored-by: mimo-v2.5-pro <mimo-v2.5-pro@penpot.app> * ♻️ Refactor media/process to take system as first argument - Change (defmulti process :cmd) -> (defmulti process (fn [_system params] (:cmd params))) - Change (run params) -> (run system params) - All process methods now receive [system params] - Update all callers: rpc/commands/media, profile, auth, fonts - Revert shell/exec! to require system with executor (no fallback) - Fix lint warnings and formatting Co-authored-by: mimo-v2.5-pro <mimo-v2.5-pro@penpot.app> * 🔥 Remove unused app.svgo namespace Co-authored-by: mimo-v2.5-pro <mimo-v2.5-pro@penpot.app> * 🔥 Remove Node.js from backend Docker image - Delete unused svgo-cli.js script - Remove Node.js installation from Dockerfile.backend - Remove svgo-cli.js copy from backend build script Co-authored-by: mimo-v2.5-pro <mimo-v2.5-pro@penpot.app> * 🔥 Remove unused process-error multimethod - Remove process-error multimethod and its default handler - Simplify media/run to directly call process - Fix alignment in main.clj Co-authored-by: mimo-v2.5-pro <mimo-v2.5-pro@penpot.app> * 📚 Add ImageMagick resource limits configuration to technical guide Co-authored-by: mimo-v2.5-pro <mimo-v2.5-pro@penpot.app> --------- Co-authored-by: mimo-v2.5-pro <mimo-v2.5-pro@penpot.app>
101 lines
3.5 KiB
Bash
101 lines
3.5 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
export PENPOT_NITRATE_SHARED_KEY=super-secret-nitrate-api-key
|
|
export PENPOT_EXPORTER_SHARED_KEY=super-secret-exporter-api-key
|
|
export PENPOT_NEXUS_SHARED_KEY=super-secret-nexus-api-key
|
|
export PENPOT_SECRET_KEY=super-secret-devenv-key
|
|
|
|
# DEPRECATED: only used for subscriptions
|
|
export PENPOT_MANAGEMENT_API_KEY=super-secret-management-api-key
|
|
|
|
# Runtime config that varies per devenv instance (PENPOT_HOST, PENPOT_PUBLIC_URI,
|
|
# PENPOT_DATABASE_*, PENPOT_REDIS_URI, PENPOT_OBJECTS_STORAGE_*, AWS_*) is owned by
|
|
# docker/devenv/defaults.env and injected via the main service's env block.
|
|
|
|
# Background worker flag is per-instance. Defaults to enabled (ws0); ws1+
|
|
# overlays set PENPOT_BACKEND_WORKER=false so scheduled and async tasks only
|
|
# run on ws0, keeping notification Pub/Sub bound to a single Valkey. See
|
|
# mem:devenv/core for the rationale.
|
|
__worker_flag=""
|
|
if [[ "${PENPOT_BACKEND_WORKER:-true}" == "true" ]]; then
|
|
__worker_flag="enable-backend-worker"
|
|
fi
|
|
|
|
export PENPOT_FLAGS="\
|
|
$PENPOT_FLAGS \
|
|
enable-login-with-password \
|
|
disable-login-with-ldap \
|
|
disable-login-with-oidc \
|
|
disable-login-with-google \
|
|
disable-login-with-github \
|
|
disable-login-with-gitlab \
|
|
disable-telemetry \
|
|
$__worker_flag \
|
|
enable-backend-asserts \
|
|
disable-feature-fdata-pointer-map \
|
|
enable-feature-fdata-objects-map \
|
|
enable-audit-log \
|
|
enable-transit-readable-response \
|
|
enable-demo-users \
|
|
enable-user-feedback \
|
|
disable-secure-session-cookies \
|
|
enable-smtp \
|
|
enable-prepl-server \
|
|
enable-urepl-server \
|
|
enable-rpc-climit \
|
|
enable-rpc-rlimit \
|
|
enable-quotes \
|
|
enable-soft-rpc-rlimit \
|
|
enable-auto-file-snapshot \
|
|
enable-webhooks \
|
|
enable-access-tokens \
|
|
disable-tiered-file-data-storage \
|
|
enable-file-validation \
|
|
enable-file-schema-validation \
|
|
enable-redis-cache \
|
|
enable-subscriptions";
|
|
|
|
# Uncomment for nexus integration testing
|
|
# export PENPOT_FLAGS="$PENPOT_FLAGS enable-audit-log-archive";
|
|
# export PENPOT_AUDIT_LOG_ARCHIVE_URI="http://localhost:6070/api/audit";
|
|
|
|
# Default deletion delay for devenv
|
|
export PENPOT_DELETION_DELAY="24h"
|
|
|
|
# Setup default upload media file size to 100MiB
|
|
export PENPOT_MEDIA_MAX_FILE_SIZE=104857600
|
|
|
|
# Setup default multipart upload size to 300MiB
|
|
export PENPOT_HTTP_SERVER_MAX_MULTIPART_BODY_SIZE=314572800
|
|
|
|
export PENPOT_USER_FEEDBACK_DESTINATION="support@example.com"
|
|
|
|
export PENPOT_NITRATE_BACKEND_URI=http://localhost:3000/admin-console
|
|
|
|
export JAVA_OPTS="\
|
|
-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager \
|
|
-Djdk.attach.allowAttachSelf \
|
|
-Dlog4j2.configurationFile=log4j2-devenv.xml \
|
|
-Djdk.tracePinnedThreads=full \
|
|
-XX:+UnlockExperimentalVMOptions \
|
|
-XX:+UseShenandoahGC \
|
|
-XX:+UseCompactObjectHeaders \
|
|
-XX:ShenandoahGCMode=generational \
|
|
-XX:-OmitStackTraceInFastThrow \
|
|
--sun-misc-unsafe-memory-access=allow \
|
|
--enable-preview \
|
|
--enable-native-access=ALL-UNNAMED";
|
|
|
|
function setup_minio() {
|
|
if [ "${PENPOT_OBJECTS_STORAGE_BACKEND}" != "s3" ]; then
|
|
return 0
|
|
fi
|
|
|
|
# Shared MinIO user/policy provisioning is handled by docker-compose.infra.yml.
|
|
# Per process startup only ensures that the configured bucket exists.
|
|
mc alias set penpot-s3/ "${PENPOT_OBJECTS_STORAGE_S3_ENDPOINT}" minioadmin minioadmin -q
|
|
mc mb "penpot-s3/${PENPOT_OBJECTS_STORAGE_S3_BUCKET}" -p -q
|
|
}
|
|
|
|
|