From 1c0ba930b8d6aa5d97e6942852240861e6ab9bed Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 7 Feb 2022 11:51:12 +0100 Subject: [PATCH] Reorganize documentation for new website (#213) This PR should be merged after the new website is deployed. - [x] Rename files - [x] Add front matter section to all `.md` files in the book (necessary for Zola) - [x] Change all internal links to use Zola's linking system that checks broken links - [x] Some updates to documentation contents and organization Co-authored-by: Alex Auvolat Reviewed-on: https://git.deuxfleurs.fr/Deuxfleurs/garage/pulls/213 Co-authored-by: Alex Co-committed-by: Alex --- doc/book/README | 3 + doc/book/_index.md | 5 + doc/book/book.toml | 6 -- .../connect/index.md => connect/_index.md} | 20 ++-- .../apps}/cli-nextcloud-gui.png | Bin .../connect/apps.md => connect/apps/index.md} | 9 +- doc/book/{src => }/connect/backup.md | 8 +- doc/book/{src => }/connect/cli.md | 5 +- doc/book/{src => }/connect/code.md | 5 +- doc/book/{src => }/connect/fs.md | 11 +- doc/book/{src => }/connect/repositories.md | 9 +- doc/book/{src => }/connect/websites.md | 9 +- doc/book/cookbook/_index.md | 31 ++++++ doc/book/cookbook/exposing-websites.md | 69 ++++++++++++ .../from-source.md} | 5 +- doc/book/{src => }/cookbook/gateways.md | 8 +- .../real_world.md => cookbook/real-world.md} | 15 +-- doc/book/{src => }/cookbook/recovering.md | 7 +- .../reverse-proxy.md} | 7 +- doc/book/{src => }/cookbook/systemd.md | 5 +- .../{src/design/index.md => design/_index.md} | 13 ++- .../benchmarks}/endpoint-latency-dc.png | Bin .../benchmarks}/endpoint-latency.png | Bin .../benchmarks/index.md} | 9 +- doc/book/{src => }/design/goals.md | 5 +- doc/book/{src => }/design/internals.md | 7 +- .../related-work.md} | 7 +- .../index.md => development/_index.md} | 7 +- doc/book/{src => }/development/devenv.md | 5 +- .../miscellaneous-notes.md} | 5 +- .../release-process.md} | 7 +- doc/book/{src => }/development/scripts.md | 11 +- .../index.md => quick-start/_index.md} | 37 ++++--- .../index.md => reference-manual/_index.md} | 7 +- .../cli.md | 5 +- .../configuration.md | 45 ++++---- .../layout.md | 7 +- .../s3-compatibility.md} | 5 +- doc/book/src/SUMMARY.md | 49 --------- doc/book/src/cookbook/exposing_websites.md | 48 --------- doc/book/src/cookbook/index.md | 26 ----- doc/book/src/cookbook/website.md | 3 - doc/book/src/img/eu-flag-logo.png | Bin 2477 -> 0 bytes doc/book/src/img/logo.svg | 44 -------- doc/book/src/img/map.svg | 3 - doc/book/src/img/ngi-logo.png | Bin 34628 -> 0 bytes doc/book/src/img/software.svg | 3 - doc/book/src/img/usage.svg | 3 - doc/book/src/intro.md | 101 ------------------ .../index.md => working-documents/_index.md} | 7 +- .../compatibility-target.md} | 5 +- .../design-draft.md} | 7 +- .../load-balancing.md} | 5 +- .../migration-04.md} | 5 +- .../migration-06.md} | 5 +- 55 files changed, 338 insertions(+), 395 deletions(-) create mode 100644 doc/book/README create mode 100644 doc/book/_index.md delete mode 100644 doc/book/book.toml rename doc/book/{src/connect/index.md => connect/_index.md} (79%) rename doc/book/{src/connect => connect/apps}/cli-nextcloud-gui.png (100%) rename doc/book/{src/connect/apps.md => connect/apps/index.md} (98%) rename doc/book/{src => }/connect/backup.md (91%) rename doc/book/{src => }/connect/cli.md (98%) rename doc/book/{src => }/connect/code.md (98%) rename doc/book/{src => }/connect/fs.md (87%) rename doc/book/{src => }/connect/repositories.md (96%) rename doc/book/{src => }/connect/websites.md (88%) create mode 100644 doc/book/cookbook/_index.md create mode 100644 doc/book/cookbook/exposing-websites.md rename doc/book/{src/cookbook/from_source.md => cookbook/from-source.md} (95%) rename doc/book/{src => }/cookbook/gateways.md (90%) rename doc/book/{src/cookbook/real_world.md => cookbook/real-world.md} (95%) rename doc/book/{src => }/cookbook/recovering.md (97%) rename doc/book/{src/cookbook/reverse_proxy.md => cookbook/reverse-proxy.md} (97%) rename doc/book/{src => }/cookbook/systemd.md (96%) rename doc/book/{src/design/index.md => design/_index.md} (67%) rename doc/book/{src/design/img => design/benchmarks}/endpoint-latency-dc.png (100%) rename doc/book/{src/design/img => design/benchmarks}/endpoint-latency.png (100%) rename doc/book/{src/design/benchmarks.md => design/benchmarks/index.md} (97%) rename doc/book/{src => }/design/goals.md (98%) rename doc/book/{src => }/design/internals.md (97%) rename doc/book/{src/design/related_work.md => design/related-work.md} (96%) rename doc/book/{src/development/index.md => development/_index.md} (91%) rename doc/book/{src => }/development/devenv.md (98%) rename doc/book/{src/development/miscellaneous_notes.md => development/miscellaneous-notes.md} (98%) rename doc/book/{src/development/release_process.md => development/release-process.md} (98%) rename doc/book/{src => }/development/scripts.md (85%) rename doc/book/{src/quick_start/index.md => quick-start/_index.md} (91%) rename doc/book/{src/reference_manual/index.md => reference-manual/_index.md} (74%) rename doc/book/{src/reference_manual => reference-manual}/cli.md (76%) rename doc/book/{src/reference_manual => reference-manual}/configuration.md (94%) rename doc/book/{src/reference_manual => reference-manual}/layout.md (96%) rename doc/book/{src/reference_manual/s3_compatibility.md => reference-manual/s3-compatibility.md} (98%) delete mode 100644 doc/book/src/SUMMARY.md delete mode 100644 doc/book/src/cookbook/exposing_websites.md delete mode 100644 doc/book/src/cookbook/index.md delete mode 100644 doc/book/src/cookbook/website.md delete mode 100644 doc/book/src/img/eu-flag-logo.png delete mode 100644 doc/book/src/img/logo.svg delete mode 100644 doc/book/src/img/map.svg delete mode 100644 doc/book/src/img/ngi-logo.png delete mode 100644 doc/book/src/img/software.svg delete mode 100644 doc/book/src/img/usage.svg delete mode 100644 doc/book/src/intro.md rename doc/book/{src/working_documents/index.md => working-documents/_index.md} (83%) rename doc/book/{src/working_documents/compatibility_target.md => working-documents/compatibility-target.md} (98%) rename doc/book/{src/working_documents/design_draft.md => working-documents/design-draft.md} (98%) rename doc/book/{src/working_documents/load_balancing.md => working-documents/load-balancing.md} (99%) rename doc/book/{src/working_documents/migration_04.md => working-documents/migration-04.md} (98%) rename doc/book/{src/working_documents/migration_06.md => working-documents/migration-06.md} (97%) diff --git a/doc/book/README b/doc/book/README new file mode 100644 index 00000000..2a543888 --- /dev/null +++ b/doc/book/README @@ -0,0 +1,3 @@ +These are the sources for the documentation but not the whole website. +The website templates and other things are in garage_website, which +uses this as a submodule. diff --git a/doc/book/_index.md b/doc/book/_index.md new file mode 100644 index 00000000..283c8f3c --- /dev/null +++ b/doc/book/_index.md @@ -0,0 +1,5 @@ ++++ +template = "documentation.html" +page_template = "documentation.html" +redirect_to = "documentation/quick-start/" ++++ diff --git a/doc/book/book.toml b/doc/book/book.toml deleted file mode 100644 index 3e163990..00000000 --- a/doc/book/book.toml +++ /dev/null @@ -1,6 +0,0 @@ -[book] -authors = ["Quentin Dufour"] -language = "en" -multilingual = false -src = "src" -title = "Garage Documentation" diff --git a/doc/book/src/connect/index.md b/doc/book/connect/_index.md similarity index 79% rename from doc/book/src/connect/index.md rename to doc/book/connect/_index.md index 60a3b03b..b4868b9f 100644 --- a/doc/book/src/connect/index.md +++ b/doc/book/connect/_index.md @@ -1,14 +1,20 @@ -# Integrations ++++ +title = "Integrations" +weight = 3 +sort_by = "weight" +template = "documentation.html" ++++ + 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) + - [web applications](@/documentation/connect/apps/index.md) + - [website hosting](@/documentation/connect/websites.md) + - [software repositories](@/documentation/connect/repositories.md) + - [CLI tools](@/documentation/connect/cli.md) + - [your own code](@/documentation/connect/code.md) ### Generic instructions @@ -25,7 +31,7 @@ you will need the following parameters: 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. + [quick start](@/documentation/quick-start/_index.md) guide. Most S3 clients can be configured easily with these parameters, provided that you follow the following guidelines: diff --git a/doc/book/src/connect/cli-nextcloud-gui.png b/doc/book/connect/apps/cli-nextcloud-gui.png similarity index 100% rename from doc/book/src/connect/cli-nextcloud-gui.png rename to doc/book/connect/apps/cli-nextcloud-gui.png diff --git a/doc/book/src/connect/apps.md b/doc/book/connect/apps/index.md similarity index 98% rename from doc/book/src/connect/apps.md rename to doc/book/connect/apps/index.md index 14d69ef8..84f46891 100644 --- a/doc/book/src/connect/apps.md +++ b/doc/book/connect/apps/index.md @@ -1,4 +1,7 @@ -# Apps (Nextcloud, Peertube...) ++++ +title = "Apps (Nextcloud, Peertube...)" +weight = 5 ++++ In this section, we cover the following software: [Nextcloud](#nextcloud), [Peertube](#peertube), [Mastodon](#mastodon), [Matrix](#matrix) @@ -66,7 +69,7 @@ To test your new configuration, just reload your Nextcloud webpage and start sen **From the GUI.** Activate the "External storage support" app from the "Applications" page (click on your account icon on the top right corner of your screen to display the menu). Go to your parameters page (also located below your account icon). Click on external storage (or the corresponding translation in your language). -[![Screenshot of the External Storage form](./cli-nextcloud-gui.png)](./cli-nextcloud-gui.png) +[![Screenshot of the External Storage form](cli-nextcloud-gui.png)](cli-nextcloud-gui.png) *Click on the picture to zoom* Add a new external storage. Put what you want in "folder name" (eg. "shared"). Select "Amazon S3". Keep "Access Key" for the Authentication field. @@ -253,7 +256,7 @@ Make sure you (will) have a corresponding DNS entry for them. Now we will configure a reverse proxy in front of Garage. This is required as we have no other way to serve CORS headers yet. -Check the [Configuring a reverse proxy](/cookbook/reverse_proxy.html) section to know how. +Check the [Configuring a reverse proxy](@/documentation/cookbook/reverse-proxy.md) section to know how. Now make sure that your 2 dns entries are pointing to your reverse proxy. diff --git a/doc/book/src/connect/backup.md b/doc/book/connect/backup.md similarity index 91% rename from doc/book/src/connect/backup.md rename to doc/book/connect/backup.md index a0af3833..9fa72964 100644 --- a/doc/book/src/connect/backup.md +++ b/doc/book/connect/backup.md @@ -1,4 +1,8 @@ -# Backups (restic, duplicity...) ++++ +title = "Backups (restic, duplicity...)" +weight = 25 ++++ + Backups are essential for disaster recovery but they are not trivial to manage. Using Garage as your backup target will enable you to scale your storage as needed while ensuring high availability. @@ -21,7 +25,7 @@ If you still want to use Borg, you can use it with `rclone mount`. ## Duplicati -*External links:* [Duplicati Documentation > Storage Providers](https://github.com/kees-z/DuplicatiDocs/blob/master/docs/05-storage-providers.md#s3-compatible) +*External links:* [Duplicati Documentation > Storage Providers](https://github.com/kees-z/DuplicatiDocs/blob/master/docs/05-storage-providers.md#user-content-s3-compatible) ## knoxite diff --git a/doc/book/src/connect/cli.md b/doc/book/connect/cli.md similarity index 98% rename from doc/book/src/connect/cli.md rename to doc/book/connect/cli.md index f7e0b22f..a62594a7 100644 --- a/doc/book/src/connect/cli.md +++ b/doc/book/connect/cli.md @@ -1,4 +1,7 @@ -# CLI tools ++++ +title = "CLI tools" +weight = 20 ++++ CLI tools allow you to query the S3 API without too many abstractions. These tools are particularly suitable for debug, backups, website deployments or any scripted task that need to handle data. diff --git a/doc/book/src/connect/code.md b/doc/book/connect/code.md similarity index 98% rename from doc/book/src/connect/code.md rename to doc/book/connect/code.md index 3d7acd58..4b2c4cb0 100644 --- a/doc/book/src/connect/code.md +++ b/doc/book/connect/code.md @@ -1,4 +1,7 @@ -# Your code (PHP, JS, Go...) ++++ +title = "Your code (PHP, JS, Go...)" +weight = 30 ++++ If you are developping a new application, you may want to use Garage to store your user's media. diff --git a/doc/book/src/connect/fs.md b/doc/book/connect/fs.md similarity index 87% rename from doc/book/src/connect/fs.md rename to doc/book/connect/fs.md index be8a3402..6d9a5a68 100644 --- a/doc/book/src/connect/fs.md +++ b/doc/book/connect/fs.md @@ -1,4 +1,7 @@ -# FUSE (s3fs, goofys, s3backer...) ++++ +title = "FUSE (s3fs, goofys, s3backer...)" +weight = 25 ++++ **WARNING! Garage is not POSIX compatible. Mounting S3 buckets as filesystems will not provide POSIX compatibility. @@ -11,7 +14,7 @@ Ideally, avoid these solutions at all for any serious or production use. ## rclone mount -rclone uses the same configuration when used [in CLI](/connect/cli.html) and mount mode. +rclone uses the same configuration when used [in CLI](@/documentation/connect/cli.md) and mount mode. We suppose you have the following entry in your `rclone.ini` (mine is located in `~/.config/rclone/rclone.conf`): ```toml @@ -53,11 +56,11 @@ fusermount -u /tmp/my-bucket ## s3fs -*External link:* [s3fs github > README.md](https://github.com/s3fs-fuse/s3fs-fuse#examples) +*External link:* [s3fs github > README.md](https://github.com/s3fs-fuse/s3fs-fuse#user-content-examples) ## goofys -*External link:* [goofys github > README.md](https://github.com/kahing/goofys#usage) +*External link:* [goofys github > README.md](https://github.com/kahing/goofys#user-content-usage) ## s3backer diff --git a/doc/book/src/connect/repositories.md b/doc/book/connect/repositories.md similarity index 96% rename from doc/book/src/connect/repositories.md rename to doc/book/connect/repositories.md index 8a3dce14..eb06e360 100644 --- a/doc/book/src/connect/repositories.md +++ b/doc/book/connect/repositories.md @@ -1,4 +1,7 @@ -# Repositories (Docker, Nix, Git...) ++++ +title = "Repositories (Docker, Nix, Git...)" +weight = 15 ++++ Whether you need to store and serve binary packages or source code, you may want to deploy a tool referred as a repository or registry. Garage can also help you serve this content. @@ -89,8 +92,8 @@ garage bucket website nix.example.com --allow ``` If you need more information about exposing buckets as websites on Garage, -check [Exposing buckets as websites](/cookbook/exposing_websites.html) - and [Configuring a reverse proxy](/cookbook/reverse_proxy.html). +check [Exposing buckets as websites](@/documentation/cookbook/exposing-websites.md) + and [Configuring a reverse proxy](@/documentation/cookbook/reverse-proxy.md). Next, we want to check that our bucket works: diff --git a/doc/book/src/connect/websites.md b/doc/book/connect/websites.md similarity index 88% rename from doc/book/src/connect/websites.md rename to doc/book/connect/websites.md index 6f66c8d0..3f62c9a6 100644 --- a/doc/book/src/connect/websites.md +++ b/doc/book/connect/websites.md @@ -1,4 +1,7 @@ -# Websites (Hugo, Jekyll, Publii...) ++++ +title = "Websites (Hugo, Jekyll, Publii...)" +weight = 10 ++++ Garage is also suitable to host static websites. While they can be deployed with traditional CLI tools, some static website generators have integrated options to ease your workflow. @@ -50,7 +53,7 @@ Currently, the proposed workaround is to deploy your website manually: - Click on Get website files - You need to synchronize the output folder you see in your file explorer, we will use minio client. -Be sure that you [configured minio client](cli.html#minio-client-recommended). +Be sure that you [configured minio client](@/documentation/connect/cli.md#minio-client-recommended). Then copy this output folder @@ -63,7 +66,7 @@ mc mirror --overwrite output garage/my-site Some tools do not support sending to a S3 backend but output a compiled folder on your system. We can then use any CLI tool to upload this content to our S3 target. -First, start by [configuring minio client](cli.html#minio-client-recommended). +First, start by [configuring minio client](@/documentation/connect/cli.md#minio-client-recommended). Then build your website: diff --git a/doc/book/cookbook/_index.md b/doc/book/cookbook/_index.md new file mode 100644 index 00000000..6e279363 --- /dev/null +++ b/doc/book/cookbook/_index.md @@ -0,0 +1,31 @@ ++++ +title="Cookbook" +template = "documentation.html" +weight = 2 +sort_by = "weight" ++++ + +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](@/documentation/cookbook/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](@/documentation/cookbook/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](@/documentation/cookbook/systemd.md):** This page explains how to run Garage + as a Systemd service (instead of as a Docker container). + +- **[Configuring a gateway node](@/documentation/cookbook/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](@/documentation/cookbook/exposing-websites.md):** This page explains how to use Garage + to host a static website. + +- **[Configuring a reverse-proxy](@/documentation/cookbook/reverse-proxy.md):** This page explains how to configure a reverse-proxy to add TLS support to your S3 api endpoint. + +- **[Recovering from failures](@/documentation/cookbook/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/doc/book/cookbook/exposing-websites.md b/doc/book/cookbook/exposing-websites.md new file mode 100644 index 00000000..be462dc9 --- /dev/null +++ b/doc/book/cookbook/exposing-websites.md @@ -0,0 +1,69 @@ ++++ +title = "Exposing buckets as websites" +weight = 25 ++++ + +## Configuring a bucket for website access + +There are two methods to expose buckets as website: + +1. using the PutBucketWebsite S3 API call, which is allowed for access keys that have the owner permission bit set + +2. from the Garage CLI, by an adminstrator of the cluster + +The `PutBucketWebsite` API endpoint [is documented](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketWebsite.html) in the official AWS docs. +This endpoint can also be called [using `aws s3api`](https://docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-website.html) on the command line. +The website configuration supported by Garage is only a subset of the possibilities on Amazon S3: redirections are not supported, only the index document and error document can be specified. + +If you want to expose your bucket as a website from the CLI, use this simple command: + +```bash +garage bucket website --allow my-website +``` + +Now it will be **publicly** exposed on the web endpoint (by default listening on port 3902). + +## How exposed websites work + +Our website serving logic is as follow: + + - Supports only static websites (no support for PHP or other languages) + - Does not support directory listing + - The index file is defined per-bucket and can be specified in the `PutBucketWebsite` call + or on the CLI using the `--index-document` parameter (default: `index.html`) + - A custom error document for 404 errors can be specified in the `PutBucketWebsite` call + or on the CLI using the `--error-document` parameter + +Now we need to infer the URL of your website through your bucket name. +Let assume: + - we set `root_domain = ".web.example.com"` in `garage.toml` ([ref](@/documentation/reference-manual/configuration.md#root_domain)) + - our bucket name is `garagehq.deuxfleurs.fr`. + +Our bucket will be served if the Host field matches one of these 2 values (the port is ignored): + + - `garagehq.deuxfleurs.fr.web.example.com`: you can dedicate a subdomain to your users (here `web.example.com`). + + - `garagehq.deuxfleurs.fr`: your users can bring their own domain name, they just need to point them to your Garage cluster. + +You can try this logic locally, without configuring any DNS, thanks to `curl`: + +```bash +# prepare your test +echo hello world > /tmp/index.html +mc cp /tmp/index.html garage/garagehq.deuxfleurs.fr + +curl -H 'Host: garagehq.deuxfleurs.fr' http://localhost:3902 +# should print "hello world" + +curl -H 'Host: garagehq.deuxfleurs.fr.web.example.com' http://localhost:3902 +# should also print "hello world" +``` + +Now that you understand how website logic works on Garage, you can: + + - make the website endpoint listens on port 80 (instead of 3902) + - use iptables to redirect the port 80 to the port 3902: + `iptables -t nat -A PREROUTING -p tcp -dport 80 -j REDIRECT -to-port 3902` + - or configure a [reverse proxy](@/documentation/cookbook/reverse-proxy.md) in front of Garage to add TLS (HTTPS), CORS support, etc. + +You can also take a look at [Website Integration](@/documentation/connect/websites.md) to see how you can add Garage to your workflow. diff --git a/doc/book/src/cookbook/from_source.md b/doc/book/cookbook/from-source.md similarity index 95% rename from doc/book/src/cookbook/from_source.md rename to doc/book/cookbook/from-source.md index 167f01db..84c0d514 100644 --- a/doc/book/src/cookbook/from_source.md +++ b/doc/book/cookbook/from-source.md @@ -1,4 +1,7 @@ -# Compiling Garage from source ++++ +title = "Compiling Garage from source" +weight = 10 ++++ Garage is a standard Rust project. diff --git a/doc/book/src/cookbook/gateways.md b/doc/book/cookbook/gateways.md similarity index 90% rename from doc/book/src/cookbook/gateways.md rename to doc/book/cookbook/gateways.md index f03671a4..62ed0fe2 100644 --- a/doc/book/src/cookbook/gateways.md +++ b/doc/book/cookbook/gateways.md @@ -1,4 +1,7 @@ -# Gateways ++++ +title = "Configuring a gateway node" +weight = 20 ++++ Gateways allow you to expose Garage endpoints (S3 API and websites) without storing data on the node. @@ -12,9 +15,6 @@ You can configure Garage as a gateway on all nodes that will consume your S3 API - **It simplifies security.** Instead of having to maintain and renew a TLS certificate, you leverage the Secret Handshake protocol we use for our cluster. The S3 API protocol will be in plain text but limited to your local machine. -## Limitations - -Currently it will not work with minio client. Follow issue [#64](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/64) for more information. ## Spawn a Gateway diff --git a/doc/book/src/cookbook/real_world.md b/doc/book/cookbook/real-world.md similarity index 95% rename from doc/book/src/cookbook/real_world.md rename to doc/book/cookbook/real-world.md index 906fe31f..1178ded5 100644 --- a/doc/book/src/cookbook/real_world.md +++ b/doc/book/cookbook/real-world.md @@ -1,10 +1,13 @@ -# Deploying Garage on a real-world cluster ++++ +title = "Deployment on a cluster" +weight = 5 ++++ To run Garage in cluster mode, we recommend having at least 3 nodes. This will allow you to setup Garage for three-way replication of your data, the safest and most available mode proposed by Garage. -We recommend first following the [quick start guide](../quick_start/index.md) in order +We recommend first following the [quick start guide](@/documentation/quick-start/_index.md) in order to get familiar with Garage's command line and usage patterns. @@ -23,7 +26,7 @@ To run a real-world deployment, make sure the following conditions are met: to drastically reduce Garage's response times. - This guide will assume you are using Docker containers to deploy Garage on each node. - Garage can also be run independently, for instance as a [Systemd service](systemd.md). + Garage can also be run independently, for instance as a [Systemd service](@/documentation/cookbook/systemd.md). You can also use an orchestrator such as Nomad or Kubernetes to automatically manage Docker containers on a fleet of nodes. @@ -278,15 +281,15 @@ garage layout apply ``` **WARNING:** if you want to use the layout modification commands in a script, -make sure to read [this page](/reference_manual/layout.html) first. +make sure to read [this page](@/documentation/reference-manual/layout.md) first. ## Using your Garage cluster Creating buckets and managing keys is done using the `garage` CLI, -and is covered in the [quick start guide](../quick_start/index.md). +and is covered in the [quick start guide](@/documentation/quick-start/_index.md). Remember also that the CLI is self-documented thanks to the `--help` flag and the `help` subcommand (e.g. `garage help`, `garage key --help`). Configuring S3-compatible applicatiosn to interact with Garage -is covered in the [Integrations](/connect/index.html) section. +is covered in the [Integrations](@/documentation/connect/_index.md) section. diff --git a/doc/book/src/cookbook/recovering.md b/doc/book/cookbook/recovering.md similarity index 97% rename from doc/book/src/cookbook/recovering.md rename to doc/book/cookbook/recovering.md index 279d574c..2424558c 100644 --- a/doc/book/src/cookbook/recovering.md +++ b/doc/book/cookbook/recovering.md @@ -1,4 +1,7 @@ -# Recovering from failures ++++ +title = "Recovering from failures" +weight = 35 ++++ Garage is meant to work on old, second-hand hardware. In particular, this makes it likely that some of your drives will fail, and some manual intervention will be needed. @@ -91,7 +94,7 @@ might be faster but most of the pieces will be deleted anyway from the disk and First, set up a new drive to store the metadata directory for the replacement node (a SSD is recommended), and for the data directory if necessary. You can then start Garage on the new node. -The restarted node should generate a new node ID, and it should be shown as `NOT CONFIGURED` in `garage status`. +The restarted node should generate a new node ID, and it should be shown with `NO ROLE ASSIGNED` in `garage status`. The ID of the lost node should be shown in `garage status` in the section for disconnected/unavailable nodes. Then, replace the broken node by the new one, using: diff --git a/doc/book/src/cookbook/reverse_proxy.md b/doc/book/cookbook/reverse-proxy.md similarity index 97% rename from doc/book/src/cookbook/reverse_proxy.md rename to doc/book/cookbook/reverse-proxy.md index 14633ae8..63ba4bbe 100644 --- a/doc/book/src/cookbook/reverse_proxy.md +++ b/doc/book/cookbook/reverse-proxy.md @@ -1,4 +1,7 @@ -# Configuring a reverse proxy ++++ +title = "Configuring a reverse proxy" +weight = 30 ++++ The main reason to add a reverse proxy in front of Garage is to provide TLS to your users. @@ -118,7 +121,7 @@ server { ### Exposing the web endpoint The web endpoint is a bit more complicated to configure as it listens on many different `Host` fields. -To better understand the logic involved, you can refer to the [Exposing buckets as websites](/cookbook/exposing_websites.html) section. +To better understand the logic involved, you can refer to the [Exposing buckets as websites](@/documentation/cookbook/exposing-websites.md) section. Also, for some applications, you may need to serve CORS headers: Garage can not serve them directly but we show how we can use nginx to serve them. You can use the following example as your starting point: diff --git a/doc/book/src/cookbook/systemd.md b/doc/book/cookbook/systemd.md similarity index 96% rename from doc/book/src/cookbook/systemd.md rename to doc/book/cookbook/systemd.md index ff3541f5..b271010b 100644 --- a/doc/book/src/cookbook/systemd.md +++ b/doc/book/cookbook/systemd.md @@ -1,4 +1,7 @@ -# Starting Garage with systemd ++++ +title = "Starting Garage with systemd" +weight = 15 ++++ We make some assumptions for this systemd deployment. diff --git a/doc/book/src/design/index.md b/doc/book/design/_index.md similarity index 67% rename from doc/book/src/design/index.md rename to doc/book/design/_index.md index 2e3b5fd9..f3a08aaf 100644 --- a/doc/book/src/design/index.md +++ b/doc/book/design/_index.md @@ -1,15 +1,20 @@ -# Design ++++ +title = "Design" +weight = 5 +sort_by = "weight" +template = "documentation.html" ++++ 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. +- **[Goals and use cases](@/documentation/design/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. +- **[Related work](@/documentation/design/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. +- **[Internals](@/documentation/design/internals.md):** This page enters into more details on how Garage manages data internally. ## Talks diff --git a/doc/book/src/design/img/endpoint-latency-dc.png b/doc/book/design/benchmarks/endpoint-latency-dc.png similarity index 100% rename from doc/book/src/design/img/endpoint-latency-dc.png rename to doc/book/design/benchmarks/endpoint-latency-dc.png diff --git a/doc/book/src/design/img/endpoint-latency.png b/doc/book/design/benchmarks/endpoint-latency.png similarity index 100% rename from doc/book/src/design/img/endpoint-latency.png rename to doc/book/design/benchmarks/endpoint-latency.png diff --git a/doc/book/src/design/benchmarks.md b/doc/book/design/benchmarks/index.md similarity index 97% rename from doc/book/src/design/benchmarks.md rename to doc/book/design/benchmarks/index.md index 6e5580e5..c2215a4a 100644 --- a/doc/book/src/design/benchmarks.md +++ b/doc/book/design/benchmarks/index.md @@ -1,4 +1,7 @@ -# Benchmarks ++++ +title = "Benchmarks" +weight = 10 ++++ With Garage, we wanted to build a software defined storage service that follow the [KISS principle](https://en.wikipedia.org/wiki/KISS_principle), that is suitable for geo-distributed deployments and more generally that would work well for community hosting (like a Mastodon instance). @@ -25,7 +28,7 @@ We selected 5 standard endpoints that are often in the critical path: ListBucket In this first benchmark, we consider 5 instances that are located in a different place each. To simulate the distance, we configure mknet with a RTT between each node of 100 ms +/- 20 ms of jitter. We get the following graph, where the colored bars represent the mean latency while the error bars the minimum and maximum one: -![Comparison of endpoints latency for minio and garage](./img/endpoint-latency.png) +![Comparison of endpoints latency for minio and garage](./endpoint-latency.png) Compared to garage, minio latency drastically increases on 3 endpoints: GetObject, PutObject, RemoveObject. @@ -43,7 +46,7 @@ We consider that intra-DC communications are now very cheap with a latency of 0. The inter-DC remains costly with the same value as before (100ms +/- 20ms of jitter). We plot a similar graph as before: -![Comparison of endpoints latency for minio and garage with 6 nodes in 3 DC](./img/endpoint-latency-dc.png) +![Comparison of endpoints latency for minio and garage with 6 nodes in 3 DC](./endpoint-latency-dc.png) This new graph is very similar to the one before, neither minio or garage seems to benefit from this new topology, but they also do not suffer from it. diff --git a/doc/book/src/design/goals.md b/doc/book/design/goals.md similarity index 98% rename from doc/book/src/design/goals.md rename to doc/book/design/goals.md index 10ef6a8f..dea1d2c8 100644 --- a/doc/book/src/design/goals.md +++ b/doc/book/design/goals.md @@ -1,4 +1,7 @@ -# Goals and use cases ++++ +title = "Goals and use cases" +weight = 5 ++++ ## Goals and non-goals diff --git a/doc/book/src/design/internals.md b/doc/book/design/internals.md similarity index 97% rename from doc/book/src/design/internals.md rename to doc/book/design/internals.md index 0b31584c..05d852e2 100644 --- a/doc/book/src/design/internals.md +++ b/doc/book/design/internals.md @@ -1,4 +1,7 @@ -# Internals ++++ +title = "Internals" +weight = 20 ++++ ## Overview @@ -14,7 +17,7 @@ In the meantime, you can find some information at the following links: - [this presentation (in French)](https://git.deuxfleurs.fr/Deuxfleurs/garage/src/branch/main/doc/talks/2020-12-02_wide-team/talk.pdf) -- [an old design draft](/working_documents/design_draft.md) +- [an old design draft](@/documentation/working-documents/design-draft.md) ## Garbage collection diff --git a/doc/book/src/design/related_work.md b/doc/book/design/related-work.md similarity index 96% rename from doc/book/src/design/related_work.md rename to doc/book/design/related-work.md index da3f807e..ade298ec 100644 --- a/doc/book/src/design/related_work.md +++ b/doc/book/design/related-work.md @@ -1,4 +1,7 @@ -# Related work ++++ +title = "Related work" +weight = 15 ++++ ## Context @@ -21,7 +24,7 @@ Openstack Cinder proxy previous solution to provide an uniform API. File storage provides a higher abstraction, they are one filesystem among others, which means they don't necessarily have all the exotic features of every filesystem. Often, they relax some POSIX constraints while many applications will still be compatible without any modification. As an example, we are able to run MariaDB (very slowly) over GlusterFS... -We can also mention CephFS (read [RADOS](https://ceph.com/wp-content/uploads/2016/08/weil-rados-pdsw07.pdf) whitepaper), Lustre, LizardFS, MooseFS, etc. +We can also mention CephFS (read [RADOS](https://doi.org/10.1145/1374596.1374606) whitepaper [[pdf](https://ceph.com/assets/pdfs/weil-rados-pdsw07.pdf)]), Lustre, LizardFS, MooseFS, etc. OpenStack Manila proxy previous solutions to provide an uniform API. Finally object storages provide the highest level abstraction. diff --git a/doc/book/src/development/index.md b/doc/book/development/_index.md similarity index 91% rename from doc/book/src/development/index.md rename to doc/book/development/_index.md index 09147ece..662ec358 100644 --- a/doc/book/src/development/index.md +++ b/doc/book/development/_index.md @@ -1,4 +1,9 @@ -# Development ++++ +title = "Development" +weight = 6 +sort_by = "weight" +template = "documentation.html" ++++ 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. diff --git a/doc/book/src/development/devenv.md b/doc/book/development/devenv.md similarity index 98% rename from doc/book/src/development/devenv.md rename to doc/book/development/devenv.md index 78affa48..c2ef4e7d 100644 --- a/doc/book/src/development/devenv.md +++ b/doc/book/development/devenv.md @@ -1,4 +1,7 @@ -# Setup your development environment ++++ +title = "Setup your environment" +weight = 5 ++++ Depending on your tastes, you can bootstrap your development environment in a traditional Rust way or through Nix. diff --git a/doc/book/src/development/miscellaneous_notes.md b/doc/book/development/miscellaneous-notes.md similarity index 98% rename from doc/book/src/development/miscellaneous_notes.md rename to doc/book/development/miscellaneous-notes.md index 1adc5744..f0083ae5 100644 --- a/doc/book/src/development/miscellaneous_notes.md +++ b/doc/book/development/miscellaneous-notes.md @@ -1,4 +1,7 @@ -# Miscellaneous Notes ++++ +title = "Miscellaneous notes" +weight = 20 ++++ ## Quirks about cargo2nix/rust in Nix diff --git a/doc/book/src/development/release_process.md b/doc/book/development/release-process.md similarity index 98% rename from doc/book/src/development/release_process.md rename to doc/book/development/release-process.md index e6f9e608..eee45e24 100644 --- a/doc/book/src/development/release_process.md +++ b/doc/book/development/release-process.md @@ -1,4 +1,7 @@ -# Release process ++++ +title = "Release process" +weight = 15 ++++ Before releasing a new version of Garage, our code pass through a succession of checks and transformations. We define them as our release process. @@ -31,7 +34,7 @@ We generate the following binary artifacts for now: Additionnaly we also build two web pages: - the documentation (this website) - - [the release page](https://garagehq.deuxfleurs.fr/releases.html) + - [the release page](https://garagehq.deuxfleurs.fr/_releases.html) We publish the static binaries on our own garage cluster (you can access them through the releases page) and the docker containers on Docker Hub. diff --git a/doc/book/src/development/scripts.md b/doc/book/development/scripts.md similarity index 85% rename from doc/book/src/development/scripts.md rename to doc/book/development/scripts.md index 387cb349..498419e2 100644 --- a/doc/book/src/development/scripts.md +++ b/doc/book/development/scripts.md @@ -1,4 +1,7 @@ -# Development scripts ++++ +title = "Development scripts" +weight = 10 ++++ We maintain a `script/` folder that contains some useful script to ease testing on Garage. @@ -31,7 +34,7 @@ You can inspect the detailed configuration, including ports, by inspecting `/tmp This script also spawns a simple HTTPS reverse proxy through `socat` for the S3 endpoint that listens on port `4443`. Some libraries might require a TLS endpoint to work, refer to our issue [#64](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/64) for more detailed information on this subject. -This script covers the [Launching the garage server](/quick_start/index.html#launching-the-garage-server) section of our Quick start page. +This script covers the [Launching the garage server](@/documentation/quick-start/_index.md#launching-the-garage-server) section of our Quick start page. ### 2. Make them join the cluster @@ -41,7 +44,7 @@ This script covers the [Launching the garage server](/quick_start/index.html#lau This script will configure each instance by assigning them a zone (`dc1`) and a weight (`1`). -This script covers the [Configuring your Garage node](/quick_start/index.html#configuring-your-garage-node) section of our Quick start page. +This script covers the [Creating a cluster layout](@/documentation/quick-start/_index.md#creating-a-cluster-layout) section of our Quick start page. ### 3. Create a key and a bucket @@ -52,7 +55,7 @@ This script covers the [Configuring your Garage node](/quick_start/index.html#co This script will create a bucket named `eprouvette` with a key having read and write rights on this bucket. The key is stored in a filed named `/tmp/garage.s3` and can be used by the following tools to pre-configure them. -This script covers the [Creating buckets and keys](/quick_start/index.html#creating-buckets-and-keys) section of our Quick start page. +This script covers the [Creating buckets and keys](@/documentation/quick-start/_index.md#creating-buckets-and-keys) section of our Quick start page. ## Handlers for generic tools diff --git a/doc/book/src/quick_start/index.md b/doc/book/quick-start/_index.md similarity index 91% rename from doc/book/src/quick_start/index.md rename to doc/book/quick-start/_index.md index ffb3ebbe..53ef00b4 100644 --- a/doc/book/src/quick_start/index.md +++ b/doc/book/quick-start/_index.md @@ -1,4 +1,9 @@ -# Quick Start ++++ +title = "Quick Start" +weight = 0 +sort_by = "weight" +template = "documentation.html" ++++ Let's start your Garage journey! In this chapter, we explain how to deploy Garage as a single-node server @@ -6,7 +11,7 @@ and how to interact with it. Our goal is to introduce you to Garage's workflows. Following this guide is recommended before moving on to -[configuring a multi-node cluster](../cookbook/real_world.md). +[configuring a multi-node cluster](@/documentation/cookbook/real-world.md). Note that this kind of deployment should not be used in production, as it provides no redundancy for your data! @@ -23,10 +28,12 @@ or in `~/.local/bin`). If a binary of the last version is not available for your architecture, or if you want a build customized for your system, -you can [build Garage from source](../cookbook/from_source.md). +you can [build Garage from source](@/documentation/cookbook/from-source.md). -## Writing a first configuration file +## Configuring and starting Garage + +### Writing a first configuration file This first configuration file should allow you to get started easily with the simplest possible Garage deployment. @@ -68,12 +75,12 @@ 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: ``` -RUST_LOG=garage=info garage server +garage server ``` You can tune Garage's verbosity as follows (from less verbose to more verbose): @@ -84,11 +91,11 @@ RUST_LOG=garage=debug garage server RUST_LOG=garage=trace garage server ``` -Log level `info` is recommended for most use cases. +Log level `info` is the default value and is recommended for most use cases. Log level `debug` can help you check why your S3 API calls are not working. -## Checking that Garage runs correctly +### Checking that Garage runs correctly The `garage` utility is also used as a CLI tool to configure your Garage deployment. It uses values from the TOML configuration file to find the Garage daemon running on the @@ -147,7 +154,7 @@ garage help garage bucket allow --help ``` -#### Create a bucket +### Create a bucket Let's take an example where we want to deploy NextCloud using Garage as the main data storage. @@ -165,7 +172,7 @@ garage bucket list garage bucket info nextcloud-bucket ``` -#### Create an API key +### Create an API key The `nextcloud-bucket` bucket now exists on the Garage server, however it cannot be accessed until we add an API key with the proper access rights. @@ -195,7 +202,7 @@ garage key list garage key info nextcloud-app-key ``` -#### Allow a key to access a bucket +### Allow a key to access a bucket Now that we have a bucket and a key, we need to give permissions to the key on the bucket: @@ -224,7 +231,7 @@ Before reading the following, you need a working `mc` command on your path. Note that on certain Linux distributions such as Arch Linux, the Minio client binary is called `mcli` instead of `mc` (to avoid name clashes with the Midnight Commander). -#### Configure `mc` +### Configure `mc` You need your access key and secret key created above. We will assume you are invoking `mc` on the same machine as the Garage server, @@ -252,7 +259,7 @@ or `$HOME/.bashrc` file: export MC_REGION=garage ``` -#### Use `mc` +### Use `mc` You can not list buckets from `mc` currently. @@ -266,7 +273,7 @@ mc mirror localdir/ my-garage/another-bucket ``` -#### Other tools for interacting with Garage +### Other tools for interacting with Garage The following tools can also be used to send and recieve files from/to Garage: @@ -275,5 +282,5 @@ The following tools can also be used to send and recieve files from/to Garage: - [Cyberduck](https://cyberduck.io/) - [`s3cmd`](https://s3tools.org/s3cmd) -Refer to the ["Integrations" section](../connect/index.md) to learn how to +Refer to the ["Integrations" section](@/documentation/connect/_index.md) to learn how to configure application and command line utilities to integrate with Garage. diff --git a/doc/book/src/reference_manual/index.md b/doc/book/reference-manual/_index.md similarity index 74% rename from doc/book/src/reference_manual/index.md rename to doc/book/reference-manual/_index.md index 0d4bd6f3..62716df8 100644 --- a/doc/book/src/reference_manual/index.md +++ b/doc/book/reference-manual/_index.md @@ -1,4 +1,9 @@ -# Reference Manual ++++ +title = "Reference Manual" +weight = 4 +sort_by = "weight" +template = "documentation.html" ++++ 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. diff --git a/doc/book/src/reference_manual/cli.md b/doc/book/reference-manual/cli.md similarity index 76% rename from doc/book/src/reference_manual/cli.md rename to doc/book/reference-manual/cli.md index 80789b9d..43a0c823 100644 --- a/doc/book/src/reference_manual/cli.md +++ b/doc/book/reference-manual/cli.md @@ -1,4 +1,7 @@ -# Garage CLI ++++ +title = "Garage CLI" +weight = 15 ++++ The Garage CLI is mostly self-documented. Make use of the `help` subcommand and the `--help` flag to discover all available options. diff --git a/doc/book/src/reference_manual/configuration.md b/doc/book/reference-manual/configuration.md similarity index 94% rename from doc/book/src/reference_manual/configuration.md rename to doc/book/reference-manual/configuration.md index 9f88b232..662b00f9 100644 --- a/doc/book/src/reference_manual/configuration.md +++ b/doc/book/reference-manual/configuration.md @@ -1,4 +1,7 @@ -# Garage configuration file format reference ++++ +title = "Configuration file format" +weight = 5 ++++ Here is an example `garage.toml` configuration file that illustrates all of the possible options: @@ -44,7 +47,7 @@ The following gives details about each available configuration option. ## Available configuration options -#### `metadata_dir` +### `metadata_dir` The directory in which Garage will store its metadata. This contains the node identifier, the network configuration and the peer list, the list of buckets and keys as well @@ -52,14 +55,14 @@ as the index of all objects, object version and object blocks. Store this folder on a fast SSD drive if possible to maximize Garage's performance. -#### `data_dir` +### `data_dir` The directory in which Garage will store the data blocks of objects. This folder can be placed on an HDD. The space available for `data_dir` should be counted to determine a node's capacity -when [configuring it](../getting_started/05_cluster.md). +when [configuring it](@/documentation/cookbook/real-world.md). -#### `block_size` +### `block_size` Garage splits stored objects in consecutive chunks of size `block_size` (except the last one which might be smaller). The default size is 1MB and @@ -71,7 +74,7 @@ means that chunks from existing files will not be deduplicated with chunks from newly uploaded files, meaning you might use more storage space that is optimally possible. -#### `replication_mode` +### `replication_mode` Garage supports the following replication modes: @@ -124,7 +127,7 @@ Compression is done synchronously, setting a value too high will add latency to This value can be different between nodes, compression is done by the node which receive the API call. -#### `rpc_secret` +### `rpc_secret` Garage uses a secret key that is shared between all nodes of the cluster in order to identify these nodes and allow them to communicate together. @@ -132,7 +135,7 @@ This key should be specified here in the form of a 32-byte hex-encoded random string. Such a string can be generated with a command such as `openssl rand -hex 32`. -#### `rpc_bind_addr` +### `rpc_bind_addr` The address and port on which to bind for inter-cluster communcations (reffered to as RPC for remote procedure calls). @@ -141,14 +144,14 @@ the node, even in the case of a NAT: the NAT should be configured to forward the port number to the same internal port nubmer. This means that if you have several nodes running behind a NAT, they should each use a different RPC port number. -#### `rpc_public_addr` +### `rpc_public_addr` The address and port that other nodes need to use to contact this node for RPC calls. **This parameter is optional but recommended.** In case you have a NAT that binds the RPC port to a port that is different on your public IP, this field might help making it work. -#### `bootstrap_peers` +### `bootstrap_peers` A list of peer identifiers on which to contact other Garage peers of this cluster. These peer identifiers have the following syntax: @@ -164,7 +167,7 @@ be obtained by running `garage node id` and then included directly in the key will be returned by `garage node id` and you will have to add the IP yourself. -#### `consul_host` and `consul_service_name` +### `consul_host` and `consul_service_name` Garage supports discovering other nodes of the cluster using Consul. This works only when nodes are announced in Consul by an orchestrator such as Nomad, @@ -174,7 +177,7 @@ The `consul_host` parameter should be set to the hostname of the Consul server, and `consul_service_name` should be set to the service name under which Garage's RPC ports are announced. -#### `sled_cache_capacity` +### `sled_cache_capacity` This parameter can be used to tune the capacity of the cache used by [sled](https://sled.rs), the database Garage uses internally to store metadata. @@ -182,7 +185,7 @@ Tune this to fit the RAM you wish to make available to your Garage instance. More cache means faster Garage, but the default value (128MB) should be plenty for most use cases. -#### `sled_flush_every_ms` +### `sled_flush_every_ms` This parameters can be used to tune the flushing interval of sled. Increase this if sled is thrashing your SSD, at the risk of losing more data in case @@ -190,20 +193,21 @@ of a power outage (though this should not matter much as data is replicated on o nodes). The default value, 2000ms, should be appropriate for most use cases. + ## The `[s3_api]` section -#### `api_bind_addr` +### `api_bind_addr` The IP and port on which to bind for accepting S3 API calls. This endpoint does not suport TLS: a reverse proxy should be used to provide it. -#### `s3_region` +### `s3_region` Garage will accept S3 API calls that are targetted to the S3 region defined here. API calls targetted to other regions will fail with a AuthorizationHeaderMalformed error message that redirects the client to the correct region. -#### `root_domain` +### `root_domain` {#root_domain} The optionnal suffix to access bucket using vhost-style in addition to path-style request. Note path-style requests are always enabled, whether or not vhost-style is configured. @@ -213,18 +217,20 @@ but might be required by softwares not supporting path-style requests. If `root_domain` is `s3.garage.eu`, a bucket called `my-bucket` can be interacted with using the hostname `my-bucket.s3.garage.eu`. + + ## The `[s3_web]` section Garage allows to publish content of buckets as websites. This section configures the behaviour of this module. -#### `bind_addr` +### `bind_addr` The IP and port on which to bind for accepting HTTP requests to buckets configured for website access. This endpoint does not suport TLS: a reverse proxy should be used to provide it. -#### `root_domain` +### `root_domain` The optionnal suffix appended to bucket names for the corresponding HTTP Host. @@ -232,6 +238,3 @@ For instance, if `root_domain` is `web.garage.eu`, a bucket called `deuxfleurs.f will be accessible either with hostname `deuxfleurs.fr.web.garage.eu` or with hostname `deuxfleurs.fr`. -#### `index` - -The name of the index file to return for requests ending with `/` (usually `index.html`). diff --git a/doc/book/src/reference_manual/layout.md b/doc/book/reference-manual/layout.md similarity index 96% rename from doc/book/src/reference_manual/layout.md rename to doc/book/reference-manual/layout.md index 80c71d60..7debbf33 100644 --- a/doc/book/src/reference_manual/layout.md +++ b/doc/book/reference-manual/layout.md @@ -1,10 +1,13 @@ -# Creating and updating a cluster layout ++++ +title = "Cluster layout management" +weight = 10 ++++ The cluster layout in Garage is a table that assigns to each node a role in the cluster. The role of a node in Garage can either be a storage node with a certain capacity, or a gateway node that does not store data and is only used as an API entry point for faster cluster access. -An introduction to building cluster layouts can be found in the [production deployment](/cookbook/real_world.md) page. +An introduction to building cluster layouts can be found in the [production deployment](@/documentation/cookbook/real-world.md) page. ## How cluster layouts work in Garage diff --git a/doc/book/src/reference_manual/s3_compatibility.md b/doc/book/reference-manual/s3-compatibility.md similarity index 98% rename from doc/book/src/reference_manual/s3_compatibility.md rename to doc/book/reference-manual/s3-compatibility.md index e6f32f6a..fdac06ab 100644 --- a/doc/book/src/reference_manual/s3_compatibility.md +++ b/doc/book/reference-manual/s3-compatibility.md @@ -1,4 +1,7 @@ -# S3 Compatibility status ++++ +title = "S3 Compatibility status" +weight = 20 ++++ ## Global S3 features diff --git a/doc/book/src/SUMMARY.md b/doc/book/src/SUMMARY.md deleted file mode 100644 index d9b76e96..00000000 --- a/doc/book/src/SUMMARY.md +++ /dev/null @@ -1,49 +0,0 @@ -# Summary - -[The Garage Data Store](./intro.md) - -- [Quick start](./quick_start/index.md) - -- [Cookbook](./cookbook/index.md) - - [Multi-node deployment](./cookbook/real_world.md) - - [Building from source](./cookbook/from_source.md) - - [Integration with systemd](./cookbook/systemd.md) - - [Configuring a gateway node](./cookbook/gateways.md) - - [Exposing buckets as websites](./cookbook/exposing_websites.md) - - [Configuring a reverse proxy](./cookbook/reverse_proxy.md) - - [Recovering from failures](./cookbook/recovering.md) - -- [Integrations](./connect/index.md) - - [Apps (Nextcloud, Peertube...)](./connect/apps.md) - - [Websites (Hugo, Jekyll, Publii...)](./connect/websites.md) - - [Repositories (Docker, Nix, Git...)](./connect/repositories.md) - - [CLI tools (rclone, awscli, mc...)](./connect/cli.md) - - [Backups (restic, duplicity...)](./connect/backup.md) - - [Your code (PHP, JS, Go...)](./connect/code.md) - - [FUSE (s3fs, goofys, s3backer...)](./connect/fs.md) - - -- [Reference Manual](./reference_manual/index.md) - - [Garage configuration file](./reference_manual/configuration.md) - - [Cluster layout management](./reference_manual/layout.md) - - [Garage CLI](./reference_manual/cli.md) - - [S3 compatibility status](./reference_manual/s3_compatibility.md) - -- [Design](./design/index.md) - - [Goals and use Cases](./design/goals.md) - - [Benchmarks](./design/benchmarks.md) - - [Related work](./design/related_work.md) - - [Internals](./design/internals.md) - -- [Development](./development/index.md) - - [Setup your environment](./development/devenv.md) - - [Development scripts](./development/scripts.md) - - [Release process](./development/release_process.md) - - [Miscellaneous notes](./development/miscellaneous_notes.md) - -- [Working Documents](./working_documents/index.md) - - [S3 compatibility target](./working_documents/compatibility_target.md) - - [Load balancing data](./working_documents/load_balancing.md) - - [Migrating from 0.5 to 0.6](./working_documents/migration_06.md) - - [Migrating from 0.3 to 0.4](./working_documents/migration_04.md) - - [Design draft](./working_documents/design_draft.md) diff --git a/doc/book/src/cookbook/exposing_websites.md b/doc/book/src/cookbook/exposing_websites.md deleted file mode 100644 index 0cbb1150..00000000 --- a/doc/book/src/cookbook/exposing_websites.md +++ /dev/null @@ -1,48 +0,0 @@ -# Exposing buckets as websites - -You can expose your bucket as a website with this simple command: - -```bash -garage bucket website --allow my-website -``` - -Now it will be **publicly** exposed on the web endpoint (by default listening on port 3902). - -Our website serving logic is as follow: - - Supports only static websites (no support for PHP or other languages) - - Does not support directory listing - - The index is defined in your `garage.toml`. ([ref](/reference_manual/configuration.html#index)) - -Now we need to infer the URL of your website through your bucket name. -Let assume: - - we set `root_domain = ".web.example.com"` in `garage.toml` ([ref](/reference_manual/configuration.html#root_domain)) - - our bucket name is `garagehq.deuxfleurs.fr`. - -Our bucket will be served if the Host field matches one of these 2 values (the port is ignored): - - - `garagehq.deuxfleurs.fr.web.example.com`: you can dedicate a subdomain to your users (here `web.example.com`). - - - `garagehq.deuxfleurs.fr`: your users can bring their own domain name, they just need to point them to your Garage cluster. - -You can try this logic locally, without configuring any DNS, thanks to `curl`: - -```bash -# prepare your test -echo hello world > /tmp/index.html -mc cp /tmp/index.html garage/garagehq.deuxfleurs.fr - -curl -H 'Host: garagehq.deuxfleurs.fr' http://localhost:3902 -# should print "hello world" - -curl -H 'Host: garagehq.deuxfleurs.fr.web.example.com' http://localhost:3902 -# should also print "hello world" -``` - -Now that you understand how website logic works on Garage, you can: - - - make the website endpoint listens on port 80 (instead of 3902) - - use iptables to redirect the port 80 to the port 3902: - `iptables -t nat -A PREROUTING -p tcp -dport 80 -j REDIRECT -to-port 3902` - - or configure a [reverse proxy](reverse_proxy.html) in front of Garage to add TLS (HTTPS), CORS support, etc. - -You can also take a look at [Website Integration](/connect/websites.html) to see how you can add Garage to your workflow. diff --git a/doc/book/src/cookbook/index.md b/doc/book/src/cookbook/index.md deleted file mode 100644 index 792a5e6e..00000000 --- a/doc/book/src/cookbook/index.md +++ /dev/null @@ -1,26 +0,0 @@ -# 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/doc/book/src/cookbook/website.md b/doc/book/src/cookbook/website.md deleted file mode 100644 index 53488ac4..00000000 --- a/doc/book/src/cookbook/website.md +++ /dev/null @@ -1,3 +0,0 @@ -# Hosting a website - -TODO diff --git a/doc/book/src/img/eu-flag-logo.png b/doc/book/src/img/eu-flag-logo.png deleted file mode 100644 index eab9e8331fbdf2dea08319d6157c608057329861..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2477 zcmV;e2~zfnP)8JmZXb6awc9pTLWq_CFO*prd8JsNGDodEy<00000000000000000000@XbNM z1;4nYI@iGqhhX>ant>Y*z~{y?4{kU>sZV^-3l)6J<3EOKbyUx1Y4GeA2#RMQq-r9B zMi`+*Ikqpa;2fUt?68+=w_EgZKJysJlOvnm;^B+w6^!i)e?u6ZM_zf;w>|cJ^1SKW z%|f`arj1PxavDXlffvrBnK+!K})EgTc{(+G3ls{a4 z$lAOW@=bMZ>_%o%y*4oR`;N~t^6|{dZ#bl7xc*v>L_d2ENeQz$?MN7~n?3eouFBcr z{i3)C{?~(bDP|Jh#l^4hEZPBkL9+(W(n>5k8wO%Fj;CJyebX0rv&HX4z(DBR@&9Vk z3)st3rjkzV(ng3bJccsUk6lYi)eZVCGWB(=Hz_td{J~p)TF1_kTEXiz7jukgQOnZM z85^U9$3QM@4>fW^(~CY#C3#A!|2mluAm-Sq zFizGsYo{{n^0{%5#^~WgIyseWzDTJ?pgf{iC&Fx5qmJxy3U(eTa+M!E%!ioL9K9}W z{z$}*mY1;RG>6~0-&S@3s$M(i9vXg)Ktnd2>m(kQOkOWM6h@w%=YnibE>sN{t!YMT z1ngoGKGC|-T7*$s*+40+2M09*y;3p>k9__L@7c)>g~H^Gi92&wBha*xifCqa?9dK% z3yNU$qDd zfs{;yu!|8ICHkzaWqWo;6rqLkR92r*TwmP`F*Xy;vg;j+?TZ_4N;i~GNQ!4VYYSo( zTw|DIpojq-taUl1Cu`@o3?1~~mksFa@hHLcsW)`qxQvfH>A8w8#jFsL5>}cf7}Tt| ztwj*4mg?Vu+m(?dx<-<{T7)wI000000002sB%v_5Ctq|LmZ-b)Mb>Ynud%CceSy~f znypH$Yb&dDAa0HBS5&Zy2W7Pm2piF_DE}tfLRqZ?c8}5G3o2MyTgCcI(+y>}y0d2Zp7T#twVhvy0J`E3_mtYnt2b^E)D~36EH>^{w4SgR3>s z@>ZxhusKDM7E0@&z5qX1%AM|!Rc!vVJ*N9;d>YgjwA4HBRGy*DK7YzvmC~*}ZL45? z0b6^ImXn$TqjIWtTP8y0AWrMx>zAG>m4YsFjB}~3hovc{Zqe$P7%NxjSMD2wnoflC zi4%W+1y|7aY$c~Y&ufGxWsqzs)#dNhG` zoiIAYt7`QHdzu5O7JBbhujk>kAOHXW000000PveZ2uaD#>G(u{NlCBZ-zTF^#vHqv zj$T2%dO~^yub@|O2r)}%pWhmt%-soINT;J$u%;()cf#JC28AS5fp>QByW;A@)q;;} zsVIDPEt?mK=oOr8?8uYMTRWxn*+-cw>qF3-*kJ>3J8z_41YQMe!JtU-8px2)F z^$O5!UST0fCRV$Bes`HzeE}2GJv$dd?TMB*W`T~tc%2}3AiN#gd9EqXQFvN<1(l$l zpm9Qa1-Hr4sZg(go`7CKetV}uqBo(iM?18mzFt9-V!L^BmrGi&pyJt?+{{f(TdM07 zSYxB#;!?alVZ8$14oTe3?-)8ddeLQkdIeL}^$Pau3rIS4K(7F>o2WASTGhXjhsdT+_<#79^i_HGZQ)Og39)lzWim|W z#;3FFe3*`MaoUioz@PnRmlv75-B{iaXlvw?L&rq6$kNgioEDT>_N6%TwBQLT3Lmuu zzyI`43(9Q%^Pij+j17aJub-h$@uXqmgJu~$wKs~(vd3y2kk?-ng`I5N56F7^*?jsE zm(3^D+t}NU&klA1=#XdRwi#wM_tb~Gv6H3d*q1D}Z^zta=!+SeXnA;Q4~?~Wj>2C) zVlVtL%+RNM(lB|a1lfG##J@Pn&py1S!prgY#3tpiobEiRCu=*i;;oyv5bkxj%fvCRCnId~xVQd#} zIvxXYG;qge=nRZOUiUusM#e1+o{;!&v<{f{ - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/book/src/img/map.svg b/doc/book/src/img/map.svg deleted file mode 100644 index 7b38b2d8..00000000 --- a/doc/book/src/img/map.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -
France
France
UK
UK
Belgium
Belgium
Switzerland
Switzerland
Germany
Germany
Legend
Legend
A Zone
(multiple servers)
A Zone...
Chunks of data
Chunks of data
Each chunk of data is replicated in 3 zones
Each chunk of data is replicated in 3 zones
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/doc/book/src/img/ngi-logo.png b/doc/book/src/img/ngi-logo.png deleted file mode 100644 index ee0f0c29c0d797640d2b811b4643aba481f2fdd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34628 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 NW2PtfqPu_m{{fl)*4h97 diff --git a/doc/book/src/img/software.svg b/doc/book/src/img/software.svg deleted file mode 100644 index 178c5810..00000000 --- a/doc/book/src/img/software.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -
CyberDuck
CyberDuck
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/doc/book/src/img/usage.svg b/doc/book/src/img/usage.svg deleted file mode 100644 index c861f6ac..00000000 --- a/doc/book/src/img/usage.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -
Host a Website
Host a Website
Backup Target
Backup Target
Store Media
Store Media
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/doc/book/src/intro.md b/doc/book/src/intro.md deleted file mode 100644 index 5d6e2cf0..00000000 --- a/doc/book/src/intro.md +++ /dev/null @@ -1,101 +0,0 @@ -

- - Garage's Logo - -

- -

- [ Download - | Git repository - | Matrix channel - | Drone CI - ] -

- - -# Data resiliency for everyone - -Garage is an **open-source** distributed **storage service** you can **self-host** to fullfill many needs: - -

-Summary of the possible usages with a related icon: host a website, store media and backup target -

- -

-⮞ learn more about use cases ⮜ -

- -Garage implements the **[Amazon S3 API](https://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html)** and thus is already **compatible** with many applications: - -

-Garage is already compatible with Nextcloud, Mastodon, Matrix Synapse, Cyberduck, RClone and Peertube -

- -

-⮞ learn more about integrations ⮜ -

- - -Garage provides **data resiliency** by **replicating** data 3x over **distant** servers: - -

-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. -

- -

-⮞ learn more about our design ⮜ -

- -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. - - - -_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/doc/book/src/working_documents/index.md b/doc/book/working-documents/_index.md similarity index 83% rename from doc/book/src/working_documents/index.md rename to doc/book/working-documents/_index.md index a9e7f899..9871d206 100644 --- a/doc/book/src/working_documents/index.md +++ b/doc/book/working-documents/_index.md @@ -1,4 +1,9 @@ -# Working Documents ++++ +title = "Working Documents" +weight = 7 +sort_by = "weight" +template = "documentation.html" ++++ 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. diff --git a/doc/book/src/working_documents/compatibility_target.md b/doc/book/working-documents/compatibility-target.md similarity index 98% rename from doc/book/src/working_documents/compatibility_target.md rename to doc/book/working-documents/compatibility-target.md index 3f121e47..836f3e30 100644 --- a/doc/book/src/working_documents/compatibility_target.md +++ b/doc/book/working-documents/compatibility-target.md @@ -1,4 +1,7 @@ -# S3 compatibility target ++++ +title = "S3 compatibility target" +weight = 5 ++++ If there is a specific S3 functionnality you have a need for, feel free to open a PR to put the corresponding endpoints higher in the list. Please explain diff --git a/doc/book/src/working_documents/design_draft.md b/doc/book/working-documents/design-draft.md similarity index 98% rename from doc/book/src/working_documents/design_draft.md rename to doc/book/working-documents/design-draft.md index 06ed46bd..44849a41 100644 --- a/doc/book/src/working_documents/design_draft.md +++ b/doc/book/working-documents/design-draft.md @@ -1,4 +1,7 @@ -# Design draft ++++ +title = "Design draft" +weight = 25 ++++ **WARNING: this documentation is a design draft which was written before Garage's actual implementation. The general principle are similar, but details have not been updated.** @@ -159,4 +162,4 @@ Number K of tokens per node: decided by the operator & stored in the operator's - CDC: - Erasure coding: - [Openstack Storage Concepts](https://docs.openstack.org/arch-design/design-storage/design-storage-concepts.html) -- [RADOS](https://ceph.com/wp-content/uploads/2016/08/weil-rados-pdsw07.pdf) +- [RADOS](https://doi.org/10.1145/1374596.1374606) [[pdf](https://ceph.com/assets/pdfs/weil-rados-pdsw07.pdf)] diff --git a/doc/book/src/working_documents/load_balancing.md b/doc/book/working-documents/load-balancing.md similarity index 99% rename from doc/book/src/working_documents/load_balancing.md rename to doc/book/working-documents/load-balancing.md index 99271add..87298ae6 100644 --- a/doc/book/src/working_documents/load_balancing.md +++ b/doc/book/working-documents/load-balancing.md @@ -1,4 +1,7 @@ -# Load Balancing Data (planned for version 0.2) ++++ +title = "Load balancing data" +weight = 10 ++++ **This is being yet improved in release 0.5. The working document has not been updated yet, it still only applies to Garage 0.2 through 0.4.** diff --git a/doc/book/src/working_documents/migration_04.md b/doc/book/working-documents/migration-04.md similarity index 98% rename from doc/book/src/working_documents/migration_04.md rename to doc/book/working-documents/migration-04.md index 05e7eafd..d9d3ede1 100644 --- a/doc/book/src/working_documents/migration_04.md +++ b/doc/book/working-documents/migration-04.md @@ -1,4 +1,7 @@ -# Migrating from 0.3 to 0.4 ++++ +title = "Migrating from 0.3 to 0.4" +weight = 20 ++++ **Migrating from 0.3 to 0.4 is unsupported. This document is only intended to document the process internally for the Deuxfleurs cluster where we have to do diff --git a/doc/book/src/working_documents/migration_06.md b/doc/book/working-documents/migration-06.md similarity index 97% rename from doc/book/src/working_documents/migration_06.md rename to doc/book/working-documents/migration-06.md index 687f7458..28e2c32e 100644 --- a/doc/book/src/working_documents/migration_06.md +++ b/doc/book/working-documents/migration-06.md @@ -1,4 +1,7 @@ -# Migrating from 0.5 to 0.6 ++++ +title = "Migrating from 0.5 to 0.6" +weight = 15 ++++ **This guide explains how to migrate to 0.6 if you have an existing 0.5 cluster. We don't recommend trying to migrate directly from 0.4 or older to 0.6.**