{"id":22147234,"url":"https://github.com/centerforopenscience/gravyvalet","last_synced_at":"2025-04-10T13:43:59.358Z","repository":{"id":241603198,"uuid":"650760409","full_name":"CenterForOpenScience/gravyvalet","owner":"CenterForOpenScience","description":"You sir, will ROUX the day.","archived":false,"fork":false,"pushed_at":"2025-04-09T15:01:18.000Z","size":1406,"stargazers_count":1,"open_issues_count":18,"forks_count":13,"subscribers_count":10,"default_branch":"develop","last_synced_at":"2025-04-09T15:23:19.319Z","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":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CenterForOpenScience.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-06-07T18:45:47.000Z","updated_at":"2025-04-02T13:45:52.000Z","dependencies_parsed_at":"2025-04-02T14:35:09.276Z","dependency_job_id":null,"html_url":"https://github.com/CenterForOpenScience/gravyvalet","commit_stats":null,"previous_names":["centerforopenscience/gravyvalet"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CenterForOpenScience%2Fgravyvalet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CenterForOpenScience%2Fgravyvalet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CenterForOpenScience%2Fgravyvalet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CenterForOpenScience%2Fgravyvalet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CenterForOpenScience","download_url":"https://codeload.github.com/CenterForOpenScience/gravyvalet/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248226416,"owners_count":21068200,"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-12-01T23:15:33.548Z","updated_at":"2025-04-10T13:43:59.352Z","avatar_url":"https://github.com/CenterForOpenScience.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🥣 gravyvalet\n\n`gravyvalet` fetches, serves, and holds small ladlefuls of precious bytes.\n\ntogether with [waterbutler](https://waterbutler.readthedocs.io)\n(which fetches and serves whole streams of bytes, but holds nothing),\ngravyvalet provides an api to support \"osf addons\",\nwhereby you can share controlled access to online accounts\n(e.g. cloud storage) with your collaborators on [osf](https://osf.io).\n\n(NOTE: gravyvalet is still under active development and changes may happen suddenly,\ntho current docs may or may not be available at https://addons.staging.osf.io/docs )\n\n# how to...\n\n## ...set up gravyvalet for local development with osf, using docker\n\n0. have [osf running](https://github.com/CenterForOpenScience/osf.io/blob/develop/README-docker-compose.md) (with its `api` at `http://192.168.168.167:8000`)\n   1. Ensure that `192.168.168.167` is in `ALLOWED_HOSTS` for your local OSF install. (If you have fresh install you can skip this step)\n1. Start your PostgreSQL and Django containers with `docker compose up -d`.\n2. Enter the Django container: `docker compose exec gravyvalet /bin/bash`.\n3. Migrate the existing models: `python manage.py migrate`.\n4. Visit [http://0.0.0.0:8004/](http://0.0.0.0:8004/).\n\n## ...run tests\n\nTo run tests, use the following command:\n\n```bash\npython manage.py test\n```\n(recommend adding `--failfast` when looking for immediate feedback)\n\n## ...set up external services\nStart by launching management command\n```bash\npython manage.py fill_external_services\n```\nThis should fill all external services which are currently supported by OSF.\n\nThey should be visible now in addons list on project and user page. Non-oauth addons should be in working state now, the only thing left is to configure each oauth addon credential\nContinue by creating an admin account with\n[django's createsuperuser command](https://docs.djangoproject.com/en/4.2/ref/django-admin/#django-admin-createsuperuser):\n\n```bash\npython manage.py createsuperuser\n```\n\nthen log in with that account at `localhost:8004/admin` to manage\nexternal services (including oauth config) and to create other admin users. \n\nTo configure OAuth addons:\n1. Open [admin](http://localhost:8004/admin/addon_service/) \n2. Go to external service you want to configure (it is under **External *\\\u003c\\\u003caddon type\\\u003e\\\u003e* service**)\n3. After choosing service click on respective OAuth Client config\n4. There fill your client id and client secret (instructions to obtain them are [here](./services_setup_doc/README.md))\n5. Now you should be able to connect these addons according to existing user flows (in ordinary osf app)\n\n## ...configure a good environment\nsee `app/env.py` for details on all environment variables used.\n\nwhen run without a `DEBUG` environment variable (note: do NOT run with `DEBUG` in production),\nsome additional checks are run on the environment:\n\n- `GRAVYVALET_ENCRYPT_SECRET` is required -- ideally chosen by strong randomness,\n  with maybe ~128 bits of entropy (e.g. 32 hex digits; 30 d20 rolls; 13 words of a 1000-word vocabulary)\n\n## ...rotate encryption keys responsibly\ndon't let your secrets get stale! you can rotate the secret used to derive encryption keys\n(as well as the parameters for key derivation -- see `app/env.py` for details)\n\n1. update environment:\n   - set `GRAVYVALET_ENCRYPT_SECRET` to a new, long, random string (...no commas, tho)\n   - add the old secret to `GRAVYVALET_ENCRYPT_SECRET_PRIORS` (comma-separated list)\n   - (optional) update key-derivation parameters with best-practices du jour\n2. run `python manage.py rotate_encryption` to enqueue key-rotation tasks\n   (on the `gravyvalet_tasks.CHILL` queue by default)\n3. once that queue of tasks is complete, update environment again to remove the old secret from\n   `GRAVYVALET_ENCRYPT_SECRET_PRIORS`\n\n## ...enable pre-commit hooks\nOptionally, but recommended: Set up pre-commit hooks that will run formatters and linters on staged files. Install pre-commit using:\n\n```bash\n\npip install pre-commit\n```\n\nThen, run:\n\n```bash\n\npre-commit install --allow-missing-config\n```\n\n## ...ask questions or report issues\n\nIf you encounter a bug, have a technical question, or want to request a feature, please don't hesitate to contact us \nat help@osf.io. While we may respond to questions through other channels, reaching out to us at help@osf.io ensures \nthat your feedback goes to the right person promptly. If you're considering posting an issue on our GitHub issues page,\n we recommend sending it to help@osf.io instead.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcenterforopenscience%2Fgravyvalet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcenterforopenscience%2Fgravyvalet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcenterforopenscience%2Fgravyvalet/lists"}