0%

1. 上传文件到ECS服务器

你可以使用SCP或SFTPxx。配置好公钥后,文件上传到你的ECS服务器路径上。以SCP为例:

1
scp /path/to/yourfile.html username@server_public_ip:/path/to/server/directory
  • /path/to/yourfile.html 是你本地文件的路径。
  • username 是你在ECS服务器上的用户名。
  • server_public_ip 是你的ECS服务器的IP地址。
  • /path/to/server/directory 是你希望在ECS服务器上存放文件的路径。

安装和配置Web服务器

在ECS服务器上使用有sudo权限的用户进行操作,安装一个Web服务器,比如Nginx或Apache。这里我是基于CentOS的Nginx:

1
2
sudo yum install epel-release
sudo yum install nginx

启动Nginx并设置其开机自启动:

1
2
sudo systemctl start nginx
sudo systemctl enable nginx

浏览器输入你的服务器ip,如果安装成功会显示:

1
Welcome to HTTP Server Test Page!
阅读全文 »

最近小程序项目上传图片越来越大,用户上传动辄10几MB,全走自己服务器带宽扛不住,决定上七牛云CDN直传。记录下整个配置过程,包括自动续签SSL证书,以后换项目可以直接复用。

阅读全文 »

Qwen Code Web UI 部署记录 - AI生成

部署时间:2026-06-23 | 服务器:server_public_ip


环境信息

项目 值
服务器 阿里云 ECS(2C2G,CentOS/Alinux)
Node.js v22.23.0(通过 nvm 安装,不影响原 v16)
模型 qwen-plus(阿里云 DashScope)
工作目录 ~/ai-lab/

部署步骤

1. 配置 DashScope API Key

1
2
export OPENAI_API_KEY="******"
export OPENAI_BASE_URL="https://dashscope.aliyuncs.com/compatible-mode/v1"

Qwen Code 兼容 OpenAI SDK 格式,通过 OPENAI_API_KEY 和 OPENAI_BASE_URL 即可对接阿里云 DashScope。

2. 安装 Qwen Code

1
npm i -g @qwen-code/qwen-code

3. 启动 Web UI

1
2
3
4
5
6
7
8
9
TOKEN=$(cat ~/.qwen/server-token)

cd ~/ai-lab && nohup qwen serve \
--port 8080 \
--hostname 0.0.0.0 \
--token "$TOKEN" \
--enable-session-shell \
--allow-origin "*" \
> ~/.qwen/serve.log 2>&1 &

参数说明

参数 说明
--port 8080 服务端口
--hostname 0.0.0.0 允许外网访问(默认仅 localhost)
--token 访问认证 Token(文件 ~/.qwen/server-token 中)
--enable-session-shell 启用多会话 Shell 模式
--allow-origin "*" 允许跨域请求(必须加,否则浏览器端只能读不能发 POST,报 403)

访问方式

1
http://server_public_ip:8080/?token=qwen-********
  • 端口:8080
  • Token:qwen-********
  • 首次带 token 访问后浏览器会保存 cookie,后续直接访问 http://server_public_ip:8080 即可

常见问题

报 {"error":"Unauthorized"}

Token 未正确传递。确认 URL 中带查询参数 ?token=xxx,格式如下:

1
http://server_public_ip:8080/?token=qwen-********

注意:token 是查询参数,不是 URL 路径(/session/xxx 这种格式是错的)。

浏览器能打开但无法发消息(POST 403)

缺少 --allow-origin "*" 参数。非 localhost 绑定模式下,Qwen serve 默认开启 CORS 限制,只能读不能写。重启服务加上该参数即可。

管理命令

1
2
3
4
5
6
7
8
9
10
# 查看运行状态
ps aux | grep "qwen serve" | grep -v grep

# 查看日志
tail -f ~/.qwen/serve.log

# 停止服务
pkill -f "qwen serve"

# 重启服务(先 pkill,再重新执行启动命令)

资源占用

进程 RSS 内存 说明
qwen serve(主服务) ~176 MiB Node.js 主守护进程
qwen --acp(Agent) ~176 MiB AI 推理 Agent 进程
合计 ~350-400 MiB 单会话模式

⚠️ 服务器总内存 1.8 GiB,Qwen 服务占 ~20%,余量不多。同时只建议跑一个活跃会话。

问题背景

记录下在新服务器47.77.199.109遇到的系统版本较低无法安装高版本node的解决方案以及使用指令:

问题报错:

1
2
3
4
# 安装 Node.js 18 时报错
error: Failed dependencies:
libstdc++.so.6(GLIBCXX_3.4.20) is needed by nodejs-18.x
GLIBC_2.28 is needed by nodejs-18.x

这是由于旧服务器的 glibc 和相关依赖过低,导致无法支持高版本 Node.js。


思路解决

在不更换或升级操作系统的情况下,解决方法有两个:

  1. 手动编译升级依赖
    但升级 glibc 风险极高,可能导致系统不稳定,生产环境并不推荐。

  2. 使用 Docker ✅(推荐)
    借助 Docker 容器运行高版本 Node.js,避免宿主机依赖问题,同时保持环境隔离与灵活性。


安装 Docker

以 CentOS 为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 卸载旧版本
sudo yum remove docker docker-common docker-selinux docker-engine

# 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加 Docker 源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装 Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io

# 启动并设置开机启动
sudo systemctl start docker
sudo systemctl enable docker

安装完成后,执行以下命令检查:

阅读全文 »

基础代码

将{your-pixel-id}替换为实际的TikTok Pixel ID,将以下代码放在网页的<head></head>:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- TikTok Pixel Code -->
<script>
!function (w, d, t) {
w.TiktokAnalyticsObject=t;var ttq=w[t]=w[t]||[];
ttq.methods=["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie"];
ttq.setAndDefer=function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};
for(var i=0;i<ttq.methods.length;i++){ttq.setAndDefer(ttq,ttq.methods[i])}
ttq.instance=function(t){for(var e=ttq._i[t]||[],n=0;n<ttq.methods.length;n++)ttq.setAndDefer(e,ttq.methods[n]);return e};
ttq.load=function(e,n){var i="https://analytics.tiktok.com/i18n/pixel/events.js";
ttq._i=ttq._i||{};ttq._i[e]=[];ttq._i[e]._u=i;ttq._t=ttq._t||{};ttq._t[e]=+new Date;
ttq._o=ttq._o||{};ttq._o[e]=n||{};var o=document.createElement("script");
o.type="text/javascript";o.async=!0;o.src=i;var a=document.getElementsByTagName("script")[0];
a.parentNode.insertBefore(o,a)};

ttq.load('{your-pixel-id-goes-here}');
ttq.page(); // 页面浏览事件
}(window, document, 'ttq');
</script>
<!-- End TikTok Pixel Code -->
阅读全文 »

记录基于 Express 的用户注册与登录接口实现,使用了 bcrypt 进行密码加密,JWT(jsonwebtoken)进行登录状态的令牌管理,并结合环境变量安全存储密钥。


环境准备

  • Node.js
  • Express 框架
  • bcrypt:密码哈希加密
  • jsonwebtoken:JWT 令牌生成
  • Sequelize 模型定义
  • dotenv:管理环境变量(SECRET_KEY)

1. 环境变量配置

在项目根目录创建 .env 文件,写入如下内容:

1
SERVER_TOOLS_LOGIN_SECRET=jwt_secret_key(自定义密钥)

注意: 请使用足够复杂且随机的密钥,确保安全。

在项目入口文件(如 app.js 或 server.js)中添加:

1
require('dotenv').config();
阅读全文 »

模型定义

HostConfigs 表结构

字段名 类型 说明 允许空 默认值 备注
id BIGINT UNSIGNED 自增主键,TaskLogs索引ID 否 自增
host VARCHAR(100) 网站域名 否
template VARCHAR(100) 模板名 是
dirpath VARCHAR(100) 路径 是 NULL
config LONGTEXT 配置(TEXT LONG) 是 NULL
tasktag INT 任务类型 否 1 TASK_TAG
status INT 任务状态 否 1111 DEPLOY_STATUS
requestAt DATETIME 任务请求时间 是 NULL
finishedTimes DATETIME 最近更新 是 NULL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const DEPLOY_STATUS = {
SKIPPED: -9999, //初始化
PRIORITY: 0, //优先进行
PENDING: 1111, //排队
IN_PROGRESS: 8888, //执行中..
DONE: 9999, //执行成功
FAILED: -1, //执行失败
};

const DEPLOY_STATUS = {
PRIORITY: 0, //优先
PENDING: 1111, //排队
IN_PROGRESS: 8888, //执行中
DONE: 9999, //完成
FAILED: -1, //失败
};

索引:

  • 联合索引: host, dirpath
阅读全文 »

常用模板

序号 模板ID 首页广告位(ad0_) 详情页广告位(ad1_) 其他广告位(ad2_)
a16 16_slowforeign 3 3 1
a22 22_qdgamebox 3 2 2
a26 26_populargame 2 2 1
a28 28_clh5game_240628 3 2 2
a29 29_woaida_240705 4 2 2
a30 30_wotop2_240712 3 2 2
a31 31_wo4fang_240719 4 3 2
a32 32_j59xyz_241212 4 2 2
a33 33_hexblazea_241219 4 2 2
a38 38_conver_250306 4 2 1
a39 39_ufreegames_250310 4 2 1
a40 40_gbanana_250313 4 2 1
a41 41_morning_DL25311 4 2 1
a41 41_picture_DL25319 4 2 1
a41 41_journey_DL250320 4 2 1
a41 41_airport_DL25522 3 2 2
a41 41_library_DL250908 4 2 1
a41 41_message_DL250912 4 2 1
a42 42_TimeTools 2 0 0
a43 43_problem_250506 4 2 1
a44 44_meeting_250519 4 2 1
a45 45_holiday_250707 4 2 1
a46 46_digital_250710 4 2 1
a47 47_teacher_250716 4 2 1
a48 48_exercise_250723 4 2 1
a49 49_country_250725 4 2 1
a50 50_battery_250730 4 2 1
a51 51_clothes_250806 4 2 1
a52 52_diamond_250808 4 2 1
a53 53_element_250813 4 2 1
a54 54_family_250818 4 2 1
a55 55_garden_250822 4 2 1
a56 56_imagine_250827 4 2 1
a57 57_justice_250901 4 2 1
阅读全文 »