1panel-dashboard

实现的功能:

  • 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会花费我很长时间,通常需要去问客服或者还需要看他们的文档关注一些细节问题,总之让我觉得很不舒服。
我的需求:

  1. 方便部署代码
  2. 方便绑定域名创建证书和反代理
    1. 一台服务器挂载多个站点
    2. 绑定多个域名
    3. 可视化配置(写nginx配置太麻烦啦)
  3. 方便自己线上debug
  4. 有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搭建

  1. 购买(准备)服务器安装1panel(Linux命令行)
  2. 通过1panel安装数据库(UI操作)
  3. 通过1panel安装one-api(UI操作)
  4. 通过1panel安装OpenResty(nginx管理,反代配置,UI操作)
  5. 对第三步的one-api配置域名,进行反代(UI操作)

案例二:使用1panel完成NextJS搭建

  1. 下载配置代码
  2. 创建nodejs环境
  3. 启动node docker 环境安装依赖
  4. 通过1panel配置SSL证书,并自动续签
  5. 配置域名和反代理

基础运维功能

可视化面板

方便查看服务性性能

可视化面板

WAF

防止你网站被攻击

WAF配置

守护进程/Fail2ban

可以开启守护进程

也可以使用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 LLC

我购买完RackNerd之后,等他开通结束,就会有邮件通知告诉我登录IP和账号密码

ssh 登录服务器

1
2
3
4
5
# 登录你的服务器
ssh your_username@your_server_ip

# 配置ssh-key 登录 非必要
ssh-copy-id your_username@your_server_ip

安装1panel

项目官网

1Panel - 现代化、开源的 Linux 服务器运维管理面板

项目开源地址:

GitHub - 1Panel-dev/1Panel: 🔥 🔥 🔥 现代化、开源的 Linux 服务器运维管理面板。

项目安装

在线安装 - 1Panel 文档

因为我是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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[1Panel Log]: =================感谢您的耐心等待,安装已经完成==================
[1Panel Log]:
[1Panel Log]: 请用浏览器访问面板:
[1Panel Log]: 外网地址: http://8.8.8.8:6666/f887766
[1Panel Log]: 内网地址: http://8.8.8.8:6666/f887766
[1Panel Log]: 面板用户: user
[1Panel Log]: 面板密码: password
[1Panel Log]:
[1Panel Log]: 项目官网: https://1panel.cn
[1Panel Log]: 项目文档: https://1panel.cn/docs
[1Panel Log]: 代码仓库: https://github.com/1Panel-dev/1Panel
[1Panel Log]:
[1Panel Log]: 如果使用的是云服务器,请至安全组开放 6666 端口
[1Panel Log]:
[1Panel Log]: ================================================================

复制你的外网地址,就可以打开登录1panel的控制面板了,这个很重要,不要轻易泄漏你的登录地址。

登录之后你就可以看到你自己的服务器面板了,已经成功了第一步了。

1panel-dashboard

搭建数据库(PostgreSQL、MySQL)

因为我自己习惯使用Postgresql,所以我这里的教程就是搭建postgresql,当然同理你也搭建mysql也是一样的。

一键安装 PostgreSQL

登录面板 -> 应用商店 -> 数据库 -> 选择 PostgreSQL(或者MySQL)进行安装

1panel-应用商店

安装的过程非常简单,基本上都是UI操作,一键安装就好,如果你需要外网链接,可以把【端口外部访问】这个选项打开。为了安全起见,你也可以修改默认的端口号。

1714635874885.jpg

查看和配置数据库

配置完成之后,你就可以在 数据库 -> PostgreSQL(或者MySQL) 看到自己的数据库了

在这里你可以配置自己的数据库和相应的账号密码,但是这里有一点不好,就是对于用户的权限控制不是处理的非常好,你需要自己配置访问数据库的权限。

1panel-postgresql

安装one-api

OneAPI 是一个通过标准的 OpenAI API 格式访问所有大模型的工具,它开箱即用,支持配置镜像以及众多第三方代理服务,还支持通过负载均衡的方式访问多个渠道。

面板一键安装(MySQL数据库)

如果你是使用MySQL,可以通过这里的面板一键安装,配置好MySQL的账号密码即可。

1panel-应用安装

Docker安装One-API (PostgreSQL数据库)

创建数据库

在 数据库 -> PostgreSQL 中创建一个 oneapi的数据库

假设数据库信息如下:
数据库名称:oneapi
用户名:oneapiuser
密码:oneapipassword

1
2
3
4
5
6
# 登录你的服务器
ssh your_username@your_server_ip

# docker 启动 one-api
docker run --name one-api -d --restart always -p 3000:3000 -e SQL_DSN="postgres://oneapiuser:oneapipassword@your_ip:5432/oneapi" -e TZ=Asia/Shanghai -v /root/one-api:/data justsong/one-api

针对这条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
2
docker exec -it container_id
docker logs container_id

现在有控制面板了,你更方便可以直接在面板中查看。

在容器菜单栏就可以看到对应的docker信息,比较好排查问题。

1panel-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-web

配置反向代理

1panel -> 网站 -> 创建网站 -> 反向代理

主域名:你需要配置的域名,上述demo中就是 one-api.domain.com,我是将一个二级域名分配给one-api服务。

代理地址:127.0.0.1:3000

我上述one-api服务启动的docker监听端口就是3000,所以这里填写3000

Snipaste_2024-05-02_22-31-31.png

最后点击确认就完成了站点的配置。

SSL证书配置HTTPS

Cloudflare方案

如果你跟我一样,已经把域名迁移到cloudflare上,并且开启了proxied 那么你就可以很方便的直接在cloudflare上开启https,默认就是可以直接https访问了。

Let‘s Encrypt 方案

  1. 网站 -> 证书 -> Acme 账户 随便写一个注册一下
  2. 网站 -> 证书 -> DNS账户 配置一下,这里我使用的是 cloudflare的DNS验证

关于 Cloudfalre的配置 注意是API Tokens,而不是 API Keys!!!

cloudflare-config

cloudflare-api

这里配置完成之后就可以去回到网站先申请对应的证书了,然后再配置HTTPS即可。

至此,你应该就配置好最基础的一个网站服务了。

案例二:使用1panel完成NextJS搭建

下载配置代码

将代码下载到你的服务器上,你可以使用git clone 或者使用面板自带的上传功能,都是可以的。

如果是 nextjs,需要多配置一条 script

编辑 package.json,然后添加 "prod": "next build && next start"

1
2
3
4
5
6
7
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
"prod": "next build && next start"
},

创建nodejs环境 && 自动安装依赖启动docker

网站 -> 运行环境 -> node.js -> 创建允许环境

Snipaste_2024-05-02_23-30-50.png

填写配置文件

这里需要注意的几个点:

源码目录:就是你自己的代码在linux上的路径,可以用pwd看一下,或者直接点击可视化选择
启动命令:因为上面加了一条script的脚本npm run prod来执行build 和 start,所以这里他会自动读取你的script,然后你直接选择prod就可以了。
应用端口:你nextjs开设的端口,一般是3000或者5000
外部映射端口:就是容器外面监听的端口,如果你的one-api已经使用了3000,建议你使用3001来替代

1panel

配置域名和反代理

跟上述步骤一样,你去网站配置反向代理即可。

配置云备份

配置云服务商

选择 面板设置 -> 备份账号 -> 输入 阿里云OSS 或者其他厂商就可以配置云备份环境

支持列表:

  • 亚马逊 S3 云存储
  • 阿里云 OSS
  • 腾讯云 COS
  • 微软 OneDrive
  • 七牛云 Kodo
  • 又拍云 对象存储
  • MINIO
  • SFTP

面板配置

备份创建

定时备份数据库

计划任务 -> 创建计划任务 -> 备份到本地磁盘或者云服务商即可

1panel-定时任务

他选择的备份项目比较多:备份数据库、备份网站、系统快照等等都可以

还可以定时执行你自己的脚本

Snipaste_2024-05-03_00-25-42.png

结论对比:

成本

不同的云厂商和区域成本不一样,我这次实验买的是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的网站

当然这跟网站没啥流量也有关系(😭),后续再测试吧。

1panel-面板

对比自己搭建和PaaS的云服务

优势

  1. 快速建站和高效管理:深度集成各种应用例如(one-api、Umami、postgresql等),支持一键域名绑定、SSL证书配置等,同时提供应用管理、主机监控、文件管理等功能。
  2. 丰富的应用支持:支持多种常用服务器管理功能,并提供一键安装的应用商店
  3. 开源和现代化:专注于提供面板管理服务,为开发者提供了一个集中式的管理平台,方便管理多个应用程序。开源,能够快速迭代并广泛获取社区使用反馈。
  4. 线上调试方便:线上调试会更方便,直接可以链接服务器进行Debug。

劣势(对比其他在线PaaS):

  1. 需要一定的运维为基础: 需要了解基础的Linux知识,以及域名配置等知识。
  2. 缺少服务推送通知:如果程序挂了,可能不能第一时间推送通知(后续可以找找有没有解决方案)
  3. 服务范围限制:由于是单节点,如果突然请求量上来,不好做弹性扩容,可能会导致服务不稳定。

应用探索

1panel 还有很多应用,例如:

  • worldpress
  • halo
  • 禅道
  • Jenkins
  • MongoDB
  • OneDev
  • Umami
  • ClickHouse
  • Elasticsearch
  • Calibre-Web
  • Grafana
  • Obsidian LiveSync

1panel-应用

这些服务大家后续就自己去探索吧,或者有docker包的程序都可以非常方便的跑起来。

如果你搭配Jenkins也可以做到持续集成,这个我后续有时间再搭建一下。

以上就是一个业余开发尝试1panel搭建自己的PaaS服务。