ProjectForge is a web-based solution for project management including time tracking, team calendar, gantt-charting, financial administration, issue management, controlling and managing work-break-down-structures (e. g. together with JIRA as issue management system).
docker/build-local.sh is the fastest way to get a self-contained instance, e. g. for handing a test or
pentest system over to somebody else. It detects docker/podman, finds the boot jar built by Gradle
(the version string doesn’t have to be known), copies it into the build context and cleans up afterwards.
-
./gradlew :projectforge-application:bootJar -
docker/build-local.sh --save(see--helpfor all options)
Options worth knowing: --platform linux/amd64 (cross build via buildx, needed if the recipient isn’t on
arm64), --save (writes build/docker/projectforge-pentest.tar for handing the image over),
--run (starts the container right away), --tag, --dir, --base-image.
The single container supports the embedded HSQLDB: docker/entrypoint.sh starts with -Ddocker=single
by default, and only -Ddocker=stack (docker compose) or -Dprojectforge.setup=postgres removes the
embedded option from the setup wizard. No PostgreSQL, no compose stack needed.
./gradlew :projectforge-application:bootJar
docker/build-local.sh --saveThis writes build/docker/projectforge-pentest.tar, roughly 700 MB. Note that the image is built for
your native architecture. If the recipient isn’t on arm64 too, build with
docker/build-local.sh --platform linux/amd64 --save.
Requirement: docker or podman. All docker commands below work with podman as well.
-
Load the image:
docker load -i projectforge-pentest.tar -
Prepare the configuration. Pre-seeding
projectforge.propertiesskips the interactive console setup wizard, so the entrypoint does a "Normal start" right away:mkdir -p ~/ProjectForgePentest cat > ~/ProjectForgePentest/projectforge.properties <<'EOF' server.address=0.0.0.0 server.port=8080 projectforge.domain=http://localhost:8080 # Activate all plugins, instead of clicking them in administration -> plugins: projectforge.plugins.active=all projectforge.currencySymbol=€ projectforge.currency=EUR projectforge.defaultLocale=en projectforge.defaultTimeNotation=H24 projectforge.defaultFirstDayOfWeek=MONDAY EOF
server.address=0.0.0.0is mandatory, otherwise the server binds to localhost inside the container only and the port isn’t reachable from the host. -
Start the container:
docker run -d -p 127.0.0.1:8080:8080 \ -v ~/ProjectForgePentest:/ProjectForge \ --name projectforge-pentest projectforge:pentestThe first start takes about a minute, Flyway creates the HSQLDB schema. Follow it with
docker logs -f projectforge-pentestand wait forProjectForge is now available (up and running). -
Initialize the database: open http://localhost:8080 and complete the setup page. Choose target Test system for a database filled with test data (Productive system gives an empty one), set an admin account with a password and pick a time zone.
-
Restart once, recommended for full plugin functionality:
docker restart projectforge-pentest
Afterwards log in with the admin account. All plugins are active (banking, data transfer, Merlin, marketing, skill matrix, to-do, memo, IHK, liquidity planning, license management).
Alternatively skip step 2 and run the container with -t -i instead of -d: without
/ProjectForge/projectforge.properties the entrypoint runs the console setup wizard in the foreground.
The embedded database is the default there, the base directory selection is skipped in docker mode.
Reset the instance (the embedded database lives in ~/ProjectForgePentest/database), then continue at
step 2 again:
docker rm -f projectforge-pentest && rm -rf ~/ProjectForgePentest-
Log file:
tail -f ~/ProjectForgePentest/logs/ProjectForge.log -
Shell inside the container:
docker exec -it projectforge-pentest bash -
JVM memory settings:
~/ProjectForgePentest/environment.sh, e. g.export JAVA_OPTS="-Xmx2g", followed by a restart -
More verbose logging while testing:
projectforge.development.mode=trueinprojectforge.properties
The port is published on 127.0.0.1 only. To reach the instance from another machine, use
-p 8080:8080 and adjust projectforge.domain accordingly.
-
docker login -
export PF_VERSION=8.0 -
Build docker test image:
-
docker buildx build --platform linux/arm64 --build-arg JAR_FILE=projectforge-application-$PF_VERSION.jar -t projectforge:latest-arm64-test \--load ., or -
'docker buildx build --platform linux/amd64 --build-arg JAR_FILE=projectforge-application-$PF_VERSION.jar -t projectforge:latest-amd64-test \--load .'
-
-
Run:
docker run -t -i -p 127.0.0.1:8080:8080 -v ~/ProjectForgeDocker:/ProjectForge --name projectforge projectforge:latest-arm64-test -
Enter docker:
docker exec -it projectforge bash -
Restart:
docker start -ai projectforge
Edit memory settings etc. in ProjectForge/environment.sh.
Deleting test container:
1. docker stop projectforge
2. docker rm projectforge
3. docker images
4. docker rmi <image-id>
-
Can’t access port 8080?
The built-in mainapplication.propertiesdefinesserver.address=localhost, therefore this port can’t be exported to the host system. In docker mode ProjectForge forcesserver.address=0.0.0.0(seeLantSetupWizard), so the setup wizard writes this value into/ProjectForge/projectforge.properties. When seeding that file manually, setserver.address=0.0.0.0yourself.
Through thedocker runoption-p 8080:8080the port is exported to the host.