My attempt to make a tiny photos storage with duplicates finder. https://photos.end-play.xyz/docs
Go to file
2024-05-03 11:42:42 +03:00
classes New secrets system and quotas (#35) 2023-11-25 17:50:09 +01:00
extensions Added missing import of SearchLimitInvalidError 2023-12-14 01:22:03 +02:00
migrations Migration for quotas added 2023-11-25 18:05:12 +01:00
modules Fixed "TypeError" for UserInDB 2023-11-25 18:17:17 +01:00
pages Working on pages 2023-01-12 16:21:33 +01:00
.gitignore New secrets system and quotas (#35) 2023-11-25 17:50:09 +01:00
.renovaterc Update '.renovaterc' 2023-04-21 10:03:26 +03:00
config_example.json New secrets system and quotas (#35) 2023-11-25 17:50:09 +01:00
dependencies.md Improved compression 2022-12-20 22:52:05 +01:00
favicon.ico Migrated from main API 2022-12-20 01:22:32 +01:00
LICENSE Updated license 2022-12-20 00:28:05 +01:00
photos_api.py Fixed "unrecognized arguments" error 2023-11-25 18:14:30 +01:00
README.md Added upgrade section 2023-11-25 18:12:01 +01:00
requirements.txt Update dependency fastapi to v0.111.0 2024-05-03 04:07:24 +03:00

Photos API

License: GPL Code style: black

Small and simple API server for saving photos and videos.

Dependencies

Installation

First you need to have a Python interpreter, MongoDB and optionally git. You can also ignore git and simply download source code, should also work fine. After that you're ready to go.

In this README I assume that you're using default python in your system and your system's PATH contains it. If your default python is python3 or for example /home/user/.local/bin/python3.9 - use it instead.

  1. Install Mongo:

    Please follow official installation manual for that.

  2. Download Photos API:

    1. git clone https://git.end-play.xyz/profitroll/PhotosAPI.git (if you're using git)
    2. cd PhotosAPI
  3. Create virtual environment [Optional yet recommended]:

    1. Install virtualenv module: pip install virtualenv
    2. Create venv: python -m venv env
    3. Activate it using source venv/bin/activate on Linux, venv\Scripts\activate.bat in CMD or venv\Scripts\Activate.ps1 in PowerShell.
  4. Install project's dependencies:

    python -m pip install -r requirements.txt

  5. Configure your API:

    1. Copy file config_example.json to config.json
    2. Open config.json using your favorite text editor. For example nano config.json
    3. Change "database" keys to match your MongoDB setup
    4. Set the key "secret" to your JWT secret. You can type in anything, but long secrets are recommended. You can also set environment variable PHOTOSAPI_SECRET as an alternative
    5. Change "external_address" to the ip/http address you may get in responses. By default it's "localhost". This is extremely useful when running behind reverse-proxy.

    After configuring everything listed above your API will be able to boot, however further configuration can be done. You can read about it in repository's wiki. There's no need to focus on that now, it makes more sense to configure it afterwards.

  6. Start your API:

    You can run your API by the following command:
    uvicorn photos_api:app --host 127.0.0.1 --port 8054

    Learn more about available uvicorn arguments using uvicorn --help

Upgrading

When a new version comes out, sometimes you want to upgrade your instance right away. Here's a checklist what to do:

  1. Carefully read the patch notes of the version you want to update to and all the versions that came out between the release of your version and the one you want to upgrade to. Breaking changes will be marked so and config updates will also be described in the patch notes
  2. Make a backup of your currently working instance. This includes both the PhotosAPI and the database
  3. Download the latest version using git (git pull if you cloned the repo in the past) or from the releases
  4. Reconfigure the config if needed and apply the changes from the patch notes
  5. Upgrade the dependencies in your virtual environment using pip install -r requirements.txt
  6. Start the migration using python photos_api.py --migrate from your virtual environment
  7. Test if everything works and troubleshoot/rollback if not

Using as a service

It's a good practice to use your API as a systemd service on Linux. Here's a quick overview how that can be done.

  1. Create user and move your API

    You don't always need to do so, but that's a cleaner way to deploy a service.

    1. Create service user photosapi using sudo useradd -r -U photosapi
    2. Assuming you are still in directory PhotosAPI, use cd .. to go up a level and then move your API to the distinguished folder. For example, /opt/: sudo mv ./PhotosAPI /opt/
    3. Make your user and its group own their directory using sudo chown -R photosapi:photosapi /opt/PhotosAPI
  2. Configure service

    Here's an example service file for PhotosAPI that is using virtual environment:

    [Unit]
    Description=Photos API
    After=network.target mongod.service
    Wants=network-online.target mongod.service
    
    [Service]
    Restart=always
    Type=simple
    ExecStart=/bin/bash -c 'source venv/bin/activate && venv/bin/uvicorn photos_api:app --port 8054'
    WorkingDirectory=/opt/PhotosAPI
    User=photosapi
    Group=photosapi
    
    [Install]
    WantedBy=multi-user.target
    
    1. Create a service by pasting code above into /etc/systemd/system/photos-api.service
    2. Enable your service to start on system boot using sudo systemctl enable photos-api.service
    3. Start your service now using sudo systemctl start photos-api.service
    4. Check if it's running using sudo systemctl status photos-api.service
    5. If something goes wrong - check API's logs using sudo journalctl -u photos-api.service