chore: improve onboarding experience

This commit is contained in:
Tianzhou Chen
2023-12-17 20:50:11 +08:00
parent af03b3c922
commit 42bad976a4
12 changed files with 79 additions and 45 deletions

View File

@ -1,3 +0,0 @@
# see process.d.ts
DATABASE_URL=postgresql://postgres:YOUR_PASSWORD@localhost:5432/sqlchat?schema=sqlchat
OPENAI_API_KEY=YOUR_OPENAI_API_KEY

3
.env.no-db Normal file
View File

@ -0,0 +1,3 @@
# see process.d.ts
OPENAI_API_KEY=xxx
NEXT_PUBLIC_USE_DATABASE=false

5
.env.use-db Normal file
View File

@ -0,0 +1,5 @@
# see process.d.ts
OPENAI_API_KEY=xxx
NEXT_PUBLIC_USE_DATABASE=true
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/sqlchat?schema=sqlchat&application_name=sqlchat"
DATABASE_DIRECT_URL="postgresql://postgres:postgres@localhost:5432/sqlchat?schema=sqlchat&application_name=sqlchat"

View File

@ -23,7 +23,7 @@ ENV NEXT_PUBLIC_STRIPE_PRICE_ID_PRO_1_MONTH_SUBSCRIPTION price_1O2clpAeLQYhEB73F
ENV NEXT_PUBLIC_STRIPE_PRICE_ID_PRO_3_MONTH_SUBSCRIPTION price_1NAE2hAeLQYhEB73FoF8WJPS ENV NEXT_PUBLIC_STRIPE_PRICE_ID_PRO_3_MONTH_SUBSCRIPTION price_1NAE2hAeLQYhEB73FoF8WJPS
ENV NEXT_PUBLIC_STRIPE_PRICE_ID_PRO_1_YEAR_SUBSCRIPTION price_1N96riAeLQYhEB73YPSL8GuV ENV NEXT_PUBLIC_STRIPE_PRICE_ID_PRO_1_YEAR_SUBSCRIPTION price_1N96riAeLQYhEB73YPSL8GuV
ENV NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY pk_live_JoPlkGsFcm2iHvy5a4JR5tia00vVXVJM8d ENV NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY pk_live_JoPlkGsFcm2iHvy5a4JR5tia00vVXVJM8d
ENV NEXT_PUBLIC_DATABASE_LESS false ENV NEXT_PUBLIC_USE_DATABASE true
RUN yarn run build RUN yarn run build

View File

@ -59,13 +59,13 @@ docker run --name sqlchat --platform linux/amd64 -env NEXTAUTH_SECRET=xxx -p 300
### Variables relacionadas con la base de datos: ### Variables relacionadas con la base de datos:
- `NEXT_PUBLIC_DATABASE_LESS`: Establézcalo en `true` para iniciar SQL Chat en modo sin base de datos. Esto - `NEXT_PUBLIC_USE_DATABASE`: Establézcalo en `false` para iniciar SQL Chat en modo sin base de datos. Esto
desactivara las siguientes funciones: desactivara las siguientes funciones:
1. Sistema de cuentas. 1. Sistema de cuentas.
2. Ejecución de Cuota por Usuario. 2. Ejecución de Cuota por Usuario.
3. Pago. 3. Pago.
4. Recopilación de datos de uso. 4. Recopilación de datos de uso.
- `DATABASE_URL`: Aplicable si `NEXT_PUBLIC_DATABASE_LESS` es `false`. Cadena de conexión de Postgres para almacenar datos. ej. `postgresql://postgres:YOUR_PASSWORD@localhost:5432/sqlchat?schema=sqlchat`. - `DATABASE_URL`: Aplicable si `NEXT_PUBLIC_USE_DATABASE` es `true`. Cadena de conexión de Postgres para almacenar datos. ej. `postgresql://postgres:YOUR_PASSWORD@localhost:5432/sqlchat?schema=sqlchat`.
```bash ```bash
docker run --name sqlchat --platform linux/amd64 --env NEXTAUTH_SECRET=xxx --env OPENAI_API_KEY=yyy --env OPENAI_API_ENDPOINT=zzz -p 3000:3000 sqlchat/sqlchat docker run --name sqlchat --platform linux/amd64 --env NEXTAUTH_SECRET=xxx --env OPENAI_API_KEY=yyy --env OPENAI_API_ENDPOINT=zzz -p 3000:3000 sqlchat/sqlchat
@ -82,7 +82,7 @@ docker run --name sqlchat --platform linux/amd64 --env NEXTAUTH_SECRET=xxx --env
1. Haga una copia del archivo de variables de entorno de ejemplo: 1. Haga una copia del archivo de variables de entorno de ejemplo:
```bash ```bash
cp .env.example .env cp .env.use-db .env
``` ```
1. Generar el cliente prisma a partir del modelo. 1. Generar el cliente prisma a partir del modelo.
@ -95,7 +95,7 @@ docker run --name sqlchat --platform linux/amd64 --env NEXTAUTH_SECRET=xxx --env
### Configura la base de datos ### Configura la base de datos
**Puede omitir esta sección con `NEXT_PUBLIC_DATABASE_LESS=true` si no crea funciones que requieren una base de datos** **Puede omitir esta sección con `NEXT_PUBLIC_USE_DATABASE=false` si no crea funciones que requieren una base de datos**
1. Inicie una instancia de Postgres. Para mac, puedes usar [StackbBricks](https://stackbricks.app/), [DBngin](https://dbngin.com/) o [Postgres.app](https://postgresapp.com/). 1. Inicie una instancia de Postgres. Para mac, puedes usar [StackbBricks](https://stackbricks.app/), [DBngin](https://dbngin.com/) o [Postgres.app](https://postgresapp.com/).

View File

@ -34,41 +34,49 @@ SQL Chat is built by [Next.js](https://nextjs.org/), it supports the following d
- MSSQL - MSSQL
- TiDB Cloud - TiDB Cloud
## Data Privacy ## [sqlchat.ai](https://sqlchat.ai)
See [SQL Chat Privacy Policy](https://sqlchat.ai/privacy). ### IP Whitelisting
## IP Whitelisting
If you use [sqlchat.ai](https://sqlchat.ai) to connect to your database, you need to add 0.0.0.0 (allow all connections) If you use [sqlchat.ai](https://sqlchat.ai) to connect to your database, you need to add 0.0.0.0 (allow all connections)
to the database whitelist IP. Because sqlchat.AI is hosted on [Vercel](https://vercel.com/) which [uses dynamic IP](https://vercel.com/guides/how-to-allowlist-deployment-ip-address). If this is a concern, please consider the self-host option below. to the database whitelist IP. Because sqlchat.AI is hosted on [Vercel](https://vercel.com/) which [uses dynamic IP](https://vercel.com/guides/how-to-allowlist-deployment-ip-address). If this is a concern, please consider the self-host option below.
## Self-host with Docker ### Data Privacy
See [SQL Chat Privacy Policy](https://sqlchat.ai/privacy).
## Self-host
### Docker
```bash ```bash
docker run --name sqlchat --platform linux/amd64 -env NEXTAUTH_SECRET=xxx -p 3000:3000 sqlchat/sqlchat docker run --name sqlchat --platform linux/amd64 -env NEXTAUTH_SECRET=xxx -p 3000:3000 sqlchat/sqlchat
``` ```
### OpenAI related variables: ### Startup options
* Run without database, check [.env.no-db](https://github.com/sqlchat/sqlchat/blob/main/.env.no-db).
This is suitable if you just want to use for yourself.
* Run with database, check [.env.use-db](https://github.com/sqlchat/sqlchat/blob/main/.env.use-db).
This is suitable if you want to run a similar multi-tenant service as [sqlchat.ai](https://sqlchat.ai) where you need manage account, usage and etc.
#### OpenAI related
- `NEXT_PUBLIC_ALLOW_SELF_OPENAI_KEY`: Set to `true` to allow users to bring their own OpenAI API key.
- `OPENAI_API_KEY`: OpenAI API key. You can get one from [here](https://beta.openai.com/docs/developer-quickstart/api-keys). - `OPENAI_API_KEY`: OpenAI API key. You can get one from [here](https://beta.openai.com/docs/developer-quickstart/api-keys).
- `OPENAI_API_ENDPOINT`: OpenAI API endpoint. Defaults to `https://api.openai.com`. - `OPENAI_API_ENDPOINT`: OpenAI API endpoint. Defaults to `https://api.openai.com`.
### Database related variables: - `NEXT_PUBLIC_ALLOW_SELF_OPENAI_KEY`: Set to `true` to allow users to bring their own OpenAI API key.
- `NEXT_PUBLIC_DATABASE_LESS`: Set to `true` to start SQL Chat in database-less mode. This will #### Database related
disable following features:
- `NEXT_PUBLIC_USE_DATABASE`: Set to `true` to start SQL Chat with database. This will
enable following features:
1. Account system. 1. Account system.
1. Per-user quota enforcement. 1. Per-user quota enforcement.
1. Payment. 1. Payment.
1. Usage data collection. 1. Usage data collection.
- `DATABASE_URL`: Applicable if `NEXT_PUBLIC_DATABASE_LESS` is `false`. Postgres connection string to store data. e.g. `postgresql://postgres:YOUR_PASSWORD@localhost:5432/sqlchat?schema=sqlchat`. - `DATABASE_URL`: Applicable if `NEXT_PUBLIC_USE_DATABASE` is `true`. Postgres connection string to store data. e.g. `postgresql://postgres:YOUR_PASSWORD@localhost:5432/sqlchat?schema=sqlchat`.
```bash
docker run --name sqlchat --platform linux/amd64 --env NEXTAUTH_SECRET=xxx --env OPENAI_API_KEY=yyy --env OPENAI_API_ENDPOINT=zzz -p 3000:3000 sqlchat/sqlchat
```
## Local Development ## Local Development
@ -87,14 +95,14 @@ docker run --name sqlchat --platform linux/amd64 --env NEXTAUTH_SECRET=xxx --env
1. Make a copy of the example environment variables file: 1. Make a copy of the example environment variables file:
```bash ```bash
cp .env.example .env cp .env.use-db .env
``` ```
1. Add your [API key](https://platform.openai.com/account/api-keys) and OpenAI API Endpoint(optional) to the newly created `.env` file. 1. Add your [API key](https://platform.openai.com/account/api-keys) and OpenAI API Endpoint(optional) to the newly created `.env` file.
### Setup database ### Setup database
**You can skip this section with `NEXT_PUBLIC_DATABASE_LESS=true` if you don't build features requiring database** **You can skip this section with `NEXT_PUBLIC_USE_DATABASE=false` if you don't build features requiring database**
1. Start a Postgres instance. For mac, you can use [StackbBricks](https://stackbricks.app/), [DBngin](https://dbngin.com/) or [Postgres.app](https://postgresapp.com/). 1. Start a Postgres instance. For mac, you can use [StackbBricks](https://stackbricks.app/), [DBngin](https://dbngin.com/) or [Postgres.app](https://postgresapp.com/).

View File

@ -57,12 +57,12 @@ docker run --name sqlchat --platform linux/amd64 -env NEXTAUTH_SECRET=xxx -p 300
### 数据库相关变量: ### 数据库相关变量:
- `NEXT_PUBLIC_DATABASE_LESS`: 设置为 `true` 如果你想让 SQL Chat 运行时不需要数据库。这个会关闭如下功能: - `NEXT_PUBLIC_USE_DATABASE`: 设置为 `true` 如果你启动 SQL Chat 时使用了数据库。这会开启如下功能:
1. 账户系统。 1. 账户系统。
1. 用户额度控制。 1. 用户额度控制。
1. 支付。 1. 支付。
1. 使用数据收集。 1. 使用数据收集。
- `DATABASE_URL`: 只有在 NEXT_PUBLIC_DATABASE_LESS 为 true 时有效。Postgres 数据库连接串 e.g. `postgresql://postgres:YOUR_PASSWORD@localhost:5432/sqlchat?schema=sqlchat`. - `DATABASE_URL`: 只有在 `NEXT_PUBLIC_USE_DATABASE``true` 时有效。Postgres 数据库连接串 e.g. `postgresql://postgres:YOUR_PASSWORD@localhost:5432/sqlchat?schema=sqlchat`.
```bash ```bash
docker run --name sqlchat --platform linux/amd64 --env NEXTAUTH_SECRET=xxx --env OPENAI_API_KEY=yyy --env OPENAI_API_ENDPOINT=zzz -p 3000:3000 sqlchat/sqlchat docker run --name sqlchat --platform linux/amd64 --env NEXTAUTH_SECRET=xxx --env OPENAI_API_KEY=yyy --env OPENAI_API_ENDPOINT=zzz -p 3000:3000 sqlchat/sqlchat
@ -79,7 +79,7 @@ docker run --name sqlchat --platform linux/amd64 --env NEXTAUTH_SECRET=xxx --env
1. 复制示例环境变量文件; 1. 复制示例环境变量文件;
```bash ```bash
cp .env.example .env cp .env.use-db .env
``` ```
1. 生成 `prisma` 客户端 1. 生成 `prisma` 客户端

View File

@ -3,6 +3,8 @@
"private": false, "private": false,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
"no-db": "env-cmd -f .env.no-db pnpm dev",
"use-db": "env-cmd -f .env.use-db pnpm dev",
"build": "prisma generate && next build", "build": "prisma generate && next build",
"build-prisma-deploy": "prisma generate && next build && prisma migrate deploy", "build-prisma-deploy": "prisma generate && next build && prisma migrate deploy",
"export": "next export", "export": "next export",
@ -76,6 +78,7 @@
"@types/react-syntax-highlighter": "^15.5.6", "@types/react-syntax-highlighter": "^15.5.6",
"@types/uuid": "^9.0.1", "@types/uuid": "^9.0.1",
"autoprefixer": "^10.4.13", "autoprefixer": "^10.4.13",
"env-cmd": "^10.1.0",
"eslint": "8.20.0", "eslint": "8.20.0",
"eslint-config-next": "12.2.3", "eslint-config-next": "12.2.3",
"eslint-config-prettier": "^8.8.0", "eslint-config-prettier": "^8.8.0",

17
pnpm-lock.yaml generated
View File

@ -196,6 +196,9 @@ devDependencies:
autoprefixer: autoprefixer:
specifier: ^10.4.13 specifier: ^10.4.13
version: 10.4.14(postcss@8.4.21) version: 10.4.14(postcss@8.4.21)
env-cmd:
specifier: ^10.1.0
version: 10.1.0
eslint: eslint:
specifier: 8.20.0 specifier: 8.20.0
version: 8.20.0 version: 8.20.0
@ -2272,6 +2275,11 @@ packages:
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
dev: false dev: false
/commander@4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
dev: true
/commander@9.5.0: /commander@9.5.0:
resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==}
engines: {node: ^12.20.0 || >=14} engines: {node: ^12.20.0 || >=14}
@ -2544,6 +2552,15 @@ packages:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
dev: true dev: true
/env-cmd@10.1.0:
resolution: {integrity: sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==}
engines: {node: '>=8.0.0'}
hasBin: true
dependencies:
commander: 4.1.1
cross-spawn: 7.0.3
dev: true
/error-ex@1.3.2: /error-ex@1.3.2:
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
dependencies: dependencies:

10
process.d.ts vendored
View File

@ -2,15 +2,15 @@ declare namespace NodeJS {
export interface ProcessEnv { export interface ProcessEnv {
// Required. Node environment. // Required. Node environment.
NODE_ENV: string; NODE_ENV: string;
// Optional. Set to "true" to disable the database. Need to use string as env is always string. // Optional. Set to "true" to use the database. Need to use string as env is always string.
// We can't prefix DATABASE_URL with NEXT_PUBLIC_ because it contains sensitive information that // We can't prefix DATABASE_URL with NEXT_PUBLIC_ because it contains sensitive information that
// should not be exposed to the client. // should not be exposed to the client.
NEXT_PUBLIC_DATABASE_LESS: string; NEXT_PUBLIC_USE_DATABASE: string;
// Optional. Set to "true" to allow users to bring their own OpenAI API key. // Required if NEXT_PUBLIC_USE_DATABASE is true. Postgres database connection string to store
NEXT_PUBLIC_ALLOW_SELF_OPENAI_KEY: string;
// Required if NEXT_PUBLIC_DATABASE_LESS is false. Postgres database connection string to store
// the data. e.g. postgresql://postgres:YOUR_PASSWORD@localhost:5432/sqlchat?schema=sqlchat // the data. e.g. postgresql://postgres:YOUR_PASSWORD@localhost:5432/sqlchat?schema=sqlchat
DATABASE_URL: string; DATABASE_URL: string;
// Optional. Set to "true" to allow users to bring their own OpenAI API key.
NEXT_PUBLIC_ALLOW_SELF_OPENAI_KEY: string;
// Required. Do not share your OpenAI API key with anyone! It should remain a secret. // Required. Do not share your OpenAI API key with anyone! It should remain a secret.
OPENAI_API_KEY: string; OPENAI_API_KEY: string;
// Optional. OpenAI API endpoint. Defaults to https://api.openai.com. // Optional. OpenAI API endpoint. Defaults to https://api.openai.com.

View File

@ -7,6 +7,7 @@ import React, { useEffect } from "react";
import { Toaster } from "react-hot-toast"; import { Toaster } from "react-hot-toast";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useSettingStore } from "@/store"; import { useSettingStore } from "@/store";
import { hasDatabase } from "@/utils";
dayjs.extend(localizedFormat); dayjs.extend(localizedFormat);
import "dayjs/locale/zh"; import "dayjs/locale/zh";
@ -25,7 +26,7 @@ function MyApp({ Component, pageProps: { session, ...pageProps } }: AppProps<{ s
// Check whether those NEXT_PUBLIC_ envs are properly exposed in frontend. // Check whether those NEXT_PUBLIC_ envs are properly exposed in frontend.
// See https://github.com/vercel/next.js/discussions/17641 // See https://github.com/vercel/next.js/discussions/17641
console.log("Use database:", !process.env.NEXT_PUBLIC_DATABASE_LESS); console.log("Has database:", hasDatabase());
useEffect(() => { useEffect(() => {
const darkMediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); const darkMediaQuery = window.matchMedia("(prefers-color-scheme: dark)");

View File

@ -1,23 +1,23 @@
type FeatureType = "debug" | "account" | "payment" | "quota" | "collect"; type FeatureType = "debug" | "account" | "payment" | "quota" | "collect";
function databaseLess() { export const hasDatabase = () => {
return process.env.NEXT_PUBLIC_DATABASE_LESS == "true"; return process.env.NEXT_PUBLIC_USE_DATABASE == "true";
} };
const matrix: { [key: string]: { [feature: string]: boolean } } = { const matrix: { [key: string]: { [feature: string]: boolean } } = {
development: { development: {
debug: true, debug: true,
account: !databaseLess(), account: hasDatabase(),
payment: !databaseLess(), payment: hasDatabase(),
quota: !databaseLess(), quota: hasDatabase(),
collect: !databaseLess(), collect: hasDatabase(),
}, },
production: { production: {
debug: false, debug: false,
account: !databaseLess(), account: hasDatabase(),
payment: !databaseLess(), payment: hasDatabase(),
quota: !databaseLess(), quota: hasDatabase(),
collect: !databaseLess(), collect: hasDatabase(),
}, },
}; };