{"id":19423331,"url":"https://github.com/ml-tooling/contaxy","last_synced_at":"2026-03-05T04:31:45.627Z","repository":{"id":37930171,"uuid":"329575337","full_name":"ml-tooling/contaxy","owner":"ml-tooling","description":null,"archived":false,"fork":false,"pushed_at":"2023-03-20T09:38:33.000Z","size":11811,"stargazers_count":11,"open_issues_count":10,"forks_count":8,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-04-03T07:21:57.004Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ml-tooling.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-01-14T10:03:34.000Z","updated_at":"2024-12-30T04:53:18.000Z","dependencies_parsed_at":"2024-11-10T13:49:41.132Z","dependency_job_id":null,"html_url":"https://github.com/ml-tooling/contaxy","commit_stats":{"total_commits":770,"total_committers":15,"mean_commits":"51.333333333333336","dds":0.5922077922077922,"last_synced_commit":"d51fe12d95ee6c581446205b0017c574cd164dae"},"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ml-tooling%2Fcontaxy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ml-tooling%2Fcontaxy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ml-tooling%2Fcontaxy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ml-tooling%2Fcontaxy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ml-tooling","download_url":"https://codeload.github.com/ml-tooling/contaxy/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250663544,"owners_count":21467366,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-10T13:38:04.001Z","updated_at":"2026-03-05T04:31:45.595Z","avatar_url":"https://github.com/ml-tooling.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- markdownlint-disable MD033 MD041 --\u003e\n\u003ch1 align=\"center\"\u003e\n    Contaxy\n\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cstrong\u003eCollaborative, extensible platform to create projects, share files, and deploy services \u0026 jobs.\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp\u003e\n    \u003ca href=\"https://pypi.org/project/contaxy/\" title=\"PyPi Version\"\u003e\u003cimg src=\"https://img.shields.io/pypi/v/contaxy?color=green\u0026style=flat\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://pypi.org/project/contaxy/\" title=\"Python Version\"\u003e\u003cimg src=\"https://img.shields.io/badge/Python-3.6%2B-blue\u0026style=flat\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/ml-tooling/opyrator/blob/main/LICENSE\" title=\"Project License\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-MIT-green.svg\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/ml-tooling/contaxy/actions?query=workflow%3Abuild-pipeline\" title=\"Build status\"\u003e\u003cimg src=\"https://img.shields.io/github/workflow/status/ml-tooling/contaxy/build-pipeline?style=flat\"\u003e\u003c/a\u003e\n    \u003ca href=\"ttps://mltooling.substack.com/subscribe\" title=\"Subscribe to newsletter\"\u003e\u003cimg src=\"http://bit.ly/2Md9rxM\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://twitter.com/mltooling\" title=\"Follow on Twitter\"\u003e\u003cimg src=\"https://img.shields.io/twitter/follow/mltooling.svg?style=social\u0026label=Follow\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#getting-started\"\u003eGetting Started\u003c/a\u003e •\n  \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e •\n  \u003ca href=\"#examples\"\u003eExamples\u003c/a\u003e •\n  \u003ca href=\"#support--feedback\"\u003eSupport\u003c/a\u003e •\n  \u003ca href=\"https://github.com/ml-tooling/opyrator/issues/new?labels=bug\u0026template=01_bug-report.md\"\u003eReport a Bug\u003c/a\u003e •\n  \u003ca href=\"#contribution\"\u003eContribution\u003c/a\u003e •\n  \u003ca href=\"https://github.com/ml-tooling/opyrator/releases\"\u003eChangelog\u003c/a\u003e\n\u003c/p\u003e\n\nContaxy is an extensible collaborative platform for teams to share files and deploy services and jobs easily using Docker or Kubernetes.The platform is secured so only members of a project can access its resources (files, services, jobs). Its strong extension system allows to add further functionality to the backend and web app and also to override the behavior of Contaxy's core endpoints. By adding project members or generating fine-granular access tokens, resources can easily be shared with others. Deploying a service and securely sharing it with a stakeholder? No problem.\n\n## Highlights\n\n- 🔐 Secure multi-user development plaform for collaboration.\n- 🗃️ Upload, manage, version, and share files.\n- 🎛 Deploy and share services.\n- 🐳 Deployable on a single-server via Docker or a server-cluster via Kubernetes.\n\n## Getting Started\n\n### Installation\n\n\u003e _**Note**: Currently, not all Docker images are pushed to DockerHub. So, the project has to be built locally, see the [build section](#build)_.\n\nFor the Docker deployment, have a look at the [docker-compose.yaml file](./test_deployment/docker-compose.yml); you can start it via `docker compose up`. For Kubernetes, have a look at the [deploy script](./test_deployment/kubernetes/deploy.sh).\n\n\u003e _**Important**: The configurations are not meant to be used for production as the JWT secret is the default one and the ports of all services instead of only the core service are published; change the configuration accordingly._\n\nFor a list of all configurable environment variables, have a look at [the config file](./backend/src/contaxy/config.py#L31). All fields of the `Settings` class represent an environment variable that can be set.\n\n#### Deploy Behind a Proxy\n\nIf you deploy Contaxy behind a proxy, you can define a base url. It must not end with a slash. For example, if the web app should be accessible behind /test/app instead of /app, the CONTAXY_BASE_URL would be defined as /test.\n\n#### Use external OAuth2/OIDC Identity Provider\n\nThe application needs to be registered at the desired identity provider as a prerequisite. The IDP requires a redirect URI which is `https://{CONTAXY_HOST}/api/auth/oauth/callback`. For further details on how to registering the application at your IDP you should refer to it's documentation (e.g. [Google](https://developers.google.com/identity/protocols/oauth2/web-server)). Moreover, the following env variables need to be added to contaxy:\n\n- CONTAXY_HOST - The domain where contaxy gets deployed without scheme and path, e.g. if the app will be accessible under `https://home.contaxy.com/app` then you need to set `home.contaxy.com`.\n- OIDC_AUTH_ENABLED - Set to 1\n- OIDC_AUTH_URL - The OAuth2 authentication endpoint of the IDP\n- OIDC_TOKEN_URL - The OAuth2 endpint of the IDP to exchange an authorization code for an access token / identity token\n- OIDC_CLIENT_ID - The client ID of the application obtained from the IDP during app registration\n- OIDC_CLIENT_SECRET - The client secret of the application obtained from the IDP during app registration\n\nIf you want to prevent user registration via the default username / password flow, then you can set USER_REGISTRATION_ENABLED=0. You still need to initially create an admin user.\n\n#### Initialize and register admin user\n\nIn order to initialze the system and create the admin user, call the endpoint `/api/system/admin-form` on the started instance and submit the form. This can only be done once.\n\n### Usage\n\nAfter initializing, visit `/app/`.\n\n## Development\n\n### Start the backend locally\n\nIn the `backend` directory, run `uvicorn --app-dir=src contaxy.main:app --reload`. Set the environment variables `POSTGRES_CONNECTION_URI`, `S3_ENDPOINT`, `S3_ACCESS_KEY`, `S3_SECRET_KEY` so that the locally-started Python instance can access them.\n\n### Build\n\n#### Using Act\n\n\u003e _**Note**: We recommend to use [Docker](https://docs.docker.com/get-docker/) and [Act](https://github.com/nektos/act#installation) to execute the containerized build process. If this is not an option, run `python build.py --make` and install the dependencies based on probable errors._\n\nTo simplify the process of building this project from scratch, we provide build-scripts - based on [universal-build](https://github.com/ml-tooling/universal-build) - that run all necessary steps (build, check, test, and release) within a containerized environment. To build and test your changes, execute the following command in the project root folder:\n\n```bash\nact -b -j build\n```\n\nRefer to our [contribution guides](https://github.com/ml-tooling/contaxy/blob/main/CONTRIBUTING.md#development-instructions) for more detailed information on our build scripts and development process.\n\n### Testing\n\nThe project contains unit tests, integration tests, and stress tests. For the unit and integration tests `pytest` is used, for the stress tests `locust`.\n\nTo run the unit/integration tests, you have the following options:\n\n1. in the root folder, execute `act -j build -s BUILD_ARGS=\"--test\"`\n2. in the root folder, execute `python build.py --test`\n3. `cd` into the `backend/` folder and run `PYTHONPATH=$(pwd) pytest`\n\nBy default, unit tests are executed (marked via `pytest.mark.unit`). If you want to execute the integration tests, pass `--test-marker integration` to _options 1_ or _2_ or `-m \"integration\"` to _option 3_. This can be a valid pytest markexpression, hence it would also be possible to execute unit _and_ integration tests by passing `\"unit and integration\"` to one of the flags. If neither unit nor integration tests should be executed, pass an unknown marker such as `notests`.\nBy default, the deployment tests are executed for the DockerDeploymentManager. If you want to execute them for the `KubernetesDeploymentManager`, set the environment variables `KUBERNETES_INTEGRATION_TESTS=True` and `DEPLOYMENT_MANAGER=kubernetes` (for example in an `.env` file in the [backend directory](./backend)).\nUsing option 1 (`act`) will create a Kubernetes cluster. If you don't use `act`, make sure that a Kubernetes cluster is accessible.\n\n\u003e ❗ To point to a running instance for Contaxy and execute the RemoteEndpoint tests, set the `REMOTE_BACKEND_TESTS=True` and `REMOTE_BACKEND_ENDPOINT=$endpoint` variables. For executing LocalEndpoint tests, make sure that the Postgres database and S3 storage are reachable from the locally spawned instance via the environment variables `POSTGRES_CONNECTION_URI`, `S3_ENDPOINT`, `S3_ACCESS_KEY`, `S3_SECRET_KEY`.\n\nTo run the stress tests, you have the following options:\n\n1. `cd` into the `backend/` folder and execute, for example, `locust -f tests/endpoint_tests/locustfile.py --host=http://localhost:8000 --headless -t1m --csv=./tests/results/locust`\n\n\u003e ❗ For the stress tests, the `--host` flag **must** be set and pointing to a running Contaxy instance.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fml-tooling%2Fcontaxy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fml-tooling%2Fcontaxy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fml-tooling%2Fcontaxy/lists"}