Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
174 commits
Select commit Hold shift + click to select a range
3ad7ebb
Added missing configuration in dist file
Genarito Jul 11, 2025
361ceca
Added missing config in dist file
Genarito Jul 21, 2025
2296418
react compiler with babel
juanNH Jul 22, 2025
f07222b
Update rspack.common.js
Genarito Jul 22, 2025
a04e2a5
Merge pull request #81 from omics-datascience/feature/react-compiler-…
Genarito Jul 22, 2025
3490285
Added new "differential_expression" app
Genarito Jul 30, 2025
69941e9
Merge branch 'v5.0.0' of github.com:omics-datascience/multiomix into …
Genarito Jul 30, 2025
41c23cc
Optimized imports
Genarito Jul 30, 2025
526be3e
Base front end page
juanNH Aug 1, 2025
07ddcff
Add differential expression experiment model and API
TheSinnerAR Aug 3, 2025
42ff665
Add differential expression service, tasks, and migrations
TheSinnerAR Aug 8, 2025
a8f7240
Add JSON results storage for differential expression
TheSinnerAR Aug 8, 2025
73e3151
save 8-8
juanNH Aug 8, 2025
ce8fc6e
Removed spanish comment
Genarito Aug 12, 2025
b68181d
Refactor differential expression models and API
TheSinnerAR Aug 14, 2025
1a754ba
Add 'top' parameter to differential expression experiments
TheSinnerAR Aug 14, 2025
cb5b30d
Add R 4.4.2 and limma to Dockerfiles, update docs
TheSinnerAR Aug 16, 2025
5638fd7
fix_view_datasets-multiomix
juanNH Aug 17, 2025
cded451
fix_view_institutions
juanNH Aug 17, 2025
18860f9
Add endpoint to stop differential expression experiment
TheSinnerAR Aug 17, 2025
a36c7af
fix_view_datasets-cbioportal
juanNH Aug 18, 2025
21b3c9c
fix_view_biomarkers
juanNH Aug 18, 2025
eb5e89c
Merge branch 'fix/prevStateBug' into feature/differential-expression-…
juanNH Aug 18, 2025
5aab109
Added --legacy-peer-deps to npm i commands in Github Action
Genarito Aug 30, 2025
53837ca
fix mr changes
juanNH Sep 1, 2025
d6cd133
Merge pull request #82 from omics-datascience/fix/prevStateBug
Genarito Sep 1, 2025
9f04efb
Fix foreign key related_name definitions
Genarito Sep 1, 2025
da50ff6
form
juanNH Sep 2, 2025
37c08b4
fix list_of_samples
juanNH Sep 2, 2025
6cc27f5
base table + fix form
juanNH Sep 3, 2025
ab8341c
Implemented CGDS Dataset clinical attributes
Genarito Sep 8, 2025
a6390c0
save-9-9
juanNH Sep 9, 2025
2dab121
Merge branch 'feature/differential-expression-experiments' of https:/…
juanNH Sep 9, 2025
0ec3439
fix select from save-9-9
juanNH Sep 9, 2025
b27c145
Add list serializer for differential expression experiments
TheSinnerAR Sep 15, 2025
ee95b9a
Add websocket updates for differential expression experiments
TheSinnerAR Sep 18, 2025
61c0056
Refactor significant genes endpoint into results view
TheSinnerAR Oct 2, 2025
f7f6adb
Add tool selection to DifferentialExpressionExperiment
TheSinnerAR Oct 2, 2025
2aa97eb
Add tests and endpoints for experiment update and delete
TheSinnerAR Oct 11, 2025
fe6d38c
diferential expression page
juanNH Oct 15, 2025
8b77349
Merge pull request #84 from omics-datascience/codex/fix-related_name-…
Genarito Oct 20, 2025
542a5c7
Merge branch 'v5.0.0' into feature/differential-expression-experiments
juanNH Oct 23, 2025
9afc0a8
diffExpressionBase
juanNH Oct 24, 2025
6f74ae8
Changed deprecated prop
Genarito Nov 8, 2025
634cafb
Refactoring, fixed types and typos
Genarito Nov 8, 2025
a6733d2
Fixed bug with serializer
Genarito Nov 8, 2025
09d9dc2
Removed checking optional description field to disabled submitting a …
Genarito Nov 8, 2025
020410a
Removed unused packages
Genarito Nov 8, 2025
396c4c5
Upgraded urllib3 to prevent "SSL: WRONG_VERSION_NUMBER ON PYTHON REQU…
Genarito Nov 10, 2025
5cb81a7
Normalize mRNA dataset column names to match SAMPLE_IDs
TheSinnerAR Nov 21, 2025
b7aa7f9
push to check bugs in serializer
juanNH Nov 28, 2025
80dc468
Add volcano plot and results download endpoints
TheSinnerAR Dec 25, 2025
72ebfaf
Add volcano plot serializer and refactor volcano data endpoint
TheSinnerAR Dec 25, 2025
5bbc378
Differential expression detail
juanNH Jan 5, 2026
0a55eab
Update Dockerfiles and improve view error handling
TheSinnerAR Jan 8, 2026
c7ad3fa
Fixs and update texts
juanNH Jan 14, 2026
c0a53a9
Show thresholds
juanNH Jan 14, 2026
2ff6c01
Refactor differential expression sources to use shared models
TheSinnerAR Jan 14, 2026
1137373
Merge branch 'feature/differential-expression-experiments' of https:/…
TheSinnerAR Jan 14, 2026
43812c7
fixs pr updates
juanNH Jan 15, 2026
c68326d
Merge branch 'feature/differential-expression-experiments' of https:/…
juanNH Jan 15, 2026
84cb267
Add comment for useEffect in VolcanoPlot component
Genarito Jan 20, 2026
0566d9d
fix pr comments
juanNH Jan 20, 2026
2e72dbb
Merge branch 'feature/differential-expression-experiments' of https:/…
juanNH Jan 20, 2026
fd0832a
Refactor test data and endpoints for differential expression
TheSinnerAR Jan 20, 2026
78a2197
Merge branch 'feature/differential-expression-experiments' of https:/…
TheSinnerAR Jan 20, 2026
1232499
Add integration tests and update test data files
TheSinnerAR Jan 21, 2026
4725074
Remove utils.py and update views.py error handling
TheSinnerAR Jan 21, 2026
229fccf
Refactor admin configuration for models
Genarito Jan 22, 2026
c35fa6c
Refactor DifferentialExpressionExperiment model
Genarito Jan 22, 2026
372fa0b
Add JSDoc comment for DifferentialExpressionInputClinicalAttribute
Genarito Jan 22, 2026
022cac7
Define props and add documentation for Volcano plot
Genarito Jan 22, 2026
cb24472
Merge pull request #87 from omics-datascience/feature/differential-ex…
Genarito Jan 22, 2026
47099e5
Fixed migrations
Genarito Jan 29, 2026
479c7fd
Removed some warnings
Genarito Jan 29, 2026
52f529b
Remove is_significant logic from differential expression app and impr…
TheSinnerAR Feb 6, 2026
fe3de35
add params to tsv download
juanNH Feb 8, 2026
d04b998
Merge pull request #88 from omics-datascience/update/differential_exp…
Genarito Feb 12, 2026
c8974da
Add tissues app and tissue FK integration
TheSinnerAR Feb 26, 2026
d846c99
Make tissue a ManyToMany on files and studies
TheSinnerAR Mar 5, 2026
105d480
Refactor tissue representation in serializers and admin; remove unuse…
TheSinnerAR Mar 20, 2026
956ff2a
Merge pull request #90 from omics-datascience/feature/tissue-support
TheSinnerAR Mar 20, 2026
bca2a47
Add AI assistant app with frontend chat widget
TheSinnerAR Apr 17, 2026
84524cc
Add STRING tools and chat UI enhancements
TheSinnerAR Apr 17, 2026
cb680ec
Advances with Implement Modal to create a Biomarker from a result of …
GonzzaG Jan 9, 2026
ec71d8d
Fix bugs in obtaining filtered and unfiltered results
GonzzaG Feb 15, 2026
72a7c1d
Normalization
GonzzaG Feb 15, 2026
39f0528
Normalization
GonzzaG Feb 15, 2026
7fb3221
fix bugs in biomarker insertions
GonzzaG Feb 16, 2026
199865f
Normalization parameters of BiomarkerFromCorrelationModel
GonzzaG Feb 20, 2026
8489827
Normalization BiomarkerFromCorrelationModal parameters
GonzzaG Feb 20, 2026
c218f9f
Fix spelling mistake
GonzzaG Feb 20, 2026
14acdf8
Remove unused imports
GonzzaG Feb 20, 2026
c7e2de3
Fix some bugs
GonzzaG Mar 12, 2026
ac4264d
Save 20.3 cytoscape graph
juanNH Mar 20, 2026
fc69571
TODO Fix
GonzzaG Apr 8, 2026
8896267
Add tissues app and tissue FK integration
TheSinnerAR Feb 26, 2026
8742d95
Make tissue a ManyToMany on files and studies
TheSinnerAR Mar 5, 2026
f1972c3
Refactor tissue representation in serializers and admin; remove unuse…
TheSinnerAR Mar 20, 2026
77d3eef
Fixes styles in create Biomarker modal and remove unused imports
GonzzaG Apr 21, 2026
ebaaac4
Some fixes
GonzzaG May 5, 2026
aba87c5
Some bugs fixed and separate css in new file
GonzzaG May 6, 2026
cf60b12
Merge pull request #92 from omics-datascience/feature/biomarker-from-…
Genarito May 6, 2026
1596800
FAQ push
natharisa Jul 18, 2025
32845e6
Added missing file
Genarito Jul 21, 2025
ea93d56
FAQ Components
natharisa Aug 28, 2025
c70c265
FAQ comments added
natharisa Sep 26, 2025
9009c7d
Translations
natharisa Dec 26, 2025
3a7303e
translation updates
natharisa Jan 16, 2026
c0f0210
Translation updates
natharisa Jan 23, 2026
cc3bf8a
Translation updates
natharisa Feb 20, 2026
3106af8
Update member title for Genaro Camele
Genarito Jan 23, 2026
8837cc5
Finished faq and translation update
natharisa Mar 25, 2026
91c17ec
fix PR comments
TheSinnerAR May 15, 2026
5407748
Translate AI_ASSISTANT.md to English
TheSinnerAR May 15, 2026
e9995f3
Merge pull request #91 from omics-datascience/feature/ia
Genarito May 15, 2026
2bd2a4b
Fixed new Typescript version problems
Genarito May 18, 2026
80a4a9c
Fix duplicates gens in biomarker generated by gem experiment
juanNH May 21, 2026
716ebde
Made dependencies strict
Genarito May 22, 2026
72f2f06
Implementation of Tags in Add and Edit Biomarkers and add tags panel …
GonzzaG May 25, 2026
91bc151
Merge branch 'dev' into fix/duplicates-genes-from-gem-experiment
juanNH May 28, 2026
f0bf1c6
Update BiomarkerFromCorrelationModal.tsx
juanNH May 28, 2026
c5c851a
Translate advances
natharisa May 29, 2026
b77ccdd
Merge branch 'dev' of https://github.com/omics-datascience/multiomix …
natharisa May 29, 2026
a0c03dc
Merge branch 'global-translations' of https://github.com/omics-datasc…
natharisa May 29, 2026
ab212d6
Unification of BiomarkerManager in BimoarkerPanel
GonzzaG May 31, 2026
69f1757
Fix importations
GonzzaG May 31, 2026
447ecbe
Merge pull request #95 from omics-datascience/fix/duplicates-genes-fr…
Genarito Jun 4, 2026
805452c
Fix unused props and methods
GonzzaG Jun 4, 2026
f255016
Fix tags not rendered and clean unused props
GonzzaG Jun 4, 2026
9af6d06
remove unused method
GonzzaG Jun 5, 2026
149af80
fix unused const
GonzzaG Jun 5, 2026
a0d5a3d
Remove unused methods and imports
GonzzaG Jun 12, 2026
7307371
Add fullscreen mode and controls to chat panel
TheSinnerAR May 28, 2026
b2c1ed4
Add BioMCP support; upgrade LangChain to 1.x
TheSinnerAR May 29, 2026
c7123a0
Improve chat panel sizing and UI/empty state
TheSinnerAR Jun 2, 2026
66779be
Add help button and dropdown to chat panel
TheSinnerAR Jun 2, 2026
73ca13c
Improve chat help text and adjust layout
TheSinnerAR Jun 2, 2026
496b637
Add MCP tools docs and update biomcp dep
TheSinnerAR Jun 2, 2026
878a6a5
Enable LangChain debug; English UI & minor fixes
TheSinnerAR Jun 4, 2026
28eb84e
Clarify props and JSDoc in assistant UI
TheSinnerAR Jun 5, 2026
017df6d
traducciones corregidas
natharisa Jun 14, 2026
b89ffa5
Removed unused functions and state variables
Genarito Jun 15, 2026
4ef654e
Merge pull request #96 from omics-datascience/feature/BiomarkerTagsPanel
Genarito Jun 15, 2026
9d48d87
Merge branch 'dev' into feat/mcp-ia
Genarito Jun 15, 2026
ad29a20
Fixed ESLint warnings
Genarito Jun 15, 2026
1d46699
Add informational message to VolcanoPlot component indicating work in…
Genarito Jun 15, 2026
8b61ffb
Merge pull request #97 from omics-datascience/feat/mcp-ia
Genarito Jun 15, 2026
d8cc634
Merge branch 'dev' into global-translations
Genarito Jun 15, 2026
20be633
Removed unused translation
Genarito Jun 15, 2026
2435052
Fixed error during `npm i`
Genarito Jun 15, 2026
69ec096
Fixed ESLint errors
Genarito Jun 15, 2026
12460b0
Fixed ESLint errors
Genarito Jun 15, 2026
6d2c39d
Merge pull request #94 from omics-datascience/global-translations
Genarito Jun 15, 2026
7f18fa1
Fixed Homepage component
Genarito Jun 17, 2026
a7a07f6
Fixed AboutUs component
Genarito Jun 17, 2026
760a09c
Added dots
Genarito Jun 17, 2026
041f43e
Fixed translation
Genarito Jun 17, 2026
69c39b8
Fixed Login page
Genarito Jun 17, 2026
16e5a34
Fixed Institutions page
Genarito Jun 17, 2026
3513486
Fixed FAQ page
Genarito Jun 17, 2026
72f3a9b
Fixed Open Source page
Genarito Jun 17, 2026
faef4b6
Removed old comment
Genarito Jun 17, 2026
a1113b5
Fixed some translations and CGDS pag
Genarito Jun 18, 2026
a5f8c0a
Added missing translations
Genarito Jun 18, 2026
4af72dd
Fixed GEM page
Genarito Jun 18, 2026
8d8d819
Fixed Biomarkers page
Genarito Jun 18, 2026
5be4446
Added missing translations
Genarito Jun 18, 2026
d0ff59b
Switch tissues to FK and expose in serializers
TheSinnerAR Jun 23, 2026
0ca0084
Rename 'tissues' fields to 'tissue' across apps
TheSinnerAR Jul 2, 2026
34ecd49
Fix title, select null
juanNH Jul 11, 2026
0faf641
Merge branch 'fix/tissueInFiles' of https://github.com/omics-datascie…
juanNH Jul 11, 2026
d5f8b5a
Fix pr tissue field
juanNH Jul 11, 2026
45ac183
Fix t document
juanNH Jul 11, 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
2 changes: 1 addition & 1 deletion .github/workflows/main-wf.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
with:
node-version: ${{ matrix.node-version }}
- name: NPM install
run: npm --prefix src/frontend/static/frontend i
run: npm --prefix src/frontend/static/frontend i --legacy-peer-deps
- name: NPM linter checks
run: npm --prefix src/frontend/static/frontend run check-all
docker-multiomix:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pr-wf.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@ jobs:
with:
node-version: ${{ matrix.node-version }}
- name: NPM install
run: npm --prefix src/frontend/static/frontend i
run: npm --prefix src/frontend/static/frontend i --legacy-peer-deps
- name: NPM linter checks
run: npm --prefix src/frontend/static/frontend run check-all
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
*.pyc
.idea
.vscode
!src/frontend/static/frontend/.vscode
src/frontend/static/frontend/node_modules
src/frontend/static/frontend/dist
src/venv
Expand All @@ -12,4 +13,5 @@ src/api_service/experiments/venv
docker-compose.yml
src/secretkey.txt
docker-compose.mauri_dev.yml
venv
venv
.DS_Store
5 changes: 5 additions & 0 deletions .sonarlint/connectedMode.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"sonarCloudOrganization": "omics-datascience",
"projectKey": "omics-datascience_multiomix",
"region": "EU"
}
644 changes: 644 additions & 0 deletions AI_ASSISTANT.md

Large diffs are not rendered by default.

95 changes: 95 additions & 0 deletions DEPLOYING.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ The following are the steps to perform a deployment in production. In case you w
- `SYNC_STUDY_SOFT_TIME_LIMIT`: Time limit in seconds for a CGDSStudy to be synchronized. If It's not finished in this time, it is marked as `TIMEOUT_EXCEEDED`. Default to `3600` (1 hour).
- `RESULT_DATAFRAME_LIMIT_ROWS`: maximum number of tuples of an experiment result to save in DB. If it has a larger amount it is truncated by warning the user. The bigger the size the longer it takes to save the resulting combinations of a correlation analysis in Postgres. Set it to `0` to save all the resulting combinations. Default to `300000`.
- `EXPERIMENT_CHUNK_SIZE`: the size of the batches/chunks in which each dataset of an experiment is processed. By default, `500`.
- `INSERT_CHUNK_SIZE`: number of rows per INSERT statement when saving experiment results to PostgreSQL. Increase for faster writes; decrease if you hit memory limits. Default `1000`.
- `SORT_BUFFER_SIZE`: number of elements in memory to perform external sorting (i.e. disk sorting) in the case of having to sort by fit. This impacts the final sorting performance during the computation of an experiment, at the cost of higher memory consumption. Default `2_000_000` of elements.
- `NUMBER_OF_LAST_EXPERIMENTS`: number of last experiments shown to each user in the `Last experiments` panel in the `Pipeline` page. Default `4`.
- `MAX_NUMBER_OF_OPEN_TABS`: maximum number of experiment result tabs that the user can open. When the limit is reached it throws a prompt asking to close some tabs to open more. The more experiment tabs you open, the more memory is consumed. Default `8`.
Expand Down Expand Up @@ -97,6 +98,18 @@ The following are the steps to perform a deployment in production. In case you w
- `AWS_EMR_PORT`: AWS-EMR integration service connection port. Default `8003`.
- `AWS_EMR_SHARED_FOLDER_DATA`: Share folder with the AWS-EMR integration service to move the datasets to be consumed by the integration service. Default `/data-spark`.
- `AWS_EMR_SHARED_FOLDER_RESULTS`: Share folder with the AWS-EMR integration service to retrieve the results generated by the integration service. Default `/results-spark`.
- AI Assistant:
- `OPENAI_API_KEY`: API key for the OpenAI-compatible LLM provider used by the assistant. **Required** for the assistant to function.
- `ASSISTANT_LLM_MODEL`: LLM model name to use for chat completions. Default `gpt-5.4-mini`.
- `ASSISTANT_LLM_TEMPERATURE`: Sampling temperature for the LLM (0.0 = deterministic). Default `0.0`.
- `ASSISTANT_EMBEDDING_MODEL`: HuggingFace sentence-transformers model used to embed messages for semantic memory. Default `sentence-transformers/all-MiniLM-L6-v2`. Inference runs **locally** — no text is sent to HuggingFace.
- `ASSISTANT_EMBEDDING_DIMENSIONS`: Dimensionality of the embedding vectors produced by `ASSISTANT_EMBEDDING_MODEL`. Must match the chosen model. Default `384`.
- `ASSISTANT_RECENT_MESSAGES_COUNT`: Number of most-recent messages from the current conversation included in each LLM prompt. Default `15`.
- `ASSISTANT_SEMANTIC_MESSAGES_COUNT`: Number of semantically similar messages retrieved from the user's conversation history (cross-chat memory) and added to the prompt. Default `5`.
- `HF_TOKEN`: HuggingFace API token. When provided, the embedding model is downloaded from the Hub on first use. When omitted, the model must already be cached locally (fully offline mode). Default empty (offline).
- `HF_CACHE_DIR`: Directory where HuggingFace models are stored when downloaded. Overrides the default HuggingFace cache location. Default empty (uses the HuggingFace default).
- `HF_HOME`: Root directory of the local HuggingFace cache, used to detect whether a model is already cached. Default `~/.cache/huggingface`.
- `TOKENIZERS_PARALLELISM`: Controls HuggingFace tokenizers parallelism. Set to `false` to avoid deadlocks when running inside forked Celery workers. Default `false`.
- Redis server for WebSocket connections:
- `REDIS_HOST`: IP of the Redis server, if Docker is used it should be the name of the service since Docker has its own DNS and can resolve it. The default is `redis` which is the name of the service.
- `REDIS_PORT`: Redis server port. Default `6379`.
Expand Down Expand Up @@ -218,6 +231,86 @@ Then the following environment variables must be configured:
- `AWS_EMR_SHARED_FOLDER`


## AI Assistant MCP Tools

The AI assistant supports [Model Context Protocol (MCP)][mcp-spec] servers, which extend the assistant's capabilities by giving it access to external tools (e.g. biomedical literature databases, clinical trials registries, genomic variant databases, and more).

MCP servers are declared in `config/mcp_servers.json`. By default that file ships with **[BioMCP][biomcp]** already configured and enabled:

```json
{
"version": "1.0",
"servers": {
"biomcp": {
"enabled": true,
"description": "Biomedical research: PubMed papers, bioRxiv, ClinicalTrials.gov, NCI, variants, OncoKB",
"transport": "stdio",
"command": "biomcp",
"args": ["run", "--mode", "stdio"],
"env": {}
}
}
}
```

### Activating MCP support

MCP tools are **disabled by default**. To enable them you need to have the AI assistant enabled first (i.e. `OPENAI_API_KEY` and the related parameters set) and then:

1. Open your `docker-compose.yml` (copied from `docker-compose_dist.yml`).
2. In the `backend` service, uncomment the environment variable:
```yaml
ASSISTANT_MCP_CONFIG_PATH: '/config/mcp_servers.json'
```
3. In the same service, uncomment the volume mount so the config file is available inside the container:
```yaml
- ./config/mcp_servers.json:/config/mcp_servers.json:ro
```
4. Make sure any MCP server declared with `transport: stdio` has its `command` installed and available in `PATH` inside the container. For BioMCP that means `biomcp-python` must be installed in the container image.
5. Redo the deployment with Docker.

### Adding custom MCP servers

You can extend the assistant with any MCP-compatible server by adding entries to `config/mcp_servers.json`. The loader supports three transport types:

| Transport | Required fields | Optional fields |
|-----------|----------------|-----------------|
| `stdio` | `command` | `args`, `env` |
| `http` | `command`, `url` | `args`, `env` |
| `sse` | `command`, `url` | `args`, `env` |

Set `"enabled": false` on any entry to disable it without removing it from the file.

Example — adding a custom HTTP MCP server alongside BioMCP:

```json
{
"version": "1.0",
"servers": {
"biomcp": {
"enabled": true,
"transport": "stdio",
"command": "biomcp",
"args": ["run", "--mode", "stdio"],
"env": {}
},
"my-custom-mcp": {
"enabled": true,
"description": "Custom internal tool server",
"transport": "http",
"command": "my-mcp-server",
"url": "http://my-mcp-host:8080/mcp",
"env": {
"MY_API_KEY": "secret"
}
}
}
}
```

After modifying the file, restart the backend service for the changes to take effect. No rebuild is required since the file is mounted as a read-only volume.


## Execution of tasks with Celery

Multiomix uses [Celery][celery] to distribute the computational load of its most expensive tasks (such as correlation analysis, Biomarkers Feature Selection, static validations, Machine Learning model training, etc.). This requires the user to have a messaging broker, such as RabbitMQ or Redis, installed and configured. In this project, Redis is used and a worker is deployed for each of the execution queues serving a different type of task. The Docker configuration is left ready to run in Docker Compose or Docker Swarm and K8S.
Expand Down Expand Up @@ -286,6 +379,8 @@ To import a `media` folder backup inside a new environment you must (from the ro
2. Run the script `./tools/import_media.sh`.


[mcp-spec]: https://modelcontextprotocol.io/
[biomcp]: https://github.com/genomics-geek/biomcp
[docker-swarm]: https://docs.docker.com/engine/swarm/
[modulector]: https://github.com/omics-datascience/modulector
[bioapi]: https://github.com/omics-datascience/BioAPI
Expand Down
64 changes: 40 additions & 24 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,47 +1,64 @@
FROM python:3.12-slim-bookworm

# Docker Files Vars
ARG LISTEN_PORT 8000
ARG LISTEN_IP "0.0.0.0"
ARG LISTEN_PORT=8000
ARG LISTEN_IP="0.0.0.0"

# Default values for deploying with multiomix image
ENV LISTEN_PORT $LISTEN_PORT
ENV LISTEN_IP $LISTEN_IP
ENV DJANGO_SETTINGS_MODULE "multiomics_intermediate.settings_prod"
ENV RESULT_DATAFRAME_LIMIT_ROWS 500
ENV TABLE_PAGE_SIZE 10
ENV LISTEN_PORT=$LISTEN_PORT
ENV LISTEN_IP=$LISTEN_IP
ENV DJANGO_SETTINGS_MODULE="multiomics_intermediate.settings_prod"
ENV RESULT_DATAFRAME_LIMIT_ROWS=500
ENV TABLE_PAGE_SIZE=10

# Modulector connection parameters
ENV MODULECTOR_HOST "127.0.0.1"
ENV MODULECTOR_PORT "8001"
ENV MODULECTOR_HOST="127.0.0.1"
ENV MODULECTOR_PORT="8001"

# BioAPI connection parameters
ENV BIOAPI_HOST "127.0.0.1"
ENV BIOAPI_PORT "8002"
ENV BIOAPI_HOST="127.0.0.1"
ENV BIOAPI_PORT="8002"

# PostgreSQL DB connection parameters
ENV POSTGRES_USERNAME "multiomics"
ENV POSTGRES_PASSWORD "multiomics"
ENV POSTGRES_HOST "db"
ENV POSTGRES_PORT 5432
ENV POSTGRES_DB "multiomics"
ENV POSTGRES_USERNAME="multiomics"
ENV POSTGRES_PASSWORD="multiomics"
ENV POSTGRES_HOST="db"
ENV POSTGRES_PORT=5432
ENV POSTGRES_DB="multiomics"

# Mongo DB connection parameters
ENV MONGO_USERNAME "multiomics"
ENV MONGO_PASSWORD "multiomics"
ENV MONGO_HOST "mongo"
ENV MONGO_PORT 27017
ENV MONGO_DB "multiomics"
ENV MONGO_USERNAME="multiomics"
ENV MONGO_PASSWORD="multiomics"
ENV MONGO_HOST="mongo"
ENV MONGO_PORT=27017
ENV MONGO_DB="multiomics"

# Redis
ENV REDIS_HOST "redis"
ENV REDIS_PORT 6379
ENV REDIS_HOST="redis"
ENV REDIS_PORT=6379

# Installs system dependencies and Node.js
RUN apt-get update && apt-get install -y python3-pip curl libcurl4-openssl-dev libssl-dev libxml2-dev \
&& curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && apt-get install -y nodejs && mkdir /config \
&& mkdir /src

# Install R 4.4.2 from CRAN (Debian bookworm) and system dependencies
RUN set -eux; \
echo "deb http://deb.debian.org/debian sid main" > /etc/apt/sources.list.d/debian-unstable.list; \
printf 'APT::Default-Release "%s";\n' "bookworm" > /etc/apt/apt.conf.d/00default-release; \
echo 'APT::Install-Recommends "false";' > /etc/apt/apt.conf.d/90no-recommends; \
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 50\n' > /etc/apt/preferences.d/99pin-unstable; \
apt-get update; \
apt-get install -y --no-install-recommends \
ca-certificates curl gnupg build-essential gfortran libblas-dev liblapack-dev git \
libssl-dev libcurl4-openssl-dev libxml2-dev; \
apt-get install -y \
r-base=4.2.2.20221110-2 r-base-dev=4.2.2.20221110-2 r-recommended=4.2.2.20221110-2; \
rm -rf /var/lib/apt/lists/*

# Install Bioconductor limma (stats and base come with R)
RUN R -q -e 'options(repos=c(CRAN="https://cloud.r-project.org")); install.packages("BiocManager"); BiocManager::install(version="3.16", ask=FALSE); BiocManager::install("limma", ask=FALSE, update=FALSE)'

# Installs Python dependencies and compiles the frontend
ADD config/requirements.txt /config/
WORKDIR /src
Expand All @@ -58,4 +75,3 @@ HEALTHCHECK --interval=5m --timeout=30s CMD ["/bin/bash", "-c", "/src/tools/chec
ENTRYPOINT ["/bin/bash", "-c", "/src/entrypoint.sh"]

EXPOSE $LISTEN_PORT

63 changes: 40 additions & 23 deletions Dockerfile-celery
Original file line number Diff line number Diff line change
@@ -1,47 +1,64 @@
FROM python:3.12-slim-bookworm

# Docker Files Vars
ARG LISTEN_PORT 8000
ARG LISTEN_IP "0.0.0.0"
ARG LISTEN_PORT=8000
ARG LISTEN_IP="0.0.0.0"

# Default values for deploying with multiomix image
ENV LISTEN_PORT $LISTEN_PORT
ENV LISTEN_IP $LISTEN_IP
ENV DJANGO_SETTINGS_MODULE "multiomics_intermediate.settings_prod"
ENV RESULT_DATAFRAME_LIMIT_ROWS 500
ENV TABLE_PAGE_SIZE 10
ENV LISTEN_PORT=$LISTEN_PORT
ENV LISTEN_IP=$LISTEN_IP
ENV DJANGO_SETTINGS_MODULE="multiomics_intermediate.settings_prod"
ENV RESULT_DATAFRAME_LIMIT_ROWS=500
ENV TABLE_PAGE_SIZE=10

# Modulector connection parameters
ENV MODULECTOR_HOST "127.0.0.1"
ENV MODULECTOR_PORT "8001"
ENV MODULECTOR_HOST="127.0.0.1"
ENV MODULECTOR_PORT="8001"

# BioAPI connection parameters
ENV BIOAPI_HOST "127.0.0.1"
ENV BIOAPI_PORT "8002"
ENV BIOAPI_HOST="127.0.0.1"
ENV BIOAPI_PORT="8002"

# PostgreSQL DB connection parameters
ENV POSTGRES_USERNAME "multiomics"
ENV POSTGRES_PASSWORD "multiomics"
ENV POSTGRES_HOST "db"
ENV POSTGRES_PORT 5432
ENV POSTGRES_DB "multiomics"
ENV POSTGRES_USERNAME="multiomics"
ENV POSTGRES_PASSWORD="multiomics"
ENV POSTGRES_HOST="db"
ENV POSTGRES_PORT=5432
ENV POSTGRES_DB="multiomics"

# Mongo DB connection parameters
ENV MONGO_USERNAME "multiomics"
ENV MONGO_PASSWORD "multiomics"
ENV MONGO_HOST "mongo"
ENV MONGO_PORT 27017
ENV MONGO_DB "multiomics"
ENV MONGO_USERNAME="multiomics"
ENV MONGO_PASSWORD="multiomics"
ENV MONGO_HOST="mongo"
ENV MONGO_PORT=27017
ENV MONGO_DB="multiomics"

# Redis
ENV REDIS_HOST "redis"
ENV REDIS_PORT 6379
ENV REDIS_HOST="redis"
ENV REDIS_PORT=6379

# Installs system dependencies
RUN apt-get update && apt-get install -y python3-pip curl libcurl4-openssl-dev libssl-dev libxml2-dev \
&& mkdir /config \
&& mkdir /src

# Install R 4.4.2 from CRAN (Debian bookworm) and system dependencies
RUN set -eux; \
echo "deb http://deb.debian.org/debian sid main" > /etc/apt/sources.list.d/debian-unstable.list; \
printf 'APT::Default-Release "%s";\n' "bookworm" > /etc/apt/apt.conf.d/00default-release; \
echo 'APT::Install-Recommends "false";' > /etc/apt/apt.conf.d/90no-recommends; \
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 50\n' > /etc/apt/preferences.d/99pin-unstable; \
apt-get update; \
apt-get install -y --no-install-recommends \
ca-certificates curl gnupg build-essential gfortran libblas-dev liblapack-dev git \
libssl-dev libcurl4-openssl-dev libxml2-dev; \
apt-get install -y \
r-base=4.2.2.20221110-2 r-base-dev=4.2.2.20221110-2 r-recommended=4.2.2.20221110-2; \
rm -rf /var/lib/apt/lists/*

# Install Bioconductor limma (stats and base come with R)
RUN R -q -e 'options(repos=c(CRAN="https://cloud.r-project.org")); install.packages("BiocManager"); BiocManager::install(version="3.16", ask=FALSE); BiocManager::install("limma", ask=FALSE, update=FALSE)'

# Installs Python dependencies
ADD config/requirements_celery.txt /config/requirements.txt
RUN pip install --upgrade pip && pip3 install -r /config/requirements.txt
Expand Down
16 changes: 15 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<img align="right" src="src/frontend/static/frontend/img/logo-readme.png" alt="Multiomix logo">
<img style="float: right" src="src/frontend/static/frontend/img/logo-readme.png" alt="Multiomix logo">

# Multiomix

Expand All @@ -15,6 +15,8 @@ This document is focused on the **development** of the system. If you are lookin
- Node JS >= `20.x` (tested version: `20.x`)
- [Modulector][modulector] `2.2.0`
- [BioAPI][bioapi] `1.2.1`
- R `4.4.2` (required for `differential-expression`)
- **PostgreSQL with [pgvector](https://github.com/pgvector/pgvector)** (required for the AI assistant's semantic search). The provided Docker configuration already uses the `pgvector/pgvector:pg16` image — no manual installation needed when using Docker.


## Installation
Expand All @@ -38,6 +40,7 @@ This document is focused on the **development** of the system. If you are lookin
1. `docker volume create --name=multiomics_intermediate_media_data`
1. `docker volume create --name=multiomics_intermediate_logs_data`
1. Test that all the services start correctly: `docker-compose -f docker-compose.dev.yml up -d`
> **Note:** the PostgreSQL service now uses the `pgvector/pgvector:pg16` image instead of the standard `postgres` image. This is required for the AI assistant's vector similarity search. If you have an existing container running the standard image, recreate it with the new one.
1. Go back to the `src` folder to create the DB and an admin user:
1. `python3 manage.py makemigrations`
1. `python3 manage.py migrate`
Expand Down Expand Up @@ -66,11 +69,22 @@ Every time you want to work with Multiomix, you need to follow the below steps:
1. `python3 -m celery -A multiomics_intermediate worker -l info -Q stats`
1. `python3 -m celery -A multiomics_intermediate worker -l info -Q inference`
1. `python3 -m celery -A multiomics_intermediate worker -l info -Q sync_datasets`
1. `python3 -m celery -A multiomics_intermediate worker -l info -Q differential_expression`
1. If you want to check Task in the GUI you can run [Flower](https://flower.readthedocs.io/en/latest/index.html) `python3 -m celery -A multiomics_intermediate flower`

**NOTE:** maybe in Windows is needed to add `--pool=solo` to the previous commands. Example: `python3 -m celery -A multiomics_intermediate worker -l info -Q correlation_analysis --concurrency 1 --pool=solo`


### Dockerfile changes

The production `Dockerfile` was updated in this version:

- **ENV syntax**: all `ENV` declarations were migrated to the `ENV KEY=value` format (recommended since Docker 20.10).
- **R 4.4.2 + limma**: a new build stage installs R and the `limma` Bioconductor package required for differential expression experiments.

If you are building a custom image, make sure your Docker version supports the updated syntax.


### Linter and Typescript

All the scripts mentioned below must be run inside the `src/frontend/static/frontend` folder.
Expand Down
Loading
Loading