Flexible and modular backend framework/server for object persistence, API development and authentication.
License: Apache-2.0. Built with: Java, HTML, Shell, Mustache, Dockerfile. Website: https://paraio.org. Source: https://github.com/erudika/para.
# run setup and set endpoint to either 'http://localhost:8080' or 'https://paraio.com' # the keys for the root app are inside application.conf $ para-cli setup $ para-cli new-app "myapp" --name "My App" ``` Alternatively, you can use the [Para Web Console](https://console.paraio.org) to manage data, or integrate Para directly into your project with one of the API clients below. ## Docker Tagged Docker images for Para are located at `erudikaltd/para` on Docker Hub. **It's highly recommended that you pull only release images like `:1.51.0` or `:latest_stable` because the `:latest` tag can be broken or unstable.** First, create an `application.conf` file and a `data` folder and start the Para container: ``` $ touch application.conf && mkdir data $ docker run -ti -p 8080:8080 --rm -v $(pwd)/data:/para/data \ -v $(pwd)/application.conf:/para/application.conf \ -e JAVA_OPTS="-Dconfig.file=/para/application.conf" erudikaltd/para:latest_stable ``` **Environment variables** `JAVA_OPTS` - Java system properties, defaults to `-Dloader.path=lib` **Plugins** You can create a custom Para container with all plugins and JDBC drivers you need by using `docker compose`. Below is an example build of Para, using `para-dao-sql`, `para-search-lucene` and PosgreSQL as a database. 1. First, create a new `Dockerfile-plugins` which does a multi-stage build like so: <ul><li> <details> <summary>View contents of <code>Dockerfile-plugins</code></summary> ```docker ARG PARA_VERSION="0.0.0" ARG SQL_DAO_VERSION="0.0.0" FROM erudikaltd/para:v${PARA_VERSION} AS base FROM erudikaltd/para-dao-sql:${SQL_DAO_VERSION} AS dao FROM erudikaltd/para-search-lucene:${SEARCH_VERSION} AS search FROM base AS final COPY --from=dao /para/lib/*.jar /para/lib COPY --from=search /para/lib/*.jar /para/lib # EXAMPLE: Add a PostgreSQL JDBC Driver ARG PG_JDBC_VERSION="0.0.0" ADD https://jdbc.postgresql.org/download/postgresql-${PG_JDBC_VERSION}.jar /para/lib/ ``` </details> </li></ul> 2. Then, create a `docker-compose.yml` file: <ul><li> <details> <summary>View contents of <code>docker-compose.yml</code></summary> ```yml services: para: depends_on: - db build: context: . dockerfile: Dockerfile args: PARA_VERSION: "1.51.0" SQL_DAO_VERSION: "1.49.1" PG_JDBC_VERSION: "42.7.7" image: para-with-plugins pull_policy: never ports: - "8080:8080" volumes: - type: volume source: paraData target: /para/data - type: volume source: paraLib target: /para/lib - type: bind source: ./para-application.conf target: /para/application.conf restart: always environment: - JAVA_OPTS=-Dconfig.file=/para/application.conf -Dloader.path=/para/lib db: image: postgres:latest ports: - "5432:5432" volumes: - type: volume source: postgresData target: /var/lib/postgresql/data restart: always environment: - POSTGRES_PASSWORD=mysecretpassword - PGDATA=/var/lib/postgresql/data volumes: paraData: paraLib: postgresData:
Self-hosting gives you three things SaaS can’t: data ownership (the files live on disks you control), cost predictability (a one-time setup vs. recurring per-seat fees that grow with your household or team), and longevity (open-source means the app keeps working even if the maintainers move on, since you can pin a working version). The trade-off is that you take on the operational work of running a server, applying updates, and handling backups.
Most self-hosted apps run comfortably on modest hardware — a Raspberry Pi 4, a mini PC, a NAS with Docker support, or a small VPS is usually enough for personal or family use. CPU and RAM requirements scale with how many simultaneous users or how much data you push through Para. Storage requirements depend on the kind of data you keep; check the README for guidance on data retention.
Last verified: 2026-05-01