|
| 1 | +--- |
| 2 | +title: Docker AIO (All-in-One) • Commercial Edition |
| 3 | +sidebarTitle: Docker AIO |
| 4 | +--- |
| 5 | + |
| 6 | +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. |
| 7 | + |
| 8 | +## What's included |
| 9 | + |
| 10 | +Your single AIO container includes all these services running together: |
| 11 | + |
| 12 | +- **Web App** (Port 3001) - The main Plane web interface you'll use |
| 13 | +- **Space** (Port 3002) - Public project spaces for external collaboration |
| 14 | +- **Admin** (Port 3003) - Administrative interface |
| 15 | +- **API Server** (Port 3004) - Backend API |
| 16 | +- **Live Server** (Port 3005) - Real-time collaboration features |
| 17 | +- **Silo** (Port 3006) - Integration services |
| 18 | +- **Monitor** (Port 3007) - Feature flags and payments |
| 19 | +- **Email Server** (Ports 10025, 10465, 10587) - SMTP server for notifications |
| 20 | +- **Proxy** (Port 80, 20025, 20465, 20587) - Caddy reverse proxy |
| 21 | +- **Worker and Beat Worker** - Background task processing |
| 22 | + |
| 23 | +## Prerequisites |
| 24 | + |
| 25 | +- [Docker](https://docs.docker.com/engine/) |
| 26 | +- Set up these external services: |
| 27 | + - *PostgreSQL* |
| 28 | + For data storage |
| 29 | + - *Redis* |
| 30 | + For caching and session management |
| 31 | + - *RabbitMQ* |
| 32 | + For message queuing |
| 33 | + - *S3-compatible storage* |
| 34 | + For file uploads (AWS S3 or MinIO) |
| 35 | + |
| 36 | +## Install Plane |
| 37 | + |
| 38 | +1. [Download the image] |
| 39 | + |
| 40 | +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. |
| 41 | + |
| 42 | + <Warning> |
| 43 | + All environment variables are required for the container to function correctly. |
| 44 | + </Warning> |
| 45 | + |
| 46 | + ```bash |
| 47 | + docker run --name plane-aio --rm -it \ |
| 48 | + -p 80:80 \ |
| 49 | + -p 20025:20025 \ |
| 50 | + -p 20465:20465 \ |
| 51 | + -p 20587:20587 \ |
| 52 | + -e DOMAIN_NAME=your-domain.com \ |
| 53 | + -e DATABASE_URL=postgresql://user:pass@host:port/database \ |
| 54 | + -e REDIS_URL=redis://host:port \ |
| 55 | + -e AMQP_URL=amqp://user:pass@host:port/vhost \ |
| 56 | + -e AWS_REGION=us-east-1 \ |
| 57 | + -e AWS_ACCESS_KEY_ID=your-access-key \ |
| 58 | + -e AWS_SECRET_ACCESS_KEY=your-secret-key \ |
| 59 | + -e AWS_S3_BUCKET_NAME=your-bucket \ |
| 60 | + plane-aio-commercial:latest |
| 61 | + ``` |
| 62 | + |
| 63 | + If you're running everything locally, use this example: |
| 64 | + |
| 65 | + ```bash |
| 66 | + MYIP=192.168.68.169 |
| 67 | + docker run --name myaio --rm -it \ |
| 68 | + -p 80:80 \ |
| 69 | + -p 20025:20025 \ |
| 70 | + -p 20465:20465 \ |
| 71 | + -p 20587:20587 \ |
| 72 | + -e DOMAIN_NAME=${MYIP} \ |
| 73 | + -e DATABASE_URL=postgresql://plane:plane@${MYIP}:15432/plane \ |
| 74 | + -e REDIS_URL=redis://${MYIP}:16379 \ |
| 75 | + -e AMQP_URL=amqp://plane:plane@${MYIP}:15673/plane \ |
| 76 | + -e AWS_REGION=us-east-1 \ |
| 77 | + -e AWS_ACCESS_KEY_ID=5MV45J9NF5TEFZWYCRAX \ |
| 78 | + -e AWS_SECRET_ACCESS_KEY=7xMqAiAHsf2UUjMH+EwICXlyJL9TO30m8leEaDsL \ |
| 79 | + -e AWS_S3_BUCKET_NAME=plane-app \ |
| 80 | + -e AWS_S3_ENDPOINT_URL=http://${MYIP}:19000 \ |
| 81 | + -e FILE_SIZE_LIMIT=10485760 \ |
| 82 | + plane-aio-commercial:latest |
| 83 | + ``` |
| 84 | + |
| 85 | +2. Once it's running, you can access the Plane application on the domain you provided during the deployment. |
| 86 | + |
| 87 | +## Volume mounts |
| 88 | + |
| 89 | +### Recommended persistent volumes |
| 90 | +```bash |
| 91 | +-v /path/to/logs:/app/logs \ |
| 92 | +-v /path/to/data:/app/data |
| 93 | +``` |
| 94 | + |
| 95 | +### Workspace license DB |
| 96 | +```bash |
| 97 | +-v /path/to/monitordb:/app/monitor |
| 98 | +``` |
| 99 | + |
| 100 | +### SSL certificate support |
| 101 | +For HTTPS support, mount certificates: |
| 102 | +```bash |
| 103 | +-v /path/to/certs:/app/email/tls |
| 104 | +``` |
| 105 | + |
| 106 | +## Environment variables (optional) |
| 107 | + |
| 108 | +### Network and Protocol |
| 109 | +- `SITE_ADDRESS`: Server bind address (default: `:80`) |
| 110 | +- `APP_PROTOCOL`: Protocol to use (`http` or `https`, default: `http`) |
| 111 | + |
| 112 | +### Email configuration |
| 113 | +- `INTAKE_EMAIL_DOMAIN`: Domain for intake emails (default: `intake.<DOMAIN_NAME>`) |
| 114 | +- `LISTEN_SMTP_PORT_25`: SMTP port 25 mapping (default: `20025`) |
| 115 | +- `LISTEN_SMTP_PORT_465`: SMTP port 465 mapping (default: `20465`) |
| 116 | +- `LISTEN_SMTP_PORT_587`: SMTP port 587 mapping (default: `20587`) |
| 117 | +- `SMTP_DOMAIN`: SMTP server domain (default: `0.0.0.0`) |
| 118 | +- `TLS_CERT_PATH`: Path to TLS certificate file (optional) |
| 119 | +- `TLS_PRIV_KEY_PATH`: Path to TLS private key file (optional) |
| 120 | + |
| 121 | +### Security and secrets |
| 122 | +- `MACHINE_SIGNATURE`: Unique machine identifier (auto-generated if not provided) |
| 123 | +- `SECRET_KEY`: Django secret key (default provided) |
| 124 | +- `SILO_HMAC_SECRET_KEY`: Silo HMAC secret (default provided) |
| 125 | +- `AES_SECRET_KEY`: AES encryption key (default provided) |
| 126 | +- `LIVE_SERVER_SECRET_KEY`: Live server secret (default provided) |
| 127 | + |
| 128 | +### File handling |
| 129 | +- `FILE_SIZE_LIMIT`: Maximum file upload size in bytes (default: `5242880` = 5MB) |
| 130 | + |
| 131 | +### Integration callbacks |
| 132 | +- `INTEGRATION_CALLBACK_BASE_URL`: Base URL for OAuth callbacks |
| 133 | + |
| 134 | +### API configuration |
| 135 | +- `API_KEY_RATE_LIMIT`: API key rate limit (default: `60/minute`) |
| 136 | + |
| 137 | +### Third-party integrations |
| 138 | +- `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET`: GitHub integration |
| 139 | +- `GITHUB_APP_NAME`, `GITHUB_APP_ID`, `GITHUB_PRIVATE_KEY`: GitHub App integration |
| 140 | +- `SLACK_CLIENT_ID`, `SLACK_CLIENT_SECRET`: Slack integration |
| 141 | +- `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET`: GitLab integration |
| 142 | + |
| 143 | +## Build the image |
| 144 | + |
| 145 | +To build the AIO image yourself: |
| 146 | + |
| 147 | +```bash |
| 148 | +cd deploy/aio/commercial |
| 149 | +./build.sh --release=v1.11.1 |
| 150 | +``` |
| 151 | + |
| 152 | +Available build options: |
| 153 | +- `--release`: Plane version to build (required) |
| 154 | +- `--image-name`: Custom image name (default: `plane-aio-commercial`) |
| 155 | + |
| 156 | +## Troubleshoot |
| 157 | +The container will validate required environment variables on startup and display helpful error messages if any are missing. |
| 158 | + |
| 159 | +### Logs |
| 160 | +All service logs are available in `/app/logs/`: |
| 161 | +- Access logs: `/app/logs/access/` |
| 162 | +- Error logs: `/app/logs/error/` |
| 163 | + |
| 164 | +### Health checks |
| 165 | +The container runs multiple services managed by Supervisor. Check service status: |
| 166 | +```bash |
| 167 | +docker exec -it <container-name> supervisorctl status |
| 168 | +``` |
| 169 | + |
| 170 | +## Production considerations |
| 171 | + |
| 172 | +- Use proper SSL certificates for HTTPS |
| 173 | +- Configure proper backup strategies for data |
| 174 | +- Monitor resource usage and scale accordingly |
| 175 | +- Use external load balancer for high availability |
| 176 | +- Regularly update to latest versions |
| 177 | +- Secure your environment variables and secrets |
0 commit comments