No description
Find a file
2026-09-23 16:10:26 +02:00
.vscode doc: add .dockerignore to file nesting 2026-09-15 12:22:20 +02:00
chrispaganon@6c55224534 chore: sync submodules 2026-09-15 12:38:17 +02:00
dozzle_data fix: add dozzle users.yml 2026-09-14 17:21:10 +02:00
freelance-chrispaganon@0199c6eaf8 feat: add freelance submodule 2026-09-15 12:56:06 +02:00
searxng_data feat: increase searxng timeouts 2026-09-21 13:07:08 +02:00
vue-ai-tools@454caa3b54 chore: sync submodules 2026-09-15 12:38:17 +02:00
.enc.env feat: add sops encrypted env files 2026-09-14 17:31:59 +02:00
.env.example feat: add sops encrypted env files 2026-09-14 17:31:59 +02:00
.gitignore fix: add dozzle users.yml 2026-09-14 17:21:10 +02:00
.gitmodules feat: add freelance submodule 2026-09-15 12:56:06 +02:00
.prettierrc add prettier config 2025-06-29 13:06:00 +02:00
.sops.yaml feat: add sops encrypted env files 2026-09-14 17:31:59 +02:00
docker-compose.yml ops: enable registry deletion 2026-09-23 16:10:26 +02:00
dockiy.config.yml fix: latest required dockiy config 2026-09-14 17:23:47 +02:00
dockiy.manifest.yml fix: add searxng data to dickiy files 2026-09-21 13:08:36 +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