Долгое время я пользовался Dropbox (в связке с GrabBox для быстрой заливки скриншотов), пока в один прекрасный день он не обрадовал меня ошибкой 429. Ну, все наверное видели подобное:

Причина такой ошибки, как ни странно, не обязательно связана с превышением трафика. Более того:
К сожалению, мы не предоставляем подробных сведений о трафике по ссылкам. Таким образом, узнать о том, трафик по которой из ссылок привел к блокировке, невозможно. Статистика и показатели, связанные с общими ссылкам, не отслеживаются, поэтому мы не можем предоставить информацию о причинах блокировки ссылок доступа.
Для платных аккаунтов все это также остается в силе, только лимиты на трафик увеличиваются в 10 раз. И это за $99 в год.

Было принято волевое решение отказаться от Dropbox (а также остальной проприетарщины) и перепробованы практически все основные бесплатные решения для установки на свой сервер — owncloud, pydio, seafile. Не буду сильно заострять на них внимание, обзоры и сравнения легко можно найти в сети. Скажу только в общих чертах, это одни из самых отвратительных образчиков софта, что я видел — тяжелые, глючные, перегруженные никому не нужным функционалом. В плане умеренности потребления ресурсов и скорости работы порадовал только seafile, но там у разработчиков весьма странные приоритеты и желание побольше монетизировать. При этом у людей пишущих клиент и у людей пишущих веб-интерфейс представления об этом разные. Полный бардак.

Дальнейшие действия напрашивались сами собой — изобретать свой велосипед.

Времени было не особо много, поэтому логично было использовать уже имеющиеся инструменты. С синхронизацией каталогов целиком все было просто и понятно — есть прекрасная связка rsync + Automator. Мониторим папку, при изменении натравливаем на нее rsync, далее распространяем на любое количество своих серверов.
Но этого недостаточно, нужны прямые ссылки и возможность ими быстро делиться.

Для этих целей был написан небольшой скриптик на ~100 строк, который сильно упростил расшарку как скриншотов, так и других файлов.

Как это работает на практике:


Итак, что нам нужно:
— собственный сервер на Linux или OS X с настроенным веб-сервером и доступом по ssh с помощью ключей
homebrew на клиентской машине для установки скрипта и зависимостей

Открываем терминал и выполняем первоначальную установку:
brew install http://deseven.info/sys/esupload.rb
mkdir ~/.esupload

Если вы принципиально не используете homebrew, то можно вручную скачать скрипт с гитхаба, положить его куда-нибудь и запускать оттуда. Не забудьте поставить также terminal-notifier и pv — скрипт их активно использует.

Следующий шаг — добавление профилей, профили хранятся в ~/.esupload и представляют собой обычные текстовые файлы с перечнем параметров.
Параметры такие:
# обязательные
remote_host=example.org             # удаленный сервер
remote_dir=/remotedir               # директория на удаленном сервере (куда смотрит ваш HTTP-сервер)
remote_url=http://example.org/share # базовая часть URL для публичных ссылок

# опциональные (указаны дефолтные значения)
remote_user=$USER              # ssh логин
remote_ident=$HOME/.ssh/id_rsa # ssh ключ
random_name=no                 # присвоение случайного имени файлу при заливке
chmod=u=rwx,g=rw,o=r           # смена прав на указанные
is_screenshot=no               # автоматически менять разрешение для скриншотов
delete_after_upload=no         # удалять файл после закачки
track_progress=no              # отслеживать процесс заливки
track_interval=30              # интервал отслеживания в секундах

Далее на конкретных задачах.


Скриншоты


Задача — делаем скриншот стандартными средствами (??3 или ??4), получаем в буфер обмена прямую ссылку на него.

Создаем отдельный каталог под скриншоты и переназначаем сохранение в этот каталог:
mkdir ~/Screenshots
defaults write com.apple.screencapture location ~/Screenshots
killall SystemUIServer

Далее создаем профиль с именем screenshot (~/.esupload/screenshot):
remote_dir=/var/www/example.org/screenshots
remote_host=example.org
remote_user=upload
remote_url=http://example.org/screenshots

random_name=yes
is_screenshot=yes
delete_after_upload=yes

Таким образом, при заливке скриншота ему будет присвоено случайное имя, при необходимости (на Retina-дисплеях) он будет уменьшен и удален после заливки.

И наконец открываем Automator, создаем новый Folder Action, указываем наш каталог со скриншотами и добавляем действие «Run shell script», в котором выбираем «Pass input: as arguments» и /usr/local/bin/esupload с профилем screenshot в качестве обработчика.
Можно также добавить дополнительный фильтр с уловиями какие именно файлы будут передаваться скрипту для заливки, но так как мы используем каталог исключительно под скриншоты, то особого смысла в этом нет.
Должно получиться нечто такого вида:


Сохраняем, нажимаем Run для проверки. Все.

Для тестирования самой заливки можно запустить esupload вручную:
esupload screenshot "/path/to/screenshot"


Файлы


Задача — кидаем файл на иконку приложения в доке, получаем в буфер обмена прямую ссылку на него.

Создаем профиль file (~/.esupload/file):
remote_dir=/var/www/example.org/share
remote_host=example.org
remote_user=upload
remote_url=http://example.org/share

track_progress=yes

С использованием параметра track_progress раз в 30 секунд (по умолчанию) будет выводиться прогресс заливки текущего файла. Это полезно для больших файлов, которые могут заливаться достаточно долго.

Снова открываем Automator, в этот раз создаем приложение, в котором в качестве действия делаем все то же самое, что делали и для скриншотов, не забыв только поменять профиль на file:


Сохраняем приложение в /Applications, при желании можно заменить иконку, подменив файл Resources/AutomatorApplet.icns внутри приложения.

Велосипед готов! Плюсы и минусы по-моему достаточно очевидны, но думаю нужно привести их в качестве итога.

Плюсы:
  • безопасно (для передачи файлов и авторизации используется ssh)
  • просто и гибко (можно заточить под любой сценарий)
  • отсутствие зависимости от сторонних сервисов и продуктов

Минусы:
  • нет способа контролировать уже залитые файлы и получать на них ссылки
  • нет очереди и контроля передачи
  • отсутствие контроля доступа и прочих фич


Пожелания и предложения, как по самой методике, так и по скрипту, приветствуются.

Комментарии (34)


  1. Mel
    06.04.2016 16:22
    +1

    Проще скачать monosnap, чем устраивать весь этот гемор. Но если руки чешутся тут уже ничего не поделаешь :)


    1. deseven
      06.04.2016 16:30
      +9

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


      1. Tsyganov_Ivan
        07.04.2016 10:27

        Справедливости ради скажу — monosnap умеет заливать скриншоты по ssh)

        UPD: Ниже уже говорили это… Я буду читать все комменты перед отправкой своего)


  1. aik
    06.04.2016 16:37

    Есть уже готовые инструменты для загрузки скриншотов куда нравится.
    Screencloud, например, если простенькое. Ну или если хочется совсем страшного, то sharex — опенсорс, несколько десятков хостингов для аплоада и т.п.


    1. aik
      06.04.2016 16:43

      Вдогонку — sharex вроде как на маке не работает.


    1. isden
      07.04.2016 11:34

      Еще есть dropshare и он неплох.


  1. NeoCode
    06.04.2016 18:38

    А эта ошибка 429 — она на чтение (слишком часто обращаются к файлу извне) или на запись (слишком часто обновляют данные в дропбоксе)? Я с таким никогда не сталкивался, поэтому интересно.


    1. deseven
      06.04.2016 18:50

      На чтение. Или из-за авторских прав. Или из-за вирусов. Никто не объясняет почему конкретно.


      1. NeoCode
        06.04.2016 19:12

        Жалко) У мня была идея использовать такие облачные файлохранилища для одной интересной цели…
        А у Гугл и Яндекс дисков тоже аналогичное поведение?


        1. deseven
          06.04.2016 20:53

          Не буду врать — не знаю.


      1. 15432
        06.04.2016 23:42

        У меня было. Обратился в техподдержку, сказали, что заблокировали меня из-за архива с одной софтиной, по чьей-то жалобе на «вирус». Никакого вируса и проблем с авторскими правами у того архива не было. Но им объяснять бесполезно. Удалил, сообщил, разблочили.


  1. EvRiaL
    06.04.2016 18:38
    -7

    Колхоз какой, и к чему в топике замена дропбокса? В monosnap давно уже есть ftp, sftp, webdav, dropbox и прочие облака. С удобным хранилищем и даже редактором.



  1. nizzkos
    06.04.2016 20:54

    Еще немного не проприетарных реализаций для OS X prism-break.org/ru/subcategories/os-x-file-storage-sync


  1. Goodkat
    06.04.2016 22:48
    +2

    Дропбокс — это ещё и более-менее удобный доступ с айпада/айфона с возможностью аплоада любых файлов.
    Без этого это не замена дропбокса, а шарилка скриншотов на своём сервере.

    Есть ли rsync для iOS?


    1. deseven
      06.04.2016 23:13
      +1

      Согласен. У меня очень специфичный юзкейс, при котором это не нужно.

      Как ни странно (я сам удивлен), есть.


      1. rgaliull
        07.04.2016 01:54

        Как обычно, камменты рулят :)
        Цена на акросинк рвет в клочья! 49 баксов за лицензию!


        1. deseven
          07.04.2016 10:41

          $4.99 же.


          1. arhka
            07.04.2016 13:26

            Рядом с Вашей ссылкой: acrosync.com/buy.html

            Price per License 1-4 Licenses $49.99

            Где я слепой? =)


            1. deseven
              07.04.2016 13:26

              А, я думал мы про iOS версию говорим. Она $4.99 стоит.


  1. vsapronov
    07.04.2016 01:18

    Здравствуйте, а вы не могли бы подробно написать, чем не устроил ownCloud? Вроде бы он без плагинов один в один — Dropbox по интерфейсу. Синхронизаторы у него есть под все платформы…
    Скорость. Мы его в нашем проекте ставим на дохлые ARM-платформы. И он там работает нормально. Т.е. может где-то тормозило у вас? Где?


    1. landy
      07.04.2016 01:43

      Аналогичное замечание, не скажу про все указанные.
      Но ownCloud использую давно и в первую очередь как раз для отказа от паранои проприетарщины (и когда dropbox начал просить денег, за то что раньше получал бесплатно). У меня нареканий нет (кроме некоторых моментов, например предпросмотра RAW фото файлов).
      И соответственно хотелось бы чтобы «заострили внимание» по поводу «глючности/тормознутости».


    1. rgaliull
      07.04.2016 01:58

      Я для себя выбрал pydio. Работает, мягко говоря, не_очень.


    1. deseven
      07.04.2016 11:08

      Здравствуйте. Да, owncloud из всего перепробованного изначально произвел самое приятное впечатление. Веб-интерфейс у него точно лучший.
      А вот скорость… Первоначально я заставил их клиент синхронизировать все содержимое моего дропбокса. Сначала он упал, после перезапуска долго думал, сожрав почти гиг памяти, потом начал медленно и неторопливо заливать.
      Пишут, что owncloud не очень хорошо работает с большим количеством маленьких файлов, возможно это и есть причина. В дропбоксе у меня было 12000+ файлов.


  1. ivlis
    07.04.2016 02:49

    Syncthing же.


    1. aik
      07.04.2016 07:11

      А как при помощи syncthing можно делать и расшаривать скриншоты?


      1. watashiwaale
        07.04.2016 10:42

        Навскидку — на ум приходит такой вариант:

        1. Поднимаем сервер с Syncthing. Защищаем панель паролем (например, закинув её за nginx).
        2. Поднимаем HTTP-сервер с корнем в той папке, в которую пишет Syncthing.
        3. Расшариваем папку со скриншотами со своего компьютера на сервер.

        Вроде должно сработать.


        1. aik
          07.04.2016 11:53

          4. Пишем демона, который следит за папкой и пихает в буфер обмена последний появившийся там файл.

          Костыли же…


  1. Fan67
    07.04.2016 10:42

    О, я тоже долго мучился настройкой своего облака, проблем добавляло то, что на работе мак, дома винда, а в дороге айпад и айфон.
    Случайно заметил на кикстартере девайс Lima (сейчас вроде MeetLima называется).

    Использую уже около полугода, частенько падает (где-то раз в неделю, обычно когда выходит новое глобальное обновление), но в видна положительная динамика. Жду когда выпустят поддержку raid или хотя бы бэкап на второй hdd, подключённый к Лиме.

    На кикстартере позиционировали как общий рабочий стол для всех девайсов, но пока всё в состоянии дропбокса. Кроссплатформенный общий десктоп только в закрытом тестовом режиме.


    1. watashiwaale
      07.04.2016 11:04

      $99 — как-то многовато, думается, для железки с двумя портами. Аналог можно на том же Raspberry Pi сделать за считанные часы, например.


      1. Fan67
        07.04.2016 13:06

        На кикстартере они стоили дешевле, 99$ действительно многовато. С другой стороны они сами постоянно обновляются, и если бы их декларируемая конечная цель в виде единого десктопа на всех устройствах была реализована, то оно бы того стоило.
        А как сделать поддержку iOS на собственном железе?
        Я в своих изысканиях упёрся в проблему нормального доступа с мобильного и планшета.

        Ах, да, там в комплекте идут симпатичные наушники и можно выбирать цвет девайса. :)


        1. aik
          07.04.2016 13:24

          цель в виде единого десктопа на всех устройствах

          Ну, по идее, это делается при помощи запуска терминального сервера.


        1. watashiwaale
          13.04.2016 08:32

          А это уже зависит от того, что именно делать. Для компьютеров вполне хватит дополнительной ноды Syncthing, а вот с телефонов можно подключаться, ну например, по WebDAV.

          Единый десктоп — идея неплохая, конечно, но как мне кажется, всё это решается удобным представлением папки, а также придётся немного покодить под каждую ОС отдельно (на винде, например, есть Stardock Fences, который прямо на десктопе работает — нужно что-нибудь подобное). А там хоть через Dropbox они синхронизируются, хоть через своё облако — без разницы.


  1. Feshl
    07.04.2016 10:42
    -1

    На винде есть бесплатная прога HFS. Работает хорошо можете зайти в на мой комп если он включен 46.242.37.73