Sign inSign up

vhristo/eurocrm

By vhristo

•Updated about 1 month ago

Self-hosted CRM for European SMBs — pipeline, contacts, deals, leads, campaigns, REST API

Image
0

84

vhristo/eurocrm repository overview

⁠EuroCRM

A self-hosted CRM for European SMBs and small sales teams. Pipeline management, contacts, deals, a lead inbox, activity logging, email campaigns, and reporting — in one container, with your data in your own database.

www.eurocrm.org⁠ · Source on GitHub⁠ · MIT licence


⁠Quick start

EuroCRM needs a MongoDB 7 database. The fastest way to try it:

# docker-compose.yml
services:
  app:
    image: vhristo/eurocrm:0.2.1
    ports:
      - "3000:3000"
    environment:
      MONGODB_URI: mongodb://admin:changeme@mongo:27017/eurocrm?authSource=admin
      JWT_SECRET: replace-with-at-least-32-random-characters
      JWT_REFRESH_SECRET: replace-with-a-different-32-plus-characters
      ENCRYPTION_KEY: exactly-32-characters-long-here!
      NEXT_PUBLIC_APP_URL: http://localhost:3000
    depends_on:
      - mongo

  mongo:
    image: mongo:7
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: changeme
    volumes:
      - mongo-data:/data/db

volumes:
  mongo-data:
docker compose up -d

Open http://localhost:3000⁠, register, and you have a working CRM. Registration creates your account and your first company, seeded with a default sales pipeline.

Generate the secrets rather than typing them:

openssl rand -hex 32   # JWT_SECRET, JWT_REFRESH_SECRET
openssl rand -hex 16   # ENCRYPTION_KEY (must be exactly 32 characters)

⁠Configuration

Required

VariableNotes
MONGODB_URIMongoDB 7 connection string
JWT_SECRET32+ characters, used to sign access tokens
JWT_REFRESH_SECRET32+ characters, different from the above
ENCRYPTION_KEYExactly 32 characters; encrypts stored SMTP credentials
NEXT_PUBLIC_APP_URLPublic base URL — used in email links and form embed codes

Optional

VariableDefault
JWT_ACCESS_EXPIRY15m
JWT_REFRESH_EXPIRY7d
NEXT_PUBLIC_APP_NAMEEuroCRM
PORT3000

The app listens on port 3000. It holds no state on disk — everything lives in MongoDB, so the container can be replaced freely.


⁠What it does

  • Pipeline — Kanban board with drag-and-drop deals, configurable stages, win probability, and rotting alerts for deals that go quiet
  • Contacts, deals, leads, activities — the CRM core, with search, custom fields, tags and owner assignment
  • Multiple companies — one login can hold several organisations and switch between them; each keeps its own data entirely separate
  • Email — SMTP sending with open and click tracking, plus bulk campaigns with merge tags and send statistics
  • Web forms — embeddable public forms that create leads on submission
  • Automations — trigger/action workflows on deal, contact and form events
  • Reports — pipeline summary, revenue forecast, sales leaderboard, dashboard KPIs
  • REST API and webhooks — API-key authenticated v1 API, plus HMAC-signed outbound webhooks
  • GDPR — per-contact data export and right-to-erasure
  • Roles — admin, manager and sales rep, applied per company

⁠Inside the image

  • Node 20 on Alpine, Next.js standalone build
  • Runs as a non-root user (nextjs, uid 1001)
  • dumb-init as PID 1, so signals and zombie processes are handled properly
  • No secrets or build tooling baked in

Architecture: linux/amd64 only. It runs on Apple Silicon and other arm64 hosts through emulation, with the performance cost that implies.


⁠Tags

Tag
0.2.1Current release
0.2.0Multiple companies per account
0.1.0First release

Pin a version in anything you care about rather than tracking a moving tag.


⁠Running it in production

Put a reverse proxy with TLS in front of it — the container speaks plain HTTP and sets Secure cookies only when NODE_ENV=production.

Do not publish MongoDB's port. Keep it on an internal Docker network reachable only by the app.

Registration is open by default, so anyone who can reach /register can create an account and their own company. If the instance is on the public internet and meant for you alone, block that path at the proxy once your account exists.


Tag summary

Content type

Image

Digest

sha256:7abad17b1…

Size

52.8 MB

Last updated

about 1 month ago

docker pull vhristo/eurocrm