mirror of
https://github.com/davegallant/davegallant.github.io.git
synced 2026-01-05 10:02:30 +00:00
Compare commits
8 Commits
dependabot
...
635cc55e87
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
635cc55e87 | ||
| f433fb9f1c | |||
|
|
223b7a9113 | ||
|
|
c200552255 | ||
|
|
8a27d7284f | ||
|
|
9be886267d | ||
|
|
8f1892115f | ||
|
|
d4971f0138 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -119,3 +119,5 @@ dist
|
||||
# End of https://www.toptal.com/developers/gitignore/api/hugo,node
|
||||
|
||||
public/
|
||||
|
||||
.obsidian/
|
||||
|
||||
@@ -6,6 +6,8 @@ This is a space where I document my learnings and share them with others. I hope
|
||||
|
||||
I choose to host this site, alongside other tools, rather than relying exclusively on larger platforms because I believe in the open web. Interoperability is often not a consideration for popular platforms today and I find that concerning.
|
||||
|
||||
My blog can be found [here](./blog).
|
||||
|
||||
## Connect
|
||||
|
||||
If you would like to connect with me:
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
title: "Replicating TrueNAS datasets to sftpgo over Tailscale"
|
||||
date: "2025-04-17T22:03:33-04:00"
|
||||
draft: false
|
||||
comments: true
|
||||
toc: false
|
||||
author: "Dave Gallant"
|
||||
tags:
|
||||
[
|
||||
"tailscale",
|
||||
"truenas",
|
||||
"sftpgo",
|
||||
]
|
||||
---
|
||||
|
||||
I've recently spun up an instance of TrueNAS SCALE after salvaging a couple hard drives from a past computer build and decided I could use additional network storage for various backups such as Proxmox VMs and home directory backups.
|
||||
|
||||
<!--more-->
|
||||
|
||||
The only app I've needed to install has been Tailscale which has enabled me to access the TrueNAS Web UI from anywhere. I've setup a few datasets and NFS shares to store various backups and the rest of the periodic backups have routinely been working without a hitch. Since my homelab is becoming more of a vital piece of infrastructure for my daily needs, I wanted to ensure that these datasets had [Cloud Sync Tasks](https://www.truenas.com/docs/scale/scaletutorials/dataprotection/cloudsynctasks/) setup for offsite backups. These encrypted backups are mostly being stored in places such as Google Drive and other blob storage providers.
|
||||
|
||||
More recently, to reduce cloud costs, I've setup some a small node at another physical location and installed both Tailscale and [sftpgo](https://github.com/drakkan/sftpgo) on it to facilitate offsite backups. After setting up the infrastructure and adding a Cloud Sync Task in TrueNAS SCALE to replicate these backups offsite to sftpgo, I noticed that Tailscale's Magic DNS was not working, nor was the Tailscale IPv4 address.
|
||||
|
||||
After reading the [Tailscale docs](https://tailscale.com/kb/1483/truenas#route-non-tailnet-traffic-through-truenas) , it became clear that the **Userspace** box had to be unchecked in the Tailscale app settings. This is because the Tailscale app is running within a docker container on the TrueNAS SCALE VM. After unchecking the **Userspace** box, I was able to verify that the Backup Credentials created for sftpgo worked when specifying the host as a Tailscale IPv4 address. This was probably good enough since the IP won't change unless the node is re-registered.
|
||||
|
||||
~~To get MagicDNS working, I went to Network > Global Configuration and set "Nameserver 1" to **100.100.100.100**. After this, I was able to specify the FQDN in the Backup Credentials and the Cloud Sync Tasks started.~~
|
||||
|
||||
This method of adding MagicDNS can lead to issues with DNS when updating the tailscale application in TrueNAS, so I ended using the Tailscale IP directly.
|
||||
|
||||
|
||||
@@ -50,11 +50,9 @@ services:
|
||||
gitea:
|
||||
image: gitea/gitea:1.21.1
|
||||
container_name: gitea
|
||||
network_mode: service:ts-gitea
|
||||
environment:
|
||||
- USER_UID=1000
|
||||
- USER_GID=1000
|
||||
|
||||
- GITEA__server__DOMAIN=gitea.my-tailnet-name.ts.net
|
||||
- GITEA__server__ROOT_URL=https://gitea.my-tailnet-name.ts.net
|
||||
- GITEA__server__HTTP_ADDR=0.0.0.0
|
||||
@@ -64,57 +62,18 @@ services:
|
||||
- ./data:/data
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
ts-gitea:
|
||||
image: tailscale/tailscale:v1.58
|
||||
container_name: ts-gitea
|
||||
hostname: gitea
|
||||
environment:
|
||||
- TS_AUTHKEY=<FILL THIS IN>
|
||||
- TS_SERVE_CONFIG=/config/gitea.json
|
||||
- TS_STATE_DIR=/var/lib/tailscale
|
||||
volumes:
|
||||
- ${PWD}/state:/var/lib/tailscale
|
||||
- ${PWD}/config:/config
|
||||
- /dev/net/tun:/dev/net/tun
|
||||
cap_add:
|
||||
- net_admin
|
||||
- sys_module
|
||||
restart: unless-stopped
|
||||
```
|
||||
|
||||
Note that you must specify a `TS_AUTHKEY` in the `ts-gitea` service. You can generate an auth key [here](https://login.tailscale.com/admin/settings/keys).
|
||||
After adding the above configuration, running `docker compose up -d` should be enough to get an instance up and running.
|
||||
|
||||
`config/gitea.json`:
|
||||
To make it accessible at [https://gitea.my-tailnet-name.ts.net](https://gitea.my-tailnet-name.ts.net) from within the tailnet, install tailscale cli and run:
|
||||
|
||||
```yaml
|
||||
{
|
||||
"TCP": { "443": { "HTTPS": true } },
|
||||
"Web":
|
||||
{
|
||||
"${TS_CERT_DOMAIN}:443":
|
||||
{ "Handlers": { "/": { "Proxy": "http://127.0.0.1:3000" } } },
|
||||
},
|
||||
"AllowFunnel": { "${TS_CERT_DOMAIN}:443": false }
|
||||
}
|
||||
```sh
|
||||
tailscale serve -bg 3000
|
||||
```
|
||||
|
||||
After adding the above configuration, running `docker compose up -d` should be enough to get an instance up and running. It will be accessible at [https://gitea.my-tailnet-name.ts.net](https://gitea.my-tailnet-name.ts.net) from within the tailnet.
|
||||
|
||||
Something to consider is whether or not you want to use ssh with git. One method to get this to work with containers is to use [ssh container passthrough](https://docs.gitea.com/installation/install-with-docker#ssh-container-passthrough). I decided to keep it simple and not use ssh, since communicating over https is perfectly fine for my use case.
|
||||
|
||||
## Theming
|
||||
|
||||
I discovered some themes for gitea [here](https://git.sainnhe.dev/sainnhe/gitea-themes).
|
||||
|
||||
I added the theme by copying [theme-palenight.css](https://git.sainnhe.dev/sainnhe/gitea-themes/raw/branch/master/dist/theme-palenight.css) into `./data/gitea/public/assets/css`. I then added the following to `environment` in `docker-compose.yml`:
|
||||
|
||||
```yaml
|
||||
- GITEA__ui__DEFAULT_THEME=palenight
|
||||
- GITEA__ui__THEMES=palenight
|
||||
```
|
||||
|
||||
After restarting the gitea instance, the default theme was applied.
|
||||
|
||||
## Connecting runners
|
||||
|
||||
I installed the runner by [following the docs](https://docs.gitea.com/usage/actions/quickstart#set-up-runner). I opted for installing it on a separate host as recommended in the docs. I used the systemd unit file to ensure that the runner comes back online after system reboots. I installed tailscale on the gitea runner as well, so that it can be part of the same tailnet as the main instance.
|
||||
@@ -168,7 +127,7 @@ jobs:
|
||||
${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_number }}
|
||||
```
|
||||
|
||||
And voilà:
|
||||
And the end result:
|
||||
|
||||

|
||||
|
||||
@@ -182,6 +141,4 @@ One enhancement that I would like to see is the ability to send notifications on
|
||||
|
||||
Gitea Actions are fast and the resource footprint is minimal. My gitea instance is currently using around 250mb of memory and a small fraction of a single cpu core (and the runner is using a similar amount of resources). This is impressive since many alternatives tend to require substantially more resources. It likely helps that the codebase is largely written in go.
|
||||
|
||||
By combining gitea with the networking marvel that is tailscale, running workflows becomes simple and fun. Whether you are working on a team or working alone, this setup ensures that your workflows are securely accessible from anywhere with an internet connection.
|
||||
|
||||
Check out my gitea instance exposed via Funnel [here](https://gitea.snake-cloud.ts.net).
|
||||
By combining gitea with tailscale, running workflows becomes simple and fun. Whether you are working on a team or working alone, this setup ensures that your workflows are securely accessible from anywhere with an internet connection.
|
||||
|
||||
83
content/blog/using-a-realtek-nic-with-opnsense/index.md
Normal file
83
content/blog/using-a-realtek-nic-with-opnsense/index.md
Normal file
@@ -0,0 +1,83 @@
|
||||
---
|
||||
title: "Using a Realtek NIC with OPNsense"
|
||||
date: "2025-04-21T17:17:46-04:00"
|
||||
draft: false
|
||||
comments: true
|
||||
toc: false
|
||||
author: "Dave Gallant"
|
||||
tags:
|
||||
[
|
||||
linux,
|
||||
freebsd,
|
||||
opnsense,
|
||||
pfsense,
|
||||
proxmox,
|
||||
realtek,
|
||||
nic,
|
||||
]
|
||||
---
|
||||
|
||||
For the past few years, I've been running pfSense (and more recently OPNsense) in a virtual machine within Proxmox. This has been running fine with a single onboard Intel NIC. A few months ago, I upgraded to a machine that has a CPU that supports hardware-accelerated transcoding, has more SATA ports, and has more PCI slots for future expansion. With the goal of having a dedicated NIC for WAN, I bought an inexpensive 1Gbps PCIe NIC (TG-3468) despite reading about some of the concerns around Realtek NICs (sluggish performance, driver instability, and in some cases system crashes).
|
||||
|
||||
I've been running a Realtek NICs reliably on Linux and Windows desktops, so I figured I could make it work without too much effort, but it turns out Realtek NICs really can be problematic when it comes to FreeBSD-based routers, and commonly documented workarounds did not solve my problems.
|
||||
|
||||
<!--more-->
|
||||
|
||||
## Environment
|
||||
|
||||
My environment consists of:
|
||||
|
||||
- Proxmox 8.4
|
||||
- OPNsense 25.1 (QEMU VM)
|
||||
- Ethernet controller: Intel Corporation Ethernet Connection (5) I219-LM
|
||||
- Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)
|
||||
|
||||
# Goal
|
||||
|
||||
The goal is to upgrade the OPNsense router from a single NIC to two NICs. The NICs are responsible for:
|
||||
|
||||
1. **LAN**: the internal network for computers, phones, cameras, printers, etc (NIC 1)
|
||||
2. **WAN**: the connection from the ISP (NIC 2)
|
||||
|
||||
Having two separate physical interfaces for LAN and WAN creates clear, physical separation between the trusted internal network and the untrusted external network at the hardware level. This also should improve performance and throughput since the same physical connection is no longer shared between LAN and WAN.
|
||||
|
||||
## Device Passthrough
|
||||
|
||||
For maximum performance and reduced hypervisor overhead, passing through a physical NIC for WAN directly to the VM seemed to make the most sense, so I passed it through to the OPNsense VM.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
I added the PCI device and restarted the OPNsense VM and re-configured the WAN in OPNsense to use this device.
|
||||
|
||||
I received the WAN IP and everything appeared to be working. I ran a few speed tests and noticed that the download speeds were much lower than normal from all of my devices. I checked my instance of [speedtest-tracker](https://docs.speedtest-tracker.dev) noticed that the download speeds were significantly slower than historical records:
|
||||
|
||||

|
||||
|
||||
These speeds tests were going through Mullvad, which occasionally is inconsistent, but the results remained consistently lower than the previous configuration.
|
||||
|
||||
I reverted the WAN back to the original NIC, and the download speeds returned to more average results immediately so it became obvious that something was not right with this setup.
|
||||
|
||||
### Realtek drivers
|
||||
|
||||
I did some web searching / LLM prompting and discovered that some people have had improved results after installing the OPNsense plugin **os-realtek-re**.
|
||||
|
||||
After installing the plugin and ensuring the kernel module was loaded at boot by following the post-install instructions, the throughput was still signicantly slower than before adding a second NIC.
|
||||
|
||||
I was starting to think that there might be a problem with the hardware and began the process to return it to the vendor.
|
||||
|
||||
## Virtualized NIC with a Linux bridge
|
||||
|
||||
As one last shot, I created Linux Bridge in the Proxmox GUI with the Realtek NIC and passed it through to the OPNsense VM:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
I re-configured the WAN interface in OPNsense to use the newly added network device, and the download and upload speeds returned to the typical speeds. Another added benefit to this setup is that it bypasses the need for installing Realtek FreeBSD drivers on the OPNsense VM, since the network device is virtual and managed on the Proxmox host (debian-based).
|
||||
|
||||
|
||||
## Conclusion
|
||||
|
||||
Although I am not sure why passing through a Realtek NIC to an OPNsense VM causes so much degradation in throughput, I am glad that there is a workaround. If I get ahold of another NIC, I would be interested in trying to reproduce the issue.
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 96 KiB |
BIN
content/blog/using-a-realtek-nic-with-opnsense/linux-bridge.png
Normal file
BIN
content/blog/using-a-realtek-nic-with-opnsense/linux-bridge.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 86 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 140 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 107 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 116 KiB |
16
package-lock.json
generated
16
package-lock.json
generated
@@ -335,6 +335,7 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": "^14 || ^16 || >=18"
|
||||
},
|
||||
@@ -358,6 +359,7 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": "^14 || ^16 || >=18"
|
||||
}
|
||||
@@ -1394,9 +1396,10 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@tabler/icons": {
|
||||
"version": "2.45.0",
|
||||
"resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.45.0.tgz",
|
||||
"integrity": "sha512-J10UDghOni9wlrj5CpKAzychDCABCKYq897mGg0wGFsd+tYLaUdz0dt/HZeGnV8gZJo0hIiTPLGwBp5EW42Qsg==",
|
||||
"version": "2.47.0",
|
||||
"resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.47.0.tgz",
|
||||
"integrity": "sha512-4w5evLh+7FUUiA1GucvGj2ReX2TvOjEr4ejXdwL/bsjoSkof6r1gQmzqI+VHrE2CpJpB3al7bCTulOkFa/RcyA==",
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/codecalm"
|
||||
@@ -1422,6 +1425,7 @@
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
|
||||
"integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"acorn": "bin/acorn"
|
||||
},
|
||||
@@ -1641,6 +1645,7 @@
|
||||
"url": "https://github.com/sponsors/ai"
|
||||
}
|
||||
],
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"caniuse-lite": "^1.0.30001565",
|
||||
"electron-to-chromium": "^1.4.601",
|
||||
@@ -2411,6 +2416,7 @@
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
|
||||
"integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@eslint-community/eslint-utils": "^4.2.0",
|
||||
"@eslint-community/regexpp": "^4.6.1",
|
||||
@@ -2466,6 +2472,7 @@
|
||||
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
|
||||
"integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"eslint-config-prettier": "bin/cli.js"
|
||||
},
|
||||
@@ -4131,6 +4138,7 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"nanoid": "^3.3.8",
|
||||
"picocolors": "^1.1.1",
|
||||
@@ -5305,6 +5313,7 @@
|
||||
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz",
|
||||
"integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"cssesc": "^3.0.0",
|
||||
"util-deprecate": "^1.0.2"
|
||||
@@ -5394,6 +5403,7 @@
|
||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz",
|
||||
"integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"prettier": "bin/prettier.cjs"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
let
|
||||
nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-24.11";
|
||||
nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-25.11";
|
||||
pkgs = import nixpkgs { config = { }; overlays = [ ]; };
|
||||
in
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
/*! purgecss start ignore */
|
||||
|
||||
/* Prism Plugins */
|
||||
{{ range $.Site.Params.prism.plugins }}
|
||||
{{ $path := printf "prismjs/plugins/%s/prism-%s.css" . . }}
|
||||
{{ $plugin := resources.Get $path }}
|
||||
{{ if $plugin }}
|
||||
{{ printf "/*%s*/" $plugin }}
|
||||
@import "{{ $plugin }}";
|
||||
{{ $pluginCSS := resources.Get $path }}
|
||||
{{ if $pluginCSS }}
|
||||
{{ $importPath := trim $pluginCSS.RelPermalink "/" }}
|
||||
{{ printf "/* Import stylesheet for Prism plugin '%s' from '%s' */" . $importPath }}
|
||||
@import "{{ $importPath }}";
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
# Dark Visitors robots.txt
|
||||
|
||||
# AI Data Scraper
|
||||
# https://darkvisitors.com/agents/anthropic-ai
|
||||
|
||||
User-agent: anthropic-ai
|
||||
Disallow: /
|
||||
|
||||
# AI Data Scraper
|
||||
# https://darkvisitors.com/agents/ccbot
|
||||
|
||||
User-agent: CCBot
|
||||
Disallow: /
|
||||
|
||||
# AI Data Scraper
|
||||
# https://darkvisitors.com/agents/facebookbot
|
||||
|
||||
User-agent: FacebookBot
|
||||
Disallow: /
|
||||
|
||||
# AI Data Scraper
|
||||
# https://darkvisitors.com/agents/google-extended
|
||||
|
||||
User-agent: Google-Extended
|
||||
Disallow: /
|
||||
|
||||
# AI Data Scraper
|
||||
# https://darkvisitors.com/agents/gptbot
|
||||
|
||||
User-agent: GPTBot
|
||||
Disallow: /
|
||||
|
||||
# AI Data Scraper
|
||||
# https://darkvisitors.com/agents/omgilibot
|
||||
|
||||
User-agent: omgilibot
|
||||
Disallow: /
|
||||
|
||||
User-agent: omgili
|
||||
Disallow: /
|
||||
|
||||
# This blocks Bytespider
|
||||
https://darkvisitors.com/agents/bytespider
|
||||
User-agent: Bytespider
|
||||
Disallow: /
|
||||
|
||||
User-agent: *
|
||||
{{ if eq (hugo.Environment) "production" -}}
|
||||
Allow: /
|
||||
{{ else -}}
|
||||
Disallow: /
|
||||
{{ end -}}
|
||||
Sitemap: {{ "sitemap.xml" | absURL -}}
|
||||
27
themes/custom-theme/package-lock.json
generated
27
themes/custom-theme/package-lock.json
generated
@@ -13,7 +13,7 @@
|
||||
"flexsearch": "^0.7.31",
|
||||
"normalize.css": "^8.0.1",
|
||||
"prism-themes": "^1.9.0",
|
||||
"prismjs": "^1.30.0",
|
||||
"prismjs": "^1.29.0",
|
||||
"simple-icons": "^9.19.0",
|
||||
"typeface-fira-code": "^1.1.13",
|
||||
"typeface-roboto-slab": "^1.1.13"
|
||||
@@ -1368,9 +1368,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@tabler/icons": {
|
||||
"version": "2.44.0",
|
||||
"resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.44.0.tgz",
|
||||
"integrity": "sha512-WPPtihDcAwEm1QZM9MXQw6+r/R2/qx7KMU1eegsi9DsqBLAb0W2kbt6e/syvd6j9c+6XNpRVBW1ziGqSWQAWOg==",
|
||||
"version": "2.47.0",
|
||||
"resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.47.0.tgz",
|
||||
"integrity": "sha512-4w5evLh+7FUUiA1GucvGj2ReX2TvOjEr4ejXdwL/bsjoSkof6r1gQmzqI+VHrE2CpJpB3al7bCTulOkFa/RcyA==",
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/codecalm"
|
||||
@@ -5674,10 +5674,9 @@
|
||||
"integrity": "sha512-tX2AYsehKDw1EORwBps+WhBFKc2kxfoFpQAjxBndbZKr4fRmMkv47XN0BghC/K1qwodB1otbe4oF23vUTFDokw=="
|
||||
},
|
||||
"node_modules/prismjs": {
|
||||
"version": "1.30.0",
|
||||
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
|
||||
"integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==",
|
||||
"license": "MIT",
|
||||
"version": "1.29.0",
|
||||
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
|
||||
"integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
@@ -7570,9 +7569,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"@tabler/icons": {
|
||||
"version": "2.44.0",
|
||||
"resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.44.0.tgz",
|
||||
"integrity": "sha512-WPPtihDcAwEm1QZM9MXQw6+r/R2/qx7KMU1eegsi9DsqBLAb0W2kbt6e/syvd6j9c+6XNpRVBW1ziGqSWQAWOg=="
|
||||
"version": "2.47.0",
|
||||
"resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.47.0.tgz",
|
||||
"integrity": "sha512-4w5evLh+7FUUiA1GucvGj2ReX2TvOjEr4ejXdwL/bsjoSkof6r1gQmzqI+VHrE2CpJpB3al7bCTulOkFa/RcyA=="
|
||||
},
|
||||
"@trysound/sax": {
|
||||
"version": "0.2.0",
|
||||
@@ -10305,9 +10304,9 @@
|
||||
"integrity": "sha512-tX2AYsehKDw1EORwBps+WhBFKc2kxfoFpQAjxBndbZKr4fRmMkv47XN0BghC/K1qwodB1otbe4oF23vUTFDokw=="
|
||||
},
|
||||
"prismjs": {
|
||||
"version": "1.30.0",
|
||||
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
|
||||
"integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="
|
||||
"version": "1.29.0",
|
||||
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
|
||||
"integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q=="
|
||||
},
|
||||
"punycode": {
|
||||
"version": "2.1.1",
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
"flexsearch": "^0.7.31",
|
||||
"normalize.css": "^8.0.1",
|
||||
"prism-themes": "^1.9.0",
|
||||
"prismjs": "^1.30.0",
|
||||
"prismjs": "^1.29.0",
|
||||
"simple-icons": "^9.19.0",
|
||||
"typeface-fira-code": "^1.1.13",
|
||||
"typeface-roboto-slab": "^1.1.13"
|
||||
|
||||
Reference in New Issue
Block a user