528 lines
12 KiB
Markdown
528 lines
12 KiB
Markdown
# 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
|