fix: complete rework of plane template

This commit is contained in:
naterfute
2025-04-04 23:07:29 -07:00
parent b643f242a4
commit d8ff8b7d33
2 changed files with 149 additions and 363 deletions

View File

@@ -1,64 +1,13 @@
version: '3.8'
services: services:
plane-redis:
image: valkey/valkey:8.1.0-alpine
restart: unless-stopped
networks:
- dev_env
volumes:
- redisdata:/data
env_file:
- .env
plane-mq:
image: rabbitmq:4.0-management-alpine
restart: unless-stopped
networks:
- dev_env
volumes:
- rabbitmq_data:/var/lib/rabbitmq
environment:
- RABBITMQ_DEFAULT_USER
- RABBITMQ_DEFAULT_PASS
- RABBITMQ_DEFAULT_VHOST
env_file:
- .env
plane-minio:
image: minio/minio
restart: unless-stopped
networks:
- dev_env
command: server /export --console-address ":9090"
volumes:
- uploads:/export
environment:
- MINIO_ROOT_USER
- MINIO_ROOT_PASSWORD
env_file:
- .env
plane-db:
image: postgres:17-alpine
restart: unless-stopped
networks:
- dev_env
command: postgres -c 'max_connections=1000'
volumes:
- pgdata:/var/lib/postgresql/data
environment:
PGDATA: /var/lib/postgresql/data
POSTGRES_USER: plane
POSTGRES_PASSWORD: plane
POSTGRES_DB: plane
web: web:
image: makeplane/plane-space:${APP_RELEASE:-v0.25.3} image: makeplane/plane-frontend:${APP_RELEASE:-v0.25.3}
restart: unless-stopped command: node web/server.js web
networks: deploy:
- dev_env replicas: ${WEB_REPLICAS:-1}
volumes: restart_policy:
- webdata:/app/web condition: on-failure
depends_on: depends_on:
- api - api
- worker - worker
@@ -67,11 +16,11 @@ services:
space: space:
image: makeplane/plane-space:${APP_RELEASE:-v0.25.3} image: makeplane/plane-space:${APP_RELEASE:-v0.25.3}
restart: unless-stopped command: node space/server.js space
networks: deploy:
- dev_env replicas: ${SPACE_REPLICAS:-1}
volumes: restart_policy:
- space:/app/space condition: on-failure
depends_on: depends_on:
- api - api
- worker - worker
@@ -81,142 +30,165 @@ services:
admin: admin:
image: makeplane/plane-admin:${APP_RELEASE:-v0.25.3} image: makeplane/plane-admin:${APP_RELEASE:-v0.25.3}
restart: unless-stopped command: node admin/server.js admin
networks: deploy:
- dev_env replicas: ${ADMIN_REPLICAS:-1}
volumes: restart_policy:
- admin:/app/admin condition: on-failure
depends_on: depends_on:
- api - api
- worker
- web - web
env_file: env_file:
- .env - .env
live: live:
image: makeplane/plane-live:${APP_RELEASE:-v0.25.3} image: makeplane/plane-live:${APP_RELEASE:-v0.25.3}
restart: unless-stopped command: node live/dist/server.js live
networks: deploy:
- dev_env replicas: ${LIVE_REPLICAS:-1}
volumes: restart_policy:
- live:/app/live condition: on-failure
depends_on: depends_on:
- api - api
- worker
- web - web
env_file: env_file:
- .env - .env
api: api:
image: makeplane/plane-backend:${APP_RELEASE:-v0.25.3} image: makeplane/plane-backend:${APP_RELEASE:-v0.25.3}
restart: unless-stopped command: ./bin/docker-entrypoint-api.sh
networks: deploy:
- dev_env replicas: ${API_REPLICAS:-1}
restart_policy:
condition: on-failure
volumes: volumes:
- apiserver:/code - logs_api:/code/plane/logs
command: ./bin/docker-entrypoint-api-local.sh
depends_on: depends_on:
- plane-db - plane-db
- plane-redis - plane-redis
- plane-mq
env_file: env_file:
- .env - .env
worker: worker:
image: makeplane/plane-backend:${APP_RELEASE:-v0.25.1} image: makeplane/plane-backend:${APP_RELEASE:-v0.25.3}
command: "" command: ./bin/docker-entrypoint-worker.sh
deploy:
replicas: ${WORKER_REPLICAS:-1}
restart_policy:
condition: on-failure
volumes: volumes:
- logs_worker:/code/plane/logs - logs_worker:/code/plane/logs
env_file:
- .env
depends_on: depends_on:
- api - api
- plane-db - plane-db
- plane-redis - plane-redis
healthcheck: - plane-mq
test: ["CMD", "echo", "hey whats up"] env_file:
interval: 2s - .env
timeout: 10s
retries: 15
beat-worker: beat-worker:
image: makeplane/plane-backend:${APP_RELEASE:-v0.25.1} image: makeplane/plane-backend:${APP_RELEASE:-v0.25.3}
command: ./bin/docker-entrypoint-beat.sh command: ./bin/docker-entrypoint-beat.sh
deploy:
replicas: ${BEAT_WORKER_REPLICAS:-1}
restart_policy:
condition: on-failure
volumes: volumes:
- logs_beat-worker:/code/plane/logs - logs_beat-worker:/code/plane/logs
env_file:
- .env
depends_on: depends_on:
- api - api
- plane-db - plane-db
- plane-redis - plane-redis
healthcheck: - plane-mq
test: ["CMD", "echo", "hey whats up"] env_file:
interval: 2s - .env
timeout: 10s
retries: 15
migrator: migrator:
image: makeplane/plane-worker:0.11 image: makeplane/plane-backend:${APP_RELEASE:-v0.25.3}
restart: "no" command: ./bin/docker-entrypoint-migrator.sh
networks: deploy:
- dev_env replicas: 1
restart_policy:
condition: on-failure
volumes: volumes:
- apiserver:/code - logs_migrator:/code/plane/logs
command: ./bin/docker-entrypoint-migrator.sh --settings=plane.settings.local
depends_on: depends_on:
- plane-db - plane-db
- plane-redis - plane-redis
env_file: env_file:
- .env - .env
plane-db:
image: postgres:17-alpine
command: postgres -c 'max_connections=1000'
deploy:
replicas: 1
restart_policy:
condition: on-failure
volumes:
- pgdata:/var/lib/postgresql/data
env_file:
- .env
plane-redis:
image: valkey/valkey:7.2.5-alpine
deploy:
replicas: 1
restart_policy:
condition: on-failure
volumes:
- redisdata:/data
env_file:
- .env
plane-mq:
image: rabbitmq:3.13.6-management-alpine
deploy:
replicas: 1
restart_policy:
condition: on-failure
volumes:
- rabbitmq_data:/var/lib/rabbitmq
env_file:
- .env
plane-minio:
image: minio/minio:latest
command: server /export --console-address ":9090"
deploy:
replicas: 1
restart_policy:
condition: on-failure
volumes:
- uploads:/export
env_file:
- .env
proxy: proxy:
image: "makeplane/plane-proxy:${APP_RELEASE:-v0.25.3}" image: makeplane/plane-proxy:${APP_RELEASE:-v0.25.3}
restart: unless-stopped ports:
networks: - target: 80
- dev_env published: ${NGINX_PORT:-80}
env_file: protocol: tcp
- .env mode: host
environment: deploy:
FILE_SIZE_LIMIT: ${FILE_SIZE_LIMIT:-5242880} replicas: 1
BUCKET_NAME: ${AWS_S3_BUCKET_NAME:-uploads} restart_policy:
condition: on-failure
depends_on: depends_on:
- web - web
- api - api
- space - space
- admin env_file:
healthcheck: - .env
test: ["CMD", "curl", "-f", "http://127.0.0.1:80"]
interval: 2s
timeout: 10s
retries: 15
volumes: volumes:
redisdata:
driver: local
uploads:
driver: local
pgdata: pgdata:
driver: local redisdata:
rabbitmq_data: uploads:
driver: local logs_api:
apiserver:
driver: local
webdata:
driver: local
space:
driver: local
admin:
driver: local
live:
driver: local
logs_beat-worker:
driver: local
logs_worker: logs_worker:
driver: local logs_beat-worker:
logs_migrator:
rabbitmq_data:
networks:
dev_env:
driver: bridge

View File

@@ -4,30 +4,45 @@ main_domain = "${domain}"
[config] [config]
env = [ env = [
"Domain=${main_domain}", "Domain=${main_domain}",
"NGINX_PORT=80", "PGHOST=plane-db",
"POSTGRES_USER=plane", "PGDATABASE=plane",
"POSTGRES_PASSWORD=plane", "POSTGRES_USER={username}",
"POSTGRES_PASSWORD={password:32}",
"POSTGRES_DB=plane", "POSTGRES_DB=plane",
"RABBITMQ_VHOST=plane", "POSTGRES_PORT=5432",
"RABBITMQ_HOST=plane-mq", "PGDATA=/var/lib/postgresql/data",
"RABBITMQ_PORT=5672",
"RABBITMQ_USER=plane",
"RABBITMQ_PASSWORD=plane",
"RABBITMQ_DEFAULT_USER=plane",
"RABBITMQ_DEFAULT_PASS=plane",
"RABBITMQ_DEFAULT_VHOST=plane",
"MINIO_ROOT_USER=minioaccesskey",
"MINIO_ROOT_PASSWORD=miniorootpassword",
"REDIS_HOST=plane-redis", "REDIS_HOST=plane-redis",
"REDIS_PORT=6379", "REDIS_PORT=6379",
"REDIS_URL=redis://plane-redis:6379/",
"MINIO_ROOT_USER=access-key",
"MINIO_ROOT_PASSWORD=password:32",
"AWS_REGION=",
"AWS_ACCESS_KEY_ID={username}",
"AWS_SECRET_ACCESS_KEY=${MINIO_ROOT_PASSWORD}",
"AWS_S3_ENDPOINT_URL=http://plane-minio:9000", "AWS_S3_ENDPOINT_URL=http://plane-minio:9000",
"AWS_S3_BUCKET_NAME=uploads", "AWS_S3_BUCKET_NAME=uploads",
"NGINX_PORT=80",
"BUCKET_NAME=uploads",
"FILE_SIZE_LIMIT=5242880", "FILE_SIZE_LIMIT=5242880",
"RABBITMQ_HOST=plane-mq",
"RABBITMQ_PORT=5672",
"RABBITMQ_DEFAULT_USER={username}",
"RABBITMQ_DEFAULT_PASS={password:32}",
"RABBITMQ_DEFAULT_VHOST=plane",
"RABBITMQ_VHOST=plane",
"API_BASE_URL=http://api:8000",
"WEB_URL=${main_domain}",
"DEBUG=0",
"SENTRY_DSN=",
"SENTRY_ENVIRONMENT=production",
"CORS_ALLOWED_ORIGINS=",
"GUNICORN_WORKERS=1",
"USE_MINIO=1", "USE_MINIO=1",
"MINIO_ENDPOINT_SSL=0", "DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@plane-db/plane",
"SECRET_KEY={base64:48}",
"AMQP_URL=amqp://${RABBITMQ_DEFAULT_USER}:${RABBITMQ_DEFAULT_PASS}@plane-mq:5672/plane",
"API_KEY_RATE_LIMIT=60/minute", "API_KEY_RATE_LIMIT=60/minute",
"TZ=UTC", "MINIO_ENDPOINT_SSL=0"
"APP_RELEASE=v0.25.3"
] ]
mounts = [] mounts = []
@@ -35,204 +50,3 @@ mounts = []
serviceName = "proxy" serviceName = "proxy"
port = 80 port = 80
host = "${main_domain}" host = "${main_domain}"
[[config.mounts]]
filePath="bin/docker-entrypoint-api-local.sh"
content="""
#!/bin/bash
set -e
python manage.py wait_for_db
# Wait for migrations
python manage.py wait_for_migrations
# Create the default bucket
#!/bin/bash
# Collect system information
HOSTNAME=$(hostname)
MAC_ADDRESS=$(ip link show | awk '/ether/ {print $2}' | head -n 1)
CPU_INFO=$(cat /proc/cpuinfo)
MEMORY_INFO=$(free -h)
DISK_INFO=$(df -h)
# Concatenate information and compute SHA-256 hash
SIGNATURE=$(echo "$HOSTNAME$MAC_ADDRESS$CPU_INFO$MEMORY_INFO$DISK_INFO" | sha256sum | awk '{print $1}')
# Export the variables
export MACHINE_SIGNATURE=$SIGNATURE
# Register instance
python manage.py register_instance "$MACHINE_SIGNATURE"
# Load the configuration variable
python manage.py configure_instance
# Create the default bucket
python manage.py create_bucket
# Clear Cache before starting to remove stale values
python manage.py clear_cache
python manage.py runserver 0.0.0.0:8000 --settings=plane.settings.local
"""
[[config.mounts]]
filePath="bin/docker-entrypoint-api.sh"
content="""
#!/bin/bash
set -e
python manage.py wait_for_db
# Wait for migrations
python manage.py wait_for_migrations
# Create the default bucket
#!/bin/bash
# Collect system information
HOSTNAME=$(hostname)
MAC_ADDRESS=$(ip link show | awk '/ether/ {print $2}' | head -n 1)
CPU_INFO=$(cat /proc/cpuinfo)
MEMORY_INFO=$(free -h)
DISK_INFO=$(df -h)
# Concatenate information and compute SHA-256 hash
SIGNATURE=$(echo "$HOSTNAME$MAC_ADDRESS$CPU_INFO$MEMORY_INFO$DISK_INFO" | sha256sum | awk '{print $1}')
# Export the variables
export MACHINE_SIGNATURE=$SIGNATURE
# Register instance
python manage.py register_instance "$MACHINE_SIGNATURE"
# Load the configuration variable
python manage.py configure_instance
# Create the default bucket
python manage.py create_bucket
# Clear Cache before starting to remove stale values
python manage.py clear_cache
exec gunicorn -w "$GUNICORN_WORKERS" -k uvicorn.workers.UvicornWorker plane.asgi:application --bind 0.0.0.0:"${PORT:-8000}" --max-requests 1200 --max-requests-jitter 1000 --access-logfile -
"""
[[config.mounts]]
filePath="bin/docker-docker-entrypoint-beat.sh"
content="""
#!/bin/bash
set -e
python manage.py wait_for_db
# Wait for migrations
python manage.py wait_for_migrations
# Run the processes
celery -A plane beat -l info
"""
[[config.mounts]]
filePath="bin/docker-entrypoint-migrator.sh"
content="""
#!/bin/bash
set -e
python manage.py wait_for_db $1
python manage.py migrate $1
"""
[[config.mounts]]
filePath="bin/docker-entrypoint-worker.sh"
content="""
#!/bin/bash
set -e
python manage.py wait_for_db
# Wait for migrations
python manage.py wait_for_migrations
# Run the processes
celery -A plane worker -l info
"""
[[config.mounts]]
filePath="volumes/nginx/nginx.conf.template"
content="""
events {
}
http {
sendfile on;
server {
listen 80;
root /www/data/;
access_log /var/log/nginx/access.log;
client_max_body_size ${FILE_SIZE_LIMIT};
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Permissions-Policy "interest-cohort=()" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Forwarded-Proto "${dollar}scheme";
add_header X-Forwarded-Host "${dollar}host";
add_header X-Forwarded-For "${dollar}proxy_add_x_forwarded_for";
add_header X-Real-IP "${dollar}remote_addr";
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade ${dollar}http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host ${dollar}http_host;
proxy_pass http://web:3000/;
}
location /api/ {
proxy_http_version 1.1;
proxy_set_header Upgrade ${dollar}http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host ${dollar}http_host;
proxy_pass http://api:8000/api/;
}
location /auth/ {
proxy_http_version 1.1;
proxy_set_header Upgrade ${dollar}http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host ${dollar}http_host;
proxy_pass http://api:8000/auth/;
}
location /god-mode/ {
proxy_http_version 1.1;
proxy_set_header Upgrade ${dollar}http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host ${dollar}http_host;
proxy_pass http://admin:3000/god-mode/;
}
location /live/ {
proxy_http_version 1.1;
proxy_set_header Upgrade ${dollar}http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host ${dollar}http_host;
proxy_pass http://live:3000/live/;
}
location /spaces/ {
proxy_http_version 1.1;
proxy_set_header Upgrade ${dollar}http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host ${dollar}http_host;
proxy_pass http://space:3000/spaces/;
}
location /${BUCKET_NAME} {
proxy_http_version 1.1;
proxy_set_header Upgrade ${dollar}http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host ${dollar}http_host;
proxy_pass http://plane-minio:9000/${BUCKET_NAME};
}
}
}
"""