自建应用分发平台 AppLink —— 一套优雅的替代方案

如果你维护过企业内部的应用分发,一定遇到过这样的场景:安卓 APK 用网盘分享,iOS IPA 靠邮件发送,Windows 安装包扔到 FTP,下载统计全靠猜。混乱、低效,毫无体验可言。

这个困扰了我很久的问题,终于有了一个完整的解决方案。

AppLink 是一套自建应用分发平台,支持 Android / iOS / Windows / macOS / Linux 全平台版本管理、扫码下载、下载统计和角色权限管理。我已经把它开源了。


为什么需要这个平台

在传统分发模式下,每个平台都是孤岛:

Android APK → 网盘链接 → 用户不知道有没有新版本
iOS IPA    → 邮件附件 → 版本管理全靠文件名
Windows EXE → FTP 下载 → 下载量全靠猜
macOS DMG  → 群里扔文件 → 别人下载了你也不知道

当应用超过 3 个、团队超过 5 个人时,这种模式彻底崩溃。

AppLink 把所有这些平台整合到一个统一的发布入口,只需要上传一次,各平台用户就能通过同一个地址找到最新版本。


核心功能

多平台版本管理

上传应用后,可以在后台为每个应用添加多个平台的版本 —— Android APK、iOS IPA、Windows EXE、macOS DMG、Linux AppImage,甚至 Web App。每个版本都可以独立控制启用/禁用、填写更新日志。

扫码下载

每个应用详情页自动生成二维码,手机扫一扫直接下载对应平台的安装包。对于内网分发的场景,这个体验极大地降低了使用门槛。

下载统计与分析

下载统计不再是盲区。平台自动记录每一次下载的来源平台,生成平台分布饼图和热门应用排行榜。你可以清楚地看到哪个平台下载量最大、哪个应用最受欢迎。

双角色权限管理

平台内置了两套角色:

  • 管理员 (admin) —— 全部权限,包括用户管理、系统设置
  • 发布者 (publisher) —— 只能管理自己创建的应用

第一个注册的用户自动成为管理员,后续注册需要管理员审批。开放注册可以在后台开关。

自定义品牌

你可以自定义站点名称和图标(支持 Emoji、文字、上传图片),让平台拥有自己的品牌标识,而不是千篇一律的默认界面。


技术栈

技术
框架 Next.js 16 (App Router)
认证 NextAuth v5 (Credentials + JWT)
数据库 SQLite (Prisma ORM) —— 开箱即用,无需额外数据库服务
样式 Tailwind CSS + shadcn/ui
容器化 Docker + Docker Compose —— 一键部署

零外部依赖数据库这一点对运维特别友好:SQLite + Docker 部署,不需要 MySQL/PostgreSQL 的搭建和维护,一个 docker-compose up -d 就完成了。


快速上手

本地开发

git clone https://github.com/sevpinna/AppLink.git
cd applink
npm install
cp .env.example .env
npx prisma db push
npm run dev

访问 http://localhost:3000,第一个注册的账号自动升级为管理员。

生产部署 —— 构建 Docker 镜像并导出

项目提供了 scripts/build.sh 来自动化镜像构建和导出流程:

# 构建镜像并导出为 .tar.gz 文件(版本号自动从 package.json 读取)
bash scripts/build.sh

# 或指定版本号
bash scripts/build.sh 1.0.0

这个脚本会依次完成三件事:

  1. 生成版本信息 —— 调用 scripts/version.cjs 将版本号和构建时间写入 public/version.json,在页面底部展示
  2. 安装依赖 —— 确保构建环境完整
  3. 构建 Docker 镜像并导出 —— 执行 docker build 构建生产镜像,随后用 docker save 压缩为 applink-版本号.tar.gz

导出后的镜像包可以直接上传到目标服务器:

# 上传到服务器
scp applink-0.1.16.tar.gz root@your-server:/opt/docker/applink/

# 服务器上加载镜像并启动
cd /opt/docker/applink
gunzip -c applink-0.1.16.tar.gz | docker load
docker compose up -d

默认的 docker-compose.yml 已经配置好了数据库和上传文件的持久化,但有两个配置项需要你根据部署环境修改:

变量 说明 生产环境要求
NEXTAUTH_SECRET JWT 签名密钥 替换为 openssl rand -base64 32 生成的强随机字符串
NEXTAUTH_URL 用户访问平台的地址 改为你实际的域名和协议,如 https://applink.yourdomain.com

⚠️ NEXTAUTH_URL 的协议必须和用户实际访问的协议一致。比如用户通过 https:// 访问,NEXTAUTH_URL 就应该是 https://...,否则 Secure cookie 在 HTTP 下无法发送,用户会一直跳转回登录页。

services:
  applink:
    image: applink:latest
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=file:/app/data/dev.db
      - NEXTAUTH_SECRET=${NEXTAUTH_SECRET:-your-secret}
      - NEXTAUTH_URL=http://127.0.0.1:3000   # 生产环境改为你的域名,如 https://yourdomain.com
    volumes:
      - ./docker/data:/app/data          # 数据库持久化
      - ./docker/uploads:/app/uploads    # 上传文件持久化
    restart: unless-stopped

适合谁用

  • 个人开发者 —— 分发自己的 Side Project,提供给测试用户下载
  • 创业团队 —— 内部测试包分发,不用再在群里发 APK 文件
  • 企业 IT 部门 —— 内部应用商店,统一管理公司内部的移动端和桌面端应用
  • 培训机构 —— 分发教学用应用安装包

开源

项目采用 MIT License 发布,你可以自由使用、修改和商用。

GitHub 地址:https://github.com/sevpinna/AppLink

如果你有什么功能需求或发现了 bug,欢迎提 Issue 或 PR。


写在最后

做这个项目的初衷很简单:需要一个好用的应用分发工具,但市面上的方案要么太贵,要么太重,要么已经停止维护了。与其将就,不如造一个自己用着舒服的轮子。

现在把它开源出来,希望能帮到有同样困扰的人。如果你觉得有用,点个 Star ⭐ 就是对我最大的鼓励。

上一篇 PhotoDemon图片编辑的瑞士军刀