I deployed penpot on my internal network via docker-compose, using an Nginx reverse proxy and using a self-signed certificate to enable HTTPS. The basics of access, login and so on worked fine, but when I created the document, The console prompt POST https://uix.rd.work/api/rpc/command/create-file 400 (Bad Request)
error:
Environment and Configuration
Docker Compose
./docker-compose.yaml
---
version: "3.5"
services:
frontend:
image: penpotapp/frontend:latest
container_name: penpot-frontend
restart: always
env_file: ./.env.frontend
depends_on:
- backend
- exporter
ports:
- 9012:80
labels:
- "traefik.enable=true"
volumes:
- ./app/assets:/opt/data/assets
backend:
# image: penpotapp/backend:latest
build: ./build/backend
container_name: penpot-backend
restart: always
env_file: ./.env.backend
depends_on:
- postgres
- redis
ports:
- 6060:6060
volumes:
- ./app/assets:/opt/data/assets
exporter:
image: penpotapp/exporter:latest
container_name: penpot-exporter
restart: always
ports:
- 6061:6061
environment:
# Don't touch it; this uses internal docker network to
# communicate with the frontend.
- PENPOT_PUBLIC_URI=http://frontend
## Redis is used for the websockets notifications.
- PENPOT_REDIS_URI=redis://redis/0
postgres:
image: postgres:15
container_name: penpot-postgres
restart: always
stop_signal: SIGINT
environment:
- POSTGRES_USER=penpot
- POSTGRES_DB=penpot
- POSTGRES_PASSWORD=penpot
- POSTGRES_INITDB_ARGS=--data-checksums
healthcheck:
test: ["CMD-SHELL", "sh -c 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}'"]
interval: 10s
timeout: 3s
retries: 3
start_period: 3s
volumes:
- ./data/postgres:/var/lib/postgresql/data
redis:
image: redis:7
container_name: penpot-redis
restart: always
command: ["--databases", "1"]
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
volumes:
- ./data/redis:/data
## A mailcatch service, used as temporal SMTP server. You can access via HTTP to the
## port 1080 for read all emails the penpot platform has sent. Should be only used as a
## temporal solution meanwhile you don't have a real SMTP provider configured.
mailcatch:
image: sj26/mailcatcher:latest
container_name: penpot-mailcatch
restart: always
networks:
default:
external: true
name: penpot
./build/backend/Dockerfile
FROM penpotapp/backend:latest
USER root
COPY kimotech-power-ca.crt /usr/local/share/ca-certificates/
# RUN update-ca-certificates
# RUN keytool -import -trustcacerts -cacerts -storepass 3FvYZn7WuLHuKPoC -noprompt -alias kimotech-power-ca -file /usr/local/share/ca-certificates/kimotech-power-ca.crt
RUN keytool -import -trustcacerts -keystore /opt/jdk/lib/security/cacerts -noprompt -alias kimotech-power-ca -file /usr/local/share/ca-certificates/kimotech-power-ca.crt -storepass 3FvYZn7WuLHuKPoC
USER penpot:penpot
./.env.backend
PENPOT_FLAGS=enable-login-with-oidc disable-registration disable-login-with-password disable-email-verification enable-smtp enable-prepl-server
PENPOT_PUBLIC_URI=https://uix.rd.work
## DATABASE configuration
PENPOT_DATABASE_URI=postgresql://postgres/penpot
PENPOT_DATABASE_USERNAME=penpot
PENPOT_DATABASE_PASSWORD=penpot
## REDIS configuration
PENPOT_REDIS_URI=redis://redis/0
## STORAGE configuration
PENPOT_ASSETS_STORAGE_BACKEND=assets-fs
PENPOT_STORAGE_ASSETS_FS_DIRECTORY=/opt/data/assets
## OIDC configuration
PENPOT_OIDC_CLIENT_ID=penpot
PENPOT_OIDC_BASE_URI=https://auth.rd.work
PENPOT_OIDC_CLIENT_SECRET=vOKsa0Zbj9tKvkiqPVfOSvnyTdBZcRTvfPH7KSPoqtHGtsuNbPenVjapNcQe6gmniHscfaR2
PENPOT_OIDC_AUTH_URI=https://auth.rd.work/api/oidc/authorization
PENPOT_OIDC_TOKEN_URI=https://auth.rd.work/api/oidc/token
PENPOT_OIDC_USER_URI=https://auth.rd.work/api/oidc/userinfo
./.env.frontend
PENPOT_FLAGS=enable-login-with-oidc disable-registration disable-login-with-password
PENPOT_PUBLIC_URI=https://uix.rd.work
Nginx
uix.rd.work-nginx.conf
server {
listen 80 ;
listen 443 ssl http2 ;
server_name uix.rd.work;
index index.php index.html index.htm default.php default.htm default.html;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
access_log /www/sites/uix.rd.work/log/access.log;
error_log /www/sites/uix.rd.work/log/error.log;
access_by_lua_file /www/common/waf/access.lua;
set $RulePath /www/sites/uix.rd.work/waf/rules;
set $logdir /www/sites/uix.rd.work/log;
set $redirect on;
set $attackLog on;
set $CCDeny off;
set $urlWhiteAllow off;
set $urlBlockDeny off;
set $argsDeny off;
set $postDeny off;
set $cookieDeny off;
set $fileExtDeny off;
set $ipBlockDeny off;
set $ipWhiteAllow off;
if ($scheme = http) {
return 301 https://$host$request_uri;
}
ssl_certificate /www/sites/uix.rd.work/ssl/fullchain.pem;
ssl_certificate_key /www/sites/uix.rd.work/ssl/privkey.pem;
ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;
proxy_set_header X-Forwarded-Proto https;
ssl_stapling on;
ssl_stapling_verify on;
include /www/sites/uix.rd.work/proxy/*.conf;
location ^~ /.well-known/acme-challenge {
allow all;
root /usr/share/nginx/html;
}
location ^~ / {
proxy_pass http://127.0.0.1:9012;
## Headers
proxy_set_header Host $host;
proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
proxy_set_header X-Forwarded-Proto http;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Connection "";
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
add_header X-Cache $upstream_cache_status;
## Basic Proxy Configuration
client_body_buffer_size 128k;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; ## Timeout if the real server is dead.
proxy_redirect http:// $scheme://;
proxy_http_version 1.1;
proxy_cache_bypass $cookie_session;
proxy_no_cache $cookie_session;
# proxy_buffers 64 256k;
## Trusted Proxies Configuration
## Please read the following documentation before configuring this:
## https://www.authelia.com/integration/proxies/nginx/#trusted-proxies
# set_real_ip_from 10.0.0.0/8;
# set_real_ip_from 172.16.0.0/12;
# set_real_ip_from 192.168.0.0/16;
# set_real_ip_from fc00::/7;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
## Advanced Proxy Configuration
send_timeout 5m;
proxy_read_timeout 360;
proxy_send_timeout 360;
proxy_connect_timeout 360;
## Send a subrequest to Authelia to verify if the user is authenticated and has permission to access the resource.
auth_request /authelia;
## Set the $target_url variable based on the original request.
## Comment this line if you're using nginx without the http_set_misc module.
set_escape_uri $target_url $scheme://$http_host$request_uri;
## Uncomment this line if you're using NGINX without the http_set_misc module.
# set $target_url $scheme://$http_host$request_uri;
## Save the upstream response headers from Authelia to variables.
auth_request_set $user $upstream_http_remote_user;
auth_request_set $groups $upstream_http_remote_groups;
auth_request_set $name $upstream_http_remote_name;
auth_request_set $email $upstream_http_remote_email;
## Inject the response headers from the variables into the request made to the backend.
proxy_set_header Remote-User $user;
proxy_set_header Remote-Groups $groups;
proxy_set_header Remote-Name $name;
proxy_set_header Remote-Email $email;
## If the subreqest returns 200 pass to the backend, if the subrequest returns 401 redirect to the portal.
error_page 401 =302 https://auth.rd.work/?rd=$target_url;
add_header Strict-Transport-Security "max-age=31536000";
}
set $upstream_authelia http://127.0.0.1:9091/api/verify;
## Virtual endpoint created by nginx to forward auth requests.
location /authelia {
## Essential Proxy Configuration
internal;
proxy_pass $upstream_authelia;
## Headers
## The headers starting with X-* are required.
proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
proxy_set_header X-Original-Method $request_method;
proxy_set_header X-Forwarded-Method $request_method;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Content-Length "";
proxy_set_header Connection "";
## Basic Proxy Configuration
proxy_pass_request_body off;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; # Timeout if the real server is dead
proxy_redirect http:// $scheme://;
proxy_http_version 1.1;
proxy_cache_bypass $cookie_session;
proxy_no_cache $cookie_session;
# proxy_buffers 4 32k;
client_body_buffer_size 128k;
## Advanced Proxy Configuration
send_timeout 5m;
proxy_read_timeout 240;
proxy_send_timeout 240;
proxy_connect_timeout 240;
}
}
Services logs
penpot-frontend
......
172.29.0.1 - - [10/May/2024:08:58:20 +0000] "GET /api/rpc/command/get-builtin-templates HTTP/1.1" 200 280 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:20 +0000] "GET /authelia HTTP/1.1" 200 106528 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:32 +0000] "GET /api/rpc/command/get-builtin-templates HTTP/1.1" 200 280 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:32 +0000] "GET /authelia HTTP/1.1" 200 73752 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:32 +0000] "GET /authelia HTTP/1.1" 200 106528 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:32 +0000] "POST /api/rpc/command/update-profile-props HTTP/1.1" 200 319 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:32 +0000] "GET /authelia HTTP/1.1" 200 73752 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:32 +0000] "GET /api/rpc/command/get-profile HTTP/1.1" 200 516 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:32 +0000] "GET /api/rpc/command/get-builtin-templates HTTP/1.1" 200 280 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:32 +0000] "GET /authelia HTTP/1.1" 200 49168 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:34 +0000] "GET /authelia HTTP/1.1" 200 73752 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:34 +0000] "GET /api/rpc/command/get-builtin-templates HTTP/1.1" 200 280 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:34 +0000] "GET /authelia HTTP/1.1" 200 106528 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:34 +0000] "POST /api/rpc/command/update-profile-props HTTP/1.1" 200 340 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:34 +0000] "GET /api/rpc/command/get-profile HTTP/1.1" 200 533 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:34 +0000] "GET /authelia HTTP/1.1" 200 106528 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:34 +0000] "GET /api/rpc/command/get-builtin-templates HTTP/1.1" 200 280 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:34 +0000] "GET /authelia HTTP/1.1" 200 73752 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:43 +0000] "GET /authelia HTTP/1.1" 200 106528 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:43 +0000] "POST /api/rpc/command/update-profile-props HTTP/1.1" 200 361 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:43 +0000] "GET /api/rpc/command/get-profile HTTP/1.1" 200 555 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:43 +0000] "GET /authelia HTTP/1.1" 200 106528 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:46 +0000] "GET /authelia HTTP/1.1" 200 106528 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:46 +0000] "POST /api/rpc/command/update-profile-props HTTP/1.1" 200 365 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:46 +0000] "GET /api/rpc/command/get-profile HTTP/1.1" 200 556 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:46 +0000] "GET /authelia HTTP/1.1" 200 73752 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:47 +0000] "GET /authelia HTTP/1.1" 200 73752 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:48 +0000] "POST /api/rpc/command/update-profile-props HTTP/1.1" 200 366 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:48 +0000] "GET /authelia HTTP/1.1" 200 106528 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:48 +0000] "GET /api/rpc/command/get-profile HTTP/1.1" 200 557 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:49 +0000] "GET /authelia HTTP/1.1" 200 106528 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
172.29.0.1 - - [10/May/2024:08:58:49 +0000] "POST /api/rpc/command/create-file HTTP/1.1" 400 172 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
penpot-backend
+ exec /opt/jdk/bin/java -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Dlog4j2.configurationFile=log4j2.xml -XX:-OmitStackTraceInFastThrow --enable-preview -jar penpot.jar -m app.main
INFO StatusConsoleListener Registered Log4j as the java.util.logging.LogManager.
[2024-05-10 08:57:08.953] I app.auth.oidc - hint="provider initialized", provider="oidc", method="manual", client-id="penpot", client-secret="vOKsa*******************************************************************", scopes="profile,email,openid", auth-uri="https://auth.rd.work/api/oidc/authorization", user-uri="https://auth.rd.work/api/oidc/userinfo", token-uri="https://auth.rd.work/api/oidc/token", roles-attr=nil, roles=nil, keys=""
[2024-05-10 08:57:08.958] I app.metrics - action="initialize metrics"
[2024-05-10 08:57:08.975] I app.db - hint="initialize connection pool", name="main", uri="postgresql://postgres/penpot", read-only=false, with-credentials=true, min-size=0, max-size=60
[2024-05-10 08:57:09.025] I app.migrations - hint="running migrations", module=:app.migrations/migrations
[2024-05-10 08:57:09.353] W app.setup - hint="using autogenerated secret-key, it will change on each restart and will invalidate all sessions on each restart, it is hightly recommended setting up the PENPOT_SECRET_KEY environment variable"
[2024-05-10 08:57:09.408] I app.redis - hint="initialize redis resources", uri="redis://redis/0", io-threads=3, worker-threads=3, connect?=nil
[2024-05-10 08:57:09.617] I app.msgbus - hint="initialize msgbus", buffer-size=128
[2024-05-10 08:57:11.878] I app.http - hint="starting http server", port=6060, host="0.0.0.0"
[2024-05-10 08:57:11.895] I io.undertow - starting server: Undertow - 2.3.0.Final
[2024-05-10 08:57:11.901] I org.xnio - XNIO version 3.8.8.Final
[2024-05-10 08:57:11.907] I org.xnio.nio - XNIO NIO Implementation Version 3.8.8.Final
[2024-05-10 08:57:11.929] I org.jboss.threads - JBoss Threads version 3.5.0.Final
[2024-05-10 08:57:11.989] I app.loggers.database - hint="initializing database error persistence"
[2024-05-10 08:57:11.996] I app.storage.tmp - hint="started tmp file cleaner"
[2024-05-10 08:57:12.027] I app.worker - hint="registry initialized", tasks=13
[2024-05-10 08:57:12.034] I app.worker - hint="cron: started", tasks=8
[2024-05-10 08:57:12.059] I app.worker - hint="dispatcher: started"
[2024-05-10 08:57:12.060] I app.worker - hint="monitor: started", name="default"
[2024-05-10 08:57:12.107] I app.srepl - msg="initializing repl server", name="prepl", port=6063, host="localhost"
[2024-05-10 08:57:12.114] I app.worker - hint="worker: started", worker-id=0, queue="default"
[2024-05-10 08:57:12.116] I app.worker - hint="worker: started", worker-id=0, queue="webhooks"
[2024-05-10 08:57:12.128] I app.main - hint="welcome to penpot", flags="backend-openapi-doc,login-with-password,backend-api-doc,secure-session-cookies,backend-worker,login-with-oidc,smtp,registration,prepl-server", worker?=true, version="1.19.3-10698-g1eaf7b2b4"