前端优化

arm-ffmpeg DockerFile
This commit is contained in:
jianzhichu
2025-11-26 01:18:14 +08:00
parent 5b41e5eaeb
commit 6bde9b75ff
6 changed files with 86 additions and 59 deletions
+5 -11
View File
@@ -1,24 +1,18 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal-arm64v8 AS base
# 使用 Ubuntu 20.04 的 .NET 6 运行时镜像
FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal AS base
WORKDIR /app
EXPOSE 10101
RUN echo "deb http://mirrors.aliyun.com/debian/ bookworm main non-free contrib" > /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian-security/ bookworm-security main" >> /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian/ bookworm-updates main non-free contrib" >> /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian/ bookworm-backports main non-free contrib" >> /etc/apt/sources.list && \
apt-get update && \
# 安装 ffmpeg (Ubuntu 的 universe 仓库包含 ffmpeg)
RUN apt-get update && \
apt-get install -y --no-install-recommends ffmpeg && \
rm -rf /var/lib/apt/lists/*
RUN ffmpeg -version
COPY . .
ENV ASPNETCORE_URLS=http://*:10101
ENV TZ=Asia/Shanghai
ENV DOWN_IMGVIDEO=1
ENTRYPOINT ["dotnet", "dy.net.dll"]
ENTRYPOINT ["dotnet", "dy.net.dll"]
@@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<Project>
<PropertyGroup>
<_PublishTargetUrl>E:\code\dysync\bin\Release\net6.0\publish\</_PublishTargetUrl>
<History>True|2025-11-25T06:08:53.3850967Z||;True|2025-11-24T23:53:54.4283003+08:00||;True|2025-11-24T23:41:15.8248332+08:00||;True|2025-11-24T23:33:57.1844427+08:00||;True|2025-11-24T23:31:54.9228836+08:00||;True|2025-11-24T23:24:15.8681502+08:00||;True|2025-11-24T23:22:57.9046229+08:00||;True|2025-11-24T23:18:04.1131647+08:00||;True|2025-11-24T22:47:54.1336448+08:00||;True|2025-11-24T22:47:18.3613833+08:00||;True|2025-11-24T08:17:50.3994607+08:00||;True|2025-11-24T08:07:00.9951205+08:00||;True|2025-11-23T23:34:50.0030826+08:00||;True|2025-11-23T23:32:36.7452616+08:00||;True|2025-11-22T23:18:56.3202345+08:00||;True|2025-11-22T22:52:51.7203302+08:00||;True|2025-11-22T22:52:42.9620946+08:00||;True|2025-11-22T22:52:09.8257640+08:00||;True|2025-11-22T22:39:31.5894141+08:00||;True|2025-11-22T22:31:11.0704815+08:00||;True|2025-11-22T22:20:36.4579131+08:00||;True|2025-11-22T22:19:10.2281364+08:00||;True|2025-11-22T19:34:45.9336901+08:00||;True|2025-11-12T23:06:38.7834109+08:00||;False|2025-11-12T23:01:02.2269478+08:00||;True|2025-10-22T22:08:11.6423148+08:00||;True|2025-10-22T21:54:24.7180547+08:00||;True|2025-10-22T21:40:03.5194315+08:00||;True|2025-10-22T21:28:28.8962766+08:00||;True|2025-10-22T21:22:47.9631689+08:00||;True|2025-10-22T21:18:24.5274318+08:00||;True|2025-10-22T21:14:51.6386326+08:00||;False|2025-10-22T21:14:07.6282769+08:00||;True|2025-10-22T21:03:48.9892860+08:00||;True|2025-10-22T21:00:56.3617243+08:00||;False|2025-10-22T21:00:30.5472941+08:00||;True|2025-10-22T20:51:29.6155916+08:00||;False|2025-10-22T20:50:47.1882956+08:00||;True|2025-10-22T15:01:04.1668366+08:00||;True|2025-10-22T14:49:43.6340569+08:00||;True|2025-10-22T14:38:39.4685603+08:00||;True|2025-10-21T18:35:28.8392541+08:00||;True|2025-10-20T10:31:05.5865212+08:00||;True|2025-10-20T10:20:41.5717101+08:00||;True|2025-10-19T10:08:33.6669332+08:00||;False|2025-10-19T10:07:22.3337545+08:00||;False|2025-10-19T10:05:22.9484805+08:00||;True|2025-10-10T16:54:27.1472888+08:00||;False|2025-10-10T16:53:44.1700030+08:00||;False|2025-10-10T16:52:48.1740453+08:00||;False|2025-10-10T16:51:21.5067253+08:00||;False|2025-10-10T16:50:19.2140597+08:00||;False|2025-10-10T16:49:21.2213290+08:00||;False|2025-10-10T16:48:47.7229948+08:00||;False|2025-10-10T16:48:15.1258700+08:00||;True|2025-09-30T13:29:42.2354235+08:00||;True|2025-09-25T11:44:52.6858389+08:00||;True|2025-09-25T11:08:27.8810109+08:00||;True|2025-09-25T09:28:50.2563374+08:00||;True|2025-09-24T16:14:02.3072184+08:00||;True|2025-09-23T22:38:52.4414757+08:00||;True|2025-09-23T22:19:07.1006356+08:00||;True|2025-09-23T22:18:01.5945225+08:00||;True|2025-09-23T22:06:15.6293613+08:00||;True|2025-09-23T21:53:14.2977444+08:00||;True|2025-09-23T21:46:55.2322411+08:00||;False|2025-09-23T21:45:23.7858854+08:00||;False|2025-09-23T21:03:51.8325689+08:00||;True|2025-09-23T10:03:32.2251920+08:00||;False|2025-09-23T09:38:08.2372201+08:00||;False|2025-09-23T09:37:49.9390545+08:00||;True|2024-03-11T21:31:45.8102398+08:00||;True|2024-03-11T07:26:24.7660541+08:00||;True|2024-03-08T22:08:40.0154831+08:00||;True|2024-03-03T10:14:36.8109114+08:00||;True|2024-03-02T18:44:57.3288537+08:00||;True|2024-01-24T17:51:37.9164415+08:00||;True|2024-01-24T16:36:50.5612157+08:00||;True|2024-01-24T15:51:35.7556653+08:00||;True|2024-01-17T23:40:40.7526618+08:00||;True|2024-01-17T23:36:10.3692844+08:00||;True|2024-01-17T23:22:03.2378834+08:00||;True|2024-01-03T11:35:44.7118292+08:00||;True|2024-01-03T11:11:23.4270453+08:00||;True|2024-01-03T11:04:35.2081526+08:00||;True|2024-01-03T10:57:03.7053107+08:00||;True|2024-01-03T10:51:50.7463989+08:00||;False|2024-01-03T10:50:24.9775312+08:00||;True|2024-01-03T10:47:30.1128183+08:00||;True|2024-01-03T10:42:55.8640657+08:00||;True|2024-01-03T09:24:24.3436056+08:00||;True|2024-01-02T23:40:38.2001198+08:00||;True|2024-01-02T23:08:36.7230444+08:00||;True|2024-01-02T22:53:43.9658255+08:00||;True|2024-01-02T22:25:38.5545279+08:00||;False|2024-01-02T22:24:42.6577609+08:00||;True|2024-01-02T22:04:33.4708889+08:00||;True|2024-01-02T21:49:57.9249898+08:00||;True|2023-12-28T22:42:58.5976180+08:00||;True|2023-12-28T22:24:09.2051205+08:00||;</History>
<History>True|2025-11-25T16:00:42.1507258Z||;True|2025-11-26T00:00:17.0107229+08:00||;True|2025-11-25T23:42:07.4349629+08:00||;False|2025-11-25T23:41:56.9328658+08:00||;True|2025-11-25T23:19:32.5262917+08:00||;True|2025-11-25T14:08:53.3850967+08:00||;True|2025-11-24T23:53:54.4283003+08:00||;True|2025-11-24T23:41:15.8248332+08:00||;True|2025-11-24T23:33:57.1844427+08:00||;True|2025-11-24T23:31:54.9228836+08:00||;True|2025-11-24T23:24:15.8681502+08:00||;True|2025-11-24T23:22:57.9046229+08:00||;True|2025-11-24T23:18:04.1131647+08:00||;True|2025-11-24T22:47:54.1336448+08:00||;True|2025-11-24T22:47:18.3613833+08:00||;True|2025-11-24T08:17:50.3994607+08:00||;True|2025-11-24T08:07:00.9951205+08:00||;True|2025-11-23T23:34:50.0030826+08:00||;True|2025-11-23T23:32:36.7452616+08:00||;True|2025-11-22T23:18:56.3202345+08:00||;True|2025-11-22T22:52:51.7203302+08:00||;True|2025-11-22T22:52:42.9620946+08:00||;True|2025-11-22T22:52:09.8257640+08:00||;True|2025-11-22T22:39:31.5894141+08:00||;True|2025-11-22T22:31:11.0704815+08:00||;True|2025-11-22T22:20:36.4579131+08:00||;True|2025-11-22T22:19:10.2281364+08:00||;True|2025-11-22T19:34:45.9336901+08:00||;True|2025-11-12T23:06:38.7834109+08:00||;False|2025-11-12T23:01:02.2269478+08:00||;True|2025-10-22T22:08:11.6423148+08:00||;True|2025-10-22T21:54:24.7180547+08:00||;True|2025-10-22T21:40:03.5194315+08:00||;True|2025-10-22T21:28:28.8962766+08:00||;True|2025-10-22T21:22:47.9631689+08:00||;True|2025-10-22T21:18:24.5274318+08:00||;True|2025-10-22T21:14:51.6386326+08:00||;False|2025-10-22T21:14:07.6282769+08:00||;True|2025-10-22T21:03:48.9892860+08:00||;True|2025-10-22T21:00:56.3617243+08:00||;False|2025-10-22T21:00:30.5472941+08:00||;True|2025-10-22T20:51:29.6155916+08:00||;False|2025-10-22T20:50:47.1882956+08:00||;True|2025-10-22T15:01:04.1668366+08:00||;True|2025-10-22T14:49:43.6340569+08:00||;True|2025-10-22T14:38:39.4685603+08:00||;True|2025-10-21T18:35:28.8392541+08:00||;True|2025-10-20T10:31:05.5865212+08:00||;True|2025-10-20T10:20:41.5717101+08:00||;True|2025-10-19T10:08:33.6669332+08:00||;False|2025-10-19T10:07:22.3337545+08:00||;False|2025-10-19T10:05:22.9484805+08:00||;True|2025-10-10T16:54:27.1472888+08:00||;False|2025-10-10T16:53:44.1700030+08:00||;False|2025-10-10T16:52:48.1740453+08:00||;False|2025-10-10T16:51:21.5067253+08:00||;False|2025-10-10T16:50:19.2140597+08:00||;False|2025-10-10T16:49:21.2213290+08:00||;False|2025-10-10T16:48:47.7229948+08:00||;False|2025-10-10T16:48:15.1258700+08:00||;True|2025-09-30T13:29:42.2354235+08:00||;True|2025-09-25T11:44:52.6858389+08:00||;True|2025-09-25T11:08:27.8810109+08:00||;True|2025-09-25T09:28:50.2563374+08:00||;True|2025-09-24T16:14:02.3072184+08:00||;True|2025-09-23T22:38:52.4414757+08:00||;True|2025-09-23T22:19:07.1006356+08:00||;True|2025-09-23T22:18:01.5945225+08:00||;True|2025-09-23T22:06:15.6293613+08:00||;True|2025-09-23T21:53:14.2977444+08:00||;True|2025-09-23T21:46:55.2322411+08:00||;False|2025-09-23T21:45:23.7858854+08:00||;False|2025-09-23T21:03:51.8325689+08:00||;True|2025-09-23T10:03:32.2251920+08:00||;False|2025-09-23T09:38:08.2372201+08:00||;False|2025-09-23T09:37:49.9390545+08:00||;True|2024-03-11T21:31:45.8102398+08:00||;True|2024-03-11T07:26:24.7660541+08:00||;True|2024-03-08T22:08:40.0154831+08:00||;True|2024-03-03T10:14:36.8109114+08:00||;True|2024-03-02T18:44:57.3288537+08:00||;True|2024-01-24T17:51:37.9164415+08:00||;True|2024-01-24T16:36:50.5612157+08:00||;True|2024-01-24T15:51:35.7556653+08:00||;True|2024-01-17T23:40:40.7526618+08:00||;True|2024-01-17T23:36:10.3692844+08:00||;True|2024-01-17T23:22:03.2378834+08:00||;True|2024-01-03T11:35:44.7118292+08:00||;True|2024-01-03T11:11:23.4270453+08:00||;True|2024-01-03T11:04:35.2081526+08:00||;True|2024-01-03T10:57:03.7053107+08:00||;True|2024-01-03T10:51:50.7463989+08:00||;False|2024-01-03T10:50:24.9775312+08:00||;True|2024-01-03T10:47:30.1128183+08:00||;True|2024-01-03T10:42:55.8640657+08:00||;True|2024-01-03T09:24:24.3436056+08:00||;True|2024-01-02T23:40:38.2001198+08:00||;True|2024-01-02T23:08:36.7230444+08:00||;True|2024-01-02T22:53:43.9658255+08:00||;True|2024-01-02T22:25:38.5545279+08:00||;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>
+25 -27
View File
@@ -66,21 +66,19 @@ Cookie 及 `sec_user_id` 是同步功能的核心,需严格按步骤获取,
---
## 🚀 4. 运行方式(推荐 Docker Compose,更易维护
## 🚀 4. 运行方式(推荐 Docker Compose
# Dysync.net Docker 镜像版本说明
本文档详细描述了 `jianzhichu/dysync.net` Docker 镜像的各个版本、其功能特性、适用架构以及镜像大小。
## 镜像版本总览
## 镜像版本
| 镜像标签 | 架构 | 功能描述 | 镜像大小 | 适用场景 |
|-----------------------------------|----------------|--------------------------------------------------------------------------|-----------|------------------------------|
| `jianzhichu/dysync.net:latest` | x86_64 (amd64) | **标准版**<br>- 包含核心功能<br>- **不含 FFmpeg**<br>- 不能下载图文视频 | ~200M | 仅需基础功能,追求轻量部署 |
| `jianzhichu/dysync.net:full_latest` | x86_64 (amd64) | **完整版**<br>- 包含全部核心功能<br>- **内置 FFmpeg**<br>- 支持图文视频下载与合成 | ~700M | 需要完整媒体处理能力的场景 |
| `jianzhichu/dysync.net:arm_latest` | ARM64 | **ARM 标准版**<br>- 核心功能(与 `latest` 一致)<br>- **适配 ARM 架构** | ~200M | ARM 设备(如树莓派)的轻量部署 |
| `jianzhichu/dysync.net:full_arm_latest` | ARM64 | **ARM 完整版**<br>- 完整功能(与 `full_latest` 一致)<br>- **适配 ARM 架构** | ~700M | ARM 设备的完整功能部署 |
| `jianzhichu/dysync.net:full_arm_latest` | ARM64 | **ARM 完整版**<br>- 完整功能(与 `full_latest` 一致)<br>- **适配 ARM 架构** | ~500M | ARM 设备的完整功能部署 |
| `jianzhichu/dysync.net:beta_1.0` | x86_64 (amd64) | **测试版 v1.0**<br>- 包含最新开发特性<br>- 功能可能不稳定<br>- 不含 FFmpeg | ~200M | 开发测试、尝鲜新功能 |
## 构建命令示例
@@ -93,43 +91,43 @@ Cookie 及 `sec_user_id` 是同步功能的核心,需严格按步骤获取,
将下方命令中的「本地路径」替换为你的实际路径,终端执行即可:
```bash
### Arm设备请使用 registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:arm_1.0 版本镜像
### 方式一:Docker 命令行
docker run -d --restart=always \
-v /你的/本地/收藏视频路径:/app/collect \
-v /你的/本地/喜欢视频路径:/app/favorite \
-v /你的/本地/数据库路径:/app/db \
-v /你的/本地/博主视频路径:/app/uper \
-p 10101:10101 \
--name dysync2025 \
registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net
-v /opt/dysync/coll:/app/collect \
-v /opt/dysync/favorite \
-v /opt/dysync/db:/app/db \
-v /opt/dysync/imgs:/app/images \
-v /opt/dysync/uper:/app/uper \
-p 10103:10101 \
--name dysync_arm_full \
registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
# 注意:-p 后面的容器端口必须为 10101(源码固定)
### 方式二:Docker Compose 运行(推荐)
### Arm设备请使用 registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:arm_1.0 版本镜像
创建 docker-compose.yml 文件,复制以下内容,替换「本地路径」后执行 docker-compose up -d
version: '3.8'
services:
dysync:
image: registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net
container_name: dysync2025
restart: always
image: registry.cn-hangzhou.aliyuncs.com/jianzhichu/dysync.net:latest
container_name: dysync_arm_full # 容器名称
restart: always # 总是重启
ports:
- "10101:10101"
- "10101:10101" # 端口映射
volumes:
- /volume1/docker/dysync/db:/app/db
- /volume2/mediay/dysync:/app/collect
- /volume2/mediay/dysync_fav:/app/favorite
- /volume2/mediay/dysync_up:/app/uper
- /opt/dysync/db:/app/db # 数据库目录
- /opt/dysync/coll:/app/collect # 收集目录
- /opt/dysync/favorite:/app/favorite # 收藏目录(补充了容器内路径)
- /opt/dysync/imgs:/app/images # 图片目录
- /opt/dysync/uper:/app/uper # 上传目录
# 下面是多账号路径映射示例(可选)
- /volume2/mediay/dysync2:/app/yeyeye
- /volume2/mediay/dysync2_fav:/app/yeyeye_fav
- /volume2/mediay/dysync2_up:/app/yeyeye_up
# 配置DNS服务器(解决域名解析失败导致的无法访问外网)
- /opt/dysync/coll2:/app/collect # 收集目录
- /opt/dysync/favorite2:/app/favorite # 收藏目录(补充了容器内路径)
- /opt/dysync/imgs2:/app/images # 图片目录
- /opt/dysync/uper2:/app/uper # 上传目录
# 配置DNS服务器(可选)
network_mode: bridge
dns:
- 8.8.8.8 # Google DNS
+1
View File
@@ -148,6 +148,7 @@ function submit() {
loading.value = false;
if (res.code === 0) {
showModal.value = false;
message.success('修改成功,同步任务将在5-10秒按新配置运行...');
reset();
GetRecords();
}
+2 -2
View File
@@ -190,7 +190,7 @@ const onSubmit = () => {
.apiUpdateConfig(toRaw(formState))
.then((res) => {
if (res.code === 0) {
message.success('配置修改生效,同步任务将按照新的规则执行');
message.success('修改成功,同步任务将在5-10秒按新配置运行...');
componentDisabled.value = true;
} else {
message.error(res.erro || '更新配置失败', 8);
@@ -198,7 +198,7 @@ const onSubmit = () => {
})
.catch((error) => {
console.error('更新配置失败:', error);
message.error('更新配置失败,请稍后重试', 8);
message.error('修改失败,请稍后重试', 8);
});
})
.catch((error) => {
+52 -18
View File
@@ -19,7 +19,14 @@
<a-form-item :wrapper-col="{ offset: 8, span: 16 }">
<a-space>
<a-button type="primary" @click="GetRecords">查询</a-button>
<a-button type="danger" @click="StartNow">立即同步</a-button>
<!-- 核心修改点绑定 disabled 属性 -->
<a-button type="danger" @click="StartNow" :disabled="isSyncing">
<!-- 可选添加加载状态提示 -->
<template #icon>
<a-spin v-if="isSyncing" size="small" />
</template>
立即同步
</a-button>
</a-space>
</a-form-item>
</a-form>
@@ -27,6 +34,7 @@
</a-table>
</div>
</template>
<script lang="ts" setup>
import { defineComponent, reactive, ref } from 'vue';
import { useApiStore } from '@/store';
@@ -34,50 +42,45 @@ import type { UnwrapRef } from 'vue';
import { onMounted } from 'vue';
import dayjs, { Dayjs } from 'dayjs';
import locale from 'ant-design-vue/es/date-picker/locale/zh_CN';
import { message, Spin } from 'ant-design-vue'; // 引入 Spin 用于显示加载图标
type RangeValue = [Dayjs, Dayjs];
import 'dayjs/locale/zh-cn';
dayjs.locale('zh-cn');
// ... (columns, loading, DataItem, datas, showImageViedo, QuaryParam, value1, ranges, quaryData 的定义保持不变)
const columns = ref([
{
title: '同步时间',
dataIndex: 'syncTimeStr',
// sorter: true,
align: 'center',
width: 180,
},
{
title: '同步类型',
dataIndex: 'viedoTypeStr',
// sorter: true,
align: 'center',
width: 100,
},
{
title: '博主',
dataIndex: 'author',
// sorter: true,
align: 'center',
width: 150,
},
{
title: '视频类型',
dataIndex: 'viedoCate',
// sorter: true,
width: 300,
align: 'center',
},
{
title: '视频标题',
dataIndex: 'videoTitle',
// sorter: true,
align: 'left',
},
{
title: 'Cookie',
title: 'CK名称',
dataIndex: 'dyUser',
// sorter: true,
align: 'center',
width: 200,
},
@@ -108,6 +111,7 @@ const quaryData: UnwrapRef<QuaryParam> = reactive({
tag: '',
viedoType: '*',
});
const GetRecords = () => {
loading.value = true;
quaryData.pageIndex = pagination.value.current;
@@ -125,9 +129,12 @@ const GetRecords = () => {
}
});
};
onMounted(() => {
GetRecords();
getConfig(); // 在 onMounted 中调用 getConfig
});
const pagination = ref({
current: 1,
defaultPageSize: 10,
@@ -140,9 +147,9 @@ const getConfig = () => {
.apiGetConfig()
.then((res) => {
if (res.code === 0) {
// 监听环境变量配置,控制是否显示图片视频下载选项
showImageViedo.value = res.data.downImageVideoFromEnv;
} else {
// 可以在这里添加配置获取失败的处理
}
})
.catch((error) => {
@@ -151,31 +158,58 @@ const getConfig = () => {
};
const handleTableChange = (e) => {
console.log(e);
pagination.value.current = e.current;
pagination.value.defaultPageSize = e.defaultPageSize;
pagination.value.total = e.total;
pagination.value.showTotal = () => `${e.total}`;
// 通常 total 是由后端返回的,这里不需要手动设置
GetRecords();
};
// 核心修改点:添加一个 ref 来控制按钮状态
const isSyncing = ref(false);
const StartNow = () => {
// 如果正在同步中,则直接返回,防止重复点击
if (isSyncing.value) {
return;
}
message.success('请耐心等待,同步任务正在启动...');
isSyncing.value = true; // 开始同步,禁用按钮
useApiStore()
.StartJobNow()
.then((res) => {});
.then((res) => {
// 根据后端返回的状态码判断是否真正成功
if (res.code === 0) {
message.success('同步任务启动成功!');
} else {
message.error(`同步任务启动失败: ${res.message || '未知错误'}`);
}
})
.catch((error) => {
console.error('同步任务API调用失败:', error);
message.error('同步任务启动失败,请检查网络或联系管理员。');
})
.finally(() => {
isSyncing.value = false; // 无论成功失败,都恢复按钮状态
});
};
const datePicked = (ref, dateArry) => {
// 注意:dateArry 是 Dayjs 对象数组,如果后端需要字符串,需要格式化
// quaryData.dates = dateArry.map(date => date.format('YYYY-MM-DD'));
quaryData.dates = dateArry;
console.log(dateArry);
};
const dataSource = ref(datas);
const onViedoTypeChanged = (e) => {
// console.log(e.target.value);
quaryData.viedoType = e.target.value;
pagination.value.current = 1;
pagination.value.current = 1; // 切换类型后,重置页码到第一页
GetRecords();
};
</script>
<style scoped>
</style>
</style>