makeplane / plane

🔥 🔥 🔥 Open Source JIRA, Linear, Monday, and Asana Alternative. Plane helps you track your issues, epics, and product roadmaps in the simplest way possible.
http://plane.so
GNU Affero General Public License v3.0
30.22k stars 1.68k forks source link

[feature]: Portainer support #966

Open vastamaki opened 1 year ago

vastamaki commented 1 year ago

Is there an existing issue for this?

Summary

Currently, it's not possible to install a Plane using Portainer (https://www.portainer.io/) at least easily.

I believe adding docker-compose support without requiring any installation would solve the issue.

Why should this be worked on?

Portainer is a really popular tool with 1B+ pulls in Docker Hub. It's a tool for managing containers and would help people (including me) to host this more easily.

Quadrubo commented 1 year ago

see #736

rhea0110 commented 1 year ago

Hey @vastamaki, thank you for your valuable suggestion. We have already planned to implement it, and we will keep you updated on the progress.

Thank you!

MrGreenDev commented 2 months ago

for anyone interested, this Portainer stack has worked for me: (Plane will launch at http://localhost:3003/, or otherwise set NGINX_PORT to the port of your choice)

services:
  web:
    env_file:
      - stack.env
    image: makeplane/plane-frontend:stable
    pull_policy: if_not_present
    restart: unless-stopped
    command: node web/server.js web
    healthcheck:
      test: wget --no-verbose --tries=1 --spider http://web:3000
    depends_on:
      - api
      - worker

  space:
    env_file:
      - stack.env
    image: makeplane/plane-space:stable
    command: node space/server.js space
    pull_policy: if_not_present
    restart: on-failure:5
    depends_on:
      api:
        condition: service_healthy
      worker:
        condition: service_started
      web:
        condition: service_healthy    

  admin:
    env_file:
      - stack.env
    image: makeplane/plane-admin:stable
    pull_policy: if_not_present
    restart: on-failure:5
    command: node admin/server.js admin
    depends_on:
      - api
      - web

  api:
    env_file:
      - stack.env
    image: makeplane/plane-backend:stable
    pull_policy: if_not_present
    command: ./bin/docker-entrypoint-api.sh
    restart: on-failure:5
    healthcheck:
      test: wget --no-verbose --tries=1 --spider http://api:8000
      timeout: 45s
      interval: 10s
      retries: 10
    volumes:
      - logs_api:/code/plane/logs:rw
    depends_on:
      plane-redis:
        condition: service_healthy
      plane-db:
        condition: service_healthy

  worker:
    env_file:
      - stack.env
    image: makeplane/plane-backend:stable
    pull_policy: if_not_present
    command: ./bin/docker-entrypoint-worker.sh
    restart: on-failure:5
    volumes:
      - logs_worker:/code/plane/logs:rw
    depends_on:
      plane-redis:
        condition: service_healthy
      plane-db:
        condition: service_healthy
      api:
        condition: service_healthy

  beat-worker:
    env_file:
      - stack.env
    image: makeplane/plane-backend:stable
    pull_policy: if_not_present
    command: ./bin/docker-entrypoint-beat.sh
    restart: on-failure:5
    volumes:
      - logs_beat-worker:/code/plane/logs
    depends_on:
      plane-redis:
        condition: service_healthy
      plane-db:
        condition: service_healthy
      api:
        condition: service_healthy

  migrator:
    env_file:
      - stack.env
    image: makeplane/plane-backend:stable
    pull_policy: if_not_present
    restart: no
    command: ./bin/docker-entrypoint-migrator.sh
    volumes:
      - logs_migrator:/code/plane/logs:rw
    depends_on:
      plane-redis:
        condition: service_healthy
      plane-db:
        condition: service_healthy

  plane-db:
    env_file:
      - stack.env
    image: postgres:16
    pull_policy: if_not_present
    command: postgres -c 'max_connections=1000'
    restart: on-failure:5
    healthcheck:
      test: ["CMD", "pg_isready", "-q", "-d", "${PGDATABASE}", "-U", "${POSTGRES_USER}"]
      timeout: 45s
      interval: 10s
      retries: 10
    volumes:
      - pgdata:/var/lib/postgresql/data:rw

  plane-redis:
    env_file:
      - stack.env
    image: redis:7
    pull_policy: if_not_present
    restart: on-failure:5
    mem_limit: 256m
    mem_reservation: 50m
    read_only: true
    healthcheck:
      test: ["CMD", "redis-cli","ping"]
      timeout: 45s
      interval: 10s
      retries: 10
    volumes:
      - redisdata:/data:rw

  plane-minio:
    env_file:
      - stack.env
    image: minio/minio:latest
    pull_policy: if_not_present
    restart: on-failure:5
    command: server /export --console-address ":9090"
    healthcheck:
      test: ["CMD", "mc", "ready", "local"]
      interval: 5s
      timeout: 5s
      retries: 5
    environment:
      MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID}
      MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY}
    volumes:
      - uploads:/export:rw

  # Comment this if you already have a reverse proxy running
  proxy:
    env_file:
      - stack.env
    image: makeplane/plane-proxy:stable
    pull_policy: if_not_present
    ports:
      - ${NGINX_PORT}:80
    environment:
      FILE_SIZE_LIMIT: ${FILE_SIZE_LIMIT}
      BUCKET_NAME: ${AWS_S3_BUCKET_NAME}
    depends_on:      
      api:
        condition: service_started
      web:
        condition: service_healthy
      space:
        condition: service_started

volumes:
  pgdata:
  redisdata:
  uploads:
  logs_api:
  logs_worker:
  logs_beat-worker:
  logs_migrator:

Environment variables:

APP_RELEASE=stable
WEB_REPLICAS=1
SPACE_REPLICAS=1
ADMIN_REPLICAS=1
API_REPLICAS=1
NGINX_PORT=3003
WEB_URL=http://localhost
DEBUG=0
SENTRY_DSN=
SENTRY_ENVIRONMENT=production
CORS_ALLOWED_ORIGINS=http://localhost
PGHOST=plane-db
PGDATABASE=plane
POSTGRES_USER=plane
POSTGRES_PASSWORD=plane
POSTGRES_DB=plane
POSTGRES_PORT=5432
PGDATA=/var/lib/postgresql/data
DATABASE_URL=
REDIS_HOST=plane-redis
REDIS_PORT=6379
REDIS_URL=redis://plane-redis:6379
SECRET_KEY=60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5
USE_MINIO=1
AWS_REGION=
AWS_ACCESS_KEY_ID=access-key
AWS_SECRET_ACCESS_KEY=secret-key
AWS_S3_ENDPOINT_URL=http://plane-minio:9000
AWS_S3_BUCKET_NAME=uploads
MINIO_ROOT_USER=access-key
MINIO_ROOT_PASSWORD=secret-key
BUCKET_NAME=uploads
FILE_SIZE_LIMIT=5242880
GUNICORN_WORKERS=1