Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/.vitepress/config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export default defineConfig({
text: 'Guide',
items: [
{ text: 'Getting started', link: '/guide/getting-started' },
{ text: 'Server setup from zero', link: '/guide/server-setup' },
{ text: 'Setup guide (all scenarios)', link: '/guide/server-setup' },
{ text: 'Google Chat setup', link: '/guide/google-chat-setup' },
{ text: 'Commands', link: '/guide/commands' },
{ text: 'Configuration', link: '/guide/configuration' },
Expand Down
17 changes: 10 additions & 7 deletions docs/guide/deployment.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ AsyncUp is one small container — by default with SQLite inside, so there are
no external moving parts at all. Google Chat needs to reach it on a public
HTTPS URL.

> Starting from zero (no server, no domain, no TLS setup)? Follow
> **[Server setup from zero](./server-setup)** — a complete VPS + Caddy
> walkthrough. This page covers the building blocks and alternatives.
> Looking for a walkthrough? The **[Setup guide](./server-setup)** covers
> every scenario — VPS, Postgres, Cloud Run, homelab — with a decision
> matrix and production checklist. This page is the building-blocks
> reference.

## Database: embedded or bring your own

Expand Down Expand Up @@ -69,11 +70,13 @@ a once-a-minute scheduler tick and your team's submissions.
Closest thing to "no servers at all", and realistically $0/month at team
scale on the free tier:

1. Deploy the container to **Cloud Run** (min instances = 0). Mount a
[Cloud Run volume](https://cloud.google.com/run/docs/configuring/services/volume-mounts)
or persistent disk for `DB_PATH` so SQLite survives restarts.
1. Deploy the container to **Cloud Run** (min instances = 0, **max
instances = 1** — the in-process scheduler must not run twice). Use a
managed Postgres via `DATABASE_URL` (Cloud SQL, or Neon's free tier) —
Cloud Run's filesystem is ephemeral and network volumes don't support
SQLite locking reliably.
2. The in-process scheduler only runs while an instance is alive, so drive
it externally: create a **Cloud Scheduler** job (free tier: 3 jobs) that
it externally: create a **Cloud Scheduler** job (free tier covers it) that
hits `POST /tick` every minute with header
`Authorization: Bearer <tick token>`.
3. Generate the tick token in dashboard → Settings → Access tokens.
Expand Down
7 changes: 3 additions & 4 deletions docs/guide/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,9 @@ the names of mandatory participants who didn't fill it in.

- A Google Workspace domain where you can configure a Chat app
(one-time, ~15 minutes — see [Google Chat setup](./google-chat-setup))
- Somewhere to run one small container with an HTTPS URL — starting from
nothing? **[Server setup from zero](./server-setup)** walks you through a
$5 VPS, a domain, and automatic HTTPS in ~30 minutes
(other options in [Deployment](./deployment))
- Somewhere to run one small container with an HTTPS URL — the
**[Setup guide](./server-setup)** covers every scenario, from a $5 VPS
with automatic HTTPS to Cloud Run and homelab tunnels, with sizing advice

## Quickstart

Expand Down
Loading