# SugarCRM 6.5.26 CE β€” Containerized Docker Environment **100% containerisierte SugarCRM Community Edition 6.5.26** Ein `docker compose up -d` β€” alles lΓ€uft: Apache/PHP 5.6 + MySQL 5.7 + REST API v4.1. ## πŸš€ Quickstart ```bash # 1. Clone git clone https://git.kgessner.de/LuiiCode/sugar-crm.git cd sugar-crm # 2. Konfigurieren (PasswΓΆrter Γ€ndern!) nano .env # 3. Starten (All-in-One) ./start.sh # ODER manuell: docker compose up -d # 4. Web-UI ΓΆffnen # β†’ http://localhost:2080 # Login: admin / admin123 ``` ## πŸ§ͺ API-Test-Scripte | Script | Beschreibung | |--------|-------------| | `start.sh` | **All-in-One**: Starten + Warten + API-Test | | `test_api.py` | Basis-Test: Login, Module, CRUD | | `test_api_extended.py` | Erweiterter Test: Felder, Suche, Relationships, CRUD | | `test_seed.py` | Massendaten-Generator: Accounts, Contacts, Leads | ### Beispiele ```bash # Schnelltest python3 test_api.py # VollstΓ€ndiger API-Test python3 test_api_extended.py # 50 Test-Accounts + 50 Contacts + 50 Leads generieren python3 test_seed.py --count 50 # Nur Daten zΓ€hlen (keine neuen erstellen) python3 test_seed.py --clean ``` ## πŸ—οΈ Architektur ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Docker Compose β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ SugarCRM 6.5 β”‚ β”‚ MySQL 5.7 β”‚ β”‚ β”‚ β”‚ Apache/PHP5.6 β”‚ β”‚ :3306 β”‚ β”‚ β”‚ β”‚ :2080 │◄─│ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ Data (volumes): β”‚ β”‚ sugarcrm_custom β†’ custom modules β”‚ β”‚ sugarcrm_upload β†’ uploads β”‚ β”‚ mysql_data β†’ DB Daten β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ## πŸ“¦ Services | Service | Image | Port | Beschreibung | |---------|-------|------|-------------| | `sugarcrm` | Custom (PHP 5.6) | `2080` β†’ `80` | SugarCRM 6.5.26 CE Web + API | | `db` | `mysql:5.7` | `3306` | MySQL Datenbank | ## βš™οΈ Konfiguration ### Umgebungsvariablen (`.env`) | Variable | Default | Beschreibung | |----------|---------|-------------| | `SUGARCRM_PORT` | `2080` | Web-UI Port | | `MYSQL_PORT` | `3306` | MySQL Port | | `MYSQL_ROOT_PASSWORD` | `change_this…` | **Sofort Γ€ndern!** | | `MYSQL_DATABASE` | `sugarcrm` | Datenbank-Name | | `MYSQL_USER` | `sugarcrm` | DB-Nutzer | | `MYSQL_PASSWORD` | `change_this…` | **Sofort Γ€ndern!** | | `SUGARCRM_ADMIN_USER` | `admin` | Admin-Login | | `SUGARCRM_ADMIN_PASSWORD` | `admin123` | Admin-Passwort | > ⚠️ **Sicherheit**: `.env` vor erstem Start anpassen! Bei Γ„nderung nach erstem Start: `docker compose down -v && docker compose up -d` ## πŸ”Œ REST API v4.1 **Endpoint:** `POST http://localhost:2080/service/v4_1/rest.php` **Content-Type:** `application/x-www-form-urlencoded` ### Aufbau ``` method=login input_type=JSON response_type=JSON rest_data={"user_auth":{"user_name":"admin","password":"0192023a7bbd73250516f069df18b500"}} ``` ### API Client (Python) ```python import hashlib, json, urllib.request pwd_hash = hashlib.md5(b"admin123").hexdigest() rest_data = json.dumps({ "user_auth": {"user_name": "admin", "password": pwd_hash}, "application_name": "My App" }) body = urllib.parse.urlencode({ "method": "login", "input_type": "JSON", "response_type": "JSON", "rest_data": rest_data }).encode() req = urllib.request.Request( "http://localhost:2080/service/v4_1/rest.php", data=body, headers={"Content-Type": "application/x-www-form-urlencoded"} ) resp = json.loads(urllib.request.urlopen(req).read()) session_id = resp["id"] print(f"Session: {session_id}") ``` ### VerfΓΌgbare Methoden | Methode | Beschreibung | |---------|-------------| | `login` | Session starten | | `logout` | Session beenden | | `get_available_modules` | Alle Module (Accounts, Contacts, Leads...) | | `get_entry_list` | EintrΓ€ge auslesen (mit Filter/Sortierung) | | `get_entry` | Einzelnen Eintrag per ID | | `set_entry` | Eintrag erstellen/aktualisieren | | `set_entries` | Mehrere EintrΓ€ge erstellen | | `get_entries_count` | Anzahl EintrΓ€ge zΓ€hlen | | `search_by_module` | Globale Suche | | `get_module_fields` | Felddefinitionen eines Moduls | | `set_relationship` | Beziehungen verknΓΌpfen | | `get_relationships` | Beziehungen auslesen | ## πŸ› οΈ Kommandos ```bash # Start/Stop docker compose up -d # Starten docker compose down # Stoppen (Daten bleiben) docker compose down -v # Stoppen + ALLE DATEN LΓ–SCHEN # Logs docker compose logs -f sugarcrm # SugarCRM-Logs docker compose logs db # MySQL-Logs # Shell docker compose exec sugarcrm bash # Container-Shell # Backup docker compose exec db mysqldump -u sugarcrm -p sugarcrm > backup.sql ``` ## πŸ”§ CI/CD Bei jedem Push auf `main` baut Gitea Actions automatisch: 1. Docker-Image aus `Dockerfile` 2. Push in die Gitea Container Registry: `git.kgessner.de/luiicode/sugar-crm` Secrets erforderlich: `REGISTRY_USER`, `REGISTRY_TOKEN` (bereits gesetzt). ## ⚠️ Technische Pitfalls | Problem | Fix | |---------|-----| | SourceForge ZIPs korrupt | GitHub Mirror `bklein01/sugarcrm` verwendet | | Debian Jessie EOL | APT sources auf `archive.debian.org` umgebogen | | Admin Wizard blockiert API | `installer_locked=true` + adminwizard DB-Eintrag (init.sh) | | config.php wird ΓΌberschrieben | init.sh macht idempotenten Restart | | Kein mysqladmin im Container | PHP-Socket-Check fΓΌr DB-Wait-Loop | ## πŸ“‹ Systemanforderungen - Docker 20.10+ - Docker Compose v2 - ~500 MB RAM (Apache + MySQL) - Ports `2080` und `3306` verfΓΌgbar --- **SugarCRM 6.5.26 CE** | PHP 5.6 | MySQL 5.7 | REST v4.1 | AGPLv3