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
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:
246
README.md
246
README.md
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user