@@ -14,9 +14,26 @@ persistent volume for the SQLite database, and starts both services:
1414| Admin UI + REST API | ` :80 ` / ` :443 ` | ` :5435 ` | HTTP/S |
1515| pgwire (PostgreSQL) | ` :5432 ` (IPv6) | ` :5434 ` | raw TCP |
1616
17- After deploying, the Admin UI is available at ` https://<app-name>.fly.dev ` .
17+ After deploying:
1818
19- ### Set required secrets (after deploy)
19+ | Endpoint | URL / address |
20+ | ----------| ---------------|
21+ | Admin UI | ` https://<app-name>.fly.dev ` |
22+ | Admin REST API | ` https://<app-name>.fly.dev/api/... ` |
23+ | PostgreSQL proxy | ` <app-name>.fly.dev:5432 ` |
24+
25+ ** Order of operations matters** — follow these steps in sequence.
26+
27+ ### 1. Create the app and volume (one-time)
28+
29+ ``` sh
30+ fly launch --no-deploy --copy-config --name < your-app-name>
31+ fly volumes create betweenrows_data --size 1 --region < region>
32+ ```
33+
34+ ### 2. Set secrets before first deploy
35+
36+ The app will crash-loop on startup without ` BR_ADMIN_PASSWORD ` . Set secrets ** before** deploying:
2037
2138``` sh
2239fly secrets set \
@@ -25,6 +42,25 @@ fly secrets set \
2542 BR_ADMIN_PASSWORD=< strong-password>
2643```
2744
45+ ### 3. Allocate IP addresses (one-time)
46+
47+ Without IP addresses the app is unreachable from most networks. Shared IPv4 is free:
48+
49+ ``` sh
50+ flyctl ips allocate-v4 --shared
51+ flyctl ips allocate-v6
52+ ```
53+
54+ ### 4. Make the GHCR package public
55+
56+ CI/CD deploys via ` flyctl deploy --image ghcr.io/getbetweenrows/betweenrows:latest ` require the package to be public. In GitHub: ** Packages → betweenrows → Package settings → Change visibility → Public** .
57+
58+ ### 5. Deploy
59+
60+ ``` sh
61+ fly deploy --image ghcr.io/getbetweenrows/betweenrows:latest --app < your-app-name>
62+ ```
63+
2864## Upgrading
2965
3066Pull the latest image and redeploy:
@@ -47,6 +83,20 @@ The pgwire port is accessible for free via **IPv6** (most modern clients resolve
4783psql " postgresql://admin:<password>@<app-name>.fly.dev:5432/<datasource-name>"
4884```
4985
86+ ** macOS: if the connection times out** , check whether IPv6 is configured:
87+
88+ ``` sh
89+ ifconfig | grep " inet6" | grep -v " ::1" | grep -v " fe80"
90+ ```
91+
92+ If that returns nothing, your machine has no routable IPv6 address. Re-enable it:
93+
94+ ``` sh
95+ sudo networksetup -setv6automatic Wi-Fi
96+ ```
97+
98+ Then confirm it's working with ` ping6 google.com ` and retry the connection.
99+
50100For ** IPv4-only** environments (no IPv6 support), tunnel via WireGuard:
51101
52102``` sh
@@ -328,8 +378,8 @@ Before a data source is queryable via pgwire, a catalog must be saved. The UI wi
328378
3293791 . ** Discover schemas** — submit ` discover_schemas ` , watch SSE, select which schemas to include
3303802 . ** Discover tables** — submit ` discover_tables ` with selected schemas, select tables
331- 3 . ** Discover columns** — submit ` discover_columns ` with selected tables, review column types
332- 4 . ** Save** — submit ` save_catalog ` — persists selections to DB, invalidates engine cache
381+ 3 . ** Discover columns** — submit ` discover_columns ` with selected tables; choose which columns to expose via a two-panel UI (scrollable table sidebar + column detail panel); unsupported Arrow types (e.g. JSONB, regclass) are shown greyed-out and cannot be selected
382+ 4 . ** Save** — submit ` save_catalog ` — persists schema/table/column selections to DB, invalidates engine cache
333383
334384To detect schema drift after upstream changes, submit ` sync_catalog ` . The result is stored in ` data_source.last_sync_result ` and shown in the UI as a green/blue/amber panel.
335385
0 commit comments