| .vscode | ||
| chrispaganon@822d3072c7 | ||
| searxng_data | ||
| vue-ai-tools@3a1740634e | ||
| .env.example | ||
| .gitignore | ||
| .gitmodules | ||
| .prettierrc | ||
| docker-compose.yml | ||
| LICENSE | ||
| pds.env.example | ||
| README.md | ||
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 IPv4A *.pds.chrispaganon.com -> server IPv4TXT _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