aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsptaule <lecas83@gmail.com>2022-01-25 15:27:39 +0100
committersptaule <lecas83@gmail.com>2022-01-25 15:27:39 +0100
commitee4d6a01e16ac53fa3e48340a47455281d5f6bc0 (patch)
tree98d21309e281ea02ed5fe2b12187b211f761f385
parentada5e9ac0e6e1e226534a463238b06930ba58b64 (diff)
downloadgaragehq.deuxfleurs.fr-ee4d6a01e16ac53fa3e48340a47455281d5f6bc0.tar.gz
garagehq.deuxfleurs.fr-ee4d6a01e16ac53fa3e48340a47455281d5f6bc0.zip
Organized doc md with metadata & draft for doc template
-rwxr-xr-xconfig.toml82
-rw-r--r--content/documentation/_index.md5
-rw-r--r--content/documentation/connect/_index.md6
-rw-r--r--content/documentation/connect/apps.md4
-rw-r--r--content/documentation/connect/backup.md4
-rw-r--r--content/documentation/connect/cli-nextcloud-gui.pngbin201685 -> 0 bytes
-rw-r--r--content/documentation/connect/cli.md4
-rw-r--r--content/documentation/connect/code.md4
-rw-r--r--content/documentation/connect/fs.md4
-rw-r--r--content/documentation/connect/index.md46
-rw-r--r--content/documentation/connect/repositories.md4
-rw-r--r--content/documentation/connect/websites.md4
-rw-r--r--content/documentation/cookbook/_index.md6
-rw-r--r--content/documentation/cookbook/exposing_websites.md4
-rw-r--r--content/documentation/cookbook/from_source.md4
-rw-r--r--content/documentation/cookbook/gateways.md4
-rw-r--r--content/documentation/cookbook/index.md31
-rw-r--r--content/documentation/cookbook/real_world.md4
-rw-r--r--content/documentation/cookbook/recovering.md4
-rw-r--r--content/documentation/cookbook/reverse_proxy.md4
-rw-r--r--content/documentation/cookbook/systemd.md4
-rw-r--r--content/documentation/cookbook/website.md8
-rw-r--r--content/documentation/design/_index.md6
-rw-r--r--content/documentation/design/benchmarks.md4
-rw-r--r--content/documentation/design/goals.md4
-rw-r--r--content/documentation/design/index.md31
-rw-r--r--content/documentation/design/internals.md4
-rw-r--r--content/documentation/design/related_work.md4
-rw-r--r--content/documentation/development/_index.md6
-rw-r--r--content/documentation/development/devenv.md4
-rw-r--r--content/documentation/development/index.md19
-rw-r--r--content/documentation/development/miscellaneous_notes.md4
-rw-r--r--content/documentation/development/release_process.md4
-rw-r--r--content/documentation/development/scripts.md4
-rw-r--r--content/documentation/intro.md106
-rw-r--r--content/documentation/quick-start/_index.md6
-rw-r--r--content/documentation/quick-start/overview.md (renamed from content/documentation/quick_start/index.md)6
-rw-r--r--content/documentation/reference-manual/_index.md6
-rw-r--r--content/documentation/reference-manual/cli.md (renamed from content/documentation/reference_manual/cli.md)4
-rw-r--r--content/documentation/reference-manual/configuration.md (renamed from content/documentation/reference_manual/configuration.md)4
-rw-r--r--content/documentation/reference-manual/layout.md (renamed from content/documentation/reference_manual/layout.md)4
-rw-r--r--content/documentation/reference-manual/s3_compatibility.md (renamed from content/documentation/reference_manual/s3_compatibility.md)4
-rw-r--r--content/documentation/reference_manual/index.md10
-rw-r--r--content/documentation/working-documents/_index.md6
-rw-r--r--content/documentation/working-documents/compatibility_target.md (renamed from content/documentation/working_documents/compatibility_target.md)4
-rw-r--r--content/documentation/working-documents/design_draft.md (renamed from content/documentation/working_documents/design_draft.md)4
-rw-r--r--content/documentation/working-documents/load_balancing.md (renamed from content/documentation/working_documents/load_balancing.md)4
-rw-r--r--content/documentation/working-documents/migration_04.md (renamed from content/documentation/working_documents/migration_04.md)4
-rw-r--r--content/documentation/working-documents/migration_06.md (renamed from content/documentation/working_documents/migration_06.md)4
-rw-r--r--content/documentation/working_documents/index.md13
-rw-r--r--templates/documentation.html224
51 files changed, 336 insertions, 411 deletions
diff --git a/config.toml b/config.toml
index d760b2f..5992b61 100755
--- a/config.toml
+++ b/config.toml
@@ -1,133 +1,54 @@
-# The base URL of the site; the only required configuration variable.
base_url = "https://garagehq.deuxfleurs.fr"
-
-# The site title and description; used in feeds by default.
title = "Garage"
description = "An open-source distributed storage service you can self-host to fullfill many needs"
-
-# The default language; used in feeds.
default_language = "en"
-
-# For overriding the default output directory `public`, set it to another value (e.g.: "docs")
output_dir = "public"
-
-# When set to "true", the Sass files in the `sass` directory in the site root are compiled.
-# Sass files in theme directories are always compiled.
compile_sass = true
-
-# When set to "true", the generated HTML files are minified.
minify_html = false
-
-# A list of glob patterns specifying asset files to ignore when the content
-# directory is processed. Defaults to none, which means that all asset files are
-# copied over to the `public` directory.
-# Example:
-# ignored_content = ["*.{graphml,xlsx}", "temp.*"]
ignored_content = []
-
-# When set to "true", a feed is automatically generated.
generate_feed = true
-
-# The filename to use for the feed. Used as the template filename, too.
-# Defaults to "atom.xml", which has a built-in template that renders an Atom 1.0 feed.
-# There is also a built-in template "rss.xml" that renders an RSS 2.0 feed.
feed_filename = "rss.xml"
-
-# The number of articles to include in the feed. All items are included if
-# this limit is not set (the default).
-# feed_limit = 20
-
-# When set to "true", files in the `static` directory are hard-linked. Useful for large
-# static files. Note that for this to work, both `static` and the
-# output directory need to be on the same filesystem. Note that the theme's `static`
-# files are always copied, regardless of this setting.
hard_link_static = false
-
-# The taxonomies to be rendered for the site and their configuration of the default languages
-# Example:
-# taxonomies = [
-# {name = "tags", feed = true}, # each tag will have its own feed
-# {name = "tags"}, # you can have taxonomies with the same name in multiple languages
-# {name = "categories", paginate_by = 5}, # 5 items per page for a term
-# {name = "authors"}, # Basic definition: no feed or pagination
-# ]
-#
taxonomies = [
{ name = "categories", feed = true, paginate_by = 10 },
{ name = "tags", feed = true, paginate_by = 10 }
]
-
-# When set to "true", a search index is built from the pages and section
-# content for `default_language`.
build_search_index = true
-# Configuration of the Markdown rendering
[markdown]
-# When set to "true", all code blocks are highlighted.
highlight_code = true
-
-# A list of directories used to search for additional `.sublime-syntax` files.
extra_syntaxes = []
-
-# The theme to use for code highlighting.
-# See below for list of allowed values.
-highlight_theme = "one-dark"
-
-# When set to "true", emoji aliases translated to their corresponding
-# Unicode emoji equivalent in the rendered Markdown files. (e.g.: :smile: => 😄)
render_emoji = true
-
-# Whether external links are to be opened in a new tab
-# If this is true, a `rel="noopener"` will always automatically be added for security reasons
external_links_target_blank = true
-
-# Whether to set rel="nofollow" for all external links
external_links_no_follow = true
-
-# Whether to set rel="noreferrer" for all external links
external_links_no_referrer = true
-
-# Whether smart punctuation is enabled (changing quotes, dashes, dots in their typographic form)
-# For example, `...` into `…`, `"quote"` into `“curly”` etc
smart_punctuation = false
-# Configuration of the link checker.
[link_checker]
-# Skip link checking for external URLs that start with these prefixes
skip_prefixes = [
"http://[2001:db8::]/",
]
-
-# Skip anchor checking for external URLs that start with these prefixes
skip_anchor_prefixes = [
"https://caniuse.com/",
]
-# Various slugification strategies, see below for details
-# Defaults to everything being a slug
[slugify]
paths = "on"
taxonomies = "on"
anchors = "on"
[search]
-# Whether to include the title of the page/section in the index
include_title = true
-# Whether to include the description of the page/section in the index
include_description = false
-# Whether to include the path of the page/section in the index
include_path = false
-# Whether to include the rendered content of the page/section in the index
include_content = true
[extra]
katex.enabled = true
katex.auto_render = true
-
chart.enabled = true
mermaid.enabled = true
galleria.enabled = true
-
navbar_items = [
{ code = "en", nav_items = [
{ url = "$BASE_URL/", name = "Overview" },
@@ -159,9 +80,6 @@ email = "contact@garagehq.com"
[extra.analytics]
google = "UA-176984489-2"
-[extra.commenting]
-disqus = "deepthought-theme"
-
[extra.mapbox]
enabled = true
access_token = "pk.eyJ1IjoicmF0YW5zaHJlc2h0aGEiLCJhIjoiY2tla2s2NmM3MDd0ZzJzbXFtc3Y2YmU0NyJ9.0RhUnJPKbxHWw3xGPnnBlA"
diff --git a/content/documentation/_index.md b/content/documentation/_index.md
new file mode 100644
index 0000000..68d1395
--- /dev/null
+++ b/content/documentation/_index.md
@@ -0,0 +1,5 @@
++++
+template = "documentation.html"
+page_template = "documentation.html"
+redirect_to = "documentation/quick-start/"
++++ \ No newline at end of file
diff --git a/content/documentation/connect/_index.md b/content/documentation/connect/_index.md
new file mode 100644
index 0000000..ff3976a
--- /dev/null
+++ b/content/documentation/connect/_index.md
@@ -0,0 +1,6 @@
++++
+title = "Integrations"
+weight = 3
+sort_by = "weight"
+redirect_to = "documentation/connect/apps/"
++++ \ No newline at end of file
diff --git a/content/documentation/connect/apps.md b/content/documentation/connect/apps.md
index f88e334..37e57f3 100644
--- a/content/documentation/connect/apps.md
+++ b/content/documentation/connect/apps.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Apps (Nextcloud, Peertube...)"
+weight = 5
+++
# Apps (Nextcloud, Peertube...)
diff --git a/content/documentation/connect/backup.md b/content/documentation/connect/backup.md
index 60a875b..36b894b 100644
--- a/content/documentation/connect/backup.md
+++ b/content/documentation/connect/backup.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Backups (restic, duplicity...)"
+weight = 25
+++
# Backups (restic, duplicity...)
diff --git a/content/documentation/connect/cli-nextcloud-gui.png b/content/documentation/connect/cli-nextcloud-gui.png
deleted file mode 100644
index 7a58a3a..0000000
--- a/content/documentation/connect/cli-nextcloud-gui.png
+++ /dev/null
Binary files differ
diff --git a/content/documentation/connect/cli.md b/content/documentation/connect/cli.md
index d6b5fba..57664ac 100644
--- a/content/documentation/connect/cli.md
+++ b/content/documentation/connect/cli.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "CLI tools"
+weight = 20
+++
# CLI tools
diff --git a/content/documentation/connect/code.md b/content/documentation/connect/code.md
index 2224293..5c7f7fc 100644
--- a/content/documentation/connect/code.md
+++ b/content/documentation/connect/code.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Your code (PHP, JS, Go...)"
+weight = 30
+++
# Your code (PHP, JS, Go...)
diff --git a/content/documentation/connect/fs.md b/content/documentation/connect/fs.md
index 8258acc..eb1405f 100644
--- a/content/documentation/connect/fs.md
+++ b/content/documentation/connect/fs.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "FUSE (s3fs, goofys, s3backer...)"
+weight = 25
+++
# FUSE (s3fs, goofys, s3backer...)
diff --git a/content/documentation/connect/index.md b/content/documentation/connect/index.md
deleted file mode 100644
index a01bc48..0000000
--- a/content/documentation/connect/index.md
+++ /dev/null
@@ -1,46 +0,0 @@
-+++
-title="Doc Post"
-date=2018-08-20
-+++
-
-# Integrations
-
-Garage implements the Amazon S3 protocol, which makes it compatible with many existing software programs.
-
-In particular, you will find here instructions to connect it with:
-
- - [web applications](./apps.md)
- - [website hosting](./websites.md)
- - [software repositories](./repositories.md)
- - [CLI tools](./cli.md)
- - [your own code](./code.md)
-
-### Generic instructions
-
-To configure S3-compatible software to interact with Garage,
-you will need the following parameters:
-
-- An **API endpoint**: this corresponds to the HTTP or HTTPS address
- used to contact the Garage server. When runing Garage locally this will usually
- be `http://127.0.0.1:3900`. In a real-world setting, you would usually have a reverse-proxy
- that adds TLS support and makes your Garage server available under a public hostname
- such as `https://garage.example.com`.
-
-- An **API access key** and its associated **secret key**. These usually look something
- like this: `GK3515373e4c851ebaad366558` (access key),
- `7d37d093435a41f2aab8f13c19ba067d9776c90215f56614adad6ece597dbb34` (secret key).
- These keys are created and managed using the `garage` CLI, as explained in the
- [quick start](../quick_start/index.md) guide.
-
-Most S3 clients can be configured easily with these parameters,
-provided that you follow the following guidelines:
-
-- **Force path style:** Garage does not support DNS-style buckets, which are now by default
- on Amazon S3. Instead, Garage uses the legacy path-style bucket addressing.
- Remember to configure your client to acknowledge this fact.
-
-- **Configuring the S3 region:** Garage requires your client to talk to the correct "S3 region",
- which is set in the configuration file. This is often set just to `garage`.
- If this is not configured explicitly, clients usually try to talk to region `us-east-1`.
- Garage should normally redirect your client to the correct region,
- but in case your client does not support this you might have to configure it manually.
diff --git a/content/documentation/connect/repositories.md b/content/documentation/connect/repositories.md
index 429a15a..52d27f3 100644
--- a/content/documentation/connect/repositories.md
+++ b/content/documentation/connect/repositories.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Repositories (Docker, Nix, Git...)"
+weight = 15
+++
# Repositories (Docker, Nix, Git...)
diff --git a/content/documentation/connect/websites.md b/content/documentation/connect/websites.md
index 70c9de6..1dd9170 100644
--- a/content/documentation/connect/websites.md
+++ b/content/documentation/connect/websites.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Websites (Hugo, Jekyll, Publii...)"
+weight = 10
+++
# Websites (Hugo, Jekyll, Publii...)
diff --git a/content/documentation/cookbook/_index.md b/content/documentation/cookbook/_index.md
new file mode 100644
index 0000000..c788f18
--- /dev/null
+++ b/content/documentation/cookbook/_index.md
@@ -0,0 +1,6 @@
++++
+title="Cookbook"
+weight = 2
+sort_by = "weight"
+redirect_to = "documentation/cookbook/real-world/"
++++ \ No newline at end of file
diff --git a/content/documentation/cookbook/exposing_websites.md b/content/documentation/cookbook/exposing_websites.md
index 1b55a08..e592e6c 100644
--- a/content/documentation/cookbook/exposing_websites.md
+++ b/content/documentation/cookbook/exposing_websites.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Exposing buckets as websites"
+weight = 25
+++
# Exposing buckets as websites
diff --git a/content/documentation/cookbook/from_source.md b/content/documentation/cookbook/from_source.md
index 38ede4d..f33b7ab 100644
--- a/content/documentation/cookbook/from_source.md
+++ b/content/documentation/cookbook/from_source.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Compiling Garage from source"
+weight = 10
+++
# Compiling Garage from source
diff --git a/content/documentation/cookbook/gateways.md b/content/documentation/cookbook/gateways.md
index f176c5e..8bd3a66 100644
--- a/content/documentation/cookbook/gateways.md
+++ b/content/documentation/cookbook/gateways.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Configuring a gateway node"
+weight = 20
+++
# Gateways
diff --git a/content/documentation/cookbook/index.md b/content/documentation/cookbook/index.md
deleted file mode 100644
index 764ee0c..0000000
--- a/content/documentation/cookbook/index.md
+++ /dev/null
@@ -1,31 +0,0 @@
-+++
-title="Doc Post"
-date=2018-08-20
-+++
-
-# Cookbook
-
-A cookbook, when you cook, is a collection of recipes.
-Similarly, Garage's cookbook contains a collection of recipes that are known to works well!
-This chapter could also be referred as "Tutorials" or "Best practices".
-
-- **[Multi-node deployment](real_world.md):** This page will walk you through all of the necessary
- steps to deploy Garage in a real-world setting.
-
-- **[Building from source](from_source.md):** This page explains how to build Garage from
- source in case a binary is not provided for your architecture, or if you want to
- hack with us!
-
-- **[Integration with Systemd](systemd.md):** This page explains how to run Garage
- as a Systemd service (instead of as a Docker container).
-
-- **[Configuring a gateway node](gateways.md):** This page explains how to run a gateway node in a Garage cluster, i.e. a Garage node that doesn't store data but accelerates access to data present on the other nodes.
-
-- **[Hosting a website](exposing_websites.md):** This page explains how to use Garage
- to host a static website.
-
-- **[Configuring a reverse-proxy](reverse_proxy.md):** This page explains how to configure a reverse-proxy to add TLS support to your S3 api endpoint.
-
-- **[Recovering from failures](recovering.md):** Garage's first selling point is resilience
- to hardware failures. This section explains how to recover from such a failure in the
- best possible way.
diff --git a/content/documentation/cookbook/real_world.md b/content/documentation/cookbook/real_world.md
index 7d6d77e..049a54a 100644
--- a/content/documentation/cookbook/real_world.md
+++ b/content/documentation/cookbook/real_world.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Multi-node deployment"
+weight = 5
+++
# Deploying Garage on a real-world cluster
diff --git a/content/documentation/cookbook/recovering.md b/content/documentation/cookbook/recovering.md
index 2b8e2f0..7d75bfe 100644
--- a/content/documentation/cookbook/recovering.md
+++ b/content/documentation/cookbook/recovering.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Recovering from failures"
+weight = 35
+++
# Recovering from failures
diff --git a/content/documentation/cookbook/reverse_proxy.md b/content/documentation/cookbook/reverse_proxy.md
index 36d3535..36b9ea3 100644
--- a/content/documentation/cookbook/reverse_proxy.md
+++ b/content/documentation/cookbook/reverse_proxy.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Configuring a reverse proxy"
+weight = 30
+++
# Configuring a reverse proxy
diff --git a/content/documentation/cookbook/systemd.md b/content/documentation/cookbook/systemd.md
index cb40b6a..8e812e1 100644
--- a/content/documentation/cookbook/systemd.md
+++ b/content/documentation/cookbook/systemd.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Starting Garage with systemd"
+weight = 15
+++
# Starting Garage with systemd
diff --git a/content/documentation/cookbook/website.md b/content/documentation/cookbook/website.md
deleted file mode 100644
index a5e378f..0000000
--- a/content/documentation/cookbook/website.md
+++ /dev/null
@@ -1,8 +0,0 @@
-+++
-title="Doc Post"
-date=2018-08-20
-+++
-
-# Hosting a website
-
-TODO
diff --git a/content/documentation/design/_index.md b/content/documentation/design/_index.md
new file mode 100644
index 0000000..1b4c7f7
--- /dev/null
+++ b/content/documentation/design/_index.md
@@ -0,0 +1,6 @@
++++
+title = "Design"
+weight = 5
+sort_by = "weight"
+redirect_to = "documentation/design/goals/"
++++ \ No newline at end of file
diff --git a/content/documentation/design/benchmarks.md b/content/documentation/design/benchmarks.md
index b339df1..7829de4 100644
--- a/content/documentation/design/benchmarks.md
+++ b/content/documentation/design/benchmarks.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Benchmarks"
+weight = 10
+++
# Benchmarks
diff --git a/content/documentation/design/goals.md b/content/documentation/design/goals.md
index 539b3b4..aa1e0bc 100644
--- a/content/documentation/design/goals.md
+++ b/content/documentation/design/goals.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Goals and use cases"
+weight = 5
+++
# Goals and use cases
diff --git a/content/documentation/design/index.md b/content/documentation/design/index.md
deleted file mode 100644
index f84af11..0000000
--- a/content/documentation/design/index.md
+++ /dev/null
@@ -1,31 +0,0 @@
-+++
-title="Doc Post"
-date=2018-08-20
-+++
-
-# Design
-
-The design section helps you to see Garage from a "big picture"
-perspective. It will allow you to understand if Garage is a good fit for
-you, how to better use it, how to contribute to it, what can Garage could
-and could not do, etc.
-
-- **[Goals and use cases](goals.md):** This page explains why Garage was concieved and what practical use cases it targets.
-
-- **[Related work](related_work.md):** This pages presents the theoretical background on which Garage is built, and describes other software storage solutions and why they didn't work for us.
-
-- **[Internals](internals.md):** This page enters into more details on how Garage manages data internally.
-
-## Talks
-
-We love to talk and hear about Garage, that's why we keep a log here:
-
- - [(fr, 2021-11-13, video) Garage : Mille et une façons de stocker vos données](https://video.tedomum.net/w/moYKcv198dyMrT8hCS5jz9) and [slides (html)](https://rfid.deuxfleurs.fr/presentations/2021-11-13/garage/) - during [RFID#1](https://rfid.deuxfleurs.fr/programme/2021-11-13/) event
-
- - [(en, 2021-04-28) Distributed object storage is centralised](https://git.deuxfleurs.fr/Deuxfleurs/garage/raw/commit/b1f60579a13d3c5eba7f74b1775c84639ea9b51a/doc/talks/2021-04-28_spirals-team/talk.pdf)
-
- - [(fr, 2020-12-02) Garage : jouer dans la cour des grands quand on est un hébergeur associatif](https://git.deuxfleurs.fr/Deuxfleurs/garage/raw/commit/b1f60579a13d3c5eba7f74b1775c84639ea9b51a/doc/talks/2020-12-02_wide-team/talk.pdf)
-
-*Did you write or talk about Garage? [Open a pull request](https://git.deuxfleurs.fr/Deuxfleurs/garage/) to add a link here!*
-
-
diff --git a/content/documentation/design/internals.md b/content/documentation/design/internals.md
index 2cb5792..ba120b0 100644
--- a/content/documentation/design/internals.md
+++ b/content/documentation/design/internals.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Internals"
+weight = 20
+++
# Internals
diff --git a/content/documentation/design/related_work.md b/content/documentation/design/related_work.md
index e11652c..32b5141 100644
--- a/content/documentation/design/related_work.md
+++ b/content/documentation/design/related_work.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Related work"
+weight = 15
+++
# Related work
diff --git a/content/documentation/development/_index.md b/content/documentation/development/_index.md
new file mode 100644
index 0000000..56994af
--- /dev/null
+++ b/content/documentation/development/_index.md
@@ -0,0 +1,6 @@
++++
+title = "Development"
+weight = 6
+sort_by = "weight"
+redirect_to = "documentation/development/devenv/"
++++ \ No newline at end of file
diff --git a/content/documentation/development/devenv.md b/content/documentation/development/devenv.md
index 2979141..7ea577c 100644
--- a/content/documentation/development/devenv.md
+++ b/content/documentation/development/devenv.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Setup your environment"
+weight = 5
+++
# Setup your development environment
diff --git a/content/documentation/development/index.md b/content/documentation/development/index.md
deleted file mode 100644
index 9ca1f70..0000000
--- a/content/documentation/development/index.md
+++ /dev/null
@@ -1,19 +0,0 @@
-+++
-title="Doc Post"
-date=2018-08-20
-+++
-
-# Development
-
-Now that you are a Garage expert, you want to enhance it, you are in the right place!
-We discuss here how to hack on Garage, how we manage its development, etc.
-
-## Rust API (docs.rs)
-If you encounter a specific bug in Garage or plan to patch it, you may jump directly to the source code's documentation!
-
- - [garage\_api](https://docs.rs/garage_api/latest/garage_api/) - contains the S3 standard API endpoint
- - [garage\_model](https://docs.rs/garage_model/latest/garage_model/) - contains Garage's model built on the table abstraction
- - [garage\_rpc](https://docs.rs/garage_rpc/latest/garage_rpc/) - contains Garage's federation protocol
- - [garage\_table](https://docs.rs/garage_table/latest/garage_table/) - contains core Garage's CRDT datatypes
- - [garage\_util](https://docs.rs/garage_util/latest/garage_util/) - contains garage helpers
- - [garage\_web](https://docs.rs/garage_web/latest/garage_web/) - contains the S3 website endpoint
diff --git a/content/documentation/development/miscellaneous_notes.md b/content/documentation/development/miscellaneous_notes.md
index aba4802..aafb3cd 100644
--- a/content/documentation/development/miscellaneous_notes.md
+++ b/content/documentation/development/miscellaneous_notes.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Miscellaneous notes"
+weight = 20
+++
# Miscellaneous Notes
diff --git a/content/documentation/development/release_process.md b/content/documentation/development/release_process.md
index 50673ae..380f544 100644
--- a/content/documentation/development/release_process.md
+++ b/content/documentation/development/release_process.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Release process"
+weight = 15
+++
# Release process
diff --git a/content/documentation/development/scripts.md b/content/documentation/development/scripts.md
index bfcb047..a6db23c 100644
--- a/content/documentation/development/scripts.md
+++ b/content/documentation/development/scripts.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Development scripts"
+weight = 10
+++
# Development scripts
diff --git a/content/documentation/intro.md b/content/documentation/intro.md
deleted file mode 100644
index 8c97b8f..0000000
--- a/content/documentation/intro.md
+++ /dev/null
@@ -1,106 +0,0 @@
-+++
-title="Doc Post"
-date=2018-08-20
-+++
-
-<p align="center" style="text-align:center;">
- <a href="https://garagehq.deuxfleurs.fr">
- <img alt="Garage's Logo" src="img/logo.svg" height="200" />
- </a>
-</p>
-
-<p align="center" style="text-align:center;">
- [ <a href="https://garagehq.deuxfleurs.fr/_releases.html">Download</a>
- | <a href="https://git.deuxfleurs.fr/Deuxfleurs/garage">Git repository</a>
- | <a href="https://matrix.to/#/%23garage:deuxfleurs.fr">Matrix channel</a>
- | <a href="https://drone.deuxfleurs.fr/Deuxfleurs/garage">Drone CI</a>
- ]
-</p>
-
-
-# Data resiliency for everyone
-
-Garage is an **open-source** distributed **storage service** you can **self-host** to fullfill many needs:
-
-<p align="center" style="text-align:center; margin-bottom: 5rem;">
-<img alt="Summary of the possible usages with a related icon: host a website, store media and backup target" src="img/usage.svg" />
-</p>
-
-<p align="center" style="text-align:center; margin-bottom: 5rem;">
-<a href="/design/goals.html#use-cases">⮞ learn more about use cases ⮜</a>
-</p>
-
-Garage implements the **[Amazon S3 API](https://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html)** and thus is already **compatible** with many applications:
-
-<p align="center" style="text-align:center; margin-bottom: 8rem;">
-<img alt="Garage is already compatible with Nextcloud, Mastodon, Matrix Synapse, Cyberduck, RClone and Peertube" src="img/software.svg" />
-</p>
-
-<p align="center" style="text-align:center; margin-bottom: 5rem;">
-<a href="/connect/index.html">⮞ learn more about integrations ⮜</a>
-</p>
-
-
-Garage provides **data resiliency** by **replicating** data 3x over **distant** servers:
-
-<p align="center" style="text-align:center; margin-bottom: 5rem;">
-<img alt="An example deployment on a map with servers in 5 zones: UK, France, Belgium, Germany and Switzerland. Each chunk of data is replicated in 3 of these 5 zones." src="img/map.svg" />
-</p>
-
-<p align="center" style="text-align:center; margin-bottom: 5rem;">
-<a href="/design/index.html">⮞ learn more about our design ⮜</a>
-</p>
-
-Did you notice that *this website* is hosted and served by Garage?
-
-## Keeping requirements low
-
-We worked hard to keep requirements as low as possible as we target the largest possible public.
-
- * **CPU:** any x86\_64 CPU from the last 10 years, ARMv7 or ARMv8.
- * **RAM:** 1GB
- * **Disk Space:** at least 16GB
- * **Network:** 200ms or less, 50 Mbps or more
- * **Heterogeneous hardware:** build a cluster with whatever second-hand machines are available
-
-*For the network, as we do not use consensus algorithms like Paxos or Raft, Garage is not as latency sensitive.*
-*Thanks to Rust and its zero-cost abstractions, we keep CPU and memory low.*
-
-## Built on the shoulder of giants
-
- - [Dynamo: Amazon’s Highly Available Key-value Store ](https://dl.acm.org/doi/abs/10.1145/1323293.1294281) by DeCandia et al.
- - [Conflict-Free Replicated Data Types](https://link.springer.com/chapter/10.1007/978-3-642-24550-3_29) by Shapiro et al.
- - [Maglev: A Fast and Reliable Software Network Load Balancer](https://www.usenix.org/conference/nsdi16/technical-sessions/presentation/eisenbud) by Eisenbud et al.
-
-## Talks
-
- - [(fr, 2021-11-13, video) Garage : Mille et une façons de stocker vos données](https://video.tedomum.net/w/moYKcv198dyMrT8hCS5jz9) and [slides (html)](https://rfid.deuxfleurs.fr/presentations/2021-11-13/garage/) - during [RFID#1](https://rfid.deuxfleurs.fr/programme/2021-11-13/) event
-
- - [(en, 2021-04-28, pdf) Distributed object storage is centralised](https://git.deuxfleurs.fr/Deuxfleurs/garage/raw/commit/b1f60579a13d3c5eba7f74b1775c84639ea9b51a/doc/talks/2021-04-28_spirals-team/talk.pdf)
-
- - [(fr, 2020-12-02, pdf) Garage : jouer dans la cour des grands quand on est un hébergeur associatif](https://git.deuxfleurs.fr/Deuxfleurs/garage/raw/commit/b1f60579a13d3c5eba7f74b1775c84639ea9b51a/doc/talks/2020-12-02_wide-team/talk.pdf)
-
-## Community
-
-If you want to discuss with us, you can join our Matrix channel at [#garage:deuxfleurs.fr](https://matrix.to/#/#garage:deuxfleurs.fr).
-Our code repository and issue tracker, which is the place where you should report bugs, is managed on [Deuxfleurs' Gitea](https://git.deuxfleurs.fr/Deuxfleurs/garage).
-
-## License
-
-Garage's source code, is released under the [AGPL v3 License](https://www.gnu.org/licenses/agpl-3.0.en.html).
-Please note that if you patch Garage and then use it to provide any service over a network, you must share your code!
-
-# Sponsors and funding
-
-The Deuxfleurs association has received a grant from [NGI POINTER](https://pointer.ngi.eu/), to fund 3 people working on Garage full-time for a year: from October 2021 to September 2022.
-
-<div style="display: flex; justify-content: space-around">
- <a href="https://pointer.ngi.eu/">
- <img style="height:100px" src="img/ngi-logo.png" alt="NGI Pointer logo">
- </a>
- <a href="https://ec.europa.eu/programmes/horizon2020/what-horizon-2020">
- <img style="height:100px" src="img/eu-flag-logo.png" alt="EU flag logo">
- </a>
-</div>
-
-_This project has received funding from the European Union’s Horizon 2020 research and innovation programme within the framework of the NGI-POINTER Project funded under grant agreement N° 871528._
diff --git a/content/documentation/quick-start/_index.md b/content/documentation/quick-start/_index.md
new file mode 100644
index 0000000..b8ec473
--- /dev/null
+++ b/content/documentation/quick-start/_index.md
@@ -0,0 +1,6 @@
++++
+title = "Quick Start"
+weight = 1
+sort_by = "weight"
+redirect_to = "documentation/quick-start/overview/"
++++ \ No newline at end of file
diff --git a/content/documentation/quick_start/index.md b/content/documentation/quick-start/overview.md
index 54f6f8d..f09d748 100644
--- a/content/documentation/quick_start/index.md
+++ b/content/documentation/quick-start/overview.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Overview"
+weight = 5
+++
# Quick Start
@@ -73,7 +73,7 @@ Garage server will not be persistent. Change these to locations on your local di
your data to be persisted properly.
-## Launching the Garage server
+# Launching the Garage server
Use the following command to launch the Garage server with our configuration file:
diff --git a/content/documentation/reference-manual/_index.md b/content/documentation/reference-manual/_index.md
new file mode 100644
index 0000000..ee79581
--- /dev/null
+++ b/content/documentation/reference-manual/_index.md
@@ -0,0 +1,6 @@
++++
+title = "Reference Manual"
+weight = 4
+sort_by = "weight"
+redirect_to = "documentation/reference-manual/configuration/"
++++ \ No newline at end of file
diff --git a/content/documentation/reference_manual/cli.md b/content/documentation/reference-manual/cli.md
index 3f7bd7a..2f0525f 100644
--- a/content/documentation/reference_manual/cli.md
+++ b/content/documentation/reference-manual/cli.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Garage CLI"
+weight = 15
+++
# Garage CLI
diff --git a/content/documentation/reference_manual/configuration.md b/content/documentation/reference-manual/configuration.md
index 9a2e314..c9ebee2 100644
--- a/content/documentation/reference_manual/configuration.md
+++ b/content/documentation/reference-manual/configuration.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Garage configuration file"
+weight = 5
+++
# Garage configuration file format reference
diff --git a/content/documentation/reference_manual/layout.md b/content/documentation/reference-manual/layout.md
index 3d325c7..32706d0 100644
--- a/content/documentation/reference_manual/layout.md
+++ b/content/documentation/reference-manual/layout.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Cluster layout management"
+weight = 10
+++
# Creating and updating a cluster layout
diff --git a/content/documentation/reference_manual/s3_compatibility.md b/content/documentation/reference-manual/s3_compatibility.md
index 98b6170..7160da9 100644
--- a/content/documentation/reference_manual/s3_compatibility.md
+++ b/content/documentation/reference-manual/s3_compatibility.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "S3 Compatibility status"
+weight = 20
+++
# S3 Compatibility status
diff --git a/content/documentation/reference_manual/index.md b/content/documentation/reference_manual/index.md
deleted file mode 100644
index cdff814..0000000
--- a/content/documentation/reference_manual/index.md
+++ /dev/null
@@ -1,10 +0,0 @@
-+++
-title="Doc Post"
-date=2018-08-20
-+++
-
-# Reference Manual
-
-A reference manual contains some extensive descriptions about the features and the behaviour of the software.
-Reading of this chapter is recommended once you have a good knowledge/understanding of Garage.
-It will be useful if you want to tune it or to use it in some exotic conditions.
diff --git a/content/documentation/working-documents/_index.md b/content/documentation/working-documents/_index.md
new file mode 100644
index 0000000..8b65867
--- /dev/null
+++ b/content/documentation/working-documents/_index.md
@@ -0,0 +1,6 @@
++++
+title = "Working Documents"
+weight = 7
+sort_by = "weight"
+redirect_to = "documentation/working-documents/compatibility-target/"
++++ \ No newline at end of file
diff --git a/content/documentation/working_documents/compatibility_target.md b/content/documentation/working-documents/compatibility_target.md
index 51c6e2e..3f1b357 100644
--- a/content/documentation/working_documents/compatibility_target.md
+++ b/content/documentation/working-documents/compatibility_target.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "S3 compatibility target"
+weight = 5
+++
# S3 compatibility target
diff --git a/content/documentation/working_documents/design_draft.md b/content/documentation/working-documents/design_draft.md
index 2ac3e0d..90c2d1c 100644
--- a/content/documentation/working_documents/design_draft.md
+++ b/content/documentation/working-documents/design_draft.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Design draft"
+weight = 25
+++
# Design draft
diff --git a/content/documentation/working_documents/load_balancing.md b/content/documentation/working-documents/load_balancing.md
index e6fa3e8..58a1bec 100644
--- a/content/documentation/working_documents/load_balancing.md
+++ b/content/documentation/working-documents/load_balancing.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Load balancing data"
+weight = 10
+++
# Load Balancing Data (planned for version 0.2)
diff --git a/content/documentation/working_documents/migration_04.md b/content/documentation/working-documents/migration_04.md
index 92ec71e..55dfdfe 100644
--- a/content/documentation/working_documents/migration_04.md
+++ b/content/documentation/working-documents/migration_04.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Migrating from 0.3 to 0.4"
+weight = 20
+++
# Migrating from 0.3 to 0.4
diff --git a/content/documentation/working_documents/migration_06.md b/content/documentation/working-documents/migration_06.md
index dd180d5..692e309 100644
--- a/content/documentation/working_documents/migration_06.md
+++ b/content/documentation/working-documents/migration_06.md
@@ -1,6 +1,6 @@
+++
-title="Doc Post"
-date=2018-08-20
+title = "Migrating from 0.5 to 0.6"
+weight = 15
+++
# Migrating from 0.5 to 0.6
diff --git a/content/documentation/working_documents/index.md b/content/documentation/working_documents/index.md
deleted file mode 100644
index 8c0f1f0..0000000
--- a/content/documentation/working_documents/index.md
+++ /dev/null
@@ -1,13 +0,0 @@
-+++
-title="Doc Post"
-date=2018-08-20
-+++
-
-# Working Documents
-
-Working documents are documents that reflect the fact that Garage is a software that evolves quickly.
-They are a way to communicate our ideas, our changes, and so on before or while we are implementing them in Garage.
-If you like to live on the edge, it could also serve as a documentation of our next features to be released.
-
-Ideally, once the feature/patch has been merged, the working document should serve as a source to
-update the rest of the documentation and then be removed.
diff --git a/templates/documentation.html b/templates/documentation.html
new file mode 100644
index 0000000..7145129
--- /dev/null
+++ b/templates/documentation.html
@@ -0,0 +1,224 @@
+{% extends 'base.html' %}
+
+{% block title %}
+{{ config.title }} | {{ page.title }}
+{% endblock %}
+
+{% block content %}
+{% set section = get_section(path="documentation/_index.md") %}
+<section class="section overflow-x-hidden">
+ <div class="grid grid-cols-5">
+
+ <aside class="col-span-1 h-full bg-gray-100 shadow-inner border-r border-t border-gray-200">
+ {% if section.toc %}
+ <ul>
+ {% for h1 in section.toc %}
+ <li>
+ <a href="{{ h1.permalink | safe }}">{{ h1.title }}</a>
+ {% if h1.children %}
+ <ul>
+ {% for h2 in h1.children %}
+ <li>
+ <a href="{{ h2.permalink | safe }}">{{ h2.title }}</a>
+ </li>
+ {% endfor %}
+ </ul>
+ {% endif %}
+ </li>
+ {% endfor %}
+ </ul>
+ {% endif %}
+ </aside>
+
+ <div class="col-span-3">
+ <article class="box my-12 px-12">
+ <div class="flex flex-col bg-gray-100 rounded-r shadow-sm w-max">
+ <div class="flex flex-col border-l-4 border-garage-orange py-2 px-4 relative">
+ <h1 class="title leading-10 text-3xl text-garage-orange font-semibold">
+ {{ page.title }}
+ </h1>
+ {% if page.description %}
+ <p class="subtitle my-2 text-gray-600 italic text-sm">{{ page.description }}</p>
+ {% endif %}
+ </div>
+ </div>
+ <div class="page-content max-w-4xl">
+ {{ page.content | safe }}
+ </div>
+ </article>
+ </div>
+
+ <aside class="hidden 2xl:block fixed right-0 bottom-1/2 transform translate-y-1/2 col-span-1 h-auto bg-gray-100 rounded-l-lg shadow-inner">
+ {% if page.toc %}
+ <div class="w-full flex items-center justify-center py-1.5 bg-gray-200 rounded-tl-lg">
+ <span class="uppercase tracking-wide text-xs text-garage-gray">Page content</span>
+ </div>
+ <ol class="text-sm space-y-0.5 py-0.5 px-8 py-3 list-decimal">
+ {% for h1 in page.toc %}
+ <li>
+ <a href="{{ h1.permalink | safe }}" class="font-semibold bg-gradient-to-r from-garage-gray to-garage-orange text-transparent bg-clip-text transition-all hover:text-garage-orange">{{ h1.title }}</a>
+ {% if h1.children %}
+ <ul class="space-y-0.5 py-0.5">
+ {% for h2 in h1.children %}
+ <li>
+ <a href="{{ h2.permalink | safe }}" class="text-gray-700 hover:text-garage-orange">{{ h2.title }}</a>
+ </li>
+ {% endfor %}
+ </ul>
+ {% endif %}
+ </li>
+ {% endfor %}
+ </ol>
+ {% endif %}
+ </aside>
+ </div>
+</section>
+{% endblock %}
+
+{% block pagination %}
+{% if page.earlier or page.later or page.lighter or page.heavier %}
+<section class="w-full">
+ <div class="container py-20">
+ <div class="mx-auto max-w-4xl">
+ <div class="column is-8">
+ <nav class="flex space-x-8 items-center justify-center">
+ {% if page.later %}
+ <div>
+ <a class="flex items-center space-x-1 hover:text-garage-orange font-semibold text-gray-800"
+ href="{{ page.later.permalink }}">
+ <span class="icon mr-2">
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"
+ xmlns="http://www.w3.org/2000/svg">
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
+ d="M7 16l-4-4m0 0l4-4m-4 4h18"></path>
+ </svg>
+ </span>
+ <span>{{ page.later.title }}</span>
+ </a>
+ </div>
+ {% endif %} {% if page.earlier %}
+ <div>
+ <a class="flex items-center space-x-1 hover:text-garage-orange font-semibold text-gray-800"
+ href="{{ page.earlier.permalink }}">
+ {{ page.earlier.title }}<span class="icon ml-2">
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"
+ xmlns="http://www.w3.org/2000/svg">
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
+ d="M17 8l4 4m0 0l-4 4m4-4H3"></path>
+ </svg>
+ </span>
+ </a>
+ </div>
+ {% endif %} {% if page.heavier %}
+ <div>
+ <a class="flex items-center space-x-1 hover:text-garage-orange font-semibold text-gray-800"
+ href="{{ page.heavier.permalink }}">
+ <span class="icon mr-2">
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"
+ xmlns="http://www.w3.org/2000/svg">
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
+ d="M7 16l-4-4m0 0l4-4m-4 4h18"></path>
+ </svg>
+ </span>
+ <span>{{ page.heavier.title }}</span>
+ </a>
+ </div>
+ {% endif %} {% if page.lighter %}
+ <div>
+ <a class="flex items-center space-x-1 hover:text-garage-orange font-semibold text-gray-800"
+ href="{{ page.lighter.permalink }}">
+ {{ page.lighter.title }}<span class="icon ml-2">
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"
+ xmlns="http://www.w3.org/2000/svg">
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
+ d="M17 8l4 4m0 0l-4 4m4-4H3"></path>
+ </svg>
+ </span>
+ </a>
+ </div>
+ {% endif %}
+ </nav>
+ </div>
+ </div>
+ </div>
+</section>
+{% endif %}
+{% endblock %}
+
+{% block comment %}
+{% if page.extra.comments and config.extra.commenting.disqus %}
+<section class="section">
+ <div class="container">
+ <div class="columns is-centered">
+ <div class="column is-6">
+ <div id="disqus_thread"></div>
+ </div>
+ </div>
+ </div>
+</section>
+{% endif %}
+{% endblock %}
+
+{% block custom_js %}
+{% if page.extra.toc %}
+<script type="text/javascript">
+ const menuBarHeight = document.querySelector("nav.navbar").clientHeight;
+ const tocItems = document.querySelectorAll(".toc");
+ const navSections = new Array(tocItems.length);
+
+ tocItems.forEach((el, i) => {
+ let id = el.getAttribute("id").substring(5);
+ navSections[i] = document.getElementById(id);
+ })
+
+ function isVisible(tocIndex) {
+ const current = navSections[tocIndex];
+ const next = tocIndex < tocItems.length - 1 ? navSections[tocIndex + 1]
+ : document.querySelectorAll("section.section").item(1);
+
+ const c = current.getBoundingClientRect();
+ const n = next.getBoundingClientRect();
+ const h = (window.innerHeight || document.documentElement.clientHeight);
+
+ return (c.top <= h) && (n.top - menuBarHeight >= 0);
+ }
+
+ function activateIfVisible() {
+ for (b = true, i = 0; i < tocItems.length; i++) {
+ if (b && isVisible(i)) {
+ tocItems[i].classList.add('is-active');
+ b = false;
+ } else
+ tocItems[i].classList.remove('is-active');
+ }
+ }
+
+ var isTicking = null;
+ window.addEventListener('scroll', () => {
+ if (!isTicking) {
+ window.requestAnimationFrame(() => {
+ activateIfVisible();
+ isTicking = false;
+ });
+ isTicking = true;
+ }
+ }, false);
+</script>
+{% endif %}
+
+{% if page.extra.comments and config.extra.commenting.disqus %}
+<script>
+ var disqus_config = function () {
+ this.page.url = "{{config.base_url | safe}}";
+ this.page.identifier = "{{ current_path | safe}}";
+ };
+
+ (function () {
+ var d = document, s = d.createElement('script');
+ s.src = 'https://{{ config.extra.commenting.disqus | safe}}.disqus.com/embed.js';
+ s.setAttribute('data-timestamp', +new Date());
+ (d.head || d.body).appendChild(s);
+ })();
+</script>
+{% endif %}
+{% endblock %} \ No newline at end of file