# Aura CRM Platform A self-hosted CRM for repair shops / service centers — order tracking (Kanban), clients, cartridge refill batches, inventory, payroll, loyalty, cash register, client notifications (Telegram/MAX/VK/SMS), PDF documents (invoice/act/receipt), and more. Two services, one platform: - **`core/`** — authentication, staff, roles, module registry. No CRM logic of its own; it exists so multiple business apps (`production/` is the first one) can share one login and one staff/roles system. - **`production/`** — the CRM itself (Go+Fiber backend, React+Vite frontend). Has no login of its own — it verifies JWTs `core` issues. ## Install Requires Docker and the `docker compose` v2 plugin. ```bash git clone aura-crm cd aura-crm ./install.sh ``` The script will: 1. Ask for your admin account (name/email/password) and business name. 2. Generate every secret involved (JWT signing key, database passwords, MinIO keys, the module token `core` and `production` use to authenticate to each other) — you never type or invent a secret by hand. 3. Start `core`, wait for it to come up, and let it bootstrap your admin account automatically. 4. Register `production` as a module against `core`'s API, capturing the token that lets the two services talk to each other. 5. Start `production` with everything already wired in. Re-running `./install.sh` after a successful install is safe — it detects existing `.env` files and skips straight to `docker compose up` for both services (useful after a reboot, or to pick up a rebuild). When it's done, the CRM is at `http://localhost:18092`, logged in as the account you just created. See the script's own "Going public" note at the end for what to change if you want a real domain in front of it. ## What's optional Everything in `production/.env.example` beyond the required Postgres/MinIO/JWT/core-registration block is an optional integration — AI-assisted intake (Gemini), Telegram/MAX/VK/SMS client notifications, IMEI lookup, self-hosted Telegram Bot API, wholesale supplier scraping, and `deploy-agent`'s self-update button. Each one fails soft (disabled, not crash) when its env vars are unset — turn on only what you need, whenever you need it, from the app's own Settings page after install (most of these are editable there without touching `.env` again). ## License MIT — see `LICENSE` in each service directory.