独立(业余)开发使用1panel搭建自己的PaaS基础设施
实现的功能:
- Next.js应用部署:通过可视化UI进行Docker环境快速部署Next.js应用,一键搭建Node.js环境。
- 网站及安全配置:支持网站反向代理和一键SSL证书部署,自动更新证书。集成fail2ban/ufw/Supervisor进行安全管理。
- 数据库管理:PostgreSQL和MySQL数据库支持,可备份数据至COS、OSS等对象存储,确保数据安全。
- 数据监控:可视化UI面板,查看服务器性能和服务状态。
- API管理:一键部署One-API系统,管理并分发OpenAI接口。
- 数据备份:提供定时云备份服务,支持网站快照,优化数据恢复流程。
- 一键搭建应用:我测试搭建one-api和Umami。Umani是进行数据监控,它是一种简单、快速且注重隐私的Google Analytics替代方案。OneAPI 是一个通过标准的 OpenAI API 格式访问所有大模型的工具,它开箱即用,支持配置镜像以及众多第三方代理服务,还支持通过负载均衡的方式访问多个渠道。
前言
为什么要自己搭建?
为什么要搭建自己的PaaS?我测试使用了很多现在的PaaS服务,例如zeabur和fly.io,他们各有优势,但是一旦遇到问题和不熟悉的地方,debug会花费我很长时间,通常需要去问客服或者还需要看他们的文档关注一些细节问题,总之让我觉得很不舒服。
我的需求:
- 方便部署代码
- 方便绑定域名创建证书和反代理
- 一台服务器挂载多个站点
- 绑定多个域名
- 可视化配置(写nginx配置太麻烦啦)
- 方便自己线上debug
- 有docker环境隔离。
所以1panel基本上能满足我自己的需求,最近一直断断续续有把服务用1panel来管理,最后测试下来感觉还是不错的,基本上环境都是用docker帮你包好,环境隔离,干净卫生。所以写一篇记录复盘,如果有纰漏也请大家多多包涵。
搭建的功能:
- Nextjs应用可视化部署:方便的docker环境部署,一键搭建nodejs环境和部署
- 网站反代,域名一键SSL证书部署(证书自动更新)
- 部署迁移了三个站点,2个nextjs服务
- PostgreSQL:管理自己的数据库(可以挂载备份),你也可以挂在备份到COS、OSS等对象存储,解决了数据灾备问题。
- Umami(数据监控):比Google Analytics 的简单、快速、注重隐私的替代方案
- one-api:OpenAI 接口管理 & 分发系统,一键部署one-api
- 安全方面:fail2ban/ufw/Supervisor可视化操作
- 备份:数据、网站等支持定时云备份、网站支持快照(但是不支持镜像导出)。
实现方式:
主要是用1panel来对服务器进行管理和配置
1Panel 是新一代的 Linux 服务器运维管理面板,支持以docker形式进行部署。用户可以通过 Web 图形界面轻松管理 Linux 服务器,实现主机监控、文件管理、数据库管理、容器管理等功能。深度集成开源建站软件 WordPress 和 Halo,域名绑定、SSL 证书配置等一键搞定。支持一键备份和恢复,用户可以将数据备份到各类云端存储介质,永不丢失。
案例实践
案例一:使用1panel完成one-api搭建
- 购买(准备)服务器安装1panel(Linux命令行)
- 通过1panel安装数据库(UI操作)
- 通过1panel安装one-api(UI操作)
- 通过1panel安装OpenResty(nginx管理,反代配置,UI操作)
- 对第三步的one-api配置域名,进行反代(UI操作)
案例二:使用1panel完成NextJS搭建
- 下载配置代码
- 创建nodejs环境
- 启动node docker 环境安装依赖
- 通过1panel配置SSL证书,并自动续签
- 配置域名和反代理
基础运维功能
可视化面板
方便查看服务性性能
WAF
防止你网站被攻击
守护进程/Fail2ban
可以开启守护进程
也可以使用Fail2ban过滤一下暴力的扫描,以前都是通过命令行配置,现在可以直接通过面板一键配置。
案例一: 使用1panel完成one-api搭建
购买服务器
我的服务器配置:
2 vCPU Cores
60 GB PURE SSD RAID-10 Storage
4 GB RAM
8000GB Monthly Premium Bandwidth
1Gbps Public Network Port
Location los Angeles DC02
Operating System ubuntu
我购买完RackNerd之后,等他开通结束,就会有邮件通知告诉我登录IP和账号密码
ssh 登录服务器
1 | 登录你的服务器 |
安装1panel
项目官网
1Panel - 现代化、开源的 Linux 服务器运维管理面板
项目开源地址:
GitHub - 1Panel-dev/1Panel: 🔥 🔥 🔥 现代化、开源的 Linux 服务器运维管理面板。
项目安装
因为我是ubuntu,所以选择对应的环境在ssh之后一键安装即可
1 | curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh |
安装完成之后,会在你的terminal输出访问的信息
1 | [1Panel Log]: =================感谢您的耐心等待,安装已经完成================== |
复制你的外网地址,就可以打开登录1panel的控制面板了,这个很重要,不要轻易泄漏你的登录地址。
登录之后你就可以看到你自己的服务器面板了,已经成功了第一步了。
搭建数据库(PostgreSQL、MySQL)
因为我自己习惯使用Postgresql,所以我这里的教程就是搭建postgresql,当然同理你也搭建mysql也是一样的。
一键安装 PostgreSQL
登录面板 -> 应用商店 -> 数据库 -> 选择 PostgreSQL(或者MySQL)进行安装
安装的过程非常简单,基本上都是UI操作,一键安装就好,如果你需要外网链接,可以把【端口外部访问】这个选项打开。为了安全起见,你也可以修改默认的端口号。
查看和配置数据库
配置完成之后,你就可以在 数据库 -> PostgreSQL(或者MySQL) 看到自己的数据库了
在这里你可以配置自己的数据库和相应的账号密码,但是这里有一点不好,就是对于用户的权限控制不是处理的非常好,你需要自己配置访问数据库的权限。
安装one-api
OneAPI 是一个通过标准的 OpenAI API 格式访问所有大模型的工具,它开箱即用,支持配置镜像以及众多第三方代理服务,还支持通过负载均衡的方式访问多个渠道。
面板一键安装(MySQL数据库)
如果你是使用MySQL,可以通过这里的面板一键安装,配置好MySQL的账号密码即可。
Docker安装One-API (PostgreSQL数据库)
创建数据库
在 数据库 -> PostgreSQL 中创建一个 oneapi
的数据库
假设数据库信息如下:
数据库名称:oneapi
用户名:oneapiuser
密码:oneapipassword
1 | # 登录你的服务器 |
针对这条docker命令进行一个解释:
docker run
: 运行一个新的容器。--name one-api
: 为容器指定一个名称为one-api
,这样可以方便地引用这个容器。-d
: 在后台运行容器,并返回容器的ID。--restart always
: 设置容器退出时总是重新启动。-p 3000:3000
: 将容器的端口3000映射到主机的端口3000,允许外部访问容器中运行的应用程序。-e SQL_DSN="postgres://oneapiuser:oneapipassword@your_ip:5432/oneapi"
: 设置环境变量SQL_DSN
,用于指定连接到PostgreSQL数据库的DSN(数据源名称)。-e TZ=Asia/Shanghai
: 设置容器的时区为亚洲/上海。-v /root/one-api:/data
: 将主机的/root/one-api
目录挂载到容器的/data
目录,实现主机和容器之间的文件共享。justsong/one-api
: 指定要运行的Docker镜像。
这样你就启用了一个使用PostgreSQL的One-API服务了,可以非常方便的代理你的AI应用
正常你可以使用命令行登录docker或者查看docker的logs情况
1 | docker exec -it container_id |
现在有控制面板了,你更方便可以直接在面板中查看。
在容器菜单栏就可以看到对应的docker信息,比较好排查问题。
根据上述信息,如果你正常跑起来了,那么你就得到了一个one-api的服务了。
one-api的初始账号: root
密码:123456
记得登录然后修改密码。
都配置完成之后你就得到了一个one-api服务,这个时候还只能用ip和端口进行访问:
假设你的IP地址是8.8.8.8
上述docker开启的端口是 3000
那么你通过8.8.8.8:3000
就可以正常访问你的one-api了。
接下来就是配置如何通过域名来访问你的one-api了,也就是设置反向代理。
设置反向代理
简单理解反向代理就是可以把域名和你本地的服务器连接起来
在网络通信中,代理服务器根据客户端的请求,将请求转发到特定的目标服务器,并将目标服务器的响应返回给客户端。
假设你已经有如下的信息:
服务器IP:8.8.8.8
域名:domain.com
二级域名:one-api.domain.com(绑定到你的上述的one-api应用上)
one-api服务开设端口为:3000
cloudflare配置域名解析
登录cloudflare,将你需要的域名A记录解析到你1panel的服务器IP地址。
安装OpenResty
我这里已经安装好了,所以直接跳过,一般进入会引导你进行安装。
配置反向代理
1panel -> 网站 -> 创建网站 -> 反向代理
主域名:你需要配置的域名,上述demo中就是 one-api.domain.com
,我是将一个二级域名分配给one-api服务。
代理地址:127.0.0.1:3000
我上述one-api服务启动的docker监听端口就是3000,所以这里填写3000
最后点击确认就完成了站点的配置。
SSL证书配置HTTPS
Cloudflare方案
如果你跟我一样,已经把域名迁移到cloudflare上,并且开启了proxied 那么你就可以很方便的直接在cloudflare上开启https,默认就是可以直接https访问了。
Let‘s Encrypt 方案
- 网站 -> 证书 -> Acme 账户 随便写一个注册一下
- 网站 -> 证书 -> DNS账户 配置一下,这里我使用的是 cloudflare的DNS验证
关于 Cloudfalre的配置 注意是API Tokens,而不是 API Keys!!!
这里配置完成之后就可以去回到网站先申请对应的证书了,然后再配置HTTPS即可。
至此,你应该就配置好最基础的一个网站服务了。
案例二:使用1panel完成NextJS搭建
下载配置代码
将代码下载到你的服务器上,你可以使用git clone 或者使用面板自带的上传功能,都是可以的。
如果是 nextjs,需要多配置一条 script
编辑 package.json
,然后添加 "prod": "next build && next start"
1 | "scripts": { |
创建nodejs环境 && 自动安装依赖启动docker
网站 -> 运行环境 -> node.js -> 创建允许环境
填写配置文件
这里需要注意的几个点:
源码目录:就是你自己的代码在linux上的路径,可以用pwd看一下,或者直接点击可视化选择
启动命令:因为上面加了一条script的脚本npm run prod
来执行build 和 start,所以这里他会自动读取你的script,然后你直接选择prod就可以了。
应用端口:你nextjs开设的端口,一般是3000或者5000
外部映射端口:就是容器外面监听的端口,如果你的one-api已经使用了3000,建议你使用3001来替代
配置域名和反代理
跟上述步骤一样,你去网站配置反向代理即可。
配置云备份
配置云服务商
选择 面板设置 -> 备份账号 -> 输入 阿里云OSS 或者其他厂商就可以配置云备份环境
支持列表:
- 亚马逊 S3 云存储
- 阿里云 OSS
- 腾讯云 COS
- 微软 OneDrive
- 七牛云 Kodo
- 又拍云 对象存储
- MINIO
- SFTP
定时备份数据库
计划任务 -> 创建计划任务 -> 备份到本地磁盘或者云服务商即可
他选择的备份项目比较多:备份数据库、备份网站、系统快照等等都可以
还可以定时执行你自己的脚本
结论对比:
成本
不同的云厂商和区域成本不一样,我这次实验买的是Racknerd,配置的话建议2C4G起步,然后我是不太喜欢生产用轻量服务器,就算省成本也不建议(因为踩过无数次坑),轻量的IO限制很厉害,CPU的性能也没有那么好。具体怎么选择还是看项目需求。我这台下来大概成本就是在 $38/年。如果正常的PaaS服务大概dev版本是5刀一个月,一年大概是60刀的样子。
服务商 | 配置 | 网络 | 费用(年/元) | 备注 | 链接 |
---|---|---|---|---|---|
阿里云 | 2C4G-SSD -40G | 按量付费 | 1216 | 按量付费每GB流量0.8元 | 阿里云优惠购买 |
阿里云 | 2C4G-SSD-40G | 5M | 199 | 企业用户优惠套餐 | 阿里云优惠购买 |
腾讯云 | 轻量2C4G-SSD-60GB | 5M - 500G流量/月 | 252 | 新用户专享 | 腾讯云优惠购买 |
腾讯云 | 2C4G1M | 1M | 748 | 个企(新用户) | 腾讯云优惠购买 |
Racknerd | 2C4G-SSD-60GB | 8T/Mo | 280 | 点击就可以购买 | RackNerd LLC 购买 |
PS:(链接挂了我的邀请) |
性能查看
我跑了4个网站,1个数据库
2个 NextJS的站点
1个onepanel
1个go的网站
当然这跟网站没啥流量也有关系(😭),后续再测试吧。
对比自己搭建和PaaS的云服务
优势
- 快速建站和高效管理:深度集成各种应用例如(one-api、Umami、postgresql等),支持一键域名绑定、SSL证书配置等,同时提供应用管理、主机监控、文件管理等功能。
- 丰富的应用支持:支持多种常用服务器管理功能,并提供一键安装的应用商店
- 开源和现代化:专注于提供面板管理服务,为开发者提供了一个集中式的管理平台,方便管理多个应用程序。开源,能够快速迭代并广泛获取社区使用反馈。
- 线上调试方便:线上调试会更方便,直接可以链接服务器进行Debug。
劣势(对比其他在线PaaS):
- 需要一定的运维为基础: 需要了解基础的Linux知识,以及域名配置等知识。
- 缺少服务推送通知:如果程序挂了,可能不能第一时间推送通知(后续可以找找有没有解决方案)
- 服务范围限制:由于是单节点,如果突然请求量上来,不好做弹性扩容,可能会导致服务不稳定。
应用探索
1panel 还有很多应用,例如:
- worldpress
- halo
- 禅道
- Jenkins
- MongoDB
- OneDev
- Umami
- ClickHouse
- Elasticsearch
- Calibre-Web
- Grafana
- Obsidian LiveSync
这些服务大家后续就自己去探索吧,或者有docker包的程序都可以非常方便的跑起来。
如果你搭配Jenkins也可以做到持续集成,这个我后续有时间再搭建一下。
以上就是一个业余开发尝试1panel搭建自己的PaaS服务。