commit
5ac660838a
@ -0,0 +1,8 @@
|
|||||||
|
/node_modules/
|
||||||
|
/public/build/
|
||||||
|
/public/
|
||||||
|
|
||||||
|
.DS_Store
|
||||||
|
public/posts.json
|
||||||
|
|
||||||
|
config-prod.toml
|
@ -0,0 +1,28 @@
|
|||||||
|
http://localhost, http://babypool.lol, http://babypool-lol.fly.dev {
|
||||||
|
bind 0.0.0.0
|
||||||
|
root * /usr/share/caddy/babypool.lol
|
||||||
|
file_server
|
||||||
|
encode gzip
|
||||||
|
header orig-server Caddy
|
||||||
|
|
||||||
|
basic_auth {
|
||||||
|
wperron $2y$10$79.4ujIzCrSY9kAVUrjjNu.cZ1nShU2Y8.AkoxRzNv4DhhuRRy2.e
|
||||||
|
}
|
||||||
|
|
||||||
|
log {
|
||||||
|
output file /var/log/caddy.log {
|
||||||
|
roll_uncompressed
|
||||||
|
roll_keep_for 168h # 7d
|
||||||
|
}
|
||||||
|
format json {
|
||||||
|
time_format rfc3339
|
||||||
|
time_local
|
||||||
|
duration_format nano
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:9091 {
|
||||||
|
bind 0.0.0.0
|
||||||
|
metrics /metrics
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
# Download Caddy binary from GitHub releases
|
||||||
|
FROM ubuntu:24.04 as caddy_downloader
|
||||||
|
WORKDIR /dl
|
||||||
|
RUN apt update && apt install -y curl
|
||||||
|
RUN curl -sL -o caddy_2.8.4_linux_amd64.tar.gz https://github.com/caddyserver/caddy/releases/download/v2.8.4/caddy_2.8.4_linux_amd64.tar.gz
|
||||||
|
RUN tar -xzf caddy_2.8.4_linux_amd64.tar.gz && mv caddy /usr/local/bin
|
||||||
|
|
||||||
|
FROM ubuntu:24.04
|
||||||
|
WORKDIR /build
|
||||||
|
RUN apt update && apt install -y tzdata net-tools && apt clean
|
||||||
|
COPY --from=caddy_downloader /usr/local/bin/caddy /usr/local/bin/caddy
|
||||||
|
COPY ./static /usr/share/caddy/babypool.lol
|
||||||
|
COPY ./Caddyfile /etc/caddy/Caddyfile
|
||||||
|
CMD ["caddy", "run", "--config=/etc/caddy/Caddyfile", "--adapter=caddyfile"]
|
@ -0,0 +1,57 @@
|
|||||||
|
# Babypool.lol
|
||||||
|
|
||||||
|
An _anonymous_ baby pool website.
|
||||||
|
|
||||||
|
## How it works
|
||||||
|
|
||||||
|
You create a new new pool, choose the games you want to include and that's it.
|
||||||
|
No need to register, enter an email or a password or anything like that. Each
|
||||||
|
pool is given an ID that you can share with whoever you want to participate, you
|
||||||
|
can optionally select a password to make sure no strangers participate, and you
|
||||||
|
are given a unique token that gives you access to see the pool's entries and
|
||||||
|
select a winner. For participants, you need to include an email address so that
|
||||||
|
you can be contacted if you win, but there's no validation step involved, and
|
||||||
|
the email addresses are purged when a pool is closed, or at most 3 months after
|
||||||
|
the expected end date has passed.
|
||||||
|
|
||||||
|
## Games Included
|
||||||
|
|
||||||
|
You can choose whichever games you want to include in the pool, with a minimum
|
||||||
|
of one selected of course.
|
||||||
|
|
||||||
|
- Date
|
||||||
|
- Time of Day
|
||||||
|
- Weight
|
||||||
|
- Height
|
||||||
|
- Biological Sex
|
||||||
|
|
||||||
|
## Technical details
|
||||||
|
|
||||||
|
There are two tables: Pools, and Pool Entries.
|
||||||
|
|
||||||
|
Pools table:
|
||||||
|
| Column Name | Type | Constraints |
|
||||||
|
| ----------- | -------- | ----------- |
|
||||||
|
| ID | ULID | Unique |
|
||||||
|
| admin token | String | |
|
||||||
|
| password | bcrypt | |
|
||||||
|
| games | []String | |
|
||||||
|
|
||||||
|
`games` must a Set containing, from these possible values: `DAY`, `TIME`,
|
||||||
|
`WEIGHT`, `HEIGHT`, `BIOSEX`.
|
||||||
|
|
||||||
|
Pool Entries:
|
||||||
|
| Column Name | Type | Constraints |
|
||||||
|
| ----------- | ------ | ----------- |
|
||||||
|
| Pool ID | ULID | FK |
|
||||||
|
| email | String | |
|
||||||
|
| guesses | JSON | |
|
||||||
|
|
||||||
|
`guesses` must satisfy the following schema:
|
||||||
|
|
||||||
|
```
|
||||||
|
[]struct{
|
||||||
|
game string // one of DAY, TIME, WEIGHT, HEIGHT, BIOSEX
|
||||||
|
val: date | time | { v: int, unit: string } | ['M', 'F']
|
||||||
|
}
|
||||||
|
```
|
@ -0,0 +1,41 @@
|
|||||||
|
# fly.toml file generated for wperron-io on 2022-05-19T10:44:27-04:00
|
||||||
|
|
||||||
|
app = "babypool-lol"
|
||||||
|
primary_region = "yul"
|
||||||
|
|
||||||
|
[processes]
|
||||||
|
caddy = "caddy run --config /etc/caddy/Caddyfile --adapter caddyfile"
|
||||||
|
|
||||||
|
[metrics]
|
||||||
|
port = 9091
|
||||||
|
path = "/metrics"
|
||||||
|
|
||||||
|
[env]
|
||||||
|
TZ = "America/New_York"
|
||||||
|
|
||||||
|
[[services]]
|
||||||
|
http_checks = []
|
||||||
|
internal_port = 80
|
||||||
|
processes = ["caddy"]
|
||||||
|
protocol = "tcp"
|
||||||
|
script_checks = []
|
||||||
|
|
||||||
|
[services.concurrency]
|
||||||
|
hard_limit = 25
|
||||||
|
soft_limit = 20
|
||||||
|
type = "connections"
|
||||||
|
|
||||||
|
[[services.ports]]
|
||||||
|
force_https = true
|
||||||
|
handlers = ["http"]
|
||||||
|
port = 80
|
||||||
|
|
||||||
|
[[services.ports]]
|
||||||
|
handlers = ["tls", "http"]
|
||||||
|
port = 443
|
||||||
|
|
||||||
|
[[services.tcp_checks]]
|
||||||
|
grace_period = "1s"
|
||||||
|
interval = "15s"
|
||||||
|
restart_limit = 0
|
||||||
|
timeout = "2s"
|
@ -0,0 +1,9 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<head>
|
||||||
|
<title>babypool.lol</title>
|
||||||
|
<meta charset="utf8" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>404 Not Found</h1>
|
||||||
|
<p>There ain't nothing here chief.</p>
|
||||||
|
</body>
|
@ -0,0 +1,4 @@
|
|||||||
|
body {
|
||||||
|
width: 50%;
|
||||||
|
margin: auto;
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<head>
|
||||||
|
<title>babypool.lol</title>
|
||||||
|
<meta charset="utf8" />
|
||||||
|
<link rel="stylesheet" href="index.html" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello Babypool.lol!</h1>
|
||||||
|
</body>
|
@ -0,0 +1,2 @@
|
|||||||
|
User-agent: *
|
||||||
|
Disallow: /
|
Loading…
Reference in new issue