Skip to content
docs.
WORKSPACE

Your documentation

Explore the project catalog
Localzet ServerАсинхронный PHP-серверTriangleФреймворк и компонентыMIX IDИдентификация и интеграцииHack APIПубличные API хакатонаACNПроект и компонентыUserlay / UserNetПроект и компонентыAxiomПроект и компонентыМесседжинг через почтуПроект и компонентыLWT / JWT / JOSEПроект и компонентыФинансовая аналитика KimaiПроект и компоненты✓Мультипарадигмальная БДПроект и компонентыZorin PlatformПроект и компонентыZorin TrustПроект и компонентыFloraScope / VegwatchПроект и компонентыaegis-qДокументация проектаaevumdbДокументация проектаauditДокументация проектаauto-invest-managerАвтотрейдерcaine-companionДокументация проектаcertbot-cloudflareДокументация проектаClusterLocalzet Server / ClustercmdveilДокументация проектаConsolePHP CLICronБиблиотеки Localzet Serverdata-connectorДокументация проектаdevice-controlDevice Controlenn-projectДокументация проектаEventsБиблиотеки Localzet ServerflowsintДокументация проектаforgeДокументация проектаHttpClientБиблиотеки Localzet ServerinterpreterСобственный языкinvariaДокументация проектаkeynotesДокументация проектаknotrouteKnotroutelaravel-personal-analyticsДокументация проектаlocalzet-osДокументация проектаmeridianДокументация проектаMQTTБиблиотеки Localzet Servernano-kernelСобственная ОСNoterДокументация проектаpersonal-analyticsДокументация проектаProxyБиблиотеки Localzet ServerPSRБиблиотеки Localzet ServerPSR-7Библиотеки Localzet Serverrschs-monitorДокументация проектаsemsealДокументация проектаshardsealДокументация проектаSocketIOБиблиотеки Localzet ServerSOCKS5Библиотеки Localzet Serverstandalone-analyticsДокументация проектаstatic-php-cliДокументация проектаStorageБиблиотеки Localzet ServersutureДокументация проектаtempoweaveДокументация проектаttsСинтез речиTunnelБиблиотеки Localzet Serverui-kitUI KitvesperДокументация проектаWebAnalyzerWebAnalyzerzorin-access-brokerДокументация проектаzorin-authority-brokerДокументация проектаzorin-authority-sdk-phpДокументация проектаzorin-authority-sdk-pythonДокументация проектаzorin-authority-sdk-tsДокументация проектаzorin-client-intelДокументация проектаzorin-device-core-aospДокументация проектаzorin-host-agentДокументация проектаzorin-native-labДокументация проектаzorin-nodeДокументация проектаzorin-opsДокументация проектаdonstu-python-sdkДокументация проектаfloortraceFloortraceserver-rsLocalzet Server / Cluster
Catalog
Documentation/Финансовая аналитика Kimai

kimai-sync

A NestJS-based application that synchronizes time tracking data from Kimai to PostgreSQL and Notion with project-specific templates.

  • Bi-directional Sync: Synchronize Kimai time entries to PostgreSQL and Notion
  • Scheduled Sync: Automatic sync of current week data every 5 minutes
  • Full History Sync: On-demand sync of last 3 years of Kimai data
  • Job Queue Management: BullMQ-powered job processing with automatic retries
  • RESTful API: Endpoints to trigger manual sync operations
  • Docker Support: Complete Docker and Docker Compose setup
  • Prisma ORM: Type-safe database access with migrations
  • NestJS 10.x - Node.js framework for scalable applications
  • Prisma - Type-safe ORM with migrations
  • BullMQ - Redis-backed job queue
  • node-cron - Task scheduling
  • Axios - HTTP client for API calls
  • PostgreSQL - Primary database
  • Redis - Job queue and caching backend
  • Docker - Containerization and orchestration
  • Node.js 20+ or Docker
  • npm or yarn
  • PostgreSQL 14+ (or use Docker Compose)
  • Redis 7+ (or use Docker Compose)
src/├── modules/│ ├── kimai/ # Kimai API client│ ├── sync/ # Core sync orchestration│ ├── jobs/ # BullMQ job handlers│ ├── notion/ # Notion API integration│ └── database/ # Prisma integration├── config/│ ├── kimai.config.ts│ ├── notion.config.ts│ └── database.config.ts├── types/ # TypeScript interfaces└── app.module.ts
SVG ↗
Окно терминала
git clone <repository-url>
cd kimai-sync
Окно терминала
npm install

Copy .env.example to .env and configure:

Окно терминала
cp .env.example .env

Update the following variables:

Окно терминала
# Database
DB_HOST=localhost
DB_PORT=5432
DB_USER=kimai_user
DB_PASSWORD=your_password
DB_NAME=kimai_sync
# Redis
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=your_redis_password
# Kimai
KIMAI_URL=https://your-kimai-instance.com
KIMAI_API_KEY=your_api_key
# Notion
NOTION_API_KEY=your_notion_api_key
NOTION_DATABASE_ID=your_database_id
# Sync
SYNC_INTERVAL=5 # minutes

Ensure PostgreSQL and Redis are running on your local machine or use Docker:

Окно терминала
# Start PostgreSQL and Redis using Docker
docker-compose up -d postgres redis
Окно терминала
# Generate Prisma client
npm run prisma:generate
# Run migrations
npm run prisma:migrate
Окно терминала
# Development mode with watch
npm run start:dev
# Production mode
npm run build
npm start

The application will start on http://localhost:3000

Complete setup with PostgreSQL, Redis, and the application:

Окно терминала
# Build and start all services
docker-compose up -d
# View logs
docker-compose logs -f app
# Stop services
docker-compose down

The application will be available at http://localhost:3000

Development:

Окно терминала
NODE_ENV=development npm run start:dev

Production:

Окно терминала
NODE_ENV=production npm run build && npm start
Окно терминала
GET /health

Returns application health status.

Окно терминала
POST /sync/full

Response:

{
"jobId": "123",
"status": "queued"
}
Окно терминала
POST /sync/weekly

Response:

{
"jobId": "124",
"status": "queued"
}
Окно терминала
npm run prisma:migrate -- --name migration_name
Окно терминала
# Development
npm run prisma:migrate
# Production
npm run prisma:migrate:prod
Окно терминала
npm run prisma:studio

Opens interactive database viewer at http://localhost:5555

Окно терминала
# All tests
npm test
# Watch mode
npm test:watch
# Coverage report
npm test:cov
# End-to-end tests
npm run test:e2e

Tests should follow:

  • Unit tests: *.spec.ts alongside source files
  • E2E tests: test/ directory
  • Coverage: coverage/ directory (generated)
Окно терминала
npm run format
Окно терминала
npm run lint

The application automatically triggers weekly sync every 5 minutes via node-cron.

Schedule: */5 * * * * (Every 5 minutes)

Configure via SYNC_INTERVAL environment variable.

Jobs are processed by BullMQ with Redis backend:

  • Retry Policy: 3 automatic retries with exponential backoff
  • Timeout: 5 minutes per job
  • Concurrency: 3 concurrent jobs
  • Cleanup: Completed jobs removed after 1 hour

Application logs are sent to stdout with configurable levels:

Окно терминала
LOG_LEVEL=log # Options: log, error, warn, debug, verbose
  • Indexes on frequently queried fields
  • Connection pooling via Prisma
  • Batch upsert operations
  • Pagination for Kimai API calls
  • Request timeout configuration
  • Retry with exponential backoff
  • Batch job processing
  • Job prioritization
  • Dead-letter queue handling
Окно терминала
# Check PostgreSQL
docker-compose logs postgres
# Verify connection string
echo $DATABASE_URL
Окно терминала
# Check Redis
docker-compose logs redis
# Test connection
redis-cli -h localhost -p 6379 -a your_password ping
Окно терминала
# Check BullMQ dashboard (if configured)
# Or review application logs
docker-compose logs -f app
  • Verify NOTION_API_KEY is correct
  • Confirm NOTION_DATABASE_ID is valid
  • Check API key has proper permissions
  • Verify KIMAI_API_KEY and KIMAI_URL are correct
  • Check Kimai instance is accessible
  • Confirm API key has necessary scopes
  1. Install NestJS extension
  2. Install TypeScript support
  3. Configure debugger in .vscode/launch.json
Окно терминала
npm run start:debug

Then attach your debugger to port 9229.

  1. Create feature branch: git checkout -b feature/your-feature
  2. Commit changes: git commit -am 'Add feature'
  3. Push branch: git push origin feature/your-feature
  4. Create Pull Request

See .env.example for complete list with descriptions.

Key variables:

  • NODE_ENV: Application environment
  • DATABASE_URL: PostgreSQL connection string
  • REDIS_URL: Redis connection string
  • KIMAI_URL, KIMAI_API_KEY: Kimai API credentials
  • NOTION_API_KEY, NOTION_DATABASE_ID: Notion configuration
  • SYNC_INTERVAL: Scheduled sync interval in minutes

MIT

For issues and questions:

  1. Check existing GitHub issues
  2. Create detailed bug report with logs
  3. Enable debug logging: LOG_LEVEL=debug

Source · AGPL-3.0