本项目的目标是为搭建 Webapp 提供一个开箱即用的基础脚手架, 且直接集成了基于 Gel Auth 的用户认证方案.
模板包含技术栈:
项目目录说明:
dbschema/
- Gel schema and migrations, queries and query builder API.(Auto Generated)deploy/
- Deploy scripts.gel.toml
- Gel configuration.src/lib/components
- UI Components.src/lib/gel/auth-sveltekit
- @gel/auth-sveltekit local versionsrc/lib/gel/client.ts
- Gel query client.src/lib/gel/clientAuth.ts
- A ClientAuth object to get OAuth, BuiltinUI and signout URLs.src/lib/utils/
- Common utils functions.src/routes/
- All route defines.src/routes/identity
- Custom auth identity route defines.package.json
- npm dependencies.bun.lock
- bun lockfilepostcss.config.js
- PostCSS configurationtailwind.config.ts
- Tailwind CSS configurationtsconfig.json
- TypeScript configurationClone repo & install dependencies
git clone https://github.com/lonexw/svelte-gel-auth-teamplate.git
cd svelte-gel-auth-teamplate && bun i # 需要安装 bun 包管理工具 🔧
Install Gel CLI
在本地安装 Gel 数据库的命令行工具, 方便本地开发数据库的管理(可选).
本项目提供已启用 auth 扩展的数据库模型示例文件 dbschema/, 你可以以此为基础来扩展开发, 初始化本地数据库实例:
bunx gel project init
也可以使用独立的项目来管理数据层逻辑, 在环境变量中配置项目关联远程实例即可:
GEN_DSN=gel://USERNAME:PASSWORD@HOSTNAME:PORT/BRANCH
# 也可以使用 VITE_GEL_CREDENTIALS_FILE 配置, 推荐使用该种链接参数配置
GEL_CREDENTIALS_FILE=./deploy/credentials.json
# 如何获取数据库实例的认证信息
gel instance credentials --json > deploy/credentials.json
或者你打算使用 Gel Cloud 提供的实例:
GEL_INSTANCE=
GEL_SECRET_KEY=
优先级顺序为:
Gel Cloud
, 优先使用 cloud 提供的实例GEN_DSN 和 GEL_CREDENTIALS_FILE
是否有配置(DSN优先级较低)Initialize Gel Database
该脚本会自动检查数据库状态, 运行迁移文件并初始化 Auth 配置信息, 运行之前查看 .env.example
的环境变量示例, 根据项目实际情况修改;
bash ./deploy/maybe-initialize-database.sh
Set up Gel Auth Config
可以快速初始化重置 auth 相关配置, 默认会启用 email+password 的验证方式:
bun auth:setup
也可以通过 web 可视化界面来配置:
bunx gel ui # {host}:{port}/ui/{branch}/auth
比如手动配置 SMTP, 增加 OAuth 或 Magic Link 验证方法
Generate types for Client Query
// 等同于 bun generate:edgeql && bun generate:interfaces
bun generate:all
How to use the TypeScript query builder API.
// dbschema/queries/item.ts
import { createClient } from "gel";
import e from "@/dbschema/edgeql-js";
const client = createClient();
await e.insert(e.Deck, { name: "Deck name" }).run(client);
const decks = await e
.select(e.Deck, () => ({
id: true,
name: true,
}))
.run(client);
await e.delete(e.Deck).run(client);
更多查询示例阅读文档: fully-typed EdgeQL queries with TypeScript
Start development server.
bun dev
无论何种部署方式, 首先需要你准备好一个远程可以访问的数据库实例, 手动或者通过命令行创建数据库分支及运行迁移文件.
.env 必须的数据库配置
# Gel Cloud 或者是 GEN_DSN、GEL_CREDENTIALS_FILE 配置信息
GEL_INSTANCE=
GEL_SECRET_KEY=
GEL_BRANCH= # 默认为 main
VITE_GEL_BASE_URL= # 部署站点访问地址
# 参照 .env.example 的说明完成其它基本 auth 信息的配置, 也可以在部署完成后通过 gel ui 在浏览器页面中配置;
在本地关联远程实例, 创建好新分支(如需要)及运行迁移:
# 该脚本会自动检查是否需要运行迁移以及初始化 auth 配置
# 默认读取 .env 文件的配置信息
bash ./deploy/maybe-initialize-database.sh
# 重置 auth 配置信息(如需要)
bun run auth:setup
在 .env.development 文件中配置本地开发数据库, 在 .env 文件中配置生产环境数据库辅助配置远程数据库是不错的解决方案, 当然你可以在独立的数据库管理项目完成这些配置;
To create a production version of your app:
bun run build
You can preview the production build with bun run preview
.
bun --env-file=.env run preview
使用 node 部署需要首先更换一下 svelte adapter 的配置:
// install dependency
bun i -D @sveltejs/adapter-node
// svelte.config.js
import adapter from '@sveltejs/adapter-node';
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
const config = {
preprocess: vitePreprocess(),
kit: {
adapter: adapter({
out: 'build',
precompress: true,
envPrefix: ''
})
}
};
在本地尝试编译, 启动运行一下:
bun run build # generate to build/ directory
# MY_CUSTOM_ORIGIN 网络有代理时需要设置, 避免跨域问题
HOST=127.0.0.1 \
PORT=3000 \
ORIGIN=http://127.0.0.1:3000 \
node --env-file=.env build/index.js
私有化或 docker 部署的时候可能想通过 systemd-service 服务运行网站服务:
# /etc/systemd/system/app.service
[Service]
Environment=NODE_ENV=production IDLE_TIMEOUT=60
ExecStart=/usr/bin/node /usr/bin/app/build
# /etc/systemd/system/app.socket
[Socket]
ListenStream=3000
[Install]
WantedBy=sockets.target
# bash
sudo systemctl daemon-reload
sudo systemctl enable --now app.socket
你也可以使用高度定制的 web server 服务, 比如使用 Express:
import { handler } from './build/handler.js';
import express from 'express';
const app = express();
// let SvelteKit handle everything else, including serving prerendered pages and static assets
app.use(handler);
app.listen(3000, () => {
console.log('listening on port 3000');
});
To deploy your app, you may need to install an adapter for your target environment.
在平台部署界面配置相关的环境变量即可, 根据实际情况调整部署命令:
# Build Command
bun run build
# Install Command
bun install && bun generate:all