Skip to main content

Server Architecture for IT Departments

One-page overview for infrastructure teams evaluating or hosting ODE (Synkronus).

Current ODE release: v1.1.1 · Reference stack: synkronus-quickstart

Summary

ODE field collection runs on mobile devices (Formulus). The only server component ODE delivers is Synkronus (an OCI container image). Study-specific applications (for example AnthroCollect) are app bundles—forms plus a small web UI—stored on and served by Synkronus. IT hosts Synkronus, PostgreSQL, and a TLS reverse proxy.

Data classification and compliance (IRB, institutional policies, audit programs) are the host organization's responsibility. This page describes infrastructure only.

What ODE provides vs what the project provides

DeliverableProvided byRuns on
Synkronus server image (ghcr.io/opendataensemble/synkronus)ODEYour server
Embedded admin Portal (/portal)ODE (inside Synkronus)Your server
Formulus mobile appODEField tablets/phones
PostgreSQLStandard image (you operate)Your server
TLS reverse proxyYour choice (Caddy in quickstart; Nginx, Apache, cloud LB, etc.)Your server
Custom app + forms (e.g. AnthroCollect)Project teamUploaded to Synkronus; synced to devices

Logical architecture (end-to-end)

Logical architecture: field devices, Synkronus, and PostgreSQL

Traffic: Field devices sync over HTTPS to the Synkronus REST API. Devices do not connect directly to PostgreSQL. The custom app UI runs inside a Formulus WebView and uses the same API through the Formulus bridge.

Installation view (server stack)

Installation view: reverse proxy, Synkronus container, PostgreSQL, and volumes

Reference layout from synkronus-quickstart:

Container / roleImagePurpose
Reverse proxyCaddy 2 (quickstart) or IT-standard proxyTLS termination, forward to Synkronus
synkronusghcr.io/opendataensemble/synkronus:v1.1.1API, sync, auth, app-bundle hosting, Portal
dbpostgres:17 (quickstart)Observations, users, metadata

Common deployment variants

  1. Colocated proxy — Caddy or Nginx on the same VM as Synkronus (quickstart / typical self-hosted pattern).
  2. Institutional edge — Your load balancer or reverse proxy terminates TLS; Synkronus runs on a private network only.

PostgreSQL: container vs managed

PatternWhen to useConnection notes
A — Container (quickstart default)Pilot, single VMsslmode=disable on the internal Docker/Podman network is normal
B — Managed DB (RDS, Azure, institutional service)Enterprise productionUse sslmode=require in DB_CONNECTION; Synkronus still stores attachments on appdata

Persistent data (operator responsibility):

VolumeContents
pgdataPostgreSQL database
appdataSynkronus /app/data: app bundles, attachment blobs

Backup scripts in the quickstart repo: utilities/backup-db.sh, utilities/backup-attachments.sh.

Security model

ConcernResponsibility
TLS in transitReverse proxy (required in production); TLS 1.2+
Encryption at restHost platform (disk/volume encryption, managed DB encryption)—ODE does not add a separate at-rest encryption layer inside containers
AuthenticationJWT (Synkronus); roles read-only, read-write, admin
SecretsJWT_SECRET, DB passwords, admin credentials — env vars or secret store
Network exposurePublic: proxy ports 443 (and 80 for ACME if used). Synkronus and Postgres not public
Rate limitingNot built into Synkronus — configure at proxy/WAF
High availabilitySingle-node quickstart is typical; HA is an IT design choice

See Security reference for the full checklist.

Field devices (brief)

LayerFormulus behaviorOperator responsibility
CredentialsStored in iOS Keychain / Android KeystorePer-user Synkronus accounts; revoke on offboarding
Observation dataSQLite (WatermelonDB) in app private sandboxClassify per study policy
Photos / attachmentsApp-private storage under the app sandboxSame
Device encryptionRelies on OS full-disk encryption when device is lockedRecommend device passcode/biometric via policy or MDM
Android backupallowBackup="false"MDM remote wipe for lost devices
Network (iOS)App Transport Security requires HTTPSServe Synkronus over HTTPS
Network (Android)HTTP allowed with a user-visible warningEnforce HTTPS in server URL policy

Synkronus does not provide certificate pinning. Institutional TLS inspection is possible if your CA is trusted on devices.

Distributing Formulus to field tablets

MethodNotes for IT
Obtainium (recommended)Installs/updates from GitHub Releases (OpenDataEnsemble/ode); may require allowing install from unknown sources for the installer
F-DroidDirect install of Formulus
MDMInstitutions may sideload the APK via MDM — package org.opendataensemble.formulus

Details: Installing Formulus.

Sizing (starting point)

ScaleSuggested starting point
Pilot / small study2 vCPU, 4 GB RAM, 40+ GB disk (attachments grow with photos)
ProductionTested backups; monitor appdata growth; pin image tags

Synkronus limits attachment uploads to 32 MB per file. Configure your reverse proxy body size limit to at least 32 MB.

Reference deployment pattern

Typical self-hosted pattern (e.g. research institutions running custom apps like AnthroCollect):

  1. Linux VM or cloud instance running Podman/Docker Compose
  2. synkronus-quickstart installer → Caddy + Synkronus + Postgres
  3. DNS points to server; TLS via Let's Encrypt or institutional certificates on your proxy
  4. Project team uploads the app bundle via Portal or synk CLI
  5. Field tablets install Formulus v1.1.1 via Obtainium or F-Droid; configure server URL in app settings

Coordinate Formulus and Synkronus versions on upgrade—the mobile app checks server compatibility and may refuse sync on mismatch.

Operator checklist

  • Hardened reverse proxy with TLS (TLS 1.2+)
  • Pin Synkronus image tag (e.g. v1.1.1) rather than :latest in production
  • Proxy upload limit ≥ 32 MB per attachment
  • Automated Postgres backups + tested restore
  • Backup appdata volume (attachments + bundles)
  • Volume/disk encryption at platform level
  • Firewall: public access only to proxy; database not public
  • Rate limiting on auth endpoints (proxy/WAF)
  • Device passcode/biometric policy for field tablets
  • Document who operates exports and admin Portal access

Further reading