Хранилище и пути

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

Определение

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

Code

Это папка, контролируемая инструментом контроля версий git. Её содержимое напрямую зависит от того, что закомичено в git и какая сейчас выбрана ветка. Для аналогии можно привести git репозиторий на локальном компьютере. При выполнении git checkout содержимое меняется, чтобы соответствовать выбранной ветке.

Загрузка кода приложения в эту папку осуществляется при выполнении git push или при загрузке через интерфейс с выбранной папкой Code. Файл конфигурации так-же сохраняется в эту папку.

Данная папка доступна только для загрузки кода и на этапе сборки приложения, поэтому в процессе работы самого приложения доступа к ней нет и взаимодействие происходит с папкой Artifacts.

Artifacts

В этой папке хранится результат сборки приложения. Так, если это проект на Python в ней будет содержаться все, что было в папке Code + установленные зависимости. Для компилируемых языков там как правило хранятся бинарники, соответсвующее указанному в файле конфигурации шаблону (build.artifacts). В контейнер, в котором запускается приложение эта папка монтируется в папку контейнера /app. Команда на запуск приложения тоже выполняется «из этой папки» внутри контейнера.

Поскольку содержимое этой папки однозначно получается путем сборки содержимого папки Code, бекапы данной папки на стороне Амвера не делаются. Более того, содержимое данной папки может быть полностью или частично утеряно при пересборке приложения. При заморозке проекта файлы из данной папки полностью удаляются.

Для большей наглядности советуем обратить внимание на пример в конце статьи.

Внимание

Не следует сохранять данные, получаемые в процессе работы приложения в данную папку. Они могут быть утеряны. Используйте папку постоянного хранилища „Data“.

Amvera не несет ответсвенность за потерю файлов из данной папки.

Data

Это папка постоянного хранилища, которая на этапе запуска приложения монтируется в запускаемый контейнер в путь, указанный в файле конфигурации в run.persistenceMount (по умолчанию /data).

Подсказка

В коде приложения путь сохранения данных в данную папку должен быть абсолютный.

Например, для случая по умолчанию /data путь в коде будет: /data/<filename>

Именно в этой папке стоит хранить данные, которые собираются в процессе работы приложения и требуют постоянного хранения. Если ваше приложение использует sqlite базу данных или сохраняет логи, которые требуется долго хранить, то такие файлы должны находиться именно в этой папке.

Помимо работы с этой папкой из приложения, возможно так-же загрузить/удалить файлы используя интерфейс.

Важно

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

Пример

Рассмотрим особенности работы с папками и их путями внутри контейнера.

  1. Предположим, ваш проект на Python содержит следующие файлы, которые загружаются в папку Code:

    ├─ main.py
    ├─ config.py
    ├─ amvera.yaml
    ├─ requirements.txt
    ├─ README.md
    └─ data
       ├─ users.db
       └─ logs
    
  2. После загрузки и процесса сборки папка Code останется неизменной, а содержимое папки Artifacts станет следующим:

     ├─ main.py
     ├─ config.py
     ├─ amvera.yaml
     ├─ requirements.txt
     ├─ README.md
     ├─ data
     |  ├─ users.db
     |  └─ logs
     └─ venv
        ├─ lib_one
        ├─ lib_two
        └─ .........
    

    В ней оказалось содержимое папки Code + создалась папка venv, в которой хранится виртуальное окружение с нужными библиотеками, указанными в requirements.txt.

  3. Когда создается контейнер, папка Artifacts монтируется в папку /app, а папка Data монтируется в путь, указанный в конфигурации (возьмем значение по умолчанию /data).

    Внутри контейнера для запущенного приложения пути будут выглядеть следующим образом:

    ├─ /data
    |  ├─  persistant_users.db
    |  └─ logs
    └─ /app
       ├─ main.py
       ├─ config.py
       ├─ amvera.yaml
       ├─ requirements.txt
       ├─ README.md
       ├─ data
       |  ├─ users.db
       |  └─ logs
       └─ venv
          ├─ lib_one
          ├─ lib_two
          └─ .........
    

    По умолчанию, команда запуска производится именно в папке /app.

  4. Запись данных.

    Рассмотрим два случая правильного и неправильного сохранения файлов, требующих постоянное хранения.

    • Неправильное

      Если в коде обращение к файлу БД идёт с указанием пути data/users.db, а к папке с логами по пути data/logs, то их абсолютные пути будут соответсвенно /app/data/users.db и /app/data/logs, что соответствует папке Artifacts.

      При перезагрузке и пересборке проекта эти файлы могут быть потеряны.

    • Правильное

      Указываем абсолютный путь к файлу с БД как /data/persistant_users.db и к логам как /data/logs. Таким образом, файлы сохраняются в папку Data и не будут потеряны при перезагрузке или пересборке.

  5. (Для продвинутых пользователей)

    Можно указать путь для монтирования папки Data прямо внутрь подпапки, в которую монтируются Artifacts. Например, выполнить монтирование в /app/data, тогда дерево будет выглядеть следующим образом:

    └─ /app
       ├─ main.py
       ├─ config.py
       ├─ amvera.yaml
       ├─ requirements.txt
       ├─ README.md
       ├─ data # эта папка уже не из Artifacts, а из Data
       |  ├─ persistant_users.db
       |  └─ logs
       └─ venv
          ├─ lib_one
          ├─ lib_two
          └─ .........
    

    Внимание

    Использование данного способа требует понимание принципа монтирования папок и может привести к непредсказуемому поведению.

Работа с файлами через интерфейс

Для работы с файлами необходимо перейти во вкладку «Репозиторий» и выбрать нужную папку.

Любое действие, совершаемое в папке Code создает коммит в git репозиторий.

folder-select

  • Загрузка

    Загрузка возможно только в папки Code и Data. Для загрузки требуется нажать кнопку «Загрузить данные» и перетащив их в окно убедиться, что они отобразились в списке. uploaded-file

  • Удаление

    Для удаления файла требуется нажать на иконку «мусорная корзина» в правом верхнем углу файла/папки.

  • Скачивание

    Для скачивания файлов требуется нажать кнопку «Скачать данные» и выбрать папки, содержимое которых требуется сохранить локально. download-files