mirror of
https://github.com/caddyserver/website.git
synced 2025-04-22 04:56:17 -04:00
Update site for 2.0; add v2 landing page with asciinema video; docs
This commit is contained in:
parent
144a639efc
commit
e52e32ba7d
14 changed files with 3775 additions and 10 deletions
|
@ -185,7 +185,7 @@ Set the upstream Host header to the address of the upstream (by default, it will
|
|||
|
||||
```
|
||||
reverse_proxy localhost:9000 {
|
||||
header_up Host {http.reverse_proxy.upstream.hostport}
|
||||
header_up Host {http.reverse_proxy.upstream.hostport}
|
||||
}
|
||||
```
|
||||
|
||||
|
@ -195,3 +195,11 @@ Reverse proxy to an HTTPS endpoint:
|
|||
reverse_proxy https://example.com
|
||||
```
|
||||
|
||||
Strip a path prefix then proxy:
|
||||
|
||||
```
|
||||
route /prefix/* {
|
||||
uri strip_prefix /prefix
|
||||
reverse_proxy localhost:9000
|
||||
}
|
||||
```
|
|
@ -22,6 +22,7 @@ tls [internal|<email>] | [<cert_file> <key_file>] {
|
|||
load <paths...>
|
||||
ca <ca_dir_url>
|
||||
ca_root <pem_file>
|
||||
dns <provider_name> [<params...>]
|
||||
on_demand
|
||||
}
|
||||
```
|
||||
|
@ -59,6 +60,7 @@ tls [internal|<email>] | [<cert_file> <key_file>] {
|
|||
- **load** specifies a list of folders from which to load PEM files that are certificate+key bundles.
|
||||
- **ca** changes the ACME CA endpoint. This is most often used to use [Let's Encrypt's staging endpoint](https://letsencrypt.org/docs/staging-environment/) or an internal ACME server. (To change this value for the whole Caddyfile, use the `acme_ca` [global option](/docs/caddyfile/options) instead.)
|
||||
- **ca_root** specifies a PEM file that contains a trusted root certificate for the ACME CA endpoint, if not in the system trust store.
|
||||
- **dns** enables the [DNS challenge](/docs/automatic-https#dns-challenge) using the given provider plugin, which must be from one of the [caddy-dns](https://github.com/caddy-dns) repositories. Each provider plugin may have their own syntax following their name; refer to their docs for details.
|
||||
- **on_demand** enables [on-demand TLS](/docs/automatic-https#on-demand-tls) for the hostnames given in the site block's address(es).
|
||||
|
||||
|
||||
|
@ -90,3 +92,11 @@ Specify an email address for your ACME account (but if only one email is used fo
|
|||
```
|
||||
tls your@email.com
|
||||
```
|
||||
|
||||
Enable the DNS challenge for a domain managed on Cloudflare with account credentials in an environment variable:
|
||||
|
||||
```
|
||||
tls {
|
||||
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
|
||||
}
|
||||
```
|
|
@ -19,7 +19,7 @@ Caddy is a powerful, extensible platform to serve your sites, services, and apps
|
|||
|
||||
and operates primarily at L4 (transport layer) and L7 (application layer) of the [OSI model](https://en.wikipedia.org/wiki/OSI_model), though it has the ability to work with other layers.
|
||||
|
||||
Configuration is both dynamic and exportable with [Caddy's API](/docs/api); no config files required. The format of the config document takes many forms with [config adapters](/docs/config-adapters), but Caddy's native config language is [JSON](/docs/json/).
|
||||
Configuration is both dynamic and exportable with [Caddy's API](/docs/api). Although no config files required, you can still use them; most people's favorite way of configuring Caddy is using the [Caddyfile](/docs/caddyfile). The format of the config document takes many forms with [config adapters](/docs/config-adapters), but Caddy's native config language is [JSON](/docs/json/).
|
||||
|
||||
Caddy compiles for all major platforms and has no dependencies.
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!--TODO: add class="current" to the current link-->
|
||||
<nav>
|
||||
<input type="search" id="search" placeholder="🔍 Search...">
|
||||
<a href="/v2">v2 <span class="new">new</span></a>
|
||||
<a href="https://github.com/caddyserver/caddy/releases">Download</a>
|
||||
<a href="/docs/">Documentation</a>
|
||||
<a href="https://github.com/caddyserver/caddy">GitHub</a>
|
||||
|
|
|
@ -24,11 +24,11 @@
|
|||
</h2>
|
||||
|
||||
<div class="download-container">
|
||||
<a href="https://github.com/caddyserver/caddy/releases" class="big blue button">Download 2.0 RC</a>
|
||||
<a href="https://github.com/caddyserver/caddy/releases" class="big blue button">Download</a>
|
||||
<br>
|
||||
then <a href="/docs/getting-started">learn how to get started</a>
|
||||
<br><br>
|
||||
<a href="https://github.com/caddyserver/caddy/releases/v1.0.5" class="gray button">Download v1.0</a>
|
||||
<br><br><br>
|
||||
<a href="https://github.com/caddyserver/caddy/releases/v1.0.5" class="gray button">Download v1.0 (obsolete)</a>
|
||||
<iframe src="https://ghbtns.com/github-btn.html?user=caddyserver&repo=caddy&type=star&count=true&size=large" frameborder="0" scrolling="0" width="160px" height="30px" class="github-stars"></iframe>
|
||||
<br>
|
||||
<small>Caddy is licensed with the Apache 2.0 open source license.</small>
|
||||
|
|
233
src/resources/321140.cast
Normal file
233
src/resources/321140.cast
Normal file
|
@ -0,0 +1,233 @@
|
|||
{"version": 2, "width": 79, "height": 20, "timestamp": 1587149050, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}}
|
||||
[0.022225, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
|
||||
[0.023339, "o", "\u001b]7;file://Shadowfax.local/Users/matt/demo\u0007"]
|
||||
[0.023501, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J \r\n\u001b[90m╔[\u001b[32m√ \u001b[38;5;81mmatt\u001b[90m@\u001b[38;5;82mShadowfax\u001b[90m:\u001b[38;5;81m~/demo\u001b[90m] \r\n╚>\u001b[39m% \u001b[K"]
|
||||
[0.023536, "o", "\u001b[?2004h"]
|
||||
[1.887934, "o", "n"]
|
||||
[2.000861, "o", "\bna"]
|
||||
[2.072314, "o", "n"]
|
||||
[2.148447, "o", "o"]
|
||||
[2.304342, "o", " "]
|
||||
[2.444706, "o", "C"]
|
||||
[2.564064, "o", "a"]
|
||||
[2.66464, "o", "d"]
|
||||
[2.825937, "o", "d"]
|
||||
[2.946425, "o", "y"]
|
||||
[3.129396, "o", "f"]
|
||||
[3.287358, "o", "i"]
|
||||
[3.359465, "o", "l"]
|
||||
[3.487032, "o", "e"]
|
||||
[3.66006, "o", "\u001b[?2004l\r\r\n"]
|
||||
[3.667071, "o", "\u001b[?1049h\u001b[1;20r\u001b(B\u001b[m\u001b[4l\u001b[?7h\u001b[?12l\u001b[?25h\u001b[?1h\u001b="]
|
||||
[3.667109, "o", "\u001b[?1h\u001b=\u001b[?1h\u001b="]
|
||||
[3.667473, "o", "\u001b[39;49m\u001b[39;49m\u001b(B\u001b[m\u001b[H\u001b[2J\u001b(B\u001b[0;7m GNU nano 2.0.6 File: Caddyfile \u001b[18;34H[ New File ]\r\u001b[19d^G\u001b(B\u001b[m Get Help \u001b(B\u001b[0;7m^O\u001b(B\u001b[m WriteOut \u001b(B\u001b[0;7m^R\u001b(B\u001b[m Read File \u001b(B\u001b[0;7m^Y\u001b(B\u001b[m Prev Page \u001b(B\u001b[0;7m^K\u001b(B\u001b[m Cut Text \u001b(B\u001b[0;7m^C\u001b(B\u001b[m Cur Pos\r\u001b[20d\u001b(B\u001b[0;7m^X\u001b(B\u001b[m Exit\u001b[14G\u001b(B\u001b[0;7m^J\u001b(B\u001b[m Justify \u001b(B\u001b[0;7m^W\u001b(B\u001b[m Where Is \u001b(B\u001b[0;7m^V\u001b(B\u001b[m Next Page \u001b(B\u001b[0;7m^U\u001b(B\u001b[m UnCut Text\u001b(B\u001b[0;7m^T\u001b(B\u001b[m To Spell\r\u001b[3d"]
|
||||
[4.535698, "o", "\u001b[1;70H\u001b(B\u001b[0;7mModified\r\u001b[3d\u001b(B\u001b[md"]
|
||||
[4.67723, "o", "e"]
|
||||
[4.755158, "o", "m"]
|
||||
[4.806295, "o", "o"]
|
||||
[5.029033, "o", "."]
|
||||
[5.165983, "o", "h"]
|
||||
[5.227794, "o", "t"]
|
||||
[5.353038, "o", "t"]
|
||||
[5.414159, "o", "p"]
|
||||
[5.523791, "o", "s"]
|
||||
[5.627998, "o", "."]
|
||||
[5.710455, "o", "d"]
|
||||
[5.840252, "o", "e"]
|
||||
[5.963799, "o", "v"]
|
||||
[6.647743, "o", "\r\u001b[4d"]
|
||||
[6.775947, "o", "\u001b[5d"]
|
||||
[6.933264, "o", "r"]
|
||||
[7.004905, "o", "o"]
|
||||
[7.122765, "o", "o"]
|
||||
[7.163639, "o", "t"]
|
||||
[7.244083, "o", " "]
|
||||
[7.346443, "o", "*"]
|
||||
[7.44394, "o", " "]
|
||||
[7.578595, "o", "/"]
|
||||
[7.826323, "o", "v"]
|
||||
[7.959474, "o", "\r\u001b[18d\u001b[K\u001b[5;10Ha"]
|
||||
[8.015511, "o", "r"]
|
||||
[8.103944, "o", "/"]
|
||||
[8.244526, "o", "w"]
|
||||
[8.52161, "o", "w"]
|
||||
[8.671104, "o", "w"]
|
||||
[9.968752, "o", "\r\u001b[6d"]
|
||||
[10.097106, "o", "\u001b[7d"]
|
||||
[10.218855, "o", "f"]
|
||||
[10.319563, "o", "i"]
|
||||
[10.391213, "o", "l"]
|
||||
[10.438339, "o", "e"]
|
||||
[10.606098, "o", "_"]
|
||||
[10.68185, "o", "s"]
|
||||
[10.767465, "o", "e"]
|
||||
[10.813916, "o", "r"]
|
||||
[11.008647, "o", "v"]
|
||||
[11.138442, "o", "e"]
|
||||
[11.178214, "o", "r"]
|
||||
[11.300523, "o", "\r\u001b[8d"]
|
||||
[11.477734, "o", "l"]
|
||||
[11.606149, "o", "o"]
|
||||
[11.66293, "o", "g"]
|
||||
[12.48292, "o", "\r\u001b[9d"]
|
||||
[12.649606, "o", "\u001b[10d"]
|
||||
[12.849532, "o", "#"]
|
||||
[13.198356, "o", " "]
|
||||
[13.299546, "o", "l"]
|
||||
[13.452749, "o", "o"]
|
||||
[13.51259, "o", "a"]
|
||||
[13.56063, "o", "d"]
|
||||
[13.690761, "o", " "]
|
||||
[13.771, "o", "b"]
|
||||
[13.911226, "o", "a"]
|
||||
[13.950191, "o", "l"]
|
||||
[14.047689, "o", "a"]
|
||||
[14.131014, "o", "n"]
|
||||
[14.214907, "o", "c"]
|
||||
[14.282838, "o", "e"]
|
||||
[14.325811, "o", " "]
|
||||
[14.466908, "o", "b"]
|
||||
[14.612588, "o", "e"]
|
||||
[14.685894, "o", "t"]
|
||||
[14.785785, "o", "w"]
|
||||
[14.84735, "o", "e"]
|
||||
[14.991994, "o", "e"]
|
||||
[15.089862, "o", "n"]
|
||||
[15.198188, "o", " "]
|
||||
[15.269788, "o", "t"]
|
||||
[15.32201, "o", "w"]
|
||||
[15.441701, "o", "o"]
|
||||
[15.517416, "o", " "]
|
||||
[15.614119, "o", "b"]
|
||||
[15.78414, "o", "a"]
|
||||
[15.869248, "o", "c"]
|
||||
[15.945455, "o", "k"]
|
||||
[16.028741, "o", "e"]
|
||||
[16.115068, "o", "n"]
|
||||
[16.19984, "o", "d"]
|
||||
[16.248232, "o", "s"]
|
||||
[16.442928, "o", "\r\u001b[11d"]
|
||||
[16.911683, "o", "r"]
|
||||
[16.97932, "o", "e"]
|
||||
[17.141613, "o", "v"]
|
||||
[17.282014, "o", "e"]
|
||||
[17.370161, "o", "r"]
|
||||
[17.490939, "o", "s"]
|
||||
[17.547477, "o", "e"]
|
||||
[17.740609, "o", "_"]
|
||||
[17.940825, "o", "p"]
|
||||
[17.992396, "o", "r"]
|
||||
[18.091587, "o", "o"]
|
||||
[18.185345, "o", "x"]
|
||||
[18.308829, "o", "y"]
|
||||
[18.361527, "o", " "]
|
||||
[18.651444, "o", "/"]
|
||||
[18.825604, "o", "a"]
|
||||
[18.904857, "o", "p"]
|
||||
[18.964969, "o", "i"]
|
||||
[19.188263, "o", "/"]
|
||||
[19.445601, "o", "*"]
|
||||
[19.505049, "o", " "]
|
||||
[20.21481, "o", "l"]
|
||||
[20.366859, "o", "o"]
|
||||
[20.442428, "o", "c"]
|
||||
[20.483119, "o", "a"]
|
||||
[20.542915, "o", "l"]
|
||||
[20.682475, "o", "h"]
|
||||
[20.747016, "o", "o"]
|
||||
[20.757983, "o", "s"]
|
||||
[20.845264, "o", "t"]
|
||||
[20.998991, "o", ":"]
|
||||
[21.173825, "o", "8"]
|
||||
[21.281686, "o", "0"]
|
||||
[21.84701, "o", "8"]
|
||||
[21.906424, "o", "0"]
|
||||
[22.062149, "o", " "]
|
||||
[22.305605, "o", "l"]
|
||||
[22.451357, "o", "o"]
|
||||
[22.520031, "o", "c"]
|
||||
[22.568039, "o", "a"]
|
||||
[22.632047, "o", "l"]
|
||||
[22.751563, "o", "h"]
|
||||
[22.816958, "o", "o"]
|
||||
[22.842836, "o", "s"]
|
||||
[22.914777, "o", "t"]
|
||||
[23.051619, "o", ":"]
|
||||
[23.221017, "o", "8"]
|
||||
[23.301663, "o", "0"]
|
||||
[23.679979, "o", "8"]
|
||||
[23.82229, "o", "1"]
|
||||
[25.554339, "o", "\r\u001b[18d\u001b(B\u001b[0;7mFile Name to Write: Caddyfile \u001b[19;14H\u001b(B\u001b[m \u001b(B\u001b[0;7m^T\u001b(B\u001b[m To Files \u001b(B\u001b[0;7mM-M\u001b(B\u001b[m Mac Format \u001b(B\u001b[0;7mM-P\u001b(B\u001b[m Prepend\u001b[K\u001b[20;2H\u001b(B\u001b[0;7mC\u001b(B\u001b[m Cancel \u001b(B\u001b[0;7mM-D\u001b(B\u001b[m DOS Format \u001b(B\u001b[0;7mM-A\u001b(B\u001b[m Append \u001b(B\u001b[0;7mM-B\u001b(B\u001b[m Backup File\u001b[K\u001b[18;30H"]
|
||||
[25.798317, "o", "\u001b[1;70H\u001b[39;49m\u001b(B\u001b[0;7m \u001b[18;31H\u001b(B\u001b[m\u001b[1K \u001b(B\u001b[0;7m[ Wrote 9 lines ]\u001b(B\u001b[m\u001b[K\u001b[19;14H\u001b(B\u001b[0;7m^O\u001b(B\u001b[m WriteOut \u001b(B\u001b[0;7m^R\u001b(B\u001b[m Read File \u001b(B\u001b[0;7m^Y\u001b(B\u001b[m Prev Page \u001b(B\u001b[0;7m^K\u001b(B\u001b[m Cut Text \u001b(B\u001b[0;7m^C\u001b(B\u001b[m Cur Pos\u001b[20;2H\u001b(B\u001b[0;7mX\u001b(B\u001b[m Exit \u001b(B\u001b[0;7m^J\u001b(B\u001b[m Justify \u001b(B\u001b[0;7m^W\u001b(B\u001b[m Where Is \u001b(B\u001b[0;7m^V\u001b(B\u001b[m Next Page \u001b(B\u001b[0;7m^U\u001b(B\u001b[m UnCut Text\u001b(B\u001b[0;7m^T\u001b(B\u001b[m To Spell\u001b[11;51H"]
|
||||
[26.578003, "o", "\r\u001b[19d\u001b[J\u001b[20;79H\u001b[20;1H\u001b[?1049l\r\u001b[?1l\u001b>"]
|
||||
[26.578762, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
|
||||
[26.57933, "o", "\u001b]7;file://Shadowfax.local/Users/matt/demo\u0007"]
|
||||
[26.579475, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J \r\n\u001b[90m╔[\u001b[32m√ \u001b[38;5;81mmatt\u001b[90m@\u001b[38;5;82mShadowfax\u001b[90m:\u001b[38;5;81m~/demo\u001b[90m] \r\n╚>\u001b[39m% \u001b[K\u001b[?2004h"]
|
||||
[28.181852, "o", "c"]
|
||||
[28.231774, "o", "\bca"]
|
||||
[28.339992, "o", "d"]
|
||||
[28.467448, "o", "d"]
|
||||
[28.551971, "o", "y"]
|
||||
[28.666558, "o", " "]
|
||||
[28.710012, "o", "s"]
|
||||
[28.773903, "o", "t"]
|
||||
[28.936621, "o", "a"]
|
||||
[28.995575, "o", "r"]
|
||||
[29.128429, "o", "t"]
|
||||
[30.256599, "o", "\u001b[?2004l\r\r\n"]
|
||||
[30.320169, "o", "2020/04/17 18:44:40.540\t\u001b[34mINFO\u001b[0m\tusing adjacent Caddyfile\r\n"]
|
||||
[30.322723, "o", "2020/04/17 18:44:40.543\t\u001b[34mINFO\u001b[0m\tadmin\tadmin endpoint started\t{\"address\": \"tcp/localhost:2019\", \"enforce_origin\": false, \"origins\": [\"localhost:2019\", \"[::1]:2019\", \"127.0.0.1:2019\"]}\r\n"]
|
||||
[30.322934, "o", "2020/04/17 12:44:40 [INFO][cache:0xc000849d10] Started certificate maintenance routine\r\n"]
|
||||
[30.322962, "o", "2020/04/17 18:44:40.543\t\u001b[34mINFO\u001b[0m\thttp\tserver is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS\t{\"server_name\": \"srv0\", \"https_port\": 443}\r\n2020/04/17 18:44:40.543\t\u001b[34mINFO\u001b[0m\thttp\tenabling automatic HTTP->HTTPS redirects\t{\"server_name\": \"srv0\"}\r\n"]
|
||||
[30.329471, "o", "2020/04/17 18:44:40.550\t\u001b[34mINFO\u001b[0m\ttls\tcleaned up storage units\r\n"]
|
||||
[30.32956, "o", "2020/04/17 18:44:40.550\t\u001b[34mINFO\u001b[0m\thttp\tenabling automatic TLS certificate management\t{\"domains\": [\"demo.https.dev\"]}\r\n"]
|
||||
[30.329848, "o", "2020/04/17 18:44:40.550\t\u001b[34mINFO\u001b[0m\tautosaved config\t{\"file\": \"/Users/matt/Library/Application Support/Caddy/autosave.json\"}\r\n2020/04/17 18:44:40.550\t\u001b[34mINFO\u001b[0m\tserving initial configuration\r\n"]
|
||||
[30.330126, "o", "Successfully started Caddy (pid=41376) - Caddy is running in the background\r\n"]
|
||||
[30.331898, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
|
||||
[30.332211, "o", "\u001b]7;file://Shadowfax.local/Users/matt/demo\u0007"]
|
||||
[30.332308, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J \r\n\u001b[90m╔[\u001b[32m√ \u001b[38;5;81mmatt\u001b[90m@\u001b[38;5;82mShadowfax\u001b[90m:\u001b[38;5;81m~/demo\u001b[90m] \r\n╚>\u001b[39m% \u001b[K\u001b[?2004h"]
|
||||
[30.336942, "o", "2020/04/17 12:44:40 [INFO][demo.https.dev] Obtain certificate; acquiring lock...\r\n"]
|
||||
[30.337162, "o", "2020/04/17 12:44:40 [INFO][demo.https.dev] Obtain: Lock acquired; proceeding...\r\n"]
|
||||
[31.96302, "o", "2020/04/17 12:44:42 [INFO][demo.https.dev] Waiting on rate limiter...\r\n2020/04/17 12:44:42 [INFO][demo.https.dev] Done waiting\r\n2020/04/17 12:44:42 [INFO] [demo.https.dev] acme: Obtaining bundled SAN certificate given a CSR\r\n"]
|
||||
[33.570607, "o", "2020/04/17 12:44:43 [INFO] [demo.https.dev] AuthURL: https://acme-v02.api.letsencrypt.org/acme/authz-v3/4019233382\r\n2020/04/17 12:44:43 [INFO] [demo.https.dev] acme: Could not find solver for: tls-alpn-01\r\n2020/04/17 12:44:43 [INFO] [demo.https.dev] acme: use http-01 solver\r\n2020/04/17 12:44:43 [INFO] [demo.https.dev] acme: Trying to solve HTTP-01\r\n"]
|
||||
[34.951173, "o", "2020/04/17 12:44:45 [INFO][demo.https.dev] Served key authentication (HTTP challenge)\r\n"]
|
||||
[34.989119, "o", "2020/04/17 12:44:45 [INFO][demo.https.dev] Served key authentication (HTTP challenge)\r\n"]
|
||||
[35.027001, "o", "2020/04/17 12:44:45 [INFO][demo.https.dev] Served key authentication (HTTP challenge)\r\n"]
|
||||
[35.104125, "o", "2020/04/17 12:44:45 [INFO][demo.https.dev] Served key authentication (HTTP challenge)\r\n"]
|
||||
[36.574519, "o", "2020/04/17 12:44:46 [INFO] [demo.https.dev] The server validated our request\r\n"]
|
||||
[36.575029, "o", "2020/04/17 12:44:46 [INFO] [demo.https.dev] acme: Validations succeeded; requesting certificates\r\n"]
|
||||
[37.414882, "o", "2020/04/17 12:44:47 [INFO] [demo.https.dev] Server responded with a certificate.\r\n"]
|
||||
[37.416159, "o", "2020/04/17 12:44:47 [INFO][demo.https.dev] Certificate obtained successfully\r\n2020/04/17 12:44:47 [INFO][demo.https.dev] Obtain: Releasing lock\r\n"]
|
||||
[39.497929, "o", "\u001b[?2004l\r\r\n"]
|
||||
[39.498104, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
|
||||
[39.498581, "o", "\u001b]7;file://Shadowfax.local/Users/matt/demo\u0007"]
|
||||
[39.498738, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J \r\n\u001b[90m╔[\u001b[32m√ \u001b[38;5;81mmatt\u001b[90m@\u001b[38;5;82mShadowfax\u001b[90m:\u001b[38;5;81m~/demo\u001b[90m] \r\n╚>\u001b[39m% \u001b[K\u001b[?2004h"]
|
||||
[40.091454, "o", "c"]
|
||||
[40.173651, "o", "\bcu"]
|
||||
[40.257827, "o", "r"]
|
||||
[40.350059, "o", "l"]
|
||||
[40.44162, "o", " "]
|
||||
[40.619544, "o", "-"]
|
||||
[40.993026, "o", "L"]
|
||||
[41.085153, "o", " "]
|
||||
[41.865854, "o", "d"]
|
||||
[41.982983, "o", "e"]
|
||||
[42.063097, "o", "m"]
|
||||
[42.113574, "o", "o"]
|
||||
[42.326516, "o", "."]
|
||||
[42.71396, "o", "h"]
|
||||
[42.773776, "o", "t"]
|
||||
[42.896163, "o", "t"]
|
||||
[42.935898, "o", "p"]
|
||||
[43.051751, "o", "s"]
|
||||
[43.155986, "o", "."]
|
||||
[43.238445, "o", "d"]
|
||||
[43.36391, "o", "e"]
|
||||
[43.459323, "o", "v"]
|
||||
[43.674326, "o", "\u001b[?2004l\r\r\n"]
|
||||
[43.703356, "o", "2020/04/17 18:44:53.923\t\u001b[34mINFO\u001b[0m\thttp.log.access\thandled request\t{\"request\": {\"method\": \"GET\", \"uri\": \"/\", \"proto\": \"HTTP/2.0\", \"remote_addr\": \"127.0.0.1:51883\", \"host\": \"demo.https.dev\", \"headers\": {\"User-Agent\": [\"curl/7.64.1\"], \"Accept\": [\"*/*\"]}, \"tls\": {\"resumed\": false, \"version\": 771, \"ciphersuite\": 49196, \"proto\": \"h2\", \"proto_mutual\": true, \"server_name\": \"demo.https.dev\"}}, \"common_log\": \"127.0.0.1 - - [17/Apr/2020:12:44:53 -0600] \\\"GET / HTTP/2.0\\\" 200 39\", \"latency\": 0.004248752, \"size\": 39, \"status\": 200, \"resp_headers\": {\"Server\": [\"Caddy\"], \"Etag\": [\"\\\"q8y3zo13\\\"\"], \"Content-Type\": [\"text/html; charset=utf-8\"], \"Last-Modified\": [\"Fri, 17 Apr 2020 18:43:00 GMT\"], \"Accept-Ranges\": [\"bytes\"], \"Content-Length\": [\"39\"]}}\r\n"]
|
||||
[43.703537, "o", "🔒 Easy HTTPS, just like that! 🎉\r\n\r\n"]
|
||||
[43.706045, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
|
||||
[43.706405, "o", "\u001b]7;file://Shadowfax.local/Users/matt/demo\u0007"]
|
||||
[43.706517, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J \r\n\u001b[90m╔[\u001b[32m√ \u001b[38;5;81mmatt\u001b[90m@\u001b[38;5;82mShadowfax\u001b[90m:\u001b[38;5;81m~/demo\u001b[90m] \r\n╚>\u001b[39m% \u001b[K\u001b[?2004h"]
|
||||
[48.347301, "o", "\u001b[?2004l\r\r\n"]
|
2563
src/resources/css/asciinema-player-2.6.1.css
Normal file
2563
src/resources/css/asciinema-player-2.6.1.css
Normal file
File diff suppressed because it is too large
Load diff
|
@ -57,10 +57,6 @@ header {
|
|||
height: 40px;
|
||||
}
|
||||
|
||||
#search {
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
header nav {
|
||||
text-align: right;
|
||||
line-height: 40px;
|
||||
|
@ -89,17 +85,31 @@ header nav > a.current {
|
|||
font-size: 14px;
|
||||
padding: 8px;
|
||||
background: none;
|
||||
width: 150px;
|
||||
width: 200px;
|
||||
max-width: 100%;
|
||||
margin-right: 20px;
|
||||
margin-top: 4px;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
#search:focus {
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.algolia-autocomplete .ds-dropdown-menu {
|
||||
width: 90%;
|
||||
max-width: 800px;
|
||||
}
|
||||
/* End Algolia search */
|
||||
|
||||
header nav .new {
|
||||
background-color: #ffe300;
|
||||
font-size: 75%;
|
||||
vertical-align: top;
|
||||
padding: 4px 8px;
|
||||
border-radius: 1em;
|
||||
}
|
||||
|
||||
header nav .button {
|
||||
margin: 0 0 0 10px;
|
||||
padding-top: 2px;
|
||||
|
|
391
src/resources/css/v2-landing.css
Normal file
391
src/resources/css/v2-landing.css
Normal file
|
@ -0,0 +1,391 @@
|
|||
body {
|
||||
background: #fcfcfc;
|
||||
}
|
||||
|
||||
#v2logo {
|
||||
width: 100%;
|
||||
max-width: 600px;
|
||||
margin: 100px auto 0;
|
||||
display: block;
|
||||
}
|
||||
|
||||
section {
|
||||
padding: 150px 0;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
p, ul, ol {
|
||||
font-size: 16px;
|
||||
line-height: 175%;
|
||||
max-width: 600px;
|
||||
margin: 0 auto 1.5em;
|
||||
}
|
||||
|
||||
ul, ol {
|
||||
margin-left: 2em;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-family: Montserrat;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.hero h1 {
|
||||
font-size: 40px;
|
||||
font-weight: normal;
|
||||
margin: 0 auto 50px;
|
||||
max-width: 650px;
|
||||
line-height: 120%;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font: 48px Inter;
|
||||
max-width: 1000px;
|
||||
text-align: center;
|
||||
margin: 0 auto 80px;
|
||||
}
|
||||
|
||||
.hero h2 {
|
||||
font-size: 22px;
|
||||
font-family: Montserrat;
|
||||
text-align: center;
|
||||
font-weight: normal;
|
||||
max-width: 800px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 22px;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
p + h3 {
|
||||
margin-top: 2em;
|
||||
}
|
||||
|
||||
.lead h3 {
|
||||
font-size: 32px;
|
||||
font-weight: bold;
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
|
||||
.lead p {
|
||||
font-size: 18px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.button {
|
||||
color: #fff;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.button:hover {
|
||||
color: #fff;
|
||||
filter: brightness(120%);
|
||||
}
|
||||
|
||||
.button.purple { background-color: #3a43be; /* #7615d7 */ }
|
||||
.button.cyan { background-color: #00a8dd; }
|
||||
.button.green { background-color: #00a80d; }
|
||||
|
||||
|
||||
code {
|
||||
background: #e7e7e7;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
img.smallstep {
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
.action {
|
||||
margin: 0 auto;
|
||||
text-align: center;
|
||||
font-size: 14px;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.action .button {
|
||||
padding: 15px 45px;
|
||||
color: #fff;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.asides {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 75px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.asides.top {
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.asides > * {
|
||||
flex: 1;
|
||||
margin-right: 50px;
|
||||
min-width: 0; /* kind of a hack that allows proper sizing of pre children; see https://weblog.west-wind.com/posts/2016/feb/15/flexbox-containers-pre-tags-and-managing-overflow */
|
||||
min-width: 300px;
|
||||
}
|
||||
|
||||
.asides > :last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.asides h2 {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.asides p {
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.thanks {
|
||||
width: 90%;
|
||||
max-width: 750px;
|
||||
padding: 2em;
|
||||
margin: 0 auto;
|
||||
padding: 40px;
|
||||
animation: colorchange 20s infinite;
|
||||
font-size: 16px;
|
||||
border: 20px solid;
|
||||
box-shadow: 0 15px 30px rgba(0, 0, 0, .15);
|
||||
}
|
||||
|
||||
@keyframes colorchange {
|
||||
from, to { border-color: #fd9898; }
|
||||
10% { border-color: #fdb998; }
|
||||
20% { border-color: #fdda98; }
|
||||
30% { border-color: #fdf298; }
|
||||
40% { border-color: #a0fd98; }
|
||||
50% { border-color: #98fdef; }
|
||||
60% { border-color: #98bbfd; }
|
||||
70% { border-color: #a098fd; }
|
||||
80% { border-color: #f598fd; }
|
||||
90% { border-color: #fd98be; }
|
||||
}
|
||||
|
||||
.thanks h2 {
|
||||
font-family: 'Dancing Script';
|
||||
font-size: 52px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.thanks .to {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.thanks .to a {
|
||||
margin: 10px;
|
||||
color: black;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.thanks .to a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.thanks .to img {
|
||||
width: 150px;
|
||||
max-height: 60px;
|
||||
/* width: 150px; */
|
||||
/* max-width: 150px; */
|
||||
}
|
||||
|
||||
.thanks .to .sponsors {
|
||||
font-size: 125%;
|
||||
flex-basis: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.thanks hr {
|
||||
max-width: 120px;
|
||||
border: none;
|
||||
border-top: 3px solid #dbdbdb;
|
||||
margin: 1em auto;
|
||||
}
|
||||
|
||||
.thanks p {
|
||||
line-height: 140%;
|
||||
max-width: none;
|
||||
margin: 0 0 1.5em;
|
||||
}
|
||||
|
||||
|
||||
.grid {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
text-align: center;
|
||||
font-size: 20px;
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
|
||||
.grid > div {
|
||||
margin-left: -1px;
|
||||
margin-bottom: -1px;
|
||||
flex-grow: 1;
|
||||
border: 1px solid #aaa;
|
||||
min-width: 33.3333%;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.grid > div b {
|
||||
font-weight: 300;
|
||||
font-family: Montserrat;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 6px;
|
||||
display: block;
|
||||
font-size: 140%;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.caption {
|
||||
margin-top: 10px;
|
||||
font-size: 14px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
asciinema-player {
|
||||
display: block;
|
||||
margin-bottom: 2em;
|
||||
}
|
||||
|
||||
.asciinema-player-wrapper .asciinema-player {
|
||||
box-shadow: -10px 10px 15px rgba(0, 0, 0, 0.25);
|
||||
transform: scale(1.1);
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.asciinema-terminal {
|
||||
border: none;
|
||||
padding: 10px;
|
||||
padding-bottom: 35px; /* for when the control bar is visible */
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.display {
|
||||
perspective: 1000px;
|
||||
}
|
||||
|
||||
|
||||
.display code {
|
||||
border-radius: 10px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.display code {
|
||||
max-width: 800px;
|
||||
font-size: 110%;
|
||||
display: block;
|
||||
position: relative;
|
||||
padding: 20px 40px;
|
||||
white-space: pre;
|
||||
font-weight: bold;
|
||||
overflow-x: auto;
|
||||
box-shadow: 10px 10px 25px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.display.right > * {
|
||||
transform: rotateY(-25deg);
|
||||
}
|
||||
.display.left > * {
|
||||
transform: rotateY(25deg);
|
||||
}
|
||||
|
||||
.display code.light {
|
||||
background: #fff linear-gradient(135deg, rgba(255,255,255,0) 0%,rgba(241,241,241,0.5) 46%,rgba(225,225,225,0.5) 46.5%,rgba(246,246,246,0) 100%);
|
||||
}
|
||||
|
||||
.display code.dark,
|
||||
.asciinema-terminal {
|
||||
background: #333 linear-gradient(135deg, rgba(0, 0, 0, 0) 0%,rgba(125, 125, 125, 0.5) 46%,rgba(45, 45, 45, 0.5) 46.5%,rgba(0, 0, 0, 0) 100%);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.blinking {
|
||||
animation: blinking 1s infinite;
|
||||
background-color: #fff;
|
||||
width: .5em;
|
||||
height: 1.2em;
|
||||
position: relative;
|
||||
top: 5px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
@keyframes blinking {
|
||||
0% { background-color: #fff; }
|
||||
45% { background-color: #fff; }
|
||||
60% { background-color: transparent; }
|
||||
99% { background-color: transparent; }
|
||||
100% { background-color: #fff; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.diagonal {
|
||||
padding: 200px 0;
|
||||
margin: 50px 0;
|
||||
}
|
||||
|
||||
.diagonal.up { transform: skewY(-5deg); }
|
||||
.diagonal.up > * { transform: skewY(5deg); }
|
||||
|
||||
.diagonal.down { transform: skewY(5deg); }
|
||||
.diagonal.down > * { transform: skewY(-5deg); }
|
||||
|
||||
section.gray {
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@media (max-width: 720px) {
|
||||
.display {
|
||||
margin-top: 50px;
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
.display.right > * {
|
||||
transform: none;
|
||||
}
|
||||
.display.left > * {
|
||||
transform: none;
|
||||
}
|
||||
.asides > * {
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
63
src/resources/images/apilayer-logo.svg
Normal file
63
src/resources/images/apilayer-logo.svg
Normal file
|
@ -0,0 +1,63 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="-301 240.1 355.9 81.9" style="enable-background:new -301 240.1 355.9 81.9;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#27344A;}
|
||||
.st1{fill:#0052CC;}
|
||||
</style>
|
||||
<g id="XMLID_37_">
|
||||
<path id="XMLID_45_" class="st0" d="M-164.5,297.9c0-0.6-0.7-0.9-1.2-0.5c-0.2,0.2-0.4,0.4-0.7,0.6c-0.7,0.6-1.4,1.1-2.1,1.5
|
||||
c-0.9,0.5-1.9,0.9-2.8,1.1c-1,0.2-2.1,0.4-3.2,0.4c-2.8,0-5.1-1-6.9-3c-1.9-2-2.8-4.6-2.8-7.8c0-2.5,0.5-4.6,1.4-6.2s2.3-2.9,4-3.8
|
||||
s3.9-1.6,6.4-2c2.5-0.4,5.2-0.7,7.9-0.9v-0.2c0-1.9-0.7-3.2-2-3.9c-1.3-0.7-3.2-1.1-5.8-1.1c-1.5,0-3.2,0.3-4.9,1
|
||||
c-1.7,0.6-3,1.1-3.7,1.5h-0.9v-7.8c0-0.3,0.2-0.6,0.5-0.7c1-0.3,2.4-0.6,4.3-0.9c2.2-0.4,4.4-0.6,6.6-0.6c5.3,0,9.1,1,11.4,2.9
|
||||
s3.5,5,3.5,9.1v22.7c0,0.4-0.3,0.7-0.7,0.7h-7.8c-0.4,0-0.7-0.3-0.7-0.7v-1.4H-164.5z M-164.5,290.6v-6.1c0-0.4-0.4-0.8-0.8-0.7
|
||||
c-1,0.1-2.1,0.3-3.3,0.4c-1.5,0.2-2.6,0.5-3.3,0.7c-0.9,0.3-1.6,0.9-2.1,1.5c-0.5,0.7-0.7,1.5-0.7,2.6c0,0.7,0.1,1.3,0.2,1.7
|
||||
c0.1,0.4,0.4,0.9,0.8,1.3c0.4,0.4,0.9,0.7,1.4,0.9c0.5,0.2,1.4,0.3,2.6,0.3c0.9,0,1.9-0.2,2.8-0.7c0.9-0.4,1.6-0.9,2.3-1.6
|
||||
C-164.6,291-164.5,290.8-164.5,290.6z"/>
|
||||
<path id="XMLID_44_" class="st0" d="M-116.5,282.3c0,2.8-0.4,5.4-1.1,7.8c-0.7,2.3-1.7,4.3-2.9,5.8c-1.2,1.6-2.6,2.8-4.2,3.6
|
||||
c-1.6,0.8-3.2,1.2-5,1.2c-1.6,0-3-0.2-4.2-0.6c-0.8-0.3-1.6-0.7-2.5-1.1c-0.5-0.3-1,0.1-1,0.6v12.3c0,0.4-0.3,0.7-0.7,0.7h-7.9
|
||||
c-0.4,0-0.7-0.3-0.7-0.7v-45.6c0-0.4,0.3-0.7,0.7-0.7h7.9c0.4,0,0.7,0.3,0.7,0.7v1.3c0,0.6,0.7,0.9,1.2,0.5
|
||||
c1.1-0.9,2.1-1.6,3.2-2.2c1.5-0.8,3.2-1.3,5.1-1.3c3.6,0,6.4,1.6,8.4,4.7C-117.5,272.5-116.5,276.8-116.5,282.3z M-126.1,282.5
|
||||
c0-3.3-0.5-5.8-1.4-7.3c-1-1.5-2.5-2.3-4.6-2.3c-0.9,0-1.8,0.2-2.7,0.5c-0.8,0.3-1.6,0.7-2.3,1.1c-0.2,0.1-0.3,0.4-0.3,0.6v16.4
|
||||
c0,0.3,0.2,0.6,0.4,0.7c0.5,0.2,1,0.3,1.5,0.4c0.7,0.1,1.4,0.1,2.1,0.1c2.5,0,4.3-0.9,5.5-2.6
|
||||
C-126.7,288.4-126.1,285.9-126.1,282.5z"/>
|
||||
<path id="XMLID_43_" class="st0" d="M-102.1,260.6h-6.1c-1,0-1.9-0.8-1.9-1.9v-4.6c0-1,0.8-1.9,1.9-1.9h6.1c1,0,1.9,0.8,1.9,1.9
|
||||
v4.6C-100.3,259.8-101.1,260.6-102.1,260.6z M-101.2,300h-7.9c-0.4,0-0.7-0.3-0.7-0.7v-33c0-0.4,0.3-0.7,0.7-0.7h7.9
|
||||
c0.4,0,0.7,0.3,0.7,0.7v33C-100.5,299.6-100.8,300-101.2,300z"/>
|
||||
<path id="XMLID_42_" class="st0" d="M-83.2,300h-7.9c-0.4,0-0.7-0.3-0.7-0.7V253c0-0.4,0.3-0.7,0.7-0.7h7.9c0.4,0,0.7,0.3,0.7,0.7
|
||||
v46.3C-82.5,299.6-82.8,300-83.2,300z"/>
|
||||
<path id="XMLID_41_" class="st0" d="M-56.2,297.9c0-0.6-0.7-0.9-1.2-0.5c-0.2,0.2-0.4,0.4-0.7,0.6c-0.7,0.6-1.4,1.1-2.1,1.5
|
||||
c-0.9,0.5-1.9,0.9-2.8,1.1c-1,0.2-2.1,0.4-3.2,0.4c-2.8,0-5.1-1-6.9-3c-1.9-2-2.8-4.6-2.8-7.8c0-2.5,0.5-4.6,1.4-6.2s2.3-2.9,4-3.8
|
||||
s3.9-1.6,6.4-2c2.5-0.4,5.2-0.7,7.9-0.9v-0.2c0-1.9-0.7-3.2-2-3.9c-1.3-0.7-3.2-1.1-5.8-1.1c-1.5,0-3.2,0.3-4.9,1
|
||||
c-1.7,0.6-3,1.1-3.7,1.5h-0.9v-7.8c0-0.3,0.2-0.6,0.5-0.7c1-0.3,2.4-0.6,4.3-0.9c2.2-0.4,4.4-0.6,6.6-0.6c5.3,0,9.1,1,11.4,2.9
|
||||
s3.5,5,3.5,9.1v22.7c0,0.4-0.3,0.7-0.7,0.7h-7.8c-0.4,0-0.7-0.3-0.7-0.7v-1.4H-56.2z M-56.2,290.6v-6.1c0-0.4-0.4-0.8-0.8-0.7
|
||||
c-1,0.1-2.1,0.3-3.3,0.4c-1.5,0.2-2.6,0.5-3.3,0.7c-0.9,0.3-1.6,0.9-2.1,1.5c-0.5,0.7-0.7,1.5-0.7,2.6c0,0.7,0.1,1.3,0.2,1.7
|
||||
c0.1,0.4,0.4,0.9,0.8,1.3s0.9,0.7,1.4,0.9c0.5,0.2,1.4,0.3,2.6,0.3c0.9,0,1.9-0.2,2.8-0.7c0.9-0.4,1.6-0.9,2.3-1.6
|
||||
C-56.2,291-56.2,290.8-56.2,290.6z"/>
|
||||
<path id="XMLID_40_" class="st0" d="M-24.7,285.6l5.8-19.5c0.1-0.3,0.4-0.5,0.7-0.5h8c0.5,0,0.8,0.5,0.7,0.9l-15.6,45.6
|
||||
c-0.1,0.3-0.4,0.5-0.7,0.5h-8.6c-0.5,0-0.8-0.5-0.7-0.9l4.2-11.7c0.1-0.1,0.1-0.3,0-0.5l-10.9-33c-0.2-0.5,0.2-0.9,0.7-0.9h8.3
|
||||
c0.3,0,0.6,0.2,0.7,0.5l6.1,19.5C-25.8,286.2-24.9,286.2-24.7,285.6z"/>
|
||||
<path id="XMLID_39_" class="st0" d="M23.8,284.8H4c-0.4,0-0.8,0.4-0.7,0.8c0.3,2.3,1.1,4.1,2.5,5.4c1.6,1.4,3.9,2.1,7,2.1
|
||||
c2,0,3.9-0.4,5.7-1.3c1.8-0.8,3.3-1.7,4.4-2.7h1v8.4c0,0.3-0.2,0.5-0.4,0.7c-1.9,0.9-3.8,1.6-5.5,2c-1.9,0.4-3.9,0.7-6.2,0.7
|
||||
c-5.8,0-10.3-1.6-13.4-4.7s-4.6-7.5-4.6-13.3c0-5.7,1.5-10.2,4.4-13.5c2.9-3.3,7-5,12.1-5c4.7,0,8.3,1.4,10.6,4.2
|
||||
c2.4,2.8,3.6,6.9,3.6,12.2v3.2C24.5,284.5,24.2,284.8,23.8,284.8z M14.5,278.3c0.4,0,0.7-0.3,0.7-0.7c-0.1-1.9-0.6-3.4-1.4-4.5
|
||||
c-0.9-1.2-2.3-1.7-4.3-1.7c-1.8,0-3.3,0.6-4.4,1.7c-1,1-1.7,2.5-1.9,4.5c0,0.4,0.3,0.8,0.7,0.8L14.5,278.3L14.5,278.3z"/>
|
||||
<path id="XMLID_38_" class="st0" d="M52.1,276.1h-0.8c-0.4-0.2-1-0.3-1.9-0.4s-1.6-0.1-2.2-0.1c-1.3,0-2.5,0.1-3.5,0.3
|
||||
c-0.9,0.2-1.8,0.5-2.8,0.9c-0.3,0.1-0.5,0.4-0.5,0.7v21.9c0,0.4-0.3,0.7-0.7,0.7h-7.9c-0.4,0-0.7-0.3-0.7-0.7v-33
|
||||
c0-0.4,0.3-0.7,0.7-0.7h7.9c0.4,0,0.7,0.3,0.7,0.7v2.7c0,0.6,0.7,0.9,1.2,0.5c1.5-1.4,2.9-2.4,4.1-3c1.5-0.7,2.9-1,4.2-1
|
||||
c0.3,0,0.7,0,1.1,0s0.8,0.1,1.1,0.1L52.1,276.1L52.1,276.1z"/>
|
||||
</g>
|
||||
<g id="XMLID_7_">
|
||||
<g id="XMLID_8_">
|
||||
<path id="XMLID_9_" class="st1" d="M-220.8,294.3l-4,5.2c-1.7,2.2-4.3,3.5-7,3.5h-40.8l-15.1-35.9c-1.1-2.6-0.7-5.6,1-7.8l3.3-4.4
|
||||
l16.5,39.4H-220.8z"/>
|
||||
</g>
|
||||
<path id="XMLID_1_" class="st1" d="M-220.3,288.4h-42.3l-15-35.8c-1.6-3.8,1.2-8,5.3-8h42.3l15,35.8
|
||||
C-213.4,284.2-216.2,288.4-220.3,288.4z"/>
|
||||
<g id="XMLID_10_">
|
||||
<path id="XMLID_11_" class="st1" d="M-232,308.8l-4,5.2c-1.7,2.2-4.3,3.5-7,3.5h-35.5c-2.6,0-4.9-1.5-5.9-3.9l-13.5-32.4
|
||||
c-1.2-2.9-0.8-6.3,1.1-8.8l3-3.9l16.9,40.3H-232z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5.3 KiB |
BIN
src/resources/images/smallstep.png
Normal file
BIN
src/resources/images/smallstep.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
BIN
src/resources/images/v2-landing.png
Normal file
BIN
src/resources/images/v2-landing.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 81 KiB |
1
src/resources/js/asciinema-player-2.6.1.min.js
vendored
Normal file
1
src/resources/js/asciinema-player-2.6.1.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
485
src/v2.html
Normal file
485
src/v2.html
Normal file
|
@ -0,0 +1,485 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Caddy 2</title>
|
||||
{{include "/includes/head.html"}}
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Dancing+Script:wght@700&display=swap">
|
||||
<link rel="stylesheet" href="/resources/css/asciinema-player-2.6.1.css">
|
||||
<link rel="stylesheet" href="/resources/css/v2-landing.css">
|
||||
<meta property="og:title" content="Introducing Caddy 2 - The Ultimate Server with Automatic HTTPS">
|
||||
<meta name="twitter:title" value="Introducing Caddy 2 - The Ultimate Server with Automatic HTTPS">
|
||||
</head>
|
||||
<body>
|
||||
<div class="hero">
|
||||
<div class="wrapper">
|
||||
<header>
|
||||
<div id="logo-container">
|
||||
<a href="/"><img src="/resources/images/caddy-wordmark.svg" id="logo" alt="Caddy"></a>
|
||||
</div>
|
||||
{{include "/includes/header-nav.html"}}
|
||||
</header>
|
||||
|
||||
<img src="/resources/images/v2-landing.png" id="v2logo" title="Caddy 2.0">
|
||||
|
||||
<h1>A new kind of <b>extensible platform</b> for server apps.</h1>
|
||||
|
||||
<h2>Still the only web server to use <b>TLS automatically and by default.</b> <b>Deploy and scale HTTPS effortlessly</b> with Caddy 2.</h2>
|
||||
|
||||
<div class="action">
|
||||
<a href="https://github.com/caddyserver/caddy/releases" class="big cyan button">Download</a>
|
||||
<a href="/docs/getting-started" class="big gray button">Get Started</a>
|
||||
<br>
|
||||
Caddy uses only the Apache 2.0 open source license.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<section class="lead">
|
||||
<div class="wrapper">
|
||||
<div class="asides">
|
||||
<div>
|
||||
<h3>All-new core ✨</h3>
|
||||
<p>
|
||||
After 14 months of redesign, Caddy 2 has a <a href="/docs/architecture">whole new architecture</a> inspired by 5 years of experience and feedback from v1.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<h3>Live config API ⚡️</h3>
|
||||
<p>
|
||||
Seamlessly <a href="/docs/api-tutorial">update your server's config</a> without downtime using elegant and intuitive <a href="/docs/api">REST endpoints</a>.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<h3>Fewer moving parts ⚙️</h3>
|
||||
<p>
|
||||
Caddy saves money, increases developer productivity, and reduces problems in production.
|
||||
</p>
|
||||
</div>
|
||||
<!-- <div>
|
||||
<h3>Configure your way 👨💻</h3>
|
||||
<p>
|
||||
Caddy's native config format is <a href="/docs/json/">JSON</a>, but you can use <a href="/docs/config-adapters">config adapters</a> to configure Caddy any way you prefer.
|
||||
</p>
|
||||
</div> -->
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
<section class="diagonal up gray">
|
||||
<div class="wrapper">
|
||||
<h2>A whole new server experience</h2>
|
||||
<div class="asides">
|
||||
<div>
|
||||
<div class="display left">
|
||||
<div class="caption">
|
||||
<asciinema-player src="/resources/321140.cast" cols="79" rows="20" preload="true" poster="npt:0:30" speed="1.5"></asciinema-player>
|
||||
Play screencast to see Caddy serve HTTPS in < 1 minute.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<p>
|
||||
Caddy is <b><a href="https://twitter.com/JackEllis/status/1250779043051388931">"really fun to use"</a></b> and <b>helps make complex deployments simpler</b>. Your Caddy site will have <b>fewer moving parts</b> which <b>lowers costs, increases productivity, and improves reliability</b>.
|
||||
</p>
|
||||
<p>
|
||||
Use Caddy's native <a href="/docs/json/">JSON configuration</a> to customize every inch of your server, or use the <a href="/docs/caddyfile">Caddyfile</a> to stand up a production site in just a few easy lines.
|
||||
</p>
|
||||
<p>
|
||||
With Caddy, <a href="/docs/automatic-https">HTTPS just works</a>; and you can configure and deploy your site in <a href="/docs/config-adapters">more ways</a> than you ever thought possible. The days of hacking your deployment workflows around the limitations of your web server are over!
|
||||
</p>
|
||||
<a href="/docs/quick-starts/https" class="green button">HTTPS quick-start</a>
|
||||
|
||||
<a href="/docs/v2-upgrade" class="gray button">Upgrade guide</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<div class="wrapper">
|
||||
<h2>More than just a web server</h2>
|
||||
<div class="asides">
|
||||
<div>
|
||||
<p>
|
||||
Caddy 2 is a <a href="/docs/extending-caddy">highly extensible</a>, self-hosted platform on which you can build, configure, and deploy long-running services ("apps").
|
||||
</p>
|
||||
<p>
|
||||
Caddy ships with apps for an <a href="/docs/modules/http">HTTPS server</a> (static files, reverse proxing, load balancing, etc.), <a href="/docs/modules/tls">TLS certificate manager</a>, and <a href="/docs/modules/pki">fully-managed internal PKI</a>. Caddy apps collaborate to make complex infrastructure just work with fewer moving parts.
|
||||
</p>
|
||||
<p>
|
||||
<b>For example, the config shown here keeps your TLS certificates renewed for other programs to use;</b> no external tools or HTTP daemon required!
|
||||
</p>
|
||||
<p>
|
||||
Providing a unified configuration, on-line <a href="/docs/api">config API</a>, and <a href="/docs/json/">automatic documentation</a> for all apps, Caddy is nearly infinitely extensible. Thanks to its unique <a href="/docs/architecture">modular architecture</a>, we can offer unlimited features without bloating the code base.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<div class="display right">
|
||||
<code class="light">{
|
||||
"apps": {
|
||||
"tls": {
|
||||
"certificates": {
|
||||
"automate": [
|
||||
"example.com",
|
||||
"example.net"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}</code></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-center">
|
||||
<a href="/docs/json/" class="purple button">Explore config</a>
|
||||
|
||||
<a href="/docs/modules/" class="gray button">See all modules</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<div class="thanks">
|
||||
<h2>Thank you</h2>
|
||||
<div class="to">
|
||||
<a href="https://apilayer.com" title="API Layer (business management)"><img src="/resources/images/apilayer-logo.svg" alt="API Layer"></a>
|
||||
<a href="https://ardanlabs.com" title="Ardan Labs (business support)"><img src="/resources/images/ardan-labs.svg" alt="Ardan Labs"></a>
|
||||
<a href="https://smallstep.com" title="Smallstep (special integration partner)"><img src="/resources/images/smallstep.png" alt="Smallstep"></a>
|
||||
</div>
|
||||
<div class="to">
|
||||
<a href="https://github.com/carlwgeorge" title="Fedora/CentOS/RedHat packaging">@carlwgeorge</a>
|
||||
<a href="https://github.com/Conan-Kudo" title="Fedora packaging">@Conan-Kudo</a>
|
||||
<a href="https://github.com/francislavoie" title="Community helper, code contributor">@francislavoie</a>
|
||||
<a href="https://github.com/hairyhenderson" title="Docker image">@hairyhenderson</a>
|
||||
<a href="https://github.com/Mohammed90" title="CI guru">@Mohammed90</a>
|
||||
<a href="https://github.com/sarge" title="Test suite">@sarge</a>
|
||||
<a href="https://github.com/whitestrake" title="Community helper">@whitestrake</a>
|
||||
<a href="https://github.com/sponsors/mholt" class="sponsors">And all other sponsors and contributors</a>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<p>
|
||||
As I feel our contributors and sponsors do not get enough recognition or appreciation, allow me to interrupt this release announcement with a personal, open letter to the above named...
|
||||
</p>
|
||||
<p>
|
||||
If you're reading this: <i>thank you</i>. You were the primary collaborators on Caddy 2, and this would not have been possible without you. You gave Caddy new <a href="https://github.com/caddyserver/dist">distribution packages</a>, <a href="https://hub.docker.com/_/caddy">containers</a>, docs, features, field testing; and <a href="https://caddy.community/u?period=all">helped countless users</a>. I think almost no topic in our <a href="https://caddy.community">community forums</a> has gone unanswered. That's truly amazing!
|
||||
</p>
|
||||
<p>
|
||||
Thanks for sticking with the project and believing in it enough to yield a second version. We've solved some hard problems together—usually during nights and weekends—and in days of isolation during this pandemic, no less.
|
||||
</p>
|
||||
<p>
|
||||
Now look at what we have made! Caddy is the only server that grants privacy to its sites' visitors <i>by default</i>. We've raised the bar for the rest of the Web. I hope you are as pleased with our results as I am. Millions more people will soon benefit from your contributions.
|
||||
</p>
|
||||
|
||||
– Matt
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<div class="wrapper">
|
||||
<div class="grid">
|
||||
<div>
|
||||
<b>Twenty</b>
|
||||
beta versions
|
||||
</div>
|
||||
<div>
|
||||
<b>Thousands</b>
|
||||
of businesses
|
||||
</div>
|
||||
<div>
|
||||
<b>Millions</b>
|
||||
of production hours
|
||||
</div>
|
||||
<div>
|
||||
<b>Billions</b>
|
||||
of connections secured
|
||||
</div>
|
||||
<div>
|
||||
<b>Trillions</b>
|
||||
of requests served
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
<b>Caddy 2 is production-ready.</b> It is already serving thousands of sites for businesses and has an unparalleled reliability record in the face of external factors that negatively affect HTTPS uptime. <b>Caddy stays up when other servers let you down.</b>
|
||||
</p>
|
||||
<p>
|
||||
Try your current server with tens of thousands of sites and certificates, then try them with Caddy – you'll see what we mean.
|
||||
</p>
|
||||
|
||||
<p class="text-center">
|
||||
<a href="https://hub.docker.com/_/caddy" class="cyan button">Deploy with <b>Docker</b></a>
|
||||
|
||||
<a href="https://marketplace.digitalocean.com/apps/caddy" class="blue button">Deploy on <b>DigitalOcean</b></a>
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<div class="wrapper">
|
||||
<h2>Familiar Caddyfile, now even better</h2>
|
||||
<div class="asides">
|
||||
<div>
|
||||
<div class="display left">
|
||||
<code class="light">caddyserver.com
|
||||
|
||||
root * src
|
||||
|
||||
file_server
|
||||
templates
|
||||
encode zstd gzip
|
||||
|
||||
redir /docs/json /docs/json/
|
||||
rewrite /docs/json/* /docs/json/index.html
|
||||
rewrite /docs/* /docs/index.html
|
||||
|
||||
reverse_proxy /api/* localhost:9002</code>
|
||||
<div class="caption">Actual config used by this site.</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<p>
|
||||
<b><a href="/docs/caddyfile">The Caddyfile</a> lets you get a production-ready site up and running in just a few lines.</b> It's not uncommon for Caddyfiles to be <a href="https://twitter.com/yakczar/status/713712646147743744">~15% the size of a less capable nginx.conf</a>!
|
||||
</p>
|
||||
<p>
|
||||
Although Caddy 2's <a href="/docs/config-adapters">native config language</a> is <a href="/docs/json/">JSON</a>, most users prefer the Caddyfile for its simplicity. In Caddy 2, we've kept the best parts of the Caddyfile and polished the rough parts.
|
||||
</p>
|
||||
<p>
|
||||
"Rewrite hacks" are no longer necessary in v2, because the Caddyfile now lets you <a href="/docs/caddyfile/matchers">match on any property</a> of the request—not just path. You also have <a href="/docs/caddyfile/directives/route">total control over your HTTP routes</a> when you need it.
|
||||
</p>
|
||||
<!-- <p>
|
||||
Even though the Caddyfile is improved, Caddy's <a href="/docs/json/">native JSON</a> is sometimes the most succinct and elegant way of expressing the right configuration for highly custom use cases.
|
||||
</p> -->
|
||||
<a href="/docs/caddyfile-tutorial" class="purple button">Caddyfile <b>tutorial</b></a>
|
||||
|
||||
<a href="/docs/caddyfile" class="gray button">Caddyfile <b>reference</b></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<section class="diagonal down gray">
|
||||
<div class="wrapper">
|
||||
<h2>Config API for dynamic, on-line updates</h2>
|
||||
<div class="asides">
|
||||
<div>
|
||||
<p>
|
||||
Caddy is <a href="/docs/api">configured through an intuitive REST API</a> that offers ACID guarantees:
|
||||
</p>
|
||||
<ul>
|
||||
<li><b>Atomic:</b> Multiple changes in a single request are treated as a single unit; any failed change aborts all the other changes.</li>
|
||||
<li><b>Consistent:</b> No invalid configurations can be loaded; your server will never break if a problem is detected at config load.</li>
|
||||
<li><b>Isolated:</b> No config changes rely on another. (It helps that HTTP is a stateless protocol!)</li>
|
||||
<li><b>Durable:</b> Caddy automatically persists the current, valid configuration to disk and can safely resume it after a power cycle if the <code>--resume</code> flag is used.</li>
|
||||
</ul>
|
||||
<p>
|
||||
In addition, Caddy's API is <b>safely scoped</b>, meaning the URI path restricts changes, making it impossible to accidentally alter other parts of your config.
|
||||
</p>
|
||||
<a href="/docs/api-tutorial" class="cyan button">API <b>tutorial</b></a>
|
||||
|
||||
<a href="/docs/api" class="gray button">API <b>reference</b></a>
|
||||
</div>
|
||||
<div>
|
||||
<div class="display right">
|
||||
<code class="dark">$ caddy start --config caddy.json
|
||||
|
||||
$ curl localhost:2019/id/my_handler \
|
||||
-X PATCH \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"handler": "static_response",
|
||||
"body": "Work smarter, not harder."
|
||||
}'
|
||||
|
||||
$ curl localhost:2019/config/ | jq<div class="blinking"></div></code>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<div class="wrapper">
|
||||
<h2>Powered by ... nginx.conf? 🤔</h2>
|
||||
<div class="asides">
|
||||
<div>
|
||||
<div class="display left">
|
||||
<code class="dark">$ caddy run \
|
||||
--config nginx.conf \
|
||||
--adapter nginx</code>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<p>
|
||||
Sure, why not!
|
||||
</p>
|
||||
<p>
|
||||
With first-class support for <a href="/docs/config-adapters">config adaptation</a>, <b>you can use whatever configuration language you prefer</b>, such as <a href="https://github.com/caddyserver/nginx-adapter">NGINX config files</a>! Several other config adapters are already available, including JSONC, JSON5, YAML, and CUE.
|
||||
</p>
|
||||
<p>
|
||||
Our <a href="https://github.com/caddyserver/nginx-adapter">NGINX adapter</a> is still a work in progress, but for some of you Caddy could be a drop-in <strike>replacement</strike> upgrade for NGINX, with memory safety!
|
||||
</p>
|
||||
<!-- <p>
|
||||
Fewer moving parts means fewer failures, lower costs, and less sunk time.
|
||||
</p> -->
|
||||
<a href="/docs/config-adapters" class="gray button">Config adapters</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
<section class="diagonal up gray">
|
||||
<div class="wrapper">
|
||||
<h2>Every site on HTTPS – including local and internal sites</h2>
|
||||
<div class="asides">
|
||||
<div>
|
||||
<p>
|
||||
Caddy has always been known for serving sites over <a href="/docs/automatic-https">HTTPS by default</a>, and now we're extending that to internal and local development sites, too.
|
||||
</p>
|
||||
<p>
|
||||
<b>Powered by open source <a href="https://smallstep.com/certificates/">Smallstep libraries</a>, Caddy automatically acts as a fully-featured, self-hosted CA when necessary.</b> If you configure sites with local or internal addresses (e.g. localhost or IP addresses), Caddy will still serve them over HTTPS using its locally-trusted certificate authority with short-lived, auto-renewing certificates. This makes it easy to mimic production environments in dev!
|
||||
</p>
|
||||
<a href="https://smallstep.com" title="Powered by Smallstep"><img src="/resources/images/smallstep.png" alt="Smallstep" class="smallstep"></a>
|
||||
</div>
|
||||
<div>
|
||||
<div class="display right">
|
||||
<code class="light">192.168.1.10 {
|
||||
respond "Hello from HTTPS!"
|
||||
}
|
||||
|
||||
http://localhost {
|
||||
respond "Plain HTTP"
|
||||
}</code>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<div class="wrapper">
|
||||
<h2>We fixed all known limitations of v1</h2>
|
||||
<p>
|
||||
With an <a href="/docs/architecture">all-new architecture</a>, the development of Caddy 2 closed <a href="https://github.com/caddyserver/caddy/issues?q=is%3Aclosed+v2">about 400 issues</a> and solved all known limitations on Caddy 1 caused by fundamental design constraints.
|
||||
</p>
|
||||
<p>
|
||||
Caddy 2 is designed to be highly flexible when needed, but also highly focused on its core competency. If there was anything in Caddy 1 that felt out of place or hacky, it won't in v2.
|
||||
</p>
|
||||
<p>
|
||||
This design was an incredible undertaking: of the approximate 14 months spent developing Caddy 2, only about 7 of them actually consisted of writing code; the other half was solely focused on the design of the underlying architecture.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<section class="diagonal down gray">
|
||||
<div class="wrapper">
|
||||
<h2>Keeps your sites online when other servers... don't</h2>
|
||||
<p>
|
||||
Caddy has the most robust TLS stack on the market. With <b>stronger memory safety guarantees</b> than OpenSSL (Apache & NGINX) and <b>more advanced certificate automation logic</b> than any other server or utility, Caddy <b>keeps your sites online</b> through problems that other servers don't handle.
|
||||
</p>
|
||||
<br><br>
|
||||
<div class="asides top">
|
||||
<div>
|
||||
<h3>Advanced TLS automation</h3>
|
||||
<p>
|
||||
Caddy was the first server to fully automate public certificate management—so we've been doing this longer than anyone. With more than 5 million certificates under management, Caddy has set the gold standard for other servers to live up to:
|
||||
</p>
|
||||
<ul>
|
||||
<li><b>Async management.</b> Certificate automation never blocks the main thread of the web server.</li>
|
||||
<li><b>Gentle retries.</b> Failed validation attempts are retried with exponential backoff for up to 1 month. They don't count against normal rate limits; Caddy uses staging/test endpoints during retries.</li>
|
||||
<li><b>OCSP stapling and caching.</b> Caddy staples OCSP to all qualifying certificates and keeps them conservatively fresh. It even caches them to disk in case of extended OCSP responder outages.</li>
|
||||
<li><b>Auto-replace after revocation.</b> If the latest OCSP staple indicates a revocation, Caddy automatically replaces the revoked certificate with a new one.</li>
|
||||
<li><b>Storage pre-checks.</b> Before attempting costly or valuable ACME transactions, Caddy checks to ensure its storage space is sufficient and writeable.</li>
|
||||
<li><b>Internal throttling and job scheduling.</b> Give Caddy a million certs to manage: no problem, it will gracefully manage them as fast as it can without hammering the CA or duplicating jobs over a long period of time.</li>
|
||||
<li><b>TLS session ticket key rotation.</b> Caddy automatically rotates TLS 1.2 session ticket keys for better privacy. It can even do this across a cluster!</li>
|
||||
<li><b>Fleet coordination.</b> All Caddy instances configured for the same storage backend will automatically share certificate and coordinate management in its cluster.</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<h3>Real-life examples</h3>
|
||||
<p>
|
||||
In 2018, several popular sites went down for many users of mainstream clients because crucial OCSP infrastructure had an extended outage. Only Caddy staples and caches OCSP responses by default, so all Caddy sites were unaffected.
|
||||
</p>
|
||||
<p>
|
||||
More recently in 2020, a mass certificate revocation event left many sysadmins scrambling to renew their certificates ahead of schedule. Caddy automatically renews certificates that get revoked, and all Caddy sites were unaffected.
|
||||
</p>
|
||||
<p>
|
||||
Companies have deployed Caddy in front of their site just hours before important audits—potentially saving their compliance status—because of Caddy's safe defaults and "batteries included" approach.
|
||||
</p>
|
||||
<!-- <p>
|
||||
Severa customers have been able to replace piles of scripts, external dependencies, and convoluted deployment workflows with Caddy, which manages complex parts of their infrastructure for them.
|
||||
</p> -->
|
||||
|
||||
<h3>Recommended by experts</h3>
|
||||
<p>
|
||||
<b>"TLS must be enabled by default ... and the Caddy web server is a good and usable example."</b> —<a href="https://www.usenix.org/conference/usenixsecurity17/technical-sessions/presentation/krombholz">Krombholz et al., USENIX 2017</a>
|
||||
</p>
|
||||
<p>
|
||||
<b>"Caddy is impressive. This is what we want, setting up a secure website."</b> —<a href="https://www.youtube.com/watch?v=OE5UhQGg_Fo">Josh Aas, Executive Director, Let's Encrypt</a>
|
||||
</p>
|
||||
<p>
|
||||
<b>"No popular server software does [session ticket key rotation], with the exception of Caddy."</b> —<a href="https://dl.acm.org/doi/10.1145/2987443.2987480">Springall et al., ACM IMC 2016</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<section>
|
||||
<div class="wrapper">
|
||||
<h2>There's more around the corner</h2>
|
||||
<p>
|
||||
We already have a number of features to land in the <a href="https://github.com/caddyserver/caddy/milestone/36">upcoming 2.1 release</a>:
|
||||
</p>
|
||||
<p>
|
||||
<b>Client certificate auto-renew.</b> Caddy will be able to <a href="https://github.com/caddyserver/caddy/pull/3198">automatically renew its client certificates</a> used in mTLS, just like it auto-renews its server certificates. You can customize which CA is used for both!
|
||||
</p>
|
||||
<p>
|
||||
<b><a href="https://github.com/caddyserver/caddy/pull/3198">Embedded ACME server.</a></b> No need for extra tooling to achieve fully-automated, trusted mTLS within your network! Caddy has partnered with <a href="https://smallstep.com/certificates/">Smallstep</a> to use their open source libraries to bring you internal/mutual TLS that just works.
|
||||
</p>
|
||||
<p>
|
||||
<b>Numerous Caddyfile improvements.</b> For example: <a href="https://github.com/caddyserver/caddy/pull/3242">enclosing tokens in backticks</a> <code>`</code> makes it easier to express literal JSON; <a href="https://github.com/caddyserver/caddy/pull/3255">special subdirectives for customizing <code>php_fastcgi</code></a>, <a href="https://github.com/caddyserver/caddy/pull/3263">syntax improvements for named matchers</a>, and more advanced routing and error handling capabilities.
|
||||
</p>
|
||||
<p>
|
||||
<b>HTTP/2 over cleartext (H2C).</b> For both <a href="https://github.com/caddyserver/caddy/issues/3218">upstreams</a> and <a href="https://github.com/caddyserver/caddy/issues/3227">downstreams</a>, Caddy 2.1 will be able to serve and proxy plaintext HTTP/2 if required.
|
||||
</p>
|
||||
<p>
|
||||
<b>And much more.</b> There are dozens of open issues, most of which are feature requests! We have our work cut out for us. Won't you <a href="https://github.com/caddyserver/caddy/issues">get involved</a>?
|
||||
</p>
|
||||
|
||||
<br><br>
|
||||
|
||||
<div class="action">
|
||||
<a href="https://github.com/caddyserver/caddy/releases" class="big cyan button">Download</a>
|
||||
<a href="/docs" class="big gray button">Documentation</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
{{include "/includes/footer.html"}}
|
||||
|
||||
<script src="/resources/js/asciinema-player-2.6.1.min.js"></script>
|
||||
</body>
|
||||
</html>
|
Loading…
Add table
Add a link
Reference in a new issue