2026-02-09 18:00:42 -08:00
2026-02-13 18:48:13 -08:00
2026-02-09 16:00:49 -08:00
2026-02-13 18:47:57 -08:00
2026-02-13 18:47:57 -08:00

Qortal Nextcloud Integration

This repository bootstraps a local development setup for integrating Qortal identity/auth flows with Nextcloud.

Current scope

  1. Local Nextcloud development stack via Docker Compose.
  2. A TypeScript broker service for:
    • Nextcloud provisioning bridge (create/link users).
    • OIDC authorization-code flow (/authorize, /token, /userinfo, /jwks).
  3. Nextcloud app for:
    • admin setup + onboarding workflows,
    • user selfservice wallet import/linking,
    • QApps gateway proxy + embedded launcher,
    • Qortal Account dashboard (live auth validation).
  4. Initial architecture and phased implementation notes.

Repo layout

  • docker-compose.yml: MySQL/MariaDB local stack.
  • docker-compose.postgres.yml: PostgreSQL local stack.
  • .env.example: environment variables for local stack.
  • .env.postgres.example: environment variables for PostgreSQL stack.
  • Makefile: helper commands for startup and Nextcloud occ tasks.
  • docs/concept.md: phase plan, contracts, and milestones.
  • docs/external-auth-integration.md: Qortal External Auth hookup and commands.
  • docs/master-goals.md: full goals, architecture boundaries, and delivery phases.
  • docs/nextcloud-admin-app.md: usage for the custom Nextcloud admin app.
  • docs/nextcloud-app-roadmap.md: roadmap for the custom Nextcloud app.
  • docs/nextcloud-oidc-setup.md: working user_oidc configuration + policy notes.
  • docs/nextcloud-vm-setup.md: production-style setup for Nextcloud VM.
  • docs/devprod-ssl.md: HTTPS-enabled dev-prod Docker stack.
  • docs/features-list.md: full current feature inventory.
  • docs/settings-matrix.md: admin/personal settings behavior matrix.
  • docs/scripts-reference.md: script usage and recommended execution flows.
  • docs/testing-guide.md: end-to-end onboarding test paths and expected results.
  • nextcloud/custom_apps/qortal_integration: custom admin app for Qortal management inside Nextcloud.
  • nextcloud/html: bind-mounted Nextcloud web root for Docker stacks.
  • nextcloud/data: bind-mounted Nextcloud data directory for Docker stacks.
  • services/qortal-oidc-broker: Node/TypeScript broker + provisioning bridge starter.
  • external-auth/data: bind-mounted data for bundled External Auth container.
  • qortal/data: bind-mounted data for bundled Qortal node container.

Quickstart

  1. Run the guided dev setup:
    • ./start-dev.sh
  2. Follow logs until Nextcloud is installed:
    • make logs
  3. Open Nextcloud:
    • http://localhost:8080
  4. Install the OIDC app in Nextcloud:
    • make install-oidc
  5. Enable the Qortal integration app:
    • make occ cmd="app:enable qortal_integration"

Devprod (HTTPS) quickstart:

  1. Run guided devprod setup:
    • ./start-devprod.sh
  2. Rebuild/recreate after env changes:
    • ./recreate-devprod.sh
    • (this now disables/enables the app automatically)

Production-oriented Docker bootstrap:

  1. Run installer baseline:
    • ./scripts/install-production-docker.sh --mode nossl --with-external-auth
  2. Verify services:
    • docker compose -f docker-compose.devprod.nossl.yml --env-file .env.devprod ps

PostgreSQL option:

  1. (Optional) copy PG env file:
    • cp .env.postgres.example .env.postgres
  2. Start PostgreSQL stack:
    • make up-pg
  3. Stop PostgreSQL stack:
    • make down-pg

Useful commands

  • MySQL env behavior: Makefile uses .env if present, otherwise .env.example.
  • PostgreSQL env behavior: Makefile uses .env.postgres if present, otherwise .env.postgres.example.
  • Start: make up
  • Stop: make down
  • Logs: make logs
  • List services: make ps
  • Run Nextcloud occ: make occ cmd="app:list"
  • Start (PostgreSQL): make up-pg
  • Stop (PostgreSQL): make down-pg
  • Logs (PostgreSQL): make logs-pg
  • List services (PostgreSQL): make ps-pg
  • Run Nextcloud occ (PostgreSQL): make occ-pg cmd="app:list"
  • Broker logs: docker compose logs -f broker

Qortal External Auth hookup

The broker now supports authenticated calls to your External Auth API.

  1. Register an app in your external auth API (or reuse an existing app):
    • POST /apps/register
  2. Set these in .env (or .env.postgres):
    • BROKER_INTERNAL_API_TOKEN (required for broker internal APIs)
    • BROKER_CORS_ALLOWED_ORIGINS (recommended: your Nextcloud public URL)
    • QORTAL_EXTERNAL_AUTH_BASE_URL (for Docker Desktop: usually http://gateway.docker.internal:3191)
    • QORTAL_EXTERNAL_AUTH_APP_ID
    • QORTAL_EXTERNAL_AUTH_APP_SECRET
    • If your node requires API keys, also set:
      • QORTAL_AUTH_NODE_API_KEY
      • QORTAL_AUTH_NODE_API_KEY_MODE
      • QORTAL_AUTH_NODE_API_KEY_PATHS
  3. Restart broker:
    • make up

Useful broker endpoints:

  • GET /api/qortal/health (connectivity check)
  • GET /api/qortal/wallets (wallets accessible to configured app creds)
  • POST /api/qortal/wallets (create wallet via configured app creds)
  • GET /api/oidc/allowlist (list allowlisted Qortal addresses for auto-provision)
  • POST /api/oidc/allowlist (add allowlisted Qortal address)
  • POST /api/oidc/allowlist/remove (remove allowlisted Qortal address)
  • GET /api/oidc/invites (list invite tokens)
  • POST /api/oidc/invites (create invite token)
  • POST /api/oidc/invites/revoke (revoke invite token)
  • POST /api/provision/upsert-from-wallet (provision/link via walletId -> address0)
  • POST /api/provision/import-seed-link (import existing seed + link to Nextcloud user)
  • POST /api/provision/import-backup-link (import encrypted backup JSON + link to Nextcloud user)
  • POST /api/provision/unlink (remove mapping)
  • GET /api/provision/mappings/by-nextcloud/:nextcloudUserId (list mappings for one Nextcloud user)
  • GET /api/provision/mappings (list persisted mappings)

Internal API security:

  • Broker internal APIs under /api/qortal/*, /api/provision/*, and /api/oidc/* require BROKER_INTERNAL_API_TOKEN.
  • Nextcloud app sends this token automatically when configured via:
    • Env in app container: QORTAL_BROKER_INTERNAL_API_TOKEN (recommended for docker stacks), or
    • Nextcloud Admin setting: Broker Internal API Token.
  • In bundled devprod stacks, helper scripts auto-generate the token in .env.devprod.

Custom Nextcloud app:

  • Open Nextcloud Admin settings and go to Qortal Integration section.
  • Configure broker URL and test connectivity directly from Nextcloud UI.
  • Run setup actions from UI:
    • wallet create/list
    • mapping link/list
    • allowlist and invite management for guarded auto-provision
  • User self-service panel in Personal Settings:
    • import existing wallet by seed or backup JSON + link to current user
    • remove linked accounts
    • list linked accounts for current user
  • Qortal Account dashboard:
    • /apps/qortal_integration/account (live auth validation)
  • Q-Apps launcher:
    • /apps/qortal_integration/qapps (embedded gateway)

Broker persistence:

  • Broker mappings are now stored in PostgreSQL (identity_mapping table).
  • Configure via BROKER_DATABASE_URL and broker DB env vars in .env.

Bundled Qortal node

All compose stacks now include a qortal_node container by default:

  • Build context defaults to QORTAL_NODE_CONTEXT=../qortal
  • Node API is published to host via:
    • QORTAL_NODE_API_BIND_HOST / QORTAL_NODE_API_HOST_PORT (default 127.0.0.1:12391)
  • Node P2P is published to host via:
    • QORTAL_NODE_P2P_BIND_HOST / QORTAL_NODE_P2P_HOST_PORT (default 0.0.0.0:12392)
  • Node QDN data is published to host via:
    • QORTAL_NODE_QDN_BIND_HOST / QORTAL_NODE_QDN_HOST_PORT (default 0.0.0.0:12394)
  • External Auth defaults to use the internal node URL:
    • QORTAL_AUTH_NODE_URL=http://qortal_node:12391
    • QORTAL_AUTH_NODE_API_KEY (set this when the node requires X-API-KEY)
    • QORTAL_AUTH_NODE_API_KEY_MODE=paths
    • QORTAL_AUTH_NODE_API_KEY_PATHS=/ (send key header for all node API calls)
  • Default node settings template:
    • deploy/templates/qortal/default-node-settings.json
    • scripts/ensure-qortal-settings.sh initializes qortal/data/settings.json from this template when missing (never overwrites existing settings).
  • Default JVM start args:
    • scripts/ensure-qortal-start-args.sh initializes qortal/data/start-arguments.txt when missing.
    • Container startup reads that file on every restart, so you can tune memory without reinstall.
    • Default value: -XX:MaxRAMPercentage=25 -XX:+UseG1GC -Xss1024k
    • Optional env seed for first-run/empty file: QORTAL_JVM_MEMORY_ARGS

When using ./start-dev.sh, ./start-devprod.sh, or ./recreate-devprod.sh, the script auto-selects QORTAL_NODE_API_HOST_PORT in this order:

  1. 12391
  2. 22391, 32391, 42391, 52391
  3. 12291, 22291, 32291, 42291, 52291

Then it sets:

  • QORTAL_NODE_P2P_HOST_PORT to QORTAL_NODE_API_HOST_PORT + 1
  • QORTAL_NODE_QDN_HOST_PORT to QORTAL_NODE_API_HOST_PORT + 3

Qortal reverse proxy templates

Installer-ready templates for exposing a local node as both API/render and gateway:

  • deploy/templates/proxy/nginx-qortal-node.conf.template
  • deploy/templates/proxy/apache-qortal-node.conf.template
  • deploy/templates/proxy/README.md

Smoke test

Create/link a Nextcloud user from the broker:

curl -sS http://localhost:3000/api/provision/upsert \
  -H "X-Broker-Internal-Token: ${BROKER_INTERNAL_API_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "qortalAddress": "QTESTADDRESS1234567890ABCDEFG",
    "displayName": "Qortal Test",
    "email": "qortal-test@example.com"
  }'

Expected first-call behavior:

  • created: true with a new mapping created.
  • If Nextcloud user creation is needed, broker uses an internal random password that is never returned.

Expected repeated-call behavior:

  • created: false with same nextcloudUserId mapping.

Provision/link from wallet (uses Qortal External Auth):

curl -sS http://localhost:3000/api/provision/upsert-from-wallet \
  -H "X-Broker-Internal-Token: ${BROKER_INTERNAL_API_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "walletId": "YOUR_WALLET_ID",
    "displayName": "Qortal Wallet User",
    "email": "wallet-user@example.com"
  }'

Next step focus

  • Add admin onboarding campaign APIs + audit events.
  • Add Nextcloud app UI for mapping management and campaign triggering.
  • Add stricter signed-nonce verification once External Auth exposes a dedicated verify endpoint.
  • Add Q-App launch policy + signed launch token flow.
S
Description
A Qortal Nextcloud Integration Plugin leveraging Qortal-External-Auth to provide integrated Qortal Access to Nextcloud Servers
Readme 2.6 MiB
Languages
JavaScript 39.2%
PHP 29.7%
TypeScript 19.9%
Shell 5.8%
CSS 4.6%
Other 0.8%