xe revised this gist . Go to revision
1 file changed, 1 insertion, 1 deletion
botstopper.md
@@ -19,7 +19,7 @@ Install BotStopper like you would Anubis, but replace the image reference. EG: | |||
19 | 19 | ||
20 | 20 | ### Binary packages | |
21 | 21 | ||
22 | - | Binary packages will be available by request, the main difference is that the package name is `techaro-botstopper`, the binary is `/usr/bin/botstopper`, and the configuration is in `/etc/techaro-botstopper`. Otherwise [everything here applies](https://anubis.techaro.lol/docs/admin/native-install). | |
22 | + | Binary packages will be available by request, the main difference is that the package name is `techaro-botstopper`, the systemd service is `techaro-botstopper@your-instance.service`, the binary is `/usr/bin/botstopper`, and the configuration is in `/etc/techaro-botstopper`. Otherwise [everything here applies](https://anubis.techaro.lol/docs/admin/native-install). | |
23 | 23 | ||
24 | 24 | ### Docker / Podman | |
25 | 25 |
xe revised this gist . Go to revision
1 file changed, 270 insertions
botstopper.md(file created)
@@ -0,0 +1,270 @@ | |||
1 | + | # BotStopper | |
2 | + | ||
3 | + | The commercial patchset for Anubis. | |
4 | + | ||
5 | + | Everything in [the upstream Anubis docs](https://anubis.techaro.lol/docs) applies here, with the exceptions of these settings only exposed via BotStopper: | |
6 | + | ||
7 | + | - Custom images and CSS | |
8 | + | - Custom message titles | |
9 | + | - Many instances of "Anubis" replaced with "BotStopper" | |
10 | + | ||
11 | + | ## Installation | |
12 | + | ||
13 | + | Install BotStopper like you would Anubis, but replace the image reference. EG: | |
14 | + | ||
15 | + | ```diff | |
16 | + | -ghcr.io/techarohq/anubis:latest | |
17 | + | +ghcr.io/techarohq/botstopper/anubis:latest | |
18 | + | ``` | |
19 | + | ||
20 | + | ### Binary packages | |
21 | + | ||
22 | + | Binary packages will be available by request, the main difference is that the package name is `techaro-botstopper`, the binary is `/usr/bin/botstopper`, and the configuration is in `/etc/techaro-botstopper`. Otherwise [everything here applies](https://anubis.techaro.lol/docs/admin/native-install). | |
23 | + | ||
24 | + | ### Docker / Podman | |
25 | + | ||
26 | + | In order to pull the BotStopper image, you need to [authenticate with GitHub's Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#authenticating-to-the-container-registry). | |
27 | + | ||
28 | + | ```text | |
29 | + | docker login ghcr.io -u your-username --password-stdin | |
30 | + | ``` | |
31 | + | ||
32 | + | Then you can use the image as normal. | |
33 | + | ||
34 | + | ### Kubernetes | |
35 | + | ||
36 | + | If you are using Kubernetes, you will need to create an image pull secret: | |
37 | + | ||
38 | + | ```text | |
39 | + | kubectl create secret docker-registry \ | |
40 | + | techarohq-botstopper \ | |
41 | + | --docker-server ghcr.io \ | |
42 | + | --docker-username your-username \ | |
43 | + | --docker-password your-access-token \ | |
44 | + | --docker-email your@email.address | |
45 | + | ``` | |
46 | + | ||
47 | + | Then attach it to your Deployment: | |
48 | + | ||
49 | + | ```diff | |
50 | + | spec: | |
51 | + | securityContext: | |
52 | + | fsGroup: 1000 | |
53 | + | + imagePullSecrets: | |
54 | + | + - name: techarohq-botstopper | |
55 | + | ``` | |
56 | + | ||
57 | + | ## Configuration | |
58 | + | ||
59 | + | ### Docker compose | |
60 | + | ||
61 | + | Follow [the upstream Docker compose directions](https://anubis.techaro.lol/docs/admin/environments/docker-compose) with the following additional options: | |
62 | + | ||
63 | + | ```diff | |
64 | + | anubis: | |
65 | + | image: ghcr.io/techarohq/botstopper/anubis:latest | |
66 | + | environment: | |
67 | + | BIND: ":8080" | |
68 | + | DIFFICULTY: "4" | |
69 | + | METRICS_BIND: ":9090" | |
70 | + | SERVE_ROBOTS_TXT: "true" | |
71 | + | TARGET: "http://nginx" | |
72 | + | OG_PASSTHROUGH: "true" | |
73 | + | OG_EXPIRY_TIME: "24h" | |
74 | + | ||
75 | + | + # botstopper config here | |
76 | + | + CHALLENGE_TITLE: "Doing math for your connnection!" | |
77 | + | + ERROR_TITLE: "Something went wrong!" | |
78 | + | + OVERLAY_FOLDER: /assets | |
79 | + | + volumes: | |
80 | + | + - "./your_folder:/assets" | |
81 | + | ``` | |
82 | + | ||
83 | + | #### Example | |
84 | + | ||
85 | + | There is an example in [docker-compose.yaml](./docker-compose.yaml). Start the example with `docker compose up`: | |
86 | + | ||
87 | + | ```text | |
88 | + | docker compose up -d | |
89 | + | ``` | |
90 | + | ||
91 | + | And then open [https://botstopper.local.cetacean.club:8443](https://botstopper.local.cetacean.club:8443) in your browser. | |
92 | + | ||
93 | + | > [!NOTE] | |
94 | + | > This uses locally signed sacrificial TLS certificates stored in `./demo/pki`. Your browser will rightly reject these. Here is what the example looks like: | |
95 | + | > | |
96 | + | >  | |
97 | + | ||
98 | + | ## Custom images and CSS | |
99 | + | ||
100 | + | Anubis uses an internal filesystem that contains CSS, JavaScript, and images. The BotStopper variant of Anubis lets you specify an overlay folder with the environment variable `OVERLAY_FOLDER`. The contents of this folder will be overlaid on top of Anubis' internal filesystem, allowing you to easily customize the images and CSS. | |
101 | + | ||
102 | + | Your directory tree should look like this, assuming your data is in `./your_folder`: | |
103 | + | ||
104 | + | ```text | |
105 | + | ./your_folder | |
106 | + | └── static | |
107 | + | ├── css | |
108 | + | │ └── custom.css | |
109 | + | └── img | |
110 | + | ├── happy.webp | |
111 | + | ├── pensive.webp | |
112 | + | └── reject.webp | |
113 | + | ``` | |
114 | + | ||
115 | + | For an example directory tree using some off-the-shelf images the Tango icon set, see the [testdata](./testdata) folder. | |
116 | + | ||
117 | + | ### Custom CSS | |
118 | + | ||
119 | + | CSS customization is done mainly with CSS variables. Here is an example that sets Anubis to use a very neutral white-on-black theme: | |
120 | + | ||
121 | + | ```css | |
122 | + | :root { | |
123 | + | /* Font customization | |
124 | + | */ | |
125 | + | --body-sans-font: sans-serif; | |
126 | + | --body-preformatted-font: monospace; | |
127 | + | --body-title-font: serif; | |
128 | + | ||
129 | + | /* To use the default fonts: | |
130 | + | ||
131 | + | --body-sans-font: Geist, sans-serif; | |
132 | + | --body-preformatted-font: Iosevka Curly Iaso, monospace; | |
133 | + | --body-title-font: Podkova, serif; | |
134 | + | ||
135 | + | @font-face { | |
136 | + | font-family: "Geist"; | |
137 | + | font-style: normal; | |
138 | + | font-weight: 100 900; | |
139 | + | font-display: swap; | |
140 | + | src: url("/.within.website/x/xess/static/geist.woff2") format("woff2"); | |
141 | + | } | |
142 | + | ||
143 | + | @font-face { | |
144 | + | font-family: "Podkova"; | |
145 | + | font-style: normal; | |
146 | + | font-weight: 400 800; | |
147 | + | font-display: swap; | |
148 | + | src: url("/.within.website/x/xess/static/podkova.woff2") format("woff2"); | |
149 | + | } | |
150 | + | ||
151 | + | @font-face { | |
152 | + | font-family: "Iosevka Curly"; | |
153 | + | font-style: monospace; | |
154 | + | font-display: swap; | |
155 | + | src: url("/.within.website/x/xess/static/iosevka-curly.woff2") format("woff2"); | |
156 | + | } | |
157 | + | ||
158 | + | */ | |
159 | + | ||
160 | + | /* Color customization, these correlate to the locations in `xess.css` in the upstream | |
161 | + | Anubis repo: https://github.com/TecharoHQ/anubis/blob/main/xess/xess.css | |
162 | + | ||
163 | + | Experimentation may be required. | |
164 | + | */ | |
165 | + | --background: #000000; | |
166 | + | --text: #ffffff; | |
167 | + | --text-selection: #d3869b; | |
168 | + | --preformatted-background: #3c3836; | |
169 | + | --link-foreground: #0000ee; | |
170 | + | --link-background: inherit; | |
171 | + | --blockquote-border-left: 1px solid #bdae93; | |
172 | + | ||
173 | + | /* Customization of the progress bar colors. | |
174 | + | ||
175 | + | Experimentation may be required. | |
176 | + | */ | |
177 | + | --progress-bar-outline: #b16286 solid 4px; | |
178 | + | --progress-bar-fill: #b16286; | |
179 | + | } | |
180 | + | @media (prefers-color-scheme: light) { | |
181 | + | /* BotStopper's CSS is responsive to both light and dark mode. Be sure to support both | |
182 | + | of these in your configuration. | |
183 | + | */ | |
184 | + | :root { | |
185 | + | --background: #ffffff; | |
186 | + | --text: #000000; | |
187 | + | --text-selection: #d3869b; | |
188 | + | --preformatted-background: #ebdbb2; | |
189 | + | --link-foreground: #0000ff; | |
190 | + | --link-background: inherit; | |
191 | + | --blockquote-border-left: 1px solid #655c54; | |
192 | + | } | |
193 | + | } | |
194 | + | ``` | |
195 | + | ||
196 | + | ### Custom fonts | |
197 | + | ||
198 | + | If you want to add custom fonts, copy the `woff2` files alongside your `custom.css` file and then include them with the [`@font-face` CSS at-rule](https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face): | |
199 | + | ||
200 | + | ```css | |
201 | + | @font-face { | |
202 | + | font-family: "Oswald"; | |
203 | + | font-style: normal; | |
204 | + | font-weight: 200 900; | |
205 | + | font-display: swap; | |
206 | + | src: url("./fonts/oswald.woff2") format("woff2"); | |
207 | + | } | |
208 | + | ``` | |
209 | + | ||
210 | + | Then adjust your CSS variables accordingly: | |
211 | + | ||
212 | + | ```css | |
213 | + | :root { | |
214 | + | --body-sans-font: Oswald, sans-serif; | |
215 | + | --body-preformatted-font: monospace; | |
216 | + | --body-title-font: serif; | |
217 | + | } | |
218 | + | ``` | |
219 | + | ||
220 | + | To convert `.ttf` fonts to [Web-optimized woff2 fonts](https://www.w3.org/TR/WOFF2/), use the `woff2_compress` command from the `woff2` or `woff2-tools` package: | |
221 | + | ||
222 | + | ```console | |
223 | + | $ woff2_compress oswald.ttf | |
224 | + | Processing oswald.ttf => oswald.woff2 | |
225 | + | Compressed 159517 to 70469. | |
226 | + | ``` | |
227 | + | ||
228 | + | Then you can import and use it as normal. | |
229 | + | ||
230 | + | ### Customizing images | |
231 | + | ||
232 | + | Anubis uses three images to visually communicate the state of the program. These are: | |
233 | + | ||
234 | + | | Image name | Intended message | Example | | |
235 | + | | :------------- | :----------------------------------------------- | :--------------------------------- | | |
236 | + | | `happy.webp` | You have passed validation, all is good |  | | |
237 | + | | `pensive.webp` | Checking is running, hold steady until it's done |  | | |
238 | + | | `reject.webp` | Something went wrong, this is a terminal state |  | | |
239 | + | ||
240 | + | To make your own images at the optimal quality, use the following ffmpeg command: | |
241 | + | ||
242 | + | ```text | |
243 | + | ffmpeg -i /path/to/image -vf scale=-1:384 happy.webp | |
244 | + | ``` | |
245 | + | ||
246 | + | `ffprobe` should report something like this on the generated images: | |
247 | + | ||
248 | + | ```text | |
249 | + | Input #0, webp_pipe, from 'happy.webp': | |
250 | + | Duration: N/A, bitrate: N/A | |
251 | + | Stream #0:0: Video: webp, none, 25 fps, 25 tbr, 25 tbn | |
252 | + | ``` | |
253 | + | ||
254 | + | In testing 384 by 384 pixels gives the best balance between filesize, quality, and clarity. | |
255 | + | ||
256 | + | ```text | |
257 | + | $ du -hs * | |
258 | + | 4.0K happy.webp | |
259 | + | 12K pensive.webp | |
260 | + | 8.0K reject.webp | |
261 | + | ``` | |
262 | + | ||
263 | + | ## Customizing messages | |
264 | + | ||
265 | + | You can customize messages using the following environment variables: | |
266 | + | ||
267 | + | | Message | Environment variable | Default | | |
268 | + | | :------------------- | :------------------- | :----------------------------------------- | | |
269 | + | | Challenge page title | `CHALLENGE_TITLE` | `Ensuring the security of your connection` | | |
270 | + | | Error page title | `ERROR_TITLE` | `Error` | |