| Crates.io | vicarian |
| lib.rs | vicarian |
| version | 0.2.0 |
| created_at | 2025-12-10 05:21:47.154169+00 |
| updated_at | 2026-01-23 05:18:12.694314+00 |
| description | Vicarian is a reverse proxy server with ACME support |
| homepage | https://github.com/tarka/vicarian |
| repository | https://github.com/tarka/vicarian |
| max_upload_size | |
| id | 1977519 |
| size | 293,446 |
Vicarian is a TLS-first reverse proxy server with built-in ACME support. It is currently targeted at self-hosting and SOHO installations; in particular it supports provisioning TLS certificates behind-the-firewall via ACME DNS-01 and the zone-update library.
Vicarian aims to have sensible defaults without additional configuration.
This software should be consider pre-alpha; the feature-set is MVP and is still in active development. It should not be considered production-ready and no warranty is expressed or implied. It is very-much a work-in-progress and virtually every part of it subject to change without notice.
Only Linux is currently supported (x86_64 and Arm64). Testing for other platforms is welcome.
tlsserver
is the default.Access & error logs
Happy Eyeballs support
Static file support. Pingora itself doesn't support static-files. There are
3rd-party crates that support this but they appear unmaintained at the moment
and will need to be evaluated. If you wish to serve a static website one
workaround is to use static-web-server to create a static backend:
static-web-server \
--host 127.0.0.1 --port 8080 \
--security-headers true \
--log-level info \
--root .
This is how vicarian.org and haltcondition.net are served currently.
Docker images.
The following may be implemented at some point depending on interest and resources.
Vicarian is very opinionated and tries to do the sensible thing by
default. Ideally if a particular header or setting was usually required by, say,
nginx then it should be the default. e.g. X-Forwarded-For and
HSTS
are always set. Consequently there are no plans to add a large number of
features and settings.
Other notable non-features:
Tarballs are available on the Github release page. These contain binaries, documentation, example configuration files, and an example systemd configuration:
├── bin
│ └── vicarian
├── CONFIGURATION.md
├── etc
│ ├── systemd
│ │ └── system
│ │ └── vicarian.service
│ └── vicarian
│ ├── examples
│ │ ├── vicarian-dns01.corn
│ │ ├── vicarian-http01.corn
│ │ └── vicarian-tls-files.corn
│ ├── secrets
│ └── vicarian.corn
├── LICENSE
└── README.md
cargo install vicarian
The binary will be available at
~/.crates/bin/vicarian. cargo-binstall
is also supported.
An example systemd service in provided in systemd/vicarian.service. The
systemd service sets the CAP_NET_BIND_SERVICE flag which allows binding to
ports 80/443 without root.
Vicarian currently uses the corn configuration
language. The default configuration file is located at
/etc/vicarian/vicarian.corn, but can be changed with the --config flag.
The full configuration structure is documented in
CONFIGURATION.md, and additional examples are available in
the examples directory, but a basic working configuration with HTTP-based
Let's Encrypt TLS would look like:
{
listen = {
addrs = [
"[::]" // Default; this covers IPv4 & IPv6
]
insecure_port = 80 // Disabled by default, this will redirect to HTTPS
tls_port = 443 // Default
}
vhosts = [
{
hostname = "example.com"
tls = {
acme = {
contact = "admin@example.com"
challenge.type = "http-01"
}
}
backends = [
{
context = "/"
url = "http://localhost:8080"
}
{
context = "/app2"
url = "https://localhost:8443"
trust = true
}
]
}
]
}
Contributions, bug reports, fixes, etc. are welcome.
Additionally, a useful contributions would be to add additional DNS provider APIs to the zone-update project.
The project follows the Rust Code of Conduct; this can be found online.
As well as the usual dependencies Vicarian also uses:
This project will not accept runtime code generated by AI. Generation of draft documentation and test code is acceptable, but should be reviewed by the submitter before raising a PR.
CAP_NET_BIND_SERVICE to bind to privileged ports without full root privilegesThis project is licensed under the Apache License 2.0 - see the LICENSE file for details.