iPhone and iPad
App Store
Coming soon @@ -97,8 +98,8 @@ Get it on the Mac App Storediff --git a/.gitignore b/.gitignore index e43b0f9..65f1211 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ .DS_Store +downloads/* +!downloads/.gitkeep diff --git a/README.md b/README.md index 391c1d3..b4a7eea 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,9 @@ It's plain static files with nothing to build, and it loads nothing from other s - Keep `/support.html` and `/privacy.html` at these addresses: the App Store, Google Play, Chrome and Firefox listings point to them. - To release a platform, edit its card in `index.html`: set the store link, then remove the `soon` class and the badge. The main button picks it up. -- For a new Windows version, change the version in the Windows card's link. +- For a new Windows version, put the installer in `downloads/` and change the version in the Windows card's link. +- `host/` holds the server setup files that `host.html` tells people to download. Refresh them from `kestrove-server/selfhost` when those change. -To host it, serve this folder with any web server. `deploy/Caddyfile.snippet` is a Caddy example with the security headers. +Installers are not kept in git. Copy them to `downloads/` on the server. -To preview it locally, run `python3 -m http.server 8090` here. +To host it, copy this folder to the server and run `docker compose up -d` in `deploy/`. To preview it locally, run `python3 -m http.server 8090` here. diff --git a/deploy/Caddyfile.snippet b/deploy/Caddyfile similarity index 80% rename from deploy/Caddyfile.snippet rename to deploy/Caddyfile index 88f6554..16cebd2 100644 --- a/deploy/Caddyfile.snippet +++ b/deploy/Caddyfile @@ -1,7 +1,6 @@ -# The Kestrove website: static files only. Replace DOMAIN and the root path. -DOMAIN { +kestrove.samialabri.com { encode zstd gzip - root * /srv/kestrove-website + root * /srv/site header { Strict-Transport-Security "max-age=63072000" X-Content-Type-Options nosniff diff --git a/deploy/compose.yaml b/deploy/compose.yaml new file mode 100644 index 0000000..54a88dc --- /dev/null +++ b/deploy/compose.yaml @@ -0,0 +1,19 @@ +# The Kestrove website. Run from this folder: docker compose up -d +name: kestrove-website +services: + web: + image: caddy:2.8-alpine + restart: unless-stopped + read_only: true + ports: + - "80:80" + - "443:443" + - "443:443/udp" + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile:ro + - ..:/srv/site:ro + - caddy-data:/data + - caddy-config:/config +volumes: + caddy-data: + caddy-config: diff --git a/downloads/.gitkeep b/downloads/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/host.html b/host.html new file mode 100644 index 0000000..82f859d --- /dev/null +++ b/host.html @@ -0,0 +1,124 @@ + + +
+ + +Your vault is encrypted on your devices before it is synced, so your server only ever stores data it can't read. Setup takes about five minutes.
+ +vault.example.com.At your DNS provider, create an A record for your chosen name with your server's IPv4 address. Add an AAAA record too if the server has IPv6.
+Using Cloudflare? Set the record to DNS only (grey cloud), not Proxied. Kestrove gets its own certificate and pins it in the apps, and Cloudflare's proxy would break both.
+Skip this if docker compose version already works.
curl -fsSL https://get.docker.com | sudo sh
+mkdir kestrove && cd kestrove
+curl -fsSLO https://kestrove.samialabri.com/host/compose.yaml
+curl -fsSLO https://kestrove.samialabri.com/host/setup.sh
+curl -fsSL https://kestrove.samialabri.com/host/env.example -o .env.example
+chmod +x setup.sh
+sudo ./setup.sh
+The setup asks for your domain and an email address (for certificate notices only), creates a private .env file with a random setup code, checks your DNS, starts Kestrove and waits for HTTPS. At the end it prints your address and the setup code.
cp .env.example .env
+nano .env # DOMAIN, ACME_EMAIL, and a KV_SETUP_CODE of at least 16 characters
+chmod 600 .env
+docker compose up -d
+https://your-domain in a browser.The setup code stops working as soon as your account exists. That first account is the server's admin.
+In the web vault go to Devices → Add a device. Then in the Kestrove app on your phone or computer choose Scan setup QR and scan it. Each new device needs your master password once.
+Get the apps from the download section.
+One server can hold accounts for your family or team. Each person has their own vault, master password and Secret Key. As the admin you manage accounts, but you can't see, export or reset anyone's passwords.
+On the same page you can switch Sign-up to Open, so anyone who can reach the server may create an account, optionally only with certain email domains. You can also disable, delete or promote accounts. Someone who forgets their master password can't be recovered: delete their account and invite them again.
+The web vault's code comes from your server, so whoever runs the server could in principle tamper with it. People who would rather not rely on that should use the Kestrove apps, which don't load code from the server.
+cd kestrove
+docker compose pull && docker compose up -d
+KESTROVE_VERSION=latest in .env follows new releases. Set a version number instead, for example 1.1.0, to update only when you change it. Back up before a big update.
Your data lives in the Docker volume kestrove_data. Take a backup any time, even while Kestrove runs:
docker compose run --rm -T backup > kestrove-$(date +%F).db
+Your vault inside the file is still end-to-end encrypted, so it's safe to keep on another machine or in cloud storage. For a nightly backup, run mkdir backups, then add this with crontab -e, changing the path to yours:
30 3 * * * cd /home/you/kestrove && docker compose run --rm -T backup > backups/kestrove-$(date +\%F).db && find backups -name 'kestrove-*.db' -mtime +30 -delete
+To restore a backup onto a fresh install, after step 3, change the file name below to yours:
+docker compose stop server
+docker run --rm -v kestrove_data:/data -v "$PWD":/backup alpine \
+ sh -c 'cp /backup/kestrove-2026-01-31.db /data/kestrove.db && rm -f /data/kestrove.db-wal /data/kestrove.db-shm && chown 65532:65532 /data/kestrove.db'
+docker compose start server
+Anything changed on the server since the backup is gone from the server. Devices with newer data send it again on their next sync.
+Setup warns the domain points elsewhere. Check the A record's IP, and "DNS only" on Cloudflare. DNS changes can take a few minutes.
+The browser shows a certificate error. Run docker compose logs web. Ports 80 and 443 must be open in both your cloud firewall and ufw or firewalld.
Apps say they can't reach the server. Open https://your-domain on that device. If the server's IP changed, update the DNS record.
You lost the setup code. It's KV_SETUP_CODE in .env. If that was empty, run docker compose logs server | grep SETUP_TOKEN.
You want to start over. docker compose down -v deletes everything, then run ./setup.sh again.
To see what's happening, use docker compose logs -f for logs and docker compose ps for status.
server is the sync API. It stores encrypted vault data, device keys and a login verifier that is not your password. It runs as a non-root user on a read-only filesystem.
+web is Caddy. It handles HTTPS certificates from Let's Encrypt, the security headers and the web vault, and it passes sync traffic to the server.
+Nothing else is contacted: no telemetry, and no outside services besides Let's Encrypt.
+Your passwords and passkeys are encrypted on your own devices, then synced through a server you run. That server only ever stores data it can't read.
For iPhone, iPad, Mac, Android, Windows and Linux.
@@ -75,7 +75,7 @@Kestrove's server runs anywhere Docker does. It comes with a web vault and an admin page for inviting people. The admin can manage accounts but can't read anyone's passwords.
- +Install it on every device you use.
+Install it on every device you use.
App Store
Coming soon @@ -97,8 +98,8 @@ Get it on the Mac App StoreGoogle Play
Coming soon Get it on Google PlayWindows 10 and 11, 64-bit. Updates itself.
- Download installerWindows 10 and 11, 64-bit.
+ Download installerSnap Store
Coming soonsudo snap install kestrove
Open a terminal, run this command, then start Kestrove from your applications.
Open an issue on the Kestrove issue tracker. Never include passwords, your Secret Key or your Emergency Kit.
+Email REPLACE_WITH_SUPPORT_EMAIL. Never include passwords, your Secret Key or your Emergency Kit.