Compare commits
21
Commits
6a9e5a5b68
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5ee5a2cfb0 | ||
|
|
f6cfb706da | ||
|
|
7d4f8ca9c5 | ||
|
|
3b661a698e | ||
|
|
132cc91d06 | ||
|
|
0fbe068197 | ||
|
|
2ebf7ca958 | ||
|
|
08c4c78c8e | ||
|
|
9ce6a93b99 | ||
|
|
a20dc43559 | ||
|
|
d56192ce0d | ||
|
|
28ff6a9fdc | ||
|
|
2ea01a8824 | ||
|
|
fe775a5a7e | ||
|
|
33eb9d7748 | ||
|
|
81486654de | ||
|
|
7228c8c131 | ||
|
|
977cfb2197 | ||
|
|
0e98866699 | ||
|
|
596aa4c3f2 | ||
|
|
e5f765dba1 |
@@ -5,9 +5,21 @@
|
|||||||
|
|
||||||
atom.town {
|
atom.town {
|
||||||
root * /srv/home
|
root * /srv/home
|
||||||
file_server
|
|
||||||
encode zstd
|
encode zstd
|
||||||
|
|
||||||
|
# /index.html -> /
|
||||||
|
@indexhtml path_regexp idx ^(.*/)index\.html$
|
||||||
|
redir @indexhtml {re.idx.1} permanent
|
||||||
|
|
||||||
|
# /something.html -> /something
|
||||||
|
@html path_regexp strip ^(.+)\.html$
|
||||||
|
redir @html {re.strip.1} permanent
|
||||||
|
|
||||||
|
# something -> something.html
|
||||||
|
try_files {path} {path}.html {path}/index.html
|
||||||
|
|
||||||
|
file_server
|
||||||
|
|
||||||
@assets path /assets/*
|
@assets path /assets/*
|
||||||
header @assets Cache-Control "public, max-age=604800, immutable"
|
header @assets Cache-Control "public, max-age=604800, immutable"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,3 +11,4 @@ here, you will be at home.
|
|||||||
- [gitea](docs/services/gitea.md)
|
- [gitea](docs/services/gitea.md)
|
||||||
- [backups](docs/backups.md)
|
- [backups](docs/backups.md)
|
||||||
- [misc](docs/misc.md)
|
- [misc](docs/misc.md)
|
||||||
|
- [todo](docs/todo.md)
|
||||||
|
|||||||
+2
-1
@@ -11,7 +11,8 @@ always remember to `docker compose stop` before doing any of this!
|
|||||||
- to back up automatically, run `sudo EDITOR=micro crontab -e` and add the following:
|
- to back up automatically, run `sudo EDITOR=micro crontab -e` and add the following:
|
||||||
```
|
```
|
||||||
TZ=UTC
|
TZ=UTC
|
||||||
0 6 * * * /home/admin/atom.town/scripts/volume-backup.sh
|
0 6 * * * /home/admin/atom.town/scripts/volume-backup.sh cold
|
||||||
|
0 0,12,18 * * * /home/admin/atom.town/scripts/volume-backup.sh hot
|
||||||
```
|
```
|
||||||
|
|
||||||
**restoring**
|
**restoring**
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@
|
|||||||
- `sudo su - admin`
|
- `sudo su - admin`
|
||||||
3. use the system setup script, and log out
|
3. use the system setup script, and log out
|
||||||
- `sudo dnf install git -y`
|
- `sudo dnf install git -y`
|
||||||
- `git clone https://git.atom.town/atom/town`
|
- `git clone https://git.atom.town/atom/town && mv town atom.town`
|
||||||
- `./atom.town/scripts/system-setup.sh`
|
- `./atom.town/scripts/system-setup.sh`
|
||||||
- `exit`
|
- `exit`
|
||||||
4. log in again, populate the `.env` and start everything up
|
4. log in again, populate the `.env` and start everything up
|
||||||
|
|||||||
+10
-9
@@ -1,11 +1,12 @@
|
|||||||
## todo
|
## todo
|
||||||
|
|
||||||
- write terms of service & privacy policy
|
- [ ] put branding on more stuff (images, themes...)
|
||||||
- put branding on more stuff (images, themes...)
|
- [ ] further secure the server (ratelimiting, hardening...)
|
||||||
- further secure the server (ratelimiting, hardening...)
|
- [ ] (maybe) user sites or pages hosting
|
||||||
- ~~figure out best way to store .env, other credentials, and various secrets~~
|
- [ ] (maybe) gitea actions runner
|
||||||
- more services
|
- [ ] more services
|
||||||
- ~~gitea (need to change host ssh port)~~
|
- [x] gitea (need to change host ssh port)
|
||||||
- vaultwarden
|
- [ ] vaultwarden
|
||||||
- ~~tie all services together with an sso~~
|
- [x] write terms of service & privacy policy
|
||||||
- use postgres for everything
|
- [x] figure out best way to store .env, other credentials, and various secrets
|
||||||
|
- [x] tie all services together with an sso
|
||||||
|
|||||||
+2
-2
@@ -14,11 +14,11 @@
|
|||||||
<img src="assets/logo.avif" class="logo" />
|
<img src="assets/logo.avif" class="logo" />
|
||||||
<div class="flex flex-col gap-8 mt-4">
|
<div class="flex flex-col gap-8 mt-4">
|
||||||
<p class="font-light">hello, and welcome to atom.town. here, you will be at home.</p>
|
<p class="font-light">hello, and welcome to atom.town. here, you will be at home.</p>
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col w-fit">
|
||||||
<a href="https://mail.atom.town" target="_blank" class="font-normal pop big">webmail</a>
|
<a href="https://mail.atom.town" target="_blank" class="font-normal pop big">webmail</a>
|
||||||
<a href="https://git.atom.town" target="_blank" class="font-normal pop big">git</a>
|
<a href="https://git.atom.town" target="_blank" class="font-normal pop big">git</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col w-fit">
|
||||||
<a href="terms-privacy.html" class="font-normal pop big">terms & privacy</a>
|
<a href="terms-privacy.html" class="font-normal pop big">terms & privacy</a>
|
||||||
<a href="setup.html" class="font-normal pop big">setup</a>
|
<a href="setup.html" class="font-normal pop big">setup</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+10
-7
@@ -12,17 +12,20 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<img src="assets/logo.avif" class="logo" />
|
<img src="assets/logo.avif" class="logo" />
|
||||||
<div class="flex flex-col gap-8 mt-4">
|
<div class="flex flex-col gap-8 mt-4 max-w-md">
|
||||||
<p class="font-light">some notes for stuff you might need to know</p>
|
<p class="font-light">things that are useful to know</p>
|
||||||
<div class="flex flex-col gap-2">
|
<div class="flex flex-col gap-2">
|
||||||
<h2 class="font-heavy big">email</h2>
|
<h2 class="font-heavy big">email</h2>
|
||||||
<ul>
|
<ul class="font-light">
|
||||||
<li class="font-light">the mailserver lives at <b>post.atom.town</b></li>
|
<li>the mailserver lives at <b>post.atom.town</b></li>
|
||||||
<li class="font-light">incoming mail uses <b>imap</b> with <b>ssl/tls</b> on port <b>993</b></li>
|
<li>incoming mail uses <b>imap</b> with <b>ssl/tls</b> on port <b>993</b></li>
|
||||||
<li class="font-light">outgoing mail uses <b>smtp</b> with <b>ssl/tls</b> on port <b>465</b></li>
|
<li>outgoing mail uses <b>smtp</b> with <b>ssl/tls</b> on port <b>465</b></li>
|
||||||
|
</ul>
|
||||||
|
<ul class="font-light">
|
||||||
|
<li>the mailserver also has a few other functions. it is an admin dashboard, which anyone can use to configure their own email account, and also the oidc (auth) provider.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<a href="##" onclick="history.go(-1)" class="self-start font-normal pop">← back</a>
|
<a href="/index.html" class="self-start font-normal pop">← back</a>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+24
-4
@@ -7,10 +7,11 @@ html {
|
|||||||
background: url("../assets/clouds.avif"), linear-gradient(180deg, hwb(230 20% 0%) 0%, hwb(230 90% 0%) 110%);
|
background: url("../assets/clouds.avif"), linear-gradient(180deg, hwb(230 20% 0%) 0%, hwb(230 90% 0%) 110%);
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-size: cover, cover;
|
background-size: cover, cover;
|
||||||
|
background-attachment: fixed;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
height: 100dvh;
|
min-height: 100dvh;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -31,7 +32,7 @@ ul {
|
|||||||
/* tailwind lite */
|
/* tailwind lite */
|
||||||
:root { --space: 4px; }
|
:root { --space: 4px; }
|
||||||
|
|
||||||
.flex { display: flex; width: fit-content; }
|
.flex { display: flex; }
|
||||||
.flex-col { flex-direction: column; }
|
.flex-col { flex-direction: column; }
|
||||||
|
|
||||||
.gap-2 { gap: calc(var(--space) * 2); }
|
.gap-2 { gap: calc(var(--space) * 2); }
|
||||||
@@ -42,18 +43,32 @@ ul {
|
|||||||
|
|
||||||
.self-start { align-self: flex-start; }
|
.self-start { align-self: flex-start; }
|
||||||
|
|
||||||
|
.justify-between { justify-content: space-between; }
|
||||||
|
|
||||||
|
.w-fit { width: fit-content; }
|
||||||
|
|
||||||
|
.items-center { align-items: center; }
|
||||||
|
|
||||||
|
.font-extralight { font-weight: 200; }
|
||||||
.font-light { font-weight: 300; }
|
.font-light { font-weight: 300; }
|
||||||
.font-normal { font-weight: 400; }
|
.font-normal { font-weight: 400; }
|
||||||
.font-heavy { font-weight: 500; }
|
.font-heavy { font-weight: 500; }
|
||||||
|
|
||||||
.max-w-md {
|
.max-w-md {
|
||||||
max-width: calc(var(--space) * 160);
|
max-width: calc(var(--space) * 180);
|
||||||
@media (max-width: 1024px) {
|
@media (max-width: 1024px) {
|
||||||
max-width: calc(var(--space) * 320);
|
max-width: calc(var(--space) * 360);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* tailwind lite */
|
/* tailwind lite */
|
||||||
|
|
||||||
|
.small {
|
||||||
|
font-size: 16px;
|
||||||
|
@media (max-width: 1024px) {
|
||||||
|
font-size: 32px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.big {
|
.big {
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
@media (max-width: 1024px) {
|
@media (max-width: 1024px) {
|
||||||
@@ -70,6 +85,11 @@ ul {
|
|||||||
transform: scale(1.25);
|
transform: scale(1.25);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.hover {
|
||||||
|
text-decoration: underline dotted;
|
||||||
|
text-decoration-thickness: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
.logo {
|
.logo {
|
||||||
object-fit: contain;
|
object-fit: contain;
|
||||||
align-self: flex-start;
|
align-self: flex-start;
|
||||||
|
|||||||
+13
-10
@@ -13,24 +13,27 @@
|
|||||||
<body>
|
<body>
|
||||||
<img src="assets/logo.avif" class="logo" />
|
<img src="assets/logo.avif" class="logo" />
|
||||||
<div class="flex flex-col gap-8 mt-4 max-w-md">
|
<div class="flex flex-col gap-8 mt-4 max-w-md">
|
||||||
<p class="font-light">here you can learn some things</p>
|
<p class="font-light">atom.town is an exclusive club of like-minded individuals. by using atom.town, you agree to everything stated on this page.</p>
|
||||||
<div class="flex flex-col gap-2">
|
<div class="flex flex-col gap-2">
|
||||||
<h2 class="font-heavy big">terms</h2>
|
<h2 class="font-heavy big">terms</h2>
|
||||||
<ul>
|
<ul class="font-light">
|
||||||
<li class="font-light">the fitnessgram pacer test is a multistage aerobic capacity test</li>
|
<li>you will not use atom.town in any way that would negatively impact other users, nor anyone else.</li>
|
||||||
<li class="font-light">that progressively gets more difficult as it continues. the 20 meter pacer test</li>
|
<li>you will not use atom.town for bulk file storage (storing large files, or large volumes of files), even if such capabilities are present.</li>
|
||||||
<li class="font-light">will begin in 30 seconds. line up at the start. the running speed starts slowly,</li>
|
<li>for any projects you host (or contribute to) on atom.town, llm usage will be <span title="while atom.town welcomes llms as a useful tool, they should be utilised sparingly, as it is all too easy to fall into the pit of overuse." class="hover">sparse</span>. largely unsupervised or unreviewed code is strongly prohibited.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col gap-2">
|
<div class="flex flex-col gap-2">
|
||||||
<h2 class="font-heavy big">privacy</h2>
|
<h2 class="font-heavy big">privacy</h2>
|
||||||
<ul>
|
<ul class="font-light">
|
||||||
<li class="font-light">but gets faster each minute after you hear this signal *boop*. a single lap should be completed</li>
|
<li>atom.town is hosted on a <a href="https://datalix.eu/privacypolicy" target="_blank">datalix</a> server in germany. atom.town uses <a href="https://www.borgbase.com/privacy" target="_blank">borgbase</a> for backups (which are encrypted before upload).</li>
|
||||||
<li class="font-light">each time you hear this sound *ding*. remember to run in a straight line, and run as long as possible.</li>
|
<li>atom.town (for now, indefinitely) collects ip addresses, account details, and any user data only for the purposes of system administration and provision of services.</li>
|
||||||
<li class="font-light">the second time you fail to complete a lap before the sound, your test is over. the test will begin on the word start. on your mark, get ready, start.</li>
|
<li>atom.town does not share, nor ever will share any information it collects with any third parties, beyond what is absolutely necessary to run the service.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<a href="##" onclick="history.go(-1)" class="self-start font-normal pop">← back</a>
|
<div class="flex justify-between items-center">
|
||||||
|
<a href="/index.html" class="self-start font-normal pop">← back</a>
|
||||||
|
<p class="font-extralight small">updated 2026-07-24 (<a href="https://git.atom.town/atom/town/commits/branch/main/home/terms-privacy.html" target="_blank" class="small">history</a>)</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ banner bottom "updated system"
|
|||||||
|
|
||||||
# install misc
|
# install misc
|
||||||
banner top "installing misc packages"
|
banner top "installing misc packages"
|
||||||
sudo dnf install -y micro btop fastfetch policycoreutils-python-utils
|
sudo dnf install -y micro btop gdu fastfetch policycoreutils-python-utils
|
||||||
curl -fsSL https://vykar.borgbase.com/install.sh | sh
|
curl -fsSL https://vykar.borgbase.com/install.sh | sh
|
||||||
banner bottom "installed misc packages"
|
banner bottom "installed misc packages"
|
||||||
|
|
||||||
@@ -109,14 +109,14 @@ banner bottom "installed cron"
|
|||||||
banner top "configuring sshd"
|
banner top "configuring sshd"
|
||||||
sudo tee /etc/ssh/sshd_config << 'EOF'
|
sudo tee /etc/ssh/sshd_config << 'EOF'
|
||||||
Include /etc/ssh/sshd_config.d/*.conf
|
Include /etc/ssh/sshd_config.d/*.conf
|
||||||
Port 67
|
Port 66
|
||||||
PermitRootLogin no
|
PermitRootLogin no
|
||||||
PasswordAuthentication no
|
PasswordAuthentication no
|
||||||
KbdInteractiveAuthentication no
|
KbdInteractiveAuthentication no
|
||||||
EOF
|
EOF
|
||||||
sudo semanage port -a -t ssh_port_t -p tcp 67
|
sudo semanage port -a -t ssh_port_t -p tcp 66
|
||||||
sudo systemctl restart sshd
|
sudo systemctl restart sshd
|
||||||
banner bottom "configuring sshd"
|
banner bottom "configuring sshd"
|
||||||
|
|
||||||
# finish
|
# finish
|
||||||
echo -e "done! please log out and log back in with \e[1;5mssh -p 67 $(id -un)@$(curl -s https://checkip.amazonaws.com)\e[0m\n"
|
echo -e "done! please log out and log back in with \e[1;5mssh -p 66 $(id -un)@$(curl -s https://checkip.amazonaws.com)\e[0m\n"
|
||||||
|
|||||||
@@ -8,19 +8,30 @@ function log() {
|
|||||||
echo "[$(date -Iseconds)] $*" | tee -a "$LOG_FILE"
|
echo "[$(date -Iseconds)] $*" | tee -a "$LOG_FILE"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MODE="${1:-}"
|
||||||
|
if [[ "$MODE" != "cold" && "$MODE" != "hot" ]]; then
|
||||||
|
log "usage: $0 [cold|hot]" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
log "cleanup: starting docker services"
|
if [[ "$MODE" == "cold" ]]; then
|
||||||
docker compose start || true
|
log "starting docker services"
|
||||||
|
docker compose start || true
|
||||||
|
fi
|
||||||
log "└───── backup finished ─────┘"
|
log "└───── backup finished ─────┘"
|
||||||
}
|
}
|
||||||
trap cleanup EXIT
|
trap cleanup EXIT
|
||||||
|
|
||||||
log "┌────── backup started ─────┐"
|
log "┌────── backup started ─────┐"
|
||||||
|
log "mode: $MODE"
|
||||||
|
|
||||||
cd "$WORKING_DIR"
|
cd "$WORKING_DIR"
|
||||||
|
|
||||||
log "stopping docker services"
|
if [[ "$MODE" == "cold" ]]; then
|
||||||
docker compose stop
|
log "stopping docker services"
|
||||||
|
docker compose stop
|
||||||
|
fi
|
||||||
|
|
||||||
log "running backup"
|
log "running backup"
|
||||||
/usr/local/bin/vykar backup
|
/usr/local/bin/vykar backup 2>&1 | tee -a "$LOG_FILE"
|
||||||
|
|||||||
Reference in New Issue
Block a user