Рефакторизация структуры кода для улучшения читаемости и удобства сопровождения.
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
# Использовать входящий X-Forwarded-Port, если установлено, иначе по умолчанию — 8762.
|
||||
map $http_x_forwarded_port $final_port {
|
||||
default $http_x_forwarded_port;
|
||||
"" 8762;
|
||||
}
|
||||
|
||||
map $http_x_forwarded_proto $final_proto {
|
||||
default $http_x_forwarded_proto;
|
||||
"" $scheme;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 8762;
|
||||
|
||||
# FILE_SIZE_LIMIT — байты в Plane env; nginx хочет размеры m/g.
|
||||
# 52428800 байт ≈ 50м
|
||||
client_max_body_size 50m;
|
||||
|
||||
port_in_redirect off;
|
||||
absolute_redirect off;
|
||||
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $final_proto;
|
||||
proxy_set_header X-Forwarded-Host $host;
|
||||
proxy_set_header X-Forwarded-Port $final_port;
|
||||
|
||||
location /spaces/ {
|
||||
proxy_pass http://plane_space_1:3000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Connection "";
|
||||
}
|
||||
|
||||
location /god-mode/ {
|
||||
proxy_pass http://plane_admin_1:3000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Connection "";
|
||||
}
|
||||
|
||||
location /live/ {
|
||||
proxy_pass http://plane_live_1:3000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Connection "";
|
||||
}
|
||||
|
||||
location /api/ {
|
||||
proxy_pass http://plane_api_1:8000;
|
||||
}
|
||||
|
||||
location /auth/ {
|
||||
proxy_pass http://plane_api_1:8000;
|
||||
}
|
||||
|
||||
location /uploads {
|
||||
proxy_pass http://plane-minio-1:9000;
|
||||
}
|
||||
|
||||
location / {
|
||||
proxy_pass http://plane_web_1:3000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Connection "";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
manifestVersion: 1.1
|
||||
id: plane
|
||||
category: files
|
||||
name: Plane
|
||||
version: "1.3.0"
|
||||
tagline: Современное управление проектами для всех команд
|
||||
description: >-
|
||||
Meet Plane — инструмент управления проектами с открытым исходным кодом, позволяющий отслеживать проблемы, запускать циклы спринтов и управлять дорожными картами продукта без хаоса, связанного с управлением самим инструментом. 🧘♀️
|
||||
|
||||
|
||||
🌟 Особенности
|
||||
- Проблемы Эффективно создавайте задачи и управляйте ими с помощью надежного редактора форматированного текста, поддерживающего загрузку файлов. Улучшите организацию и отслеживание, добавляя дочерние свойства и ссылаясь на связанные проблемы.
|
||||
- Cycles Поддерживайте темп своей команды с помощью Cycles. Легко отслеживайте прогресс с помощью диаграмм сгорания и других полезных инструментов.
|
||||
- Модули Упрощайте сложные проекты, разделяя их на более мелкие, управляемые модули.
|
||||
- Представления Настройте свой рабочий процесс, создав фильтры для отображения только наиболее актуальных проблем. Сохраняйте и делитесь этими взглядами с легкостью.
|
||||
- Страницы Сохраняйте и систематизируйте идеи с помощью Plane Pages с возможностями ИИ и редактором форматированного текста. Форматируйте текст, вставляйте изображения, добавляйте гиперссылки или преобразуйте свои заметки в полезные элементы.
|
||||
- Аналитика Получите доступ к аналитике в реальном времени по всем данным вашего самолета. Визуализируйте тенденции, устраняйте препятствия и продвигайте свои проекты вперед.
|
||||
|
||||
|
||||
Доступ к панели администратора Plane можно получить по адресу `umbrel.local:8762/god-mode`.
|
||||
developer: Plane Software Inc.
|
||||
website: http://plane.so/
|
||||
repo: https://github.com/makeplane/plane
|
||||
support: https://github.com/makeplane/plane/issues
|
||||
dependencies: []
|
||||
port: 8762
|
||||
gallery:
|
||||
- 1.jpg
|
||||
- 2.jpg
|
||||
- 3.jpg
|
||||
- 4.jpg
|
||||
- 5.jpg
|
||||
path: ""
|
||||
defaultUsername: ""
|
||||
defaultPassword: ""
|
||||
releaseNotes: ""
|
||||
torOnly: false
|
||||
submitter: al-lac
|
||||
submission: https://github.com/getumbrel/dfwebos-apps/pull/4126
|
||||
@@ -0,0 +1,222 @@
|
||||
version: "3.7"
|
||||
|
||||
x-environment: &env
|
||||
# ---- Внешние URL и порты ----
|
||||
NGINX_PORT: 8762
|
||||
LISTEN_HTTP_PORT: 8762
|
||||
|
||||
# ---- Имя сегмента, используемое внешним интерфейсом для путей /uploads ----
|
||||
BUCKET_NAME: uploads
|
||||
|
||||
# ---- API Рабочие ----
|
||||
GUNICORN_WORKERS: 2
|
||||
|
||||
# ---- База данных ----
|
||||
POSTGRES_DB: plane
|
||||
POSTGRES_USER: plane
|
||||
POSTGRES_PASSWORD: dfwebosplane
|
||||
DATABASE_URL: postgresql://plane:umbrelplane@plane_db_1:5432/plane
|
||||
|
||||
# ---- Кэш/брокер ----
|
||||
REDIS_URL: redis://plane_redis_1:6379/0
|
||||
RABBITMQ_DEFAULT_USER: plane
|
||||
RABBITMQ_DEFAULT_PASS: dfwebosplane
|
||||
RABBITMQ_DEFAULT_VHOST: plane
|
||||
CELERY_BROKER_URL: amqp://plane:umbrelplane@plane_rabbitmq_1:5672/plane
|
||||
|
||||
# ---- Объектное хранилище (MinIO; S3-совместимое) ----
|
||||
USE_MINIO: 1
|
||||
AWS_ACCESS_KEY_ID: dfwebos
|
||||
AWS_SECRET_ACCESS_KEY: $APP_PASSWORD
|
||||
AWS_S3_ENDPOINT_URL: http://plane-minio-1:9000
|
||||
AWS_S3_BUCKET_NAME: uploads
|
||||
FILE_SIZE_LIMIT: 52428800 # 50 MB
|
||||
MINIO_ENDPOINT_SSL: 0
|
||||
MINIO_ROOT_USER: dfwebos
|
||||
MINIO_ROOT_PASSWORD: $APP_PASSWORD
|
||||
|
||||
# ---- Джанго/приложение ----
|
||||
SECRET_KEY: $APP_SEED
|
||||
LIVE_SERVER_SECRET_KEY: $APP_SEED
|
||||
# необязательно, но часто помогает за прокси
|
||||
USE_X_FORWARDED_HOST: 1
|
||||
SECURE_SSL_REDIRECT: 0
|
||||
SESSION_COOKIE_SECURE: 0
|
||||
CSRF_COOKIE_SECURE: 0
|
||||
|
||||
services:
|
||||
app_proxy:
|
||||
environment:
|
||||
APP_HOST: plane_nginx_1
|
||||
APP_PORT: 8762
|
||||
PROXY_AUTH_ADD: "false"
|
||||
|
||||
nginx:
|
||||
image: nginx:alpine3.23@sha256:5616878291a2eed594aee8db4dade5878cf7edcb475e59193904b198d9b830de
|
||||
restart: on-failure
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/config/nginx.conf:/etc/nginx/conf.d/default.conf:ro
|
||||
depends_on:
|
||||
- web
|
||||
|
||||
db:
|
||||
image: postgres:17.9-alpine@sha256:778d0b486d6daa02b77434d0358ec57a1b21fd8b6d22ac2eef56a33e816928f6
|
||||
user: "1000:1000"
|
||||
restart: on-failure
|
||||
environment:
|
||||
<<: *env
|
||||
env_file:
|
||||
- ${APP_DATA_DIR}/settings.env
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/db:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
|
||||
redis:
|
||||
image: valkey/valkey:7.2.12-alpine@sha256:d0809f1d763f9fc3d77cd27e7c0393b1b0d69b6ad9269f932328b4793a620c78
|
||||
restart: on-failure
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/redis:/data
|
||||
|
||||
rabbitmq:
|
||||
image: rabbitmq:3.13.7-management-alpine@sha256:0c64ec4fc5596406d755dcca75e8a3b618192cc5fb69f8f0340f06290b1cc08c
|
||||
user: "1000:1000"
|
||||
restart: on-failure
|
||||
environment:
|
||||
<<: *env
|
||||
env_file:
|
||||
- ${APP_DATA_DIR}/settings.env
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/rabbitmq:/var/lib/rabbitmq
|
||||
|
||||
minio:
|
||||
image: alpine/minio:RELEASE.2025-10-15T17-29-55Z@sha256:cf23643a6cf9ce159c57643ceb88279e431262282428c9e0bf3a7ef1a97e84b4
|
||||
user: "1000:1000"
|
||||
restart: on-failure
|
||||
command: server /export --console-address ":8763"
|
||||
environment:
|
||||
<<: *env
|
||||
env_file:
|
||||
- ${APP_DATA_DIR}/settings.env
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/uploads:/export
|
||||
ports:
|
||||
- "8763:8763"
|
||||
# не удается подключиться, если имя содержит подчеркивание
|
||||
container_name: plane-minio-1
|
||||
|
||||
api:
|
||||
image: makeplane/plane-backend:v1.3.0@sha256:60fb33fa75b63594c1b0bb62b9e50e05f03bb0e46ef384c9eec177f2fb1aaf02
|
||||
user: "1000:1000"
|
||||
restart: on-failure
|
||||
environment:
|
||||
<<: *env
|
||||
env_file:
|
||||
- ${APP_DATA_DIR}/settings.env
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_started
|
||||
rabbitmq:
|
||||
condition: service_started
|
||||
|
||||
worker:
|
||||
image: makeplane/plane-backend:v1.3.0@sha256:60fb33fa75b63594c1b0bb62b9e50e05f03bb0e46ef384c9eec177f2fb1aaf02
|
||||
user: "1000:1000"
|
||||
restart: on-failure
|
||||
environment:
|
||||
<<: *env
|
||||
env_file:
|
||||
- ${APP_DATA_DIR}/settings.env
|
||||
depends_on:
|
||||
api:
|
||||
condition: service_started
|
||||
redis:
|
||||
condition: service_started
|
||||
rabbitmq:
|
||||
condition: service_started
|
||||
command: ["sh","-c","celery -A plane worker --loglevel=info"]
|
||||
|
||||
beat-worker:
|
||||
image: makeplane/plane-backend:v1.3.0@sha256:60fb33fa75b63594c1b0bb62b9e50e05f03bb0e46ef384c9eec177f2fb1aaf02
|
||||
user: "1000:1000"
|
||||
restart: on-failure
|
||||
environment:
|
||||
<<: *env
|
||||
env_file:
|
||||
- ${APP_DATA_DIR}/settings.env
|
||||
depends_on:
|
||||
api:
|
||||
condition: service_started
|
||||
redis:
|
||||
condition: service_started
|
||||
rabbitmq:
|
||||
condition: service_started
|
||||
migrator:
|
||||
condition: service_completed_successfully
|
||||
command: ["sh","-c","celery -A plane beat --loglevel=info"]
|
||||
|
||||
migrator:
|
||||
image: makeplane/plane-backend:v1.3.0@sha256:60fb33fa75b63594c1b0bb62b9e50e05f03bb0e46ef384c9eec177f2fb1aaf02
|
||||
user: "1000:1000"
|
||||
restart: on-failure
|
||||
environment:
|
||||
<<: *env
|
||||
env_file:
|
||||
- ${APP_DATA_DIR}/settings.env
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
command: ["sh","-c","python manage.py wait_for_db && python manage.py migrate"]
|
||||
|
||||
web:
|
||||
image: makeplane/plane-frontend:v1.3.0@sha256:5116ac06c2b5f8cc6b0dfd7638ce787b44302527dd3fa2b3e6889e52c4aff3d1
|
||||
restart: on-failure
|
||||
environment:
|
||||
<<: *env
|
||||
env_file:
|
||||
- ${APP_DATA_DIR}/settings.env
|
||||
depends_on:
|
||||
- api
|
||||
|
||||
live:
|
||||
image: makeplane/plane-live:v1.3.0@sha256:81ff136509a3069766c27c9f3489db7bfe37af8a8eab8869ee17ab948eeb83c3
|
||||
user: "1000:1000"
|
||||
restart: on-failure
|
||||
environment:
|
||||
<<: *env
|
||||
env_file:
|
||||
- ${APP_DATA_DIR}/settings.env
|
||||
depends_on:
|
||||
- api
|
||||
|
||||
space:
|
||||
image: makeplane/plane-space:v1.3.0@sha256:0964d53de83a7f2bcb9418dc157f3ede566a6ddad0774d8d2b10cd931b96fcea
|
||||
user: "1000:1000"
|
||||
restart: on-failure
|
||||
environment:
|
||||
<<: *env
|
||||
env_file:
|
||||
- ${APP_DATA_DIR}/settings.env
|
||||
depends_on:
|
||||
- api
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "node -e \"require('http').get('http://127.0.0.1:3000/', (r) => process.exit(r.statusCode < 500 ? 0 : 1)).on('error', () => process.exit(1))\""]
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
start_period: 10s
|
||||
retries: 3
|
||||
|
||||
admin:
|
||||
image: makeplane/plane-admin:v1.3.0@sha256:dd83ae5d61d592d0877e4ddda9eb32a3828f8b51d8efbc307806c34b9a48c0a2
|
||||
restart: on-failure
|
||||
environment:
|
||||
<<: *env
|
||||
env_file:
|
||||
- ${APP_DATA_DIR}/settings.env
|
||||
depends_on:
|
||||
- api
|
||||
Executable
+101
@@ -0,0 +1,101 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Этот сценарий проверяет файл среды на наличие значений-заполнителей и заменяет их системными переменными.
|
||||
|
||||
APP_DIR="$(readlink -f "$(dirname "${BASH_SOURCE[0]}")/..")"
|
||||
APP_DATA_DIR="$APP_DIR/data"
|
||||
DESIRED_OWNER="1000:1000"
|
||||
ENV_FILE="$APP_DIR/settings.env"
|
||||
|
||||
# Проверьте, существует ли файл
|
||||
if [ ! -f "$ENV_FILE" ]; then
|
||||
echo "Error: Environment file not found at $ENV_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Проверьте, установлено ли значение WEB_URL на "changeme".
|
||||
if grep -Eq '^WEB_URL= *changeme$' "$ENV_FILE"; then
|
||||
echo "Placeholder value for WEB_URL detected. Setting from DEVICE_DOMAIN_NAME..."
|
||||
|
||||
# Замените заполнитель доменным URL.
|
||||
sed -i -E 's|^WEB_URL= *changeme$|WEB_URL="http://'"${DEVICE_DOMAIN_NAME}"':8762"|' "$ENV_FILE"
|
||||
|
||||
echo "Updated WEB_URL in $ENV_FILE"
|
||||
else
|
||||
echo "WEB_URL is already set. No changes made."
|
||||
fi
|
||||
|
||||
# Проверьте, установлено ли значение API_BASE_URL на "changeme".
|
||||
if grep -Eq '^API_BASE_URL= *changeme$' "$ENV_FILE"; then
|
||||
echo "Placeholder value for API_BASE_URL detected. Setting from DEVICE_DOMAIN_NAME..."
|
||||
|
||||
# Замените заполнитель доменным URL.
|
||||
sed -i -E 's|^API_BASE_URL= *changeme$|API_BASE_URL="http://'"${DEVICE_DOMAIN_NAME}"':8762"|' "$ENV_FILE"
|
||||
|
||||
echo "Updated API_BASE_URL in $ENV_FILE"
|
||||
else
|
||||
echo "API_BASE_URL is already set. No changes made."
|
||||
fi
|
||||
|
||||
# Проверьте, установлено ли значение APP_DOMAIN на "changeme".
|
||||
if grep -Eq '^APP_DOMAIN= *changeme$' "$ENV_FILE"; then
|
||||
echo "Placeholder value for APP_DOMAIN detected. Setting from DEVICE_DOMAIN_NAME..."
|
||||
|
||||
# Замените заполнитель доменом
|
||||
sed -i -E 's|^APP_DOMAIN= *changeme$|APP_DOMAIN="'"${DEVICE_DOMAIN_NAME}"':8762"|' "$ENV_FILE"
|
||||
|
||||
echo "Updated APP_DOMAIN in $ENV_FILE"
|
||||
else
|
||||
echo "APP_DOMAIN is already set. No changes made."
|
||||
fi
|
||||
|
||||
# Проверьте, установлено ли значение ALLOWED_HOSTS на "changeme".
|
||||
if grep -Eq '^ALLOWED_HOSTS= *changeme$' "$ENV_FILE"; then
|
||||
echo "Placeholder value for ALLOWED_HOSTS detected. Setting from DEVICE_DOMAIN_NAME..."
|
||||
|
||||
# Замените заполнитель доменом
|
||||
sed -i -E 's|^ALLOWED_HOSTS= *changeme$|ALLOWED_HOSTS="'"${DEVICE_DOMAIN_NAME}"'"|' "$ENV_FILE"
|
||||
|
||||
echo "Updated ALLOWED_HOSTS in $ENV_FILE"
|
||||
else
|
||||
echo "ALLOWED_HOSTS is already set. No changes made."
|
||||
fi
|
||||
|
||||
# Проверьте, установлено ли значение CORS_ALLOWED_ORIGINS на "changeme".
|
||||
if grep -Eq '^CORS_ALLOWED_ORIGINS= *changeme$' "$ENV_FILE"; then
|
||||
echo "Placeholder value for CORS_ALLOWED_ORIGINS detected. Setting from DEVICE_DOMAIN_NAME..."
|
||||
|
||||
# Замените заполнитель источником на основе домена.
|
||||
sed -i -E 's|^CORS_ALLOWED_ORIGINS= *changeme$|CORS_ALLOWED_ORIGINS="http://'"${DEVICE_DOMAIN_NAME}"':8762,http://'"${DEVICE_DOMAIN_NAME}"'"|' "$ENV_FILE"
|
||||
|
||||
echo "Updated CORS_ALLOWED_ORIGINS in $ENV_FILE"
|
||||
else
|
||||
echo "CORS_ALLOWED_ORIGINS is already set. No changes made."
|
||||
fi
|
||||
|
||||
# Проверьте, установлено ли значение CSRF_TRUSTED_ORIGINS на "changeme".
|
||||
if grep -Eq '^CSRF_TRUSTED_ORIGINS= *changeme$' "$ENV_FILE"; then
|
||||
echo "Placeholder value for CSRF_TRUSTED_ORIGINS detected. Setting from DEVICE_DOMAIN_NAME..."
|
||||
|
||||
# Замените заполнитель источником на основе домена.
|
||||
sed -i -E 's|^CSRF_TRUSTED_ORIGINS= *changeme$|CSRF_TRUSTED_ORIGINS="http://'"${DEVICE_DOMAIN_NAME}"':8762,http://'"${DEVICE_DOMAIN_NAME}"'"|' "$ENV_FILE"
|
||||
|
||||
echo "Updated CSRF_TRUSTED_ORIGINS in $ENV_FILE"
|
||||
else
|
||||
echo "CSRF_TRUSTED_ORIGINS is already set. No changes made."
|
||||
fi
|
||||
|
||||
# Проверьте, установлено ли значение NGINX_HOST на "changeme".
|
||||
if grep -Eq '^NGINX_HOST= *changeme$' "$ENV_FILE"; then
|
||||
echo "Placeholder value for NGINX_HOST detected. Setting from DEVICE_DOMAIN_NAME..."
|
||||
|
||||
# Замените заполнитель доменом
|
||||
sed -i -E 's|^NGINX_HOST= *changeme$|NGINX_HOST="'"${DEVICE_DOMAIN_NAME}"'"|' "$ENV_FILE"
|
||||
|
||||
echo "Updated NGINX_HOST in $ENV_FILE"
|
||||
else
|
||||
echo "NGINX_HOST is already set. No changes made."
|
||||
fi
|
||||
|
||||
exit 0
|
||||
@@ -0,0 +1,10 @@
|
||||
WEB_URL=changeme
|
||||
API_BASE_URL=changeme
|
||||
APP_DOMAIN=changeme
|
||||
ALLOWED_HOSTS=changeme
|
||||
CORS_ALLOWED_ORIGINS=changeme
|
||||
CSRF_TRUSTED_ORIGINS=changeme
|
||||
NGINX_HOST=changeme
|
||||
APP_PROTOCOL=http
|
||||
ENABLE_SIGNUP=0
|
||||
DEBUG=0
|
||||
Reference in New Issue
Block a user