1. 项目概述与核心价值
1.1 为什么需要SQLiteViz
最近有个小需求,需要快速查看一个项目里的SQLite数据库内容。按理说SQLite数据量不大,命令行工具sqlite3或者直接装个DB Browser for SQLite就行。但问题是这次的数据要分享给团队里几个不太懂命令行的同事看,他们需要可视化地浏览表结构、执行查询、甚至导出部分数据。而且数据库文件在远程服务器上,不想把文件传来传去,直接Web化才是正解。
SQLiteViz就是干这个的。它是一个基于Web的SQLite数据库可视化工具,用浏览器就能访问,支持查看表结构、浏览数据、执行SQL查询、图表展示等功能。我挑它的主要原因有几点:一是部署简单,就一个二进制文件或一个Docker容器,不需要额外依赖Node.js或Python运行时;二是开箱即用,启动后浏览器打开一个端口就能看到界面,对非技术人员几乎零学习成本;三是支持只读模式,查询和浏览数据没问题,但不允许误操作改坏数据库。
这个项目适合谁用呢?需要定期查看SQLite数据库的开发者、数据分析师,或者像我这样要给同事提供一个轻量级数据库浏览入口的场景都很合适。如果你只是偶尔本地看一下数据库,那直接用DB Browser for SQLite就够了,没必要上SQLiteViz;但如果你需要多台设备访问、需要分享给团队、或者想集成到自己的工具链里,那SQLiteViz就是一个很轻量的解决方案。
1.2 本地部署与外网访问的整体思路
本地部署SQLiteViz,核心目标是在服务器上把服务跑起来,让局域网内设备和公网用户都能访问。整个流程分三步:第一步,确认服务器上已有SQLite数据库文件;第二步,用Docker或直接二进制方式部署SQLiteViz;第三步,配置端口映射或反向代理,把服务暴露到局域网和公网。
外部访问是这里面的重头戏。局域网内访问最简单,服务器IP加端口就行;如果要在公网访问,常见思路有两个:一是用Nginx反向代理加域名和HTTPS证书,适合自己有公网服务器和域名的场景;二是用内网穿透工具,适合没有公网IP、临时分享的场景。我实际部署时选的是第一种,因为手头正好有云服务器,而且后面还要对接其他内网服务,Nginx一次配置,后面添加其他工具也方便。
需要注意的是,SQLiteViz本质是一个数据浏览工具,如果数据库里包含敏感数据,暴露到公网前一定要做好访问控制。最稳妥的做法是Nginx层加Basic Auth认证,SQLiteViz自身也开启只读模式,双保险。我后面会详细讲这两块怎么配。
2. 工具选型与核心原理解读
2.1 SQLiteViz的优势与技术背景
SQLiteViz是一个国人开发者开源的项目,在GitHub上已经积累了不少Star。它底层用Go语言编写,前端界面是Vue加Ant Design Vue,天然具备单二进制部署的优势。所谓单二进制部署,就是编译出来的可执行文件不依赖系统里任何动态库或者运行环境,拷到Linux服务器上直接就能跑。这一点和Go语言在云基础设施中的普及率是配套的,很多新工具都选择了这条路。
用SQLiteViz还有一个别的好处:它的UI设计比较接近我日常用的数据库管理工具,左侧是表列表,中间是表格数据,顶部是SQL编辑器,操作习惯不用重新适应。对比一下同类的开源工具,可以看下面这个表格。
| 工具 | 部署方式 | 功能重点 | UI风格 | 适用场景 |
|---|---|---|---|---|
| SQLiteViz | 单二进制或Docker | 表格浏览、SQL执行、图表 | 清爽简洁 | 轻量快速展示 |
| SQLite Web | Docker或npm | 数据库操作、简单的可视化 | 极简 | 快速浏览 |
| Datasette | pip安装 | 数据API、插件生态 | 极简 | 数据分析并发布为API |
| CloudBeaver | Docker(较重) | 完整数据库管理 | 企业级 | 跨数据库管理 |
Datasette其实也很有名,功能更强,尤其是把SQLite发布成可查询的REST API这一点很吸引人。不过它的部署依赖Python环境,插件多了以后管理起来稍微繁琐一点。CloudBeaver功能最全,但JVM系应用占资源较多,对一台只跑数据库浏览业务的轻量服务器来说有点杀鸡用牛刀。SQLiteViz正好卡在中间,部署最简单、界面直观、资源占用低,非常适合中小数据库的快速可视化需求。
2.2 外部访问方案选型:反向代理与内网穿透
外部访问本质上解决的是从公网访问内网服务的问题。我在规划SQLiteViz的访问方案时,一般会先画一条访问链路——从浏览器发出请求,经过域名解析到服务器,再由Nginx把流量转发到SQLiteViz监听的端口。这套链路里每一步都有可选的方案,选型时主要看自己手上有什么资源。
如果你有一台公网云服务器和一个域名,那我强烈建议用Nginx反向代理方案。原因是:第一,HTTPS证书可以用acme.sh或者Certbot免费签发,域名加证书让访问链路可审计、可管理;第二,Nginx配置一次,后面部署更多Web工具时直接复用同一套转发逻辑;第三,反向代理前面挂Basic Auth或者OAuth2认证都非常成熟,安全可控。我自己的服务器上就跑了三四个Web工具,全部通过Nginx统一入口访问,管理起来非常清爽。
如果你没有公网服务器,或者只是想临时给别人看一下,那内网穿透工具更合适。目前比较流行的是Cloudflare Tunnel和frp。Cloudflare Tunnel只需要你在内网机器上跑一个cloudflared客户端,把本地端口映射到Cloudflare边缘节点,然后通过Cloudflare分配的域名访问,全程不需要公网IP和路由器端口映射。frp则需要一台有公网IP的服务器做中转,配置稍微复杂一些,但胜在灵活。两种方案的共性是把本地的TCP端口暴露出去,区别在于中转方是谁、链路是否加密。
2.3 绑定端口与防火墙的原理解读
SQLiteViz默认监听8080端口,这本身没什么特别的。但很多人在这步就开始踩坑:服务明明启动了,浏览器访问服务器IP加端口却打不开。这里要理解两个概念:进程监听的网络地址,以及防火墙允许通过的端口。
进程监听地址默认是127.0.0.1,也就是只监听本机回环地址。这种情况下,即使防火墙放行了8080端口,局域网其他机器也访问不到,因为服务根本没有在对外网卡上监听。要对外提供服务,就要把监听地址改成0.0.0.0,意思是对所有网卡和IP地址开放监听。SQLiteViz在启动时通常会提供一个--host或者--listen参数来设置这个地址。
防火墙这块,Linux服务器上常见的有ufw和firewalld两个工具。ufw是Ubuntu系的,firewalld是CentOS系的。放行端口的命令分别是ufw allow 8080/tcp和firewall-cmd --add-port=8080/tcp --permanent。很多云服务商的安全组策略是在虚拟机之外再挡一层,所以就算服务器防火墙放行了,还得去云控制台的安全组规则里加一条放行策略。我见过很多教程只讲系统防火墙,不讲安全组,导致读者照着操作还是访问失败,这里单独提一下。
3. 本地部署实操全流程
3.1 准备工作:确认数据库与安装Docker
实际部署之前,先确认服务器上已经有SQLite数据库文件。SQLite的数据库就是一个独立文件,后缀通常是.db、.sqlite、.sqlite3或者没有后缀,比如很多应用自己生成的文件名。用file命令可以快速识别文件类型:
file /data/app.db如果输出里包含SQLite 3.x database,那就确认是SQLite数据库文件了。另外还要确认一下文件权限,确保运行SQLiteViz的用户至少对该文件有读取权限。如果数据库文件在项目的子目录里,可以连带目录一起挂载,方便一次浏览多个数据库文件。
接下来安装Docker。如果你的服务器已经装好了Docker,跳过这一步。没有装的话,我用的是Docker官方安装脚本,一条命令搞定:
curl -fsSL https://get.docker.com | bash systemctl enable --now docker这里我不建议用系统包管理器自带的旧版Docker,版本太老可能会有兼容性问题。官方脚本安装的是当前稳定版,而且会自动配置好Docker CE源。装完后验证一下docker version,确保客户端和服务端版本都对得上。
3.2 使用Docker Compose部署SQLiteViz
我习惯用Docker Compose来管理这类单容器服务,好处是配置可以版本化管理,换机器部署时直接把compose文件拷过去就行,不用重新敲一长串docker run命令。新建一个目录,比如/data/sqliteviz,在里面创建docker-compose.yml:
version: "3.8" services: sqliteviz: image: ghcr.io/chaxin/sqliteviz:latest container_name: sqliteviz restart: unless-stopped ports: - "127.0.0.1:8080:8080" volumes: - /data/sqliteviz/data:/data environment: - SQLITEVIZ_HOST=0.0.0.0 - SQLITEVIZ_PORT=8080 - SQLITEVIZ_READONLY=true这里有几个细节值得注意。端口映射这块,我没有直接把宿主机的8080端口暴露到公网,而是让容器只监听127.0.0.1的8080端口。端口映射左边是宿主机地址和端口,右边是容器内端口。为什么要绑定127.0.0.1而不是0.0.0.0呢?因为我这台服务器是要通过Nginx反向代理出去的,Nginx在本机转发流量就够了,不需要把8080端口暴露到公网。这样即使Nginx没配好,或者防火墙规则失误,SQLiteViz也不会直接裸奔在公网上。
卷挂载这块,我把宿主机/data/sqliteviz/data目录挂载到容器内的/data目录。你可以按照数据库文件的实际位置调整,比如数据库文件在/home/user/project/data.db,那就把宿主机路径改成/home/user/project。SQLiteViz会扫描挂载目录下的所有.db和.sqlite文件,在左侧列表里展示出来。
启动命令:
cd /data/sqliteviz docker compose up -d docker compose logs -f看到类似server is running on http://0.0.0.0:8080这样的日志,就说明容器启动成功了。
3.3 非Docker方案:直接使用二进制文件部署
如果你的服务器没有Docker环境,或者不想引入Docker这个额外依赖,也可以用二进制方式部署SQLiteViz。从GitHub Releases页面下载对应平台的压缩包,Linux服务器一般是linux-amd64版本:
wget https://github.com/chaxin/sqliteviz/releases/download/v0.1.8/sqliteviz_linux_amd64.tar.gz tar -zxvf sqliteviz_linux_amd64.tar.gz sudo mv sqliteviz /usr/local/bin/然后直接运行:
sqliteviz --host 0.0.0.0 --port 8080 --read-only --path /data/sqliteviz/data这样一个进程就起来了。如果你希望它作为系统服务常驻,可以配置systemd服务。创建/etc/systemd/system/sqliteviz.service文件:
[Unit] Description=SQLiteViz Service After=network.target [Service] ExecStart=/usr/local/bin/sqliteviz --host 0.0.0.0 --port 8080 --read-only --path /data/sqliteviz/data Restart=always User=www-data [Install] WantedBy=multi-user.target然后加载并启动服务:
systemctl daemon-reload systemctl enable --now sqliteviz这种方式的好处是少了一层容器抽象,排查网络或文件权限问题时更直接。缺点是升级时得手动替换二进制文件,不像Docker那样docker compose pull就完事。取舍很清晰,就看你自己哪个顺手上。
3.4 在局域网内快速验证服务可用
服务启动后,别急着配外网访问,先在局域网内验证一下基本功能。用同一局域网内的另一台电脑,浏览器访问http://服务器IP:8080。如果页面能正常打开,左侧能看到数据库表列表,点击表名能显示数据,那说明服务本身没有问题。
这个验证过程很重要,因为后一步配Nginx只是把流量转发到本机8080端口,不需要改变SQLiteViz自身的逻辑。如果这一步都打不开,问题很可能出在防火墙或者服务启动参数上,而不是Nginx配置。
另外建议在浏览器里实际执行一条SQL语句,验证只读模式下查询功能正常。比如:
SELECT COUNT(*) FROM sqlite_master WHERE type='table';这条SQL会返回当前数据库里所有表的数量,可以借此确认SQLiteViz确实连上了正确的数据库文件。
4. 实现外部访问:Nginx反向代理与安全加固
4.1 Nginx安装与基础配置
公网访问的第一步是装好Nginx。在Ubuntu/Debian系服务器上:
apt update apt install -y nginx systemctl enable --now nginxCentOS/RHEL系的话用yum install nginx。装完后检查一下Nginx状态,确保它正常工作。
接下来在/etc/nginx/conf.d/下新建一个配置文件,比如sqliteviz.conf。注意不要直接改/etc/nginx/nginx.conf主配置,那样做维护性很差。每个站点独立配置,后面删改都方便。
server { listen 80; server_name sqliteviz.example.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }这段配置的核心就是proxy_pass。Nginx收到外部发来的HTTP请求后,把请求转发给本机8080端口的SQLiteViz服务,然后把响应原样返回给客户端。从客户端角度看,它访问的是Nginx的80端口,完全不知道后台还有一个SQLiteViz进程。这就是反向代理的精髓——所有请求先经过Nginx,由Nginx决定发给哪个后端服务。
配置完成后,验证语法并重新加载:
nginx -t systemctl reload nginx然后浏览器访问http://sqliteviz.example.com。注意把域名换成你自己的,同时记得在域名服务商那边把解析记录指向服务器IP。
4.2 配置HTTPS免费证书
HTTP明文传输数据是不安全的,尤其是SQLiteViz这种可能包含业务数据的工具,必须要上HTTPS。我用的是acme.sh,签的是Let's Encrypt免费证书,有效期90天,通过定时任务自动续期。先说acme.sh怎么装。
curl https://get.acme.sh | sh alias acme.sh=~/.acme.sh/acme.sh然后签发证书,这里用webroot模式,让acme.sh通过HTTP验证域名所有权:
acme.sh --issue -d sqliteviz.example.com --webroot /var/www/html签好证书后,证书文件在~/.acme.sh/sqliteviz.example.com/目录下。接下来修改Nginx配置,把HTTP访问全都跳到HTTPS:
server { listen 80; server_name sqliteviz.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name sqliteviz.example.com; ssl_certificate /root/.acme.sh/sqliteviz.example.com_ecc/fullchain.cer; ssl_certificate_key /root/.acme.sh/sqliteviz.example.com_ecc/sqliteviz.example.com.key; ssl_protocols TLSv1.2 TLSv1.3; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }这里要注意证书路径,acme.sh签发的ECC证书通常在域名加_ecc后缀的目录里。修改完配置后nginx -t检查语法,确认没问题再reload。浏览器再次访问,地址栏会显示小锁图标,说明HTTPS生效了。
提示:如果你用的是Certbot,签发命令是certbot --nginx -d sqliteviz.example.com,它会自动改写Nginx配置,不用手写证书路径。两种工具都成熟稳定,挑一个用就行。
4.3 用Basic Auth给工具加上访问密码
SLLiteViz自身没有账号密码体系,暴露在公网上等于任何人知道地址就能看数据。这时候就要在Nginx层加一层认证。Nginx的Basic Auth很简单,先创建密码文件:
mkdir -p /etc/nginx/auth htpasswd -c /etc/nginx/auth/sqliteviz.htpasswd adminhtpasswd是apache2-utils包里的工具,没装的话先apt install apache2-utils。执行后会让你输入两遍密码,然后生成密码文件。接着修改Nginx配置,在location块里加两行:
location / { auth_basic "Restricted Area"; auth_basic_user_file /etc/nginx/auth/sqliteviz.htpasswd; proxy_pass http://127.0.0.1:8080; # ... 其他proxy_set_header配置 }再次reload Nginx,浏览器访问时就会弹出用户名密码输入框。到这里,SQLiteViz已经包了一层Basic Auth,未认证用户连页面都看不到。这个方案虽然没有OAuth2那么花哨,但对个人工具来说已经非常实用,而且Nginx层面完成,SQLiteViz服务本身不需要做任何改动。
4.4 无公网IP场景:用Cloudflare Tunnel实现外部访问
前面讲的方案适用于自己有公网IP和域名的场景。如果你的数据库部署在家里NAS上,或者公司内网服务器没有公网IP,那Cloudflare Tunnel是我比较推荐的方案。
先在Cloudflare后台把域名接入,然后把DNS记录托管到Cloudflare。接着在服务器上安装cloudflared:
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 chmod +x cloudflared-linux-amd64 sudo mv cloudflared-linux-amd64 /usr/local/bin/cloudflared然后登录并创建隧道:
cloudflared tunnel login cloudflared tunnel create sqliteviz隧道创建完成后,在~/.cloudflared/目录下会生成一个隧道配置文件。接着创建隧道映射配置config.yml:
tunnel: <你的隧道ID> credentials-file: /root/.cloudflared/<隧道ID>.json ingress: - hostname: sqliteviz.example.com service: http://127.0.0.1:8080 - service: http_status:404配置完成后启动隧道:
cloudflared tunnel run sqliteviz然后在Cloudflare后台的DNS设置里添加一条CNAME记录,指向隧道ID.cfargotunnel.com。这样外网用户访问sqliteviz.example.com时,请求会先到Cloudflare边缘节点,然后通过隧道安全地转发到本地服务器上的SQLiteViz。整个过程不需要配置路由器端口映射,也不需要公网IP,链路全程加密。
这个方案的缺点是对Cloudflare服务有依赖,Cloudflare本身在国内的访问速度不稳定,所以如果服务器和访问者都在国内,这条方案体验可能不太理想。但作为临时演示、或者满足基本的外网访问需求,Cloudflare Tunnel是成本最低的选择。
5. 常见问题排查与实操避坑
5.1 访问失败全链路排查手册
外部访问失败的情况太常见了,我总结了实际的排查顺序,从内到外一步步来,比抓瞎定位快得多。
第一,确认服务本身在正常工作。在服务器上执行curl http://127.0.0.1:8080,能返回HTML说明服务存活。这一步没通过的话,去查docker logs或者systemd日志。
第二,确认Nginx配置和状态。curl http://127.0.0.1/看能不能返回SQLiteViz的页面。如果Nginx返回502 Bad Gateway,说明Nginx活着但代理目标无响应。检查proxy_pass的地址和端口是不是写对了,后端服务有没有启动。
第三,确认防火墙放行。在服务器上执行ss -lntp查看监听端口。然后检查本地防火墙规则。注意如果服务监听的是127.0.0.1,外网访问本身就不可能通,得改为0.0.0.0。
第四,检查云平台安全组。登录云服务商控制台,找到对应服务器实例的安全组,确认80和443端口的入站规则已放行。安全组这个坑非常隐蔽,因为系统防火墙配好了,服务也在监听,但流量在云平台那层就被拦住了。
第五,域名解析检查。在本机执行dig sqliteviz.example.com,确认解析到正确的服务器IP。如果解析不对,所有配置都白搭。
下面整理一个速查表格。
| 现象 | 可能原因 | 排查命令/方式 |
|---|---|---|
| 服务启动了但页面打不开 | 监听地址不是0.0.0.0 | ss -lntp查看监听地址 |
| 局域网内打不开,本机可以 | 系统防火墙或安全组未放行 | ufw status / 云控制台 |
| Nginx返回502 | 后端服务挂了或端口配置错误 | systemctl status / docker ps |
| 域名访问变成本机默认页 | Nginx配置未生效或server_name不匹配 | nginx -T查生效配置 |
| HTTPS证书报错 | 域名解析未生效或证书签发失败 | acme.sh --list查看证书状态 |
5.2 常见问题:SQLite文件锁定与并发读取
SQLite在Web场景下有个天然限制:同一时间只有一个进程能写数据库,多个进程同时写会出现database is locked错误。SQLiteViz如果以读写模式运行,用户执行UPDATE或INSERT操作时恰好有其他进程在写,就会报错。
我在部署时直接开启了只读模式,通过SQLITEVIZ_READONLY或--read-only参数控制。这样做的原因很简单:SQLiteViz定位是数据可视化工具,不是管理工具。如果有人通过Web界面误改了生产数据,后果比访问受限严重得多。只读模式彻底杜绝了这个风险,团队里其他人查看数据完全够用,真需要修改数据都是我直接SSH到服务器操作,不经过Web入口。
如果你的团队确实需要通过Web编辑数据,那SQLiteViz的读写模式也可以用,但建议后接一个数据库备份机制,比如定时把data目录下的db文件用sqlite3 .backup命令备份到另一块磁盘。
5.3 优化访问速度与连接池参数
SQLiteViz作为轻量工具,本身速度影响不大,主要瓶颈在数据库查询和网络传输上。如果你的数据库文件比较大,比如几百MB,每次浏览器加载表数据都要全表扫描,那体验会明显下降。
SQLiteViz对数据量大的场景没有太多内置优化,但我们可以从外部手段缓解。第一个办法是数据库层面建索引。这个需要在服务器上手动执行SQL,找到查询频繁的字段,用CREATE INDEX语句建索引。第二个办法是优化Nginx侧,开启gzip压缩,减少传输体积。
gzip on; gzip_min_length 1024; gzip_types text/plain text/css application/json application/javascript application/xml image/svg+xml;此外,如果服务器配置比较低,Docker容器的内存限制也可以设置一下。在docker-compose.yml里加上:
deploy: resources: limits: memory: 256MSQLiteViz本身不是很吃内存,但数据库频繁查询时,容器内存上限设太低会导致OOM Kill,导致服务假死。建议先不设限制跑几天,观察内存占用再决定要不要限制。
5.4 结合AI辅助的进阶用法
最近大模型本地部署很火,SQLiteViz这类工具其实可以和本地大模型结合起来,搞一个AI辅助SQL查询的流程。比如你用ollama本地部署了一个Qwen模型,通过它来生成SQL查询语句,然后在SQLiteViz里执行验证。SQLiteViz本身不直接支持插件,但它的SQL编辑器支持执行任意SQL语句,配合外部AI工具生成的SQL,可以形成一个简单的闭环。
我实际操作时,先在服务器上装了ollama并拉了个Qwen模型,然后用一个简单的Web页面或者命令行工具把自然语言问题发送给模型,让模型输出SQL。生成的SQL再复制到SQLiteViz的SQL编辑器里执行。这一步虽然不如商业BI工具的AI集成那么丝滑,但对于手头没有外部API凭证、又想在本地完成数据分析的场景来说,已经足够实用了。
如果你对这套玩法感兴趣,思路还可以再延伸一点。SQLiteViz挂在Nginx后面,Nginx前面加一个API网关,网关里接入本地大模型,就能做成一个完整的自然语言查询平台。后续想怎么扩展,完全看个人想象力和需求。
注意:使用本地大模型生成SQL时,一定要仔细核对生成的语句,尤其是包含DELETE、UPDATE、DROP的语句。生成式模型不是每次都准确,一旦执行了危险语句,只读模式可以兜底,但如果是读写模式,后果就很严重了。
6. 写在最后的一些实践体会
SQLiteViz这个工具本身不算复杂,部署十几分钟就能完成,真正有价值的是背后那套“怎么把本地工具安全、稳定地暴露到公网”的思路。这套思路可以复用到很多工具上——你部署的数据看板、API服务、上传工具,本质上都是同一个套路:本地服务跑起来,Nginx反代出去,加HTTPS和认证,有条件的话再套一层内网穿透。
我在实际操作中体会最深的一点是,永远不要把数据库服务直接对公网裸奔,即使只是查看类工具也值得加一层认证。安全不是靠侥幸,而是靠每一层防御的叠加。SQLiteViz放在内网、Nginx做出口、Basic Auth挡住第一层流量、只读模式兜底数据安全,这套组合下来,就算Nginx被攻破,攻击者拿到的也只是一个只读的数据浏览界面,风险可控。
最后再分享一个小技巧:SQLiteViz支持多数据库文件浏览,你可以把相关的几个SQLite文件放到同一个目录下,这样打开SQLiteViz就能看到所有数据库的表结构,省去切换数据库的麻烦。对于需要同时分析多个应用数据的情况,这比开多个数据库管理窗口舒服得多。这个小细节官方文档里没有特别强调,实际用起来却很方便。