From ff04afaa771e1ec2bd482fa47ced1a8e4933c916 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Wed, 2 Feb 2022 10:05:27 +0100 Subject: [PATCH 1/7] Move documentation files around and adapt format for new website --- doc/book/README | 3 + doc/book/book.toml | 6 -- .../connect/index.md => connect/_index.md} | 8 +- doc/book/{src => }/connect/apps.md | 5 +- doc/book/{src => }/connect/backup.md | 6 +- .../{src => }/connect/cli-nextcloud-gui.png | Bin doc/book/{src => }/connect/cli.md | 5 +- doc/book/{src => }/connect/code.md | 5 +- doc/book/{src => }/connect/fs.md | 5 +- doc/book/{src => }/connect/repositories.md | 5 +- doc/book/{src => }/connect/websites.md | 5 +- .../cookbook/index.md => cookbook/_index.md} | 7 +- .../{src => }/cookbook/exposing_websites.md | 5 +- doc/book/{src => }/cookbook/from_source.md | 5 +- doc/book/{src => }/cookbook/gateways.md | 5 +- doc/book/{src => }/cookbook/real_world.md | 5 +- doc/book/{src => }/cookbook/recovering.md | 5 +- doc/book/{src => }/cookbook/reverse_proxy.md | 5 +- doc/book/{src => }/cookbook/systemd.md | 5 +- .../{src/design/index.md => design/_index.md} | 7 +- doc/book/{src => }/design/benchmarks.md | 0 doc/book/{src => }/design/goals.md | 5 +- .../design/img/endpoint-latency-dc.png | Bin .../{src => }/design/img/endpoint-latency.png | Bin doc/book/{src => }/design/internals.md | 5 +- doc/book/{src => }/design/related_work.md | 5 +- .../index.md => development/_index.md} | 7 +- doc/book/{src => }/development/devenv.md | 5 +- .../development/miscellaneous_notes.md | 5 +- .../{src => }/development/release_process.md | 5 +- doc/book/{src => }/development/scripts.md | 5 +- .../index.md => quick-start/_index.md} | 7 +- .../index.md => reference-manual/_index.md} | 7 +- .../cli.md | 5 +- .../configuration.md | 5 +- .../layout.md | 5 +- .../s3_compatibility.md | 5 +- doc/book/src/SUMMARY.md | 49 --------- 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 | 5 +- .../load_balancing.md | 5 +- .../migration_04.md | 5 +- .../migration_06.md | 5 +- 52 files changed, 167 insertions(+), 249 deletions(-) create mode 100644 doc/book/README delete mode 100644 doc/book/book.toml rename doc/book/{src/connect/index.md => connect/_index.md} (95%) rename doc/book/{src => }/connect/apps.md (99%) rename doc/book/{src => }/connect/backup.md (95%) rename doc/book/{src => }/connect/cli-nextcloud-gui.png (100%) rename doc/book/{src => }/connect/cli.md (98%) rename doc/book/{src => }/connect/code.md (98%) rename doc/book/{src => }/connect/fs.md (96%) rename doc/book/{src => }/connect/repositories.md (98%) rename doc/book/{src => }/connect/websites.md (97%) rename doc/book/{src/cookbook/index.md => cookbook/_index.md} (94%) rename doc/book/{src => }/cookbook/exposing_websites.md (97%) rename doc/book/{src => }/cookbook/from_source.md (95%) rename doc/book/{src => }/cookbook/gateways.md (96%) rename doc/book/{src => }/cookbook/real_world.md (99%) rename doc/book/{src => }/cookbook/recovering.md (98%) rename doc/book/{src => }/cookbook/reverse_proxy.md (98%) rename doc/book/{src => }/cookbook/systemd.md (96%) rename doc/book/{src/design/index.md => design/_index.md} (94%) rename doc/book/{src => }/design/benchmarks.md (100%) rename doc/book/{src => }/design/goals.md (98%) rename doc/book/{src => }/design/img/endpoint-latency-dc.png (100%) rename doc/book/{src => }/design/img/endpoint-latency.png (100%) rename doc/book/{src => }/design/internals.md (99%) rename doc/book/{src => }/design/related_work.md (99%) 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 (98%) rename doc/book/{src => }/development/release_process.md (99%) rename doc/book/{src => }/development/scripts.md (98%) rename doc/book/{src/quick_start/index.md => quick-start/_index.md} (98%) 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 (99%) rename doc/book/{src/reference_manual => reference-manual}/layout.md (98%) rename doc/book/{src/reference_manual => reference-manual}/s3_compatibility.md (98%) delete mode 100644 doc/book/src/SUMMARY.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 => working-documents}/compatibility_target.md (98%) rename doc/book/{src/working_documents => working-documents}/design_draft.md (99%) rename doc/book/{src/working_documents => working-documents}/load_balancing.md (99%) rename doc/book/{src/working_documents => working-documents}/migration_04.md (98%) rename doc/book/{src/working_documents => 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/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 95% rename from doc/book/src/connect/index.md rename to doc/book/connect/_index.md index 60a3b03b..c6a46aea 100644 --- a/doc/book/src/connect/index.md +++ b/doc/book/connect/_index.md @@ -1,4 +1,10 @@ -# 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. diff --git a/doc/book/src/connect/apps.md b/doc/book/connect/apps.md similarity index 99% rename from doc/book/src/connect/apps.md rename to doc/book/connect/apps.md index 14d69ef8..65b97dfe 100644 --- a/doc/book/src/connect/apps.md +++ b/doc/book/connect/apps.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) diff --git a/doc/book/src/connect/backup.md b/doc/book/connect/backup.md similarity index 95% rename from doc/book/src/connect/backup.md rename to doc/book/connect/backup.md index a0af3833..878660fc 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. diff --git a/doc/book/src/connect/cli-nextcloud-gui.png b/doc/book/connect/cli-nextcloud-gui.png similarity index 100% rename from doc/book/src/connect/cli-nextcloud-gui.png rename to doc/book/connect/cli-nextcloud-gui.png 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 96% rename from doc/book/src/connect/fs.md rename to doc/book/connect/fs.md index be8a3402..60a60c7f 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. diff --git a/doc/book/src/connect/repositories.md b/doc/book/connect/repositories.md similarity index 98% rename from doc/book/src/connect/repositories.md rename to doc/book/connect/repositories.md index 8a3dce14..1b06385c 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. diff --git a/doc/book/src/connect/websites.md b/doc/book/connect/websites.md similarity index 97% rename from doc/book/src/connect/websites.md rename to doc/book/connect/websites.md index 6f66c8d0..1ef50463 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. diff --git a/doc/book/src/cookbook/index.md b/doc/book/cookbook/_index.md similarity index 94% rename from doc/book/src/cookbook/index.md rename to doc/book/cookbook/_index.md index 792a5e6e..72c32687 100644 --- a/doc/book/src/cookbook/index.md +++ b/doc/book/cookbook/_index.md @@ -1,4 +1,9 @@ -# Cookbook ++++ +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! diff --git a/doc/book/src/cookbook/exposing_websites.md b/doc/book/cookbook/exposing_websites.md similarity index 97% rename from doc/book/src/cookbook/exposing_websites.md rename to doc/book/cookbook/exposing_websites.md index 0cbb1150..dcb56d36 100644 --- a/doc/book/src/cookbook/exposing_websites.md +++ b/doc/book/cookbook/exposing_websites.md @@ -1,4 +1,7 @@ -# Exposing buckets as websites ++++ +title = "Exposing buckets as websites" +weight = 25 ++++ You can expose your bucket as a website with this simple command: 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 96% rename from doc/book/src/cookbook/gateways.md rename to doc/book/cookbook/gateways.md index f03671a4..0cec4c53 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. diff --git a/doc/book/src/cookbook/real_world.md b/doc/book/cookbook/real_world.md similarity index 99% rename from doc/book/src/cookbook/real_world.md rename to doc/book/cookbook/real_world.md index 906fe31f..788c80a9 100644 --- a/doc/book/src/cookbook/real_world.md +++ b/doc/book/cookbook/real_world.md @@ -1,4 +1,7 @@ -# 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, diff --git a/doc/book/src/cookbook/recovering.md b/doc/book/cookbook/recovering.md similarity index 98% rename from doc/book/src/cookbook/recovering.md rename to doc/book/cookbook/recovering.md index 279d574c..d826ca6c 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. diff --git a/doc/book/src/cookbook/reverse_proxy.md b/doc/book/cookbook/reverse_proxy.md similarity index 98% rename from doc/book/src/cookbook/reverse_proxy.md rename to doc/book/cookbook/reverse_proxy.md index 14633ae8..55a2e9b1 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. 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 94% rename from doc/book/src/design/index.md rename to doc/book/design/_index.md index 2e3b5fd9..93b7a27c 100644 --- a/doc/book/src/design/index.md +++ b/doc/book/design/_index.md @@ -1,4 +1,9 @@ -# 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 diff --git a/doc/book/src/design/benchmarks.md b/doc/book/design/benchmarks.md similarity index 100% rename from doc/book/src/design/benchmarks.md rename to doc/book/design/benchmarks.md 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/img/endpoint-latency-dc.png b/doc/book/design/img/endpoint-latency-dc.png similarity index 100% rename from doc/book/src/design/img/endpoint-latency-dc.png rename to doc/book/design/img/endpoint-latency-dc.png diff --git a/doc/book/src/design/img/endpoint-latency.png b/doc/book/design/img/endpoint-latency.png similarity index 100% rename from doc/book/src/design/img/endpoint-latency.png rename to doc/book/design/img/endpoint-latency.png diff --git a/doc/book/src/design/internals.md b/doc/book/design/internals.md similarity index 99% rename from doc/book/src/design/internals.md rename to doc/book/design/internals.md index 0b31584c..be531e97 100644 --- a/doc/book/src/design/internals.md +++ b/doc/book/design/internals.md @@ -1,4 +1,7 @@ -# Internals ++++ +title = "Internals" +weight = 20 ++++ ## Overview diff --git a/doc/book/src/design/related_work.md b/doc/book/design/related_work.md similarity index 99% rename from doc/book/src/design/related_work.md rename to doc/book/design/related_work.md index da3f807e..da883c06 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 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 99% rename from doc/book/src/development/release_process.md rename to doc/book/development/release_process.md index e6f9e608..e8d29ad8 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. diff --git a/doc/book/src/development/scripts.md b/doc/book/development/scripts.md similarity index 98% rename from doc/book/src/development/scripts.md rename to doc/book/development/scripts.md index 387cb349..25f2ce0e 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. diff --git a/doc/book/src/quick_start/index.md b/doc/book/quick-start/_index.md similarity index 98% rename from doc/book/src/quick_start/index.md rename to doc/book/quick-start/_index.md index ffb3ebbe..9c3f7315 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 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 99% rename from doc/book/src/reference_manual/configuration.md rename to doc/book/reference-manual/configuration.md index 9f88b232..b9c093aa 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: diff --git a/doc/book/src/reference_manual/layout.md b/doc/book/reference-manual/layout.md similarity index 98% rename from doc/book/src/reference_manual/layout.md rename to doc/book/reference-manual/layout.md index 80c71d60..3f818b62 100644 --- a/doc/book/src/reference_manual/layout.md +++ b/doc/book/reference-manual/layout.md @@ -1,4 +1,7 @@ -# 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 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/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 99% rename from doc/book/src/working_documents/design_draft.md rename to doc/book/working-documents/design_draft.md index 06ed46bd..830496ee 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.** 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.** -- 2.43.4 From bac1a8b99ae1d9d397668a49a0d0379d7dd8dbb0 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Wed, 2 Feb 2022 10:11:48 +0100 Subject: [PATCH 2/7] Move _index.md from website repo --- doc/book/_index.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 doc/book/_index.md 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/" ++++ -- 2.43.4 From 50d8e306035d0611f128fbd7499d63c5093d19df Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Wed, 2 Feb 2022 10:17:10 +0100 Subject: [PATCH 3/7] Add missing front matter --- doc/book/design/benchmarks.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/book/design/benchmarks.md b/doc/book/design/benchmarks.md index 6e5580e5..c47995b4 100644 --- a/doc/book/design/benchmarks.md +++ b/doc/book/design/benchmarks.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). -- 2.43.4 From 961a4cf7b7b7b429d3edfc96dc6a58d58d2d7df5 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Wed, 2 Feb 2022 11:43:28 +0100 Subject: [PATCH 4/7] Change _ to - and fix internal links --- doc/book/connect/_index.md | 12 +++---- .../connect/{ => apps}/cli-nextcloud-gui.png | Bin doc/book/connect/{apps.md => apps/index.md} | 4 +-- doc/book/connect/fs.md | 2 +- doc/book/connect/websites.md | 4 +-- doc/book/cookbook/_index.md | 14 ++++---- ...osing_websites.md => exposing-websites.md} | 8 ++--- .../{from_source.md => from-source.md} | 0 .../cookbook/{real_world.md => real-world.md} | 10 +++--- .../{reverse_proxy.md => reverse-proxy.md} | 2 +- .../endpoint-latency-dc.png | Bin .../{img => benchmarks}/endpoint-latency.png | Bin .../{benchmarks.md => benchmarks/index.md} | 4 +-- doc/book/design/internals.md | 2 +- .../{related_work.md => related-work.md} | 0 ...aneous_notes.md => miscellaneous-notes.md} | 0 ...{release_process.md => release-process.md} | 0 doc/book/development/scripts.md | 6 ++-- doc/book/quick-start/_index.md | 30 ++++++++++-------- doc/book/reference-manual/configuration.md | 4 +-- doc/book/reference-manual/layout.md | 2 +- ...3_compatibility.md => s3-compatibility.md} | 0 ...lity_target.md => compatibility-target.md} | 0 .../{design_draft.md => design-draft.md} | 0 .../{load_balancing.md => load-balancing.md} | 0 .../{migration_04.md => migration-04.md} | 0 .../{migration_06.md => migration-06.md} | 0 27 files changed, 53 insertions(+), 51 deletions(-) rename doc/book/connect/{ => apps}/cli-nextcloud-gui.png (100%) rename doc/book/connect/{apps.md => apps/index.md} (98%) rename doc/book/cookbook/{exposing_websites.md => exposing-websites.md} (78%) rename doc/book/cookbook/{from_source.md => from-source.md} (100%) rename doc/book/cookbook/{real_world.md => real-world.md} (96%) rename doc/book/cookbook/{reverse_proxy.md => reverse-proxy.md} (98%) rename doc/book/design/{img => benchmarks}/endpoint-latency-dc.png (100%) rename doc/book/design/{img => benchmarks}/endpoint-latency.png (100%) rename doc/book/design/{benchmarks.md => benchmarks/index.md} (97%) rename doc/book/design/{related_work.md => related-work.md} (100%) rename doc/book/development/{miscellaneous_notes.md => miscellaneous-notes.md} (100%) rename doc/book/development/{release_process.md => release-process.md} (100%) rename doc/book/reference-manual/{s3_compatibility.md => s3-compatibility.md} (100%) rename doc/book/working-documents/{compatibility_target.md => compatibility-target.md} (100%) rename doc/book/working-documents/{design_draft.md => design-draft.md} (100%) rename doc/book/working-documents/{load_balancing.md => load-balancing.md} (100%) rename doc/book/working-documents/{migration_04.md => migration-04.md} (100%) rename doc/book/working-documents/{migration_06.md => migration-06.md} (100%) diff --git a/doc/book/connect/_index.md b/doc/book/connect/_index.md index c6a46aea..b4868b9f 100644 --- a/doc/book/connect/_index.md +++ b/doc/book/connect/_index.md @@ -10,11 +10,11 @@ Garage implements the Amazon S3 protocol, which makes it compatible with many ex 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 @@ -31,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/connect/cli-nextcloud-gui.png b/doc/book/connect/apps/cli-nextcloud-gui.png similarity index 100% rename from doc/book/connect/cli-nextcloud-gui.png rename to doc/book/connect/apps/cli-nextcloud-gui.png diff --git a/doc/book/connect/apps.md b/doc/book/connect/apps/index.md similarity index 98% rename from doc/book/connect/apps.md rename to doc/book/connect/apps/index.md index 65b97dfe..84f46891 100644 --- a/doc/book/connect/apps.md +++ b/doc/book/connect/apps/index.md @@ -69,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. @@ -256,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/connect/fs.md b/doc/book/connect/fs.md index 60a60c7f..46df593b 100644 --- a/doc/book/connect/fs.md +++ b/doc/book/connect/fs.md @@ -14,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 diff --git a/doc/book/connect/websites.md b/doc/book/connect/websites.md index 1ef50463..3f62c9a6 100644 --- a/doc/book/connect/websites.md +++ b/doc/book/connect/websites.md @@ -53,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 @@ -66,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 index 72c32687..6e279363 100644 --- a/doc/book/cookbook/_index.md +++ b/doc/book/cookbook/_index.md @@ -9,23 +9,23 @@ 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 +- **[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](from_source.md):** This page explains how to build Garage from +- **[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](systemd.md):** This page explains how to run Garage +- **[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](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. +- **[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](exposing_websites.md):** This page explains how to use Garage +- **[Hosting a website](@/documentation/cookbook/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. +- **[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](recovering.md):** Garage's first selling point is resilience +- **[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 similarity index 78% rename from doc/book/cookbook/exposing_websites.md rename to doc/book/cookbook/exposing-websites.md index dcb56d36..cc4ddfa3 100644 --- a/doc/book/cookbook/exposing_websites.md +++ b/doc/book/cookbook/exposing-websites.md @@ -14,11 +14,11 @@ Now it will be **publicly** exposed on the web endpoint (by default listening on 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)) + - The index is defined in your `garage.toml`. ([ref](@/documentation/reference-manual/configuration.md#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)) + - 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): @@ -46,6 +46,6 @@ 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. + - 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](/connect/websites.html) to see how you can add Garage to your workflow. +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/cookbook/from_source.md b/doc/book/cookbook/from-source.md similarity index 100% rename from doc/book/cookbook/from_source.md rename to doc/book/cookbook/from-source.md diff --git a/doc/book/cookbook/real_world.md b/doc/book/cookbook/real-world.md similarity index 96% rename from doc/book/cookbook/real_world.md rename to doc/book/cookbook/real-world.md index 788c80a9..1178ded5 100644 --- a/doc/book/cookbook/real_world.md +++ b/doc/book/cookbook/real-world.md @@ -7,7 +7,7 @@ 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. @@ -26,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. @@ -281,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/cookbook/reverse_proxy.md b/doc/book/cookbook/reverse-proxy.md similarity index 98% rename from doc/book/cookbook/reverse_proxy.md rename to doc/book/cookbook/reverse-proxy.md index 55a2e9b1..63ba4bbe 100644 --- a/doc/book/cookbook/reverse_proxy.md +++ b/doc/book/cookbook/reverse-proxy.md @@ -121,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/design/img/endpoint-latency-dc.png b/doc/book/design/benchmarks/endpoint-latency-dc.png similarity index 100% rename from doc/book/design/img/endpoint-latency-dc.png rename to doc/book/design/benchmarks/endpoint-latency-dc.png diff --git a/doc/book/design/img/endpoint-latency.png b/doc/book/design/benchmarks/endpoint-latency.png similarity index 100% rename from doc/book/design/img/endpoint-latency.png rename to doc/book/design/benchmarks/endpoint-latency.png diff --git a/doc/book/design/benchmarks.md b/doc/book/design/benchmarks/index.md similarity index 97% rename from doc/book/design/benchmarks.md rename to doc/book/design/benchmarks/index.md index c47995b4..c2215a4a 100644 --- a/doc/book/design/benchmarks.md +++ b/doc/book/design/benchmarks/index.md @@ -28,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. @@ -46,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/design/internals.md b/doc/book/design/internals.md index be531e97..05d852e2 100644 --- a/doc/book/design/internals.md +++ b/doc/book/design/internals.md @@ -17,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/design/related_work.md b/doc/book/design/related-work.md similarity index 100% rename from doc/book/design/related_work.md rename to doc/book/design/related-work.md diff --git a/doc/book/development/miscellaneous_notes.md b/doc/book/development/miscellaneous-notes.md similarity index 100% rename from doc/book/development/miscellaneous_notes.md rename to doc/book/development/miscellaneous-notes.md diff --git a/doc/book/development/release_process.md b/doc/book/development/release-process.md similarity index 100% rename from doc/book/development/release_process.md rename to doc/book/development/release-process.md diff --git a/doc/book/development/scripts.md b/doc/book/development/scripts.md index 25f2ce0e..498419e2 100644 --- a/doc/book/development/scripts.md +++ b/doc/book/development/scripts.md @@ -34,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 @@ -44,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 @@ -55,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/quick-start/_index.md b/doc/book/quick-start/_index.md index 9c3f7315..53ef00b4 100644 --- a/doc/book/quick-start/_index.md +++ b/doc/book/quick-start/_index.md @@ -11,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! @@ -28,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. @@ -73,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): @@ -89,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 @@ -152,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. @@ -170,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. @@ -200,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: @@ -229,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, @@ -257,7 +259,7 @@ or `$HOME/.bashrc` file: export MC_REGION=garage ``` -#### Use `mc` +### Use `mc` You can not list buckets from `mc` currently. @@ -271,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: @@ -280,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/reference-manual/configuration.md b/doc/book/reference-manual/configuration.md index b9c093aa..3f553055 100644 --- a/doc/book/reference-manual/configuration.md +++ b/doc/book/reference-manual/configuration.md @@ -60,7 +60,7 @@ Store this folder on a fast SSD drive if possible to maximize Garage's performan 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` @@ -206,7 +206,7 @@ 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. diff --git a/doc/book/reference-manual/layout.md b/doc/book/reference-manual/layout.md index 3f818b62..7debbf33 100644 --- a/doc/book/reference-manual/layout.md +++ b/doc/book/reference-manual/layout.md @@ -7,7 +7,7 @@ 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/reference-manual/s3_compatibility.md b/doc/book/reference-manual/s3-compatibility.md similarity index 100% rename from doc/book/reference-manual/s3_compatibility.md rename to doc/book/reference-manual/s3-compatibility.md diff --git a/doc/book/working-documents/compatibility_target.md b/doc/book/working-documents/compatibility-target.md similarity index 100% rename from doc/book/working-documents/compatibility_target.md rename to doc/book/working-documents/compatibility-target.md diff --git a/doc/book/working-documents/design_draft.md b/doc/book/working-documents/design-draft.md similarity index 100% rename from doc/book/working-documents/design_draft.md rename to doc/book/working-documents/design-draft.md diff --git a/doc/book/working-documents/load_balancing.md b/doc/book/working-documents/load-balancing.md similarity index 100% rename from doc/book/working-documents/load_balancing.md rename to doc/book/working-documents/load-balancing.md diff --git a/doc/book/working-documents/migration_04.md b/doc/book/working-documents/migration-04.md similarity index 100% rename from doc/book/working-documents/migration_04.md rename to doc/book/working-documents/migration-04.md diff --git a/doc/book/working-documents/migration_06.md b/doc/book/working-documents/migration-06.md similarity index 100% rename from doc/book/working-documents/migration_06.md rename to doc/book/working-documents/migration-06.md -- 2.43.4 From 0b08094bf2345f4ac32af98758c07a396970b52e Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Wed, 2 Feb 2022 11:55:47 +0100 Subject: [PATCH 5/7] Fix more links --- doc/book/connect/repositories.md | 4 ++-- doc/book/design/_index.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/book/connect/repositories.md b/doc/book/connect/repositories.md index 1b06385c..eb06e360 100644 --- a/doc/book/connect/repositories.md +++ b/doc/book/connect/repositories.md @@ -92,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/design/_index.md b/doc/book/design/_index.md index 93b7a27c..f3a08aaf 100644 --- a/doc/book/design/_index.md +++ b/doc/book/design/_index.md @@ -10,11 +10,11 @@ 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 -- 2.43.4 From da7d645f525b1b24debfa0f7bd3b5556355cfb05 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Wed, 2 Feb 2022 12:12:21 +0100 Subject: [PATCH 6/7] Fix more links --- doc/book/connect/backup.md | 2 +- doc/book/connect/fs.md | 4 ++-- doc/book/design/related-work.md | 2 +- doc/book/development/release-process.md | 2 +- doc/book/working-documents/design-draft.md | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/book/connect/backup.md b/doc/book/connect/backup.md index 878660fc..9fa72964 100644 --- a/doc/book/connect/backup.md +++ b/doc/book/connect/backup.md @@ -25,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/connect/fs.md b/doc/book/connect/fs.md index 46df593b..6d9a5a68 100644 --- a/doc/book/connect/fs.md +++ b/doc/book/connect/fs.md @@ -56,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/design/related-work.md b/doc/book/design/related-work.md index da883c06..ade298ec 100644 --- a/doc/book/design/related-work.md +++ b/doc/book/design/related-work.md @@ -24,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/development/release-process.md b/doc/book/development/release-process.md index e8d29ad8..eee45e24 100644 --- a/doc/book/development/release-process.md +++ b/doc/book/development/release-process.md @@ -34,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/working-documents/design-draft.md b/doc/book/working-documents/design-draft.md index 830496ee..44849a41 100644 --- a/doc/book/working-documents/design-draft.md +++ b/doc/book/working-documents/design-draft.md @@ -162,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)] -- 2.43.4 From 3885a5ea4702dbfa254fec311cd7f9ecc4a30536 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Wed, 2 Feb 2022 13:06:34 +0100 Subject: [PATCH 7/7] Update some things in documentation --- doc/book/cookbook/exposing-websites.md | 22 +++++++++++-- doc/book/cookbook/gateways.md | 3 -- doc/book/cookbook/recovering.md | 2 +- doc/book/reference-manual/configuration.md | 38 +++++++++++----------- 4 files changed, 40 insertions(+), 25 deletions(-) diff --git a/doc/book/cookbook/exposing-websites.md b/doc/book/cookbook/exposing-websites.md index cc4ddfa3..be462dc9 100644 --- a/doc/book/cookbook/exposing-websites.md +++ b/doc/book/cookbook/exposing-websites.md @@ -3,7 +3,19 @@ title = "Exposing buckets as websites" weight = 25 +++ -You can expose your bucket as a website with this simple command: +## 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 @@ -11,10 +23,16 @@ 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 is defined in your `garage.toml`. ([ref](@/documentation/reference-manual/configuration.md#index)) + - 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: diff --git a/doc/book/cookbook/gateways.md b/doc/book/cookbook/gateways.md index 0cec4c53..62ed0fe2 100644 --- a/doc/book/cookbook/gateways.md +++ b/doc/book/cookbook/gateways.md @@ -15,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/cookbook/recovering.md b/doc/book/cookbook/recovering.md index d826ca6c..2424558c 100644 --- a/doc/book/cookbook/recovering.md +++ b/doc/book/cookbook/recovering.md @@ -94,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/reference-manual/configuration.md b/doc/book/reference-manual/configuration.md index 3f553055..662b00f9 100644 --- a/doc/book/reference-manual/configuration.md +++ b/doc/book/reference-manual/configuration.md @@ -47,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 @@ -55,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](@/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 @@ -74,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: @@ -127,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. @@ -135,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). @@ -144,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: @@ -167,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, @@ -177,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. @@ -185,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 @@ -193,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` {#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. @@ -216,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. @@ -235,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`). -- 2.43.4