feat: SugarCRM 6.5.26 CE - Docker + compose + CI/CD
Some checks failed
Docker Build & Push SugarCRM 6.5 CE / build-and-push (push) Has been cancelled

- PHP 5.6 Apache Dockerfile (Debian Jessie, archive repos)
- Source from bklein01/sugarcrm GitHub mirror
- MySQL 5.7 database with healthcheck
- Silent install via init.sh (AdminWizard disabled)
- REST v4.1 API test script (test_api.py)
- Gitea Actions CI/CD for registry push
- Full README with API docs and pitfall notes
This commit is contained in:
root
2026-05-24 14:33:08 +02:00
parent 30905b15d4
commit 1c4a366409
14 changed files with 576 additions and 334 deletions

246
README.md
View File

@@ -1,154 +1,176 @@
# SuiteCRM Docker — Containerized CRM Environment
# SugarCRM 6.5.26 CE — Containerized Docker Environment
**SuiteCRM 7.15.1** — vollständig containerisiert mit Docker Compose.
Ein Befehl, alles läuft: SuiteCRM + MariaDB + (optional) Redis.
**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.
## Systemanforderungen
- Docker 20.10+ und Docker Compose v2
- 2 GB RAM empfohlen (MariaDB Puffer)
## Schnellstart
## 🚀 Quickstart
```bash
# 1. Repository klonen
# 1. Clone
git clone https://git.kgessner.de/LuiiCode/sugar-crm.git
cd sugar-crm
# 2. Umgebungsvariablen anpassen
cp .env.example .env
nano .env # Passwörter ändern!
# 2. Konfigurieren (Passwörter ändern!)
nano .env
# 3. Starten
docker compose up -d
# 4. SuiteCRM Installation im Browser abschließen:
# http://localhost:8080
# 4. Web-UI öffnen
# http://localhost:2080
# Login: admin / admin123
# 5. API testen
python3 test_api.py
```
## Architektur
## 🏗️ Architektur
```
┌──────────────────────────────────────┐
│ Docker Compose │
│ │
│ ┌──────────┐ ┌──────────┐
│ │ SuiteCRM │ │ MariaDB │ Redis?
│ │ :8080 :3307 :6379
│ │ PHP 8.1 │ 10.11 │ (opt.)
│ │ Apache │ │
│ └──────────┘ └──────────┘
Volumes: Volumes:
- upload - /var/lib/mysql
- custom
- config
└──────────────────────────────────────┘
┌─────────────────────────────────────────
│ 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
## 📦 Services
| Service | Image | Port | Profil |
|-----------|------------------|-------|---------------|
| suitecrm | Custom (PHP 8.1) | 8080 | standard |
| mariadb | mariadb:10.11 | 3307 | standard |
| redis | redis:7-alpine | 6379 | `redis`/`full`|
| 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
## ⚙️ Konfiguration
### Umgebungsvariablen (`.env`)
| Variable | Default | Beschreibung |
|-----------------------|-----------------------------|-------------------------|
| `SUITECRM_PORT` | 8080 | Webinterface-Port |
| `SUITECRM_SITE_URL` | http://localhost:8080 | Öffentliche URL |
| `MYSQL_PORT` | 3307 | DB-Port (Host) |
| `MYSQL_ROOT_PASSWORD` | change_this… | Root-Passwort |
| `MYSQL_DATABASE` | suitecrm | Datenbank-Name |
| `MYSQL_USER` | suitecrm | Datenbank-Nutzer |
| `MYSQL_PASSWORD` | change_this… | Nutzer-Passwort |
| 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**: Immer `.env` Passwörter ändern vor erstem Start!
> ⚠️ **Sicherheit**: `.env` vor erstem Start anpassen! Bei Änderung nach erstem Start: `docker compose down -v && docker compose up -d`
## Kommandos
## 🔌 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
# Grundbefehle
docker compose up -d # Alle Services starten
docker compose up -d redis # + Redis-Cache starten
docker compose down # Stoppen
# 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 suitecrm # SuiteCRM-Logs verfolgen
docker compose logs mariadb # DB-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 mariadb mysqldump -u suitecrm -p suitecrm > backup.sql
tar -czf upload-backup.tar.gz -C /var/lib/docker/volumes/sugarcrmreponame_suitecrm_data/_data .
docker compose exec db mysqldump -u sugarcrm -p sugarcrm > backup.sql
```
## SuiteCRM Installation (Erst-Start)
## 🔧 CI/CD
Nach `docker compose up -d` im Browser `http://localhost:8080` öffnen:
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`
1. **License Agreement** → Akzeptieren
2. **System Check** → Alle Checks sollten grün sein
3. **Database Configuration**:
- Host: `mariadb`
- Database: `suitecrm`
- User: `suitecrm`
- Password: (aus `.env`)
4. **Site Configuration** → Admin-Nutzer anlegen
5. **Fertig!** SuiteCRM ist einsatzbereit.
Secrets erforderlich: `REGISTRY_USER`, `REGISTRY_TOKEN` (bereits gesetzt).
## Redis aktivieren
## ⚠️ Technische Pitfalls
```bash
# Mit Redis-Profil starten
docker compose --profile redis up -d
| 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 |
# Oder Full-Stack (alles inkl. Redis)
docker compose --profile full up -d
```
## 📋 Systemanforderungen
Redis-Konfiguration in SuiteCRM Admin → System → Redis:
- Host: `redis`
- Port: `6379`
## Elasticsearch (optional)
Für Volltextsuche kann Elasticsearch ergänzt werden. Dazu in `docker-compose.yml` einfügen:
```yaml
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.24
container_name: suitecrm-es
environment:
- discovery.type=single-node
- xpack.security.enabled=false
volumes:
- es_data:/usr/share/elasticsearch/data
networks:
- suitecrm-net
```
## Docker Image bauen & pushen
```bash
# Lokal bauen
docker build -t suitecrm:7.15.1 .
# In Gitea Registry pushen
docker tag suitecrm:7.15.1 git.kgessner.de/luiicode/sugar-crm:7.15.1
docker login git.kgessner.de
docker push git.kgessner.de/luiicode/sugar-crm:7.15.1
```
## CI/CD
Bei jedem Push auf `main` baut Gitea Actions das Image automatisch und pusht es in die Gitea Container Registry. Workflow: `.gitea/workflows/docker-build.yml`
- Docker 20.10+
- Docker Compose v2
- ~500 MB RAM (Apache + MySQL)
- Ports `2080` und `3306` verfügbar
---
**Version**: SuiteCRM 7.15.1 | **PHP**: 8.1 | **MariaDB**: 10.11
**SugarCRM 6.5.26 CE** | PHP 5.6 | MySQL 5.7 | REST v4.1 | AGPLv3