Skip to content
Open
Show file tree
Hide file tree
Changes from 80 commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
868c89f
42268 feat(backend:file_access): add file access permission verificat…
EBirkenfeld Oct 9, 2025
9635ac3
41526 feat(file_service): implement file proxy microservice with GCS …
EBirkenfeld Oct 13, 2025
f985da3
Merge remote-tracking branch 'origin/master' into 41526__сreate_file_…
EBirkenfeld Oct 24, 2025
89d257a
41526 fix(storage): rename file_service to storage
EBirkenfeld Oct 24, 2025
3009ff1
Merge remote-tracking branch 'origin/42268__add_api_for_verifying_fil…
EBirkenfeld Oct 24, 2025
26c7a5a
41526 feat(attachments): add API for checking file access permissions…
EBirkenfeld Oct 24, 2025
a57dd9f
41526 refactor(storage): migrate linting configuration from pyproject…
EBirkenfeld Oct 28, 2025
5cfa0f6
41526 refactor(backend): apply code formatting fixes across entire co…
EBirkenfeld Oct 28, 2025
98e5cf5
41526 refactor(storage): standardize docstrings and remove unused ign…
EBirkenfeld Oct 28, 2025
847543c
41526 refactor(storage:tests): update test imports and exception hand…
EBirkenfeld Oct 28, 2025
a9c7163
41526 refactor(storage:tests): standardize docstrings and update ruff…
EBirkenfeld Oct 28, 2025
ed410e8
41526 refactor(storage): improve authentication middleware and stream…
EBirkenfeld Oct 28, 2025
0fb60c8
41526 refactor(storage): clean up error codes and enhance validation …
EBirkenfeld Oct 29, 2025
1b733f4
Merge remote-tracking branch 'origin/master' into 41526__create_file_…
EBirkenfeld Dec 25, 2025
3472433
41526 feat(migrations): add access_type and file_id fields to FileAtt…
EBirkenfeld Dec 25, 2025
93f6bac
41526 feat(file-service): add file service and PostgreSQL support wit…
EBirkenfeld Dec 29, 2025
ca7dbb7
41526 fix(docker): update pneumatic_file_service port mapping from 80…
EBirkenfeld Dec 29, 2025
8ec1a8f
41526 fix(docker): update AUTH_REDIS_URL to use 'redis' service hostn…
EBirkenfeld Dec 29, 2025
a2ba8f8
41526 fix(docker): replace dynamic profile variable with static 'loca…
EBirkenfeld Dec 29, 2025
f48202c
41526 fix(docker): update port configurations and add backend service…
EBirkenfeld Dec 30, 2025
57864b2
41526 feat(storage): implement file service integration with attachme…
EBirkenfeld Dec 30, 2025
b561685
41526 feat(storage): add pytest configuration and tests for attachmen…
EBirkenfeld Dec 30, 2025
a040982
41526 fix(storage): filter out deleted attachments in attachment serv…
EBirkenfeld Dec 30, 2025
e02fe92
41526 feat(storage): implement attachment synchronization and update …
EBirkenfeld Jan 16, 2026
a9c84fb
41526 refactor(backend, storage): remove legacy file attachment endpo…
EBirkenfeld Jan 23, 2026
5f48271
41526 feat(storage): remove execute() method and optimize owner permi…
EBirkenfeld Jan 23, 2026
73f4b50
41526 refactor(tests): update download use case mocks for improved cl…
EBirkenfeld Jan 23, 2026
cd1bbde
41526 feat(backend, docker): update permissions and service configura…
EBirkenfeld Jan 24, 2026
4c33ead
41526 feat(storage): update initial migration for Attachment model
EBirkenfeld Jan 26, 2026
51eb7b5
41526 feat(storage): refactor attachment handling and implement new s…
EBirkenfeld Jan 26, 2026
95b4806
41526 refactor(storage): streamline attachment handling and update re…
EBirkenfeld Jan 29, 2026
84b71bb
41526 feat(storage): enhance attachment handling and integrate new fi…
EBirkenfeld Feb 3, 2026
9af4e48
41526 fix(storage): enhance permission checks and attachment handling
EBirkenfeld Feb 3, 2026
bd458a2
41526 refactor(storage): update attachment handling and optimize queries
EBirkenfeld Feb 5, 2026
fa36ca3
41526 refactor(storage): remove Google Cloud Storage integration and …
EBirkenfeld Feb 6, 2026
bfe81f7
41526 feat(storage): integrate file service and update configurations
EBirkenfeld Feb 9, 2026
ad6848b
41526 refactor(storage): update attachment handling and improve test …
EBirkenfeld Feb 10, 2026
9e2c448
41526 refactor(storage): remove FileSyncViewSet and update synchroniz…
EBirkenfeld Feb 10, 2026
52c0eb8
41526 refactor(storage): update file service configuration and attach…
EBirkenfeld Feb 10, 2026
5d8854d
41526 feat(authentication): enhance user photo handling and integrate…
EBirkenfeld Feb 10, 2026
7d9ab44
41526 refactor(storage): streamline user model retrieval in Attachmen…
EBirkenfeld Feb 10, 2026
1f90ca3
41526 feat(storage): update attachment routing and remove redundant s…
EBirkenfeld Feb 10, 2026
73f6a7e
41526 refactor(migrations): remove FileAttachmentPermission model and…
EBirkenfeld Feb 10, 2026
fa2661e
41526 refactor(file_service): improve file upload handling and valida…
EBirkenfeld Feb 11, 2026
1ba656e
41526 refactor(authentication): streamline user photo retrieval in Mi…
EBirkenfeld Feb 11, 2026
d2ac514
41526 fix(attachments): address code review issues
EBirkenfeld Feb 11, 2026
bf81633
Merge branch 'master' into 41526__create_file_service
EBirkenfeld Feb 11, 2026
3b0eb21
41526 feat(attachments): add URL field to attachment serializer and i…
EBirkenfeld Feb 12, 2026
10274ed
41526 feat(storage): implement optimized attachment retrieval with ne…
EBirkenfeld Feb 12, 2026
6bbeafa
41526 feat(docker): enable storage services and update configurations
EBirkenfeld Feb 12, 2026
0969cd9
41526 feat(attachments): enhance attachment handling and validation a…
EBirkenfeld Feb 13, 2026
270c63c
41526 fix(docker): Update FILE_SERVICE_URL in docker-compose files to…
EBirkenfeld Feb 13, 2026
a8c21b3
41526 refactor(comments): streamline comment handling by removing att…
EBirkenfeld Feb 13, 2026
3d32d88
41526 feat(storage): add plain URL extraction for file service
EBirkenfeld Feb 13, 2026
dfec943
41526 feat(permissions): implement reassigning of restricted permissi…
EBirkenfeld Feb 13, 2026
43b353c
41526 feat(public_auth): implement token invalidation for public temp…
EBirkenfeld Feb 13, 2026
280c068
41526 fix(storage): preserve comment attachments when refreshing task…
EBirkenfeld Feb 13, 2026
848c6a7
41526 refactor(tasks): optimize attachment handling with transaction …
EBirkenfeld Feb 16, 2026
153adac
41526 feat(attachments): implement pagination and filtering for attac…
EBirkenfeld Feb 16, 2026
42831dd
41526 refactor(docker): standardize file-service configurations and u…
EBirkenfeld Feb 16, 2026
673b3ac
41526 fix(database): update alembic.ini script location to use relati…
EBirkenfeld Feb 16, 2026
d6f0686
41526 refactor(tasks): update TaskFieldService to handle full URLs fo…
EBirkenfeld Feb 17, 2026
6889daf
41526 fix(comments): enforce mandatory comment text in CommentCreateS…
EBirkenfeld Feb 17, 2026
b78924b
41526 refactor(docker): standardize environment variable syntax in do…
EBirkenfeld Feb 17, 2026
fad0507
41526 refactor(attachments): streamline permission assignment and rem…
EBirkenfeld Feb 17, 2026
539446d
41526 fix(attachments): ensure guardian permissions are cleared on at…
EBirkenfeld Feb 17, 2026
05071ff
41526 refactor(attachments): update refresh_attachments_for_event to …
EBirkenfeld Feb 17, 2026
4eb446b
41526 refactor(settings): remove STORAGE configuration and docker-com…
EBirkenfeld Feb 17, 2026
2de8b2e
41526 refactor(docker): remove local-storage profiles from seaweedfs …
EBirkenfeld Feb 17, 2026
2b9dd71
41526 feat(API): Implement uploadFileToFileService for POST /upload
Maria-Lordwill Feb 18, 2026
93557ff
Merge branch '41526__create_file_service' of github.com:pneumaticapp/…
Maria-Lordwill Feb 18, 2026
672e522
Merge branch 'master' into 41526__create_file_service
EBirkenfeld Feb 18, 2026
47e9b41
41526 fix(docker): Update ALLOWED_ORIGINS in docker-compose files
EBirkenfeld Feb 18, 2026
a12df90
41526 feat(upload): Switch all attachment upload calls to the new fun…
Maria-Lordwill Feb 19, 2026
1ffc20c
41526 feat(attachments): Add kickoff description handling for workflo…
EBirkenfeld Feb 19, 2026
b9f359a
41526 refactor(fileservice): change file name
Maria-Lordwill Feb 20, 2026
6dd89ef
Merge branch '41526__create_file_service' of https://github.com/pneum…
EBirkenfeld Feb 24, 2026
da63083
41526 feat(authentication): Enhance photo update process to sync acco…
EBirkenfeld Feb 24, 2026
c4ea917
41526 refactor(forms, admin): Simplify exception handling by removing…
EBirkenfeld Feb 24, 2026
7068a7c
41526 fix(docker, authentication): Correct ALLOWED_ORIGINS, improve u…
EBirkenfeld Feb 24, 2026
3423399
41526 refactor(account): Optimize logo sync logic by preventing unnec…
EBirkenfeld Feb 24, 2026
af43724
41526 refactor(tasks): Wrap attachment retrieval in a transaction to …
EBirkenfeld Feb 24, 2026
c13c36a
Merge branch 'master' into 41526__create_file_service
EBirkenfeld Mar 11, 2026
f087c3f
41526 fix(tests): fix migration and tests
EBirkenfeld Mar 11, 2026
2c5f970
41526 feat(attachments): Implement a new file storage service with a …
EBirkenfeld Mar 12, 2026
17b0664
41526 fix(attachment): fix user update and attachment management serv…
EBirkenfeld Mar 12, 2026
2b43acf
41526 fix(attachment): fix Microsoft authentication service with Grap…
EBirkenfeld Mar 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
File renamed without changes.
183 changes: 177 additions & 6 deletions backend/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,6 @@ services:
AI_PROVIDER: ${AI_PROVIDER}
PUSH: ${PUSH:-no}
PUSH_PROVIDER: ${PUSH_PROVIDER}
STORAGE: ${STORAGE:-no}
STORAGE_PROVIDER: ${STORAGE_PROVIDER}
GOOGLE_APPLICATION_CREDENTIALS: /pneumatic_backend/google_api_credentials.json
SENTRY_DSN: ${SENTRY_DSN}
POSTGRES_HOST: ${POSTGRES_HOST:-postgres}
POSTGRES_USER: ${POSTGRES_USER:-postgres_user}
Expand Down Expand Up @@ -186,9 +183,6 @@ services:
AI_PROVIDER: ${AI_PROVIDER}
PUSH: ${PUSH:-no}
PUSH_PROVIDER: ${PUSH_PROVIDER}
STORAGE: ${STORAGE:-no}
STORAGE_PROVIDER: ${STORAGE_PROVIDER}
GOOGLE_APPLICATION_CREDENTIALS: /pneumatic_backend/google_api_credentials.json
SENTRY_DSN: ${SENTRY_DSN}
POSTGRES_HOST: ${POSTGRES_HOST:-postgres}
POSTGRES_USER: ${POSTGRES_USER:-postgres_user}
Expand Down Expand Up @@ -224,6 +218,183 @@ services:
- pneumatic
restart: always

backend:
build:
context: .
container_name: pneumatic-backend
command: >
sh -c "python manage.py migrate &&
python manage.py collectstatic --no-input &&
python manage.py compilemessages &&
python manage.py runserver 0.0.0.0:8000"
environment:
BACKEND_URL: ${BACKEND_URL:-http://localhost:8001}
FRONTEND_URL: ${FRONTEND_URL:-http://localhost}
FORMS_URL: ${FORMS_URL:-http://form.localhost}
ENVIRONMENT: ${ENVIRONMENT:-Development}
LANGUAGE_CODE: ${LANGUAGE_CODE:-en}
CAPTCHA: ${CAPTCHA:-no}
ANALYTICS: ${ANALYTICS:-no}
BILLING: ${BILLING:-no}
SIGNUP: ${SIGNUP:-yes}
MS_AUTH: ${MS_AUTH:-no}
GOOGLE_AUTH: ${GOOGLE_AUTH:-no}
SSO_AUTH: ${SSO_AUTH:-no}
EMAIL: ${EMAIL:-no}
AI: ${AI:-no}
PUSH: ${PUSH:-no}
POSTGRES_HOST: ${POSTGRES_HOST:-postgres}
POSTGRES_USER: ${POSTGRES_USER:-postgres_user}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres_password}
POSTGRES_DB: ${POSTGRES_DB:-postgres_db}
DJANGO_DEBUG: ${DJANGO_DEBUG:-yes}
ADMIN_PATH: ${ADMIN_PATH:-admin}
DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY:-django_secret_django_secret_django_secret}
DJANGO_SETTINGS_MODULE: src.settings
AUTH_REDIS_URL: "redis://:${REDIS_PASSWORD:-redis_password}@redis:6379/1"
CACHE_REDIS_URL: "redis://:${REDIS_PASSWORD:-redis_password}@redis:6379/0"
CHANNELS_REDIS_URL: "redis://:${REDIS_PASSWORD:-redis_password}@redis:6379/2"
SESSION_REDIS_URL: "redis://:${REDIS_PASSWORD:-redis_password}@redis:6379/3"
CELERY_BROKER_URL: "amqp://${RABBITMQ_USER:-rabbitmq_user}:${RABBITMQ_PASSWORD:-rabbitmq_password}@rabbitmq:5672"
ALLOWED_HOSTS: "backend localhost 127.0.0.1"
VERIFICATION_CHECK: no
CORS_ORIGIN_ALLOW_ALL: yes
CORS_ALLOW_CREDENTIALS: yes
FILE_SERVICE_URL: ${FILE_SERVICE_URL:-http://file-service:8000}
CORS_ORIGIN_WHITELIST: "http://localhost:8000 http://localhost:8002 ${FRONTEND_URL:-http://localhost}"
ENABLE_LOGGING: ${ENABLE_LOGGING:-yes}
volumes:
- ./:/pneumatic_backend
ports:
- "8001:8000"
depends_on:
- postgres
- rabbitmq
- redis
networks:
- pneumatic
restart: always

file-service:
build:
context: ../storage
container_name: pneumatic-file-service
environment:
DEBUG: ${FILE_DEBUG:-true}
CONFIG: ${FILE_CONFIG:-Development}
WORKERS: ${FILE_WORKERS:-1}
PORT: ${FILE_PORT:-8000}
ALLOWED_ORIGINS: ${FILE_ALLOWED_ORIGINS:-["*"]}
BACKEND_PRIVATE_URL: http://backend:8000/
POSTGRES_USER: ${FILE_POSTGRES_USER:-pneumatic}
POSTGRES_PASSWORD: ${FILE_POSTGRES_PASSWORD:-pneumatic}
POSTGRES_DB: ${FILE_POSTGRES_DB:-pneumatic}
POSTGRES_HOST: ${FILE_POSTGRES_HOST:-file-postgres}
POSTGRES_PORT: ${FILE_POSTGRES_PORT:-5432}
STORAGE_TYPE: ${FILE_STORAGE_TYPE:-local}
SEAWEEDFS_S3_ENDPOINT: ${FILE_SEAWEEDFS_S3_ENDPOINT:-http://seaweedfs-filer:8333}
SEAWEEDFS_S3_ACCESS_KEY: ${FILE_SEAWEEDFS_S3_ACCESS_KEY:-any-secret-key-will-work}
SEAWEEDFS_S3_SECRET_KEY: ${FILE_SEAWEEDFS_S3_SECRET_KEY:-any-secret-key-will-work}
SEAWEEDFS_S3_REGION: ${FILE_SEAWEEDFS_S3_REGION:-us-central1}
SEAWEEDFS_S3_USE_SSL: ${FILE_SEAWEEDFS_S3_USE_SSL:-false}
GCS_S3_ENDPOINT: ${FILE_GCS_S3_ENDPOINT}
GCS_S3_ACCESS_KEY: ${FILE_GCS_S3_ACCESS_KEY}
GCS_S3_SECRET_KEY: ${FILE_GCS_S3_SECRET_KEY}
GCS_S3_REGION: ${FILE_GCS_S3_REGION}
FASTAPI_BASE_URL: ${FILE_FASTAPI_BASE_URL:-http://localhost:8002}
BUCKET_PREFIX: ${FILE_BUCKET_PREFIX:-pneumatic-dev-test}
MAX_FILE_SIZE: ${FILE_MAX_FILE_SIZE:-104857600}
CHUNK_SIZE: ${FILE_CHUNK_SIZE:-1048576}
AUTH_REDIS_URL: "redis://:${REDIS_PASSWORD:-redis_password}@redis:6379/1"
KEY_PREFIX_REDIS: ${FILE_KEY_PREFIX_REDIS:-:1:}
DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY:-django_secret_django_secret_django_secret}
AUTH_TOKEN_ITERATIONS: ${FILE_AUTH_TOKEN_ITERATIONS:-1}
volumes:
- file_service_media:/app/media
Comment thread
macroscopeapp[bot] marked this conversation as resolved.
ports:
- "8002:8000"
depends_on:
- file-postgres
- redis
- backend
Comment thread
EBirkenfeld marked this conversation as resolved.
networks:
- pneumatic
restart: unless-stopped

file-postgres:
image: postgres:15-bookworm
container_name: pneumatic-file-postgres
environment:
POSTGRES_DB: ${FILE_POSTGRES_DB:-pneumatic}
POSTGRES_USER: ${FILE_POSTGRES_USER:-pneumatic}
POSTGRES_PASSWORD: ${FILE_POSTGRES_PASSWORD:-pneumatic}
ports:
- "5433:5432"
volumes:
- file_postgres_data:/var/lib/postgresql/data
networks:
- pneumatic
restart: unless-stopped

seaweedfs-master:
image: chrislusf/seaweedfs:3.95
container_name: pneumatic-seaweedfs-master
command: master -ip=seaweedfs-master -port=9333
ports:
- "9333:9333"
- "19333:19333"
volumes:
- seaweedfs_master_data:/data
networks:
- pneumatic

seaweedfs-volume:
image: chrislusf/seaweedfs:3.95
container_name: pneumatic-seaweedfs-volume
command:
- volume
- -mserver=seaweedfs-master:9333
- -port=8080
- -ip=seaweedfs-volume
- -publicUrl=localhost:8080
ports:
- "8080:8080"
- "18080:18080"
depends_on:
- seaweedfs-master
volumes:
- seaweedfs_volume_data:/data
networks:
- pneumatic

seaweedfs-filer:
image: chrislusf/seaweedfs:3.95
container_name: pneumatic-seaweedfs-filer
command: filer -master="seaweedfs-master:9333" -s3 -s3.port=8333
ports:
- "8888:8888"
- "8333:8333"
- "18888:18888"
depends_on:
- seaweedfs-master
- seaweedfs-volume
volumes:
- ../storage/seaweedfs/filer.toml:/etc/seaweedfs/filer.toml
- seaweedfs_filer_data:/data
networks:
- pneumatic

networks:
pneumatic:

volumes:
postgres_data:
postgres_backups:
redis_data:
rabbitmq_data:
rabbitmq_log:
file_postgres_data:
file_service_media:
seaweedfs_master_data:
seaweedfs_volume_data:
seaweedfs_filer_data:
Loading