No description
Find a file
2026-07-02 17:23:03 +02:00
.vscode add pds .env example 2026-07-02 12:15:05 +02:00
chrispaganon@822d3072c7 update submodules commits & URLs for codeberg 2026-05-17 14:28:33 +02:00
searxng_data searxng: disable brave by default 2026-06-19 09:57:40 +02:00
vue-ai-tools@3a1740634e update submodules commits & URLs for codeberg 2026-05-17 14:28:33 +02:00
.env.example add basic grist setup 2026-07-02 16:12:21 +02:00
.gitignore ops: add dns challenge pds routing 2026-07-02 11:39:58 +02:00
.gitmodules update submodules commits & URLs for codeberg 2026-05-17 14:28:33 +02:00
.prettierrc add prettier config 2025-06-29 13:06:00 +02:00
docker-compose.yml fix: only use DNS-01 for PDS 2026-07-02 16:53:29 +02:00
LICENSE Add GNU GPLv3 LICENSE 2023-12-02 14:16:38 -05:00
pds.env.example fix: wrong brevo port for pds SMTP env example 2026-07-02 13:25:32 +02:00
README.md doc: add callout for _acme-challenge.pds 2026-07-02 17:23:03 +02:00

Server Setup

Probably create a new non-root user.

Install docker: https://docs.docker.com/engine/install/

Probably also go though docker post-installation: https://docs.docker.com/engine/install/linux-postinstall/

Install rsync

Start DockIY

Copy docker-compose.yml & .env to server. Run docker compose up -d

Setup Umami, Forgejo, Dozzle and Beszel

TODO: Add instructions

Deploy an app

  • Create a new directory.
  • Run deploy script to copy relevant files and start docker.

Deployment instructions for specific apps

Bluesky PDS

Hostinger dashboard:

  • Create an API token.
  • Add DNS records:
    • A pds.chrispaganon.com -> server IPv4
    • A *.pds.chrispaganon.com -> server IPv4
    • TXT _acme-challenge.pds.chrispaganon.com -> placeholder

Keep the _acme-challenge.pds... TXT record so wildcard DNS does not synthesize an A record there and block DNS-01 certificate renewal (yet to be tested if it works).

Root .env:

HOSTINGER_API_TOKEN="hostinger-api-token"
PDS_HOSTNAME="pds.chrispaganon.com"

Brevo dashboard:

  • Verify the sender/domain used by PDS.
  • Create an SMTP key.

Create pds/pds.env from pds.env.example. Generate secrets with:

openssl rand -hex 16
openssl rand -hex 16
openssl ecparam --name secp256k1 --genkey --noout --outform DER | tail --bytes=+8 | head --bytes=32 | od -An -tx1 -v | tr -d ' \n'

For Brevo in pds/pds.env:

PDS_EMAIL_SMTP_URL=smtps://<some-numbers-and-letters>%40smtp-brevo.com:<smtp-key>@smtp-relay.brevo.com:465
PDS_EMAIL_FROM_ADDRESS=sender-email

Create an invite:

docker exec pds sh -lc 'goat pds admin create-invites'

Bluesky app:

  • Choose a custom hosting provider/server.
  • Enter https://pds.chrispaganon.com.
  • Create an account with a handle like chris.pds.chrispaganon.com.
  • Use the invite code generated above.

Setup RustFS

Create directory for rustfs data:

mkdir -p rustfs_data
chown -R 10001:10001 rustfs_data

To make a bucket public reads:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": ["s3:GetObject"],
      "Resource": ["arn:aws:s3:::BUCKET_NAME/*"]
    }
  ]
}

Example rclone config:

[myfiles]
type = s3
provider = Other
access_key_id = RUSTFS_ACCESS_KEY
secret_access_key = RUSTFS_SECRET_KEY
endpoint = https://files.chrispaganon.com
sign_accept_encoding = false # Necessary if using cloudflare CDN or anything that may rewrite the Accept-Encoding header.

To copy a file to the bucket: rclone copy /path/to/file myfiles:BUCKET_NAME