|
|
6 ay önce | |
|---|---|---|
| common | 6 ay önce | |
| config | 6 ay önce | |
| database | 6 ay önce | |
| deploy | 6 ay önce | |
| proto | 6 ay önce | |
| systemd | 6 ay önce | |
| tests | 6 ay önce | |
| webserver | 6 ay önce | |
| webui | 6 ay önce | |
| .clang-format | 6 ay önce | |
| .clang-tidy | 6 ay önce | |
| .gitignore | 6 ay önce | |
| CMakeLists.txt | 6 ay önce | |
| CMakePresets.json | 6 ay önce | |
| README.md | 6 ay önce |
A flexible, schema-driven CRM foundation built with C++20 and React.
SmartBotic CRM consists of three main components:
Database Node: An in-memory document database with gRPC interface, supporting collections, JSON documents with metadata, relations, encryption, TTL, and persistent snapshots.
Web Server Node: A REST API server with WebSocket support that communicates with the database via gRPC, handling authentication (JWT + API keys), workspace/user management, and real-time updates.
Web UI: A React + TypeScript + Vite + TailwindCSS admin dashboard for managing workspaces, users, collections, and schema-defined views.
# Build tools
sudo apt install cmake ninja-build build-essential pkg-config
# libwebsockets
sudo apt install libwebsockets-dev
# Node.js (via nvm recommended)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
nvm install 18
npm install -g pnpm
# Clone the repository
git clone https://github.com/smartbotic/smartbotic-crm.git
cd smartbotic-crm
# Run setup script
./scripts/setup.sh
Open three terminal windows:
Terminal 1 - Database:
./scripts/run-db.sh
Terminal 2 - Webserver:
./scripts/run-server.sh
Terminal 3 - WebUI Development:
cd webui
pnpm dev
On first run, create the admin user:
curl -X POST http://localhost:18080/api/bootstrap \
-H "Content-Type: application/json" \
-d '{"email": "admin@example.com", "password": "your-password", "name": "Admin"}'
For persistent local testing, use systemd user services instead of terminal scripts.
Create the config directory:
mkdir -p ~/.config/systemd/user ~/.config/smartbotic-crm ~/.local/share/smartbotic-crm
Copy and customize the service files:
# Database service
cat > ~/.config/systemd/user/smartbotic-crm-database.service << 'EOF'
[Unit]
Description=SmartBotic CRM Database (Development)
[Service]
Type=simple
WorkingDirectory=/data/smartbotic-crm
ExecStart=/data/smartbotic-crm/build/database/smartbotic-crm-database --data-dir %h/.local/share/smartbotic-crm
Restart=on-failure
Environment="SMARTBOTIC_DB_PORT=50151"
[Install]
WantedBy=default.target
EOF
# Webserver service
cat > ~/.config/systemd/user/smartbotic-crm-webserver.service << 'EOF'
[Unit]
Description=SmartBotic CRM Webserver (Development)
After=smartbotic-crm-database.service
Requires=smartbotic-crm-database.service
[Service]
Type=simple
WorkingDirectory=/data/smartbotic-crm
ExecStart=/data/smartbotic-crm/build/webserver/smartbotic-crm-webserver
EnvironmentFile=%h/.config/smartbotic-crm/server.env
Restart=on-failure
[Install]
WantedBy=default.target
EOF
Create the config file:
cat > ~/.config/smartbotic-crm/server.env << 'EOF'
SMARTBOTIC_SERVER_JWT_SECRET=dev-testing-secret-change-in-production
SMARTBOTIC_SERVER_STATIC_PATH=/data/smartbotic-crm/webui/dist
EOF
Enable and start services:
systemctl --user daemon-reload
systemctl --user enable smartbotic-crm-database smartbotic-crm-webserver
systemctl --user start smartbotic-crm-database smartbotic-crm-webserver
Check status:
systemctl --user status smartbotic-crm-database smartbotic-crm-webserver
View logs:
journalctl --user -u smartbotic-crm-database -f
journalctl --user -u smartbotic-crm-webserver -f
~/.config/smartbotic-crm/~/.local/share/smartbotic-crm/journalctl --usersmartbotic-crm/
├── database/ # Database node (C++)
│ ├── include/ # Header files
│ └── src/ # Source files
├── webserver/ # Webserver node (C++)
│ ├── include/ # Header files
│ └── src/ # Source files
├── webui/ # Web UI (React)
│ ├── src/ # React components
│ └── dist/ # Built static files
├── proto/ # Protocol Buffer definitions
├── common/ # Shared utilities
├── scripts/ # Utility scripts
├── systemd/ # Systemd service files
├── build/ # CMake build output
└── data/ # Runtime data directory
Environment variables:
SMARTBOTIC_DB_PORT - gRPC port (default: 50151)SMARTBOTIC_DB_DATA_DIR - Data directory pathEnvironment variables:
SMARTBOTIC_SERVER_HTTP_PORT - HTTP port (default: 18080)SMARTBOTIC_SERVER_WS_PORT - WebSocket port (default: 18081)SMARTBOTIC_SERVER_DATABASE_HOST - Database host (default: localhost)SMARTBOTIC_SERVER_DATABASE_PORT - Database port (default: 50151)SMARTBOTIC_SERVER_JWT_SECRET - JWT signing secretSMARTBOTIC_SERVER_STATIC_PATH - Static files directoryPOST /api/auth/login - Login with email/passwordPOST /api/auth/refresh - Refresh access tokenPOST /api/auth/logout - LogoutPOST /api/users - Create user (superadmin)GET /api/users - List usersGET /api/users/:id - Get userPATCH /api/users/:id - Update userDELETE /api/users/:id - Delete userPOST /api/workspaces - Create workspaceGET /api/workspaces - List workspacesGET /api/workspaces/:id - Get workspacePATCH /api/workspaces/:id - Update workspaceDELETE /api/workspaces/:id - Delete workspacePOST /api/workspaces/:wid/collections - Create collectionGET /api/workspaces/:wid/collections - List collectionsGET /api/workspaces/:wid/collections/:name - Get collectionPUT /api/workspaces/:wid/collections/:name - Update collectionDELETE /api/workspaces/:wid/collections/:name - Delete collectionPOST /api/workspaces/:wid/collections/:name/documents - Create documentGET /api/workspaces/:wid/collections/:name/documents - List documentsGET /api/workspaces/:wid/collections/:name/documents/:id - Get documentPUT /api/workspaces/:wid/collections/:name/documents/:id - Update documentDELETE /api/workspaces/:wid/collections/:name/documents/:id - Delete documentPOST /api/workspaces/:wid/views - Create viewGET /api/workspaces/:wid/views - List viewsGET /api/workspaces/:wid/views/:id - Get viewPATCH /api/workspaces/:wid/views/:id - Update viewDELETE /api/workspaces/:wid/views/:id - Delete viewConnect to ws://localhost:18081/ws and authenticate:
{ "type": "auth", "token": "your-jwt-token" }
Subscribe to collection changes:
{ "type": "subscribe", "workspace_id": "...", "collection": "name" }
Receive document events:
{
"type": "document",
"action": "create|update|delete",
"workspace_id": "...",
"collection": "...",
"document_id": "...",
"data": { ... }
}
# Configure
cmake --preset release
# Build
cmake --build build -j$(nproc)
# C++ formatting
clang-format -i database/src/*.cpp webserver/src/*.cpp
# C++ linting
clang-tidy database/src/*.cpp webserver/src/*.cpp
# WebUI
cd webui
pnpm typecheck
pnpm lint
Copy the service files and customize:
sudo cp systemd/*.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable smartbotic-database smartbotic-webserver
sudo systemctl start smartbotic-database smartbotic-webserver
Create /etc/smartbotic/server.env:
SMARTBOTIC_SERVER_JWT_SECRET=your-secure-secret-key
SMARTBOTIC_SERVER_STATIC_PATH=/opt/smartbotic-crm/webui/dist
Proprietary - All rights reserved.