From zero to a running PlanJCore service in minutes.
De zéro à un service PlanJCore fonctionnel en quelques minutes.
PlanJCore requires only a Java runtime. No external database, no message broker, no framework.
PlanJCore ne requiert qu'un environnement d'exécution Java. Aucune base de données externe, aucun courtier de messages, aucun framework.
# Verify Java version
java -version
# Expected: openjdk version "1.8.x" or higher
Download the latest release JAR from the Plan-J Solutions repository via PlanJRepo, or use the Docker image.
Téléchargez le dernier JAR depuis le dépôt Plan-J Solutions via PlanJRepo, ou utilisez l'image Docker.
# Always retrieves the latest version
curl -LO https://repo.planj.ca/repoGet/PlanJCore.jar
# Verify checksum
curl -s "https://repo.planj.ca/repoData?package=PlanJCore"
# Pull Docker image
docker pull jipidi/playground:latest
💡 Tip: The URL https://repo.planj.ca/repoGet/PlanJCore.jar
always serves the latest release. Append ?version=x.y.z to pin a specific version.
Checksum data is available at https://repo.planj.ca/repoData?package=PlanJCore.
💡 Conseil : L'URL https://repo.planj.ca/repoGet/PlanJCore.jar
fournit toujours la dernière version. Ajoutez ?version=x.y.z pour fixer une version précise.
Les données de checksum sont disponibles sur https://repo.planj.ca/repoData?package=PlanJCore.
PlanJCore is entirely driven by a JSON configuration file. A reference
sample is installed at /opt/PlanJ/PlanJDNS/PlanJDNS.json. Below is a minimal
example that starts an HTTPS listener on port 443.
PlanJCore est entièrement piloté par un fichier de configuration JSON.
Un exemple de référence est installé dans /opt/PlanJ/PlanJDNS/PlanJDNS.json.
Voici un exemple minimal démarrant un écouteur HTTPS
sur le port 443.
{
{
"PJTLS": { "Class": "ca.planj.crypto.pjSSLContext", "*.mydomain.ca": [ "/opt/PlanJ/mydomain.jks", "" ] },
"htLog": { "Class": "ca.planj.log.PJLogger", "Handlers": [ "ca.planj.log.handle.PJFileHandler"], "filePattern": "http_$N_$Y$M$D_$H$M.log", "memBuf": 100 },
"App": { "Class": "ca.planj.log.PJLogger", "Handlers": [ "ca.planj.log.handle.PJFileHandler"], "filePattern": "ALog_$N_$Y$M$D_$H$M.log", "memBuf": 100 },
"Error": { "Class": "ca.planj.log.PJLogger", "Handlers": [ "ca.planj.log.handle.PJFileHandler"], "filePattern": "ELog_$N_$Y$M$D_$H$M.log", "memBuf": 100 },
"mDate": { "Class": "ca.planj.util.ISODate", "TimeZone": "America/Toronto", "ShowTZ": false },
"MyCheck": { "Class": "ca.planj.core.monit.LifeLog", "Check": [ { "PlayGround": "/" } ], "TaskDelay": "600s" },
"PJAuth": { "Class": "ca.planj.auth.pjAuth", "Domain": "mydomain.ca", "AuthSrc": "https://auth.mydomain.ca", "Handshake": "online:loginData" },
"PlayGround": {
"Class": "ca.planj.ip.tcpServer",
"StatusPage": "/PJStatus:AccessGroup",
"Port": 443,
"HttpLog": "htLog",
"Handler": "ca.planj.com.handle.httpServer",
"Modules": [ ],
"AutoACL": "4:2000:30",
"FilePath": "https://core.planj.ca/PlayGround.zip",
"pjspOn": true,
"sslContext": "PJTLS",
"NoCache": true,
"Sessions": { "Rotate": 30 }
}
}
}
"DNSStore": {
"Class": "ca.planj.data.stor.Source",
"Description": "Application Object Persistence",
"Permissions": [
{ "*": "CRUD" }
],
"Models": {
"UserData": {
"Description": "User data objects",
"Elements": "timed tagged"
},
"Groupings": {
"Description": "User Groups and interrelation data objects",
"Elements": "timed tagged"
},
}
# General form - the config filename matches the app being loaded
java -jar PlanJCore.jar load=PlanJCore.json
# With PlanJBounce extension in lib folder
java -jar PlanJCore.jar load=PlanJBounce.json
# With PlanJAuth extension in lib folder
java -jar PlanJCore.jar load=PlanJAuth.json
docker run -d \
--name planjcore \
-v $(pwd)/PlanJCore.json:/app/PlanJCore.json \
-v $(pwd)/certs:/etc/planj/certs:ro \
-p 8443:443 \
jipidi/playground:latest \
load=PlanJCore.json
services:
planjcore:
image: jipidi/playground:latest
volumes:
- ./PlanJCore.json:/app/PlanJCore.json
- ./certs:/etc/planj/certs:ro
command: ["load=PlanJCore.json"]
ports:
- "8443:443"
restart: unless-stopped
bounce:
image: jipidi/playground:latest
depends_on: [planjcore]
restart: unless-stopped
PlanJCore exposes three built-in diagnostic endpoints - no extra configuration required. All are served by the running instance on whichever port you configured.
PlanJCore expose trois points de terminaison de diagnostic intégrés - aucune configuration supplémentaire requise. Tous sont servis par l'instance en cours d'exécution sur le port que vous avez configuré.
/PJStatus/PJStatusReturns a full JSON snapshot of the running instance: loaded services, active listeners, extension status, uptime, and key runtime metrics. This endpoint is unprotected by default - restrict access at the network level in production.
Retourne un instantané JSON complet de l'instance en cours : services chargés, écouteurs actifs, statut des extensions, temps de fonctionnement et métriques d'exécution clés. Ce point de terminaison est non protégé par défaut - restreignez l'accès au niveau réseau en production.
curl http://localhost:8085/PJStatus
🔍 Live example: http://n22.jpdelisle.ca:8085/PJStatus
🔍 Exemple en direct : http://n22.jpdelisle.ca:8085/PJStatus
/PlanJID?<token>/PlanJID?<token>Validates the remote system's identity Keys and obtains the public key for secure and trusted communications.
Valide les clefs d'identité du système distant et obtient la clé publique pour des communications sécurisées et de confiance.
curl http://localhost:8085/PlanJID?MyToken
curl "https://repo.planj.ca/repoData?package=PlanJCore"