diff --git a/.codespellrc b/.codespellrc
index 613604461..299f3f76f 100644
--- a/.codespellrc
+++ b/.codespellrc
@@ -1,3 +1,3 @@
[codespell]
skip = ./www/docs/reference/api/*.mdx,./erl_crash.dump,./apps/fz_http/erl_crash.dump,./cover,./vendor,./omnibus,*.json,yarn.lock,seeds.exs,./**/node_modules,./deps,./priv/static,./priv/plts,./**/priv/static,./.git,./www/build,./_build
-ignore-words-list = keypair,keypairs,iif,statics,wee
+ignore-words-list = crate,keypair,keypairs,iif,statics,wee
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index 8f92dae80..81b2a4bb8 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -17,23 +17,23 @@ diverse, inclusive, and healthy community.
Examples of behavior that contributes to a positive environment for our
community include:
-* Demonstrating empathy and kindness toward other people
-* Being respectful of differing opinions, viewpoints, and experiences
-* Giving and gracefully accepting constructive feedback
-* Accepting responsibility and apologizing to those affected by our mistakes,
+- Demonstrating empathy and kindness toward other people
+- Being respectful of differing opinions, viewpoints, and experiences
+- Giving and gracefully accepting constructive feedback
+- Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
-* Focusing on what is best not just for us as individuals, but for the
+- Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
-* The use of sexualized language or imagery, and sexual attention or
+- The use of sexualized language or imagery, and sexual attention or
advances of any kind
-* Trolling, insulting or derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or email
+- Trolling, insulting or derogatory comments, and personal or political attacks
+- Public or private harassment
+- Publishing others' private information, such as a physical or email
address, without their explicit permission
-* Other conduct which could reasonably be considered inappropriate in a
+- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
@@ -106,7 +106,7 @@ Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
-standards, including sustained inappropriate behavior, harassment of an
+standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b67e860d8..041c21146 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -5,25 +5,25 @@ started.
## Table of Contents
-* [Overview](#overview)
-* [Developer Environment Setup](#developer-environment-setup)
- * [Docker Setup](#docker-setup)
- * [Docker Caveat](#docker-caveat)
- * [Local HTTPS](#local-https)
- * [asdf-vm](#asdf-vm)
- * [Pre-commit](#pre-commit)
- * [The .env File](#the-env-file)
- * [Bootstrapping](#bootstrapping)
- * [Ensure Everything Works](#ensure-everything-works)
-* [Reporting Bugs](#reporting-bugs)
-* [Opening a Pull Request](#opening-a-pull-request)
- * [Run Tests](#run-tests)
- * [Unit Tests](#unit-tests)
- * [End-to-end Tests](#end-to-end-tests)
- * [Use Detailed Commit Messages](#use-detailed-commit-messages)
- * [Ensure Static Analysis Checks Pass](#ensure-static-analysis-checks-pass)
-* [Code of Conduct](#code-of-conduct)
-* [Asking for Help](#asking-for-help)
+- [Overview](#overview)
+- [Developer Environment Setup](#developer-environment-setup)
+ - [Docker Setup](#docker-setup)
+ - [Docker Caveat](#docker-caveat)
+ - [Local HTTPS](#local-https)
+ - [asdf-vm](#asdf-vm)
+ - [Pre-commit](#pre-commit)
+ - [The .env File](#the-env-file)
+ - [Bootstrapping](#bootstrapping)
+ - [Ensure Everything Works](#ensure-everything-works)
+- [Reporting Bugs](#reporting-bugs)
+- [Opening a Pull Request](#opening-a-pull-request)
+ - [Run Tests](#run-tests)
+ - [Unit Tests](#unit-tests)
+ - [End-to-end Tests](#end-to-end-tests)
+ - [Use Detailed Commit Messages](#use-detailed-commit-messages)
+ - [Ensure Static Analysis Checks Pass](#ensure-static-analysis-checks-pass)
+- [Code of Conduct](#code-of-conduct)
+- [Asking for Help](#asking-for-help)
## Overview
@@ -50,8 +50,7 @@ environment with working nftables and WireGuard subsystems for live development.
### Docker Setup
-We recommend [Docker Desktop](
-https://docs.docker.com/engine/install/#desktop)
+We recommend [Docker Desktop](https://docs.docker.com/engine/install/#desktop)
even if you're developing on Linux. This is what the Firezone core devs use and
comes with `compose` included.
@@ -61,8 +60,7 @@ Routing packets from the host's WireGuard client through the Firezone compose
cluster and out to the external network will not work. This is because Docker
Desktop
[rewrites the source address from containers to appear as if they originated the
-host](
-https://www.docker.com/blog/how-docker-desktop-networking-works-under-the-hood/)
+host](https://www.docker.com/blog/how-docker-desktop-networking-works-under-the-hood/)
, causing a routing loop:
1. Packet originates on Host
@@ -138,8 +136,8 @@ Firezone Docker services. By connecting to Firezone from the `client`
container, you can test the WireGuard tunnel is set up correctly by pinging the
`caddy` container:
-* `docker compose exec client ping 172.28.0.99`
-* `docker compose exec client curl -k 172.28.0.99:8443/hello`: this
+- `docker compose exec client ping 172.28.0.99`
+- `docker compose exec client curl -k 172.28.0.99:8443/hello`: this
should return `HELLO` text.
If the above commands indicate success, you should be good to go!
@@ -154,19 +152,19 @@ issues as well.
If it's not there, please open a new issue and include the following:
-* Description of the problem
-* Expected behavior
-* Steps to reproduce
-* Estimated impact: High/Medium/Low
-* Firezone version
-* Platform architecture (amd64, aarch64, etc)
-* Linux distribution
-* Linux kernel version
+- Description of the problem
+- Expected behavior
+- Steps to reproduce
+- Estimated impact: High/Medium/Low
+- Firezone version
+- Platform architecture (amd64, aarch64, etc)
+- Linux distribution
+- Linux kernel version
## Opening a Pull Request
We love pull requests! To ensure your pull request gets reviewed and merged
-swiftly, please read the below *before* opening a pull request.
+swiftly, please read the below _before_ opening a pull request.
### Run Tests
@@ -218,5 +216,4 @@ pre-commit run --all-files
## Asking For Help
-If you get stuck, don't hesitate to ask for help on our [community forums](
-https://discourse.firez.one/?utm_source=contributing).
+If you get stuck, don't hesitate to ask for help on our [community forums](https://discourse.firez.one/?utm_source=contributing).
diff --git a/README.md b/README.md
index 2a177cb37..f25ac417f 100644
--- a/README.md
+++ b/README.md
@@ -77,7 +77,7 @@ community support options:
or make a contribution to Firezone.
If you need help deploying or maintaining Firezone for your business, consider
-[contacting us about our paid support plan](https://www.firezone.dev/contact/sales?utm_source=readme).
+[contacting us about our paid support plan](https://www.firezone.dev/sales?utm_source=readme).
## Star History
diff --git a/apps/fz_http/lib/fz_http_web/live/setting_live/account_live.ex b/apps/fz_http/lib/fz_http_web/live/setting_live/account_live.ex
index 7ecb376df..40dda766e 100644
--- a/apps/fz_http/lib/fz_http_web/live/setting_live/account_live.ex
+++ b/apps/fz_http/lib/fz_http_web/live/setting_live/account_live.ex
@@ -108,6 +108,6 @@ defmodule FzHttpWeb.SettingLive.Account do
defp subscribe_link do
tid = Application.get_env(:fz_http, :telemetry_id)
- "https://www.firezone.dev/contact/sales?utm_source=product&uid=#{tid}"
+ "https://www.firezone.dev/sales?utm_source=product&uid=#{tid}"
end
end
diff --git a/www/CNAME b/www/CNAME
index 63b975484..795296e60 100644
--- a/www/CNAME
+++ b/www/CNAME
@@ -1 +1 @@
-docs.firezone.dev
+www.firezone.dev
diff --git a/www/blog/2022-07-25-release-0-5-0/index.mdx b/www/blog/2022-07-25-release-0-5-0/index.mdx
new file mode 100644
index 000000000..ba254b989
--- /dev/null
+++ b/www/blog/2022-07-25-release-0-5-0/index.mdx
@@ -0,0 +1,138 @@
+---
+slug: release-0-5-0
+title: Release 0.5.0
+authors: [jamil]
+tags: [release, beta, acme, reverse proxy, docs]
+---
+
+## Firezone 0.5 Released!
+
+As the first post on our new blog, we thought it'd be fitting to kick things
+off with a release announcement. So without further ado, we're excited to
+announce: Firezone [0.5.0 is
+here](https://github.com/firezone/firezone/releases)! It's packed with new
+features, bug fixes, and other improvements — more on that below.
+
+But first, we'd like to clarify our plan for plan for pricing.
+
+### Free as in… forever?
+
+One question we often get asked is, how much does Firezone cost? Well, now
+we're able to offer some clarification around pricing. **Starting with 0.5.0,
+Firezone will be entering public beta.** What's that mean for you? Two things:
+
+- We'll be experimenting with different tiers and pricing structures based on
+ an open-core business model. We plan to **always** have a version of the
+ product free to use, forever. See our [new pricing
+ page](https://firezone.dev/pricing) for more information.
+- **Edit**: The Beta program is now closed. Thanks to all who participated!
+ ~~Anyone participating in the public beta program **will receive a license key good
+ for up to one year of** Firezone Team or Business. It's our way of saying
+ thanks for being an early adopter and joining the program.~~
+
+Now that that's out of the way, let's talk about all the new features in
+0.5.0!
+
+### User-scoped egress rules
+
+Rules can now optionally receive a user scope, limiting the rule's application
+only to devices owned by that user. This allows you to selectively allow or
+deny traffic from a particular user to an IP, set of IPs, or CIDR range.
+
+### Auto-renewed, ECDSA-backed, ACME-powered SSL certificates
+
+One of our most-requested features is now available — Firezone 0.5.0 supports
+ACME SSL certificate renewal backed by Let's Encrypt's new ECDSA key type.
+Other providers and key types are available too. See all ACME configuration
+options in our [configuration file
+reference](/docs/reference/configuration-file/).
+
+**Note**: ACME is disabled by default to remain compatible with existing
+Firezone installations. To enable, set the following in your config file:
+
+```
+default['firezone']['ssl']['acme']['enabled'] = true
+```
+
+### BYORP: Bring Your Own Reverse Proxy
+
+Want to disable Nginx and deploy Firezone under your own reverse proxy or HTTP
+load balancer? Well, now you can! We've documented the required headers and
+other configuration necessary to make this happen. [Check the
+docs](/docs/deploy/advanced/reverse-proxy) for some configuration
+examples for popular proxies. In short:
+
+Set the
+`default['firezone']['phoenix']['external_trusted_proxies']`
+configuration variable to a comma-separated list containing the proxies
+you'd like to receive forwarded requests from. If your proxy uses an
+[RFC1918 address](https://en.wikipedia.org/wiki/Private_network), add its
+IP to `default['firezone']['phoenix']['private_clients']` instead of
+`default['firezone']['phoenix']['external_trusted_proxies']`.
+Update your proxy's configuration to point to Firezone, making sure to set
+the `X-Forwarded-For` header and enable WebSocket connection upgrades.
+
+**Note:** ACME support is tied to Nginx. If you disable the bundled
+Firezone Nginx service, you'll need to provide your own SSL certificates
+(or configure ACME renewal manually).
+
+**Additional note:** If you go this route, you'll need to terminate SSL
+yourself — Firezone sets the secure attribute on all cookies and thus
+requires the downstream proxy to terminate SSL.
+
+### Runtime configuration available in the UI
+
+Some Firezone configuration settings are now configurable in the product UI
+under the Security settings. This will override anything you have set in the
+config file. Moving runtime configuration into the application itself brings us
+a step closer to Docker-based deployments (coming Soon™).
+
+### New and improved documentation
+
+Our docs have been migrated from Jekyll to [Docusaurus](https://docusaurus.io).
+Aside from all the Formatting is improved, user guides are updated and many
+pages have been edited for clarify and further detail. As an added bonus, our
+docs are feature improved search thanks to the powerful search functionality
+provided by [DocSearch by Algolia](https://docsearch.algolia.com/).
+Contributions welcome!
+
+### Red Hat and Debian package repositories
+
+If you're on one of our [supported
+distros](/docs/deploy/omnibus/supported-platforms/) (or its
+derivatives), the one-line install script will automatically install Firezone
+from our package repository and track further updates from there. This means
+your Firezone installation can be managed like any other package on your system
+and will be marked for upgrades by the same apt and yum tools you're already
+familiar with. Be sure to check the [upgrade
+notes](/docs/administer/upgrade/) prior to each
+upgrade in case there are any backwards-incompatible changes or manual steps
+involved.
+
+If you've got an existing installation and still want to add our package
+repository for easier package management, just follow the [relevant
+section](/docs/deploy/omnibus) in the manual
+install guide.
+
+### Smaller package sizes
+
+Speaking of packages, we've done a bit of work reducing the size of our Omnibus
+release package. The Nodejs, Python, Erlang, and Elixir runtimes have all been
+removed, reducing the package size by 50% and total installed size by even
+more. There's still lots of work to be done to be done here — we expect
+package sizes to be reduced even further moving forward.
+
+### Custom landing page logo
+
+In the first round of what we hope to be the start of a full-featured
+customization experience, it's now possible to change the landing page logo.
+Upload an image up to 1 MB or specify a URL to an image your end users will see
+when landing at your Firezone portal.
+
+## Conclusion
+
+That's all we've got for now. If you'd like to spin up Firezone to try it out,
+head to the [deploy guide](/docs/deploy) in our docs.
+
+If you're interested in using Firezone in production for your Team or Business,
+[contact us](/sales) about our Business tier.
diff --git a/www/blog/2022-10-17-release-0-6-0/index.mdx b/www/blog/2022-10-17-release-0-6-0/index.mdx
new file mode 100644
index 000000000..8a3f31274
--- /dev/null
+++ b/www/blog/2022-10-17-release-0-6-0/index.mdx
@@ -0,0 +1,127 @@
+---
+slug: release-0-6-0
+title: Release 0.6.0
+authors: [jamil]
+tags: [release, docker, saml]
+---
+
+## Firezone 0.6 Released!
+
+Today, I'm excited to announce we've closed the [first public issue
+](https://github.com/firezone/firezone/issues/260) on our GitHub repository,
+more than a year after it was originally opened: Containerization support!
+We're also releasing preliminary support for SAML 2.0 identity providers
+like Okta and OneLogin.
+
+### Docker Support
+
+Docker is now the preferred method for deploying Firezone. Our [
+automatic install script](https://raw.githubusercontent.com/firezone/firezone/master/scripts/docker_install.sh)
+now uses Docker by default, and we even have a new [Docker migration script
+](https://raw.githubusercontent.com/firezone/firezone/master/scripts/docker_migrate.sh)
+that will non-destructively migrate your Omnibus-based Firezone installation
+to a Docker-based one with minimal downtime.
+
+#### How to Deploy
+
+You can now deploy Firezone complete with valid SSL certificates and a
+provisioned administrator in just a couple minutes:
+
+
+
+
+
+
+
+
+
"https://#{node['fqdn'] || node['hostname']}" |
-| `default['firezone']['config_directory']` | Top-level directory for Firezone configuration. | `'/etc/firezone'` |
-| `default['firezone']['install_directory']` | Top-level directory to install Firezone to. | `'/opt/firezone'` |
-| `default['firezone']['app_directory']` | Top-level directory to install the Firezone web application. | `"#{node['firezone']['install_directory']}/embedded/service/firezone"` |
-| `default['firezone']['log_directory']` | Top-level directory for Firezone logs. | `'/var/log/firezone'` |
-| `default['firezone']['var_directory']` | Top-level directory for Firezone runtime files. | `'/var/opt/firezone'` |
-| `default['firezone']['user']` | Name of unprivileged Linux user most services and files will belong to. | `'firezone'` |
-| `default['firezone']['group']` | Name of Linux group most services and files will belong to. | `'firezone'` |
-| `default['firezone']['admin_email']` | Email address for initial Firezone user. | `"firezone@localhost"` |
-| `default['firezone']['max_devices_per_user']` | Maximum number of devices a user can have. | `10` |
-| `default['firezone']['allow_unprivileged_device_management']` | Allows non-admin users to create and delete devices. | `true` |
-| `default['firezone']['allow_unprivileged_device_configuration']` | Allows non-admin users to modify device configurations. When disabled, prevents unprivileged users from changing all device fields except for `name` and `description`. | `true` |
-| `default['firezone']['egress_interface']` | Interface name where tunneled traffic will exit. If nil, the default route interface will be used. | `nil` |
-| `default['firezone']['fips_enabled']` | Enable or disable OpenSSL FIPs mode. | `nil` |
-| `default['firezone']['logging']['enabled']` | Enable or disable logging across Firezone. Set to `false` to disable logging entirely. | `true` |
-| `default['enterprise']['name']` | Name used by the Chef 'enterprise' cookbook. | `'firezone'` |
-| `default['firezone']['install_path']` | Install path used by Chef 'enterprise' cookbook. Should be set to the same as the `install_directory` above. | `node['firezone']['install_directory']` |
-| `default['firezone']['sysvinit_id']` | An identifier used in `/etc/inittab`. Must be a unique sequence of 1-4 characters. | `'SUP'` |
-| `default['firezone']['authentication']['local']['enabled']` | Enable or disable local email/password authentication. | `true` |
-| `default['firezone']['authentication']['disable_vpn_on_oidc_error']` | Disable a user's VPN if an error is detected trying to refresh their OIDC token. | `false` |
-| `default['firezone']['authentication']['oidc']` | OpenID Connect config, in the format of `{"provider" => [config...]}` - See [OpenIDConnect documentation](https://hexdocs.pm/openid_connect/readme.html) for config examples. | `{}` |
-| `default['firezone']['nginx']['enabled']` | Enable or disable the bundled nginx server. | `true` |
-| `default['firezone']['nginx']['ssl_port']` | HTTPS listen port. | `443` |
-| `default['firezone']['nginx']['directory']` | Directory to store Firezone-related nginx virtual host configuration. | `"#{node['firezone']['var_directory']}/nginx/etc"` |
-| `default['firezone']['nginx']['log_directory']` | Directory to store Firezone-related nginx log files. | `"#{node['firezone']['log_directory']}/nginx"` |
-| `default['firezone']['nginx']['log_rotation']['file_maxbytes']` | File size at which to rotate Nginx log files. | `104857600` |
-| `default['firezone']['nginx']['log_rotation']['num_to_keep']` | Number of Firezone nginx log files to keep before discarding. | `10` |
-| `default['firezone']['nginx']['log_x_forwarded_for']` | Whether to log Firezone nginx `x-forwarded-for` header. | `true` |
-| `default['firezone']['nginx']['hsts_header']['enabled']` | Enable or disable [HSTS](https://www.nginx.com/blog/http-strict-transport-security-hsts-and-nginx/). | `true` |
-| `default['firezone']['nginx']['hsts_header']['include_subdomains']` | Enable or disable `includeSubDomains` for the HSTS header. | `true` |
-| `default['firezone']['nginx']['hsts_header']['max_age']` | Max age for the HSTS header. | `31536000` |
-| `default['firezone']['nginx']['redirect_to_canonical']` | Whether to redirect URLs to the canonical FQDN specified above | `false` |
-| `default['firezone']['nginx']['cache']['enabled']` | Enable or disable the Firezone nginx cache. | `false` |
-| `default['firezone']['nginx']['cache']['directory']` | Directory for Firezone nginx cache. | `"#{node['firezone']['var_directory']}/nginx/cache"` |
-| `default['firezone']['nginx']['user']` | Firezone nginx user. | `node['firezone']['user']` |
-| `default['firezone']['nginx']['group']` | Firezone nginx group. | `node['firezone']['group']` |
-| `default['firezone']['nginx']['dir']` | Top-level nginx configuration directory. | `node['firezone']['nginx']['directory']` |
-| `default['firezone']['nginx']['log_dir']` | Top-level nginx log directory. | `node['firezone']['nginx']['log_directory']` |
-| `default['firezone']['nginx']['pid']` | Location for nginx pid file. | `"#{node['firezone']['nginx']['directory']}/nginx.pid"` |
-| `default['firezone']['nginx']['daemon_disable']` | Disable nginx daemon mode so we can monitor it instead. | `true` |
-| `default['firezone']['nginx']['gzip']` | Turn nginx gzip compression on or off. | `'on'` |
-| `default['firezone']['nginx']['gzip_static']` | Turn nginx gzip compression on or off for static files. | `'off'` |
-| `default['firezone']['nginx']['gzip_http_version']` | HTTP version to use for serving static files. | `'1.0'` |
-| `default['firezone']['nginx']['gzip_comp_level']` | nginx gzip compression level. | `'2'` |
-| `default['firezone']['nginx']['gzip_proxied']` | Enables or disables gzipping of responses for proxied requests depending on the request and response. | `'any'` |
-| `default['firezone']['nginx']['gzip_vary']` | Enables or disables inserting the “Vary: Accept-Encoding” response header. | `'off'` |
-| `default['firezone']['nginx']['gzip_buffers']` | Sets the number and size of buffers used to compress a response. If `nil`, nginx default is used. | `nil` |
-| `default['firezone']['nginx']['gzip_types']` | MIME types to enable gzip compression for. | `['text/plain', 'text/css','application/x-javascript', 'text/xml', 'application/xml', 'application/rss+xml', 'application/atom+xml', 'text/javascript', 'application/javascript', 'application/json']` |
-| `default['firezone']['nginx']['gzip_min_length']` | Minimum file length to enable file gzip compression for. | `1000` |
-| `default['firezone']['nginx']['gzip_disable']` | User-agent matcher to disable gzip compression for. | `'MSIE [1-6]\.'` |
-| `default['firezone']['nginx']['keepalive']` | Activates cache for connection to upstream servers. | `'on'` |
-| `default['firezone']['nginx']['keepalive_timeout']` | Timeout in seconds for keepalive connection to upstream servers. | `65` |
-| `default['firezone']['nginx']['worker_processes']` | Number of nginx worker processes. | `node['cpu'] && node['cpu']['total'] ? node['cpu']['total'] : 1` |
-| `default['firezone']['nginx']['worker_connections']` | Max number of simultaneous connections that can be opened by a worker process. | `1024` |
-| `default['firezone']['nginx']['worker_rlimit_nofile']` | Changes the limit on the maximum number of open files for worker processes. Uses nginx default if nil. | `nil` |
-| `default['firezone']['nginx']['multi_accept']` | Whether workers should accept one connection at a time or multiple. | `true` |
-| `default['firezone']['nginx']['event']` | Specifies the connection processing method to use inside nginx events context. | `'epoll'` |
-| `default['firezone']['nginx']['server_tokens']` | Enables or disables emitting nginx version on error pages and in the “Server” response header field. | `nil` |
-| `default['firezone']['nginx']['server_names_hash_bucket_size']` | Sets the bucket size for the server names hash tables. | `64` |
-| `default['firezone']['nginx']['sendfile']` | Enables or disables the use of nginx's `sendfile()`. | `'on'` |
-| `default['firezone']['nginx']['access_log_options']` | Sets nginx access log options. | `nil` |
-| `default['firezone']['nginx']['error_log_options']` | Sets nginx error log options. | `nil` |
-| `default['firezone']['nginx']['disable_access_log']` | Disables nginx access log. | `false` |
-| `default['firezone']['nginx']['types_hash_max_size']` | nginx types hash max size. | `2048` |
-| `default['firezone']['nginx']['types_hash_bucket_size']` | nginx types hash bucket size. | `64` |
-| `default['firezone']['nginx']['proxy_read_timeout']` | nginx proxy read timeout. Set to `nil` to use nginx default. | `nil` |
-| `default['firezone']['nginx']['client_body_buffer_size']` | nginx client body buffer size. Set to `nil` to use nginx default. | `nil` |
-| `default['firezone']['nginx']['client_max_body_size']` | nginx client max body size. | `'250m'` |
-| `default['firezone']['nginx']['default']['modules']` | Specify additional nginx modules. | `[]` |
-| `default['firezone']['nginx']['enable_rate_limiting']` | Enable or disable nginx rate limiting. | `true` |
-| `default['firezone']['nginx']['rate_limiting_zone_name']` | Nginx rate limiting zone name. | `'firezone'` |
-| `default['firezone']['nginx']['rate_limiting_backoff']` | Nginx rate limiting backoff. | `'10m'` |
-| `default['firezone']['nginx']['rate_limit']` | Nginx rate limit. | `'10r/s'` |
-| `default['firezone']['nginx']['ipv6']` | Allow nginx to listen for HTTP requests for IPv6 in addition to IPv4. | `true` |
-| `default['firezone']['postgresql']['enabled']` | Enable or disable bundled Postgresql. Set to `false` and fill in the `database` options below to use your own Postgresql instance. | `true` |
-| `default['firezone']['postgresql']['username']` | Username for Postgresql. | `node['firezone']['user']` |
-| `default['firezone']['postgresql']['data_directory']` | Postgresql data directory. | `"#{node['firezone']['var_directory']}/postgresql/13.3/data"` |
-| `default['firezone']['postgresql']['log_directory']` | Postgresql log directory. | `"#{node['firezone']['log_directory']}/postgresql"` |
-| `default['firezone']['postgresql']['log_rotation']['file_maxbytes']` | Postgresql log file maximum size before it's rotated. | `104857600` |
-| `default['firezone']['postgresql']['log_rotation']['num_to_keep']` | Number of Postgresql log files to keep. | `10` |
-| `default['firezone']['postgresql']['checkpoint_completion_target']` | Postgresql checkpoint completion target. | `0.5` |
-| `default['firezone']['postgresql']['checkpoint_segments']` | Number of Postgresql checkpoint segments. | `3` |
-| `default['firezone']['postgresql']['checkpoint_timeout']` | Postgresql checkpoint timeout. | `'5min'` |
-| `default['firezone']['postgresql']['checkpoint_warning']` | Postgresql checkpoint warning time in seconds. | `'30s'` |
-| `default['firezone']['postgresql']['effective_cache_size']` | Postgresql effective cache size. | `'128MB'` |
-| `default['firezone']['postgresql']['listen_address']` | Postgresql listen address. | `'127.0.0.1'` |
-| `default['firezone']['postgresql']['max_connections']` | Postgresql max connections. | `350` |
-| `default['firezone']['postgresql']['md5_auth_cidr_addresses']` | Postgresql CIDRs to allow for md5 auth. | `['127.0.0.1/32', '::1/128']` |
-| `default['firezone']['postgresql']['port']` | Postgresql listen port. | `15432` |
-| `default['firezone']['postgresql']['shared_buffers']` | Postgresql shared buffers size. | `"#{(node['memory']['total'].to_i / 4) / 1024}MB"` |
-| `default['firezone']['postgresql']['shmmax']` | Postgresql shmmax in bytes. | `17179869184` |
-| `default['firezone']['postgresql']['shmall']` | Postgresql shmall in bytes. | `4194304` |
-| `default['firezone']['postgresql']['work_mem']` | Postgresql working memory size. | `'8MB'` |
-| `default['firezone']['database']['user']` | Specifies the username Firezone will use to connect to the DB. | `node['firezone']['postgresql']['username']` |
-| `default['firezone']['database']['password']` | If using an external DB, specifies the password Firezone will use to connect to the DB. | `'change_me'` |
-| `default['firezone']['database']['name']` | Database that Firezone will use. Will be created if it doesn't exist. | `'firezone'` |
-| `default['firezone']['database']['host']` | Database host that Firezone will connect to. | `node['firezone']['postgresql']['listen_address']` |
-| `default['firezone']['database']['port']` | Database port that Firezone will connect to. | `node['firezone']['postgresql']['port']` |
-| `default['firezone']['database']['pool']` | Database pool size Firezone will use. | `[10, Etc.nprocessors].max` |
-| `default['firezone']['database']['ssl']` | Whether to connect to the database over SSL. | `false` |
-| `default['firezone']['database']['ssl_opts']` | Hash of options to send to the `:ssl_opts` option when connecting over SSL. See [Ecto.Adapters.Postgres documentation](https://hexdocs.pm/ecto_sql/Ecto.Adapters.Postgres.html#module-connection-options). | `{}` |
-| `default['firezone']['database']['parameters']` | Hash of parameters to send to the `:parameters` option when connecting to the database. See [Ecto.Adapters.Postgres documentation](https://hexdocs.pm/ecto_sql/Ecto.Adapters.Postgres.html#module-connection-options). | `{}` |
-| `default['firezone']['database']['extensions']` | Database extensions to enable. | `{ 'plpgsql' => true, 'pg_trgm' => true }` |
-| `default['firezone']['phoenix']['enabled']` | Enable or disable the Firezone web application. | `true` |
-| `default['firezone']['phoenix']['listen_address']` | Firezone web application listen address. This will be the upstream listen address that nginx proxies. | `'127.0.0.1'` |
-| `default['firezone']['phoenix']['port']` | Firezone web application listen port. This will be the upstream port that nginx proxies. | `13000` |
-| `default['firezone']['phoenix']['log_directory']` | Firezone web application log directory. | `"#{node['firezone']['log_directory']}/phoenix"` |
-| `default['firezone']['phoenix']['log_rotation']['file_maxbytes']` | Firezone web application log file size. | `104857600` |
-| `default['firezone']['phoenix']['log_rotation']['num_to_keep']` | Number of Firezone web application log files to keep. | `10` |
-| `default['firezone']['phoenix']['crash_detection']['enabled']` | Enable or disable bringing down the Firezone web application when a crash is detected. | `true` |
-| `default['firezone']['phoenix']['external_trusted_proxies']` | List of trusted reverse proxies formatted as an Array of IPs and/or CIDRs. | `[]` |
-| `default['firezone']['phoenix']['private_clients']` | List of private network HTTP clients, formatted an Array of IPs and/or CIDRs. | `[]` |
-| `default['firezone']['wireguard']['enabled']` | Enable or disable bundled WireGuard management. | `true` |
-| `default['firezone']['wireguard']['log_directory']` | Log directory for bundled WireGuard management. | `"#{node['firezone']['log_directory']}/wireguard"` |
-| `default['firezone']['wireguard']['log_rotation']['file_maxbytes']` | WireGuard log file max size. | `104857600` |
-| `default['firezone']['wireguard']['log_rotation']['num_to_keep']` | Number of WireGuard log files to keep. | `10` |
-| `default['firezone']['wireguard']['interface_name']` | WireGuard interface name. **Changing this parameter may cause a temporary loss in VPN connectivity**. | `'wg-firezone'` |
-| `default['firezone']['wireguard']['port']` | WireGuard listen port. | `51820` |
-| `default['firezone']['wireguard']['persistent_keepalive']` | Default PersistentKeepalive setting for generated device configurations. A value of 0 disables. | `0` |
-| `default['firezone']['wireguard']['ipv4']['enabled']` | Enable or disable IPv4 for WireGuard network. | `true` |
-| `default['firezone']['wireguard']['ipv4']['masquerade']` | Enable or disable masquerade for packets leaving the IPv4 tunnel. | `true` |
-| `default['firezone']['wireguard']['ipv4']['network']` | WireGuard network IPv4 address pool. | `'10.3.2.0/24'` |
-| `default['firezone']['wireguard']['ipv4']['address']` | WireGuard interface IPv4 address. Must be within WireGuard address pool. | `'10.3.2.1'` |
-| `default['firezone']['wireguard']['ipv6']['enabled']` | Enable or disable IPv6 for WireGuard network. | `true` |
-| `default['firezone']['wireguard']['ipv6']['masquerade']` | Enable or disable masquerade for packets leaving the IPv6 tunnel. | `true` |
-| `default['firezone']['wireguard']['ipv6']['network']` | WireGuard network IPv6 address pool. | `'fd00::3:2:0/120'` |
-| `default['firezone']['wireguard']['ipv6']['address']` | WireGuard interface IPv6 address. Must be within IPv6 address pool. | `'fd00::3:2:1'` |
-| `default['firezone']['runit']['svlogd_bin']` | Runit svlogd bin location. | `"#{node['firezone']['install_directory']}/embedded/bin/svlogd"` |
-| `default['firezone']['ssl']['directory']` | SSL directory for storing generated certs. | `'/var/opt/firezone/ssl'` |
-| `default['firezone']['ssl']['email_address']` | Email address to use for self-signed certs and ACME protocol renewal notices. | `'you@example.com'` |
-| `default['firezone']['ssl']['acme']['enabled']` | Enable ACME for automatic SSL cert provisioning. | `false` |
-| `default['firezone']['ssl']['acme']['server']` | ACME server to use for certificate issuance/renewal. Can be any [valid acme.sh server](https://github.com/acmesh-official/acme.sh/wiki/Server) | `letsencrypt` |
-| `default['firezone']['ssl']['acme']['keylength']` | Specify the key type and length for SSL certificates. See [here](https://github.com/acmesh-official/acme.sh#10-issue-ecc-certificates) | `ec-256` |
-| `default['firezone']['ssl']['certificate']` | Path to the certificate file for your FQDN. Overrides ACME setting above if specified. If both ACME and this are `nil` a self-signed cert will be generated. | `nil` |
-| `default['firezone']['ssl']['certificate_key']` | Path to the certificate file. | `nil` |
-| `default['firezone']['ssl']['ssl_dhparam']` | nginx ssl dh_param. | `nil` |
-| `default['firezone']['ssl']['country_name']` | Country name for self-signed cert. | `'US'` |
-| `default['firezone']['ssl']['state_name']` | State name for self-signed cert. | `'CA'` |
-| `default['firezone']['ssl']['locality_name']` | Locality name for self-signed cert. | `'San Francisco'` |
-| `default['firezone']['ssl']['company_name']` | Company name self-signed cert. | `'My Company'` |
-| `default['firezone']['ssl']['organizational_unit_name']` | Organizational unit name for self-signed cert. | `'Operations'` |
-| `default['firezone']['ssl']['ciphers']` | SSL ciphers for nginx to use. | `'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'` |
-| `default['firezone']['ssl']['fips_ciphers']` | SSL ciphers for FIPs mode. | `'FIPS@STRENGTH:!aNULL:!eNULL'` |
-| `default['firezone']['ssl']['protocols']` | TLS protocols to use. | `'TLSv1 TLSv1.1 TLSv1.2'` |
-| `default['firezone']['ssl']['session_cache']` | SSL session cache. | `'shared:SSL:4m'` |
-| `default['firezone']['ssl']['session_timeout']` | SSL session timeout. | `'5m'` |
-| `default['firezone']['robots_allow']` | nginx robots allow. | `'/'` |
-| `default['firezone']['robots_disallow']` | nginx robots disallow. | `nil` |
-| `default['firezone']['outbound_email']['from']` | Outbound email from address. | `nil` |
-| `default['firezone']['outbound_email']['provider']` | Outbound email service provider. | `nil` |
-| `default['firezone']['outbound_email']['configs']` | Outbound email provider configs. | see `omnibus/cookbooks/firezone/attributes/default.rb` |
-| `default['firezone']['telemetry']['enabled']` | Enable or disable anonymized product telemetry. | `true` |
-| `default['firezone']['connectivity_checks']['enabled']` | Enable or disable the Firezone connectivity checks service. | `true` |
-| `default['firezone']['connectivity_checks']['interval']` | Interval between connectivity checks in seconds. | `3_600` |
+| Option | Description | Default Value |
+| -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `default['firezone']['external_url']` | URL used to access the web portal of this Firezone instance. | "https://#{node['fqdn'] || node['hostname']}" |
+| `default['firezone']['config_directory']` | Top-level directory for Firezone configuration. | `'/etc/firezone'` |
+| `default['firezone']['install_directory']` | Top-level directory to install Firezone to. | `'/opt/firezone'` |
+| `default['firezone']['app_directory']` | Top-level directory to install the Firezone web application. | `"#{node['firezone']['install_directory']}/embedded/service/firezone"` |
+| `default['firezone']['log_directory']` | Top-level directory for Firezone logs. | `'/var/log/firezone'` |
+| `default['firezone']['var_directory']` | Top-level directory for Firezone runtime files. | `'/var/opt/firezone'` |
+| `default['firezone']['user']` | Name of unprivileged Linux user most services and files will belong to. | `'firezone'` |
+| `default['firezone']['group']` | Name of Linux group most services and files will belong to. | `'firezone'` |
+| `default['firezone']['admin_email']` | Email address for initial Firezone user. | `"firezone@localhost"` |
+| `default['firezone']['max_devices_per_user']` | Maximum number of devices a user can have. | `10` |
+| `default['firezone']['allow_unprivileged_device_management']` | Allows non-admin users to create and delete devices. | `true` |
+| `default['firezone']['allow_unprivileged_device_configuration']` | Allows non-admin users to modify device configurations. When disabled, prevents unprivileged users from changing all device fields except for `name` and `description`. | `true` |
+| `default['firezone']['egress_interface']` | Interface name where tunneled traffic will exit. If nil, the default route interface will be used. | `nil` |
+| `default['firezone']['fips_enabled']` | Enable or disable OpenSSL FIPs mode. | `nil` |
+| `default['firezone']['logging']['enabled']` | Enable or disable logging across Firezone. Set to `false` to disable logging entirely. | `true` |
+| `default['enterprise']['name']` | Name used by the Chef 'enterprise' cookbook. | `'firezone'` |
+| `default['firezone']['install_path']` | Install path used by Chef 'enterprise' cookbook. Should be set to the same as the `install_directory` above. | `node['firezone']['install_directory']` |
+| `default['firezone']['sysvinit_id']` | An identifier used in `/etc/inittab`. Must be a unique sequence of 1-4 characters. | `'SUP'` |
+| `default['firezone']['authentication']['local']['enabled']` | Enable or disable local email/password authentication. | `true` |
+| `default['firezone']['authentication']['disable_vpn_on_oidc_error']` | Disable a user's VPN if an error is detected trying to refresh their OIDC token. | `false` |
+| `default['firezone']['authentication']['oidc']` | OpenID Connect config, in the format of `{"provider" => [config...]}` - See [OpenIDConnect documentation](https://hexdocs.pm/openid_connect/readme.html) for config examples. | `{}` |
+| `default['firezone']['nginx']['enabled']` | Enable or disable the bundled nginx server. | `true` |
+| `default['firezone']['nginx']['ssl_port']` | HTTPS listen port. | `443` |
+| `default['firezone']['nginx']['directory']` | Directory to store Firezone-related nginx virtual host configuration. | `"#{node['firezone']['var_directory']}/nginx/etc"` |
+| `default['firezone']['nginx']['log_directory']` | Directory to store Firezone-related nginx log files. | `"#{node['firezone']['log_directory']}/nginx"` |
+| `default['firezone']['nginx']['log_rotation']['file_maxbytes']` | File size at which to rotate Nginx log files. | `104857600` |
+| `default['firezone']['nginx']['log_rotation']['num_to_keep']` | Number of Firezone nginx log files to keep before discarding. | `10` |
+| `default['firezone']['nginx']['log_x_forwarded_for']` | Whether to log Firezone nginx `x-forwarded-for` header. | `true` |
+| `default['firezone']['nginx']['hsts_header']['enabled']` | Enable or disable [HSTS](https://www.nginx.com/blog/http-strict-transport-security-hsts-and-nginx/). | `true` |
+| `default['firezone']['nginx']['hsts_header']['include_subdomains']` | Enable or disable `includeSubDomains` for the HSTS header. | `true` |
+| `default['firezone']['nginx']['hsts_header']['max_age']` | Max age for the HSTS header. | `31536000` |
+| `default['firezone']['nginx']['redirect_to_canonical']` | Whether to redirect URLs to the canonical FQDN specified above | `false` |
+| `default['firezone']['nginx']['cache']['enabled']` | Enable or disable the Firezone nginx cache. | `false` |
+| `default['firezone']['nginx']['cache']['directory']` | Directory for Firezone nginx cache. | `"#{node['firezone']['var_directory']}/nginx/cache"` |
+| `default['firezone']['nginx']['user']` | Firezone nginx user. | `node['firezone']['user']` |
+| `default['firezone']['nginx']['group']` | Firezone nginx group. | `node['firezone']['group']` |
+| `default['firezone']['nginx']['dir']` | Top-level nginx configuration directory. | `node['firezone']['nginx']['directory']` |
+| `default['firezone']['nginx']['log_dir']` | Top-level nginx log directory. | `node['firezone']['nginx']['log_directory']` |
+| `default['firezone']['nginx']['pid']` | Location for nginx pid file. | `"#{node['firezone']['nginx']['directory']}/nginx.pid"` |
+| `default['firezone']['nginx']['daemon_disable']` | Disable nginx daemon mode so we can monitor it instead. | `true` |
+| `default['firezone']['nginx']['gzip']` | Turn nginx gzip compression on or off. | `'on'` |
+| `default['firezone']['nginx']['gzip_static']` | Turn nginx gzip compression on or off for static files. | `'off'` |
+| `default['firezone']['nginx']['gzip_http_version']` | HTTP version to use for serving static files. | `'1.0'` |
+| `default['firezone']['nginx']['gzip_comp_level']` | nginx gzip compression level. | `'2'` |
+| `default['firezone']['nginx']['gzip_proxied']` | Enables or disables gzipping of responses for proxied requests depending on the request and response. | `'any'` |
+| `default['firezone']['nginx']['gzip_vary']` | Enables or disables inserting the “Vary: Accept-Encoding” response header. | `'off'` |
+| `default['firezone']['nginx']['gzip_buffers']` | Sets the number and size of buffers used to compress a response. If `nil`, nginx default is used. | `nil` |
+| `default['firezone']['nginx']['gzip_types']` | MIME types to enable gzip compression for. | `['text/plain', 'text/css','application/x-javascript', 'text/xml', 'application/xml', 'application/rss+xml', 'application/atom+xml', 'text/javascript', 'application/javascript', 'application/json']` |
+| `default['firezone']['nginx']['gzip_min_length']` | Minimum file length to enable file gzip compression for. | `1000` |
+| `default['firezone']['nginx']['gzip_disable']` | User-agent matcher to disable gzip compression for. | `'MSIE [1-6]\.'` |
+| `default['firezone']['nginx']['keepalive']` | Activates cache for connection to upstream servers. | `'on'` |
+| `default['firezone']['nginx']['keepalive_timeout']` | Timeout in seconds for keepalive connection to upstream servers. | `65` |
+| `default['firezone']['nginx']['worker_processes']` | Number of nginx worker processes. | `node['cpu'] && node['cpu']['total'] ? node['cpu']['total'] : 1` |
+| `default['firezone']['nginx']['worker_connections']` | Max number of simultaneous connections that can be opened by a worker process. | `1024` |
+| `default['firezone']['nginx']['worker_rlimit_nofile']` | Changes the limit on the maximum number of open files for worker processes. Uses nginx default if nil. | `nil` |
+| `default['firezone']['nginx']['multi_accept']` | Whether workers should accept one connection at a time or multiple. | `true` |
+| `default['firezone']['nginx']['event']` | Specifies the connection processing method to use inside nginx events context. | `'epoll'` |
+| `default['firezone']['nginx']['server_tokens']` | Enables or disables emitting nginx version on error pages and in the “Server” response header field. | `nil` |
+| `default['firezone']['nginx']['server_names_hash_bucket_size']` | Sets the bucket size for the server names hash tables. | `64` |
+| `default['firezone']['nginx']['sendfile']` | Enables or disables the use of nginx's `sendfile()`. | `'on'` |
+| `default['firezone']['nginx']['access_log_options']` | Sets nginx access log options. | `nil` |
+| `default['firezone']['nginx']['error_log_options']` | Sets nginx error log options. | `nil` |
+| `default['firezone']['nginx']['disable_access_log']` | Disables nginx access log. | `false` |
+| `default['firezone']['nginx']['types_hash_max_size']` | nginx types hash max size. | `2048` |
+| `default['firezone']['nginx']['types_hash_bucket_size']` | nginx types hash bucket size. | `64` |
+| `default['firezone']['nginx']['proxy_read_timeout']` | nginx proxy read timeout. Set to `nil` to use nginx default. | `nil` |
+| `default['firezone']['nginx']['client_body_buffer_size']` | nginx client body buffer size. Set to `nil` to use nginx default. | `nil` |
+| `default['firezone']['nginx']['client_max_body_size']` | nginx client max body size. | `'250m'` |
+| `default['firezone']['nginx']['default']['modules']` | Specify additional nginx modules. | `[]` |
+| `default['firezone']['nginx']['enable_rate_limiting']` | Enable or disable nginx rate limiting. | `true` |
+| `default['firezone']['nginx']['rate_limiting_zone_name']` | Nginx rate limiting zone name. | `'firezone'` |
+| `default['firezone']['nginx']['rate_limiting_backoff']` | Nginx rate limiting backoff. | `'10m'` |
+| `default['firezone']['nginx']['rate_limit']` | Nginx rate limit. | `'10r/s'` |
+| `default['firezone']['nginx']['ipv6']` | Allow nginx to listen for HTTP requests for IPv6 in addition to IPv4. | `true` |
+| `default['firezone']['postgresql']['enabled']` | Enable or disable bundled Postgresql. Set to `false` and fill in the `database` options below to use your own Postgresql instance. | `true` |
+| `default['firezone']['postgresql']['username']` | Username for Postgresql. | `node['firezone']['user']` |
+| `default['firezone']['postgresql']['data_directory']` | Postgresql data directory. | `"#{node['firezone']['var_directory']}/postgresql/13.3/data"` |
+| `default['firezone']['postgresql']['log_directory']` | Postgresql log directory. | `"#{node['firezone']['log_directory']}/postgresql"` |
+| `default['firezone']['postgresql']['log_rotation']['file_maxbytes']` | Postgresql log file maximum size before it's rotated. | `104857600` |
+| `default['firezone']['postgresql']['log_rotation']['num_to_keep']` | Number of Postgresql log files to keep. | `10` |
+| `default['firezone']['postgresql']['checkpoint_completion_target']` | Postgresql checkpoint completion target. | `0.5` |
+| `default['firezone']['postgresql']['checkpoint_segments']` | Number of Postgresql checkpoint segments. | `3` |
+| `default['firezone']['postgresql']['checkpoint_timeout']` | Postgresql checkpoint timeout. | `'5min'` |
+| `default['firezone']['postgresql']['checkpoint_warning']` | Postgresql checkpoint warning time in seconds. | `'30s'` |
+| `default['firezone']['postgresql']['effective_cache_size']` | Postgresql effective cache size. | `'128MB'` |
+| `default['firezone']['postgresql']['listen_address']` | Postgresql listen address. | `'127.0.0.1'` |
+| `default['firezone']['postgresql']['max_connections']` | Postgresql max connections. | `350` |
+| `default['firezone']['postgresql']['md5_auth_cidr_addresses']` | Postgresql CIDRs to allow for md5 auth. | `['127.0.0.1/32', '::1/128']` |
+| `default['firezone']['postgresql']['port']` | Postgresql listen port. | `15432` |
+| `default['firezone']['postgresql']['shared_buffers']` | Postgresql shared buffers size. | `"#{(node['memory']['total'].to_i / 4) / 1024}MB"` |
+| `default['firezone']['postgresql']['shmmax']` | Postgresql shmmax in bytes. | `17179869184` |
+| `default['firezone']['postgresql']['shmall']` | Postgresql shmall in bytes. | `4194304` |
+| `default['firezone']['postgresql']['work_mem']` | Postgresql working memory size. | `'8MB'` |
+| `default['firezone']['database']['user']` | Specifies the username Firezone will use to connect to the DB. | `node['firezone']['postgresql']['username']` |
+| `default['firezone']['database']['password']` | If using an external DB, specifies the password Firezone will use to connect to the DB. | `'change_me'` |
+| `default['firezone']['database']['name']` | Database that Firezone will use. Will be created if it doesn't exist. | `'firezone'` |
+| `default['firezone']['database']['host']` | Database host that Firezone will connect to. | `node['firezone']['postgresql']['listen_address']` |
+| `default['firezone']['database']['port']` | Database port that Firezone will connect to. | `node['firezone']['postgresql']['port']` |
+| `default['firezone']['database']['pool']` | Database pool size Firezone will use. | `[10, Etc.nprocessors].max` |
+| `default['firezone']['database']['ssl']` | Whether to connect to the database over SSL. | `false` |
+| `default['firezone']['database']['ssl_opts']` | Hash of options to send to the `:ssl_opts` option when connecting over SSL. See [Ecto.Adapters.Postgres documentation](https://hexdocs.pm/ecto_sql/Ecto.Adapters.Postgres.html#module-connection-options). | `{}` |
+| `default['firezone']['database']['parameters']` | Hash of parameters to send to the `:parameters` option when connecting to the database. See [Ecto.Adapters.Postgres documentation](https://hexdocs.pm/ecto_sql/Ecto.Adapters.Postgres.html#module-connection-options). | `{}` |
+| `default['firezone']['database']['extensions']` | Database extensions to enable. | `{ 'plpgsql' => true, 'pg_trgm' => true }` |
+| `default['firezone']['phoenix']['enabled']` | Enable or disable the Firezone web application. | `true` |
+| `default['firezone']['phoenix']['listen_address']` | Firezone web application listen address. This will be the upstream listen address that nginx proxies. | `'127.0.0.1'` |
+| `default['firezone']['phoenix']['port']` | Firezone web application listen port. This will be the upstream port that nginx proxies. | `13000` |
+| `default['firezone']['phoenix']['log_directory']` | Firezone web application log directory. | `"#{node['firezone']['log_directory']}/phoenix"` |
+| `default['firezone']['phoenix']['log_rotation']['file_maxbytes']` | Firezone web application log file size. | `104857600` |
+| `default['firezone']['phoenix']['log_rotation']['num_to_keep']` | Number of Firezone web application log files to keep. | `10` |
+| `default['firezone']['phoenix']['crash_detection']['enabled']` | Enable or disable bringing down the Firezone web application when a crash is detected. | `true` |
+| `default['firezone']['phoenix']['external_trusted_proxies']` | List of trusted reverse proxies formatted as an Array of IPs and/or CIDRs. | `[]` |
+| `default['firezone']['phoenix']['private_clients']` | List of private network HTTP clients, formatted an Array of IPs and/or CIDRs. | `[]` |
+| `default['firezone']['wireguard']['enabled']` | Enable or disable bundled WireGuard management. | `true` |
+| `default['firezone']['wireguard']['log_directory']` | Log directory for bundled WireGuard management. | `"#{node['firezone']['log_directory']}/wireguard"` |
+| `default['firezone']['wireguard']['log_rotation']['file_maxbytes']` | WireGuard log file max size. | `104857600` |
+| `default['firezone']['wireguard']['log_rotation']['num_to_keep']` | Number of WireGuard log files to keep. | `10` |
+| `default['firezone']['wireguard']['interface_name']` | WireGuard interface name. **Changing this parameter may cause a temporary loss in VPN connectivity**. | `'wg-firezone'` |
+| `default['firezone']['wireguard']['port']` | WireGuard listen port. | `51820` |
+| `default['firezone']['wireguard']['persistent_keepalive']` | Default PersistentKeepalive setting for generated device configurations. A value of 0 disables. | `0` |
+| `default['firezone']['wireguard']['ipv4']['enabled']` | Enable or disable IPv4 for WireGuard network. | `true` |
+| `default['firezone']['wireguard']['ipv4']['masquerade']` | Enable or disable masquerade for packets leaving the IPv4 tunnel. | `true` |
+| `default['firezone']['wireguard']['ipv4']['network']` | WireGuard network IPv4 address pool. | `'10.3.2.0/24'` |
+| `default['firezone']['wireguard']['ipv4']['address']` | WireGuard interface IPv4 address. Must be within WireGuard address pool. | `'10.3.2.1'` |
+| `default['firezone']['wireguard']['ipv6']['enabled']` | Enable or disable IPv6 for WireGuard network. | `true` |
+| `default['firezone']['wireguard']['ipv6']['masquerade']` | Enable or disable masquerade for packets leaving the IPv6 tunnel. | `true` |
+| `default['firezone']['wireguard']['ipv6']['network']` | WireGuard network IPv6 address pool. | `'fd00::3:2:0/120'` |
+| `default['firezone']['wireguard']['ipv6']['address']` | WireGuard interface IPv6 address. Must be within IPv6 address pool. | `'fd00::3:2:1'` |
+| `default['firezone']['runit']['svlogd_bin']` | Runit svlogd bin location. | `"#{node['firezone']['install_directory']}/embedded/bin/svlogd"` |
+| `default['firezone']['ssl']['directory']` | SSL directory for storing generated certs. | `'/var/opt/firezone/ssl'` |
+| `default['firezone']['ssl']['email_address']` | Email address to use for self-signed certs and ACME protocol renewal notices. | `'you@example.com'` |
+| `default['firezone']['ssl']['acme']['enabled']` | Enable ACME for automatic SSL cert provisioning. | `false` |
+| `default['firezone']['ssl']['acme']['server']` | ACME server to use for certificate issuance/renewal. Can be any [valid acme.sh server](https://github.com/acmesh-official/acme.sh/wiki/Server) | `letsencrypt` |
+| `default['firezone']['ssl']['acme']['keylength']` | Specify the key type and length for SSL certificates. See [here](https://github.com/acmesh-official/acme.sh#10-issue-ecc-certificates) | `ec-256` |
+| `default['firezone']['ssl']['certificate']` | Path to the certificate file for your FQDN. Overrides ACME setting above if specified. If both ACME and this are `nil` a self-signed cert will be generated. | `nil` |
+| `default['firezone']['ssl']['certificate_key']` | Path to the certificate file. | `nil` |
+| `default['firezone']['ssl']['ssl_dhparam']` | nginx ssl dh_param. | `nil` |
+| `default['firezone']['ssl']['country_name']` | Country name for self-signed cert. | `'US'` |
+| `default['firezone']['ssl']['state_name']` | State name for self-signed cert. | `'CA'` |
+| `default['firezone']['ssl']['locality_name']` | Locality name for self-signed cert. | `'San Francisco'` |
+| `default['firezone']['ssl']['company_name']` | Company name self-signed cert. | `'My Company'` |
+| `default['firezone']['ssl']['organizational_unit_name']` | Organizational unit name for self-signed cert. | `'Operations'` |
+| `default['firezone']['ssl']['ciphers']` | SSL ciphers for nginx to use. | `'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'` |
+| `default['firezone']['ssl']['fips_ciphers']` | SSL ciphers for FIPs mode. | `'FIPS@STRENGTH:!aNULL:!eNULL'` |
+| `default['firezone']['ssl']['protocols']` | TLS protocols to use. | `'TLSv1 TLSv1.1 TLSv1.2'` |
+| `default['firezone']['ssl']['session_cache']` | SSL session cache. | `'shared:SSL:4m'` |
+| `default['firezone']['ssl']['session_timeout']` | SSL session timeout. | `'5m'` |
+| `default['firezone']['robots_allow']` | nginx robots allow. | `'/'` |
+| `default['firezone']['robots_disallow']` | nginx robots disallow. | `nil` |
+| `default['firezone']['outbound_email']['from']` | Outbound email from address. | `nil` |
+| `default['firezone']['outbound_email']['provider']` | Outbound email service provider. | `nil` |
+| `default['firezone']['outbound_email']['configs']` | Outbound email provider configs. | see `omnibus/cookbooks/firezone/attributes/default.rb` |
+| `default['firezone']['telemetry']['enabled']` | Enable or disable anonymized product telemetry. | `true` |
+| `default['firezone']['connectivity_checks']['enabled']` | Enable or disable the Firezone connectivity checks service. | `true` |
+| `default['firezone']['connectivity_checks']['interval']` | Interval between connectivity checks in seconds. | `3_600` |
diff --git a/www/docs/reference/env-vars.mdx b/www/docs/reference/env-vars.mdx
index ba69aae33..76736b777 100644
--- a/www/docs/reference/env-vars.mdx
+++ b/www/docs/reference/env-vars.mdx
@@ -12,7 +12,7 @@ For Docker-based deployments, deployment-related or infrastructure-related
config of Firezone is done through environment variables passed to the
Firezone image upon launch.
-Read more about configuring Firezone in our [configure guide](/deploy/configure).
+Read more about configuring Firezone in our [configure guide](/docs/deploy/configure).
## Environment Variable Listing
@@ -20,7 +20,7 @@ We recommend setting these in your Docker ENV file (`$HOME/.firezone/.env` by
default). Required fields in **bold**.
| Name | Description | Format | Default |
-| ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
+| ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| **`EXTERNAL_URL`** | The external URL the web UI will be accessible at. Must be a valid FQDN for ACME SSL issuance to function. | String | |
| **`ADMIN_EMAIL`** | Primary administrator email. | String | |
| **`DEFAULT_ADMIN_PASSWORD`** | Default password that will be used for creating or resetting the primary administrator account. | String | Randomly generated upon install with `docker run firezone/firezone bin/gen-env`. |
@@ -61,4 +61,4 @@ default). Required fields in **bold**.
| `WIREGUARD_MTU` | MTU to use for the server-side WireGuard MTU interface. | String | `1280` |
| `WIREGUARD_PORT` | Port to listen on for WireGuard connections. | Integer | `51820` |
| `SECURE_COOKIES` | Enable or disable requiring secure cookies. Required for HTTPS. | Boolean | `true` |
-| `TELEMETRY_ENABLED` | Enable / disable product telemetry. Read more about [what that means here](/reference/telemetry). | Boolean | `true` |
+| `TELEMETRY_ENABLED` | Enable / disable product telemetry. Read more about [what that means here](/docs/reference/telemetry). | Boolean | `true` |
diff --git a/www/docs/reference/file-and-directory-locations.mdx b/www/docs/reference/file-and-directory-locations.mdx
index e1061b799..f830a4f19 100644
--- a/www/docs/reference/file-and-directory-locations.mdx
+++ b/www/docs/reference/file-and-directory-locations.mdx
@@ -11,7 +11,7 @@ your installation.
docs directory.
+ >
+ ),
+ },
+ {
+ title: 'Powered by React',
+ Svg: require('@site/static/img/undraw_docusaurus_react.svg').default,
+ description: (
+ <>
+ Extend or customize your website layout by reusing React. Docusaurus can
+ be extended while reusing the same header and footer.
+ >
+ ),
+ },
+];
+
+function Feature({title, Svg, description}: FeatureItem) {
+ return (
+ {description}
++ Firezone is an open-source remote access platform built on WireGuard®, a + modern VPN protocol that's 4-6x faster than OpenVPN. Deploy on your + infrastructure and start onboarding users in minutes. +
+
+
+
+
+
+
+
+ + Legacy VPNs are cumbersome to manage and take weeks to configure + correctly. Firezone takes minutes to deploy and the Web GUI makes + managing secure access effortless for admins. +
+
+ + Increase productivity and decrease connection issues for your remote + team. Firezone uses kernel WireGuard® to be efficient, reliable, and + performant in any environment. +
++ Only allow connections from authenticated users and automatically disable + access for employees who have left. Firezone integrates with any OIDC and + SAML 2.0 compatible identity provider for single sign-on (SSO). +
++ Easy to deploy and manage for individuals. For organizations, get priority + support, white-glove onboarding, and powerful integrations with the{" "} + Enterprise Plan. +
++ Lightweight and fast. Access your home network securely when on the + road. +
++ Keep up with increasing network and compliance demands as you scale your + team and infrastructure. +
++ Transitioning to remote? Perfect timing to replace the legacy VPN. + Improve your security posture and reduce support tickets. +
++ Firezone runs on your infrastructure. Customize it to suit your needs + and architecture. +
++ Set up secure access and start onboarding users in minutes. Run the install + script on a supported host to deploy Firezone with Docker. Copy the one-liner + below to install Firezone in minutes. +
+ ++ Firezone works with teams of all sizes to deliver fast, low-latency access + to private networks and resources. +
++ Direct support from the team that built Firezone and additional features built + for larger teams. +
+ +
+
+
+
+
+
+ + The Community Plan is perfect for individuals and small teams with basic + secure access needs. +
++ Have a feature request? Open an issue on{" "} + GitHub, or{" "} + get in touch with our team. +
++ Discover how Firezone can make managing secure access effortless for your + organization. We'll help you find the right solution, explain pricing, and + answer any questions. +
+