feat: update opencut
This commit is contained in:
@@ -1,12 +1,65 @@
|
|||||||
# FreeSound API 配置
|
# ============================================================================
|
||||||
FREESOUND_CLIENT_ID=your_freesound_client_id
|
# OpenCut Configuration
|
||||||
FREESOUND_API_KEY=your_freesound_api_key
|
# ============================================================================
|
||||||
|
|
||||||
# Cloudflare R2 配置(可选,用于转录功能)
|
# Timezone (optional, default: UTC)
|
||||||
CLOUDFLARE_ACCOUNT_ID=your_cloudflare_account_id
|
TZ=UTC
|
||||||
R2_ACCESS_KEY_ID=your_r2_access_key_id
|
|
||||||
R2_SECRET_ACCESS_KEY=your_r2_secret_access_key
|
|
||||||
R2_BUCKET_NAME=your_r2_bucket_name
|
|
||||||
|
|
||||||
# Modal 转录服务 URL(可选)
|
# ----------------------------------------------------------------------------
|
||||||
MODAL_TRANSCRIPTION_URL=your_modal_transcription_url
|
# Version Configuration
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
POSTGRES_VERSION=17
|
||||||
|
REDIS_VERSION=7-alpine
|
||||||
|
SERVERLESS_REDIS_HTTP_VERSION=latest
|
||||||
|
# Note: OpenCut web image needs to be built from source
|
||||||
|
# See: https://github.com/OpenCut-app/OpenCut
|
||||||
|
OPENCUT_WEB_IMAGE=opencut/web:latest
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Port Override Configuration
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# PostgreSQL port (default: 5432)
|
||||||
|
POSTGRES_PORT_OVERRIDE=5432
|
||||||
|
# Redis port (default: 6379)
|
||||||
|
REDIS_PORT_OVERRIDE=6379
|
||||||
|
# Serverless Redis HTTP port (default: 8079)
|
||||||
|
SERVERLESS_REDIS_HTTP_PORT_OVERRIDE=8079
|
||||||
|
# OpenCut web port (default: 3100)
|
||||||
|
OPENCUT_WEB_PORT_OVERRIDE=3100
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# PostgreSQL Configuration
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
POSTGRES_USER=opencut
|
||||||
|
POSTGRES_PASSWORD=change-me-to-secure-password
|
||||||
|
POSTGRES_DB=opencut
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Redis Configuration
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Token for serverless Redis HTTP interface
|
||||||
|
SERVERLESS_REDIS_HTTP_TOKEN=change-me-to-random-token
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# OpenCut Application Configuration
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Better Auth configuration
|
||||||
|
OPENCUT_BETTER_AUTH_URL=http://localhost:3100
|
||||||
|
OPENCUT_BETTER_AUTH_SECRET=change-me-to-random-secret-key
|
||||||
|
|
||||||
|
# FreeSound API configuration (required)
|
||||||
|
OPENCUT_FREESOUND_CLIENT_ID=your_freesound_client_id
|
||||||
|
OPENCUT_FREESOUND_API_KEY=your_freesound_api_key
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Optional: Transcription Features
|
||||||
|
# Leave blank to disable auto-captioning
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Cloudflare R2 configuration
|
||||||
|
OPENCUT_CLOUDFLARE_ACCOUNT_ID=
|
||||||
|
OPENCUT_R2_ACCESS_KEY_ID=
|
||||||
|
OPENCUT_R2_SECRET_ACCESS_KEY=
|
||||||
|
OPENCUT_R2_BUCKET_NAME=
|
||||||
|
|
||||||
|
# Modal transcription service URL
|
||||||
|
OPENCUT_MODAL_TRANSCRIPTION_URL=
|
||||||
|
|||||||
Binary file not shown.
@@ -4,66 +4,144 @@
|
|||||||
|
|
||||||
OpenCut 是一个开源的视频编辑和音频处理平台。
|
OpenCut 是一个开源的视频编辑和音频处理平台。
|
||||||
|
|
||||||
## 先决条件
|
## 前置条件
|
||||||
|
|
||||||
|
在部署 OpenCut 之前,您需要:
|
||||||
|
|
||||||
1. 访问 [FreeSound.org](https://freesound.org/) 并创建账户
|
1. 访问 [FreeSound.org](https://freesound.org/) 并创建账户
|
||||||
2. 在账户设置中创建 API 应用
|
2. 在账户设置中创建 API 应用程序以获取您的客户端 ID 和 API 密钥
|
||||||
3. 获取客户端 ID 和 API 密钥
|
3. **从源代码构建 OpenCut web 镜像**(参见 [OpenCut GitHub](https://github.com/OpenCut-app/OpenCut))
|
||||||
|
|
||||||
## 初始化
|
## 快速开始
|
||||||
|
|
||||||
1. 复制示例环境文件:
|
1. 复制示例环境变量文件:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cp .env.example .env
|
cp .env.example .env
|
||||||
```
|
```
|
||||||
|
|
||||||
2. 配置必要的环境变量(特别是 FreeSound API 配置)
|
2. **必需配置** - 编辑 `.env` 并设置以下必需变量:
|
||||||
|
- `POSTGRES_PASSWORD`:数据库密码(请修改默认值!)
|
||||||
|
- `SERVERLESS_REDIS_HTTP_TOKEN`:Redis HTTP 接口的随机令牌
|
||||||
|
- `OPENCUT_BETTER_AUTH_SECRET`:身份验证的随机密钥
|
||||||
|
- `OPENCUT_FREESOUND_CLIENT_ID`:您的 FreeSound 客户端 ID
|
||||||
|
- `OPENCUT_FREESOUND_API_KEY`:您的 FreeSound API 密钥
|
||||||
|
|
||||||
3. 启动服务:
|
3. **可选配置** - 如需转录功能,请设置:
|
||||||
|
- `OPENCUT_CLOUDFLARE_ACCOUNT_ID`
|
||||||
|
- `OPENCUT_R2_ACCESS_KEY_ID`
|
||||||
|
- `OPENCUT_R2_SECRET_ACCESS_KEY`
|
||||||
|
- `OPENCUT_R2_BUCKET_NAME`
|
||||||
|
- `OPENCUT_MODAL_TRANSCRIPTION_URL`
|
||||||
|
|
||||||
|
4. 启动服务:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
4. 访问 Web 界面:<http://localhost:3100>
|
5. 访问 Web 界面:<http://localhost:3100>
|
||||||
|
|
||||||
## 服务
|
## 服务
|
||||||
|
|
||||||
- `opencut`: OpenCut Web 应用。
|
- `web`:OpenCut Web 应用程序
|
||||||
- `postgres`: PostgreSQL 数据库。
|
- `db`:PostgreSQL 数据库
|
||||||
- `redis`: Redis 缓存。
|
- `redis`:Redis 缓存
|
||||||
|
- `serverless-redis-http`:用于 Upstash 兼容性的 Redis HTTP 接口
|
||||||
|
|
||||||
## 配置
|
## 配置
|
||||||
|
|
||||||
- **Web 应用**: 端口 3100
|
### 版本配置
|
||||||
- **PostgreSQL 数据库**: 端口 5432
|
|
||||||
- **Redis 缓存**: 端口 6379
|
|
||||||
- **Redis HTTP 服务**: 端口 8079
|
|
||||||
|
|
||||||
| 变量 | 描述 | 必需 |
|
- `POSTGRES_VERSION`:PostgreSQL 版本,默认为 `17`
|
||||||
| ------------------------- | ------------------- | ---- |
|
- `REDIS_VERSION`:Redis 版本,默认为 `7-alpine`
|
||||||
| `FREESOUND_CLIENT_ID` | FreeSound 客户端 ID | 是 |
|
- `SERVERLESS_REDIS_HTTP_VERSION`:Serverless Redis HTTP 版本,默认为 `latest`
|
||||||
| `FREESOUND_API_KEY` | FreeSound API 密钥 | 是 |
|
- `OPENCUT_WEB_IMAGE`:OpenCut web 镜像名称,默认为 `opencut/web:latest`
|
||||||
| `CLOUDFLARE_ACCOUNT_ID` | Cloudflare 账户 ID | 否* |
|
|
||||||
| `R2_ACCESS_KEY_ID` | R2 访问密钥 ID | 否* |
|
|
||||||
| `R2_SECRET_ACCESS_KEY` | R2 密钥 | 否* |
|
|
||||||
| `R2_BUCKET_NAME` | R2 存储桶名称 | 否* |
|
|
||||||
| `MODAL_TRANSCRIPTION_URL` | Modal 转录服务 URL | 否* |
|
|
||||||
|
|
||||||
*用于转录功能,如果不需要自动字幕功能可以留空。
|
### 端口配置
|
||||||
|
|
||||||
## 数据持久化
|
- `POSTGRES_PORT_OVERRIDE`:PostgreSQL 主机端口,默认为 `5432`
|
||||||
|
- `REDIS_PORT_OVERRIDE`:Redis 主机端口,默认为 `6379`
|
||||||
|
- `SERVERLESS_REDIS_HTTP_PORT_OVERRIDE`:Redis HTTP 接口主机端口,默认为 `8079`
|
||||||
|
- `OPENCUT_WEB_PORT_OVERRIDE`:Web 应用程序主机端口,默认为 `3100`
|
||||||
|
|
||||||
- PostgreSQL 数据存储在 `postgres_data` 卷中
|
### 数据库配置
|
||||||
- Redis 数据在内存中,重启后会丢失
|
|
||||||
|
|
||||||
## 安全说明
|
- `POSTGRES_USER`:数据库用户名,默认为 `opencut`
|
||||||
|
- `POSTGRES_PASSWORD`:数据库密码,**必需**
|
||||||
|
- `POSTGRES_DB`:数据库名称,默认为 `opencut`
|
||||||
|
|
||||||
- 在生产环境中更改默认的数据库密码
|
### Redis 配置
|
||||||
- 更新 `BETTER_AUTH_SECRET` 为一个安全的随机字符串
|
|
||||||
- 考虑为外部访问设置反向代理
|
- `SERVERLESS_REDIS_HTTP_TOKEN`:Redis HTTP 接口的令牌,**必需**
|
||||||
|
|
||||||
|
### 应用程序配置
|
||||||
|
|
||||||
|
- `TZ`:时区,默认为 `UTC`
|
||||||
|
- `OPENCUT_BETTER_AUTH_URL`:身份验证服务 URL,默认为 `http://localhost:3100`
|
||||||
|
- `OPENCUT_BETTER_AUTH_SECRET`:身份验证密钥,**必需**
|
||||||
|
- `OPENCUT_FREESOUND_CLIENT_ID`:FreeSound 客户端 ID,**必需**
|
||||||
|
- `OPENCUT_FREESOUND_API_KEY`:FreeSound API 密钥,**必需**
|
||||||
|
|
||||||
|
### 可选转录配置
|
||||||
|
|
||||||
|
留空以禁用自动字幕功能:
|
||||||
|
|
||||||
|
- `OPENCUT_CLOUDFLARE_ACCOUNT_ID`:Cloudflare 账户 ID
|
||||||
|
- `OPENCUT_R2_ACCESS_KEY_ID`:R2 访问密钥 ID
|
||||||
|
- `OPENCUT_R2_SECRET_ACCESS_KEY`:R2 秘密访问密钥
|
||||||
|
- `OPENCUT_R2_BUCKET_NAME`:R2 存储桶名称
|
||||||
|
- `OPENCUT_MODAL_TRANSCRIPTION_URL`:Modal 转录服务 URL
|
||||||
|
|
||||||
|
## 数据卷
|
||||||
|
|
||||||
|
- `postgres_data`:PostgreSQL 数据存储
|
||||||
|
|
||||||
|
## 资源限制
|
||||||
|
|
||||||
|
| 服务 | CPU 限制 | 内存限制 | CPU 预留 | 内存预留 |
|
||||||
|
| --------------------- | -------- | -------- | -------- | -------- |
|
||||||
|
| web | 2.00 | 2G | 0.50 | 512M |
|
||||||
|
| db | 2.00 | 1G | 0.50 | 256M |
|
||||||
|
| redis | 1.00 | 512M | 0.25 | 128M |
|
||||||
|
| serverless-redis-http | 1.00 | 256M | 0.25 | 64M |
|
||||||
|
|
||||||
|
## 安全提示
|
||||||
|
|
||||||
|
⚠️ **重要安全建议:**
|
||||||
|
|
||||||
|
- **在生产环境部署前修改所有默认密码和密钥**
|
||||||
|
- 为以下变量使用强随机生成的值:
|
||||||
|
- `POSTGRES_PASSWORD`
|
||||||
|
- `SERVERLESS_REDIS_HTTP_TOKEN`
|
||||||
|
- `OPENCUT_BETTER_AUTH_SECRET`
|
||||||
|
- 切勿将包含真实凭据的 `.env` 文件提交到版本控制系统
|
||||||
|
- 考虑设置带 HTTPS 的反向代理以供外部访问
|
||||||
|
- 在生产环境中将数据库和 Redis 端口限制在内部网络
|
||||||
|
- 妥善保管 FreeSound API 密钥
|
||||||
|
|
||||||
|
## 从源代码构建
|
||||||
|
|
||||||
|
由于 OpenCut 不提供预构建的 Docker 镜像,您需要自行构建:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 克隆 OpenCut 仓库
|
||||||
|
git clone https://github.com/OpenCut-app/OpenCut.git
|
||||||
|
cd OpenCut
|
||||||
|
|
||||||
|
# 构建 web 镜像
|
||||||
|
docker build -t opencut/web:latest -f apps/web/Dockerfile .
|
||||||
|
|
||||||
|
# 返回到您的 compose 目录并启动服务
|
||||||
|
cd /path/to/compose-anything/src/opencut
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
## 参考
|
||||||
|
|
||||||
|
- [OpenCut 官方仓库](https://github.com/OpenCut-app/OpenCut)
|
||||||
|
- [原始 docker-compose.yaml](https://github.com/OpenCut-app/OpenCut/blob/main/docker-compose.yaml)
|
||||||
|
|
||||||
## 许可证
|
## 许可证
|
||||||
|
|
||||||
请参考官方 OpenCut 项目的许可信息。
|
请参考 OpenCut 官方项目的许可证信息。
|
||||||
|
|||||||
@@ -1,41 +1,67 @@
|
|||||||
|
x-default: &default
|
||||||
|
restart: unless-stopped
|
||||||
|
logging:
|
||||||
|
driver: json-file
|
||||||
|
options:
|
||||||
|
max-size: 100m
|
||||||
|
max-file: "3"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
db:
|
db:
|
||||||
image: postgres:17
|
<<: *default
|
||||||
restart: unless-stopped
|
image: postgres:${POSTGRES_VERSION:-17}
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_USER: opencut
|
TZ: ${TZ:-UTC}
|
||||||
POSTGRES_PASSWORD: opencutthegoat
|
POSTGRES_USER: ${POSTGRES_USER:-opencut}
|
||||||
POSTGRES_DB: opencut
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}
|
||||||
|
POSTGRES_DB: ${POSTGRES_DB:-opencut}
|
||||||
volumes:
|
volumes:
|
||||||
- postgres_data:/var/lib/postgresql/data
|
- postgres_data:/var/lib/postgresql/data
|
||||||
ports:
|
ports:
|
||||||
- "5432:5432"
|
- "${POSTGRES_PORT_OVERRIDE:-5432}:5432"
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD-SHELL", "pg_isready -U opencut"]
|
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-opencut}"]
|
||||||
interval: 30s
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 5
|
retries: 5
|
||||||
start_period: 10s
|
start_period: 10s
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpus: '2.00'
|
||||||
|
memory: 1G
|
||||||
|
reservations:
|
||||||
|
cpus: '0.50'
|
||||||
|
memory: 256M
|
||||||
|
|
||||||
redis:
|
redis:
|
||||||
image: redis:7-alpine
|
<<: *default
|
||||||
restart: unless-stopped
|
image: redis:${REDIS_VERSION:-7-alpine}
|
||||||
ports:
|
ports:
|
||||||
- "6379:6379"
|
- "${REDIS_PORT_OVERRIDE:-6379}:6379"
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD", "redis-cli", "ping"]
|
test: ["CMD", "redis-cli", "ping"]
|
||||||
interval: 30s
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 5
|
retries: 5
|
||||||
start_period: 10s
|
start_period: 10s
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpus: '1.00'
|
||||||
|
memory: 512M
|
||||||
|
reservations:
|
||||||
|
cpus: '0.25'
|
||||||
|
memory: 128M
|
||||||
|
|
||||||
serverless-redis-http:
|
serverless-redis-http:
|
||||||
image: hiett/serverless-redis-http:latest
|
<<: *default
|
||||||
|
image: hiett/serverless-redis-http:${SERVERLESS_REDIS_HTTP_VERSION:-latest}
|
||||||
ports:
|
ports:
|
||||||
- "8079:80"
|
- "${SERVERLESS_REDIS_HTTP_PORT_OVERRIDE:-8079}:80"
|
||||||
environment:
|
environment:
|
||||||
SRH_MODE: env
|
SRH_MODE: env
|
||||||
SRH_TOKEN: example_token
|
SRH_TOKEN: ${SERVERLESS_REDIS_HTTP_TOKEN:?SERVERLESS_REDIS_HTTP_TOKEN is required}
|
||||||
SRH_CONNECTION_STRING: "redis://redis:6379"
|
SRH_CONNECTION_STRING: "redis://redis:6379"
|
||||||
depends_on:
|
depends_on:
|
||||||
redis:
|
redis:
|
||||||
@@ -46,31 +72,36 @@ services:
|
|||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 5
|
retries: 5
|
||||||
start_period: 10s
|
start_period: 10s
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpus: '1.00'
|
||||||
|
memory: 256M
|
||||||
|
reservations:
|
||||||
|
cpus: '0.25'
|
||||||
|
memory: 64M
|
||||||
|
|
||||||
web:
|
web:
|
||||||
build:
|
<<: *default
|
||||||
context: .
|
image: ${OPENCUT_WEB_IMAGE:-opencut/web:latest}
|
||||||
dockerfile: ./apps/web/Dockerfile
|
|
||||||
args:
|
|
||||||
- FREESOUND_CLIENT_ID=${FREESOUND_CLIENT_ID}
|
|
||||||
- FREESOUND_API_KEY=${FREESOUND_API_KEY}
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
ports:
|
||||||
- "3100:3000" # app is running on 3000 so we run this at 3100
|
- "${OPENCUT_WEB_PORT_OVERRIDE:-3100}:3000"
|
||||||
environment:
|
environment:
|
||||||
- NODE_ENV=production
|
TZ: ${TZ:-UTC}
|
||||||
- DATABASE_URL=postgresql://opencut:opencutthegoat@db:5432/opencut
|
NODE_ENV: production
|
||||||
- BETTER_AUTH_URL=http://localhost:3000
|
DATABASE_URL: postgresql://${POSTGRES_USER:-opencut}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB:-opencut}
|
||||||
- BETTER_AUTH_SECRET=your-production-secret-key-here
|
BETTER_AUTH_URL: ${OPENCUT_BETTER_AUTH_URL:-http://localhost:3100}
|
||||||
- UPSTASH_REDIS_REST_URL=http://serverless-redis-http:80
|
BETTER_AUTH_SECRET: ${OPENCUT_BETTER_AUTH_SECRET:?OPENCUT_BETTER_AUTH_SECRET is required}
|
||||||
- UPSTASH_REDIS_REST_TOKEN=example_token
|
UPSTASH_REDIS_REST_URL: http://serverless-redis-http:80
|
||||||
- FREESOUND_CLIENT_ID=${FREESOUND_CLIENT_ID}
|
UPSTASH_REDIS_REST_TOKEN: ${SERVERLESS_REDIS_HTTP_TOKEN}
|
||||||
- FREESOUND_API_KEY=${FREESOUND_API_KEY}
|
FREESOUND_CLIENT_ID: ${OPENCUT_FREESOUND_CLIENT_ID:?OPENCUT_FREESOUND_CLIENT_ID is required}
|
||||||
|
FREESOUND_API_KEY: ${OPENCUT_FREESOUND_API_KEY:?OPENCUT_FREESOUND_API_KEY is required}
|
||||||
# Transcription (Optional - leave blank to disable auto-captions)
|
# Transcription (Optional - leave blank to disable auto-captions)
|
||||||
- CLOUDFLARE_ACCOUNT_ID=${CLOUDFLARE_ACCOUNT_ID}
|
CLOUDFLARE_ACCOUNT_ID: ${OPENCUT_CLOUDFLARE_ACCOUNT_ID:-}
|
||||||
- R2_ACCESS_KEY_ID=${R2_ACCESS_KEY_ID}
|
R2_ACCESS_KEY_ID: ${OPENCUT_R2_ACCESS_KEY_ID:-}
|
||||||
- R2_SECRET_ACCESS_KEY=${R2_SECRET_ACCESS_KEY}
|
R2_SECRET_ACCESS_KEY: ${OPENCUT_R2_SECRET_ACCESS_KEY:-}
|
||||||
- R2_BUCKET_NAME=${R2_BUCKET_NAME}
|
R2_BUCKET_NAME: ${OPENCUT_R2_BUCKET_NAME:-}
|
||||||
- MODAL_TRANSCRIPTION_URL=${MODAL_TRANSCRIPTION_URL}
|
MODAL_TRANSCRIPTION_URL: ${OPENCUT_MODAL_TRANSCRIPTION_URL:-}
|
||||||
depends_on:
|
depends_on:
|
||||||
db:
|
db:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
@@ -82,10 +113,14 @@ services:
|
|||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 5
|
retries: 5
|
||||||
start_period: 30s
|
start_period: 30s
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpus: '2.00'
|
||||||
|
memory: 2G
|
||||||
|
reservations:
|
||||||
|
cpus: '0.50'
|
||||||
|
memory: 512M
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
postgres_data:
|
postgres_data:
|
||||||
|
|
||||||
networks:
|
|
||||||
default:
|
|
||||||
name: opencut-network
|
|
||||||
|
|||||||
Reference in New Issue
Block a user