Skip to content

Docker AIO #137

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: preview
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion mint.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,12 @@
"group": "Install",
"pages": [
"self-hosting/methods/docker-compose",
"self-hosting/methods/docker-aio",
"self-hosting/methods/docker-swarm",
"self-hosting/methods/airgapped-edition",
"self-hosting/methods/kubernetes",
"self-hosting/methods/coolify",
"self-hosting/methods/portainer",
"self-hosting/methods/airgapped-edition",
"self-hosting/methods/podman-quadlets"
]
},
Expand Down
2 changes: 1 addition & 1 deletion self-hosting/methods/airgapped-edition.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: Deploy Plane Commercial Airgapped Edition
title: Deploy Plane Airgapped Edition
sidebarTitle: Airgapped Edition
---

Expand Down
177 changes: 177 additions & 0 deletions self-hosting/methods/docker-aio.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
---
title: Docker AIO (All-in-One) • Commercial Edition
sidebarTitle: Docker AIO
---

The Plane Commercial All-in-One (AIO) Docker image packages all Plane services into a single container, making it the fastest way to get Plane running.

## What's included

Your single AIO container includes all these services running together:

- **Web App** (Port 3001) - The main Plane web interface you'll use
- **Space** (Port 3002) - Public project spaces for external collaboration
- **Admin** (Port 3003) - Administrative interface
- **API Server** (Port 3004) - Backend API
- **Live Server** (Port 3005) - Real-time collaboration features
- **Silo** (Port 3006) - Integration services
- **Monitor** (Port 3007) - Feature flags and payments
- **Email Server** (Ports 10025, 10465, 10587) - SMTP server for notifications
- **Proxy** (Port 80, 20025, 20465, 20587) - Caddy reverse proxy
- **Worker and Beat Worker** - Background task processing

## Prerequisites

- [Docker](https://docs.docker.com/engine/)
- Set up these external services:
- *PostgreSQL*
For data storage
- *Redis*
For caching and session management
- *RabbitMQ*
For message queuing
- *S3-compatible storage*
For file uploads (AWS S3 or MinIO)

## Install Plane

1. [Download the image]

2. Run the following command to deploy the Plane AIO container. Make sure to replace all placeholder values (e.g., `your-domain.com`, `user:pass`) with your actual configuration.

Comment on lines +38 to +41
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Broken placeholder link

[Download the image] is currently an empty Markdown reference. Readers will hit a 404 or be confused.
Replace with the actual download URL or convert it to plain text until a link is available.

🤖 Prompt for AI Agents
In self-hosting/methods/docker-aio.mdx around lines 38 to 41, the Markdown link
labeled [Download the image] is a broken placeholder with no URL, causing
confusion or 404 errors. Replace the empty Markdown reference with the actual
download URL for the image if available, or convert the text to plain text
without a link until a valid URL can be provided.

<Warning>
All environment variables are required for the container to function correctly.
</Warning>

```bash
docker run --name plane-aio --rm -it \
-p 80:80 \
-p 20025:20025 \
-p 20465:20465 \
-p 20587:20587 \
-e DOMAIN_NAME=your-domain.com \
-e DATABASE_URL=postgresql://user:pass@host:port/database \
-e REDIS_URL=redis://host:port \
-e AMQP_URL=amqp://user:pass@host:port/vhost \
-e AWS_REGION=us-east-1 \
-e AWS_ACCESS_KEY_ID=your-access-key \
-e AWS_SECRET_ACCESS_KEY=your-secret-key \
-e AWS_S3_BUCKET_NAME=your-bucket \
plane-aio-commercial:latest
```

If you're running everything locally, use this example:

```bash
MYIP=192.168.68.169
docker run --name myaio --rm -it \
-p 80:80 \
-p 20025:20025 \
-p 20465:20465 \
-p 20587:20587 \
-e DOMAIN_NAME=${MYIP} \
-e DATABASE_URL=postgresql://plane:plane@${MYIP}:15432/plane \
-e REDIS_URL=redis://${MYIP}:16379 \
-e AMQP_URL=amqp://plane:plane@${MYIP}:15673/plane \
-e AWS_REGION=us-east-1 \
-e AWS_ACCESS_KEY_ID=5MV45J9NF5TEFZWYCRAX \
-e AWS_SECRET_ACCESS_KEY=7xMqAiAHsf2UUjMH+EwICXlyJL9TO30m8leEaDsL \
Comment on lines +77 to +78
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Remove real-looking AWS credentials

These lines contain hard-coded access keys that triggered gitleaks:

-e AWS_ACCESS_KEY_ID=5MV45J9NF5TEFZWYCRAX
-e AWS_SECRET_ACCESS_KEY=7xMqAiAHsf2UUjMH+EwICXlyJL9TO30m8leEaDsL

Even if they are fictitious, publishing realistic-length secrets teaches bad practice and may be blocked by automated scanners. Replace with unmistakable placeholders, e.g.:

- -e AWS_ACCESS_KEY_ID=5MV45J9NF5TEFZWYCRAX
- -e AWS_SECRET_ACCESS_KEY=7xMqAiAHsf2UUjMH+EwICXlyJL9TO30m8leEaDsL
+ -e AWS_ACCESS_KEY_ID=<YOUR_AWS_ACCESS_KEY_ID>
+ -e AWS_SECRET_ACCESS_KEY=<YOUR_AWS_SECRET_ACCESS_KEY>
🧰 Tools
🪛 Gitleaks (8.27.2)

78-78: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

🤖 Prompt for AI Agents
In self-hosting/methods/docker-aio.mdx at lines 77 to 78, the AWS credentials
are hard-coded with realistic-looking values, which can trigger security
scanners like gitleaks. Replace these values with clear placeholder text such as
AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY_ID and
AWS_SECRET_ACCESS_KEY=YOUR_SECRET_ACCESS_KEY to avoid exposing sensitive
information and to follow best practices.

-e AWS_S3_BUCKET_NAME=plane-app \
-e AWS_S3_ENDPOINT_URL=http://${MYIP}:19000 \
-e FILE_SIZE_LIMIT=10485760 \
plane-aio-commercial:latest
```

2. Once it's running, you can access the Plane application on the domain you provided during the deployment.

## Volume mounts

### Recommended persistent volumes
```bash
-v /path/to/logs:/app/logs \
-v /path/to/data:/app/data
```

### Workspace license DB
```bash
-v /path/to/monitordb:/app/monitor
```

### SSL certificate support
For HTTPS support, mount certificates:
```bash
-v /path/to/certs:/app/email/tls
```

## Environment variables (optional)

### Network and Protocol
- `SITE_ADDRESS`: Server bind address (default: `:80`)
- `APP_PROTOCOL`: Protocol to use (`http` or `https`, default: `http`)

### Email configuration
- `INTAKE_EMAIL_DOMAIN`: Domain for intake emails (default: `intake.<DOMAIN_NAME>`)
- `LISTEN_SMTP_PORT_25`: SMTP port 25 mapping (default: `20025`)
- `LISTEN_SMTP_PORT_465`: SMTP port 465 mapping (default: `20465`)
- `LISTEN_SMTP_PORT_587`: SMTP port 587 mapping (default: `20587`)
- `SMTP_DOMAIN`: SMTP server domain (default: `0.0.0.0`)
- `TLS_CERT_PATH`: Path to TLS certificate file (optional)
- `TLS_PRIV_KEY_PATH`: Path to TLS private key file (optional)

### Security and secrets
- `MACHINE_SIGNATURE`: Unique machine identifier (auto-generated if not provided)
- `SECRET_KEY`: Django secret key (default provided)
- `SILO_HMAC_SECRET_KEY`: Silo HMAC secret (default provided)
- `AES_SECRET_KEY`: AES encryption key (default provided)
- `LIVE_SERVER_SECRET_KEY`: Live server secret (default provided)

Comment on lines +123 to +127
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Warn readers to rotate default secrets

The doc states “default provided” for SECRET_KEY, SILO_HMAC_SECRET_KEY, etc. Strongly advise users to set their own values; otherwise many installations will share identical secrets, undermining security. Add an explicit call-out or <Warning> block instructing them to override every secret in production.

🤖 Prompt for AI Agents
In self-hosting/methods/docker-aio.mdx around lines 123 to 127, the
documentation lists default secret keys without warning users to change them.
Add a clear warning or <Warning> block emphasizing that users must replace all
default secret keys like SECRET_KEY, SILO_HMAC_SECRET_KEY, AES_SECRET_KEY, and
LIVE_SERVER_SECRET_KEY with unique values in production to avoid security risks
from shared secrets.

### File handling
- `FILE_SIZE_LIMIT`: Maximum file upload size in bytes (default: `5242880` = 5MB)

### Integration callbacks
- `INTEGRATION_CALLBACK_BASE_URL`: Base URL for OAuth callbacks

### API configuration
- `API_KEY_RATE_LIMIT`: API key rate limit (default: `60/minute`)

### Third-party integrations
- `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET`: GitHub integration
- `GITHUB_APP_NAME`, `GITHUB_APP_ID`, `GITHUB_PRIVATE_KEY`: GitHub App integration
- `SLACK_CLIENT_ID`, `SLACK_CLIENT_SECRET`: Slack integration
- `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET`: GitLab integration

## Build the image

To build the AIO image yourself:

```bash
cd deploy/aio/commercial
./build.sh --release=v1.11.1
```

Available build options:
- `--release`: Plane version to build (required)
- `--image-name`: Custom image name (default: `plane-aio-commercial`)

## Troubleshoot
The container will validate required environment variables on startup and display helpful error messages if any are missing.

### Logs
All service logs are available in `/app/logs/`:
- Access logs: `/app/logs/access/`
- Error logs: `/app/logs/error/`

### Health checks
The container runs multiple services managed by Supervisor. Check service status:
```bash
docker exec -it <container-name> supervisorctl status
```

## Production considerations

- Use proper SSL certificates for HTTPS
- Configure proper backup strategies for data
- Monitor resource usage and scale accordingly
- Use external load balancer for high availability
- Regularly update to latest versions
- Secure your environment variables and secrets