cenit-io/cenit
:rocket: Cenit IO - 100% open source integration Platform (iPaaS)
Cenit
Cenit is an open-source integration-platform-as-a-service (iPaaS). It helps teams design integrations, orchestrate data flows, expose APIs, and manage data pipelines across external systems.
- Cloud: web.cenit.io
- Product documentation: docs.cenit.io
Table of contents
- What you can build
- Architecture and stack
- Project status
- Quick start (local Docker Compose)
- Configuration
- Testing and quality checks
- Git hooks (pre-push E2E)
- Troubleshooting
- Contributing
- Security
- Code of conduct
- License
What you can build
- Backendless data APIs from JSON Schema-based Data Types.
- Integration flows for routing, orchestration, and automation.
- Data transformation pipelines across JSON, XML, ASN, EDIFACT, X12, UBL, and more.
- API and integration connectors for third-party services.
- Event- and schedule-driven integration workloads.
Architecture and stack
Core runtime:
- Ruby (Rails + Unicorn)
- MongoDB
- Redis
- RabbitMQ
Default local ports:
- Backend:
http://localhost:3000 - UI:
http://localhost:3002 - RabbitMQ management:
http://localhost:15672
Related repository:
- UI repository: cenit-io/ui
Project status
The repository is actively maintained. Current local migration baseline in this branch/repo:
- Ruby
3.2.2 - MongoDB
7.0 - Docker Compose local runtime
Additional migration context is documented in upgrading_notes.md.
Quick start (local Docker Compose)
Prerequisites
- Docker Desktop (or Docker Engine + Compose v2 plugin)
git- UI repository checked out as a sibling directory at
../ui(or setCENIT_UI_CONTEXT)
1) Clone repositories
# backend
git clone git@github.com:cenit-io/cenit.git
# UI (sibling directory required by default compose config)
git clone git@github.com:cenit-io/ui.git ../uiIf your UI checkout lives elsewhere:
export CENIT_UI_CONTEXT=/absolute/path/to/ui2) Start the stack
cd /path/to/cenit
scripts/compose-dev.sh up -d
scripts/compose-dev.sh psThis uses:
docker-compose.ymlas shared basedocker-compose.dev.ymlas development overrides (build+ local branch code)
2.1) Fast UI development mode (live reload from sibling ../ui)
Use this when iterating on UI code to avoid rebuilding the nginx UI image:
cd /path/to/cenit
scripts/compose-dev.sh --profile dev up -d mongo_server redis rabbitmq server ui_dev
scripts/compose-dev.sh --profile dev psNotes:
ui_devserves Vite onhttp://localhost:3002with source mounted from${CENIT_UI_CONTEXT:-../ui}.- Keep
ui(nginx image service) for production-like checks and CI parity.
2.2) Image-only (prod-like) mode
cd /path/to/cenit
scripts/compose-prod.sh up -d
scripts/compose-prod.sh psThis uses:
docker-compose.yml+docker-compose.prod.yml- published images from GHCR (
pull_policydefaults tomissing)
GHCR tag policy (from publish workflows):
masterbranch ->ghcr.io/cenit-io/cenit:latestandghcr.io/cenit-io/ui:latestdevelopbranch ->ghcr.io/cenit-io/cenit:developandghcr.io/cenit-io/ui:develop- release tags
v*.*.*-> semver tags - every publish -> immutable
sha-<gitsha>tag
Run prod-like using develop images:
CENIT_SERVER_IMAGE=ghcr.io/cenit-io/cenit:develop \
CENIT_UI_IMAGE=ghcr.io/cenit-io/ui:develop \
scripts/compose-prod.sh up -dRun prod-like pinned to immutable SHA tags:
CENIT_SERVER_IMAGE=ghcr.io/cenit-io/cenit:sha-<server_sha> \
CENIT_UI_IMAGE=ghcr.io/cenit-io/ui:sha-<ui_sha> \
scripts/compose-prod.sh up -dFor strict refresh from registry each run:
CENIT_PULL_POLICY=always scripts/compose-prod.sh up -d2.3) Repro mode with non-default host ports (redirect/debug)
Use this to reproduce host/port redirect issues (for example, verify UI does not fall back to localhost:3000).
cd /path/to/cenit
REPRO_SERVER_PORT=13000 REPRO_UI_PORT=13002 scripts/compose-repro.sh up -d
REPRO_SERVER_PORT=13000 REPRO_UI_PORT=13002 scripts/smoke/repro_runtime_ports.shDefault repro port mapping:
- Backend host port:
13000 -> container 8080 - UI host port:
13002 -> container 80
Optional public URL overrides (if not using localhost):
REPRO_SERVER_PUBLIC_URL=http://127.0.0.1:13000 \
REPRO_UI_PUBLIC_URL=http://127.0.0.1:13002 \
scripts/smoke/repro_runtime_ports.sh3) Verify services
curl -I http://localhost:3000
curl -I http://localhost:3002On first bootstrap (fresh database), default admin credentials:
- Email:
support@cenit.io - Password:
password
RabbitMQ default credentials:
- User:
cenit_rabbit - Password:
cenit_rabbit - VHost:
cenit_rabbit_vhost
Common local operations
# Follow backend logs
scripts/compose-dev.sh logs -f server
# Restart backend only
scripts/compose-dev.sh restart server
# Stop all services
scripts/compose-dev.sh down
# Full reset (containers + volumes)
scripts/compose-dev.sh down -v --remove-orphansConfiguration
Important environment knobs used by local scripts:
CENIT_SERVER_URL(defaulthttp://localhost:3000)CENIT_UI_URL(defaulthttp://localhost:3002)CENIT_UI_CONTEXT(path to UI repository for Docker build)CENIT_SERVER_IMAGE(prod-like server image tag, defaultghcr.io/cenit-io/cenit:latest)CENIT_UI_IMAGE(prod-like UI image tag, defaultghcr.io/cenit-io/ui:latest)CENIT_PULL_POLICY(prod-like pull policy, defaultmissing; usealwaysfor strict pulls)CENIT_COMPOSE_FILES(default:docker-compose.yml:docker-compose.dev.yml)CENIT_COMPOSE_FILE(legacy single-file override, still supported)CENIT_BASE_COMPOSE_FILE(helper override for base file)CENIT_DEV_COMPOSE_FILE(helper override for dev file)CENIT_PROD_COMPOSE_FILE(helper override for prod-like file)CENIT_REPRO_COMPOSE_FILE(helper override for repro file)CENIT_E2E_AUTOSTART(1to auto-start stack in E2E scripts)CENIT_E2E_RESET_STACK(1to reset containers/volumes before E2E)CENIT_E2E_BUILD_STACK(1to rebuild images before E2E, default0)CENIT_E2E_HEADED(1for headed browser runs)
Image labels:
- GHCR images are published with OCI metadata labels (source/revision/created) via
docker/metadata-action.
Testing and quality checks
Login E2E smoke
scripts/e2e/cenit_ui_login.shBrowser smoke: no localhost redirect during auth bootstrap
# Default URL
scripts/smoke/cenit_ui_no_localhost_redirect.sh
# Repro stack URL
CENIT_UI_URL=http://localhost:13002 scripts/smoke/cenit_ui_no_localhost_redirect.shThis smoke fails if any browser request hits http://localhost:3000 during initial auth flow.
Pre-apply repro gate (runtime + browser checks)
REPRO_SERVER_PORT=13000 REPRO_UI_PORT=13002 scripts/smoke/repro_preapply_gate.shUse this as the required gate before Terraform apply or other deploy steps when validating the localhost redirect fix path.
Contact data type + records E2E
scripts/e2e/cenit_ui_contact_flow.shDriver note:
CENIT_E2E_DRIVER=pwclimay hit parser/runtime limits on largerun-codepayloads.- The contact-flow runner automatically falls back to the node-playwright driver when this is detected.
Useful overrides:
# Reuse already-running stack (skip deterministic reset)
CENIT_E2E_AUTOSTART=0 scripts/e2e/cenit_ui_contact_flow.sh
# Deterministic default (clean DB each run, no image rebuild)
CENIT_E2E_RESET_STACK=1 CENIT_E2E_BUILD_STACK=0 scripts/e2e/cenit_ui_contact_flow.sh
# Run headed
CENIT_E2E_HEADED=1 scripts/e2e/cenit_ui_contact_flow.sh
# Slower machines
CENIT_E2E_SERVER_READY_RETRIES=240 \
CENIT_E2E_UI_READY_RETRIES=180 \
scripts/e2e/cenit_ui_contact_flow.shUI user journey E2E
scripts/e2e/cenit_ui_user_journey.shFlow execution + RabbitMQ smoke
scripts/e2e/cenit_flow_execution_smoke.shArtifacts are written under output/playwright/.
Git hooks (pre-push E2E)
Install hooks:
npm install
npm run prepareCurrent pre-push behavior:
- Runs
scripts/e2e/cenit_ui_contact_flow.sh - Uses fresh stack defaults:
CENIT_E2E_RESET_STACK=1CENIT_E2E_BUILD_STACK=0CENIT_E2E_CLEANUP=0(cleanup disabled for hook stability)
Overrides:
# Reuse running stack
CENIT_E2E_AUTOSTART=0 git push
# Keep current volumes/state
CENIT_E2E_RESET_STACK=0 git push
# Skip image rebuild
CENIT_E2E_BUILD_STACK=0 git push
# Force cleanup phase
CENIT_E2E_CLEANUP=1 git push
# Skip hooks once
HUSKY=0 git pushTroubleshooting
Backend does not become reachable on :3000
scripts/compose-dev.sh ps -a
scripts/compose-dev.sh logs --no-color --tail=200 serverIf needed, run a full reset and rebuild:
scripts/compose-dev.sh down -v --remove-orphans
scripts/compose-dev.sh up -d --buildE2E instability after many local runs
Use a clean boot:
CENIT_E2E_RESET_STACK=1 \
CENIT_E2E_BUILD_STACK=0 \
scripts/e2e/cenit_ui_contact_flow.shContributing
Contributions are welcome and appreciated.
- Contribution guide: .github/CONTRIBUTING.md
- Open an issue: github.com/cenit-io/cenit/issues
- Open a pull request: github.com/cenit-io/cenit/pulls
Before opening a PR:
- Reproduce and describe the problem clearly.
- Include tests or reproducible validation steps.
- Keep scope focused and documented.
Security
Please do not report security vulnerabilities in public issues.
- Use GitHub Security Advisories: Report a vulnerability
Code of conduct
This project follows the code of conduct in CODE_OF_CONDUCT.md.
License
Distributed under the terms in LICENSE.



