Skip to content
dsh.fish
Bundle

dsh-plugin-ftp-server

Run a configurable FTP file server inside DeepSeek Harness, managed from a browser settings panel (host a shared directory over plain FTP).

Source
YinjiangCN
stars
1 stars
License
MIT
Updated
Updated yesterday

Readme

# dsh-plugin-ftp-server

Run a **configurable FTP file server** inside [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness), managed from a browser settings panel. Host any directory over plain FTP — browse, upload, download, rename and delete files with any FTP client.

> ⚠️ Plain FTP has no TLS: credentials and data travel in cleartext. Use it on trusted networks only.

## Features

- Zero-dependency FTP server core (pure Node built-ins), spawned as a child process of the harness
- Full command support: `USER/PASS`, `PWD/CWD/CDUP`, `LIST/NLST/MLSD`, `RETR/STOR/APPE/STOU`, `DELE/MKD/RMD`, `RNFR/RNTO`, `SIZE/MDTM/REST` (resume), `PASV/EPSV/PORT`, `FEAT/STAT/ABOR/NOOP`
- Chrooted to the shared root — path escape (`..`) is blocked, and the root itself cannot be deleted or renamed
- Single account + password, or anonymous mode
- Browser panel (Settings → FTP 服务): configure host/port/root/credentials, start/stop, live status (PID, uptime), shared-root listing and server log
- Idle timeout (180 s), crash detection, automatic child-process cleanup when the plugin is stopped

## Install

```bash
dsh plugin --profile web add github:YinjiangCN/dsh-plugin-ftp-server
```

Then **restart dsh**. Open **Settings → FTP 服务**, fill in the form and click **启动服务**.

## Usage

| Field | Default | Meaning |
| --- | --- | --- |
| 监听地址 (host) | `0.0.0.0` | Bind address |
| 端口 (port) | `2121` | Control port |
| 共享根目录 (root) | `workspace/ftp-root` | Directory shared over FTP (created on start) |
| 用户名 (user) | `ftp` | Login account (ignored in anonymous mode) |
| 密码 (pass) | *(empty)* | Login password |
| 允许匿名 (anonymous) | off | Allow anonymous login |

Clients connect with `ftp://<user>@<host>:<port>`. The password is kept in memory only; it is passed as a child-process argument and never written to disk.

## Security notes

- **Do not set 共享根目录 to `/`** unless you really want to share the whole filesystem — anyone with the credentials can read/modify every file (the server runs with the harness user's privileges).
- Plain FTP is unencrypted; prefer an internal/trusted network.
- The server supports one account; for multiple users run multiple instances on different ports.

## Development

```
lib/index.js      host half — FTP process management + Typert Remote service `ftpServer`
lib/client.js     browser half — settings panel (module-loader bundle)
lib/ftp-server.js standalone FTP server (spawned by the host half)
cordis.patch.yml  loader patch mounting the host half
```

The host half registers the `ftpServer` Remote service; the panel calls `status/start/stop/listRoot` through the Typert Gateway (host-side SRC-mode discovery with hand-written strict client descriptors).

## License

MIT

Install

dsh plugin --profile web add github:YinjiangCN/dsh-plugin-ftp-server

Profile: web

  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source