Skip to main content

Deployment

Infinity CI offers three deployment options — pick per scenario.

Option 1: run from source (dev / trial)

scripts\start-server.cmd :: Server (web http://127.0.0.1:5000, gRPC 5001)
scripts\start-agent.cmd :: Agent (issue an enroll token from the web first)

On bash, use the matching .sh scripts.

scripts\publish.cmd

Publishes a win-x64 self-contained single-file EXE into publish\. Build machines need no .NET runtime — copy one EXE and run. Ideal for distributing across multiple Windows build machines.

Option 3: Docker

docker compose up -d
  • Multi-stage build: node:22-alpine builds the frontend → dotnet/sdk:10 publishes the backend → aspnet:10 runtime (with git / tzdata / libldap);
  • Ports: 5000 (Web/SignalR), 5001 (Agent gRPC);
  • Volume: infinityci-data mounted at /app/data.

Useful environment variables:

VariablePurpose
TZTimezone for cron triggers (e.g. Asia/Shanghai)
PublicOriginPublic origin behind a reverse proxy / TLS terminator
SMTP variablesEnable the email notification channel

Data & backups

All state (the SQLite database, job config repos, logs, workspaces) lives under data/:

data/
├── infinityci.db # SQLite
└── {job}/ # config repo + logs + workspaces

Backup = copying the data/ directory (the data volume, when deployed via Docker). Migrating to a new machine = copy the directory and start — there is no hidden state.

Reverse proxy

The server is a standard ASP.NET Core Kestrel app and can sit behind Nginx / Caddy. Notes:

  • WebSockets (SignalR) require the proxy to forward Upgrade headers;
  • Set PublicOrigin to the externally visible origin.