armbian通过node20-alpine和mariadb部署小程序数据库

部署环境

  • 系统:Armbian(ARM64)
  • 外网域名:https://wx.yxxx.top(域名可以不用备案)
  • 用途:小程序 → API → 数据库

用 Docker 只需要跑两个容器:

  1. MariaDB(数据库)
  2. NodeJS 后端接口(给小程序访问)

docker部署

在armbian中新建 /wxchat文件夹 mkdir -p wxchat

在wxchat中新建2个文件:

  • wxchat/index.js;代码如下:

    const express = require('express')
    const mysql = require('mysql2/promise')
    const app = express()

    app.use(express.json())

    // 数据库连接(Docker 内部直接用服务名 db)
    const pool = mysql.createPool({
    host: 'db',
    user: 'root',
    password: 'root123456',
    database: 'miniapp',
    waitForConnections: true,
    connectionLimit: 5
    })

    // 测试接口
    app.get('/api/hello', async (req, res) => {
    res.json({
    code: 0,
    msg: '连接成功',
    server: 'Armbian + Docker + 微信小程序'
    })
    })

    // 查询示例
    app.get('/api/user/list', async (req, res) => {
    try {
    const [rows] = await pool.query('SELECT * FROM user')
    res.json({ code: 0, data: rows })
    } catch (err) {
    res.json({ code: -1, msg: err.message })
    }
    })

    // 插入示例
    app.post('/api/user/add', async (req, res) => {
    try {
    const { name } = req.body
    const [result] = await pool.query(
    'INSERT INTO user (name) VALUES (?)',
    [name]
    )
    res.json({ code: 0, insertId: result.insertId })
    } catch (err) {
    res.json({ code: -1, msg: err.message })
    }
    })

    // 初始化表
    async function initTable() {
    await pool.query(`
    CREATE TABLE IF NOT EXISTS user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    created_at DATETIME DEFAULT NOW()
    )
    `)
    console.log('表初始化完成')
    }

    initTable()

    const PORT = 3000
    app.listen(PORT, () => {
    console.log(`API 服务启动:${PORT}`)
    })
  • wxchat/package.json;代码如下:

    {
    "dependencies": {
    "express": "^4.18.2",
    "mysql2": "^3.6.5"
    }
    }
  • /wxchat/docker-compose.yml新建文件;代码如下:

    # 给微信小程序使用的数据库文件

    version: '3.8'

    services:
    # 数据库
    db:
    container_name: wxchatdb
    image: mariadb:latest
    restart: always
    ports:
    - "3306:3306" # 给dbeaver本地管理数据库用
    environment:
    MYSQL_ROOT_PASSWORD: root123456
    MYSQL_DATABASE: miniapp # 创建一个基础数据库
    volumes:
    - ./mariadb:/var/lib/mysql
    networks:
    - app-net



    # https://docker.aityp.com/image/docker.io/node:20.14.0-alpine
    #小程序接口服务(端口 3000)
    # 镜像: node:18-alpine
    api:
    container_name: wxchatapi
    image: node:20.14.0-alpine
    restart: always
    working_dir: /app
    ports:
    - "3000:3000"
    volumes:
    - ./api:/app
    command: sh -c "npm install && node index.js"
    depends_on:
    - db
    networks:
    - app-net

    networks:
    app-net:
  • 拉取镜像:

    cd /wxchat
    docker compose up -d
  • 查看是否正常:

    docker compose logs -f api

    出现:

    API 服务已启动:3000 端口
    数据库初始化完成

    就成功了,这样数据库服务器就部署好了。

  • 最终接口地址:

    https://wx.yxxx.top/api/test
  • 打开上的地址如果出现:

    {"code":0,"msg":"连接成功:Armbian + Docker + 微信小程序"}

    说明接口能够成功访问。

新建小程序项目

  • 打开微信开发者工具,在创建小程序页面上:
  • 项目名称:随便取一个
  • 目录:找好存放的目录
  • AppID:在微信公众平台>首页>小程序信息>账号信息>AppID(小程序ID):xadf4adf6sdfgab4f98c9
  • 不使用云服务
  • 开发模式:小程序
  • 模板选择:不使用模板
  • 创建

修改小程序项目文件

主要修改6个文件: (替换文件里的全部内容)

  1. app.js;代码如下:

    App({
    globalData: {
    baseUrl: 'https://weito.top'
    }
    })
  2. app.json;代码如下:

    {
    "pages": [
    "pages/index/index"
    ],
    "window": {
    "navigationBarTitleText": "我的小程序"
    },
    "sitemapLocation": "sitemap.json"
    }
  3. sitemap.json;代码如下:

    {
    "desc": "关于本文件的更多信息,请参考文档",
    "rules": [{
    "action": "allow",
    "page": "*"
    }]
    }
  4. pages/index/index.js(主页面(核心));代码如下:

    const app = getApp()

    Page({
    data: {
    list: [],
    inputContent: ''
    },

    onLoad() {
    this.getData()
    },

    // 获取数据列表
    getData() {
    wx.request({
    url: app.globalData.baseUrl + '/api/data/list',
    success: res => {
    if (res.data.code === 0) {
    this.setData({
    list: res.data.data
    })
    }
    }
    })
    },

    // 输入框内容
    onInput(e) {
    this.setData({
    inputContent: e.detail.value
    })
    },

    // 提交数据
    submit() {
    const content = this.data.inputContent.trim()
    if (!content) return

    wx.request({
    url: app.globalData.baseUrl + '/api/data/add',
    method: 'POST',
    data: { content },
    success: res => {
    if (res.data.code === 0) {
    wx.showToast({ title: '提交成功' })
    this.setData({ inputContent: '' })
    this.getData()
    }
    }
    })
    }
    })
  5. pages/index/index.wxml;代码如下:

    <view class="container">
    <view class="title">数据列表</view>

    <view class="list">
    <view class="item" wx:for="{{list}}" wx:key="id">
    {{item.content}}
    </view>
    </view>

    <view class="input-box">
    <input placeholder="请输入内容" value="{{inputContent}}" bindinput="onInput" />
    <button bindtap="submit">提交</button>
    </view>
    </view>
  6. pages/index/index.wxss;代码如下:

    .container {
    padding: 20rpx;
    }
    .title {
    font-size: 36rpx;
    margin-bottom: 20rpx;
    }
    .item {
    padding: 20rpx;
    background: #f5f5f5;
    margin-bottom: 10rpx;
    border-radius: 8rpx;
    }
    .input-box {
    margin-top: 30rpx;
    display: flex;
    gap: 20rpx;
    }
    input {
    flex: 1;
    border: 1rpx solid #ddd;
    border-radius: 8rpx;
    padding: 0 20rpx;
    }
    button {
    padding: 0 30rpx;
    }

使用说明

  1. 在微信开发者工具新建小程序项目
  2. 把上面 4 个文件对应替换
  3. 去微信小程序后台把 https://wx.yxxx.top 加到 request 合法域名
  4. 编译运行

功能:

  • 页面加载自动从你家里 Armbian 数据库读取数据
  • 输入内容提交 → 写入家里数据库
  • 实时显示列表

dbeaver本地数据库管理工具

  • DBeaver 汉化:启动 DBeaver,点击菜单栏 Windows → Preferences(Windows);
    在左侧选择 User Interface(用户界面),找到 Language 选项。从下拉菜单中选择 简体中文
  • DBeaver 新建连接:打开 DBeaver,点击菜单 数据库 → 新建连接
    连接方式:主机
    服务器地址:192.168.1.1
    端口:3306