Fix doc links & added noJS support for the doc
|
@ -9,10 +9,10 @@ ignored_content = []
|
||||||
generate_feed = true
|
generate_feed = true
|
||||||
feed_filename = "rss.xml"
|
feed_filename = "rss.xml"
|
||||||
hard_link_static = false
|
hard_link_static = false
|
||||||
taxonomies = [
|
# taxonomies = [
|
||||||
{ name = "categories", feed = true, paginate_by = 10 },
|
# { name = "categories", feed = true, paginate_by = 10 },
|
||||||
{ name = "tags", feed = true, paginate_by = 10 }
|
# { name = "tags", feed = true, paginate_by = 10 }
|
||||||
]
|
# ]
|
||||||
build_search_index = true
|
build_search_index = true
|
||||||
|
|
||||||
[markdown]
|
[markdown]
|
||||||
|
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 129 KiB |
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 124 KiB |
|
@ -1,10 +1,6 @@
|
||||||
+++
|
+++
|
||||||
title="Zeroth Post"
|
title="Zeroth Post"
|
||||||
date=2018-08-20
|
date=2018-08-20
|
||||||
|
|
||||||
[taxonomies]
|
|
||||||
categories = ["Sample Post"]
|
|
||||||
tags = ["post", "lorem"]
|
|
||||||
+++
|
+++
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,99 +8,231 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac iaculis libero
|
||||||
|
|
||||||
<!-- more -->
|
<!-- more -->
|
||||||
|
|
||||||
Nulla facilisi. Aenean urna metus, egestas quis mauris non, dignissim vestibulum risus. Mauris posuere nisl a massa commodo rhoncus. Fusce sed euismod dui, eget aliquet sem. Aenean quam est, iaculis quis aliquet at, semper id tellus. Suspendisse fringilla ipsum diam, suscipit commodo neque varius ac. Maecenas commodo orci vitae massa dapibus, interdum ultricies ex scelerisque. Nullam volutpat mollis aliquam. Donec fringilla interdum urna, nec posuere est tincidunt a.
|
---
|
||||||
|
__Advertisement :)__
|
||||||
|
|
||||||
# A Really Clever Title
|
- __[pica](https://nodeca.github.io/pica/demo/)__ - high quality and fast image
|
||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac iaculis libero. Suspendisse et sodales tellus, ut sodales mi. Proin scelerisque est nec laoreet aliquet. Aenean et nunc at mi efficitur sollicitudin at quis diam. Aenean mi massa, sollicitudin eu condimentum sed, sodales ut nisi. Aenean iaculis ante id gravida hendrerit. Nulla nisi neque, facilisis vitae viverra ac, interdum malesuada quam. Quisque laoreet leo nec lectus lacinia, in lacinia enim tempor.
|
resize in browser.
|
||||||
|
- __[babelfish](https://github.com/nodeca/babelfish/)__ - developer friendly
|
||||||
|
i18n with plurals support and easy syntax.
|
||||||
|
|
||||||
Nulla facilisi. Aenean urna metus, egestas quis mauris non, dignissim vestibulum risus. Mauris posuere nisl a massa commodo rhoncus. Fusce sed euismod dui, eget aliquet sem. Aenean quam est, iaculis quis aliquet at, semper id tellus. Suspendisse fringilla ipsum diam, suscipit commodo neque varius ac. Maecenas commodo orci vitae massa dapibus, interdum ultricies ex scelerisque. Nullam volutpat mollis aliquam. Donec fringilla interdum urna, nec posuere est tincidunt a.
|
You will like those projects!
|
||||||
|
|
||||||
## A Really Clever Subtitle
|
---
|
||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac iaculis libero. Suspendisse et sodales tellus, ut sodales mi. Proin scelerisque est nec laoreet aliquet. Aenean et nunc at mi efficitur sollicitudin at quis diam. Aenean mi massa, sollicitudin eu condimentum sed, sodales ut nisi. Aenean iaculis ante id gravida hendrerit. Nulla nisi neque, facilisis vitae viverra ac, interdum malesuada quam. Quisque laoreet leo nec lectus lacinia, in lacinia enim tempor.
|
|
||||||
|
|
||||||
Nulla facilisi. Aenean urna metus, egestas quis mauris non, dignissim vestibulum risus. Mauris posuere nisl a massa commodo rhoncus. Fusce sed euismod dui, eget aliquet sem. Aenean quam est, iaculis quis aliquet at, semper id tellus. Suspendisse fringilla ipsum diam, suscipit commodo neque varius ac. Maecenas commodo orci vitae massa dapibus, interdum ultricies ex scelerisque. Nullam volutpat mollis aliquam. Donec fringilla interdum urna, nec posuere est tincidunt a.
|
# h1 Heading
|
||||||
|
Nulla nisi neque, facilisis vitae viverra ac, interdum malesuada quam. Quisque laoreet leo nec lectus lacinia, in lacinia enim tempor.
|
||||||
Morbi molestie aliquam congue. Sed pulvinar id lectus eget luctus. Fusce non augue efficitur, posuere dolor et, gravida enim. In ullamcorper lorem turpis, in finibus eros posuere id. Maecenas vulputate dapibus risus vel tempor. In pulvinar commodo dui eu mattis. Duis fringilla dictum elit, et dictum nisi sollicitudin non. Vestibulum fermentum ligula id augue ullamcorper, a bibendum neque ultrices.
|
## h2 Heading
|
||||||
|
Nulla nisi neque, facilisis vitae viverra ac, interdum malesuada quam. Quisque laoreet leo nec lectus lacinia, in lacinia enim tempor.
|
||||||
Vivamus at volutpat dolor, vitae interdum nulla. Morbi vitae sagittis mi, a pulvinar ex. Fusce convallis diam quis turpis tristique, sodales euismod nunc ullamcorper. Aenean id nulla et leo sodales aliquam. Donec a felis vel ipsum fringilla volutpat. Praesent luctus nisl sit amet est interdum elementum. Etiam tincidunt malesuada sapien, quis tincidunt urna faucibus sed. Aliquam iaculis ex at felis sodales iaculis. Sed quis mauris finibus, consequat risus rutrum, ornare libero. Maecenas ultrices mollis nibh in interdum. Cras molestie quis velit quis dictum. Cras vehicula neque id turpis facilisis fringilla. Quisque sit amet tincidunt lectus, vel feugiat diam. Nullam euismod lacinia mi non facilisis.
|
### h3 Heading
|
||||||
|
Nulla nisi neque, facilisis vitae viverra ac, interdum malesuada quam. Quisque laoreet leo nec lectus lacinia, in lacinia enim tempor.
|
||||||
Sed tempus odio vel tellus tempor laoreet. Sed finibus nulla quis velit molestie dictum. Donec efficitur sollicitudin enim in vestibulum. Etiam porta urna ut nisl scelerisque sagittis. Quisque turpis neque, vulputate nec dui ornare, dignissim aliquet mi. Proin vel scelerisque tellus. Nunc laoreet rutrum luctus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam quis diam tellus.
|
#### h4 Heading
|
||||||
|
Nulla nisi neque, facilisis vitae viverra ac, interdum malesuada quam. Quisque laoreet leo nec lectus lacinia, in lacinia enim tempor.
|
||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac iaculis libero. Suspendisse et sodales tellus, ut sodales mi. Proin scelerisque est nec laoreet aliquet. Aenean et nunc at mi efficitur sollicitudin at quis diam. Aenean mi massa, sollicitudin eu condimentum sed, sodales ut nisi. Aenean iaculis ante id gravida hendrerit. Nulla nisi neque, facilisis vitae viverra ac, interdum malesuada quam. Quisque laoreet leo nec lectus lacinia, in lacinia enim tempor.
|
##### h5 Heading
|
||||||
|
Nulla nisi neque, facilisis vitae viverra ac, interdum malesuada quam. Quisque laoreet leo nec lectus lacinia, in lacinia enim tempor.
|
||||||
Nulla facilisi. Aenean urna metus, egestas quis mauris non, dignissim vestibulum risus. Mauris posuere nisl a massa commodo rhoncus. Fusce sed euismod dui, eget aliquet sem. Aenean quam est, iaculis quis aliquet at, semper id tellus. Suspendisse fringilla ipsum diam, suscipit commodo neque varius ac. Maecenas commodo orci vitae massa dapibus, interdum ultricies ex scelerisque. Nullam volutpat mollis aliquam. Donec fringilla interdum urna, nec posuere est tincidunt a.
|
###### h6 Heading
|
||||||
|
Nulla nisi neque, facilisis vitae viverra ac, interdum malesuada quam. Quisque laoreet leo nec lectus lacinia, in lacinia enim tempor.
|
||||||
Morbi molestie aliquam congue. Sed pulvinar id lectus eget luctus. Fusce non augue efficitur, posuere dolor et, gravida enim. In ullamcorper lorem turpis, in finibus eros posuere id. Maecenas vulputate dapibus risus vel tempor. In pulvinar commodo dui eu mattis. Duis fringilla dictum elit, et dictum nisi sollicitudin non. Vestibulum fermentum ligula id augue ullamcorper, a bibendum neque ultrices.
|
|
||||||
|
|
||||||
Vivamus at volutpat dolor, vitae interdum nulla. Morbi vitae sagittis mi, a pulvinar ex. Fusce convallis diam quis turpis tristique, sodales euismod nunc ullamcorper. Aenean id nulla et leo sodales aliquam. Donec a felis vel ipsum fringilla volutpat. Praesent luctus nisl sit amet est interdum elementum. Etiam tincidunt malesuada sapien, quis tincidunt urna faucibus sed. Aliquam iaculis ex at felis sodales iaculis. Sed quis mauris finibus, consequat risus rutrum, ornare libero. Maecenas ultrices mollis nibh in interdum. Cras molestie quis velit quis dictum. Cras vehicula neque id turpis facilisis fringilla. Quisque sit amet tincidunt lectus, vel feugiat diam. Nullam euismod lacinia mi non facilisis.
|
|
||||||
|
|
||||||
Sed tempus odio vel tellus tempor laoreet. Sed finibus nulla quis velit molestie dictum. Donec efficitur sollicitudin enim in vestibulum. Etiam porta urna ut nisl scelerisque sagittis. Quisque turpis neque, vulputate nec dui ornare, dignissim aliquet mi. Proin vel scelerisque tellus. Nunc laoreet rutrum luctus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam quis diam tellus.
|
|
||||||
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac iaculis libero. Suspendisse et sodales tellus, ut sodales mi. Proin scelerisque est nec laoreet aliquet. Aenean et nunc at mi efficitur sollicitudin at quis diam. Aenean mi massa, sollicitudin eu condimentum sed, sodales ut nisi. Aenean iaculis ante id gravida hendrerit. Nulla nisi neque, facilisis vitae viverra ac, interdum malesuada quam. Quisque laoreet leo nec lectus lacinia, in lacinia enim tempor.
|
|
||||||
|
|
||||||
Nulla facilisi. Aenean urna metus, egestas quis mauris non, dignissim vestibulum risus. Mauris posuere nisl a massa commodo rhoncus. Fusce sed euismod dui, eget aliquet sem. Aenean quam est, iaculis quis aliquet at, semper id tellus. Suspendisse fringilla ipsum diam, suscipit commodo neque varius ac. Maecenas commodo orci vitae massa dapibus, interdum ultricies ex scelerisque. Nullam volutpat mollis aliquam. Donec fringilla interdum urna, nec posuere est tincidunt a.
|
|
||||||
|
|
||||||
Morbi molestie aliquam congue. Sed pulvinar id lectus eget luctus. Fusce non augue efficitur, posuere dolor et, gravida enim. In ullamcorper lorem turpis, in finibus eros posuere id. Maecenas vulputate dapibus risus vel tempor. In pulvinar commodo dui eu mattis. Duis fringilla dictum elit, et dictum nisi sollicitudin non. Vestibulum fermentum ligula id augue ullamcorper, a bibendum neque ultrices.
|
|
||||||
|
|
||||||
Vivamus at volutpat dolor, vitae interdum nulla. Morbi vitae sagittis mi, a pulvinar ex. Fusce convallis diam quis turpis tristique, sodales euismod nunc ullamcorper. Aenean id nulla et leo sodales aliquam. Donec a felis vel ipsum fringilla volutpat. Praesent luctus nisl sit amet est interdum elementum. Etiam tincidunt malesuada sapien, quis tincidunt urna faucibus sed. Aliquam iaculis ex at felis sodales iaculis. Sed quis mauris finibus, consequat risus rutrum, ornare libero. Maecenas ultrices mollis nibh in interdum. Cras molestie quis velit quis dictum. Cras vehicula neque id turpis facilisis fringilla. Quisque sit amet tincidunt lectus, vel feugiat diam. Nullam euismod lacinia mi non facilisis.
|
|
||||||
|
|
||||||
Sed tempus odio vel tellus tempor laoreet. Sed finibus nulla quis velit molestie dictum. Donec efficitur sollicitudin enim in vestibulum. Etiam porta urna ut nisl scelerisque sagittis. Quisque turpis neque, vulputate nec dui ornare, dignissim aliquet mi. Proin vel scelerisque tellus. Nunc laoreet rutrum luctus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam quis diam tellus.
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac iaculis libero. Suspendisse et sodales tellus, ut sodales mi. Proin scelerisque est nec laoreet aliquet. Aenean et nunc at mi efficitur sollicitudin at quis diam. Aenean mi massa, sollicitudin eu condimentum sed, sodales ut nisi. Aenean iaculis ante id gravida hendrerit. Nulla nisi neque, facilisis vitae viverra ac, interdum malesuada quam. Quisque laoreet leo nec lectus lacinia, in lacinia enim tempor.
|
|
||||||
|
|
||||||
Nulla facilisi. Aenean urna metus, egestas quis mauris non, dignissim vestibulum risus. Mauris posuere nisl a massa commodo rhoncus. Fusce sed euismod dui, eget aliquet sem. Aenean quam est, iaculis quis aliquet at, semper id tellus. Suspendisse fringilla ipsum diam, suscipit commodo neque varius ac. Maecenas commodo orci vitae massa dapibus, interdum ultricies ex scelerisque. Nullam volutpat mollis aliquam. Donec fringilla interdum urna, nec posuere est tincidunt a.
|
|
||||||
|
|
||||||
Morbi molestie aliquam congue. Sed pulvinar id lectus eget luctus. Fusce non augue efficitur, posuere dolor et, gravida enim. In ullamcorper lorem turpis, in finibus eros posuere id. Maecenas vulputate dapibus risus vel tempor. In pulvinar commodo dui eu mattis. Duis fringilla dictum elit, et dictum nisi sollicitudin non. Vestibulum fermentum ligula id augue ullamcorper, a bibendum neque ultrices.
|
|
||||||
|
|
||||||
Vivamus at volutpat dolor, vitae interdum nulla. Morbi vitae sagittis mi, a pulvinar ex. Fusce convallis diam quis turpis tristique, sodales euismod nunc ullamcorper. Aenean id nulla et leo sodales aliquam. Donec a felis vel ipsum fringilla volutpat. Praesent luctus nisl sit amet est interdum elementum. Etiam tincidunt malesuada sapien, quis tincidunt urna faucibus sed. Aliquam iaculis ex at felis sodales iaculis. Sed quis mauris finibus, consequat risus rutrum, ornare libero. Maecenas ultrices mollis nibh in interdum. Cras molestie quis velit quis dictum. Cras vehicula neque id turpis facilisis fringilla. Quisque sit amet tincidunt lectus, vel feugiat diam. Nullam euismod lacinia mi non facilisis.
|
|
||||||
|
|
||||||
Sed tempus odio vel tellus tempor laoreet. Sed finibus nulla quis velit molestie dictum. Donec efficitur sollicitudin enim in vestibulum. Etiam porta urna ut nisl scelerisque sagittis. Quisque turpis neque, vulputate nec dui ornare, dignissim aliquet mi. Proin vel scelerisque tellus. Nunc laoreet rutrum luctus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam quis diam tellus.
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac iaculis libero. Suspendisse et sodales tellus, ut sodales mi. Proin scelerisque est nec laoreet aliquet. Aenean et nunc at mi efficitur sollicitudin at quis diam. Aenean mi massa, sollicitudin eu condimentum sed, sodales ut nisi. Aenean iaculis ante id gravida hendrerit. Nulla nisi neque, facilisis vitae viverra ac, interdum malesuada quam. Quisque laoreet leo nec lectus lacinia, in lacinia enim tempor.
|
|
||||||
|
|
||||||
Nulla facilisi. Aenean urna metus, egestas quis mauris non, dignissim vestibulum risus. Mauris posuere nisl a massa commodo rhoncus. Fusce sed euismod dui, eget aliquet sem. Aenean quam est, iaculis quis aliquet at, semper id tellus. Suspendisse fringilla ipsum diam, suscipit commodo neque varius ac. Maecenas commodo orci vitae massa dapibus, interdum ultricies ex scelerisque. Nullam volutpat mollis aliquam. Donec fringilla interdum urna, nec posuere est tincidunt a.
|
|
||||||
|
|
||||||
Morbi molestie aliquam congue. Sed pulvinar id lectus eget luctus. Fusce non augue efficitur, posuere dolor et, gravida enim. In ullamcorper lorem turpis, in finibus eros posuere id. Maecenas vulputate dapibus risus vel tempor. In pulvinar commodo dui eu mattis. Duis fringilla dictum elit, et dictum nisi sollicitudin non. Vestibulum fermentum ligula id augue ullamcorper, a bibendum neque ultrices.
|
|
||||||
|
|
||||||
Vivamus at volutpat dolor, vitae interdum nulla. Morbi vitae sagittis mi, a pulvinar ex. Fusce convallis diam quis turpis tristique, sodales euismod nunc ullamcorper. Aenean id nulla et leo sodales aliquam. Donec a felis vel ipsum fringilla volutpat. Praesent luctus nisl sit amet est interdum elementum. Etiam tincidunt malesuada sapien, quis tincidunt urna faucibus sed. Aliquam iaculis ex at felis sodales iaculis. Sed quis mauris finibus, consequat risus rutrum, ornare libero. Maecenas ultrices mollis nibh in interdum. Cras molestie quis velit quis dictum. Cras vehicula neque id turpis facilisis fringilla. Quisque sit amet tincidunt lectus, vel feugiat diam. Nullam euismod lacinia mi non facilisis.
|
|
||||||
|
|
||||||
Sed tempus odio vel tellus tempor laoreet. Sed finibus nulla quis velit molestie dictum. Donec efficitur sollicitudin enim in vestibulum. Etiam porta urna ut nisl scelerisque sagittis. Quisque turpis neque, vulputate nec dui ornare, dignissim aliquet mi. Proin vel scelerisque tellus. Nunc laoreet rutrum luctus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam quis diam tellus.
|
|
||||||
|
|
||||||
|
|
||||||
Vivamus at volutpat dolor, vitae interdum nulla. Morbi vitae sagittis mi, a pulvinar ex. Fusce convallis diam quis turpis tristique, sodales euismod nunc ullamcorper. Aenean id nulla et leo sodales aliquam. Donec a felis vel ipsum fringilla volutpat. Praesent luctus nisl sit amet est interdum elementum. Etiam tincidunt malesuada sapien, quis tincidunt urna faucibus sed. Aliquam iaculis ex at felis sodales iaculis. Sed quis mauris finibus, consequat risus rutrum, ornare libero. Maecenas ultrices mollis nibh in interdum. Cras molestie quis velit quis dictum. Cras vehicula neque id turpis facilisis fringilla. Quisque sit amet tincidunt lectus, vel feugiat diam. Nullam euismod lacinia mi non facilisis.
|
## Horizontal Rules
|
||||||
|
|
||||||
Sed tempus odio vel tellus tempor laoreet. Sed finibus nulla quis velit molestie dictum. Donec efficitur sollicitudin enim in vestibulum. Etiam porta urna ut nisl scelerisque sagittis. Quisque turpis neque, vulputate nec dui ornare, dignissim aliquet mi. Proin vel scelerisque tellus. Nunc laoreet rutrum luctus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam quis diam tellus.
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac iaculis libero. Suspendisse et sodales tellus, ut sodales mi. Proin scelerisque est nec laoreet aliquet. Aenean et nunc at mi efficitur sollicitudin at quis diam. Aenean mi massa, sollicitudin eu condimentum sed, sodales ut nisi. Aenean iaculis ante id gravida hendrerit. Nulla nisi neque, facilisis vitae viverra ac, interdum malesuada quam. Quisque laoreet leo nec lectus lacinia, in lacinia enim tempor.
|
|
||||||
|
|
||||||
Nulla facilisi. Aenean urna metus, egestas quis mauris non, dignissim vestibulum risus. Mauris posuere nisl a massa commodo rhoncus. Fusce sed euismod dui, eget aliquet sem. Aenean quam est, iaculis quis aliquet at, semper id tellus. Suspendisse fringilla ipsum diam, suscipit commodo neque varius ac. Maecenas commodo orci vitae massa dapibus, interdum ultricies ex scelerisque. Nullam volutpat mollis aliquam. Donec fringilla interdum urna, nec posuere est tincidunt a.
|
|
||||||
|
|
||||||
Morbi molestie aliquam congue. Sed pulvinar id lectus eget luctus. Fusce non augue efficitur, posuere dolor et, gravida enim. In ullamcorper lorem turpis, in finibus eros posuere id. Maecenas vulputate dapibus risus vel tempor. In pulvinar commodo dui eu mattis. Duis fringilla dictum elit, et dictum nisi sollicitudin non. Vestibulum fermentum ligula id augue ullamcorper, a bibendum neque ultrices.
|
|
||||||
|
|
||||||
Vivamus at volutpat dolor, vitae interdum nulla. Morbi vitae sagittis mi, a pulvinar ex. Fusce convallis diam quis turpis tristique, sodales euismod nunc ullamcorper. Aenean id nulla et leo sodales aliquam. Donec a felis vel ipsum fringilla volutpat. Praesent luctus nisl sit amet est interdum elementum. Etiam tincidunt malesuada sapien, quis tincidunt urna faucibus sed. Aliquam iaculis ex at felis sodales iaculis. Sed quis mauris finibus, consequat risus rutrum, ornare libero. Maecenas ultrices mollis nibh in interdum. Cras molestie quis velit quis dictum. Cras vehicula neque id turpis facilisis fringilla. Quisque sit amet tincidunt lectus, vel feugiat diam. Nullam euismod lacinia mi non facilisis.
|
|
||||||
|
|
||||||
Sed tempus odio vel tellus tempor laoreet. Sed finibus nulla quis velit molestie dictum. Donec efficitur sollicitudin enim in vestibulum. Etiam porta urna ut nisl scelerisque sagittis. Quisque turpis neque, vulputate nec dui ornare, dignissim aliquet mi. Proin vel scelerisque tellus. Nunc laoreet rutrum luctus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam quis diam tellus.
|
|
||||||
|
|
||||||
Vivamus at volutpat dolor, vitae interdum nulla. Morbi vitae sagittis mi, a pulvinar ex. Fusce convallis diam quis turpis tristique, sodales euismod nunc ullamcorper. Aenean id nulla et leo sodales aliquam. Donec a felis vel ipsum fringilla volutpat. Praesent luctus nisl sit amet est interdum elementum. Etiam tincidunt malesuada sapien, quis tincidunt urna faucibus sed. Aliquam iaculis ex at felis sodales iaculis. Sed quis mauris finibus, consequat risus rutrum, ornare libero. Maecenas ultrices mollis nibh in interdum. Cras molestie quis velit quis dictum. Cras vehicula neque id turpis facilisis fringilla. Quisque sit amet tincidunt lectus, vel feugiat diam. Nullam euismod lacinia mi non facilisis.
|
|
||||||
|
|
||||||
Sed tempus odio vel tellus tempor laoreet. Sed finibus nulla quis velit molestie dictum. Donec efficitur sollicitudin enim in vestibulum. Etiam porta urna ut nisl scelerisque sagittis. Quisque turpis neque, vulputate nec dui ornare, dignissim aliquet mi. Proin vel scelerisque tellus. Nunc laoreet rutrum luctus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam quis diam tellus.
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac iaculis libero. Suspendisse et sodales tellus, ut sodales mi. Proin scelerisque est nec laoreet aliquet. Aenean et nunc at mi efficitur sollicitudin at quis diam. Aenean mi massa, sollicitudin eu condimentum sed, sodales ut nisi. Aenean iaculis ante id gravida hendrerit. Nulla nisi neque, facilisis vitae viverra ac, interdum malesuada quam. Quisque laoreet leo nec lectus lacinia, in lacinia enim tempor.
|
|
||||||
|
|
||||||
Nulla facilisi. Aenean urna metus, egestas quis mauris non, dignissim vestibulum risus. Mauris posuere nisl a massa commodo rhoncus. Fusce sed euismod dui, eget aliquet sem. Aenean quam est, iaculis quis aliquet at, semper id tellus. Suspendisse fringilla ipsum diam, suscipit commodo neque varius ac. Maecenas commodo orci vitae massa dapibus, interdum ultricies ex scelerisque. Nullam volutpat mollis aliquam. Donec fringilla interdum urna, nec posuere est tincidunt a.
|
|
||||||
|
|
||||||
Morbi molestie aliquam congue. Sed pulvinar id lectus eget luctus. Fusce non augue efficitur, posuere dolor et, gravida enim. In ullamcorper lorem turpis, in finibus eros posuere id. Maecenas vulputate dapibus risus vel tempor. In pulvinar commodo dui eu mattis. Duis fringilla dictum elit, et dictum nisi sollicitudin non. Vestibulum fermentum ligula id augue ullamcorper, a bibendum neque ultrices.
|
|
||||||
|
|
||||||
Vivamus at volutpat dolor, vitae interdum nulla. Morbi vitae sagittis mi, a pulvinar ex. Fusce convallis diam quis turpis tristique, sodales euismod nunc ullamcorper. Aenean id nulla et leo sodales aliquam. Donec a felis vel ipsum fringilla volutpat. Praesent luctus nisl sit amet est interdum elementum. Etiam tincidunt malesuada sapien, quis tincidunt urna faucibus sed. Aliquam iaculis ex at felis sodales iaculis. Sed quis mauris finibus, consequat risus rutrum, ornare libero. Maecenas ultrices mollis nibh in interdum. Cras molestie quis velit quis dictum. Cras vehicula neque id turpis facilisis fringilla. Quisque sit amet tincidunt lectus, vel feugiat diam. Nullam euismod lacinia mi non facilisis.
|
|
||||||
|
|
||||||
Sed tempus odio vel tellus tempor laoreet. Sed finibus nulla quis velit molestie dictum. Donec efficitur sollicitudin enim in vestibulum. Etiam porta urna ut nisl scelerisque sagittis. Quisque turpis neque, vulputate nec dui ornare, dignissim aliquet mi. Proin vel scelerisque tellus. Nunc laoreet rutrum luctus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam quis diam tellus.
|
|
||||||
|
|
||||||
|
|
||||||
Vivamus at volutpat dolor, vitae interdum nulla. Morbi vitae sagittis mi, a pulvinar ex. Fusce convallis diam quis turpis tristique, sodales euismod nunc ullamcorper. Aenean id nulla et leo sodales aliquam. Donec a felis vel ipsum fringilla volutpat. Praesent luctus nisl sit amet est interdum elementum. Etiam tincidunt malesuada sapien, quis tincidunt urna faucibus sed. Aliquam iaculis ex at felis sodales iaculis. Sed quis mauris finibus, consequat risus rutrum, ornare libero. Maecenas ultrices mollis nibh in interdum. Cras molestie quis velit quis dictum. Cras vehicula neque id turpis facilisis fringilla. Quisque sit amet tincidunt lectus, vel feugiat diam. Nullam euismod lacinia mi non facilisis.
|
|
||||||
|
|
||||||
Sed tempus odio vel tellus tempor laoreet. Sed finibus nulla quis velit molestie dictum. Donec efficitur sollicitudin enim in vestibulum. Etiam porta urna ut nisl scelerisque sagittis. Quisque turpis neque, vulputate nec dui ornare, dignissim aliquet mi. Proin vel scelerisque tellus. Nunc laoreet rutrum luctus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam quis diam tellus.
|
## Typographic replacements
|
||||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac iaculis libero. Suspendisse et sodales tellus, ut sodales mi. Proin scelerisque est nec laoreet aliquet. Aenean et nunc at mi efficitur sollicitudin at quis diam. Aenean mi massa, sollicitudin eu condimentum sed, sodales ut nisi. Aenean iaculis ante id gravida hendrerit. Nulla nisi neque, facilisis vitae viverra ac, interdum malesuada quam. Quisque laoreet leo nec lectus lacinia, in lacinia enim tempor.
|
|
||||||
|
|
||||||
Nulla facilisi. Aenean urna metus, egestas quis mauris non, dignissim vestibulum risus. Mauris posuere nisl a massa commodo rhoncus. Fusce sed euismod dui, eget aliquet sem. Aenean quam est, iaculis quis aliquet at, semper id tellus. Suspendisse fringilla ipsum diam, suscipit commodo neque varius ac. Maecenas commodo orci vitae massa dapibus, interdum ultricies ex scelerisque. Nullam volutpat mollis aliquam. Donec fringilla interdum urna, nec posuere est tincidunt a.
|
Enable typographer option to see result.
|
||||||
|
|
||||||
Morbi molestie aliquam congue. Sed pulvinar id lectus eget luctus. Fusce non augue efficitur, posuere dolor et, gravida enim. In ullamcorper lorem turpis, in finibus eros posuere id. Maecenas vulputate dapibus risus vel tempor. In pulvinar commodo dui eu mattis. Duis fringilla dictum elit, et dictum nisi sollicitudin non. Vestibulum fermentum ligula id augue ullamcorper, a bibendum neque ultrices.
|
(c) (C) (r) (R) (tm) (TM) (p) (P) +-
|
||||||
|
|
||||||
Vivamus at volutpat dolor, vitae interdum nulla. Morbi vitae sagittis mi, a pulvinar ex. Fusce convallis diam quis turpis tristique, sodales euismod nunc ullamcorper. Aenean id nulla et leo sodales aliquam. Donec a felis vel ipsum fringilla volutpat. Praesent luctus nisl sit amet est interdum elementum. Etiam tincidunt malesuada sapien, quis tincidunt urna faucibus sed. Aliquam iaculis ex at felis sodales iaculis. Sed quis mauris finibus, consequat risus rutrum, ornare libero. Maecenas ultrices mollis nibh in interdum. Cras molestie quis velit quis dictum. Cras vehicula neque id turpis facilisis fringilla. Quisque sit amet tincidunt lectus, vel feugiat diam. Nullam euismod lacinia mi non facilisis.
|
test.. test... test..... test?..... test!....
|
||||||
|
|
||||||
Sed tempus odio vel tellus tempor laoreet. Sed finibus nulla quis velit molestie dictum. Donec efficitur sollicitudin enim in vestibulum. Etiam porta urna ut nisl scelerisque sagittis. Quisque turpis neque, vulputate nec dui ornare, dignissim aliquet mi. Proin vel scelerisque tellus. Nunc laoreet rutrum luctus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam quis diam tellus.
|
!!!!!! ???? ,, -- ---
|
||||||
|
|
||||||
|
"Smartypants, double quotes" and 'single quotes'
|
||||||
|
|
||||||
|
|
||||||
|
## Emphasis
|
||||||
|
|
||||||
|
**This is bold text**
|
||||||
|
|
||||||
|
__This is bold text__
|
||||||
|
|
||||||
|
*This is italic text*
|
||||||
|
|
||||||
|
_This is italic text_
|
||||||
|
|
||||||
|
~~Strikethrough~~
|
||||||
|
|
||||||
|
|
||||||
|
## Blockquotes
|
||||||
|
|
||||||
|
|
||||||
|
> I
|
||||||
|
>> Fart
|
||||||
|
>>> On
|
||||||
|
>>>> People
|
||||||
|
|
||||||
|
|
||||||
|
## Lists
|
||||||
|
|
||||||
|
Unordered
|
||||||
|
|
||||||
|
+ Create a list by starting a line with `+`, `-`, or `*`
|
||||||
|
+ Sub-lists are made by indenting 2 spaces:
|
||||||
|
- Marker character change forces new list start:
|
||||||
|
* Ac tristique libero volutpat at
|
||||||
|
+ Facilisis in pretium nisl aliquet
|
||||||
|
- Nulla volutpat aliquam velit
|
||||||
|
+ Very easy!
|
||||||
|
|
||||||
|
|
||||||
|
1. You can use sequential numbers...
|
||||||
|
1. ...or keep all the numbers as `1.`
|
||||||
|
|
||||||
|
Start numbering with offset:
|
||||||
|
|
||||||
|
57. foo
|
||||||
|
1. bar
|
||||||
|
|
||||||
|
|
||||||
|
## Code
|
||||||
|
|
||||||
|
Inline `code`
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
Block code "fences"
|
||||||
|
```
|
||||||
|
Sample text here...
|
||||||
|
```
|
||||||
|
---
|
||||||
|
Syntax highlighting
|
||||||
|
|
||||||
|
``` js
|
||||||
|
var foo = function (bar) {
|
||||||
|
return bar++;
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log(foo(5));
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tables
|
||||||
|
|
||||||
|
| Option | Description |
|
||||||
|
| ------ | ----------- |
|
||||||
|
| data | path to data files to supply the data that will be passed into templates. |
|
||||||
|
| engine | engine to be used for processing templates. Handlebars is the default. |
|
||||||
|
| ext | extension to be used for dest files. |
|
||||||
|
|
||||||
|
## Links
|
||||||
|
|
||||||
|
[link text](http://dev.nodeca.com)
|
||||||
|
|
||||||
|
[link with title](http://nodeca.github.io/pica/demo/ "title text!")
|
||||||
|
|
||||||
|
## Images
|
||||||
|
|
||||||
|
![Minion](https://octodex.github.com/images/minion.png)
|
||||||
|
![Stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat")
|
||||||
|
|
||||||
|
Like links, Images also have a footnote style syntax
|
||||||
|
|
||||||
|
![Alt text][id]
|
||||||
|
|
||||||
|
With a reference later in the document defining the URL location:
|
||||||
|
|
||||||
|
[id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat"
|
||||||
|
|
||||||
|
|
||||||
|
## Plugins
|
||||||
|
|
||||||
|
The killer feature of `markdown-it` is very effective support of
|
||||||
|
[syntax plugins](https://www.npmjs.org/browse/keyword/markdown-it-plugin).
|
||||||
|
|
||||||
|
|
||||||
|
### [Emojies](https://github.com/markdown-it/markdown-it-emoji)
|
||||||
|
|
||||||
|
> Classic markup: :wink: :cry: :laughing: :yum:
|
||||||
|
|
||||||
|
|
||||||
|
### [Subscript](https://github.com/markdown-it/markdown-it-sub) / [Superscript](https://github.com/markdown-it/markdown-it-sup)
|
||||||
|
|
||||||
|
$$\begin{array}{c}
|
||||||
|
|
||||||
|
\nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} &
|
||||||
|
= \frac{4\pi}{c}\vec{\mathbf{j}} \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\
|
||||||
|
|
||||||
|
\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\
|
||||||
|
|
||||||
|
\nabla \cdot \vec{\mathbf{B}} & = 0
|
||||||
|
|
||||||
|
\end{array}$$
|
||||||
|
|
||||||
|
|
||||||
|
### [\<ins>](https://github.com/markdown-it/markdown-it-ins)
|
||||||
|
|
||||||
|
++Inserted text++
|
||||||
|
|
||||||
|
|
||||||
|
### [\<mark>](https://github.com/markdown-it/markdown-it-mark)
|
||||||
|
|
||||||
|
==Marked text==
|
||||||
|
|
||||||
|
|
||||||
|
### [Footnotes](https://github.com/markdown-it/markdown-it-footnote)
|
||||||
|
|
||||||
|
Footnote 1 link[^first].
|
||||||
|
|
||||||
|
Footnote 2 link[^second].
|
||||||
|
|
||||||
|
Inline footnote^[Text of inline footnote] definition.
|
||||||
|
|
||||||
|
Duplicated footnote reference[^second].
|
||||||
|
|
||||||
|
[^first]: Footnote **can have markup**
|
||||||
|
|
||||||
|
and multiple paragraphs.
|
||||||
|
|
||||||
|
[^second]: Footnote text.
|
||||||
|
|
||||||
|
|
||||||
|
### [Definition lists](https://github.com/markdown-it/markdown-it-deflist)
|
||||||
|
|
||||||
|
Term 1
|
||||||
|
|
||||||
|
: Definition 1
|
||||||
|
with lazy continuation.
|
||||||
|
|
||||||
|
Term 2 with *inline markup*
|
||||||
|
|
||||||
|
: Definition 2
|
||||||
|
|
||||||
|
{ some code, part of Definition 2 }
|
||||||
|
|
||||||
|
Third paragraph of definition 2.
|
||||||
|
|
||||||
|
_Compact style:_
|
||||||
|
|
||||||
|
Term 1
|
||||||
|
~ Definition 1
|
||||||
|
|
||||||
|
Term 2
|
||||||
|
~ Definition 2a
|
||||||
|
~ Definition 2b
|
||||||
|
|
||||||
|
|
||||||
|
### [Abbreviations](https://github.com/markdown-it/markdown-it-abbr)
|
||||||
|
|
||||||
|
This is HTML abbreviation example.
|
||||||
|
|
||||||
|
It converts "HTML", but keep intact partial entries like "xxxHTMLyyy" and so on.
|
||||||
|
|
||||||
|
*[HTML]: Hyper Text Markup Language
|
||||||
|
|
||||||
|
### [Custom containers](https://github.com/markdown-it/markdown-it-container)
|
||||||
|
|
||||||
|
::: warning
|
||||||
|
*here be dragons*
|
||||||
|
:::
|
|
@ -1,10 +1,6 @@
|
||||||
+++
|
+++
|
||||||
title="First Post"
|
title="First Post"
|
||||||
date=2018-08-21
|
date=2018-08-21
|
||||||
|
|
||||||
[taxonomies]
|
|
||||||
categories = ["Sample Post"]
|
|
||||||
tags = ["post", "lorem"]
|
|
||||||
+++
|
+++
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
+++
|
+++
|
||||||
title="Second Post"
|
title="Second Post"
|
||||||
date=2018-08-22
|
date=2018-08-22
|
||||||
|
|
||||||
[taxonomies]
|
|
||||||
categories = ["Sample Post"]
|
|
||||||
tags = ["post", "lorem"]
|
|
||||||
+++
|
+++
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
+++
|
+++
|
||||||
title="Third Post"
|
title="Third Post"
|
||||||
date=2018-09-23
|
date=2018-09-23
|
||||||
|
|
||||||
[taxonomies]
|
|
||||||
categories = ["Sample Post"]
|
|
||||||
tags = ["post", "lorem"]
|
|
||||||
+++
|
+++
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
+++
|
+++
|
||||||
title="Fourth Post"
|
title="Fourth Post"
|
||||||
date=2018-09-24
|
date=2018-09-24
|
||||||
|
|
||||||
[taxonomies]
|
|
||||||
categories = ["Sample Post"]
|
|
||||||
tags = ["post", "lorem"]
|
|
||||||
+++
|
+++
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
+++
|
+++
|
||||||
title="Fifth Post"
|
title="Fifth Post"
|
||||||
date=2019-01-25
|
date=2019-01-25
|
||||||
|
|
||||||
[taxonomies]
|
|
||||||
categories = ["Sample Post"]
|
|
||||||
tags = ["post", "lorem"]
|
|
||||||
+++
|
+++
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
+++
|
+++
|
||||||
title="Sixth Post"
|
title="Sixth Post"
|
||||||
date=2019-02-26
|
date=2019-02-26
|
||||||
|
|
||||||
[taxonomies]
|
|
||||||
categories = ["Sample Post"]
|
|
||||||
tags = ["post", "lorem"]
|
|
||||||
+++
|
+++
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
+++
|
+++
|
||||||
title="Seventh Post"
|
title="Seventh Post"
|
||||||
date=2019-03-27
|
date=2019-03-27
|
||||||
|
|
||||||
[taxonomies]
|
|
||||||
categories = ["Sample Post"]
|
|
||||||
tags = ["post", "lorem"]
|
|
||||||
+++
|
+++
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -71,7 +71,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).
|
**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*
|
*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.
|
Add a new external storage. Put what you want in "folder name" (eg. "shared"). Select "Amazon S3". Keep "Access Key" for the Authentication field.
|
||||||
|
@ -258,7 +258,7 @@ Make sure you (will) have a corresponding DNS entry for them.
|
||||||
|
|
||||||
Now we will configure a reverse proxy in front of Garage.
|
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.
|
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/) section to know how.
|
||||||
|
|
||||||
Now make sure that your 2 dns entries are pointing to your reverse proxy.
|
Now make sure that your 2 dns entries are pointing to your reverse proxy.
|
||||||
|
|
||||||
|
|
BIN
content/documentation/connect/cli-nextcloud-gui.png
Normal file
After Width: | Height: | Size: 197 KiB |
|
@ -16,7 +16,7 @@ Ideally, avoid these solutions at all for any serious or production use.
|
||||||
|
|
||||||
## rclone mount
|
## 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/) and mount mode.
|
||||||
We suppose you have the following entry in your `rclone.ini` (mine is located in `~/.config/rclone/rclone.conf`):
|
We suppose you have the following entry in your `rclone.ini` (mine is located in `~/.config/rclone/rclone.conf`):
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
|
|
|
@ -94,8 +94,8 @@ garage bucket website nix.example.com --allow
|
||||||
```
|
```
|
||||||
|
|
||||||
If you need more information about exposing buckets as websites on Garage,
|
If you need more information about exposing buckets as websites on Garage,
|
||||||
check [Exposing buckets as websites](/cookbook/exposing_websites.html)
|
check [Exposing buckets as websites](/documentation/cookbook/exposing-websites/)
|
||||||
and [Configuring a reverse proxy](/cookbook/reverse_proxy.html).
|
and [Configuring a reverse proxy](/documentation/cookbook/reverse-proxy/).
|
||||||
|
|
||||||
Next, we want to check that our bucket works:
|
Next, we want to check that our bucket works:
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@ Currently, the proposed workaround is to deploy your website manually:
|
||||||
- Click on Get website files
|
- Click on Get website files
|
||||||
- You need to synchronize the output folder you see in your file explorer, we will use minio client.
|
- 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/#minio-client-recommended).
|
||||||
|
|
||||||
Then copy this output folder
|
Then copy this output folder
|
||||||
|
|
||||||
|
@ -68,7 +68,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.
|
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.
|
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/#minio-client-recommended).
|
||||||
|
|
||||||
Then build your website:
|
Then build your website:
|
||||||
|
|
||||||
|
|
|
@ -16,11 +16,11 @@ Now it will be **publicly** exposed on the web endpoint (by default listening on
|
||||||
Our website serving logic is as follow:
|
Our website serving logic is as follow:
|
||||||
- Supports only static websites (no support for PHP or other languages)
|
- Supports only static websites (no support for PHP or other languages)
|
||||||
- Does not support directory listing
|
- 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/#garage-configuration-file-format-reference))
|
||||||
|
|
||||||
Now we need to infer the URL of your website through your bucket name.
|
Now we need to infer the URL of your website through your bucket name.
|
||||||
Let assume:
|
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/#garage-configuration-file-format-reference))
|
||||||
- our bucket name is `garagehq.deuxfleurs.fr`.
|
- 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):
|
Our bucket will be served if the Host field matches one of these 2 values (the port is ignored):
|
||||||
|
@ -48,6 +48,6 @@ Now that you understand how website logic works on Garage, you can:
|
||||||
- make the website endpoint listens on port 80 (instead of 3902)
|
- make the website endpoint listens on port 80 (instead of 3902)
|
||||||
- use iptables to redirect the port 80 to the port 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`
|
`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/) 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/) to see how you can add Garage to your workflow.
|
||||||
|
|
|
@ -9,7 +9,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,
|
This will allow you to setup Garage for three-way replication of your data,
|
||||||
the safest and most available mode proposed by Garage.
|
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/) in order
|
||||||
to get familiar with Garage's command line and usage patterns.
|
to get familiar with Garage's command line and usage patterns.
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ To run a real-world deployment, make sure the following conditions are met:
|
||||||
to drastically reduce Garage's response times.
|
to drastically reduce Garage's response times.
|
||||||
|
|
||||||
- This guide will assume you are using Docker containers to deploy Garage on each node.
|
- 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/).
|
||||||
You can also use an orchestrator such as Nomad or Kubernetes to automatically manage
|
You can also use an orchestrator such as Nomad or Kubernetes to automatically manage
|
||||||
Docker containers on a fleet of nodes.
|
Docker containers on a fleet of nodes.
|
||||||
|
|
||||||
|
@ -283,15 +283,15 @@ garage layout apply
|
||||||
```
|
```
|
||||||
|
|
||||||
**WARNING:** if you want to use the layout modification commands in a script,
|
**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/) first.
|
||||||
|
|
||||||
|
|
||||||
## Using your Garage cluster
|
## Using your Garage cluster
|
||||||
|
|
||||||
Creating buckets and managing keys is done using the `garage` CLI,
|
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/).
|
||||||
Remember also that the CLI is self-documented thanks to the `--help` flag and
|
Remember also that the CLI is self-documented thanks to the `--help` flag and
|
||||||
the `help` subcommand (e.g. `garage help`, `garage key --help`).
|
the `help` subcommand (e.g. `garage help`, `garage key --help`).
|
||||||
|
|
||||||
Configuring S3-compatible applicatiosn to interact with Garage
|
Configuring S3-compatible applicatiosn to interact with Garage
|
||||||
is covered in the [Integrations](/connect/index.html) section.
|
is covered in the [Integrations](/documentation/connect/) section.
|
||||||
|
|
|
@ -123,7 +123,7 @@ server {
|
||||||
### Exposing the web endpoint
|
### Exposing the web endpoint
|
||||||
|
|
||||||
The web endpoint is a bit more complicated to configure as it listens on many different `Host` fields.
|
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/) 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.
|
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:
|
You can use the following example as your starting point:
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,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:
|
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.
|
Compared to garage, minio latency drastically increases on 3 endpoints: GetObject, PutObject, RemoveObject.
|
||||||
|
|
||||||
|
@ -48,7 +48,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).
|
The inter-DC remains costly with the same value as before (100ms +/- 20ms of jitter).
|
||||||
We plot a similar graph as before:
|
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.
|
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.
|
||||||
|
|
||||||
|
|
BIN
content/documentation/design/endpoint-latency-dc.png
Normal file
After Width: | Height: | Size: 129 KiB |
BIN
content/documentation/design/endpoint-latency.png
Normal file
After Width: | Height: | Size: 124 KiB |
|
@ -36,7 +36,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`.
|
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.
|
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/overview/#launching-the-garage-server) section of our Quick start page.
|
||||||
|
|
||||||
### 2. Make them join the cluster
|
### 2. Make them join the cluster
|
||||||
|
|
||||||
|
@ -46,7 +46,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 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 [Configuring your Garage node](/documentation/quick-start/overview/) section of our Quick start page.
|
||||||
|
|
||||||
### 3. Create a key and a bucket
|
### 3. Create a key and a bucket
|
||||||
|
|
||||||
|
@ -57,7 +57,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.
|
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.
|
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/overview/#creating-buckets-and-keys) section of our Quick start page.
|
||||||
|
|
||||||
## Handlers for generic tools
|
## Handlers for generic tools
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ and how to interact with it.
|
||||||
|
|
||||||
Our goal is to introduce you to Garage's workflows.
|
Our goal is to introduce you to Garage's workflows.
|
||||||
Following this guide is recommended before moving on to
|
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/).
|
||||||
|
|
||||||
Note that this kind of deployment should not be used in production,
|
Note that this kind of deployment should not be used in production,
|
||||||
as it provides no redundancy for your data!
|
as it provides no redundancy for your data!
|
||||||
|
@ -28,7 +28,7 @@ or in `~/.local/bin`).
|
||||||
|
|
||||||
If a binary of the last version is not available for your architecture,
|
If a binary of the last version is not available for your architecture,
|
||||||
or if you want a build customized for your system,
|
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/).
|
||||||
|
|
||||||
|
|
||||||
## Writing a first configuration file
|
## Writing a first configuration file
|
||||||
|
@ -280,5 +280,5 @@ The following tools can also be used to send and recieve files from/to Garage:
|
||||||
- [Cyberduck](https://cyberduck.io/)
|
- [Cyberduck](https://cyberduck.io/)
|
||||||
- [`s3cmd`](https://s3tools.org/s3cmd)
|
- [`s3cmd`](https://s3tools.org/s3cmd)
|
||||||
|
|
||||||
Refer to the ["Integrations" section](../connect/index.md) to learn how to
|
Refer to the ["Integrations" section](/documentation/connect/) to learn how to
|
||||||
configure application and command line utilities to integrate with Garage.
|
configure application and command line utilities to integrate with Garage.
|
||||||
|
|
|
@ -62,7 +62,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.
|
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`
|
This folder can be placed on an HDD. The space available for `data_dir`
|
||||||
should be counted to determine a node's capacity
|
should be counted to determine a node's capacity
|
||||||
when [configuring it](../getting_started/05_cluster.md).
|
when [configuring it](/documentation/reference-manual/layout/).
|
||||||
|
|
||||||
#### `block_size`
|
#### `block_size`
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,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
|
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
|
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.
|
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/) page.
|
||||||
|
|
||||||
## How cluster layouts work in Garage
|
## How cluster layouts work in Garage
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,10 @@
|
||||||
|
|
||||||
/* ARTICLES BASIC ELEMENTS */
|
/* ARTICLES BASIC ELEMENTS */
|
||||||
|
|
||||||
|
article .page-content {
|
||||||
|
@apply text-lg;
|
||||||
|
}
|
||||||
|
|
||||||
/** Pre */
|
/** Pre */
|
||||||
|
|
||||||
article pre {
|
article pre {
|
||||||
|
@ -66,8 +70,8 @@ article ol ul {
|
||||||
@apply ml-4 py-0 list-disc;
|
@apply ml-4 py-0 list-disc;
|
||||||
}
|
}
|
||||||
|
|
||||||
p > code {
|
p > code, p > strong > code, li > code, li > strong > code {
|
||||||
@apply bg-gray-100 p-1 rounded font-semibold text-garage-gray shadow-inner;
|
@apply bg-gray-100 text-base py-0.5 px-1 rounded font-semibold text-garage-gray shadow-inner;
|
||||||
}
|
}
|
||||||
|
|
||||||
.page-content > h1 {
|
.page-content > h1 {
|
||||||
|
@ -87,9 +91,31 @@ p > code {
|
||||||
}
|
}
|
||||||
|
|
||||||
.page-content a {
|
.page-content a {
|
||||||
@apply font-semibold text-garage-orange border-b hover:border-garage-gray px-0.5 border-garage-orange bg-transparent hover:bg-garage-orange hover:text-white hover:rounded-sm hover:no-underline duration-150 transition;
|
@apply font-semibold text-garage-orange border-b hover:border-garage-gray border-garage-orange bg-transparent hover:bg-garage-orange hover:text-white hover:rounded-sm hover:no-underline duration-150 transition;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-content img {
|
||||||
|
@apply inline-block my-8 shadow rounded;
|
||||||
}
|
}
|
||||||
|
|
||||||
.is-active {
|
.is-active {
|
||||||
@apply text-orange-600;
|
@apply text-orange-600;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@layer utilities {
|
||||||
|
|
||||||
|
/** Global ToC */
|
||||||
|
#global_toc .deploySubMenu {
|
||||||
|
position: absolute;
|
||||||
|
left: -100vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
#global_toc .deploySubMenu:checked ~ .subMenu {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#global_toc .deploySubMenu:checked + label .arrow {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -169,162 +169,3 @@ function search() {
|
||||||
}, 150)
|
}, 150)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function documentReadyCallback() {
|
|
||||||
|
|
||||||
if (localStorage.getItem("theme") === "dark") {
|
|
||||||
document.body.setAttribute("theme", "dark");
|
|
||||||
document.querySelectorAll("img, picture, video, pre").forEach(img => img.setAttribute("theme", "dark"));
|
|
||||||
document.querySelectorAll(".vimeo, .youtube, .chart").forEach(video => video.setAttribute("theme", "dark"));
|
|
||||||
document.getElementById("dark-mode").setAttribute("title", "Switch to light theme");
|
|
||||||
}
|
|
||||||
|
|
||||||
document.querySelector(".navbar-burger").addEventListener("click", () => {
|
|
||||||
document.querySelector(".navbar-burger").classList.toggle("is-active");
|
|
||||||
document.querySelector(".navbar-menu").classList.toggle("is-active");
|
|
||||||
});
|
|
||||||
|
|
||||||
document.querySelectorAll("div.navbar-end > .navbar-item").forEach((el) => {
|
|
||||||
if (location.href.includes(el.getAttribute("href"))) {
|
|
||||||
document.querySelectorAll("a.navbar-item.is-active").forEach(itm => itm.classList.remove("is-active"));
|
|
||||||
el.classList.add("is-active");
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
document.getElementById("nav-search").addEventListener("click", (evt) => {
|
|
||||||
//let target = evt.currentTarget.getAttribute("data-target");
|
|
||||||
document.querySelector("html").classList.add("is-clipped");
|
|
||||||
document.getElementById("search-modal").classList.add("is-active");
|
|
||||||
|
|
||||||
document.getElementById("search").focus();
|
|
||||||
document.getElementById("search").select();
|
|
||||||
});
|
|
||||||
|
|
||||||
document.querySelector(".modal-close").addEventListener("click", (evt) => {
|
|
||||||
document.querySelector("html").classList.remove("is-clipped");
|
|
||||||
evt.currentTarget.parentElement.classList.remove("is-active");
|
|
||||||
});
|
|
||||||
|
|
||||||
document.querySelector(".modal-background").addEventListener("click", (evt) => {
|
|
||||||
document.querySelector("html").classList.remove("is-clipped");
|
|
||||||
evt.currentTarget.parentElement.classList.remove("is-active");
|
|
||||||
});
|
|
||||||
|
|
||||||
document.getElementById("search").addEventListener("keyup", () => {
|
|
||||||
search();
|
|
||||||
});
|
|
||||||
|
|
||||||
document.getElementById("dark-mode").addEventListener("click", () => {
|
|
||||||
if (
|
|
||||||
localStorage.getItem("theme") == null ||
|
|
||||||
localStorage.getItem("theme") == "light"
|
|
||||||
) {
|
|
||||||
localStorage.setItem("theme", "dark");
|
|
||||||
document.body.setAttribute("theme", "dark");
|
|
||||||
document.querySelectorAll("img, picture, video, pre").forEach(img => img.setAttribute("theme", "dark"));
|
|
||||||
document.querySelectorAll(".vimeo, .youtube, .chart").forEach(video => video.setAttribute("theme", "dark"));
|
|
||||||
|
|
||||||
document.getElementById("dark-mode").setAttribute("title", "Switch to light theme");
|
|
||||||
} else {
|
|
||||||
localStorage.setItem("theme", "light");
|
|
||||||
document.body.removeAttribute("theme", "dark");
|
|
||||||
document.querySelectorAll("img, picture, video, pre").forEach(img => img.removeAttribute("theme", "dark"))
|
|
||||||
document.querySelectorAll(".vimeo, .youtube, .chart").forEach(video => video.removeAttribute("theme", "dark"));
|
|
||||||
|
|
||||||
document.getElementById("dark-mode").setAttribute("title", "Switch to dark theme");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (typeof mermaid !== "undefined") {
|
|
||||||
mermaid.initialize({ startOnLoad: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof chartXkcd !== "undefined") {
|
|
||||||
document.querySelectorAll(".chart").forEach((el, i) => {
|
|
||||||
el.setAttribute("id", `chart-${i}`);
|
|
||||||
|
|
||||||
let svg = document.getElementById(`chart-${i}`);
|
|
||||||
let { type, ...chartData } = JSON.parse(el.textContent);
|
|
||||||
new chartXkcd[type](svg, chartData);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof Galleria !== "undefined") {
|
|
||||||
document.querySelectorAll(".galleria").forEach((el, i) => {
|
|
||||||
el.setAttribute("id", `galleria-${i}`);
|
|
||||||
|
|
||||||
let { images } = JSON.parse(el.textContent);
|
|
||||||
|
|
||||||
for (let image of images) {
|
|
||||||
el.insertAdjacentHTML("beforeend",
|
|
||||||
`<a href="${image.src}"><img src="${image.src}" data-title="${image.title}" data-description="${image.description}"></a>`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Galleria.run(".galleria");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof mapboxgl !== "undefined") {
|
|
||||||
document.querySelectorAll(".map").forEach((el, i) => {
|
|
||||||
el.setAttribute("id", `map-${i}`);
|
|
||||||
|
|
||||||
mapboxgl.accessToken = el.querySelector(".mapbox-access-token").textContent.trim();
|
|
||||||
let zoom = el.querySelector(".mapbox-zoom").textContent.trim();
|
|
||||||
|
|
||||||
let map = new mapboxgl.Map({
|
|
||||||
container: `map-${i}`,
|
|
||||||
style: "mapbox://styles/mapbox/light-v10",
|
|
||||||
center: [-96, 37.8],
|
|
||||||
zoom: zoom,
|
|
||||||
});
|
|
||||||
|
|
||||||
map.addControl(new mapboxgl.NavigationControl());
|
|
||||||
|
|
||||||
let geojson = JSON.parse(el.querySelector(".mapbox-geojson").textContent.trim());
|
|
||||||
|
|
||||||
const center = [0, 0];
|
|
||||||
|
|
||||||
geojson.features.forEach(function (marker) {
|
|
||||||
center[0] += marker.geometry.coordinates[0];
|
|
||||||
center[1] += marker.geometry.coordinates[1];
|
|
||||||
|
|
||||||
new mapboxgl.Marker()
|
|
||||||
.setLngLat(marker.geometry.coordinates)
|
|
||||||
.setPopup(
|
|
||||||
new mapboxgl.Popup({ offset: 25 }) // add popups
|
|
||||||
.setHTML(
|
|
||||||
"<h3>" +
|
|
||||||
marker.properties.title +
|
|
||||||
"</h3><p>" +
|
|
||||||
marker.properties.description +
|
|
||||||
"</p>"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.addTo(map);
|
|
||||||
});
|
|
||||||
|
|
||||||
center[0] = center[0] / geojson.features.length;
|
|
||||||
center[1] = center[1] / geojson.features.length;
|
|
||||||
|
|
||||||
map.setCenter(center);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof renderMathInElement !== "undefined") {
|
|
||||||
renderMathInElement(document.body, {
|
|
||||||
delimiters: [
|
|
||||||
{ left: '$$', right: '$$', display: true },
|
|
||||||
{ left: '$', right: '$', display: false },
|
|
||||||
{ left: '\\(', right: '\\)', display: false },
|
|
||||||
{ left: '\\[', right: '\\]', display: true }
|
|
||||||
]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (document.readyState === 'loading') { // Loading hasn't finished yet
|
|
||||||
document.addEventListener('DOMContentLoaded', documentReadyCallback);
|
|
||||||
} else { // `DOMContentLoaded` has already fired
|
|
||||||
documentReadyCallback();
|
|
||||||
}
|
|
||||||
|
|
|
@ -88,6 +88,9 @@
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="ml-4">
|
||||||
|
{{ macros:: social_links( social_config=config.extra.social) }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
{% extends "base.html" %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<section class="section">
|
|
||||||
<div class="container">
|
|
||||||
<div class="has-text-centered">
|
|
||||||
<h1 class="title is-2">
|
|
||||||
<span class="icon">
|
|
||||||
<i class="fas fa-cubes"></i>
|
|
||||||
</span>
|
|
||||||
Categories
|
|
||||||
</h1>
|
|
||||||
<p class='subtitle is-4'>{{ terms | length }} categories in total</p>
|
|
||||||
<p>
|
|
||||||
{% for category in terms %}
|
|
||||||
<a href="{{ get_taxonomy_url(kind='categories', name=category.name) }}" class="mr-4">
|
|
||||||
<span class="icon">
|
|
||||||
<i class="fas fa-cube"></i>
|
|
||||||
</span>
|
|
||||||
<span>{{category.name}} <sup>{{ category.pages | length }}</sup></span>
|
|
||||||
</a>
|
|
||||||
{% endfor %}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
{% endblock content %}
|
|
|
@ -1,76 +0,0 @@
|
||||||
{% extends "base.html" %}
|
|
||||||
|
|
||||||
{% block header %}
|
|
||||||
<header class='hero'>
|
|
||||||
<div class='hero-body pb-0'>
|
|
||||||
<div class='container'>
|
|
||||||
<div class='has-text-centered'>
|
|
||||||
<h1 class="title">
|
|
||||||
<span class="icon-text">
|
|
||||||
<span class="icon">
|
|
||||||
<i class="fas fa-cube"></i>
|
|
||||||
</span>
|
|
||||||
<span>{{ term.name }}</span>
|
|
||||||
</span>
|
|
||||||
</h1>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<section class="section">
|
|
||||||
<div class="container">
|
|
||||||
<div class="columns is-centered">
|
|
||||||
<div class="column is-9">
|
|
||||||
{% if paginator %}
|
|
||||||
{% set pages = paginator.pages %}
|
|
||||||
{% else %}
|
|
||||||
{% set pages = term.pages %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% for page in pages %}
|
|
||||||
<article class="box">
|
|
||||||
<h2 class="title">
|
|
||||||
<a href='{{ page.permalink }}'>
|
|
||||||
{{ page.title }}
|
|
||||||
</a>
|
|
||||||
</h2>
|
|
||||||
<p class="subtitle">{{ page.description }}</p>
|
|
||||||
<div class="columns is-multiline is-gapless">
|
|
||||||
<div class="column is-8">
|
|
||||||
{{ macros::page_publish_metadata(page=page) }}
|
|
||||||
</div>
|
|
||||||
<div class="column is-4 has-text-right-desktop">
|
|
||||||
{{ macros::page_content_metadata(page=page) }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="content mt-2">
|
|
||||||
{{ page.summary | safe }}
|
|
||||||
<a href='{{ page.permalink }}'>
|
|
||||||
Read More
|
|
||||||
<span class="icon is-small">
|
|
||||||
<i class="fas fa-arrow-right fa-xs"></i>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column">
|
|
||||||
{% if page.taxonomies.categories %}
|
|
||||||
{{ macros::render_categories(categories=page.taxonomies.categories) }}
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
<div class="column has-text-right-desktop">
|
|
||||||
{% if page.taxonomies.tags %}
|
|
||||||
{{ macros::render_tags(tags=page.taxonomies.tags) }}
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
{% endblock content %}
|
|
|
@ -1,38 +1,17 @@
|
||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{{ config.title }} | {{ page.title }}
|
{{ config.title }} | {{ page.title }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% set section = get_section(path="documentation/_index.md") %}
|
{% set section = get_section(path="documentation/_index.md") %}
|
||||||
<section class="section overflow-x-hidden">
|
<section class="section overflow-x-hidden">
|
||||||
<div class="grid grid-cols-5">
|
<div class="grid grid-cols-1 xl:grid-cols-5">
|
||||||
|
{% include "partials/doc/global_toc.html" %}
|
||||||
<aside class="col-span-1 h-full bg-gray-100 shadow-inner border-r border-t border-gray-200">
|
|
||||||
{% if section.toc %}
|
|
||||||
<ul>
|
|
||||||
{% for h1 in section.toc %}
|
|
||||||
<li>
|
|
||||||
<a href="{{ h1.permalink | safe }}">{{ h1.title }}</a>
|
|
||||||
{% if h1.children %}
|
|
||||||
<ul>
|
|
||||||
{% for h2 in h1.children %}
|
|
||||||
<li>
|
|
||||||
<a href="{{ h2.permalink | safe }}">{{ h2.title }}</a>
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
{% endif %}
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
{% endif %}
|
|
||||||
</aside>
|
|
||||||
|
|
||||||
<div class="col-span-3">
|
<div class="col-span-3">
|
||||||
<article class="box my-12 px-12">
|
<article class="box my-12 px-12">
|
||||||
<div class="flex flex-col bg-gray-100 rounded-r shadow-sm w-max">
|
<div class="flex flex-col bg-gray-100 rounded-r shadow-sm w-full xl:w-max">
|
||||||
<div class="flex flex-col border-l-4 border-garage-orange py-2 px-4 relative">
|
<div class="flex flex-col border-l-4 border-garage-orange py-2 px-4 relative">
|
||||||
<h1 class="title leading-10 text-3xl text-garage-orange font-semibold">
|
<h1 class="title leading-10 text-3xl text-garage-orange font-semibold">
|
||||||
{{ page.title }}
|
{{ page.title }}
|
||||||
|
@ -40,6 +19,14 @@
|
||||||
{% if page.description %}
|
{% if page.description %}
|
||||||
<p class="subtitle my-2 text-gray-600 italic text-sm">{{ page.description }}</p>
|
<p class="subtitle my-2 text-gray-600 italic text-sm">{{ page.description }}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if page.reading_time %}
|
||||||
|
<p
|
||||||
|
class="subtitle flex items-center space-x-1 my-2 text-gray-600 italic text-sm"
|
||||||
|
title="{{ page.reading_time }} min reading time">
|
||||||
|
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
|
||||||
|
<span>{{ page.reading_time }} min</span>
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="page-content max-w-4xl">
|
<div class="page-content max-w-4xl">
|
||||||
|
@ -47,178 +34,18 @@
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
</div>
|
</div>
|
||||||
|
{% include "partials/doc/page_toc.html" %}
|
||||||
<aside class="hidden 2xl:block fixed right-0 bottom-1/2 transform translate-y-1/2 col-span-1 h-auto bg-gray-100 rounded-l-lg shadow-inner">
|
|
||||||
{% if page.toc %}
|
|
||||||
<div class="w-full flex items-center justify-center py-1.5 bg-gray-200 rounded-tl-lg">
|
|
||||||
<span class="uppercase tracking-wide text-xs text-garage-gray">Page content</span>
|
|
||||||
</div>
|
</div>
|
||||||
<ol class="text-sm space-y-0.5 py-0.5 px-8 py-3 list-decimal">
|
<div class="2xl:hidden">
|
||||||
{% for h1 in page.toc %}
|
{% if page.earlier or page.later or page.lighter or page.heavier %}
|
||||||
<li>
|
{% include "partials/doc/pagination.html" %}
|
||||||
<a href="{{ h1.permalink | safe }}" class="font-semibold bg-gradient-to-r from-garage-gray to-garage-orange text-transparent bg-clip-text transition-all hover:text-garage-orange">{{ h1.title }}</a>
|
|
||||||
{% if h1.children %}
|
|
||||||
<ul class="space-y-0.5 py-0.5">
|
|
||||||
{% for h2 in h1.children %}
|
|
||||||
<li>
|
|
||||||
<a href="{{ h2.permalink | safe }}" class="text-gray-700 hover:text-garage-orange">{{ h2.title }}</a>
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ol>
|
|
||||||
{% endif %}
|
|
||||||
</aside>
|
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block pagination %}
|
|
||||||
{% if page.earlier or page.later or page.lighter or page.heavier %}
|
|
||||||
<section class="w-full">
|
|
||||||
<div class="container py-20">
|
|
||||||
<div class="mx-auto max-w-4xl">
|
|
||||||
<div class="column is-8">
|
|
||||||
<nav class="flex space-x-8 items-center justify-center">
|
|
||||||
{% if page.later %}
|
|
||||||
<div>
|
|
||||||
<a class="flex items-center space-x-1 hover:text-garage-orange font-semibold text-gray-800"
|
|
||||||
href="{{ page.later.permalink }}">
|
|
||||||
<span class="icon mr-2">
|
|
||||||
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
|
||||||
xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
||||||
d="M7 16l-4-4m0 0l4-4m-4 4h18"></path>
|
|
||||||
</svg>
|
|
||||||
</span>
|
|
||||||
<span>{{ page.later.title }}</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% endif %} {% if page.earlier %}
|
|
||||||
<div>
|
|
||||||
<a class="flex items-center space-x-1 hover:text-garage-orange font-semibold text-gray-800"
|
|
||||||
href="{{ page.earlier.permalink }}">
|
|
||||||
{{ page.earlier.title }}<span class="icon ml-2">
|
|
||||||
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
|
||||||
xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
||||||
d="M17 8l4 4m0 0l-4 4m4-4H3"></path>
|
|
||||||
</svg>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% endif %} {% if page.heavier %}
|
|
||||||
<div>
|
|
||||||
<a class="flex items-center space-x-1 hover:text-garage-orange font-semibold text-gray-800"
|
|
||||||
href="{{ page.heavier.permalink }}">
|
|
||||||
<span class="icon mr-2">
|
|
||||||
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
|
||||||
xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
||||||
d="M7 16l-4-4m0 0l4-4m-4 4h18"></path>
|
|
||||||
</svg>
|
|
||||||
</span>
|
|
||||||
<span>{{ page.heavier.title }}</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% endif %} {% if page.lighter %}
|
|
||||||
<div>
|
|
||||||
<a class="flex items-center space-x-1 hover:text-garage-orange font-semibold text-gray-800"
|
|
||||||
href="{{ page.lighter.permalink }}">
|
|
||||||
{{ page.lighter.title }}<span class="icon ml-2">
|
|
||||||
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
|
||||||
xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
||||||
d="M17 8l4 4m0 0l-4 4m4-4H3"></path>
|
|
||||||
</svg>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
{% endif %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block comment %}
|
|
||||||
{% if page.extra.comments and config.extra.commenting.disqus %}
|
|
||||||
<section class="section">
|
|
||||||
<div class="container">
|
|
||||||
<div class="columns is-centered">
|
|
||||||
<div class="column is-6">
|
|
||||||
<div id="disqus_thread"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
{% endif %}
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block custom_js %}
|
{% block custom_js %}
|
||||||
{% if page.extra.toc %}
|
{% if page.toc %}
|
||||||
<script type="text/javascript">
|
{% include "partials/doc/toc_script.html" %}
|
||||||
const menuBarHeight = document.querySelector("nav.navbar").clientHeight;
|
{% endif %}
|
||||||
const tocItems = document.querySelectorAll(".toc");
|
|
||||||
const navSections = new Array(tocItems.length);
|
|
||||||
|
|
||||||
tocItems.forEach((el, i) => {
|
|
||||||
let id = el.getAttribute("id").substring(5);
|
|
||||||
navSections[i] = document.getElementById(id);
|
|
||||||
})
|
|
||||||
|
|
||||||
function isVisible(tocIndex) {
|
|
||||||
const current = navSections[tocIndex];
|
|
||||||
const next = tocIndex < tocItems.length - 1 ? navSections[tocIndex + 1]
|
|
||||||
: document.querySelectorAll("section.section").item(1);
|
|
||||||
|
|
||||||
const c = current.getBoundingClientRect();
|
|
||||||
const n = next.getBoundingClientRect();
|
|
||||||
const h = (window.innerHeight || document.documentElement.clientHeight);
|
|
||||||
|
|
||||||
return (c.top <= h) && (n.top - menuBarHeight >= 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
function activateIfVisible() {
|
|
||||||
for (b = true, i = 0; i < tocItems.length; i++) {
|
|
||||||
if (b && isVisible(i)) {
|
|
||||||
tocItems[i].classList.add('is-active');
|
|
||||||
b = false;
|
|
||||||
} else
|
|
||||||
tocItems[i].classList.remove('is-active');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var isTicking = null;
|
|
||||||
window.addEventListener('scroll', () => {
|
|
||||||
if (!isTicking) {
|
|
||||||
window.requestAnimationFrame(() => {
|
|
||||||
activateIfVisible();
|
|
||||||
isTicking = false;
|
|
||||||
});
|
|
||||||
isTicking = true;
|
|
||||||
}
|
|
||||||
}, false);
|
|
||||||
</script>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if page.extra.comments and config.extra.commenting.disqus %}
|
|
||||||
<script>
|
|
||||||
var disqus_config = function () {
|
|
||||||
this.page.url = "{{config.base_url | safe}}";
|
|
||||||
this.page.identifier = "{{ current_path | safe}}";
|
|
||||||
};
|
|
||||||
|
|
||||||
(function () {
|
|
||||||
var d = document, s = d.createElement('script');
|
|
||||||
s.src = 'https://{{ config.extra.commenting.disqus | safe}}.disqus.com/embed.js';
|
|
||||||
s.setAttribute('data-timestamp', +new Date());
|
|
||||||
(d.head || d.body).appendChild(s);
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
{% endif %}
|
|
||||||
{% endblock %}
|
{% endblock %}
|
|
@ -4,26 +4,26 @@
|
||||||
<section class="section" id="home-section">
|
<section class="section" id="home-section">
|
||||||
<div>
|
<div>
|
||||||
|
|
||||||
<div class="flex flex-col items-center justify-center py-12">
|
<div class="flex flex-col items-center justify-center py-12 px-12 xl:px-0">
|
||||||
<img src="{{ config.extra.organization.logo }}" width="220px" class="" />
|
<img src="{{ config.extra.organization.logo }}" width="220px" class="" />
|
||||||
<p class="text-gray-500 leading-10 pt-4 text-xl">{{ config.extra.organization.description }}</p>
|
<p class="text-gray-500 leading-10 pt-4 text-xl text-center">{{ config.extra.organization.description }}</p>
|
||||||
<div class="max-w-7xl mx-auto grid grid-cols-3 gap-x-24 py-12">
|
<div class="max-w-7xl mx-auto grid-cols-1 md:grid grid-cols-3 gap-x-32 py-12">
|
||||||
<div class="flex flex-col items-start justify-center p-2">
|
<div class="group flex flex-col items-start justify-center p-2">
|
||||||
<img src="{{ get_url(path='images/host2.png') }}">
|
<img src="{{ get_url(path='images/host2.png') }}" class="transform group-hover:translate-y-4 transition duration-500">
|
||||||
<span class="text-xl text-gray-700 font-semibold mt-4">Host a Website</span>
|
<span class="text-xl text-gray-700 font-semibold mt-4 transform group-hover:-translate-y-2 transition duration-500">Host a Website</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col items-center justify-center p-2">
|
<div class="group flex flex-col items-center justify-center p-2">
|
||||||
<img src="{{ get_url(path='images/store.png') }}">
|
<img src="{{ get_url(path='images/store.png') }}" class="transform group-hover:translate-y-4 transition duration-500">
|
||||||
<span class="text-xl text-gray-700 font-semibold mt-4">Store Media</span>
|
<span class="text-xl text-gray-700 font-semibold mt-4 transform group-hover:-translate-y-2 transition duration-500">Store Media</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col items-end justify-center p-2">
|
<div class="group flex flex-col items-end justify-center p-2">
|
||||||
<img src="{{ get_url(path='images/backup.png') }}">
|
<img src="{{ get_url(path='images/backup.png') }}" class="transform group-hover:translate-y-4 transition duration-500">
|
||||||
<span class="text-xl text-gray-700 font-semibold mt-4">Backup Target</span>
|
<span class="text-xl text-gray-700 font-semibold mt-4 transform group-hover:-translate-y-2 transition duration-500">Backup Target</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="grid grid-cols-2 gap-x-12 gap-y-32 text-garage-gray font-light bg-gray-100 py-12 w-full shadow-inner">
|
<div class="grid grid-cols-1 xl:grid-cols-2 gap-x-0 xl:gap-x-12 gap-y-24 text-garage-gray font-light bg-gray-100 py-12 w-full shadow-inner">
|
||||||
|
|
||||||
<div class="flex flex-col items-center justify-center space-y-2">
|
<div class="flex flex-col items-center justify-center space-y-2">
|
||||||
<h2 class="mb-2 text-2xl font-bold text-garage-orange leading-5">Our Goals</h2>
|
<h2 class="mb-2 text-2xl font-bold text-garage-orange leading-5">Our Goals</h2>
|
||||||
|
@ -64,36 +64,36 @@
|
||||||
<p class="text-center leading-5 italic">
|
<p class="text-center leading-5 italic">
|
||||||
We worked hard to keep requirements as low as possible<br>as we target the largest possible public.
|
We worked hard to keep requirements as low as possible<br>as we target the largest possible public.
|
||||||
</p>
|
</p>
|
||||||
<ul class="text-center list-style-none flex flex-col items- space-y-2 justify-start py-4">
|
<ul class="text-center list-style-none flex flex-col space-y-2 justify-start py-4">
|
||||||
<li class="flex items-center justify-start">
|
<li class="flex flex-col md:flex-row items-center justify-start">
|
||||||
<div class="flex items-center space-x-2 w-max whitespace-nowrap bg-gray-200 shadow-inner py-0.5 px-1.5 rounded-md">
|
<div class="flex items-center space-x-2 w-max whitespace-nowrap bg-gray-200 shadow-inner py-0.5 px-1.5 rounded-md">
|
||||||
<img src="{{ get_url(path='icons/cpu.svg') }}" width="24px">
|
<img src="{{ get_url(path='icons/cpu.svg') }}" width="24px">
|
||||||
<span class="font-semibold">CPU</span>
|
<span class="font-semibold">CPU</span>
|
||||||
</div>
|
</div>
|
||||||
<span class="px-2">Any x86_64 CPU from the last 10 years, ARMv7 or ARMv8</span>
|
<span class="px-2">Any x86_64 CPU from the last 10 years, ARMv7 or ARMv8</span>
|
||||||
</li>
|
</li>
|
||||||
<li class="flex items-center justify-start">
|
<li class="flex flex-col md:flex-row items-center justify-start">
|
||||||
<div class="flex items-center space-x-2 w-max whitespace-nowrap bg-gray-200 shadow-inner py-0.5 px-1.5 rounded-md">
|
<div class="flex items-center space-x-2 w-max whitespace-nowrap bg-gray-200 shadow-inner py-0.5 px-1.5 rounded-md">
|
||||||
<img src="{{ get_url(path='icons/ram.svg') }}" width="24px">
|
<img src="{{ get_url(path='icons/ram.svg') }}" width="24px">
|
||||||
<span class="font-semibold">RAM</span>
|
<span class="font-semibold">RAM</span>
|
||||||
</div>
|
</div>
|
||||||
<span class="px-2">1 GB</span>
|
<span class="px-2">1 GB</span>
|
||||||
</li>
|
</li>
|
||||||
<li class="flex items-center justify-start">
|
<li class="flex flex-col md:flex-row items-center justify-start">
|
||||||
<div class="flex items-center space-x-2 w-max whitespace-nowrap bg-gray-200 shadow-inner py-0.5 px-1.5 rounded-md">
|
<div class="flex items-center space-x-2 w-max whitespace-nowrap bg-gray-200 shadow-inner py-0.5 px-1.5 rounded-md">
|
||||||
<img src="{{ get_url(path='icons/disk.svg') }}" width="24px">
|
<img src="{{ get_url(path='icons/disk.svg') }}" width="24px">
|
||||||
<span class="font-semibold">Disk space</span>
|
<span class="font-semibold">Disk space</span>
|
||||||
</div>
|
</div>
|
||||||
<span class="px-2">At least 16 GB</span>
|
<span class="px-2">At least 16 GB</span>
|
||||||
</li>
|
</li>
|
||||||
<li class="flex items-center justify-start">
|
<li class="flex flex-col md:flex-row items-center justify-start">
|
||||||
<div class="flex items-center space-x-2 w-max whitespace-nowrap bg-gray-200 shadow-inner py-0.5 px-1.5 rounded-md">
|
<div class="flex items-center space-x-2 w-max whitespace-nowrap bg-gray-200 shadow-inner py-0.5 px-1.5 rounded-md">
|
||||||
<img src="{{ get_url(path='icons/network.svg') }}" width="24px">
|
<img src="{{ get_url(path='icons/network.svg') }}" width="24px">
|
||||||
<span class="font-semibold">Network</span>
|
<span class="font-semibold">Network</span>
|
||||||
</div>
|
</div>
|
||||||
<span class="px-2">200 ms or less, 50 Mbps or more</span>
|
<span class="px-2">200 ms or less, 50 Mbps or more</span>
|
||||||
</li>
|
</li>
|
||||||
<li class="flex flex-col items-start justify-center">
|
<li class="flex flex-col items-center md:items-start justify-center">
|
||||||
<div class="flex items-center space-x-2 w-max whitespace-nowrap bg-gray-200 shadow-inner py-0.5 px-1.5 rounded-md">
|
<div class="flex items-center space-x-2 w-max whitespace-nowrap bg-gray-200 shadow-inner py-0.5 px-1.5 rounded-md">
|
||||||
<img src="{{ get_url(path='icons/hardware.svg') }}" width="24px">
|
<img src="{{ get_url(path='icons/hardware.svg') }}" width="24px">
|
||||||
<span class="font-semibold">Heterogeneous hardware</span>
|
<span class="font-semibold">Heterogeneous hardware</span>
|
||||||
|
@ -103,11 +103,11 @@
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex flex-col items-center justify-center space-y-2">
|
<div class="flex flex-col items-center justify-center space-y-2 px-6 xl:px-0">
|
||||||
<h2 class="mb-2 text-2xl font-bold text-garage-orange leading-5">Data resiliency for everyone</h2>
|
<h2 class="mb-2 text-2xl font-bold text-garage-orange leading-5">Data resiliency for everyone</h2>
|
||||||
<div class="w-8 h-1 bg-garage-orange"></div>
|
<div class="w-8 h-1 bg-garage-orange"></div>
|
||||||
<p class="text-center leading-5 italic pb-4">
|
<p class="text-center leading-5 italic pb-4">
|
||||||
Blabla bla bla bla.
|
Lorem ipsum dolor sit amet consectetur adipisicing elit.
|
||||||
</p>
|
</p>
|
||||||
<p class="font-normal">
|
<p class="font-normal">
|
||||||
Garage implements the Amazon S3 API<br>and thus is already compatible with many applications.
|
Garage implements the Amazon S3 API<br>and thus is already compatible with many applications.
|
||||||
|
@ -146,10 +146,12 @@
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex flex-col items-center justify-center space-y-2">
|
<div class="flex flex-col items-center justify-center space-y-2 px-6 xl:px-0">
|
||||||
<h2 class="mb-2 text-2xl font-bold text-garage-orange leading-5">Built on the shoulder of giants</h2>
|
<h2 class="mb-2 text-2xl font-bold text-garage-orange leading-5">Built on the shoulder of giants</h2>
|
||||||
<div class="w-8 h-1 bg-garage-orange"></div>
|
<div class="w-8 h-1 bg-garage-orange"></div>
|
||||||
<p class="text-center leading-5 italic">Which means thats you have to be very tall to get it.</p>
|
<p class="text-center leading-5 italic">
|
||||||
|
Lorem ipsum dolor sit amet consectetur adipisicing elit.
|
||||||
|
</p>
|
||||||
<ul class="text-center list-style-none flex flex-col items-center py-4">
|
<ul class="text-center list-style-none flex flex-col items-center py-4">
|
||||||
<li>
|
<li>
|
||||||
<a href="#" class="font-semibold hover:text-garage-orange">Dynamo: Amazon’s Highly Available Key-value Store</a>
|
<a href="#" class="font-semibold hover:text-garage-orange">Dynamo: Amazon’s Highly Available Key-value Store</a>
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
<p class="subtitle my-2 text-gray-600 italic text-sm">{{ page.description }}</p>
|
<p class="subtitle my-2 text-gray-600 italic text-sm">{{ page.description }}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a id="back-to-blog-posts" class="absolute top-0 -left-12" href="/blog" title="Back to blog posts">
|
<a id="back-to-blog-posts" class="absolute top-0 -left-12" href="/blog" title="Back to blog posts">
|
||||||
<div class="w-10 overflow-hidden inline-block">
|
<div class="w-10 overflow-hidden inline-block group">
|
||||||
<div class="h-16 bg-garage-orange hover:bg-garage-gray transform -rotate-45 origin-top-right"></div>
|
<div class="h-16 bg-garage-gray group-hover:bg-garage-orange transform -rotate-45 origin-top-right"></div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
34
templates/partials/doc/global_toc.html
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
<aside id="global_toc" class="col-span-1 h-max bg-gray-100 shadow-inner border-r border-t border-gray-200">
|
||||||
|
{% if section.subsections %}
|
||||||
|
<ul class="space-y-2 py-0.5 px-6 py-3 list-none">
|
||||||
|
{% for subsec in section.subsections %}
|
||||||
|
{% set h1 = get_section(path=subsec) %}
|
||||||
|
<li class="relative">
|
||||||
|
<a
|
||||||
|
href="{{ h1.permalink | safe }}"
|
||||||
|
class="bg-white border border-garage-orange block p-1 rounded-r rounded-tl font-semibold text-gray-800">
|
||||||
|
{{ h1.title }}
|
||||||
|
</a>
|
||||||
|
{% if h1.pages %}
|
||||||
|
<input type="checkbox" id="btn-{{ h1.title | slugify }}" class="deploySubMenu"/>
|
||||||
|
<label for="btn-{{ h1.title | slugify }}" class="absolute top-0 right-0.5 bg-garage-orange bg-opacity-10 border-l border-garage-orange border-opacity-20 cursor-pointer inline-block px-3 py-1" style="margin-top:0.08rem;">
|
||||||
|
<svg class="arrow w-6 h-6 text-garage-gray group-hover:text-garage-orange transform rotate-90" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path></svg>
|
||||||
|
</label>
|
||||||
|
<ul class="subMenu border-l border-garage-orange space-y-0.5">
|
||||||
|
{% for h2 in h1.pages %}
|
||||||
|
<li>
|
||||||
|
<a
|
||||||
|
href="{{ h2.permalink | safe }}"
|
||||||
|
class="docPage block pl-2 py-1 border-l-4 rounded-r border-opacity-0 hover:bg-garage-orange hover:bg-opacity-20
|
||||||
|
{% if current_path == h2.path %} activePage text-garage-orange font-semibold border-opacity-100 border-garage-orange {% endif %}">
|
||||||
|
{{ h2.title }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
</aside>
|
33
templates/partials/doc/page_toc.html
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
<aside class="hidden 2xl:block fixed right-0 bottom-1/2 transform translate-y-1/2 col-span-1 h-auto bg-gray-100 rounded-l-lg shadow-inner">
|
||||||
|
{% if page.toc %}
|
||||||
|
<div class="w-full flex items-center justify-center py-1.5 bg-gray-200 rounded-tl-lg">
|
||||||
|
<span class="uppercase tracking-wide text-xs text-garage-gray">Page content</span>
|
||||||
|
</div>
|
||||||
|
<ol class="text-sm space-y-0.5 py-0.5 px-8 py-3 list-decimal">
|
||||||
|
{% for h1 in page.toc %}
|
||||||
|
<li>
|
||||||
|
<a href="{{ h1.permalink | safe }}" class="font-semibold bg-gradient-to-r from-garage-gray to-garage-orange text-transparent bg-clip-text transition-all hover:text-garage-orange">{{ h1.title }}</a>
|
||||||
|
{% if h1.children %}
|
||||||
|
<ul class="space-y-0.5 py-0.5">
|
||||||
|
{% for h2 in h1.children %}
|
||||||
|
<li>
|
||||||
|
<a
|
||||||
|
href="{{ h2.permalink | safe }}"
|
||||||
|
id="link-{{ h2.id | safe }}"
|
||||||
|
class="toc text-gray-700 hover:text-garage-orange">
|
||||||
|
{{ h2.title }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ol>
|
||||||
|
{% endif %}
|
||||||
|
<div class="bg-gray-100 rounded-bl-lg">
|
||||||
|
{% if page.earlier or page.later or page.lighter or page.heavier %}
|
||||||
|
{% include "partials/doc/pagination.html" %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</aside>
|
76
templates/partials/doc/pagination.html
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
<section class="w-full">
|
||||||
|
<div class="container">
|
||||||
|
<div class="mx-auto max-w-4xl">
|
||||||
|
<div class="column is-8">
|
||||||
|
<div class="w-full flex items-center justify-center py-1.5 bg-gray-200">
|
||||||
|
<span class="uppercase tracking-wide text-xs text-garage-gray">Navigation</span>
|
||||||
|
</div>
|
||||||
|
<nav class="flex space-x-4 items-center justify-center p-4">
|
||||||
|
{% if page.earlier %}
|
||||||
|
<div>
|
||||||
|
<a class="flex items-center space-x-1 hover:text-garage-orange text-garage-gray text-sm bg-white transform hover:scale-110 transition border border-garage-orange p-2.5 rounded-full"
|
||||||
|
href="{{ page.earlier.permalink }}"
|
||||||
|
title="{{ page.earlier.title }}">
|
||||||
|
<span class="icon">
|
||||||
|
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
|
d="M7 16l-4-4m0 0l4-4m-4 4h18"></path>
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if page.later %}
|
||||||
|
<div>
|
||||||
|
<a class="flex items-center space-x-1 hover:text-garage-orange text-garage-gray text-sm bg-white transform hover:scale-110 transition border border-garage-orange p-2.5 rounded-full"
|
||||||
|
href="{{ page.later.permalink }}"
|
||||||
|
title="{{ page.later.title }}">
|
||||||
|
<span class="icon">
|
||||||
|
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
|
d="M17 8l4 4m0 0l-4 4m4-4H3"></path>
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if page.lighter %}
|
||||||
|
<div>
|
||||||
|
<a class="flex items-center space-x-1 hover:text-garage-orange text-garage-gray text-sm bg-white transform hover:scale-110 transition border border-garage-orange p-2.5 rounded-full"
|
||||||
|
href="{{ page.lighter.permalink }}"
|
||||||
|
title="{{ page.lighter.title }}">
|
||||||
|
<span class="icon flex space-x-1.5 2xl:inline 2xl:space-x-0">
|
||||||
|
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
|
d="M7 16l-4-4m0 0l4-4m-4 4h18"></path>
|
||||||
|
</svg>
|
||||||
|
<span class="mt-0.5 2xl:hidden">{{ page.lighter.title }}</span>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if page.heavier %}
|
||||||
|
<div>
|
||||||
|
<a class="flex items-center space-x-1 hover:text-garage-orange text-garage-gray text-sm bg-white transform hover:scale-110 transition border border-garage-orange p-2.5 rounded-full"
|
||||||
|
href="{{ page.heavier.permalink }}"
|
||||||
|
title="{{ page.heavier.title }}">
|
||||||
|
<span class="icon flex space-x-1.5 2xl:inline 2xl:space-x-0">
|
||||||
|
<span class="mt-0.5 2xl:hidden">{{ page.heavier.title }}</span>
|
||||||
|
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
|
d="M17 8l4 4m0 0l-4 4m4-4H3"></path>
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
55
templates/partials/doc/toc_script.html
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
const menuBarHeight = document.querySelector("nav.navbar").clientHeight;
|
||||||
|
const tocItems = document.querySelectorAll(".toc");
|
||||||
|
const navSections = new Array(tocItems.length);
|
||||||
|
|
||||||
|
tocItems.forEach((el, i) => {
|
||||||
|
let id = el.getAttribute("id").substring(5);
|
||||||
|
navSections[i] = document.getElementById(id);
|
||||||
|
})
|
||||||
|
|
||||||
|
function isVisible(tocIndex) {
|
||||||
|
const current = navSections[tocIndex];
|
||||||
|
const next = tocIndex < tocItems.length - 1 ? navSections[tocIndex + 1]
|
||||||
|
: document.querySelectorAll("section.section").item(1);
|
||||||
|
|
||||||
|
const c = current.getBoundingClientRect();
|
||||||
|
const n = next.getBoundingClientRect();
|
||||||
|
const h = (window.innerHeight || document.documentElement.clientHeight);
|
||||||
|
|
||||||
|
return (c.top <= h) && (n.top - menuBarHeight >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function activateIfVisible() {
|
||||||
|
for (b = true, i = 0; i < tocItems.length; i++) {
|
||||||
|
if (b && isVisible(i)) {
|
||||||
|
tocItems[i].classList.add('is-active');
|
||||||
|
b = false;
|
||||||
|
} else
|
||||||
|
tocItems[i].classList.remove('is-active');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var isTicking = null;
|
||||||
|
window.addEventListener('scroll', () => {
|
||||||
|
if (!isTicking) {
|
||||||
|
window.requestAnimationFrame(() => {
|
||||||
|
activateIfVisible();
|
||||||
|
isTicking = false;
|
||||||
|
});
|
||||||
|
isTicking = true;
|
||||||
|
}
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
// If JS enabled, deploy only the current doc menu
|
||||||
|
document.addEventListener("DOMContentLoaded", function() {
|
||||||
|
var menusTriggers = document.getElementsByClassName("deploySubMenu");
|
||||||
|
var activeDocPage = document.getElementsByClassName("activePage")[0];
|
||||||
|
for (var i = 0; i < menusTriggers.length; i++) {
|
||||||
|
menusTriggers[i].checked = true;
|
||||||
|
}
|
||||||
|
activeDocPage.parentElement.parentElement.previousElementSibling.previousElementSibling.checked = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
|
@ -1,27 +0,0 @@
|
||||||
{% extends "base.html" %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<section class="section">
|
|
||||||
<div class="container">
|
|
||||||
<div class="has-text-centered">
|
|
||||||
<h1 class="title is-2">
|
|
||||||
<span class="icon">
|
|
||||||
<i class="fas fa-tags"></i>
|
|
||||||
</span>
|
|
||||||
Tags
|
|
||||||
</h1>
|
|
||||||
<p class='subtitle is-4'>{{ terms | length }} tags in total</p>
|
|
||||||
<p>
|
|
||||||
{% for tag in terms %}
|
|
||||||
<a href="{{ get_taxonomy_url(kind='tags', name=tag.name) }}" class="mr-4">
|
|
||||||
<span class="icon">
|
|
||||||
<i class="fas fa-tag"></i>
|
|
||||||
</span>
|
|
||||||
<span>{{tag.name}} <sup>{{ tag.pages | length }}</sup></span>
|
|
||||||
</a>
|
|
||||||
{% endfor %}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
{% endblock content %}
|
|
|
@ -1,76 +0,0 @@
|
||||||
{% extends "base.html" %}
|
|
||||||
|
|
||||||
{% block header %}
|
|
||||||
<header class='hero'>
|
|
||||||
<div class='hero-body pb-0'>
|
|
||||||
<div class='container'>
|
|
||||||
<div class='has-text-centered'>
|
|
||||||
<h1 class="title">
|
|
||||||
<span class="icon-text">
|
|
||||||
<span class="icon">
|
|
||||||
<i class="fas fa-tag"></i>
|
|
||||||
</span>
|
|
||||||
<span>{{ term.name }}</span>
|
|
||||||
</span>
|
|
||||||
</h1>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<section class="section">
|
|
||||||
<div class="container">
|
|
||||||
<div class="columns is-centered">
|
|
||||||
<div class="column is-9">
|
|
||||||
{% if paginator %}
|
|
||||||
{% set pages = paginator.pages %}
|
|
||||||
{% else %}
|
|
||||||
{% set pages = term.pages %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% for page in pages %}
|
|
||||||
<article class="box">
|
|
||||||
<h2 class="title">
|
|
||||||
<a href='{{ page.permalink }}'>
|
|
||||||
{{ page.title }}
|
|
||||||
</a>
|
|
||||||
</h2>
|
|
||||||
<p class="subtitle">{{ page.description }}</p>
|
|
||||||
<div class="columns is-multiline is-gapless">
|
|
||||||
<div class="column is-8">
|
|
||||||
{{ macros::page_publish_metadata(page=page) }}
|
|
||||||
</div>
|
|
||||||
<div class="column is-4 has-text-right-desktop">
|
|
||||||
{{ macros::page_content_metadata(page=page) }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="content mt-2">
|
|
||||||
{{ page.summary | safe }}
|
|
||||||
<a href='{{ page.permalink }}'>
|
|
||||||
Read More
|
|
||||||
<span class="icon is-small">
|
|
||||||
<i class="fas fa-arrow-right fa-xs"></i>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column">
|
|
||||||
{% if page.taxonomies.categories %}
|
|
||||||
{{ macros::render_categories(categories=page.taxonomies.categories) }}
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
<div class="column has-text-right-desktop">
|
|
||||||
{% if page.taxonomies.tags %}
|
|
||||||
{{ macros::render_tags(tags=page.taxonomies.tags) }}
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
{% endblock content %}
|
|