processforge 0.2.22__tar.gz → 0.2.24__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of processforge might be problematic. Click here for more details.

Files changed (103) hide show
  1. {processforge-0.2.22/src/processforge.egg-info → processforge-0.2.24}/PKG-INFO +7 -5
  2. {processforge-0.2.22 → processforge-0.2.24}/README.md +6 -4
  3. {processforge-0.2.22 → processforge-0.2.24}/pyproject.toml +1 -1
  4. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/api/app.py +14 -0
  5. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/api/models.py +7 -2
  6. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/api/runner.py +58 -5
  7. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/api/serve.py +9 -9
  8. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/result.py +16 -1
  9. {processforge-0.2.22 → processforge-0.2.24/src/processforge.egg-info}/PKG-INFO +7 -5
  10. {processforge-0.2.22 → processforge-0.2.24}/LICENSE +0 -0
  11. {processforge-0.2.22 → processforge-0.2.24}/MANIFEST.in +0 -0
  12. {processforge-0.2.22 → processforge-0.2.24}/flowsheets/closed-loop-chain.json +0 -0
  13. {processforge-0.2.22 → processforge-0.2.24}/flowsheets/festim/festim_2d.json +0 -0
  14. {processforge-0.2.22 → processforge-0.2.24}/flowsheets/festim/festim_dynamic_loop.json +0 -0
  15. {processforge-0.2.22 → processforge-0.2.24}/flowsheets/hydraulic-chain.json +0 -0
  16. {processforge-0.2.22 → processforge-0.2.24}/flowsheets/openmc/msre_eigenvalue.json +0 -0
  17. {processforge-0.2.22 → processforge-0.2.24}/setup.cfg +0 -0
  18. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/__init__.py +0 -0
  19. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/__main__.py +0 -0
  20. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/_schema.py +0 -0
  21. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/analysis/__init__.py +0 -0
  22. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/analysis/dof.py +0 -0
  23. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/api/__init__.py +0 -0
  24. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/__init__.py +0 -0
  25. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/backends/__init__.py +0 -0
  26. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/backends/base.py +0 -0
  27. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/backends/casadi_backend.py +0 -0
  28. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/backends/pyomo_backend.py +0 -0
  29. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/backends/scipy_backend.py +0 -0
  30. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/flowsheet.py +0 -0
  31. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/jacobian.py +0 -0
  32. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/mixin.py +0 -0
  33. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/solver.py +0 -0
  34. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/stream_var.py +0 -0
  35. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/units/__init__.py +0 -0
  36. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/units/flash_eo.py +0 -0
  37. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/units/heater_eo.py +0 -0
  38. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/units/pipes_eo.py +0 -0
  39. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/units/pump_eo.py +0 -0
  40. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/units/strainer_eo.py +0 -0
  41. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/eo/units/valve_eo.py +0 -0
  42. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/flowsheet.py +0 -0
  43. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/fmu/__init__.py +0 -0
  44. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/fmu/_fmi_vars.py +0 -0
  45. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/fmu/builder.py +0 -0
  46. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/fmu/slave_template.py +0 -0
  47. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/modelica/__init__.py +0 -0
  48. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/modelica/mo_writer.py +0 -0
  49. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/modelica/omc_runner.py +0 -0
  50. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/modelica/transpiler.py +0 -0
  51. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/modelica/unit_equations.py +0 -0
  52. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/pcl/__init__.py +0 -0
  53. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/pcl/compiler.py +0 -0
  54. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/pcl/namespace.py +0 -0
  55. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/provenance.py +0 -0
  56. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/__init__.py +0 -0
  57. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/base.py +0 -0
  58. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/base_jacobian_mixin.py +0 -0
  59. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/cantera_jacobian.py +0 -0
  60. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/cantera_provider.py +0 -0
  61. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/coolprop_provider.py +0 -0
  62. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/festim_provider.py +0 -0
  63. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/jacobian_contributor.py +0 -0
  64. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/manager.py +0 -0
  65. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/modelica_jacobian.py +0 -0
  66. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/modelica_provider.py +0 -0
  67. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/openmc_provider.py +0 -0
  68. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/reference_state_registry.py +0 -0
  69. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/providers/registry.py +0 -0
  70. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/schemas/__init__.py +0 -0
  71. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/schemas/flowsheet_schema.json +0 -0
  72. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/schemas/openmc/openmc_model.py +0 -0
  73. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/simulate.py +0 -0
  74. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/solver.py +0 -0
  75. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/state.py +0 -0
  76. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/thermo.py +0 -0
  77. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/types.py +0 -0
  78. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/__init__.py +0 -0
  79. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/cstr.py +0 -0
  80. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/festim_membrane.py +0 -0
  81. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/flash.py +0 -0
  82. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/heater.py +0 -0
  83. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/pfr.py +0 -0
  84. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/pipes.py +0 -0
  85. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/provider_mixin.py +0 -0
  86. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/pump.py +0 -0
  87. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/solver.py +0 -0
  88. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/solver_unit.py +0 -0
  89. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/strainer.py +0 -0
  90. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/tank.py +0 -0
  91. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/units/valve.py +0 -0
  92. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/utils/__init__.py +0 -0
  93. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/utils/flowsheet_diagram.py +0 -0
  94. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/utils/mermaid_diagram.py +0 -0
  95. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/utils/topology.py +0 -0
  96. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/utils/unit_consistency.py +0 -0
  97. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/utils/validate_flowsheet.py +0 -0
  98. {processforge-0.2.22 → processforge-0.2.24}/src/processforge/utils/validation.py +0 -0
  99. {processforge-0.2.22 → processforge-0.2.24}/src/processforge.egg-info/SOURCES.txt +0 -0
  100. {processforge-0.2.22 → processforge-0.2.24}/src/processforge.egg-info/dependency_links.txt +0 -0
  101. {processforge-0.2.22 → processforge-0.2.24}/src/processforge.egg-info/entry_points.txt +0 -0
  102. {processforge-0.2.22 → processforge-0.2.24}/src/processforge.egg-info/requires.txt +0 -0
  103. {processforge-0.2.22 → processforge-0.2.24}/src/processforge.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: processforge
3
- Version: 0.2.22
3
+ Version: 0.2.24
4
4
  Summary: A Python-based process simulation framework for chemical engineering applications.
5
5
  Author-email: Process Forge Team <team@processforge.dev>
6
6
  License-Expression: BSD-3-Clause
@@ -415,13 +415,15 @@ Run a simulation and map an output folder:
415
415
 
416
416
  ```Bash
417
417
  docker run -p 8080:8080 \
418
- -e AWS_ACCESS_KEY_ID=... \
419
- -e AWS_SECRET_ACCESS_KEY=... \
420
- -e AWS_DEFAULT_REGION=us-east-1 \
418
+ -e S3_ACCESS_KEY='XXXXXX' \
419
+ -e S3_SECRET_KEY='YYYYYYYYY' \
420
+ -e S3_ENDPOINT_URL='https://processforge-files.ams3.s3.com' \
421
+ -e S3_REGION_NAME='ams3' \
422
+ -e S3_BUCKET_NAME='Dev' \
421
423
  ghcr.io/urjanova/processforge:latest \
422
424
  pf-serve
423
425
  ```
424
- (The -v flag ensures the .h5 or .xdmf files generated by OpenMC/FESTIM are saved to your actual hard drive, not lost inside the container.)
426
+ (Ensure you provide your S3-compatible credentials and endpoint URL; output and results will be synced directly to the specified bucket.)
425
427
  ## Logo credit
426
428
  Google Gemini / Nano Banana
427
429
 
@@ -354,13 +354,15 @@ Run a simulation and map an output folder:
354
354
 
355
355
  ```Bash
356
356
  docker run -p 8080:8080 \
357
- -e AWS_ACCESS_KEY_ID=... \
358
- -e AWS_SECRET_ACCESS_KEY=... \
359
- -e AWS_DEFAULT_REGION=us-east-1 \
357
+ -e S3_ACCESS_KEY='XXXXXX' \
358
+ -e S3_SECRET_KEY='YYYYYYYYY' \
359
+ -e S3_ENDPOINT_URL='https://processforge-files.ams3.s3.com' \
360
+ -e S3_REGION_NAME='ams3' \
361
+ -e S3_BUCKET_NAME='Dev' \
360
362
  ghcr.io/urjanova/processforge:latest \
361
363
  pf-serve
362
364
  ```
363
- (The -v flag ensures the .h5 or .xdmf files generated by OpenMC/FESTIM are saved to your actual hard drive, not lost inside the container.)
365
+ (Ensure you provide your S3-compatible credentials and endpoint URL; output and results will be synced directly to the specified bucket.)
364
366
  ## Logo credit
365
367
  Google Gemini / Nano Banana
366
368
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "processforge"
7
- version = "0.2.22"
7
+ version = "0.2.24"
8
8
  description = "A Python-based process simulation framework for chemical engineering applications."
9
9
  readme = "README.md"
10
10
  license = "BSD-3-Clause"
@@ -19,6 +19,20 @@ app = FastAPI(title="ProcessForge API", version=_version)
19
19
  _jobs: dict[str, dict] = {}
20
20
 
21
21
 
22
+ @app.on_event("startup")
23
+ async def startup_event():
24
+ import os
25
+ required_env_vars = [
26
+ "S3_ACCESS_KEY",
27
+ "S3_SECRET_KEY",
28
+ "S3_ENDPOINT_URL",
29
+ "S3_BUCKET_NAME",
30
+ ]
31
+ missing = [v for v in required_env_vars if not os.environ.get(v)]
32
+ if missing:
33
+ raise RuntimeError(f"Missing required S3 environment variables: {', '.join(missing)}")
34
+
35
+
22
36
  async def _run_job_in_thread(
23
37
  job_id: str,
24
38
  flowsheet: dict,
@@ -1,13 +1,18 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import os
3
4
  from typing import Literal
4
5
 
5
- from pydantic import BaseModel
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ def _get_default_bucket() -> str:
10
+ return os.environ.get("S3_BUCKET_NAME", "")
6
11
 
7
12
 
8
13
  class RunRequest(BaseModel):
9
14
  flowsheet: dict
10
- s3_bucket: str
15
+ s3_bucket: str = Field(default_factory=_get_default_bucket)
11
16
  s3_prefix: str | None = None
12
17
 
13
18
 
@@ -6,8 +6,11 @@ from pathlib import Path
6
6
  import boto3
7
7
  from loguru import logger
8
8
 
9
+ import os
10
+ import shutil
11
+ import tempfile
9
12
  from processforge.provenance import build_dynamic_x0, build_run_info
10
- from processforge.result import save_results_zarr_s3
13
+ from processforge.result import save_results_zarr
11
14
  from processforge.utils.validate_flowsheet import validate_flowsheet_dict
12
15
 
13
16
 
@@ -60,6 +63,12 @@ def run_job_sync(
60
63
  This is called from an async background task via asyncio.to_thread so
61
64
  the FastAPI event loop remains free to handle status-poll requests.
62
65
  """
66
+
67
+ log_file = tempfile.NamedTemporaryFile(delete=False, suffix=".log")
68
+ log_file.close()
69
+
70
+ logger_id = logger.add(log_file.name)
71
+
63
72
  jobs_store[job_id]["status"] = "running"
64
73
  jobs_store[job_id]["started_at"] = datetime.datetime.utcnow().isoformat() + "Z"
65
74
 
@@ -67,13 +76,36 @@ def run_job_sync(
67
76
  validate_flowsheet_dict(flowsheet)
68
77
  results, run_info = _run_simulation(flowsheet)
69
78
 
70
- zarr_uri = f"s3://{s3_bucket}/{s3_prefix}/results.zarr"
71
- save_results_zarr_s3(results, zarr_uri, run_info=run_info)
72
- logger.info(f"[{job_id}] Zarr written to {zarr_uri}")
79
+ s3_client = boto3.client(
80
+ "s3",
81
+ aws_access_key_id=os.environ.get("S3_ACCESS_KEY"),
82
+ aws_secret_access_key=os.environ.get("S3_SECRET_KEY"),
83
+ endpoint_url=os.environ.get("S3_ENDPOINT_URL"),
84
+ region_name=os.environ.get("S3_REGION_NAME", "ams3"),
85
+ )
86
+
87
+ with tempfile.TemporaryDirectory() as tmpdir:
88
+ local_zarr_path = os.path.join(tmpdir, "results.zarr")
89
+ save_results_zarr(results, local_zarr_path, run_info=run_info)
90
+
91
+ zip_base_name = os.path.join(tmpdir, "results")
92
+ shutil.make_archive(zip_base_name, "zip", root_dir=tmpdir, base_dir="results.zarr")
93
+ zip_path = f"{zip_base_name}.zip"
73
94
 
74
- s3_client = boto3.client("s3")
95
+ zip_s3_key = f"{s3_prefix}/results.zip"
96
+ s3_client.upload_file(zip_path, s3_bucket, zip_s3_key)
97
+ zarr_uri = f"s3://{s3_bucket}/{zip_s3_key}"
98
+
99
+ logger.info(f"[{job_id}] Zipped Zarr written to {zarr_uri}")
75
100
  output_urls = _upload_outputs_dir(s3_client, s3_bucket, s3_prefix)
76
101
 
102
+ logger.remove(logger_id)
103
+
104
+ log_s3_key = f"{s3_prefix}/run.log"
105
+ s3_client.upload_file(log_file.name, s3_bucket, log_s3_key)
106
+ log_uri = f"s3://{s3_bucket}/{log_s3_key}"
107
+ os.unlink(log_file.name)
108
+
77
109
  jobs_store[job_id].update(
78
110
  {
79
111
  "status": "complete",
@@ -81,11 +113,14 @@ def run_job_sync(
81
113
  "s3_urls": {
82
114
  "zarr": zarr_uri,
83
115
  "outputs": output_urls,
116
+ "log": log_uri,
84
117
  },
85
118
  }
86
119
  )
87
120
  except Exception as exc:
88
121
  logger.exception(f"[{job_id}] Job failed: {exc}")
122
+ logger.remove(logger_id)
123
+
89
124
  jobs_store[job_id].update(
90
125
  {
91
126
  "status": "failed",
@@ -93,3 +128,21 @@ def run_job_sync(
93
128
  "error": str(exc),
94
129
  }
95
130
  )
131
+
132
+ try:
133
+ log_s3_key = f"{s3_prefix}/run.log"
134
+ s3_client = boto3.client(
135
+ "s3",
136
+ aws_access_key_id=os.environ.get("S3_ACCESS_KEY"),
137
+ aws_secret_access_key=os.environ.get("S3_SECRET_KEY"),
138
+ endpoint_url=os.environ.get("S3_ENDPOINT_URL"),
139
+ region_name=os.environ.get("S3_REGION_NAME", "ams3"),
140
+ )
141
+ s3_client.upload_file(log_file.name, s3_bucket, log_s3_key)
142
+ log_uri = f"s3://{s3_bucket}/{log_s3_key}"
143
+ jobs_store[job_id].setdefault("s3_urls", {})["log"] = log_uri
144
+ except Exception as e:
145
+ logger.error(f"Failed to upload log file: {e}")
146
+ finally:
147
+ if os.path.exists(log_file.name):
148
+ os.unlink(log_file.name)
@@ -3,13 +3,13 @@
3
3
  Usage::
4
4
 
5
5
  # Via registered script
6
- pf-serve [--host 0.0.0.0] [--port 8080]
6
+ pf-serve [--host 0.0.0.0] [--port 9000]
7
7
 
8
8
  # Or directly
9
- python -m processforge.api.serve [--host 0.0.0.0] [--port 8080]
9
+ python -m processforge.api.serve [--host 0.0.0.0] [--port 9000]
10
10
 
11
11
  # Or via Docker (override entrypoint)
12
- docker run -p 8080:8080 ghcr.io/urjanova/processforge:latest pf-serve
12
+ docker run -p 9000:9000 ghcr.io/urjanova/processforge:latest pf-serve
13
13
 
14
14
  AWS credentials are read from the standard environment variables
15
15
  (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_DEFAULT_REGION) or from an
@@ -21,19 +21,19 @@ from __future__ import annotations
21
21
  import argparse
22
22
 
23
23
 
24
+ import uvicorn
25
+
26
+ from processforge.api.app import app
27
+
28
+
24
29
  def main() -> None:
25
30
  parser = argparse.ArgumentParser(
26
31
  description="Start the ProcessForge FastAPI server",
27
32
  formatter_class=argparse.ArgumentDefaultsHelpFormatter,
28
33
  )
29
34
  parser.add_argument("--host", default="0.0.0.0", help="Bind host")
30
- parser.add_argument("--port", type=int, default=8080, help="Bind port")
35
+ parser.add_argument("--port", type=int, default=9000, help="Bind port")
31
36
  args = parser.parse_args()
32
-
33
- import uvicorn
34
-
35
- from processforge.api.app import app
36
-
37
37
  uvicorn.run(app, host=args.host, port=args.port, workers=1)
38
38
 
39
39
 
@@ -140,8 +140,23 @@ def save_results_zarr_s3(results, s3_uri: str, run_info: RunInfo | dict | None =
140
140
  run_info: Optional provenance metadata (same as :func:`save_results_zarr`).
141
141
  """
142
142
  import s3fs # noqa: F401 – registers the s3:// protocol with fsspec
143
+ import os
143
144
 
144
- store = zarr.storage.FsspecStore.from_url(s3_uri)
145
+ storage_options = {
146
+ "key": os.environ.get("S3_ACCESS_KEY"),
147
+ "secret": os.environ.get("S3_SECRET_KEY"),
148
+ }
149
+
150
+ client_kwargs = {}
151
+ if endpoint := os.environ.get("S3_ENDPOINT_URL"):
152
+ client_kwargs["endpoint_url"] = endpoint
153
+ if region := os.environ.get("S3_REGION_NAME", "ams3"):
154
+ client_kwargs["region_name"] = region
155
+
156
+ if client_kwargs:
157
+ storage_options["client_kwargs"] = client_kwargs
158
+
159
+ store = zarr.storage.FsspecStore.from_url(s3_uri, storage_options=storage_options)
145
160
  root = zarr.group(store=store, overwrite=True)
146
161
  mode = "dynamic" if _is_dynamic(results) else "steady"
147
162
  root.attrs["mode"] = mode
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: processforge
3
- Version: 0.2.22
3
+ Version: 0.2.24
4
4
  Summary: A Python-based process simulation framework for chemical engineering applications.
5
5
  Author-email: Process Forge Team <team@processforge.dev>
6
6
  License-Expression: BSD-3-Clause
@@ -415,13 +415,15 @@ Run a simulation and map an output folder:
415
415
 
416
416
  ```Bash
417
417
  docker run -p 8080:8080 \
418
- -e AWS_ACCESS_KEY_ID=... \
419
- -e AWS_SECRET_ACCESS_KEY=... \
420
- -e AWS_DEFAULT_REGION=us-east-1 \
418
+ -e S3_ACCESS_KEY='XXXXXX' \
419
+ -e S3_SECRET_KEY='YYYYYYYYY' \
420
+ -e S3_ENDPOINT_URL='https://processforge-files.ams3.s3.com' \
421
+ -e S3_REGION_NAME='ams3' \
422
+ -e S3_BUCKET_NAME='Dev' \
421
423
  ghcr.io/urjanova/processforge:latest \
422
424
  pf-serve
423
425
  ```
424
- (The -v flag ensures the .h5 or .xdmf files generated by OpenMC/FESTIM are saved to your actual hard drive, not lost inside the container.)
426
+ (Ensure you provide your S3-compatible credentials and endpoint URL; output and results will be synced directly to the specified bucket.)
425
427
  ## Logo credit
426
428
  Google Gemini / Nano Banana
427
429
 
File without changes
File without changes
File without changes