Skip to content

Instantly share code, notes, and snippets.

@petuhovskiy
Last active October 13, 2018 09:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save petuhovskiy/5bc50fa9fca736ea669bea399b9f1905 to your computer and use it in GitHub Desktop.
Save petuhovskiy/5bc50fa9fca736ea669bea399b9f1905 to your computer and use it in GitHub Desktop.

Где хранить файлы?

У меня накопилось достаточно много файлов и я не знаю где их хранить. Хотелось бы какую-нибудь прогу/сервис чтобы можно было нормально и безопасно хранить хранить свои файлы.

Что именно я хочу и более подробно про это:

  • обычное файловое хранилище, подобное тому что можно получить обычным доступом по FTP
  • гибкие и умные бэкапы
  • метаинфа у файлов
  • поиск, фильтры
  • безопасность

Файловое хранилище

Здесь особо нечего пояснять, я думаю все понимают что такое папки и древоидная структура которую они образовывают. Пример:

- home
  - awesome_videos
    - video_with_cats.mp4
    - video_with_dogs.mp4
  - awesome_photos
    - photo_with_mom.jpg
    - photo_with_dad.jpg
  - secure
    - keys
      - ssh_key_priv
      - ssh_key_public
    - vpn
      - vpn_profile_1
      - vpn_profile_2
    - passwords
      - account_vk
      - account_telegram
    - credit_card
      - tinkoff
      - sberbank
    - secure_noise
      - generated_noise.bin       # какой-нибудь большой бинарь с шумом для генерации ключей

Бэкапы

Описание

Основу бэкапа составляет описание того, что именно нужно бэкапить. Оно состоит из различных правил для включения/исключения директорий.

Рассмотрим на примере выше. Полезное описание может включать важные данные ключей и подобного:

- home
  * awesome_photos
  * secure
    x secure_noise

В данном описании мы делаем бэкап, который включает все файлы из awesome_photos и все кроме secure_noise из secure.

Задача бэкапа

Например, хотим запускать бэкап каждый день в 13:00.

Безопасность бэкапа

К примеру, бэкап это zip-файл содержащий всю инфу достаточную для восстановления этого бэкапа. Тогда можно настроить шифр zip-файла своим ключем и внутренних файлов, по желанию.

Доставка бэкапа

После генерирования бэкапа предоставлять возможность заливать его на облачные (или свои локальные) хранилища, типо Dropbox, Google Cloud или локальный NAS.

Метаинфа

Представим хранилище исходников, наподобие task1.cpp. А именно, кейс организации решений задач по спортивному программированию. Тогда давайте к каждому исходнику дописывать JSON, по которому позже можно будет производить поиск.

Например, мы решаем задачу на какие-то дикие оптимизиации и боремся за десятую часть баллов. Тогда может иметь пользу такая инфа:

# try301.cpp
{
  "timestamp": "10-12-2018 15:31:01:11233",
  "scored": "222.29",
  "submit_link": "http://online.judge/contest/123/task/3",
  "solution": "method1 with a=123"
}
# try302.cpp
{
  "timestamp": "10-12-2018 15:31:35:66356",
  "scored": "222.21",
  "submit_link": "http://online.judge/contest/123/task/3",
  "solution": "method1 with a=127"
}

Поиск и фильтры

Я бы разделял поиск на две категории: умный и гибкий.

Под умным поиском можно понимать поиск, который тебя понимает сам.

Хороший (и по мне лучший) пример такого поиска photos.google.com. Он умеет искать фотографии по именам людей, объектам на фотографии, временам года и городам, в которых была сделана фотография. Сейчас это настолько хороший сервис для хранения фотографий, что, как мне кажется, конкурировать с ним нереально.

Под гибким поиском я хочу рассматривать набор фильтров, или запрос на языке SQL. Такие запросы дают полную свободу и контроль на фильтрованием данных.

Например мы храним протеганные вкладки из браузера, где одна вкладка = один файл, и хотим найти те самые старые владки по какой-то теме, которые мы давно открыли и забыли про них до текущего момента. Тогда нашу задачу решают такие фильтры:

1. Выбрать все из вкладок
2. Оставить только те, у которых тег темы совпадает с нашей ( .filter{ it.theme == "our_theme" } )
3. И выбрать только те, которые старше недели ( .filter{ it.timestamp < now().minus(time.WEEK) } )

Безопасность

В таком виде, как описано выше, можно использовать сервис как менеджер паролей.

Например, в случаее усиленной паранои это может работать так:

  • Когда нам нужно вытащить пароль от vk.com, он присылается нам (как клиенту) и расшифровывается нашим ключем, который хранится у нас на клиенте.
  • Таким же образом, мы используя наш ключ шифруем наш пароль локально и засылаем храниться в сервисе.
  • Так получается безопасная система, в том смысле, что по сети не передаются наши незашифрованные пароли, о безопасности которых мы беспокоимся.

И упрощенная схема:

  • Для доступа к хранилищу паролей генерируется токен для доступа, временем на 3 минуты.
  • С этим токеном мы производим нужные операции для чтения/записи новых паролей.

Идея

Как я написал в начале, за годы жизнедеятельности накопилось достаточно файлов с кучей дубликатов и кучей полезных старых файлов, о которых я сейчас наверное и не вспомню. Я хочу организовать все в одном месте и дальше пользоваться без боли и страданий.

Насчет форм фактора, я представляю этот сервис как тот, который каждый должен запускать у себя на сервере/компе (если на компе, то он будет доступен без интернета!) и пользоваться в одно лицо. Это упрощает задачу в том смысле, что не нужно разделения файлов и подобного на юзеров, а можно просто представлять что все файлы принадлежат одному юзеру - админу (он же создатель и единственный пользователь).

И еще одна заметка

Под файлами я подзразумеваю в первую очередь обычные файлы в привычной файловой системе, но хочется перейти к более общему понятию файла как единице информации. Для примера, файлом может быть единовременный платный прием пищи, то есть объект содержащий место, время, съеденные блюда и стоимость. Тогда можно хранить папку с такими файлами и показывать всякую статистику по тому, сколько мы тратим на еду.

Поиск готовых решений

Пробую ownCloud.

А еще полагаю нужно попробовать Seafile

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment