mirror of
https://github.com/fosrl/docs.git
synced 2025-05-12 21:30:43 +01:00
restyle
This commit is contained in:
parent
450f246dab
commit
8b20d84451
12 changed files with 246 additions and 118 deletions
|
@ -1,15 +1,27 @@
|
|||
# Overview
|
||||
|
||||
The Fossorial system - with Pangolin at its core - is a self-hosted tunneled reverse proxy with identity and access management, designed to securely expose private resources through encrypted [WireGuard](https://www.WireGuard.com/) tunnels running in user space. Think self hosted Cloudflare tunnels.
|
||||
:::tip
|
||||
|
||||
Want to install Pangolin? See our quick install guide [here](https://docs.fossorial.io/Getting%20Started/quick-install).
|
||||
|
||||
:::
|
||||
|
||||
The Fossorial system, with Pangolin at its core, is a self-hosted tunneled reverse proxy with identity and access management, designed to securely expose private resources through encrypted [WireGuard](https://www.WireGuard.com/) tunnels running in user space. Think self hosted Cloudflare tunnels.
|
||||
|
||||
Pangolin uses Traefik under the hood to do the actual HTTP proxying. A plugin, Badger, provides a way to authenticate every request with Pangolin. A second service, Gerbil, provides a WireGuard management server that Pangolin can use to create peers for connectivity. And finally, there is Newt, a CLI tool and Docker container that connects back to Newt and Gerbil with WireGuard fully in user space and proxies your local resources. This means that you do not need to run a privileged process or container in order to expose your services!
|
||||
|
||||
## Videos and Guides
|
||||
## Community Videos and Guides
|
||||
|
||||
- ["Pangolin: Your Own Self-Hosted Cloudflare Tunnel Alternative" by DB Tech (YouTube)](https://youtu.be/a-a-Xk1hXBQ?si=wbppkYJ3Skt3efXp)
|
||||
- ["Self-host a public Minecraft server without opening ports using Crafty and Pangolin" by Fossorial (YouTube)](https://youtu.be/acWB5wQQoOE?si=YsrCPYTz6JpLCDjW)
|
||||
- ["DS-Lite & IPv6 Problem ENDLICH gelöst! So öffnest du Ports mit Pangolin" by Apfelcast (YouTube)](https://youtu.be/z3Ao9CWH0GU?si=HJHyYFaROlijVmzO)
|
||||
- ["Pangolin: Easy Self-Hosted Tunneled Reverse Proxy with Built-in Auth via Linode" by Noted (Article)](https://noted.lol/pangolin/)
|
||||
:::note
|
||||
|
||||
Note that these guides may be out of date, as the project is still in active development. Please refer to the official documentation for the most up-to-date information.
|
||||
|
||||
:::
|
||||
|
||||
- "Pangolin: Your Own Self-Hosted Cloudflare Tunnel Alternative" by DB Tech [(YouTube)](https://youtu.be/a-a-Xk1hXBQ?si=wbppkYJ3Skt3efXp)
|
||||
- "Self-host a public Minecraft server without opening ports using Crafty and Pangolin" by Fossorial [(YouTube)](https://youtu.be/acWB5wQQoOE?si=YsrCPYTz6JpLCDjW)
|
||||
- "DS-Lite & IPv6 Problem ENDLICH gelöst! So öffnest du Ports mit Pangolin" by Apfelcast [(YouTube)](https://youtu.be/z3Ao9CWH0GU?si=HJHyYFaROlijVmzO)
|
||||
- "Pangolin: Easy Self-Hosted Tunneled Reverse Proxy with Built-in Auth via VPS" by Noted [(Article)](https://noted.lol/pangolin/)
|
||||
|
||||
## Components Overview
|
||||
|
||||
|
@ -33,7 +45,7 @@ Fossorial has a couple major components:
|
|||
- Out-of-the-box compatibility with plugins like [Fail2Ban](https://plugins.traefik.io/plugins/628c9ebcffc0cd18356a979f/fail2-ban) or [CrowdSec](https://plugins.traefik.io/plugins/6335346ca4caa9ddeffda116/crowdsec-bouncer-traefik-plugin).
|
||||
- Enhanced security via our custom Traefik plugin Badger, which acts as an authentication bouncer.
|
||||
|
||||
### [**Badger**](https://github.com/traefik/badger) (Traefik Plugin):
|
||||
### [**Badger**](https://github.com/traefik/badger) (Traefik Plugin Middleware):
|
||||
A custom Traefik plugin that acts as an authentication bouncer. Badger:
|
||||
- Intercepts requests to the Traefik reverse proxy.
|
||||
- Redirects unauthenticated requests to the Pangolin server for authentication.
|
||||
|
@ -57,6 +69,6 @@ A fossorial animal is one adapted to digging which lives primarily but not solel
|
|||
|
||||
Built by Owen & Milo Schwartz
|
||||
|
||||
"Pangolin" icon used as a initial logo is by Coret Steyn from [Noun Project](https://thenounproject.com/icon/pangolin-1798092/).
|
||||
"Pangolin" icon used as an initial logo is by Coret Steyn from [Noun Project](https://thenounproject.com/icon/pangolin-1798092/).
|
||||
|
||||
All of our fossorial animal names come from the good people at [animalia.bio](https://animalia.bio). They kindly donated their curated list of [fossorial animals](https://animalia.bio/fossorial-animals) found on their website and provided permission to use their images.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
Our stack is lightweight and efficient, so you don’t need a high-powered server to get started. A minimal VPS instance with **1 vCPU, 1GB RAM, and 8GB SSD** will perform perfectly well for most use cases. In some cases, you may be able to get away with even less.
|
||||
|
||||
## [Rack Nerd](https://my.racknerd.com/aff.php?aff=13788)
|
||||
## Rack Nerd
|
||||
|
||||
Many of our users have had a great experience with [RackNerd](https://my.racknerd.com/aff.php?aff=13788).
|
||||
|
||||
|
@ -16,30 +16,16 @@ We are part of the [RackNerd](https://my.racknerd.com/aff.php?aff=13788) affilia
|
|||
|
||||
Here’s a list of other popular VPS platforms in no particular order:
|
||||
|
||||
**[Amazon EC2](https://instances.vantage.sh/)**
|
||||
**[Amazon EC2](https://instances.vantage.sh/)**: Starts around $8.50/month for 1 vCPU, 1GB RAM, and 8GB SSD.
|
||||
|
||||
- Pricing: Starts around $8.50/month for 1 vCPU, 1GB RAM, and 8GB SSD.
|
||||
**[DigitalOcean](https://www.digitalocean.com/pricing/droplets)**: Starts around $6/month for 1 vCPU, 1GB RAM, and 25GB SSD.
|
||||
|
||||
**[DigitalOcean](https://www.digitalocean.com/pricing/droplets)**
|
||||
**[Vultr](https://www.vultr.com/pricing)**: Starts around $5/month for 1 vCPU, 1GB RAM, and 25GB SSD.
|
||||
|
||||
- Pricing: Starts around $6/month for 1 vCPU, 1GB RAM, and 25GB SSD.
|
||||
**[Linode](https://www.linode.com/pricing/)**: Starts around $5/month for 1 vCPU, 1GB RAM, and 25GB SSD.
|
||||
|
||||
**[Vultr](https://www.vultr.com/pricing)**
|
||||
**[Hetzner Cloud](https://www.hetzner.com/cloud)**: Starts around $4.59/month for 2 vCPU, 4GB RAM, and 40GB SSD.
|
||||
|
||||
- Pricing: Starts around $5/month for 1 vCPU, 1GB RAM, and 25GB SSD.
|
||||
**[UpCloud](https://upcloud.com/pricing/)**: Starts around $3.30/month for 1 vCPU, 1GB RAM, and 10GB SSD.
|
||||
|
||||
**[Linode](https://www.linode.com/pricing/)**
|
||||
|
||||
- Pricing: Starts around $5/month for 1 vCPU, 1GB RAM, and 25GB SSD.
|
||||
|
||||
**[Hetzner Cloud](https://www.hetzner.com/cloud)**
|
||||
|
||||
- Pricing: Starts around $4.59/month for 2 vCPU, 4GB RAM, and 40GB SSD.
|
||||
|
||||
**[UpCloud](https://upcloud.com/pricing/)**
|
||||
|
||||
- Pricing: Starts around $3.30/month for 1 vCPU, 1GB RAM, and 10GB SSD.
|
||||
|
||||
**[OVHcloud](https://www.ovhcloud.com/en/vps/)**
|
||||
|
||||
- Pricing: Starts around $5.50/month for 2 vCPU, 2GB RAM, and 40GB SSD.
|
||||
**[OVHcloud](https://www.ovhcloud.com/en/vps/)**: Starts around $5.50/month for 2 vCPU, 2GB RAM, and 40GB SSD.
|
||||
|
|
|
@ -10,32 +10,24 @@ Some notes about how to set up key parts of the networking in this project are b
|
|||
|
||||
## DNS
|
||||
|
||||
In your DNS service you will want to create A (or AAAA for IPv6) records pointing at your VPS hosting Pangolin.
|
||||
|
||||
### Wildcards
|
||||
|
||||
Use \*
|
||||
|
||||
Example: **\*.example.com**
|
||||
|
||||
You will need a wildcard subdomain for each level you want to create and you can not have more than one _ in a row for many providers. So if you wanted your resources to include a subdomain like "proxy", then you would want _.proxy.example.com.
|
||||
|
||||
If you plan to use a base domain for a resource, you will need to create a separate A record for that domain.
|
||||
|
||||
### The Root
|
||||
|
||||
Use @ (or nothing depending on the provider)
|
||||
|
||||
Example: **example.com**
|
||||
|
||||
If you intend Pangolin to run at the root of your domain - meaning you would access the Pangolin UI from example.com (with no subdomain) - then you will need another A record pointing at the
|
||||
|
||||
:::note
|
||||
|
||||
Sometimes you need to be patient with your DNS service provider. Once you make this change in their portal they need to propagate the change across all of the major DNS servers that run the internet and this can take some time depending on how on the ball your provider is. This can take anywhere from a couple of minutes to hours. It can be a good idea to make sure the DNS of your computer is pointing to Google's DNS `8.8.8.8` or the DNS of your provider if you are impatient.
|
||||
|
||||
:::
|
||||
|
||||
In your DNS service you will want to create A (or AAAA for IPv6) records pointing at your VPS hosting Pangolin.
|
||||
|
||||
### Wildcards
|
||||
|
||||
You will need a wildcard subdomain for each level you want to create and you can not have more than one in a row for many providers. So if you wanted your resource's domain to be `app.example.com`, then you would want `*.example.com`.
|
||||
|
||||
If you plan to use a base domain for a resource, you will need to create a separate A record for that domain.
|
||||
|
||||
### The Root
|
||||
|
||||
If you intend to use the root of your domain, then you will need an additional A record pointing at the IP of your VPS. For example, if you want to use `example.com` as a resource, you will need an A record for `example.com` pointing at your VPS.
|
||||
|
||||
## Ports to Expose
|
||||
|
||||
When you setup your VPS you want to make sure that you expose the following ports **on the VPS itself**.
|
||||
|
@ -70,7 +62,6 @@ By default the config defaults to using the bellow settings:
|
|||
|
||||
```yaml
|
||||
gerbil:
|
||||
...
|
||||
block_size: 24
|
||||
site_block_size: 30
|
||||
subnet_group: 100.89.137.0/20
|
||||
|
@ -82,9 +73,9 @@ New sites will use a block size of 30. This means that each site gets a /30 with
|
|||
|
||||
## Notes on Docker
|
||||
|
||||
If you deploy Newt in Docker: "localhost" only refers to stuff inside of the container itself, so if you want to address other things in the Docker environment you need the internal docker IP of that service or the host when setting up your resources.
|
||||
If you deploy Newt in Docker: `localhost` only refers to stuff inside of the container itself, so if you want to address other things in the Docker environment you need the internal docker IP of that service or the host when setting up your resources.
|
||||
|
||||
For "Local" sites running in Docker, you usually want to address the host machine. One way to do this is by using the special address: `172.17.0.1`.
|
||||
For "Local" sites running in Docker in the same compose as Pangolin: You usually want to address the host machine. One way to do this is by using the special address: `172.17.0.1`.
|
||||
|
||||
## Notes on Cloudflare Proxy
|
||||
|
||||
|
@ -100,7 +91,6 @@ Since Cloudflare proxy obscures the destination IP of the host, you will also ne
|
|||
|
||||
```yaml
|
||||
gerbil:
|
||||
...
|
||||
start_port: 51820
|
||||
# highlight-next-line
|
||||
base_endpoint: "104.21.16.1" # Replace with your VPS IP
|
||||
|
|
|
@ -24,9 +24,13 @@ We also have a short and quick [YouTube video](https://youtu.be/W0uVLjTyAn8) sho
|
|||
|
||||
### 1. Downloading and Running the Installer
|
||||
|
||||
Installer binaries for Linux can be found in the [Github releases](https://github.com/fosrl/pangolin/releases) for ARM and AMD64 (x86_64).
|
||||
:::tip
|
||||
|
||||
For example, on `amd64` download the installer with either wget or curl and make it executable:
|
||||
The installer will place all files in the current directory. If you want to install Pangolin in a different directory, you can move the installer to that directory and run it there.
|
||||
|
||||
:::
|
||||
|
||||
Installer binaries for Linux can be found in the [Github releases](https://github.com/fosrl/pangolin/releases) for ARM and AMD64 (x86_64).
|
||||
|
||||
<WgetQuickInstaller />
|
||||
|
||||
|
@ -38,8 +42,6 @@ The installer must be run as root. If you're not already root, switch to the roo
|
|||
sudo ./installer
|
||||
```
|
||||
|
||||
The installer will place all files in the current directory. If you want to install Pangolin in a different directory, you can move the installer to that directory and run it there.
|
||||
|
||||
### 2. Basic Configuration
|
||||
|
||||
The installer will prompt you for the following basic information. For example:
|
||||
|
@ -47,7 +49,7 @@ The installer will prompt you for the following basic information. For example:
|
|||
1. **Base Domain Name**: Enter your base fully qualified domain name (without any subdomains) Example: `example.com`
|
||||
2. **Dashboard Domain Name**: The domain where the application will be hosted. This is used for many things, including generating links. You can run Pangolin on a subdomain or root domain. Example: `proxy.example.com`
|
||||
3. **Let's Encrypt Email**: Provide an email address for SSL certificate registration with Lets Encrypt. This should be an email you have access to.
|
||||
4. **Tunneling** You can choose not to install Gerbil for tunneling support - in this config it will just be a normal reverse proxy. See [how to use without tunneling](../03-Pangolin/03-without-tunneling.md).
|
||||
4. **Tunneling** You can choose not to install Gerbil for tunneling support - in this config it will just be a normal reverse proxy. See [how to use without tunneling](/03-Pangolin/03-without-tunneling.md).
|
||||
|
||||
### 3. Admin User Setup
|
||||
|
||||
|
@ -96,8 +98,6 @@ Supported distributions:
|
|||
- RHEL
|
||||
- Amazon Linux
|
||||
|
||||
<img src={require("./img/2025-01-05_17-15.png").default} alt="Preview"/>
|
||||
|
||||
### 7. Container Deployment
|
||||
|
||||
After configuration, the installer will:
|
||||
|
|
|
@ -24,14 +24,12 @@ This guide will walk you through setting up the Docker Compose stack manually wi
|
|||
|
||||
Anything marked with `(*)` will not be generated on startup of the stack. The volumes are created by the Docker Compose file, and most of the files are generated by the Pangolin and Gerbil services.
|
||||
|
||||
You will need to edit the generated `config.yml` to configure it to your needs.
|
||||
|
||||
You will need to create the `traefik_config.yml` and `dynamic_config.yml` files manually and edit them to your needs.You can start the stack without the Traefik config files to let Pangolin generate everything. Traefik will throw some errors, but you can ignore this on first startup.
|
||||
|
||||
```
|
||||
.
|
||||
├── config/
|
||||
│ ├── config.yml
|
||||
│ ├── config.yml (*)
|
||||
│ ├── db/
|
||||
│ │ └── db.sqlite
|
||||
│ ├── key
|
||||
|
|
|
@ -81,8 +81,6 @@ After you create your resource if you are using https certificates with Let's En
|
|||
|
||||
:::
|
||||
|
||||
<img src={require("./img/2025-01-05_17-16_2.png").default} alt="Preview"/>
|
||||
|
||||
#### Authentication
|
||||
|
||||
1. Choose the **Authentication** page under the resource
|
||||
|
@ -102,7 +100,7 @@ It is not recommended to expose a resource without some form of authentication.
|
|||
1. Head to the **Users and Roles** tab
|
||||
2. Press `Invite User`
|
||||
3. Enter an email for the new user. If you have setup SMTP during the setup you can choose to send an email invite to the new user
|
||||
4. Select the role for the new user. All users must have a role. The admin role gives the user access to all resources and to create new resources and sites. The member role only provides access to resources explicitly attached to the role (none by default). For more information, see .....
|
||||
4. Select the role for the new user. All users must have a role. The admin role gives the user access to all resources and to create new resources and sites. The member role only provides access to resources explicitly attached to the role (none by default).
|
||||
5. Choose how long this invite will be valid for and choose `Create Invitation`
|
||||
6. If you chose not to send the email or it is not setup, then be sure to copy the invite and send it to the user
|
||||
|
||||
|
|
|
@ -176,8 +176,6 @@ Pangolin is configured using a `config.yml` file. The file is expected to be mou
|
|||
|
||||
## Example Configuration File
|
||||
|
||||
`config.yml`
|
||||
|
||||
```yaml
|
||||
app:
|
||||
dashboard_url: "https://example.com"
|
||||
|
|
|
@ -2,7 +2,13 @@ import WithoutTunnelingCompose from "@site/src/components/WithoutTunnelingCompos
|
|||
|
||||
# Without Tunneling
|
||||
|
||||
You can use Pangolin without Gerbil and tunneling. In this configuration Pangolin is essentially acting as a reverse proxy and authentication manager and can be deployed on the *local* network in order to provide access to resources.
|
||||
:::note
|
||||
|
||||
You can also use "local" sites to expose resources on the same VPS as Pangolin in addition to remote sites.
|
||||
|
||||
:::
|
||||
|
||||
You can use Pangolin without Gerbil and tunneling. In this configuration Pangolin is essentially acting as a normal reverse proxy and authentication manager and can be deployed on the *local* network in order to provide access to resources.
|
||||
|
||||
All setup remains the same, except Pangolin and Traefik must now be on the same network you want to proxy targets to and you do not need to install Gerbil.
|
||||
|
||||
|
@ -12,13 +18,11 @@ When Gerbil starts up, it will register itself with Pangolin. By not doing this
|
|||
|
||||
- ["Install and Run Pangolin Locally on your own Server" by Noted (Article)](https://noted.lol/pangolin-local/)
|
||||
|
||||
## How to
|
||||
|
||||
### Installer
|
||||
## Using the Installer
|
||||
|
||||
When asked if you want to install Gerbil for tunneling, select no. Gerbil will be removed from the Docker compose.
|
||||
|
||||
### Manual
|
||||
## Manual
|
||||
|
||||
Follow existing manual install steps, but Gerbil is not required. Your Docker compose should look like the below.
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ Before doing anything, make sure you've updated Newt to at least version 1.0.0-b
|
|||
|
||||
:::
|
||||
|
||||
Pangolin supports raw TCP and UDP traffic because under the hood Badger and Newt are just using basic WireGuard tunnels that can pass anything! There is a little manual setup you need to do before you can create a raw TCP or UDP resource:
|
||||
Pangolin supports raw TCP and UDP traffic because under the hood because Newt can pass anything through the tunnel! There is a minor amount of manual setup you need to do to create a raw TCP or UDP resource.
|
||||
|
||||
### Video Demo
|
||||
|
||||
|
@ -18,11 +18,16 @@ This is highly OS and VPS dependent. Just in the same way you opened port 51280,
|
|||
|
||||
## Configuring Docker
|
||||
|
||||
:::note
|
||||
|
||||
In this example, we will expose two resources with one on port 1602 for TCP and another on port 1704 for UDP. You can use any port you like, but make sure it is not already in use on your VPS.
|
||||
|
||||
:::
|
||||
|
||||
If you are using the standard install with a Docker network you will need to expose your ports from the Gerbil Docker container as well. This can be done by simply adding a port mapping to the docker-compose.yml file you can find in the root where you installed Pangolin:
|
||||
|
||||
```yaml
|
||||
gerbil:
|
||||
...
|
||||
ports:
|
||||
- 51820:51820/udp # LEAVE ALONE: For Wireguard
|
||||
- 443:443 # LEAVE ALONE: For HTTPS
|
||||
|
@ -32,41 +37,27 @@ gerbil:
|
|||
- 1602:1602 # ADDED
|
||||
```
|
||||
|
||||
:::tip
|
||||
|
||||
After editing the Docker Compose config you need to restart it! You can do `sudo docker compose up -d`
|
||||
|
||||
:::
|
||||
|
||||
## Configuring Traefik
|
||||
|
||||
Once you have opened the port on your firewall you need to create an "EntryPoint" in Traefik. "EntryPoints are the network entry points into Traefik. They define the port which will receive the packets, and whether to listen for TCP or UDP. (Traefik Labs 2024)" Unfortunately this must be done manually because Traefik does not support pulling EntryPoints from dynamic config locations.
|
||||
Once you have opened the port on your firewall you need to create an entry point in Traefik. Entry points define the port which will receive the packets, and whether to listen for TCP or UDP. Unfortunately this must be done manually because Traefik does not support pulling entry points from dynamic config locations.
|
||||
|
||||
But this is pretty simple! All you need to do is edit your Traefik config in `config/traefik/traefik_config.yml` with your favorite editor and add a new entry to the `entryPoints` section.
|
||||
|
||||
So for example a UDP EntryPoint would look like:
|
||||
But this is pretty simple! All you need to do is edit your static Traefik config in `config/traefik/traefik_config.yml` with your favorite text editor and add a new entry to the `entryPoints` section.
|
||||
|
||||
```yaml
|
||||
entryPoints:
|
||||
udp-1704:
|
||||
address: ":1704/udp"
|
||||
```
|
||||
|
||||
And for TCP:
|
||||
|
||||
```yaml
|
||||
entryPoints:
|
||||
tcp-1602:
|
||||
address: ":1602/tcp"
|
||||
```
|
||||
|
||||
:::info
|
||||
|
||||
The _name_ if the EntryPoint is IMPORTANT because it must be referenced by the dynamic config. ALWAYS name your EntryPoint in the format `protocol-port` as shown in the examples!
|
||||
The _name_ of the entry point is important because it must be referenced by the dynamic config generated by Pangolin at run time. **Always name your entry point in the format `protocol-port` as shown in the examples!**
|
||||
|
||||
:::
|
||||
|
||||
The whole thing would look something like this:
|
||||
Now, the whole entry points section would look something like this:
|
||||
|
||||
```yaml
|
||||
entryPoints:
|
||||
|
@ -86,18 +77,11 @@ entryPoints:
|
|||
address: ":1704/udp"
|
||||
```
|
||||
|
||||
:::tip
|
||||
## Restart The Stack
|
||||
|
||||
After editing the Traefik config you need to restart it! You can do `sudo docker compose restart traefik`
|
||||
After you've made all of the changes above, you need to restart the stack. This can be done with the following command:
|
||||
|
||||
:::
|
||||
|
||||
## Create the Resource
|
||||
|
||||
Finally! Now after all of that config you can create the resource in Pangolin. You can simply create a new resource and toggle the HTTP switch off. This will allow you to enter the SAME point you configured above and the protocol.
|
||||
|
||||
<div align="center">
|
||||

|
||||
</div>
|
||||
|
||||
After you create the resource you can add targets just like any other resource!
|
||||
```bash
|
||||
sudo docker-compose down
|
||||
sudo docker-compose up -d
|
||||
```
|
|
@ -74,4 +74,4 @@ Are you experienced with authentication procedures and best practices? We would
|
|||
|
||||
### SAAS
|
||||
|
||||
We intend at some point to provide Pangolin in a hosted offering with a healthy free tier and pricing competitive to generally available cloud VPS services. This way users who would like to use Pangolin - but don't want to manage their own VPS - can do so and help to fund future development.
|
||||
We intend at some point to provide Pangolin in a hosted offering with a healthy free tier and pricing competitive to generally available cloud VPS services. This way users who would like to use Pangolin, but don't want to manage their own VPS, can do so and help to fund future development.
|
||||
|
|
|
@ -36,6 +36,7 @@ const config: Config = {
|
|||
"classic",
|
||||
{
|
||||
docs: {
|
||||
sidebarCollapsed: false,
|
||||
sidebarPath: "./sidebars.ts",
|
||||
routeBasePath: "/"
|
||||
// Please change this to your repo.
|
||||
|
@ -74,6 +75,12 @@ const config: Config = {
|
|||
disableSwitch: false,
|
||||
respectPrefersColorScheme: true
|
||||
},
|
||||
// announcementBar: {
|
||||
// id: "support_us",
|
||||
// content:
|
||||
// 'If you like Pangolin, please <a target="_blank" rel="noopener noreferrer" href="https://github.com/fosrl/pangolin">star us on GitHub!</a>',
|
||||
// isCloseable: false
|
||||
// },
|
||||
algolia: {
|
||||
// The application ID provided by Algolia
|
||||
appId: "CVXQS7OHYA",
|
||||
|
@ -96,10 +103,15 @@ const config: Config = {
|
|||
// label: "Docs",
|
||||
// },
|
||||
// {to: '/blog', label: 'Blog', position: 'left'},
|
||||
{
|
||||
href: "mailto:numbat@fossorial.io",
|
||||
label: "numbat@fossorial.io",
|
||||
position: "left"
|
||||
},
|
||||
{
|
||||
href: "https://discord.gg/HCJR8Xhme4",
|
||||
label: "Discord",
|
||||
position: "right"
|
||||
position: "left"
|
||||
},
|
||||
{
|
||||
href: "https://github.com/fosrl",
|
||||
|
@ -155,8 +167,8 @@ const config: Config = {
|
|||
// copyright: `${new Date().getFullYear()} Built by Fossorial`,
|
||||
// },
|
||||
prism: {
|
||||
theme: prismThemes.github,
|
||||
darkTheme: prismThemes.dracula
|
||||
theme: prismThemes.oneLight,
|
||||
darkTheme: prismThemes.oneDark
|
||||
}
|
||||
} satisfies Preset.ThemeConfig,
|
||||
plugins: [
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
* work well for content-centric websites.
|
||||
*/
|
||||
|
||||
@import url("https://fonts.googleapis.com/css2?family=Inter&display=swap");
|
||||
|
||||
/* You can override the default Infima variables here. */
|
||||
:root {
|
||||
/* Primary colors converted from HSL to hex */
|
||||
|
@ -16,9 +18,9 @@
|
|||
--ifm-color-primary-lightest: hsl(24.6, 95%, 68%);
|
||||
|
||||
/* Additional custom variables */
|
||||
--ifm-background-color: hsl(0, 0%, 100%);
|
||||
--ifm-background-color: #FFFFFF;
|
||||
--ifm-font-color-base: hsl(20, 0%, 10%);
|
||||
--ifm-code-font-size: 95%;
|
||||
--ifm-code-font-size: 85%;
|
||||
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
|
||||
|
||||
/* Chart colors */
|
||||
|
@ -27,6 +29,11 @@
|
|||
--chart-color-3: hsl(197, 37%, 24%);
|
||||
--chart-color-4: hsl(43, 74%, 66%);
|
||||
--chart-color-5: hsl(27, 87%, 67%);
|
||||
|
||||
--ifm-global-shadow-lw: none;
|
||||
--ifm-font-family-base: "Inter";
|
||||
|
||||
--ifm-breadcrumb-item-background-active: --ifm-background-color;
|
||||
}
|
||||
|
||||
/* For readability concerns, you should choose a lighter palette in dark mode. */
|
||||
|
@ -40,8 +47,9 @@
|
|||
--ifm-color-primary-lighter: hsl(20.5, 90.2%, 58%);
|
||||
--ifm-color-primary-lightest: hsl(20.5, 90.2%, 63%);
|
||||
|
||||
--ifm-background-color: #1A1A1A;
|
||||
|
||||
/* Additional custom variables for dark mode */
|
||||
--ifm-background-color: hsl(20, 0%, 10%);
|
||||
--ifm-font-color-base: hsl(60, 9.1%, 97.8%);
|
||||
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
|
||||
|
||||
|
@ -51,6 +59,12 @@
|
|||
--chart-color-3: hsl(30, 80%, 55%);
|
||||
--chart-color-4: hsl(280, 65%, 60%);
|
||||
--chart-color-5: hsl(340, 75%, 55%);
|
||||
|
||||
--ifm-navbar-background-color: #1B1B1D;
|
||||
}
|
||||
|
||||
.main {
|
||||
font-family: "Comic Sans MS", sans-serif;
|
||||
}
|
||||
|
||||
.header-github-link:hover {
|
||||
|
@ -72,11 +86,143 @@ html[data-theme="dark"] .header-github-link:before {
|
|||
}
|
||||
|
||||
.navbar {
|
||||
border-bottom: 1px solid rgb(218, 221, 225);
|
||||
box-shadow: 0 0 0 0;
|
||||
border-bottom: 0px solid rgb(218, 221, 225);
|
||||
max-width: 1600px; /* Limits the content width */
|
||||
width: 100%; /* Ensures it scales responsively */
|
||||
margin: 0 auto; /* Centers the inner content */
|
||||
padding: 0 20px; /* Optional: Adds padding to prevent content from touching edges */
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .navbar {
|
||||
border-bottom: 1px solid #444950;
|
||||
box-shadow: 0 0 0 0;
|
||||
border-bottom: 0px solid #444950;
|
||||
}
|
||||
|
||||
.main-wrapper {
|
||||
max-width: 1600px;
|
||||
width: 100%; /* Ensures responsiveness */
|
||||
margin: 0 auto; /* Centers the container */
|
||||
box-sizing: border-box; /* Ensures padding doesn’t affect max-width */
|
||||
}
|
||||
|
||||
article {
|
||||
max-width: 800px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
aside {
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.theme-doc-sidebar-container {
|
||||
border-right: 0px !important;
|
||||
}
|
||||
|
||||
.theme-admonition {
|
||||
border: 1px solid rgb(218, 221, 225);
|
||||
}
|
||||
|
||||
.prism-code {
|
||||
border: 1px solid rgb(218, 221, 225);
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .theme-admonition {
|
||||
border: 1px solid rgb(115, 115, 115); /* Subtle contrast against #1B1B1D */
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .prism-code {
|
||||
border: 1px solid rgb(115, 115, 115); /* Matches the admonition style */
|
||||
}
|
||||
|
||||
div[class^="announcementBarContent"] a {
|
||||
color: var(--ifm-link-color);
|
||||
text-decoration: inherit;
|
||||
}
|
||||
|
||||
div[class^="announcementBarContent"] a:hover {
|
||||
color: var(--ifm-link-color);
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.navbar .navbar__items {
|
||||
flex: auto;
|
||||
}
|
||||
|
||||
.dropdown__link {
|
||||
font-size: inherit;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 996px) {
|
||||
:root {
|
||||
--ifm-font-size-base: 16px;
|
||||
}
|
||||
article header h1 {
|
||||
font-size: 1.5rem !important;
|
||||
}
|
||||
.hero .hero__title {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: 997px) {
|
||||
:root {
|
||||
--ifm-font-size-base: 16px;
|
||||
}
|
||||
article header h1 {
|
||||
font-size: 2rem !important;
|
||||
}
|
||||
}
|
||||
|
||||
.pagination-nav__label::before {
|
||||
display: none;
|
||||
}
|
||||
.pagination-nav__label::after {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.table-of-contents {
|
||||
border: 0px;
|
||||
}
|
||||
/* Default (mobile styles remain unchanged) */
|
||||
|
||||
/* Desktop: Apply new styles only when screen is larger than 768px */
|
||||
@media (min-width: 769px) {
|
||||
.navbarSearchContainer_bmvg .DocSearch-Button {
|
||||
border: 1px solid rgb(150, 153, 156); /* Outline instead of background */
|
||||
background: transparent; /* No background */
|
||||
border-radius: 6px; /* Less rounded */
|
||||
padding: 8px 16px; /* Slightly larger */
|
||||
width: 220px; /* Longer search bar */
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
transition: border-color 0.2s ease-in-out;
|
||||
box-shadow: none !important; /* Removes any glow */
|
||||
}
|
||||
|
||||
.navbarSearchContainer_bmvg .DocSearch-Button:hover,
|
||||
.navbarSearchContainer_bmvg .DocSearch-Button:focus {
|
||||
border-color: rgb(100, 102, 105); /* Slightly darker border on hover */
|
||||
box-shadow: none !important; /* No glow */
|
||||
}
|
||||
|
||||
/* Ensures search text & icon are properly aligned */
|
||||
.navbarSearchContainer_bmvg .DocSearch-Button-Container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
/* Adjust search icon size */
|
||||
.navbarSearchContainer_bmvg .DocSearch-Search-Icon {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
color: rgb(100, 102, 105);
|
||||
}
|
||||
|
||||
/* Remove Command+K shortcut icons */
|
||||
.navbarSearchContainer_bmvg .DocSearch-Button-Keys {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue