БД для чата на MongoDB — где хранить картинки и иные файлы?
Пишу чат, в качестве БД используется MongoDB.
Сущность сообщения помимо текста может содержать картинки и иные типы файлов.
Каким образом лучше хранить файлы? Хранить в БД только ссылки на файлы, а сами файлы на отдельно файловом сервере? Или хранить файлы, используя GridFS?
Файлы лучше хранить в файловой системе. Ощутимый бонус от хранения файла в ФС - можно отдавать напрямую веб-сервером (nginx, apach, etc), не надо для этого куда-то лезть.
Если уж не помещается или нужны какие-то особые фишки - тогда можно и GridFS или другие инструменты.
Если картинки/файлы не большие, то можно и в самом сообщении - одним запросом будет получены и сообщения и файлы, если крупные - то выносить в gridfs/файлы (например как в slack).
Если файлы должны отдаваться только авторизованым (имеющим права), то хранение на диске особо преимуществ не даст (т.к. при раздаче веб сервером, он по прямой ссылке отдаст файлы кому угодно).
Если файлы должны отдаваться только авторизованым (имеющим права), то хранение на диске особо преимуществ не даст (т.к. при раздаче веб сервером, он по прямой ссылке отдаст файлы кому угодно).
RidgeA, наверно, но через адские костыли.
как вы сделаете проверку, если в запросе кука/токен, а вам нужно получить пользователя, его группы и соотвествие файла группам? например в nginx?
lega, чисто в nginx - да, через адские костыли в виде LUA или самописных модулей.
Но есть для nginx модуль nginx.org/en/docs/http/ngx_http_auth_request_modul... с помощью которого можно на бек-энд отправить запрос, где проверить права доступа и вернуть соответствующих http код. Дальше либо nginx заворачивает запрос, либо отдает статику. Важно, что на этапе отдачи статики бэк-энд не учавствует.