From 6c0c9d2edfd11abf6562a5c8c1c582fa190d8e91 Mon Sep 17 00:00:00 2001 From: Rishi Ghan Date: Wed, 31 Dec 2025 00:34:11 -0500 Subject: [PATCH] =?UTF-8?q?=E2=9C=88=20Added=20plane,=20removed=20npm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 90 +++++-------------- stacks/plane/README.md | 51 +++++++++++ stacks/plane/docker-compose.yml | 147 ++++++++++++++++++++++++++++++++ stacks/plane/stack.env | 5 ++ 4 files changed, 224 insertions(+), 69 deletions(-) create mode 100644 stacks/plane/README.md create mode 100644 stacks/plane/docker-compose.yml create mode 100644 stacks/plane/stack.env diff --git a/README.md b/README.md index 22c15f6..9302b7b 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,22 @@ Docker Compose stacks for Flook (192.168.1.75) managed via Portainer. | Stack | Services | Port(s) | Description | |-------|----------|---------|-------------| | portainer | portainer | 9000 | Stack management | -| proxy | npm | 1880, 18443, 81 | Nginx Proxy Manager (CRITICAL) | | documents | paperless, paperless-db, paperless-redis, paperless-tika, paperless-gotenberg, onlyoffice | 8777, 8089, 4430 | Document management | | productivity | gitlab, vaultwarden, memos, mortis, freshrss | 8929, 4743, 5230, 5231, 8054 | Personal tools | | backup | borgmatic | - | Borg backup to chook | -| seafile | seafile, seadoc, mysql, redis, notification, md-server, seasearch | 8098, 8888, 8083, 8084, 4080 | File sync (migrated from VM) | -| outline | outline, postgres, redis | 3000 | Wiki (migrated from VM) | +| seafile | seafile, seadoc, mysql, redis, notification, md-server, seasearch | 8098, 8888, 8083, 8084, 4080 | File sync | +| outline | outline, postgres, redis | 3000 | Wiki | +| plane | plane, postgres, redis, minio, worker, beat-worker | 8082 | Project management | + +## External Services (qsrproxy - 192.168.1.72) + +| Service | Port(s) | Description | +|---------|---------|-------------| +| npm | 1880, 18443, 81 | Nginx Proxy Manager (CRITICAL) | +| prometheus | 9090 | Metrics collection | +| grafana | 3000 | Dashboards | +| alertmanager | 9093 | Alert routing | +| node-exporter | 9100 | System metrics | ## Deployment Order @@ -20,78 +30,20 @@ Docker Compose stacks for Flook (192.168.1.75) managed via Portainer. 2. `productivity` - GitLab, Vaultwarden, Memos, FreshRSS, Mortis 3. `documents` - Paperless, OnlyOffice 4. `backup` - Borgmatic -5. `proxy` - CRITICAL - deploy carefully, brief downtime expected -6. `seafile` - After migrating data from VM -7. `outline` - After migrating data from VM +5. `seafile` - File sync and collaboration +6. `outline` - Wiki +7. `plane` - Project management -## Migration Notes +## Seafile Notes -### Seafile Migration (from VM 192.168.1.112) +Seafile uses multiple compose files and cannot be deployed via Portainer git stack. Deploy from command line: -1. **Stop Seafile on VM:** ```bash -ssh rishi@192.168.1.112 -cd /opt/seafile && docker compose down +cd /mnt/user/appdata/seafile +docker compose up -d ``` -2. **Create directories on Flook:** -```bash -mkdir -p /mnt/user/appdata/seafile/{data,db-data,seadoc-data,seasearch-data} -``` - -3. **Copy data:** -```bash -rsync -avP rishi@192.168.1.112:~/seafile/data/ /mnt/user/appdata/seafile/data/ -rsync -avP rishi@192.168.1.112:~/seafile/db-data/ /mnt/user/appdata/seafile/db-data/ -``` - -4. **Copy seahub_settings.py:** -```bash -cp /mnt/user/data/flook-stacks/stacks/seafile/seahub_settings.py /mnt/user/appdata/seafile/ -``` - -5. **Deploy stack via Portainer** - -### Outline Migration (from VM 192.168.1.112) - -1. **Create directories on Flook:** -```bash -mkdir -p /mnt/user/appdata/outline/{postgres-data,redis} -``` - -2. **Export Postgres from VM:** -```bash -ssh rishi@192.168.1.112 -docker exec outline-postgres-1 pg_dump -U rishi outline > ~/outline_backup.sql -``` - -3. **Copy backup to Flook:** -```bash -scp rishi@192.168.1.112:~/outline_backup.sql /mnt/user/appdata/outline/ -``` - -4. **Deploy stack via Portainer** (this creates empty DB) - -5. **Stop outline container temporarily:** -```bash -docker stop outline -``` - -6. **Import data:** -```bash -docker exec -i outline-postgres psql -U rishi outline < /mnt/user/appdata/outline/outline_backup.sql -``` - -7. **Start outline:** -```bash -docker start outline -``` - -8. **Stop VM services after verification:** -```bash -ssh rishi@192.168.1.112 -cd ~/outline && docker compose down -``` +See `stacks/seafile/README.md` for full details. ## Repository diff --git a/stacks/plane/README.md b/stacks/plane/README.md new file mode 100644 index 0000000..3766d95 --- /dev/null +++ b/stacks/plane/README.md @@ -0,0 +1,51 @@ +# Plane + +Project management and issue tracking with kanban boards. + +## Deployment + +1. Create directories: +```bash +mkdir -p /mnt/user/appdata/plane/{db-data,redis-data,minio-data} +``` + +2. Deploy via Portainer git stack or: +```bash +cd /mnt/user/data/flook-stacks/stacks/plane +docker compose up -d +``` + +3. Wait for all services to start (may take a few minutes on first run) + +4. Access at `http://192.168.1.75:8082` or via NPM proxy + +## Services + +| Container | Description | +|-----------|-------------| +| plane-web | Frontend | +| plane-api | Backend API | +| plane-worker | Background jobs | +| plane-beat-worker | Scheduled tasks | +| plane-space | Public pages | +| plane-proxy | Nginx proxy | +| plane-db | PostgreSQL | +| plane-redis | Redis | +| plane-minio | S3-compatible storage | + +## NPM Proxy + +Add proxy host: +- Domain: `plane.rishighan.com` +- Forward: `192.168.1.75:8082` +- Enable SSL, force SSL, HTTP/2 + +## Volumes + +- `/mnt/user/appdata/plane/db-data` - PostgreSQL data +- `/mnt/user/appdata/plane/redis-data` - Redis data +- `/mnt/user/appdata/plane/minio-data` - File uploads + +## Default Login + +On first access, you'll create an admin account. diff --git a/stacks/plane/docker-compose.yml b/stacks/plane/docker-compose.yml new file mode 100644 index 0000000..1fceb6b --- /dev/null +++ b/stacks/plane/docker-compose.yml @@ -0,0 +1,147 @@ +networks: + plane-net: + name: plane-net + driver: bridge + +services: + plane-web: + image: makeplane/plane-frontend:stable + container_name: plane-web + restart: unless-stopped + environment: + - NEXT_PUBLIC_API_BASE_URL=http://plane-api:8000 + - NEXT_PUBLIC_DEPLOY_URL=https://plane.rishighan.com + depends_on: + - plane-api + networks: + - plane-net + + plane-api: + image: makeplane/plane-backend:stable + container_name: plane-api + restart: unless-stopped + environment: + - DEBUG=0 + - DJANGO_SETTINGS_MODULE=plane.settings.production + - DATABASE_URL=postgresql://plane:plane@plane-db:5432/plane + - REDIS_URL=redis://plane-redis:6379/ + - SECRET_KEY=${SECRET_KEY} + - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} + - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} + - AWS_S3_BUCKET_NAME=plane-uploads + - AWS_S3_ENDPOINT_URL=http://plane-minio:9000 + - USE_MINIO=1 + - MINIO_ROOT_USER=${MINIO_ROOT_USER} + - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD} + - WEB_URL=https://plane.rishighan.com + - CORS_ALLOWED_ORIGINS=https://plane.rishighan.com + depends_on: + - plane-db + - plane-redis + networks: + - plane-net + + plane-worker: + image: makeplane/plane-backend:stable + container_name: plane-worker + restart: unless-stopped + command: ./bin/worker + environment: + - DEBUG=0 + - DJANGO_SETTINGS_MODULE=plane.settings.production + - DATABASE_URL=postgresql://plane:plane@plane-db:5432/plane + - REDIS_URL=redis://plane-redis:6379/ + - SECRET_KEY=${SECRET_KEY} + - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} + - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} + - AWS_S3_BUCKET_NAME=plane-uploads + - AWS_S3_ENDPOINT_URL=http://plane-minio:9000 + - USE_MINIO=1 + depends_on: + - plane-db + - plane-redis + - plane-api + networks: + - plane-net + + plane-beat-worker: + image: makeplane/plane-backend:stable + container_name: plane-beat-worker + restart: unless-stopped + command: ./bin/beat + environment: + - DEBUG=0 + - DJANGO_SETTINGS_MODULE=plane.settings.production + - DATABASE_URL=postgresql://plane:plane@plane-db:5432/plane + - REDIS_URL=redis://plane-redis:6379/ + - SECRET_KEY=${SECRET_KEY} + depends_on: + - plane-db + - plane-redis + - plane-api + networks: + - plane-net + + plane-space: + image: makeplane/plane-space:stable + container_name: plane-space + restart: unless-stopped + environment: + - NEXT_PUBLIC_API_BASE_URL=http://plane-api:8000 + depends_on: + - plane-api + networks: + - plane-net + + plane-proxy: + image: makeplane/plane-proxy:stable + container_name: plane-proxy + restart: unless-stopped + ports: + - "8082:80" + environment: + - FILE_SIZE_LIMIT=5242880 + - BUCKET_NAME=plane-uploads + - MINIO_ROOT_USER=${MINIO_ROOT_USER} + - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD} + depends_on: + - plane-web + - plane-api + - plane-space + networks: + - plane-net + + plane-db: + image: postgres:15 + container_name: plane-db + restart: unless-stopped + environment: + - POSTGRES_USER=plane + - POSTGRES_PASSWORD=plane + - POSTGRES_DB=plane + volumes: + - /mnt/user/appdata/plane/db-data:/var/lib/postgresql/data + networks: + - plane-net + + plane-redis: + image: redis:7 + container_name: plane-redis + restart: unless-stopped + volumes: + - /mnt/user/appdata/plane/redis-data:/data + networks: + - plane-net + + plane-minio: + image: minio/minio + container_name: plane-minio + restart: unless-stopped + command: server /data --console-address ":9001" + environment: + - MINIO_ROOT_USER=${MINIO_ROOT_USER} + - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD} + volumes: + - /mnt/user/appdata/plane/minio-data:/data + networks: + - plane-net diff --git a/stacks/plane/stack.env b/stacks/plane/stack.env new file mode 100644 index 0000000..fa7669e --- /dev/null +++ b/stacks/plane/stack.env @@ -0,0 +1,5 @@ +SECRET_KEY=supersecretkey123456789abcdefghijklmnop +AWS_ACCESS_KEY_ID=plane +AWS_SECRET_ACCESS_KEY=planesecret123 +MINIO_ROOT_USER=plane +MINIO_ROOT_PASSWORD=planesecret123