mirror of
https://github.com/jbowdre/runtimeterror.git
synced 2024-11-22 23:12:19 +00:00
Merge branch 'main' into drafts
This commit is contained in:
commit
cc7d386da5
17 changed files with 206 additions and 52 deletions
46
.github/workflows/deploy-preview-to-neocities.yml
vendored
Normal file
46
.github/workflows/deploy-preview-to-neocities.yml
vendored
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
name: Deploy Preview to Neocities
|
||||||
|
|
||||||
|
# only run on changes to preview
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- preview
|
||||||
|
|
||||||
|
concurrency: # prevent concurrent deploys doing strange things
|
||||||
|
group: deploy-preview-to-neocities
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
# Default to bash
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
deploy:
|
||||||
|
name: Build and deploy Hugo site
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Hugo setup
|
||||||
|
uses: peaceiris/actions-hugo@v2.6.0
|
||||||
|
with:
|
||||||
|
hugo-version: '0.121.1'
|
||||||
|
extended: true
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Build with Hugo
|
||||||
|
run: hugo --minify --environment preview
|
||||||
|
- name: Insert 404 page
|
||||||
|
run: |
|
||||||
|
cp public/404/index.html public/not_found.html
|
||||||
|
- name: Highlight with Torchlight
|
||||||
|
run: |
|
||||||
|
npm i @torchlight-api/torchlight-cli
|
||||||
|
npx torchlight
|
||||||
|
- name: Deploy to Neocities
|
||||||
|
uses: bcomnes/deploy-to-neocities@v1
|
||||||
|
with:
|
||||||
|
api_token: ${{ secrets.NEOCITIES_PREVIEW_API_TOKEN }}
|
||||||
|
cleanup: true
|
||||||
|
dist_dir: public
|
|
@ -25,6 +25,7 @@ giscusStrict = "0"
|
||||||
giscusTheme = "noborder_gray"
|
giscusTheme = "noborder_gray"
|
||||||
|
|
||||||
analytics = true
|
analytics = true
|
||||||
|
kudos = true
|
||||||
|
|
||||||
[author]
|
[author]
|
||||||
name = "John Bowdre"
|
name = "John Bowdre"
|
||||||
|
@ -136,6 +137,16 @@ icon = "fa-brands fa-github"
|
||||||
title = "GitHub"
|
title = "GitHub"
|
||||||
url = "https://github.com/jbowdre"
|
url = "https://github.com/jbowdre"
|
||||||
|
|
||||||
|
[[socialLinks]]
|
||||||
|
icon = "fa-solid fa-heart"
|
||||||
|
title = "omg.lol"
|
||||||
|
url = "https://jbowdre.lol"
|
||||||
|
|
||||||
|
[[socialLinks]]
|
||||||
|
icon = "fa-solid fa-sticky-note"
|
||||||
|
title = "Scribbles 'n Bits"
|
||||||
|
url = "https://scribbles.jbowdre.lol"
|
||||||
|
|
||||||
[[socialLinks]]
|
[[socialLinks]]
|
||||||
icon = "fa-solid fa-circle-user"
|
icon = "fa-solid fa-circle-user"
|
||||||
title = "CounterSocial"
|
title = "CounterSocial"
|
||||||
|
@ -146,21 +157,6 @@ icon = "fa fa-mastodon"
|
||||||
title = "Mastodon"
|
title = "Mastodon"
|
||||||
url = "https://social.lol/@jbowdre"
|
url = "https://social.lol/@jbowdre"
|
||||||
|
|
||||||
[[socialLinks]]
|
|
||||||
icon = "fa-solid fa-heart"
|
|
||||||
title = "omg.lol"
|
|
||||||
url = "https://jbowdre.lol"
|
|
||||||
|
|
||||||
[[socialLinks]]
|
|
||||||
icon = "fa-solid fa-comments"
|
|
||||||
title = "SimpleX Chat"
|
|
||||||
url = "/simplex"
|
|
||||||
|
|
||||||
[[socialLinks]]
|
|
||||||
icon = "fa fa-matrix-org"
|
|
||||||
title = "Matrix"
|
|
||||||
url = "https://matrix.to/#/@jbowdre:omg.lol"
|
|
||||||
|
|
||||||
[[socialLinks]]
|
[[socialLinks]]
|
||||||
icon = "fa-solid fa-envelope"
|
icon = "fa-solid fa-envelope"
|
||||||
title = "Email"
|
title = "Email"
|
||||||
|
|
1
config/preview/hugo.toml
Normal file
1
config/preview/hugo.toml
Normal file
|
@ -0,0 +1 @@
|
||||||
|
baseURL = "https://preview--runtimeterror.neocities.org/"
|
2
config/preview/params.toml
Normal file
2
config/preview/params.toml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
comments = false
|
||||||
|
analytics = false
|
|
@ -3,6 +3,7 @@ title = "404'd!"
|
||||||
noindex = true
|
noindex = true
|
||||||
timeless = true
|
timeless = true
|
||||||
comments = true
|
comments = true
|
||||||
|
kudos = false
|
||||||
+++
|
+++
|
||||||
|
|
||||||
We're not sure what you were looking for but it's not here.
|
We're not sure what you were looking for but it's not here.
|
||||||
|
|
|
@ -23,13 +23,17 @@ And in the free time I have left, I game on my Steam Deck.
|
||||||
|
|
||||||
See what I've been up to on:
|
See what I've been up to on:
|
||||||
- [GitHub](https://github.com/jbowdre)
|
- [GitHub](https://github.com/jbowdre)
|
||||||
- [CounterSocial](https://counter.social/@john_b)
|
- [Scribbles 'n Bits](https://scribbes.jbowdre.lol)
|
||||||
- [status.lol](https://status.jbowdre.lol)
|
- [status.lol](https://status.jbowdre.lol)
|
||||||
|
- [social.lol](https://social.lol/@jbowdre)
|
||||||
|
- [CounterSocial](https://counter.social/@john_b)
|
||||||
- [/now](https://now.jbowdre.lol)
|
- [/now](https://now.jbowdre.lol)
|
||||||
|
|
||||||
Connect with me via:
|
Connect with me via:
|
||||||
- [SimpleX Chat](/simplex/)
|
- [SimpleX Chat](/simplex/)
|
||||||
|
- [Session](https://p.runtimeterror.dev/session-id)
|
||||||
- [Matrix](https://matrix.to/#/@jbowdre:omg.lol)
|
- [Matrix](https://matrix.to/#/@jbowdre:omg.lol)
|
||||||
|
- [XMPP](xmpp://john@chat.vpota.to)
|
||||||
- [Electronic Mail](mailto:jbowdre@omg.lol)
|
- [Electronic Mail](mailto:jbowdre@omg.lol)
|
||||||
- [PGP: 613F B70C 4FA7 A077](https://l.runtimeterror.dev/pgp)
|
- [PGP: 613F B70C 4FA7 A077](https://l.runtimeterror.dev/pgp)
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "Create Virtual Machines on a Chromebook with HashiCorp Vagrant" # Title of the blog post.
|
title: "Create Virtual Machines on a Chromebook with HashiCorp Vagrant" # Title of the blog post.
|
||||||
date: 2023-02-20 # Date of post creation.
|
date: 2023-02-20 # Date of post creation.
|
||||||
lastmod: 2024-01-17
|
lastmod: 2024-02-06
|
||||||
description: "Pairing the powerful Linux Development Environment on modern Chromebooks with HashiCorp Vagrant to create and manage local virtual machines for development and testing" # Description used for search engine.
|
description: "Pairing the powerful Linux Development Environment on modern Chromebooks with HashiCorp Vagrant to create and manage local virtual machines for development and testing" # Description used for search engine.
|
||||||
featured: true # Sets if post is a featured post, making appear on the home page side bar.
|
featured: true # Sets if post is a featured post, making appear on the home page side bar.
|
||||||
draft: false # Sets whether to render this page. Draft of true will not be rendered.
|
draft: false # Sets whether to render this page. Draft of true will not be rendered.
|
||||||
|
@ -29,7 +29,16 @@ Also, because I'm a bit of a sadist, I wanted to do this all on my new [Framewor
|
||||||
It took a bit of fumbling, but this article describes what it took to get a Vagrant-powered VM up and running in the [Linux Development Environment](https://chromeos.dev/en/linux) on my Chromebook (which is currently running ChromeOS v111 beta).
|
It took a bit of fumbling, but this article describes what it took to get a Vagrant-powered VM up and running in the [Linux Development Environment](https://chromeos.dev/en/linux) on my Chromebook (which is currently running ChromeOS v111 beta).
|
||||||
|
|
||||||
### Install the prerequisites
|
### Install the prerequisites
|
||||||
There are are a few packages which need to be installed before we can move on to the Vagrant-specific stuff. It's quite possible that these are already on your system.... but if they *aren't* already present you'll have a bad problem[^problem].
|
First things first: you should make sure your Chromebook supports nested virtualization. Many newer ones do, but it's not a universal thing. It's easy to check just by looking for the `kvm` device file:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ls -l /dev/kvm # [tl! .cmd]
|
||||||
|
crw-rw---- 10,232 root 6 Feb 08:03 /dev/kvm # [tl! .nocopy]
|
||||||
|
```
|
||||||
|
|
||||||
|
As long as you don't get an error like `No such file or directory` then you should be good to go.
|
||||||
|
|
||||||
|
With that out of the way, there are are a few packages which need to be installed before we can move on to the Vagrant-specific stuff. It's quite possible that these are already on your system.... but if they *aren't* already present you'll have a bad problem[^problem].
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
sudo apt update && sudo apt install \ # [tl! .cmd]
|
sudo apt update && sudo apt install \ # [tl! .cmd]
|
||||||
|
@ -41,7 +50,7 @@ sudo apt update && sudo apt install \ # [tl! .cmd]
|
||||||
|
|
||||||
[^problem]: and [will not go to space today](https://xkcd.com/1133/).
|
[^problem]: and [will not go to space today](https://xkcd.com/1133/).
|
||||||
|
|
||||||
I'll be configuring Vagrant to use [`libvirt`](https://libvirt.org/) to interface with the [Kernel Virtual Machine (KVM)](https://www.linux-kvm.org/page/Main_Page) virtualization solution (rather than something like VirtualBox that would bring more overhead) so I'll need to install some packages for that as well:
|
I'll be configuring Vagrant to use [`libvirt`](https://libvirt.org/) to interface with the [Kernel Virtual Machine (KVM)](https://www.linux-kvm.org/page/Main_Page) virtualization solution (rather than something like VirtualBox which would require kernel modules that can't be loaded in ChromeOS) so I'll need to install some packages for that as well:
|
||||||
```shell
|
```shell
|
||||||
sudo apt install virt-manager libvirt-dev # [tl! .cmd]
|
sudo apt install virt-manager libvirt-dev # [tl! .cmd]
|
||||||
```
|
```
|
||||||
|
|
|
@ -12,19 +12,19 @@ tags:
|
||||||
- meta
|
- meta
|
||||||
- serverless
|
- serverless
|
||||||
---
|
---
|
||||||
I came across [Neocities](https://neocities.org) many months ago, and got really excited by the premise: a free web host with the mission to bring back the *"fun, creativity and independence that made the web great."* I spent a while scrolling through the [gallery](https://neocities.org/browse) of personal sites and was amazed by both the nostalgic vibes and the creativity on display. It's like a portal back to when the web was fun. Neocities seemed like something I wanted to be a part of, so I signed up for an account... and soon realized that I didn't *really* want to go back to crafting artisinal HTML by hand like I did in the early '00s. I didn't see an easy way to leverage my preferred static site generator[^lazy] so I filed it away and moved on.
|
I came across [Neocities](https://neocities.org) many months ago, and got really excited by the premise: a free web host with the mission to bring back the *"fun, creativity and independence that made the web great."* I spent a while scrolling through the [gallery](https://neocities.org/browse) of personal sites and was amazed by both the nostalgic vibes and the creativity on display. It's like a portal back to when the web was fun. Neocities seemed like something I wanted to be a part of so I signed up for an account... and soon realized that I didn't *really* want to go back to crafting artisinal HTML by hand like I did in the early '00s. I didn't see an easy way to leverage my preferred static site generator[^lazy] so I filed it away and moved on.
|
||||||
|
|
||||||
[^lazy]: Also I'm kind of lazy, and not actually much of a web design person anyway.
|
[^lazy]: Also I'm kind of lazy, and not actually very good at web design anyway. I mean, you've seen my work.
|
||||||
|
|
||||||
Until yesterday, when I saw [Sophie](https://social.lol/@sophie)'s post, [How I deploy my Eleventy site to Neocities](https://localghost.dev/blog/how-i-deploy-my-eleventy-site-to-neocities/). I hadn't realized that Neocities had an [API](https://neocities.org/api), or that there was a [deploy-to-neocities](https://github.com/bcomnes/deploy-to-neocities) GitHub Action which uses that API to push content to Neocities. With that new-to-me information, I thought I'd give Neocities another try - a real one this time.
|
Until yesterday, when I saw a post from [Sophie](https://social.lol/@sophie) on [How I deploy my Eleventy site to Neocities](https://localghost.dev/blog/how-i-deploy-my-eleventy-site-to-neocities/). I hadn't realized that Neocities had an [API](https://neocities.org/api), or that there was a [deploy-to-neocities](https://github.com/bcomnes/deploy-to-neocities) GitHub Action which uses that API to push content to Neocities. With that new-to-me information, I thought I'd give Neocities another try - a real one this time.
|
||||||
|
|
||||||
I'd been hosting this site on Netlify's free plan [for a couple of year](/hello-hugo/) and haven't really had any problems. But I saw Neocities as a better vision of the internet, and I wanted to be a part of that[^passion]. So last night I signed up for the $5/month [Neocities Supporter](https://neocities.org/supporter) plan, which comes with support for custom domains and more bandwidth than even a paid Netlify plan.
|
I had been hosting this site on Netlify's free plan [for a couple of years](/hello-hugo/) and haven't really encountered any problems. But I saw Neocities as a better vision of the internet, and I wanted to be a part of that[^passion]. So last night I upgraded to the $5/month [Neocities Supporter](https://neocities.org/supporter) plan which would let me use a custom domain for my site (along with higher storage and bandwidth limits).
|
||||||
|
|
||||||
[^passion]: Plus I love supporting passion projects.
|
[^passion]: Plus I love supporting passion projects.
|
||||||
|
|
||||||
I knew I'd need to make some changes to Sophie's workflow since I build my site with Hugo rather than Eleventy. I did some poking around and found [GitHub Actions for Hugo](https://github.com/peaceiris/actions-hugo) which would take care of installing Hugo for me. Then I'd just need to render the HTML with `hugo --minify` and use the [Torchlight](/spotlight-on-torchlight/) CLI to mark up the code blocks. Along the way, I discovered that I needed to overwrite `/not_found.html` to insert my custom 404 page so I included an extra step to do that. And then I'd finally be ready to push the results to Neocities.
|
I knew I'd need to make some changes to Sophie's workflow since my site is built with Hugo rather than Eleventy. I did some poking around and found [GitHub Actions for Hugo](https://github.com/peaceiris/actions-hugo) which would take care of installing Hugo for me. Then I'd just need to render the HTML with `hugo --minify` and use the [Torchlight](/spotlight-on-torchlight/) CLI to mark up the code blocks. Along the way, I also discovered that I'd need to overwrite `/not_found.html` to insert my custom 404 page so I included an extra step to do that. After that, I'll finally be ready to push the results to Neocities.
|
||||||
|
|
||||||
So after some trial and error, I came up with this workflow:
|
It took a bit of trial and error, but I eventually adapted this workflow which does the trick:
|
||||||
|
|
||||||
### The Workflow
|
### The Workflow
|
||||||
```yaml
|
```yaml
|
||||||
|
@ -33,8 +33,10 @@ So after some trial and error, I came up with this workflow:
|
||||||
name: Deploy to Neocities
|
name: Deploy to Neocities
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
# Daily build to catch any future-dated posts
|
||||||
schedule:
|
schedule:
|
||||||
- cron: 0 13 * * *
|
- cron: 0 13 * * *
|
||||||
|
# Build on pushes to the main branch only
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "Quick Salt State to Deploy Netdata"
|
title: "Quick Salt State to Deploy Netdata"
|
||||||
date: 2023-12-21
|
date: 2023-12-21
|
||||||
lastmod: 2023-12-22
|
lastmod: 2024-02-03
|
||||||
description: "A hasty Salt state to deploy netdata monitoring and publish it internally on my tailnet with Tailscale Serve"
|
description: "A hasty Salt state to deploy netdata monitoring and publish it internally on my tailnet with Tailscale Serve"
|
||||||
featured: false
|
featured: false
|
||||||
toc: true
|
toc: true
|
||||||
|
@ -37,7 +37,7 @@ tailscale:
|
||||||
|
|
||||||
netdata-kickstart:
|
netdata-kickstart:
|
||||||
cmd.run:
|
cmd.run:
|
||||||
- name: curl -Ss https://my-netdata.io/kickstart.sh | sh -s -- --dont-wait
|
- name: curl -Ss https://get.netdata.cloud/kickstart.sh | sh -s -- --dont-wait
|
||||||
- require:
|
- require:
|
||||||
- pkg: curl
|
- pkg: curl
|
||||||
# don't run this block if netdata is already running
|
# don't run this block if netdata is already running
|
||||||
|
@ -77,9 +77,9 @@ minion-name: # [tl! .nocopy:start collapse:start]
|
||||||
----------
|
----------
|
||||||
ID: netdata-kickstart
|
ID: netdata-kickstart
|
||||||
Function: cmd.run
|
Function: cmd.run
|
||||||
Name: curl -Ss https://my-netdata.io/kickstart.sh | sh -s -- --dont-wait
|
Name: curl -Ss https://get.netdata.cloud/kickstart.sh | sh -s -- --dont-wait
|
||||||
Result: True
|
Result: True
|
||||||
Comment: Command "curl -Ss https://my-netdata.io/kickstart.sh | sh -s -- --dont-wait" run
|
Comment: Command "curl -Ss https://get.netdata.cloud/kickstart.sh | sh -s -- --dont-wait" run
|
||||||
Started: 22:59:05.441217
|
Started: 22:59:05.441217
|
||||||
Duration: 10617.082 ms
|
Duration: 10617.082 ms
|
||||||
Changes:
|
Changes:
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
title: "Tailscale Serve in a Docker Compose Sidecar"
|
title: "Tailscale Serve in a Docker Compose Sidecar"
|
||||||
date: 2023-12-30
|
date: 2023-12-30
|
||||||
lastmod: 2024-01-01
|
lastmod: 2024-02-07
|
||||||
description: "Using Docker Compose to deploy containerized applications and make them available via Tailscale Serve and Tailscale Funnel"
|
description: "Using Docker Compose to deploy containerized applications and make them available via Tailscale Serve and Tailscale Funnel"
|
||||||
featured: false
|
featured: false
|
||||||
toc: true
|
toc: true
|
||||||
|
@ -59,6 +59,63 @@ https://tsdemo.tailnet-name.ts.net:8443/
|
||||||
|
|
||||||
It would be really great if I could directly attach each container to my tailnet and then access the apps with addresses like `https://miniflux.tailnet-name.ts.net` or `https://cyber.tailnet-name.ts.net`. Tailscale does have an [official Docker image](https://hub.docker.com/r/tailscale/tailscale), and at first glance it seems like that would solve my needs pretty directly. Unfortunately, it looks like trying to leverage that container image directly would still require me to configure Tailscale Serve interactively.[^ts_serve_config].
|
It would be really great if I could directly attach each container to my tailnet and then access the apps with addresses like `https://miniflux.tailnet-name.ts.net` or `https://cyber.tailnet-name.ts.net`. Tailscale does have an [official Docker image](https://hub.docker.com/r/tailscale/tailscale), and at first glance it seems like that would solve my needs pretty directly. Unfortunately, it looks like trying to leverage that container image directly would still require me to configure Tailscale Serve interactively.[^ts_serve_config].
|
||||||
|
|
||||||
|
{{% notice note "Update: 2024-02-07" %}}
|
||||||
|
Tailscale [just published a blog post](https://tailscale.com/blog/docker-tailscale-guide) which shares some details about how to configure Funnel and Serve within the official image. The short version is that the `TS_SERVE_CONFIG` variable should point to a `serve-config.json` file. The name of the file doesn't actually matter, but the contents do - and you can generate a config by running `tailscale serve status -json` on a functioning system... or just copy-pasta'ing this example I just made for the [Cyberchef](#cyberchef) setup I describe later in this post:
|
||||||
|
|
||||||
|
```json
|
||||||
|
// torchlight! {"lineNumbers": true}
|
||||||
|
{
|
||||||
|
"TCP": {
|
||||||
|
"443": {
|
||||||
|
"HTTPS": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Web": {
|
||||||
|
"cyber.tailnet-name.ts.net:443": {
|
||||||
|
"Handlers": {
|
||||||
|
"/": {
|
||||||
|
"Proxy": "http://127.0.0.1:8000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}//, uncomment to enable funnel
|
||||||
|
// "AllowFunnel": {
|
||||||
|
// "cyber.tailnet-name.ts.net:443": true
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Replace the ports and protocols and hostnames and such, and you'll be good to go.
|
||||||
|
|
||||||
|
A compose config using this setup might look something like this:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# torchlight! {"lineNumbers": true}
|
||||||
|
services:
|
||||||
|
tailscale:
|
||||||
|
image: tailscale/tailscale:latest # [tl! highlight]
|
||||||
|
container_name: cyberchef-tailscale
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
TS_AUTHKEY: ${TS_AUTHKEY:?err}
|
||||||
|
TS_HOSTNAME: ${TS_HOSTNAME:-ts-docker}
|
||||||
|
TS_EXTRA_ARGS: ${TS_EXTRA_ARGS:-}
|
||||||
|
TS_STATE_DIR: /var/lib/tailscale/
|
||||||
|
TS_SERVE_CONFIG: /config/serve-config.json # [tl! highlight]
|
||||||
|
volumes:
|
||||||
|
- ./ts_data:/var/lib/tailscale/
|
||||||
|
- ./serve-config.json:/config/serve-config.json # [tl! highlight]
|
||||||
|
|
||||||
|
cyberchef:
|
||||||
|
container_name: cyberchef
|
||||||
|
image: mpepping/cyberchef:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
network_mode: service:tailscale
|
||||||
|
```
|
||||||
|
|
||||||
|
That's a bit cleaner than the workaround I'd put together, but you're totally welcome to keep on reading if you want to see how it compares.
|
||||||
|
{{% /notice %}}
|
||||||
|
|
||||||
[^ts_serve_config]: While not documented for the image itself, the `containerboot` binary seems like it should accept a [`TS_SERVE_CONFIG` argument](https://github.com/tailscale/tailscale/blob/5812093d31c8a7f9c5e3a455f0fd20dcc011d8cd/cmd/containerboot/main.go#L43) to designate the file path of the `ipn.ServeConfig`... but I couldn't find any information on how to actually configure that.
|
[^ts_serve_config]: While not documented for the image itself, the `containerboot` binary seems like it should accept a [`TS_SERVE_CONFIG` argument](https://github.com/tailscale/tailscale/blob/5812093d31c8a7f9c5e3a455f0fd20dcc011d8cd/cmd/containerboot/main.go#L43) to designate the file path of the `ipn.ServeConfig`... but I couldn't find any information on how to actually configure that.
|
||||||
|
|
||||||
And then I came across [Louis-Philippe Asselin's post](https://asselin.engineer/tailscale-docker) about how he set up Tailscale in Docker Compose. When he wrote his post, there was even less documentation on how to do this stuff, so he used a [modified Tailscale docker image](https://github.com/lpasselin/tailscale-docker) which loads a [startup script](https://github.com/lpasselin/tailscale-docker/blob/c6f8d75b5e1235b8dbeee849df9321f515c526e5/images/tailscale/start.sh) to handle some of the configuration steps. His repo also includes a [helpful docker-compose example](https://github.com/lpasselin/tailscale-docker/blob/c6f8d75b5e1235b8dbeee849df9321f515c526e5/docker-compose/stateful-example/docker-compose.yml) of how to connect it together.
|
And then I came across [Louis-Philippe Asselin's post](https://asselin.engineer/tailscale-docker) about how he set up Tailscale in Docker Compose. When he wrote his post, there was even less documentation on how to do this stuff, so he used a [modified Tailscale docker image](https://github.com/lpasselin/tailscale-docker) which loads a [startup script](https://github.com/lpasselin/tailscale-docker/blob/c6f8d75b5e1235b8dbeee849df9321f515c526e5/images/tailscale/start.sh) to handle some of the configuration steps. His repo also includes a [helpful docker-compose example](https://github.com/lpasselin/tailscale-docker/blob/c6f8d75b5e1235b8dbeee849df9321f515c526e5/docker-compose/stateful-example/docker-compose.yml) of how to connect it together.
|
||||||
|
|
|
@ -19,8 +19,6 @@ Incoming messages are routed through a pool of servers so that your conversation
|
||||||
The app is also packed with other features like disappearing messages, encrypted file transfers, encrypted voice messages, encrypted audio and video calls, decentralized private groups, and a cool incognito mode which connects new conversations to a randomly-generated profile instead of your primary one. There's even a [CLI client](https://github.com/simplex-chat/simplex-chat/blob/stable/docs/CLI.md)!
|
The app is also packed with other features like disappearing messages, encrypted file transfers, encrypted voice messages, encrypted audio and video calls, decentralized private groups, and a cool incognito mode which connects new conversations to a randomly-generated profile instead of your primary one. There's even a [CLI client](https://github.com/simplex-chat/simplex-chat/blob/stable/docs/CLI.md)!
|
||||||
|
|
||||||
## Servers
|
## Servers
|
||||||
[![Status badge](https://status.runtimeterror.dev/api/badge/11/status)](https://status.runtimeterror.dev/status/simplex)
|
|
||||||
|
|
||||||
You can easily host your own [simplexmq server](https://github.com/simplex-chat/simplexmq) for handling your inbound message queue, and I've done just that; in fact, I've deployed three! And, as one of my closest internet friends, *you're welcome to use them as well.*
|
You can easily host your own [simplexmq server](https://github.com/simplex-chat/simplexmq) for handling your inbound message queue, and I've done just that; in fact, I've deployed three! And, as one of my closest internet friends, *you're welcome to use them as well.*
|
||||||
|
|
||||||
Just add these in the SimpleX app at **Settings > Network & servers > SMP servers > + Add server...**. Enable the option to use them for new connections, and they'll be added to the pool used for incoming messages in new conversations. If you want to use them immediately for existing conversations, go into each conversation's options menu and use the **Switch receiving address** option. You can also *disable* the option to use the default servers for new conversations if you only want messages to be routed through specific servers, but that does increase the likelikhood of concurrent conversations being routed the same way. More servers, more path options, less metadata in any one place.
|
Just add these in the SimpleX app at **Settings > Network & servers > SMP servers > + Add server...**. Enable the option to use them for new connections, and they'll be added to the pool used for incoming messages in new conversations. If you want to use them immediately for existing conversations, go into each conversation's options menu and use the **Switch receiving address** option. You can also *disable* the option to use the default servers for new conversations if you only want messages to be routed through specific servers, but that does increase the likelikhood of concurrent conversations being routed the same way. More servers, more path options, less metadata in any one place.
|
||||||
|
@ -32,7 +30,7 @@ Just add these in the SimpleX app at **Settings > Network & servers > SMP server
|
||||||
|
|
||||||
| | |
|
| | |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| [![Status badge](https://status.runtimeterror.dev/api/badge/6/uptime)](https://status.runtimeterror.dev/status/simplex) | [[details](https://l.runtimeterror.dev/smp_status)] |
|
| [![Uptime](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fjbowdre%2Fupptime%2Fmaster%2Fapi%2Fsmp-vpota-to-5223%2Fuptime.json)](https://status.runtimeterror.dev/history/smp-vpota-to-5223) | [[netdata](https://l.runtimeterror.dev/smp_status)] |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -42,7 +40,7 @@ Just add these in the SimpleX app at **Settings > Network & servers > SMP server
|
||||||
|
|
||||||
| | |
|
| | |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| [![Status badge](https://status.runtimeterror.dev/api/badge/4/uptime)](https://status.runtimeterror.dev/status/simplex) | [[details](https://l.runtimeterror.dev/smp1_status)] |
|
| [![Uptime](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fjbowdre%2Fupptime%2Fmaster%2Fapi%2Fsmp1-vpota-to-5223%2Fuptime.json)](https://status.runtimeterror.dev/history/smp1-vpota-to-5223) | [[netdata](https://l.runtimeterror.dev/smp1_status)] |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -52,4 +50,4 @@ Just add these in the SimpleX app at **Settings > Network & servers > SMP server
|
||||||
|
|
||||||
| | |
|
| | |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| [![Status badge](https://status.runtimeterror.dev/api/badge/5/uptime)](https://status.runtimeterror.dev/status/simplex) | [[details](https://l.runtimeterror.dev/smp2_status)] |
|
| [![Uptime](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fjbowdre%2Fupptime%2Fmaster%2Fapi%2Fsmp2-vpota-to-5223%2Fuptime.json)](https://status.runtimeterror.dev/history/smp2-vpota-to-5223) | [[netdata](https://l.runtimeterror.dev/smp2_status)] |
|
||||||
|
|
|
@ -42,8 +42,14 @@
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- if ne $showComments false }}
|
{{- if ne $showComments false }}
|
||||||
<hr>
|
<hr>
|
||||||
{{- if eq .Site.Params.analytics true }}
|
{{- $showKudos := true }}
|
||||||
<span class="post_kudos">Enjoyed this post? <button class="tinylytics_kudos"></button></span>
|
{{- if eq .Site.Params.kudos false }}
|
||||||
|
{{- $showKudos = false }}
|
||||||
|
{{- else if eq .Params.kudos false }}
|
||||||
|
{{- $showKudos = false }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and (eq .Site.Params.analytics true) (ne $showKudos false) }}
|
||||||
|
<span class="post_kudos">Celebrate this post: <button class="tinylytics_kudos"></button></span>
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- partial "comments" . }}
|
{{- partial "comments" . }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
|
@ -42,3 +42,7 @@
|
||||||
<hr>
|
<hr>
|
||||||
<h3>status.lol</h3>
|
<h3>status.lol</h3>
|
||||||
<script src="https://status.lol/jbowdre.js?time&link&fluent&pretty"></script>
|
<script src="https://status.lol/jbowdre.js?time&link&fluent&pretty"></script>
|
||||||
|
{{- if eq .Site.Params.analytics true }}
|
||||||
|
<hr>
|
||||||
|
<a href="" target="_blank" class="tinylytics_webring" title="Tinylytics Webring">️🕸<img class="tinylytics_webring_avatar" src="" style="display: none"/>💍</a>
|
||||||
|
{{- end }}
|
|
@ -6,11 +6,7 @@
|
||||||
<!-- Back to Top button via https://github.com/vfeskov/vanilla-back-to-top -->
|
<!-- Back to Top button via https://github.com/vfeskov/vanilla-back-to-top -->
|
||||||
{{ $jsToTop := resources.Get "js/back-to-top.js" | minify }}
|
{{ $jsToTop := resources.Get "js/back-to-top.js" | minify }}
|
||||||
<script src="{{ $jsToTop.RelPermalink }}"></script>
|
<script src="{{ $jsToTop.RelPermalink }}"></script>
|
||||||
<script>addBackToTop({
|
<script>addBackToTop()</script>
|
||||||
diameter: 56,
|
|
||||||
backgroundColor: '#383838',
|
|
||||||
textColor: '#c45a5a'
|
|
||||||
})</script>
|
|
||||||
|
|
||||||
<!-- Search index via https://victoria.dev/blog/add-search-to-hugo-static-sites-with-lunr/ -->
|
<!-- Search index via https://victoria.dev/blog/add-search-to-hugo-static-sites-with-lunr/ -->
|
||||||
{{ partial "search-index.html" .}}
|
{{ partial "search-index.html" .}}
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
|
|
||||||
{{ if eq .Site.Params.analytics true }}
|
{{ if eq .Site.Params.analytics true }}
|
||||||
<!-- tinylytics -->
|
<!-- tinylytics -->
|
||||||
<script src="https://tinylytics.app/embed/z4bwvaCBkF39NcDDLsRu.js?kudos=🎉" defer></script>
|
<script src="https://tinylytics.app/embed/z4bwvaCBkF39NcDDLsRu.js?kudos=🎉&webring=avatars" defer></script>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
<!-- syntax highlighting -->
|
<!-- syntax highlighting -->
|
||||||
|
|
|
@ -260,7 +260,6 @@ form button {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
|
grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
|
||||||
grid-gap: 0.5rem;
|
grid-gap: 0.5rem;
|
||||||
/* justify-content: center; */
|
|
||||||
margin: 0.5rem 0;
|
margin: 0.5rem 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -283,7 +282,7 @@ blockquote {
|
||||||
padding-left: 0.25rem;
|
padding-left: 0.25rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* tinylytics kudos styling*/
|
/* tinylytics styling*/
|
||||||
.post_kudos {
|
.post_kudos {
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
|
@ -304,6 +303,18 @@ button.tinylytics_kudos:hover {
|
||||||
text-shadow: var(--off-fg) 0 0 1px;
|
text-shadow: var(--off-fg) 0 0 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
img.tinylytics_webring_avatar {
|
||||||
|
border-radius: 100%;
|
||||||
|
height: 2rem;
|
||||||
|
width: 2rem;
|
||||||
|
vertical-align:middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.tinylytics_webring {
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
/* post front matter styling*/
|
/* post front matter styling*/
|
||||||
.frontmatter hr {
|
.frontmatter hr {
|
||||||
margin-bottom: 0rem;
|
margin-bottom: 0rem;
|
||||||
|
@ -334,3 +345,24 @@ button.tinylytics_kudos:hover {
|
||||||
font-size: 0.8rem;
|
font-size: 0.8rem;
|
||||||
color: var(--off-fg);
|
color: var(--off-fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* back-to-top styling */
|
||||||
|
#back-to-top {
|
||||||
|
background: var(--inner-bg);
|
||||||
|
height: 56px;
|
||||||
|
width: 56px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#back-to-top svg {
|
||||||
|
fill: var(--link);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* footnote link styling */
|
||||||
|
.footnote-backref {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* hr override */
|
||||||
|
hr {
|
||||||
|
margin-top: 1.5rem;
|
||||||
|
}
|
|
@ -2,20 +2,20 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--base00: #181818; /* bg */
|
--base00: #090909; /* bg */
|
||||||
--base01: #282828; /* off-bg */
|
--base01: #1c1c1c; /* off-bg */
|
||||||
--base02: #383838; /* inner-bg */
|
--base02: #292929; /* inner-bg */
|
||||||
--base03: #585858; /* muted */
|
--base03: #6d6c6c; /* muted */
|
||||||
--base04: #abaaaa; /* off-fg */
|
--base04: #abaaaa; /* off-fg */
|
||||||
--base05: #d8d8d8; /* fg */
|
--base05: #d8d8d8; /* fg */
|
||||||
--base06: #cfcfcf; /* code */
|
--base06: #75f558; /* code */
|
||||||
--base07: #5f8700; /* user prompt */
|
--base07: #5f8700; /* user prompt */
|
||||||
--base08: #ab4642; /* root prompt */
|
--base08: #ab4642; /* root prompt */
|
||||||
--base09: #dc9656;
|
--base09: #dc9656;
|
||||||
--base0A: #f7ca88; /* highlight */
|
--base0A: #f7ca88; /* highlight */
|
||||||
--base0B: #772a28; /* logo */
|
--base0B: #682523; /* logo */
|
||||||
--base0C: #ab2321; /* hover */
|
--base0C: #ab2321; /* hover */
|
||||||
--base0D: #c45a5a; /* link */
|
--base0D: #d36060; /* link */
|
||||||
--base0E: #ba8baf;
|
--base0E: #ba8baf;
|
||||||
--base0F: #a16946;
|
--base0F: #a16946;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue