feat: add Presenton AI presentation generator with Azure OpenAI integration
Deployed Presenton (AI-powered presentation generator) to production infrastructure. Features: - AI-generated presentations from text prompts and documents - Azure OpenAI GPT-5 for text generation - Azure OpenAI DALL-E 3 for image generation - Export to PPTX and PDF formats - Custom template support with HTML/Tailwind CSS - Privacy-focused (local data processing) Infrastructure: - Container: ghcr.io/presenton/presenton:latest - Domain: presentation.ai-impress.com - SSL: Automatic via Traefik + Cloudflare DNS - Network: traefik-public - Resources: 1-2 CPU cores, 1-2GB RAM Configuration: - LLM: Azure OpenAI Custom endpoint (GPT-5) - Images: Azure DALL-E 3 - API keys managed via .env (not committed) - UI key management enabled (CAN_CHANGE_KEYS=true) Services started: - Nginx (port 80) - reverse proxy - Next.js (port 3000) - frontend - FastAPI (port 8000) - backend API - MCP Server (port 8001) - Model Context Protocol Location: /opt/02-core/presenton/ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
b052b91f9b
commit
117de92709
2 changed files with 280 additions and 0 deletions
248
opt/02-core/presenton/README.md
Normal file
248
opt/02-core/presenton/README.md
Normal file
|
|
@ -0,0 +1,248 @@
|
|||
# Presenton - AI Presentation Generator
|
||||
|
||||
AI-powered presentation generator with Azure OpenAI integration.
|
||||
|
||||
## Overview
|
||||
|
||||
**Presenton** is an open-source AI presentation generator that creates professional presentations from prompts, documents, or existing PowerPoint files. Privacy-focused alternative to Gamma, Beautiful.ai, and Decktopus.
|
||||
|
||||
- **URL:** https://presentation.ai-impress.com
|
||||
- **Repository:** https://github.com/presenton/presenton
|
||||
- **AI Provider:** Azure OpenAI (GPT-5 + DALL-E 3)
|
||||
|
||||
## Features
|
||||
|
||||
- AI-generated presentations from text prompts
|
||||
- Document upload support (PDF, DOCX, PPTX)
|
||||
- Custom template creation (HTML + Tailwind CSS)
|
||||
- Export to PPTX and PDF formats
|
||||
- Model Context Protocol (MCP) server support
|
||||
- Local data processing (privacy-focused)
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
presenton/
|
||||
├── docker-compose.yml # Container configuration with Traefik
|
||||
├── .env # Azure OpenAI credentials
|
||||
├── README.md # This file
|
||||
└── app_data/ # Persistent storage (auto-created)
|
||||
├── presentations/ # Generated presentations
|
||||
├── templates/ # Custom templates
|
||||
└── uploads/ # Uploaded documents
|
||||
```
|
||||
|
||||
## Technology Stack
|
||||
|
||||
**Frontend:**
|
||||
- Next.js (React)
|
||||
- Node.js 20
|
||||
- Port: 3000 (internal)
|
||||
|
||||
**Backend:**
|
||||
- FastAPI (Python 3.11)
|
||||
- Port: 8000 (internal)
|
||||
|
||||
**Additional Services:**
|
||||
- MCP Server (Port: 8001)
|
||||
- Nginx (Port: 80 - exposed via Traefik)
|
||||
|
||||
**AI Integration:**
|
||||
- Azure OpenAI GPT-5 (text generation)
|
||||
- Azure OpenAI DALL-E 3 (image generation)
|
||||
|
||||
## Configuration
|
||||
|
||||
### Environment Variables (.env)
|
||||
|
||||
**LLM Configuration:**
|
||||
- `LLM=custom` - Use custom Azure OpenAI endpoint
|
||||
- `CUSTOM_LLM_URL` - Azure OpenAI chat completions URL
|
||||
- `CUSTOM_LLM_API_KEY` - Azure API key
|
||||
- `CUSTOM_MODEL=gpt-5` - Model name
|
||||
- `TOOL_CALLS=true` - Enable function calling
|
||||
|
||||
**Image Generation:**
|
||||
- `IMAGE_PROVIDER=dall-e-3` - Use DALL-E 3 for images
|
||||
- `OPENAI_API_KEY` - Azure DALL-E API key
|
||||
|
||||
**Advanced Features:**
|
||||
- `CAN_CHANGE_KEYS=true` - Allow API key changes in UI
|
||||
- `EXTENDED_REASONING=true` - Enable for GPT-5
|
||||
- `DISABLE_ANONYMOUS_TELEMETRY=true` - Privacy
|
||||
|
||||
### Traefik Integration
|
||||
|
||||
Presenton is configured to work with Traefik reverse proxy:
|
||||
- **Domain:** presentation.ai-impress.com
|
||||
- **SSL:** Automatic via Let's Encrypt (Cloudflare DNS)
|
||||
- **Network:** traefik-public
|
||||
|
||||
## Usage
|
||||
|
||||
### Start the service
|
||||
|
||||
```bash
|
||||
cd /opt/02-core/presenton
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
### View logs
|
||||
|
||||
```bash
|
||||
docker logs presenton -f
|
||||
```
|
||||
|
||||
### Stop the service
|
||||
|
||||
```bash
|
||||
docker compose down
|
||||
```
|
||||
|
||||
### Restart the service
|
||||
|
||||
```bash
|
||||
docker compose restart
|
||||
```
|
||||
|
||||
### Update to latest version
|
||||
|
||||
```bash
|
||||
docker compose pull
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
## API Access
|
||||
|
||||
**API Documentation:**
|
||||
- Swagger UI: https://presentation.ai-impress.com/api/v1/docs
|
||||
- OpenAPI spec: https://presentation.ai-impress.com/api/v1/openapi.json
|
||||
|
||||
**Generate Presentation Endpoint:**
|
||||
```bash
|
||||
POST /api/v1/ppt/presentation/generate
|
||||
```
|
||||
|
||||
**Example Request:**
|
||||
```bash
|
||||
curl -X POST "https://presentation.ai-impress.com/api/v1/ppt/presentation/generate" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"content": "Create a presentation about AI trends in 2025",
|
||||
"slide_count": 10,
|
||||
"language": "en",
|
||||
"tone": "professional",
|
||||
"export_format": "pptx"
|
||||
}'
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Container won't start
|
||||
|
||||
Check logs for errors:
|
||||
```bash
|
||||
docker logs presenton --tail 100
|
||||
```
|
||||
|
||||
Check if Traefik network exists:
|
||||
```bash
|
||||
docker network ls | grep traefik-public
|
||||
```
|
||||
|
||||
### Azure OpenAI connection issues
|
||||
|
||||
Verify environment variables:
|
||||
```bash
|
||||
docker exec presenton env | grep -E "LLM|CUSTOM|OPENAI"
|
||||
```
|
||||
|
||||
Test Azure OpenAI endpoint:
|
||||
```bash
|
||||
curl -X POST "https://aipmress-ai-n8n.cognitiveservices.azure.com/openai/deployments/gpt-5/chat/completions?api-version=2025-01-01-preview" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "api-key: YOUR_API_KEY" \
|
||||
-d '{"messages":[{"role":"user","content":"Hello"}]}'
|
||||
```
|
||||
|
||||
### DALL-E image generation not working
|
||||
|
||||
Azure DALL-E uses a different API format than OpenAI. If images fail to generate:
|
||||
|
||||
1. Check logs: `docker logs presenton | grep -i "dall-e"`
|
||||
2. Verify DALL-E endpoint is accessible
|
||||
3. Consider using Pexels as alternative (free stock photos)
|
||||
|
||||
To switch to Pexels:
|
||||
```bash
|
||||
# Edit .env
|
||||
IMAGE_PROVIDER=pexels
|
||||
PEXELS_API_KEY=your_pexels_key # Get free at https://www.pexels.com/api/
|
||||
```
|
||||
|
||||
### Performance issues
|
||||
|
||||
Increase container resources in docker-compose.yml:
|
||||
```yaml
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: '4'
|
||||
memory: 4G
|
||||
```
|
||||
|
||||
## Maintenance
|
||||
|
||||
### Backup presentations
|
||||
|
||||
```bash
|
||||
# Create backup
|
||||
tar -czf presenton-backup-$(date +%Y%m%d).tar.gz app_data/
|
||||
|
||||
# Restore from backup
|
||||
tar -xzf presenton-backup-YYYYMMDD.tar.gz
|
||||
```
|
||||
|
||||
### Clear cache and temp files
|
||||
|
||||
```bash
|
||||
docker exec presenton sh -c "rm -rf /tmp/*"
|
||||
```
|
||||
|
||||
### Monitor disk usage
|
||||
|
||||
```bash
|
||||
du -sh app_data/
|
||||
```
|
||||
|
||||
## Security
|
||||
|
||||
- API keys stored in .env (excluded from Git)
|
||||
- SSL/HTTPS via Traefik with Let's Encrypt
|
||||
- Local data processing (no cloud uploads)
|
||||
- API key changes allowed via UI (can be locked with `CAN_CHANGE_KEYS=false`)
|
||||
|
||||
## Resources
|
||||
|
||||
- **CPU:** 1-2 cores (recommended)
|
||||
- **RAM:** 1-2 GB
|
||||
- **Disk:** ~1 GB (image) + presentations storage
|
||||
|
||||
## Links
|
||||
|
||||
- **Official Docs:** https://github.com/presenton/presenton
|
||||
- **Issue Tracker:** https://github.com/presenton/presenton/issues
|
||||
- **Docker Hub:** ghcr.io/presenton/presenton
|
||||
|
||||
## Support
|
||||
|
||||
For issues specific to this deployment:
|
||||
- Check container logs: `docker logs presenton`
|
||||
- Review Traefik logs: `docker logs traefik`
|
||||
- Contact: AI-Impress Infrastructure Team
|
||||
|
||||
---
|
||||
|
||||
**Last Updated:** 2025-11-05
|
||||
**Version:** latest
|
||||
**Deployment:** Production
|
||||
32
opt/02-core/presenton/docker-compose.yml
Normal file
32
opt/02-core/presenton/docker-compose.yml
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
version: '3.8'
|
||||
|
||||
services:
|
||||
presenton:
|
||||
image: ghcr.io/presenton/presenton:latest
|
||||
container_name: presenton
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- traefik-public
|
||||
env_file:
|
||||
- .env
|
||||
volumes:
|
||||
- ./app_data:/app_data
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: '2'
|
||||
memory: 2G
|
||||
reservations:
|
||||
cpus: '1'
|
||||
memory: 512M
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.docker.network=traefik-public"
|
||||
- "traefik.http.routers.presenton.rule=Host(`presentation.ai-impress.com`)"
|
||||
- "traefik.http.routers.presenton.entrypoints=websecure"
|
||||
- "traefik.http.routers.presenton.tls.certresolver=cloudflare"
|
||||
- "traefik.http.services.presenton.loadbalancer.server.port=80"
|
||||
|
||||
networks:
|
||||
traefik-public:
|
||||
external: true
|
||||
Loading…
Add table
Reference in a new issue