← → to navigate · F for fullscreen
Infrastructure as Code · Web Platform

Portal PRJAAS.

One server, many apps — a self-service web hosting platform, rebuilt on demand from code. Any tech stack, behind one domain, secured by default.

Why we built it

The goals

At a glance

What Portal PRJAAS is

How it fits together

The architecture

proxy
Traefik — the only container on ports 80/443. Automatic Let's Encrypt TLS, HTTP→HTTPS, path routing.
platform
PostgreSQL · Redis · MinIO — shared data services, internal only, never exposed.
apps
Your web apps — wired to Traefik by labels, one path each.
edge network — Traefik ↔ apps platform network — apps ↔ datastores Routing — Host(fqdn) && PathPrefix(/app)
How it fits together

Architecture — the full picture

PRJAAS architecture diagram: proxy, platform and apps stacks on edge and platform networks
The core idea

One declaration file per app

ansible-playbook site.yml --tags apps
Bring your own stack

App building alternatives

The platform is stack-agnostic — it only asks for a small container contract: serve plain HTTP on one port, honor a path prefix, expose a health endpoint, ship curl, build linux/amd64.

.NET

ASP.NET Core 8 reference app — build, containerize, deploy.

/dotnetsample

Python

FastAPI twin — same shape, different language.

/pythonsample

Java

Spring Boot with Microsoft Entra ID login (SSO).

/login

Node.js

Powers the AI database chatbot — our first production app.

/dbchat
From code to live

How onboarding works

  1. BuildMulti-stage Dockerfile for your app.
  2. PublishPush to Nexus — or side-load while the firewall is pending.
  3. DeclareAdd apps/<app>.yml (+ secrets in the vault).
  4. DeployRun the apps playbook — one command.
  5. LiveHTTPS, routing, health & homepage — automatic.
Included out of the box

Batteries included

Shared data

Postgres (DB + user per app), Redis, MinIO — auto-wired via shared_services. Plus a read-only reporting user and a documented sample database.

Authentication

Per-app Microsoft Entra ID login with SSO — a documented, repeatable convention.

Backups

Nightly Postgres dumps and volume archives, retained automatically.

Branded homepage

Every app appears on an Inetum-branded landing page — generated automatically.

Live · First production app · Node.js

AI Chatbot — explore your data

Our first non-demo application, live at /dbchat — brought from its own XD_Commons repository and onboarded onto the platform unchanged. A conversational assistant that lets people query the databases in plain language, no SQL required.

Ask in natural language

"How many orders shipped last week?" — the assistant turns questions into queries and answers.

Safe by design

Runs through the cluster-wide read-only Postgres role — it can read data, never change it.

Schema-aware

Uses the documented tables & column comments (e.g. the flowershop sample DB) for accurate answers.

Status today

Where we are

See it live

The running platform

Screenshot of the Inetum-branded PRJAAS homepage listing the hosted applications
Mini guide

Onboard an app in 5 steps

Two actors: the app developer builds the app and publishes its image to Nexus; the platform manager declares it and deploys. The platform just needs a container that serves plain HTTP on one port, binds 0.0.0.0, honors a path prefix, and exposes a health endpoint.

  1. DevMeet the contractHTTP on a port, a /healthz endpoint, ship curl, build linux/amd64.
  2. DevBuild the imageMulti-stage Dockerfile — copy a sample to start.
  3. DevPublishPush the image to Nexus, or side-load with docker save / load.
  4. PlatformDeclareAdd apps/<app>.yml + put secrets in the vault.
  5. PlatformDeployRun the apps playbook — HTTPS, routing & homepage are automatic.
Dev app developer — owns the app & image (its own XD_Commons repo) Platform platform manager — owns the IaC repo & the server

Full contract & field reference: util/skills/prjaas-webapp-onboarding/SKILL.md

🧠 Onboarding skill for OpenCode. The full container contract & field reference ships as a portable SKILL.mddownload it from the homepage. Install: save it to ~/.config/opencode/skills/prjaas-webapp-onboarding/SKILL.md (or .opencode/skills/… in your repo), then restart OpenCode.
The toolchain behind it

Development support tools

Two internal servers provide everything the teams need to plan, build, scan and ship — all on our own infrastructure.

Azure DevOps Server

Planning & source control. Jira-like work tracking (boards, backlogs, sprints) and the Git repositories — the shared XD_Commons project.

boards · repos · pull requests

XDCommonsrv

Build, quality & artifacts. Jenkins CI/CD pipelines, SonarQube code-quality analysis, and a Nexus repository with the Docker artifacts registry enabled.

Jenkins · SonarQube · Nexus (Docker)
Your move

Have an app?
Let's host it.

Bring a container that meets the contract — any stack — and we onboard it in minutes. Copy a sample, write one YAML file, ship it.

Everything lives in Azure DevOps — XD_Commons: dev.azure.com/GfiPortugalDev/XD_Commons

Inetum Portal PRJAAS