art page
This commit is contained in:
parent
4cbe13cd80
commit
56ffd6a897
|
@ -43,6 +43,13 @@ input {
|
||||||
font: 18px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
font: 18px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
padding: 0px 0px 0px 30px;
|
||||||
|
font-family: monospace;
|
||||||
|
background: #cccccc;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
/* Dark mode styles */
|
/* Dark mode styles */
|
||||||
@media (prefers-color-scheme: dark) {
|
@media (prefers-color-scheme: dark) {
|
||||||
body {
|
body {
|
||||||
|
@ -55,6 +62,10 @@ input {
|
||||||
background: #181818;
|
background: #181818;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
background: #181818;
|
||||||
|
}
|
||||||
|
|
||||||
a:link {
|
a:link {
|
||||||
color: #58a6ff;
|
color: #58a6ff;
|
||||||
}
|
}
|
||||||
|
@ -138,5 +149,3 @@ input {
|
||||||
.game-list {
|
.game-list {
|
||||||
border-spacing: 20px 30px;
|
border-spacing: 20px 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
3
pages/art.md
Normal file
3
pages/art.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# Yuya - Art
|
||||||
|
|
||||||
|
*work in progress*
|
|
@ -10,9 +10,12 @@
|
||||||
<div class="sidenav">
|
<div class="sidenav">
|
||||||
<h3><a href="/">Summary</a></h3>
|
<h3><a href="/">Summary</a></h3>
|
||||||
<h3><a href="/tools">Tools</a></h3>
|
<h3><a href="/tools">Tools</a></h3>
|
||||||
|
<a class="description" href="/tools#nixos">os</a>
|
||||||
|
<a class="description" href="/tools#docker">containers</a>
|
||||||
<a class="description" href="/tools#nginx">proxy</a>
|
<a class="description" href="/tools#nginx">proxy</a>
|
||||||
<a class="description" href="/tools#cloudflare">domain</a>
|
<a class="description" href="/tools#cloudflare">domain</a>
|
||||||
<a class="description" href="/tools#portainer">dashboard</a>
|
<a class="description" href="/tools#portainer">dashboard</a>
|
||||||
|
<a class="description" href="/tools#yuya">website</a>
|
||||||
<a class="description" href="/tools#pihole">adblocker</a>
|
<a class="description" href="/tools#pihole">adblocker</a>
|
||||||
<a class="description" href="/tools#searxng">search</a>
|
<a class="description" href="/tools#searxng">search</a>
|
||||||
<a class="description" href="/tools#forgejo">git server</a>
|
<a class="description" href="/tools#forgejo">git server</a>
|
||||||
|
@ -37,7 +40,7 @@
|
||||||
|
|
||||||
<h2 id="epilogue">Epilogue</h2>
|
<h2 id="epilogue">Epilogue</h2>
|
||||||
|
|
||||||
<p>Inspired by the geniuses behind <a href="https://perfectmotherfuckingwebsite.com/">perfectwebsite.com</a>,
|
<p>Inspired by the geniuses behind <a href="https://perfectmotherfuckingwebsite.com/">the perfect website</a>,
|
||||||
because a webpage does not have to be heavier than <a href="https://github.com/chrislgarry/Apollo-11">the code that took us to the moon</a>.</p>
|
because a webpage does not have to be heavier than <a href="https://github.com/chrislgarry/Apollo-11">the code that took us to the moon</a>.</p>
|
||||||
|
|
||||||
<p>This page is licensed under <a href="https://creativecommons.org/publicdomain/zero/1.0/">CC0</a></p>
|
<p>This page is licensed under <a href="https://creativecommons.org/publicdomain/zero/1.0/">CC0</a></p>
|
||||||
|
|
288
pages/tools.md
288
pages/tools.md
|
@ -1,38 +1,129 @@
|
||||||
# Yuya - Tools
|
# Yuya - Tools
|
||||||
|
|
||||||
|
###### nixos
|
||||||
|
|
||||||
|
## A beautiful declarative OS
|
||||||
|
|
||||||
|
I am using [NixOS](https://nixos.org/) on all 3 of my machines (my laptop and both of my servers).
|
||||||
|
That allows me multiple things :
|
||||||
|
|
||||||
|
- A reproducible architecture :
|
||||||
|
If I wipe my system I can recreate it perfectly using my config,
|
||||||
|
and no package will stop working because of undeclared dependency
|
||||||
|
|
||||||
|
- My environnement everywhere :
|
||||||
|
My config is set up so that all my cli tools are installed on the
|
||||||
|
3 machines (with the same config), so I find myself at home
|
||||||
|
wherever I am. However while the 3 have a common config, they also
|
||||||
|
each have their separate config, for example only my laptop has a
|
||||||
|
graphic environment, and only the bathhouse server has the [proxy](/tools#nginx)
|
||||||
|
config.
|
||||||
|
|
||||||
|
- A declarative system :
|
||||||
|
I make a lot of mess when I debug an issue and I tend to touch
|
||||||
|
a lot of stuff to ty to fix my problem, so some obscure config
|
||||||
|
could turn against me month later.
|
||||||
|
But when your system is completely declared in the same place,
|
||||||
|
and that config represent exaclty the state of my computer,
|
||||||
|
everything is easier to clean.
|
||||||
|
|
||||||
|
###### docker
|
||||||
|
|
||||||
|
## A container System
|
||||||
|
|
||||||
|
> > to document
|
||||||
|
|
||||||
###### nginx
|
###### nginx
|
||||||
|
|
||||||
## Nginx
|
## A reverse Proxy
|
||||||
|
|
||||||
> > to document
|
> > to document
|
||||||
|
|
||||||
###### cloudflare
|
###### cloudflare
|
||||||
|
|
||||||
## Cloudflare
|
## My domain (penwing.org) and Some Tunnels
|
||||||
|
|
||||||
> > to document
|
> > to document
|
||||||
|
|
||||||
|
*on the bathhouse server*
|
||||||
|
```
|
||||||
|
|
||||||
|
services:
|
||||||
|
cloudflared:
|
||||||
|
image: cloudflare/cloudflared
|
||||||
|
container_name: cloudflare-tunnel
|
||||||
|
restart: unless-stopped
|
||||||
|
command: tunnel run
|
||||||
|
environment:
|
||||||
|
- TUNNEL_TOKEN=your-token
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
###### portainer
|
###### portainer
|
||||||
|
|
||||||
## A dashboard ⌨
|
## A dashboard ⌨
|
||||||
|
|
||||||
|
*local network only x)*
|
||||||
|
|
||||||
Being as new to docker container as I was (and still am), I wanted a pretty
|
Being as new to docker container as I was (and still am), I wanted a pretty
|
||||||
dashboard to motinor and tinker with the containers I run on the server.
|
dashboard to motinor and tinker with the containers I run on the server.
|
||||||
I chose [portainer](https://www.portainer.io/") for its beginner-friendliness,
|
I chose [portainer](https://www.portainer.io/") for its beginner-friendliness,
|
||||||
and it never failed me (yet).
|
and it never failed me (yet).
|
||||||
|
|
||||||
*port.penwing.org*
|
This is the only thing installed on the 2 servers (so I can monitor them both).
|
||||||
|
And they both call to the same ui (hosted on the bathhouse server)
|
||||||
|
|
||||||
|
**bathouse** config
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
services:
|
||||||
|
portainer:
|
||||||
|
image: portainer/portainer-ce:latest
|
||||||
|
ports:
|
||||||
|
- 9000:9000
|
||||||
|
volumes:
|
||||||
|
- ./data:/data
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
**boiler** config (yeah it is a run instead of a compose, but I am lazy)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
docker run -d -p 9001:9001 \
|
||||||
|
--name portainer_agent \
|
||||||
|
--restart=always \
|
||||||
|
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||||
|
-v /var/lib/docker/volumes:/var/lib/docker/volumes \
|
||||||
|
portainer/agent:2.19.5
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
###### yuya
|
||||||
|
|
||||||
|
## This website
|
||||||
|
|
||||||
|
[www.penwing.org](https://www.penwing.org)
|
||||||
|
|
||||||
|
> > to document
|
||||||
|
|
||||||
###### pihole
|
###### pihole
|
||||||
|
|
||||||
## An adblocker 🛑
|
## An adblocker / DNS Record 🛑
|
||||||
|
|
||||||
*local network only x)*
|
*local network only x)*
|
||||||
|
|
||||||
|
> > to document
|
||||||
|
|
||||||
###### searxng
|
###### searxng
|
||||||
|
|
||||||
## A search engine 🔍
|
## A search engine 🔍
|
||||||
|
|
||||||
|
[search.penwing.org](https://search.penwing.org)
|
||||||
|
|
||||||
I am not a big corporate fan *(as a linux user, surprising)*, so I was
|
I am not a big corporate fan *(as a linux user, surprising)*, so I was
|
||||||
unhappy about relying on google for my searchs. Not because of its hunger for data
|
unhappy about relying on google for my searchs. Not because of its hunger for data
|
||||||
but merely because I want to search for informations and not accept whatever google
|
but merely because I want to search for informations and not accept whatever google
|
||||||
|
@ -41,40 +132,217 @@ is a **self-hostable meta search engine** (a bit of a mouthful). What it means
|
||||||
in practice is that it will sort results according to *multiple sources*
|
in practice is that it will sort results according to *multiple sources*
|
||||||
instead of just one (and you can choose the sources !)
|
instead of just one (and you can choose the sources !)
|
||||||
|
|
||||||
*search.penwing.org*
|
on the **bathhouse** server
|
||||||
|
```
|
||||||
|
|
||||||
|
services:
|
||||||
|
searxng:
|
||||||
|
image: searxng/searxng
|
||||||
|
container_name: searxng
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "32768:8080"
|
||||||
|
volumes:
|
||||||
|
- ./settings:/etc/searxng:rw
|
||||||
|
environment:
|
||||||
|
- BASE_URL=https://search.penwing.org/
|
||||||
|
- INSTANCE_NAME=penwing
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
###### forgejo
|
###### forgejo
|
||||||
|
|
||||||
## Some git versioning 🗃
|
## Some git versioning 🗃
|
||||||
|
|
||||||
|
[git.penwing.org](https://git.penwing.org)
|
||||||
|
|
||||||
> > to document
|
> > to document
|
||||||
|
|
||||||
*git.penwing.org*
|
on the **bathhouse** server
|
||||||
|
```
|
||||||
|
|
||||||
|
networks:
|
||||||
|
forgejo:
|
||||||
|
external: false
|
||||||
|
|
||||||
|
services:
|
||||||
|
server:
|
||||||
|
image: codeberg.org/forgejo/forgejo:7
|
||||||
|
container_name: forgejo
|
||||||
|
environment:
|
||||||
|
- USER_UID=1000
|
||||||
|
- USER_GID=1000
|
||||||
|
- FORGEJO__database__DB_TYPE=mysql
|
||||||
|
- FORGEJO__database__HOST=db:3306
|
||||||
|
- FORGEJO__database__NAME=forgejo
|
||||||
|
- FORGEJO__database__USER=forgejo
|
||||||
|
- FORGEJO__database__PASSWD=forgejo
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- forgejo
|
||||||
|
volumes:
|
||||||
|
- ./forgejo:/data
|
||||||
|
- /etc/timezone:/etc/timezone:ro
|
||||||
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
- "4023:22"
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
|
||||||
|
db:
|
||||||
|
image: mysql:8
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
- MYSQL_ROOT_PASSWORD=forgejo
|
||||||
|
- MYSQL_USER=forgejo
|
||||||
|
- MYSQL_PASSWORD=forgejo
|
||||||
|
- MYSQL_DATABASE=forgejo
|
||||||
|
networks:
|
||||||
|
- forgejo
|
||||||
|
volumes:
|
||||||
|
- ./mysql:/var/lib/mysql
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
###### jellyfin
|
###### jellyfin
|
||||||
|
|
||||||
## Some movies 🎬
|
## Some movies 🎬
|
||||||
|
|
||||||
|
[movie.penwing.org](https://movie.penwing.org)
|
||||||
|
|
||||||
As a huge movie watcher, which I collect very legally, I had to make myself a
|
As a huge movie watcher, which I collect very legally, I had to make myself a
|
||||||
collection. But why not share it with my friends ? So I use my server to host a
|
collection. But why not share it with my friends ? So I use my server to host a
|
||||||
[Jellyfin](https://jellyfin.org/) instance
|
[Jellyfin](https://jellyfin.org/) instance
|
||||||
|
|
||||||
*movie.penwing.org*
|
on the **boiler** server
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
services:
|
||||||
|
jellyfin:
|
||||||
|
image: jellyfin/jellyfin
|
||||||
|
container_name: jelly_compose
|
||||||
|
environment:
|
||||||
|
- VIRTUAL_HOST=movie.penwing.org
|
||||||
|
ports:
|
||||||
|
- "8096:8096"
|
||||||
|
volumes:
|
||||||
|
- jellyfin-config:/config
|
||||||
|
- jellyfin-cache:/cache
|
||||||
|
- /media/storage:/media
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
jellyfin-config:
|
||||||
|
jellyfin-cache:
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
###### stirling
|
###### stirling
|
||||||
|
|
||||||
## A pdf "edition" tool
|
## A pdf "edition" tool
|
||||||
|
|
||||||
> > to document
|
[pdf.penwing.org](https://pdf.penwing.org)
|
||||||
|
|
||||||
*pdf.penwing.org*
|
Disclaimer : a pdf is compiled so it cannot be "edited" per say, only
|
||||||
|
scanned, and recompiled
|
||||||
|
|
||||||
|
You may know the pdf editor [I love PDF](https://www.ilovepdf.com/),
|
||||||
|
the service I host ([Stirling](https://github.com/Stirling-Tools/Stirling-PDF)) is roughly the same, but with a bit more capabilities.
|
||||||
|
For example you can chain together different modifications like :
|
||||||
|
|
||||||
|
scan to pdf - merge pdf - page number - compress - lock
|
||||||
|
|
||||||
|
Also I did not like to upload scan of *sensitive documents* to a random website.
|
||||||
|
|
||||||
|
on the **boiler** server
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
services:
|
||||||
|
stirling-pdf:
|
||||||
|
image: frooodle/s-pdf:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- '1280:8080'
|
||||||
|
volumes:
|
||||||
|
- ./trainingData:/usr/share/tessdata #Required for extra OCR languages
|
||||||
|
- ./extraConfigs:/configs
|
||||||
|
- ./logs:/logs/
|
||||||
|
environment:
|
||||||
|
- DOCKER_ENABLE_SECURITY=false
|
||||||
|
- INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false
|
||||||
|
- LANGS=en_GB
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
###### seafile
|
###### seafile
|
||||||
|
|
||||||
## A file manager 📁
|
## A file manager 📁
|
||||||
|
|
||||||
|
[file.penwing.org](https://file.penwing.org)
|
||||||
|
|
||||||
While I use a lot scp (not the foundation, [the command](https://linux.die.net/man/1/scp)),
|
While I use a lot scp (not the foundation, [the command](https://linux.die.net/man/1/scp)),
|
||||||
I like to have my own remote file drive. Following the move away from google as a
|
I like to have my own remote file drive. Following the move away from google as a
|
||||||
search engine, I want to be free of google drive as well.
|
search engine, I want to be free of google drive as well.
|
||||||
|
|
||||||
*file.penwing.org*
|
I chose [seafile](https://www.seafile.com/en/home/) and I am pretty happy with it.
|
||||||
|
It is very lightweight with lot of optimizations, but to achieve this
|
||||||
|
seafile does not store the files (on the server) in a directory structure.
|
||||||
|
|
||||||
|
(not sure if I will keep it long since I do not use it that much since I become used to scp)
|
||||||
|
|
||||||
|
on the **boiler** server
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
services:
|
||||||
|
db:
|
||||||
|
image: mariadb:10.11
|
||||||
|
container_name: seafile-mysql
|
||||||
|
environment:
|
||||||
|
- MYSQL_ROOT_PASSWORD=password
|
||||||
|
- MYSQL_LOG_CONSOLE=true
|
||||||
|
- MARIADB_AUTO_UPGRADE=1
|
||||||
|
volumes:
|
||||||
|
- ./mysql-data/db:/var/lib/mysql
|
||||||
|
networks:
|
||||||
|
- seafile-net
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
memcached:
|
||||||
|
image: memcached:1.6.18
|
||||||
|
container_name: seafile-memcached
|
||||||
|
entrypoint: ["memcached", "-m", "256"]
|
||||||
|
networks:
|
||||||
|
- seafile-net
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
seafile:
|
||||||
|
image: seafileltd/seafile-mc:10.0-latest
|
||||||
|
container_name: seafile
|
||||||
|
ports:
|
||||||
|
- "7780:80"
|
||||||
|
# - "443:443" #Uncomment if you are using HTTPS
|
||||||
|
volumes:
|
||||||
|
- ./seafile-data:/shared
|
||||||
|
environment:
|
||||||
|
- DB_HOST=db
|
||||||
|
- DB_ROOT_PASSWD=password
|
||||||
|
- TIME_ZONE=Europe/Paris
|
||||||
|
- SEAFILE_SERVER_LETSENCRYPT=false
|
||||||
|
- SEAFILE_SERVER_HOSTNAME=file.penwing.org
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- memcached
|
||||||
|
networks:
|
||||||
|
- seafile-net
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
networks:
|
||||||
|
seafile-net:
|
||||||
|
driver: bridge
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
|
@ -118,6 +118,10 @@ async fn games() -> impl Responder {
|
||||||
serve_markdown("pages/games.md", None).await
|
serve_markdown("pages/games.md", None).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn art() -> impl Responder {
|
||||||
|
serve_markdown("pages/art.md", None).await
|
||||||
|
}
|
||||||
|
|
||||||
async fn wake(query: web::Query<WakeQuery>) -> impl Responder {
|
async fn wake(query: web::Query<WakeQuery>) -> impl Responder {
|
||||||
let password = &query.password;
|
let password = &query.password;
|
||||||
|
|
||||||
|
@ -151,6 +155,7 @@ async fn main() -> std::io::Result<()> {
|
||||||
.route("/tools", web::get().to(tools)) // Route for tools
|
.route("/tools", web::get().to(tools)) // Route for tools
|
||||||
.route("/wake", web::get().to(wake))
|
.route("/wake", web::get().to(wake))
|
||||||
.route("/games", web::get().to(games))
|
.route("/games", web::get().to(games))
|
||||||
|
.route("/art", web::get().to(art))
|
||||||
.service(actix_files::Files::new("/assets", "./assets").show_files_listing())
|
.service(actix_files::Files::new("/assets", "./assets").show_files_listing())
|
||||||
.default_service(web::route().to(summary))
|
.default_service(web::route().to(summary))
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue