恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
SQLiteViz部署指南:用Docker和Nginx实现数据库Web可视化与安全远程访问
首页
资讯中心
/
SQLiteViz部署指南:用Docker和Nginx实现数据库Web可视化与安全远程访问
SQLiteViz部署指南:用Docker和Nginx实现数据库Web可视化与安全远程访问
发布时间:2026/9/17 12:09:42
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 WebDocker或npm数据库操作、简单的可视化极简快速浏览Datasettepip安装数据API、插件生态极简数据分析并发布为APICloudBeaverDocker较重完整数据库管理企业级跨数据库管理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-port8080/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.ymlversion: 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_HOST0.0.0.0 - SQLITEVIZ_PORT8080 - SQLITEVIZ_READONLYtrue这里有几个细节值得注意。端口映射这块我没有直接把宿主机的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] DescriptionSQLiteViz Service Afternetwork.target [Service] ExecStart/usr/local/bin/sqliteviz --host 0.0.0.0 --port 8080 --read-only --path /data/sqliteviz/data Restartalways Userwww-data [Install] WantedBymulti-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 typetable;这条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签的是Lets 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访问全都跳到HTTPSserver { 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。接着在服务器上安装cloudflaredwget 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.ymltunnel: 你的隧道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.0ss -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/svgxml;此外如果服务器配置比较低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就能看到所有数据库的表结构省去切换数据库的麻烦。对于需要同时分析多个应用数据的情况这比开多个数据库管理窗口舒服得多。这个小细节官方文档里没有特别强调实际用起来却很方便。