summaryrefslogtreecommitdiff
path: root/doc/development
diff options
context:
space:
mode:
authorGabriel Mazetto <brodock@gmail.com>2017-11-08 03:36:06 +0100
committerGabriel Mazetto <brodock@gmail.com>2017-11-08 03:36:06 +0100
commit987636fabe46c2b80c30cd51224554d10c54a3c5 (patch)
treea4b442b67b2d9c5c8ff9db82f8d5722f85c51e95 /doc/development
parent2f644452523cd7f30bf61d15a88e1aab5d818a48 (diff)
downloadgitlab-ce-update-upload-documentation.tar.gz
Added file storage documentation and updated hash storage oneupdate-upload-documentation
Diffstat (limited to 'doc/development')
-rw-r--r--doc/development/file_storage.md48
1 files changed, 48 insertions, 0 deletions
diff --git a/doc/development/file_storage.md b/doc/development/file_storage.md
new file mode 100644
index 00000000000..1d95057b9a1
--- /dev/null
+++ b/doc/development/file_storage.md
@@ -0,0 +1,48 @@
+# File Storage in GitLab
+
+We use the [CarrierWave] gem to handle file upload, store and retrieval.
+
+There are many places where file uploading is used, according to contexts:
+
+* System
+ - Instance Logo (logo visible in sign in/sign up pages)
+ - Header Logo (one displayed in the navigation bar)
+* Group
+ - Group avatars
+* User
+ - User avatars
+ - User snippet attachments
+* Project
+ - Project avatars
+ - Issues/MR Markdown attachments
+ - Issues/MR Legacy Markdown attachments
+ - CI Build Artifacts
+ - LFS Objects
+
+
+## Disk storage
+
+GitLab started saving everything on local disk. While directory location changed from previous versions,
+they are still not 100% standardized. You can see them below:
+
+| Description | In DB? | Relative path | Uploader class | model_type |
+| ------------------------------------- | ------ | ----------------------------------------------------------- | ---------------------- | ---------- |
+| Instance logo | yes | uploads/-/system/appearance/logo/:id/:filename | `AttachmentUploader` | Appearance |
+| Header logo | yes | uploads/-/system/appearance/header_logo/:id/:filename | `AttachmentUploader` | Appearance |
+| Group avatars | yes | uploads/-/system/group/avatar/:id/:filename | `AvatarUploader` | Group |
+| User avatars | yes | uploads/-/system/user/avatar/:id/:filename | `AvatarUploader` | User |
+| User snippet attachments | yes | uploads/-/system/personal_snippet/:id/:random_hex/:filename | `PersonalFileUploader` | Snippet |
+| Project avatars | yes | uploads/-/system/project/avatar/:id/:filename | `AvatarUploader` | Project |
+| Issues/MR Markdown attachments | yes | uploads/:project_path_with_namespace/:random_hex/:filename | `FileUploader` | Project |
+| Issues/MR Legacy Markdown attachments | no | uploads/-/system/note/attachment/:id/:filename | `AttachmentUploader` | Note |
+| CI Artifacts (CE) | yes | shared/artifacts/(?) | `ArtifactUploader` | Ci::Build |
+| LFS Objects (CE) | yes | shared/lfs-objects/:hex/:hex/:object_hash | `LfsObjectUploader` | LfsObject |
+
+CI Artifacts and LFS Objects behave differently in CE and EE. In CE they inherit the `GitlabUploader`
+while in EE they inherit the `ObjectStoreUploader` and store files in and S3 API compatible object store.
+
+In the case of Issues/MR Markdown attachments, there is a different approach using the **Hashed Storage** layout,
+instead of basing the path into a mutable variable `:project_path_with_namespace`, it's possible to use the
+hash of the project ID instead, if project migrates to the new approach (introduced in 10.2).
+
+[CarrierWave]: https://github.com/carrierwaveuploader/carrierwave