Initial commit: Add documentation and move to docs/ directory
This commit is contained in:
527
docs/EXAMPLE_PROJECTS.md
Normal file
527
docs/EXAMPLE_PROJECTS.md
Normal file
@@ -0,0 +1,527 @@
|
||||
# Example Projects for Testing
|
||||
|
||||
This document lists various projects with Docker Compose files of increasing complexity, which will be used to test the Dokku Docker Compose plugin.
|
||||
|
||||
## Difficulty: Beginner (Single Service)
|
||||
|
||||
### 1. Nginx Web Server
|
||||
**Description**: Basic Nginx web server with a custom HTML page
|
||||
**Key Features**:
|
||||
- Single service
|
||||
- Volume mount for static content
|
||||
- Port mapping
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
services:
|
||||
web:
|
||||
image: nginx:alpine
|
||||
ports:
|
||||
- "8080:80"
|
||||
volumes:
|
||||
- ./html:/usr/share/nginx/html
|
||||
```
|
||||
|
||||
### 2. Redis Cache
|
||||
**Description**: Simple Redis instance
|
||||
**Key Features**:
|
||||
- Single service
|
||||
- Volume for data persistence
|
||||
- Custom configuration
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
services:
|
||||
redis:
|
||||
image: redis:alpine
|
||||
ports:
|
||||
- "6379:6379"
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
command: redis-server --requirepass yourpassword
|
||||
|
||||
volumes:
|
||||
redis_data:
|
||||
```
|
||||
|
||||
## Difficulty: Intermediate (Multiple Services)
|
||||
|
||||
### 3. WordPress with MySQL
|
||||
**Description**: WordPress with a separate MySQL database
|
||||
**Key Features**:
|
||||
- Multi-service
|
||||
- Environment variables
|
||||
- Volume mounts
|
||||
- Service dependencies
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
services:
|
||||
wordpress:
|
||||
image: wordpress:latest
|
||||
ports:
|
||||
- "8000:80"
|
||||
environment:
|
||||
WORDPRESS_DB_HOST: db
|
||||
WORDPRESS_DB_USER: wordpress
|
||||
WORDPRESS_DB_PASSWORD: wordpress
|
||||
WORDPRESS_DB_NAME: wordpress
|
||||
depends_on:
|
||||
- db
|
||||
volumes:
|
||||
- wordpress_data:/var/www/html
|
||||
|
||||
db:
|
||||
image: mysql:5.7
|
||||
environment:
|
||||
MYSQL_DATABASE: wordpress
|
||||
MYSQL_USER: wordpress
|
||||
MYSQL_PASSWORD: wordpress
|
||||
MYSQL_RANDOM_ROOT_PASSWORD: '1'
|
||||
volumes:
|
||||
- db_data:/var/lib/mysql
|
||||
|
||||
volumes:
|
||||
wordpress_data:
|
||||
db_data:
|
||||
```
|
||||
|
||||
### 4. Node.js App with MongoDB
|
||||
**Description**: Simple Node.js application with MongoDB
|
||||
**Key Features**:
|
||||
- Multi-service
|
||||
- Build context
|
||||
- Environment variables
|
||||
- Network configuration
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
services:
|
||||
app:
|
||||
build: .
|
||||
ports:
|
||||
- "3000:3000"
|
||||
environment:
|
||||
- NODE_ENV=development
|
||||
- MONGODB_URI=mongodb://mongo:27017/mydb
|
||||
depends_on:
|
||||
- mongo
|
||||
networks:
|
||||
- app-network
|
||||
|
||||
mongo:
|
||||
image: mongo:latest
|
||||
volumes:
|
||||
- mongo_data:/data/db
|
||||
networks:
|
||||
- app-network
|
||||
|
||||
networks:
|
||||
app-network:
|
||||
driver: bridge
|
||||
|
||||
volumes:
|
||||
mongo_data:
|
||||
```
|
||||
|
||||
## Difficulty: Advanced (Complex Applications)
|
||||
|
||||
### 5. Nextcloud
|
||||
**Description**: Self-hosted productivity platform
|
||||
**Key Features**:
|
||||
- Multiple interconnected services
|
||||
- Database and caching
|
||||
- Volume mounts for persistence
|
||||
- Environment configuration
|
||||
- Health checks
|
||||
- Complex networking
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
services:
|
||||
db:
|
||||
image: mariadb:10.6
|
||||
command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
|
||||
restart: always
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=db_root_password
|
||||
- MYSQL_PASSWORD=db_password
|
||||
- MYSQL_DATABASE=nextcloud
|
||||
- MYSQL_USER=nextcloud
|
||||
volumes:
|
||||
- db:/var/lib/mysql
|
||||
|
||||
redis:
|
||||
image: redis:alpine
|
||||
restart: always
|
||||
|
||||
app:
|
||||
image: nextcloud:apache
|
||||
restart: always
|
||||
ports:
|
||||
- 8080:80
|
||||
links:
|
||||
- db
|
||||
- redis
|
||||
environment:
|
||||
- MYSQL_PASSWORD=db_password
|
||||
- MYSQL_DATABASE=nextcloud
|
||||
- MYSQL_USER=nextcloud
|
||||
- MYSQL_HOST=db
|
||||
- REDIS_HOST=redis
|
||||
- OVERWRITEPROTOCOL=https
|
||||
volumes:
|
||||
- nextcloud:/var/www/html
|
||||
depends_on:
|
||||
- db
|
||||
- redis
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:80/status.php"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
volumes:
|
||||
db:
|
||||
nextcloud:
|
||||
```
|
||||
|
||||
### 6. Plane (Project Management)
|
||||
**Description**: Open-source project management tool
|
||||
**Key Features**:
|
||||
- Multiple microservices
|
||||
- Database and cache
|
||||
- File storage
|
||||
- Background workers
|
||||
- Environment variables
|
||||
- Health checks
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
services:
|
||||
web:
|
||||
image: planepowers/plane-web:latest
|
||||
environment:
|
||||
- NEXT_PUBLIC_API_BASE_URL=${API_BASE_URL}
|
||||
- NEXT_PUBLIC_WS_BASE_URL=${WS_BASE_URL}
|
||||
ports:
|
||||
- "3000:3000"
|
||||
depends_on:
|
||||
- api
|
||||
restart: unless-stopped
|
||||
|
||||
api:
|
||||
image: planepowers/plane-api:latest
|
||||
environment:
|
||||
- DATABASE_URL=${DATABASE_URL}
|
||||
- REDIS_URL=${REDIS_URL}
|
||||
- JWT_SECRET=${JWT_SECRET}
|
||||
- CORS_ORIGINS=${CORS_ORIGINS}
|
||||
depends_on:
|
||||
- db
|
||||
- redis
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8000/health/"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
worker:
|
||||
image: planepowers/plane-worker:latest
|
||||
environment:
|
||||
- DATABASE_URL=${DATABASE_URL}
|
||||
- REDIS_URL=${REDIS_URL}
|
||||
depends_on:
|
||||
- db
|
||||
- redis
|
||||
restart: unless-stopped
|
||||
|
||||
db:
|
||||
image: postgres:13-alpine
|
||||
environment:
|
||||
- POSTGRES_USER=${DB_USER}
|
||||
- POSTGRES_PASSWORD=${DB_PASSWORD}
|
||||
- POSTGRES_DB=${DB_NAME}
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
restart: unless-stopped
|
||||
|
||||
redis:
|
||||
image: redis:alpine
|
||||
command: redis-server --requirepass ${REDIS_PASSWORD}
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
restart: unless-stopped
|
||||
|
||||
minio:
|
||||
image: minio/minio:latest
|
||||
volumes:
|
||||
- minio_data:/data
|
||||
environment:
|
||||
- MINIO_ROOT_USER=${MINIO_ACCESS_KEY}
|
||||
- MINIO_ROOT_PASSWORD=${MINIO_SECRET_KEY}
|
||||
command: server /data
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
redis_data:
|
||||
minio_data:
|
||||
```
|
||||
|
||||
## Difficulty: Expert (Enterprise-Grade)
|
||||
|
||||
### 7. GitLab CE
|
||||
**Description**: Complete DevOps platform
|
||||
**Key Features**:
|
||||
- Multiple interconnected services
|
||||
- Database, cache, and search
|
||||
- File storage
|
||||
- Background processing
|
||||
- Complex networking
|
||||
- Resource limits
|
||||
- Health checks
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
services:
|
||||
gitlab:
|
||||
image: 'gitlab/gitlab-ce:latest'
|
||||
restart: always
|
||||
hostname: 'gitlab.example.com'
|
||||
environment:
|
||||
GITLAB_OMNIBUS_CONFIG: |
|
||||
external_url 'https://gitlab.example.com'
|
||||
gitlab_rails['gitlab_shell_ssh_port'] = 2222
|
||||
ports:
|
||||
- '80:80'
|
||||
- '443:443'
|
||||
- '2222:22'
|
||||
volumes:
|
||||
- '$GITLAB_HOME/config:/etc/gitlab'
|
||||
- '$GITLAB_HOME/logs:/var/log/gitlab'
|
||||
- '$GITLAB_HOME/data:/var/opt/gitlab'
|
||||
shm_size: '256m'
|
||||
healthcheck:
|
||||
test: ['CMD', '/opt/gitlab/bin/gitlab-healthcheck', '--fail']
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 5m
|
||||
```
|
||||
|
||||
### 8. Jitsi Meet
|
||||
**Description**: Secure, Simple and Scalable Video Conferences
|
||||
**Key Features**:
|
||||
- Multiple real-time services
|
||||
- WebRTC configuration
|
||||
- TURN/STUN servers
|
||||
- Authentication
|
||||
- Custom networking
|
||||
- Environment configuration
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
services:
|
||||
# Frontend
|
||||
web:
|
||||
image: jitsi/web:latest
|
||||
ports:
|
||||
- '${HTTP_PORT}:80'
|
||||
- '${HTTPS_PORT}:443'
|
||||
volumes:
|
||||
- '${CONFIG}/web:/config'
|
||||
- '${CONFIG}/web/letsencrypt:/etc/letsencrypt'
|
||||
- '${CONFIG}/transcripts:/usr/share/jitsi-meet/transcripts'
|
||||
environment:
|
||||
- ENABLE_AUTH
|
||||
- ENABLE_RECORDING
|
||||
- ENABLE_LETSCENCRYPT
|
||||
- LETSENCRYPT_DOMAIN
|
||||
- LETSENCRYPT_EMAIL
|
||||
- PUBLIC_URL
|
||||
- XMPP_DOMAIN
|
||||
- XMPP_AUTH_DOMAIN
|
||||
- XMPP_GUEST_DOMAIN
|
||||
- XMPP_MUC_DOMAIN
|
||||
- XMPP_INTERNAL_MUC_DOMAIN
|
||||
- XMPP_MODULES
|
||||
- XMPP_MUC_MODULES
|
||||
- XMPP_INTERNAL_MUC_MODULES
|
||||
- JVB_ADDRESS
|
||||
- ENABLE_COLIBRI_WEBSOCKET
|
||||
- ENABLE_XMPP_WEBSOCKET
|
||||
- COLIBRI_REST_ENDPOINT
|
||||
- ENABLE_LOBBY
|
||||
- ENABLE_IPV6
|
||||
networks:
|
||||
meet.jitsi:
|
||||
meet.jitsi.2:
|
||||
ipv4_address: 172.28.1.1
|
||||
restart: unless-stopped
|
||||
|
||||
# XMPP server
|
||||
prosody:
|
||||
image: jitsi/prosody:latest
|
||||
volumes:
|
||||
- '${CONFIG}/prosody/config:/config'
|
||||
- '${CONFIG}/prosody/prosody-plugins-custom:/prosody-plugins-custom'
|
||||
environment:
|
||||
- AUTH_TYPE
|
||||
- ENABLE_AUTH
|
||||
- ENABLE_GUESTS
|
||||
- GLOBAL_MODULES
|
||||
- GLOBAL_CONFIG
|
||||
- LDAP_URL
|
||||
- LDAP_BASE
|
||||
- LDAP_BINDDN
|
||||
- LDAP_BINDPW
|
||||
- LDAP_FILTER
|
||||
- LDAP_AUTH_METHOD
|
||||
- LDAP_VERSION
|
||||
- LDAP_USE_TLS
|
||||
- LDAP_TLS_CIPHERS
|
||||
- LDAP_TLS_CHECK_PEER
|
||||
- LDAP_TLS_CACERT_FILE
|
||||
- LDAP_TLS_CACERT_DIR
|
||||
- LDAP_START_TLS
|
||||
- XMPP_DOMAIN
|
||||
- XMPP_AUTH_DOMAIN
|
||||
- XMPP_GUEST_DOMAIN
|
||||
- XMPP_MUC_DOMAIN
|
||||
- XMPP_INTERNAL_MUC_DOMAIN
|
||||
- XMPP_MODULES
|
||||
- XMPP_MUC_MODULES
|
||||
- XMPP_INTERNAL_MUC_MODULES
|
||||
- XMPP_RECORDER_DOMAIN
|
||||
- JICOFO_COMPONENT_SECRET
|
||||
- JICOFO_AUTH_USER
|
||||
- JVB_AUTH_USER
|
||||
- JIGASI_XMPP_USER
|
||||
- JIBRI_XMPP_USER
|
||||
- JIBRI_RECORDER_USER
|
||||
- JIBRI_RECORDING_DIR
|
||||
- JIBRI_FINALIZE_RECORDING_SCRIPT_PATH
|
||||
- JIBRI_XMPP_PASSWORD
|
||||
- JIBRI_RECORDER_PASSWORD
|
||||
- JWT_APP_ID
|
||||
- JWT_APP_SECRET
|
||||
- JWT_ACCEPTED_ISSUERS
|
||||
- JWT_ACCEPTED_AUDIENCES
|
||||
- JWT_ASAP_KEYSERVER
|
||||
- JWT_ALLOW_EMPTY
|
||||
- JWT_AUTH_TYPE
|
||||
- JWT_TOKEN_AUTH_MODULE
|
||||
- LOG_LEVEL
|
||||
- TZ
|
||||
networks:
|
||||
meet.jitsi:
|
||||
meet.jitsi.2:
|
||||
ipv4_address: 172.28.1.2
|
||||
restart: unless-stopped
|
||||
|
||||
# Video bridge
|
||||
jvb:
|
||||
image: jitsi/jvb:latest
|
||||
ports:
|
||||
- '${JVB_PORT}:${JVB_PORT}/udp'
|
||||
- '${JVB_TCP_PORT}:${JVB_TCP_PORT}'
|
||||
volumes:
|
||||
- '${CONFIG}/jvb:/config'
|
||||
environment:
|
||||
- DOCKER_HOST_ADDRESS
|
||||
- XMPP_AUTH_DOMAIN
|
||||
- XMPP_INTERNAL_MUC_DOMAIN
|
||||
- XMPP_SERVER
|
||||
- JVB_AUTH_USER
|
||||
- JVB_AUTH_PASSWORD
|
||||
- JVB_BREWERY_MUC
|
||||
- JVB_PORT
|
||||
- JVB_TCP_PORT
|
||||
- JVB_TCP_ENABLED
|
||||
- JVB_TCP_PORT
|
||||
- JVB_STUN_SERVERS
|
||||
- JVB_ENABLE_APIS
|
||||
- JVB_WS_DOMAIN
|
||||
- JVB_WS_SERVER_ID
|
||||
- JVB_WS_REGION
|
||||
- PUBLIC_URL
|
||||
- TZ
|
||||
depends_on:
|
||||
- prosody
|
||||
networks:
|
||||
meet.jitsi:
|
||||
meet.jitsi.2:
|
||||
ipv4_address: 172.28.1.3
|
||||
restart: unless-stopped
|
||||
|
||||
# Jicofo - the conference focus component
|
||||
jicofo:
|
||||
image: jitsi/jicofo:latest
|
||||
volumes:
|
||||
- '${CONFIG}/jicofo:/config'
|
||||
environment:
|
||||
- ENABLE_AUTH
|
||||
- XMPP_DOMAIN
|
||||
- XMPP_AUTH_DOMAIN
|
||||
- XMPP_INTERNAL_MUC_DOMAIN
|
||||
- XMPP_SERVER
|
||||
- JICOFO_COMPONENT_SECRET
|
||||
- JICOFO_AUTH_USER
|
||||
- JICOFO_AUTH_PASSWORD
|
||||
- JICOFO_RESERVATION_REST_BASE_URL
|
||||
- JVB_BREWERY_MUC
|
||||
- JIGASI_BREWERY_MUC
|
||||
- JIGASI_RECORDER_BREWERY_MUC
|
||||
- JIBRI_BREWERY_MUC
|
||||
- JIBRI_PENDING_TIMEOUT
|
||||
- TZ
|
||||
depends_on:
|
||||
- prosody
|
||||
networks:
|
||||
meet.jitsi:
|
||||
meet.jitsi.2:
|
||||
ipv4_address: 172.28.1.4
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
meet.jitsi:
|
||||
meet.jitsi.2:
|
||||
driver: bridge
|
||||
driver_opts:
|
||||
com.docker.network.bridge.name: meet.jitsi.2
|
||||
enable_ipv6: true
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: 172.28.0.0/16
|
||||
gateway: 172.28.0.1
|
||||
- subnet: 2001:db8:4001:1::/64
|
||||
gateway: 2001:db8:4001::1
|
||||
```
|
||||
|
||||
## Testing Strategy
|
||||
|
||||
1. **Start Simple**: Begin with the basic examples and ensure they work
|
||||
2. **Progressive Complexity**: Move to more complex examples
|
||||
3. **Edge Cases**: Test with different configurations and edge cases
|
||||
4. **Real-world Scenarios**: Test with actual applications like Nextcloud and Plane
|
||||
5. **Performance Testing**: Measure resource usage and optimize as needed
|
||||
|
||||
## Adding New Examples
|
||||
|
||||
When adding new examples, please:
|
||||
1. Categorize by difficulty level
|
||||
2. Include a brief description
|
||||
3. List key features
|
||||
4. Ensure the example is complete and runnable
|
||||
5. Add any necessary environment variables or setup instructions
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributions of additional examples are welcome! Please ensure that any contributed examples:
|
||||
- Are well-documented
|
||||
- Follow best practices
|
||||
- Include all necessary configuration
|
||||
- Are tested and working
|
||||
Reference in New Issue
Block a user