# spkrepo
Synology Package Repository

[](https://discord.gg/nnN9fgE7EF)
## Development
### Requirements
1. Install docker and docker-compose
2. Install python and poetry
3. Optionally install direnv and a working poetry layout as described [here](https://github.com/direnv/direnv/issues/592#issuecomment-856227234) in your `~/.config/direnv/direnvrc`
### Installation
1. Run postgres, e.g. using docker with `docker compose up db`
2. Install dependencies with `poetry install`
3. Run the next commands in the virtual environment `poetry shell`
4. Create the tables with `flask db upgrade`
5. Populate the database with some fake packages with `flask spkrepo populate_db`
6. Add a user with `flask spkrepo create_user -u admin -e admin@synocommunity.com -p adminadmin`
7. Grant the created user with Administrator permissions `flask roles add admin@synocommunity.com admin`
8. Grant the created user with Package Administrator permissions `flask roles add admin@synocommunity.com package_admin`
9. Grant the created user with Developer permissions `flask roles add admin@synocommunity.com developer`
To clean data created by fake packages, run `flask spkrepo depopulate_db`
### Run
1. Start postgres with `docker compose up db`
2. Start the development server with `flask run`
3. Website is available at http://localhost:5000
4. Admin interface is available at http://localhost:5000/admin
5. NAS interface is available at http://localhost:5000/nas
6. API is available at http://localhost:5000/api
7. Run the test suite with `pytest -v`
## Docker Compose Run
- If you also want to run the app in docker you can with `docker compose up app`
- You can run both postgres and the app with `docker compose up`
## Deployment
### Configuration
Create a config file `./config.py` to disable debug logs, connect to a database, set a secure key and optionally set a cache:
Use `LC_CTYPE=C tr -cd '[:print:]' < /dev/urandom | head -c 64` or `base64 < /dev/urandom | head -c 64` to get a random string
```python
DEBUG = False
TESTING = False
SECRET_KEY = "Please-change-me-to-some-random-string"
SQLALCHEMY_ECHO = False
SQLALCHEMY_DATABASE_URI = "postgresql://user:pass@localhost/dbname"
# https://pythonhosted.org/Flask-Caching/#configuring-flask-caching
CACHE_TYPE= "SimpleCache"
# For signing packages
GNUPG_PATH= "/usr/local/bin/gpg"
```
### Docker
Example usage:
```bash
docker run -it --rm --name spkrepo -v $(pwd)/data:/data -p 8000:8000 ghcr.io/synocommunity/spkrepo
```
Additional configuration can be mounted in the container and loaded by putting
the path into `SPKREPO_CONFIG` environment variable.
e.g.
```bash
docker run -it --rm --name spkrepo -v $(pwd)/data:/data -v $(pwd)/docker-config.py:/docker-config.py -e SPKREPO_CONFIG=/docker-config.py -p 8000:8000 ghcr.io/synocommunity/spkrepo
```
### Serve app via [a WSGI server](https://flask.palletsprojects.com/en/1.1.x/deploying/).
Example:
```bash
pip install gunicorn
SPKREPO_CONFIG="$PWD/config.py" gunicorn -w 4 'wsgi:app'
```
## Add migration
```
cd migrations/
alembic revision -m "update build path length"
```
Raw data
{
"_id": null,
"home_page": "https://synocommunity.com",
"name": "spkrepo",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.10",
"maintainer_email": null,
"keywords": "synology, package, repository",
"author": "Antoine Bertin",
"author_email": "diaoulael@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/8c/27/4351538d9602ef7af435215e3df7fb81ee96c291c64cf700422e4dc544a3/spkrepo-0.2.7.tar.gz",
"platform": null,
"description": "# spkrepo\nSynology Package Repository\n\n\n[](https://discord.gg/nnN9fgE7EF)\n\n\n## Development\n### Requirements\n1. Install docker and docker-compose\n2. Install python and poetry\n3. Optionally install direnv and a working poetry layout as described [here](https://github.com/direnv/direnv/issues/592#issuecomment-856227234) in your `~/.config/direnv/direnvrc`\n\n### Installation\n1. Run postgres, e.g. using docker with `docker compose up db`\n2. Install dependencies with `poetry install`\n3. Run the next commands in the virtual environment `poetry shell`\n4. Create the tables with `flask db upgrade`\n5. Populate the database with some fake packages with `flask spkrepo populate_db`\n6. Add a user with `flask spkrepo create_user -u admin -e admin@synocommunity.com -p adminadmin`\n7. Grant the created user with Administrator permissions `flask roles add admin@synocommunity.com admin`\n8. Grant the created user with Package Administrator permissions `flask roles add admin@synocommunity.com package_admin`\n9. Grant the created user with Developer permissions `flask roles add admin@synocommunity.com developer`\n\nTo clean data created by fake packages, run `flask spkrepo depopulate_db`\n\n### Run\n1. Start postgres with `docker compose up db`\n2. Start the development server with `flask run`\n3. Website is available at http://localhost:5000\n4. Admin interface is available at http://localhost:5000/admin\n5. NAS interface is available at http://localhost:5000/nas\n6. API is available at http://localhost:5000/api\n7. Run the test suite with `pytest -v`\n\n## Docker Compose Run\n- If you also want to run the app in docker you can with `docker compose up app`\n- You can run both postgres and the app with `docker compose up`\n\n\n## Deployment\n### Configuration\nCreate a config file `./config.py` to disable debug logs, connect to a database, set a secure key and optionally set a cache:\n\nUse `LC_CTYPE=C tr -cd '[:print:]' < /dev/urandom | head -c 64` or `base64 < /dev/urandom | head -c 64` to get a random string\n\n```python\nDEBUG = False\nTESTING = False\nSECRET_KEY = \"Please-change-me-to-some-random-string\"\nSQLALCHEMY_ECHO = False\nSQLALCHEMY_DATABASE_URI = \"postgresql://user:pass@localhost/dbname\"\n# https://pythonhosted.org/Flask-Caching/#configuring-flask-caching\nCACHE_TYPE= \"SimpleCache\"\n# For signing packages\nGNUPG_PATH= \"/usr/local/bin/gpg\"\n```\n\n\n### Docker\nExample usage:\n\n```bash\ndocker run -it --rm --name spkrepo -v $(pwd)/data:/data -p 8000:8000 ghcr.io/synocommunity/spkrepo\n```\n\nAdditional configuration can be mounted in the container and loaded by putting\nthe path into `SPKREPO_CONFIG` environment variable.\n\ne.g.\n```bash\ndocker run -it --rm --name spkrepo -v $(pwd)/data:/data -v $(pwd)/docker-config.py:/docker-config.py -e SPKREPO_CONFIG=/docker-config.py -p 8000:8000 ghcr.io/synocommunity/spkrepo\n```\n\n\n### Serve app via [a WSGI server](https://flask.palletsprojects.com/en/1.1.x/deploying/).\nExample:\n\n```bash\npip install gunicorn\nSPKREPO_CONFIG=\"$PWD/config.py\" gunicorn -w 4 'wsgi:app'\n```\n\n## Add migration\n\n```\ncd migrations/\nalembic revision -m \"update build path length\"\n```\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Synology Package Repository",
"version": "0.2.7",
"project_urls": {
"Homepage": "https://synocommunity.com",
"Repository": "https://github.com/SynoCommunity/spkrepo"
},
"split_keywords": [
"synology",
" package",
" repository"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "d01cb6e923db7fa907d4823228ed0ef4bccfc9e99e5b13d2e5ca7db129bcb383",
"md5": "5703a80c6d03ab815ada8c66677b8a79",
"sha256": "557a78fde2734f4386b83d258d0561170be1737553e13b9f6d88bde5a8a98020"
},
"downloads": -1,
"filename": "spkrepo-0.2.7-py3-none-any.whl",
"has_sig": false,
"md5_digest": "5703a80c6d03ab815ada8c66677b8a79",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.10",
"size": 200461,
"upload_time": "2025-02-09T04:12:45",
"upload_time_iso_8601": "2025-02-09T04:12:45.232536Z",
"url": "https://files.pythonhosted.org/packages/d0/1c/b6e923db7fa907d4823228ed0ef4bccfc9e99e5b13d2e5ca7db129bcb383/spkrepo-0.2.7-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8c274351538d9602ef7af435215e3df7fb81ee96c291c64cf700422e4dc544a3",
"md5": "801910f9013655042bf684baf36e4d6d",
"sha256": "e5b659b0d698ba1da40a760cbae698c78ff0fe3c99b79e3f4ed014c29abba3d9"
},
"downloads": -1,
"filename": "spkrepo-0.2.7.tar.gz",
"has_sig": false,
"md5_digest": "801910f9013655042bf684baf36e4d6d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.10",
"size": 190403,
"upload_time": "2025-02-09T04:12:47",
"upload_time_iso_8601": "2025-02-09T04:12:47.426346Z",
"url": "https://files.pythonhosted.org/packages/8c/27/4351538d9602ef7af435215e3df7fb81ee96c291c64cf700422e4dc544a3/spkrepo-0.2.7.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-02-09 04:12:47",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "SynoCommunity",
"github_project": "spkrepo",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "spkrepo"
}