尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于Docker Compose构建个人开发者中转站:文件共享、内网穿透与轻量服务部署

基于Docker Compose构建个人开发者中转站:文件共享、内网穿透与轻量服务部署 最近在整理个人技术栈时发现很多开发者在处理跨平台文件同步、临时数据中转或轻量级服务部署时常常面临一个选择是使用复杂的云存储服务还是自己搭建一套笨重的服务器对于个人开发者、小型团队或特定场景下的临时需求一个轻巧、灵活、可控的“中转站”方案往往更具吸引力。本文将围绕如何构建一个功能实用、易于维护的个人技术中转站展开从需求分析、技术选型到完整部署手把手带你搭建一套属于自己的数据与任务中转枢纽。本文适合有一定Linux和网络基础的开发者无论是想管理自己的代码片段、临时文件还是需要一个内网穿透的跳板机亦或是想体验轻量级服务编排都能从中找到可复用的模块。我们将使用Docker作为核心的封装和部署工具确保环境的一致性和可移植性。1. 中转站的核心需求与技术选型在开始动手之前我们首先要明确这个“中转站”需要解决哪些实际问题以及为什么选择相应的技术栈。1.1 典型应用场景分析一个开发者的中转站通常不承担核心业务而是作为辅助工具存在其场景包括但不限于文件临时共享与同步在手机、电脑、服务器之间快速传递文件替代微信文件助手或网盘避免敏感代码上传至第三方。内网服务穿透与访问将本地开发的服务如Web应用、数据库管理界面临时暴露到公网方便演示或远程调试。命令执行与任务调度在一个固定的、网络可达的节点上运行定时脚本如爬虫、备份、执行耗时命令并查看结果。轻量级服务托管快速部署一个MySQL、Redis、Nginx或者自己写的Demo应用用于临时测试或学习。统一入口与管理通过一个统一的Web门户来管理上述所有功能避免记忆多个IP和端口。1.2 技术栈选择与理由基于以上场景我们选择以下技术组合力求在功能、易用性和资源消耗之间取得平衡Docker Docker Compose这是整个方案的基石。Docker实现了应用及其依赖的标准化打包真正做到“一次构建到处运行”。Docker Compose则用于定义和运行多容器的应用通过一个YAML文件就能管理所有服务极大简化了部署和运维。选择它们是为了避免环境污染、依赖冲突并保证部署流程的可重复性。Nginx Proxy Manager (NPM)一个基于Nginx的、带Web管理界面的反向代理工具。它解决了两个痛点一是为每个内部服务运行在不同容器端口上分配一个易于记忆的域名如file.your-domain.com二是自动申请和续期SSL证书HTTPS让服务访问更安全、更专业。相比手动配置NginxNPM对新手友好太多。File Browser一个简单的、单文件的Web文件管理器。它提供了类网盘的界面支持上传、下载、删除、重命名、在线预览文本/图片等基本操作并且可以设置不同的用户和权限。它完美契合了文件共享与管理的需求部署极其简单。Frps / Frpc (可选)如果你需要从公网访问家中或公司内网的服务内网穿透工具是必不可少的。Frp是一个高性能的反向代理应用这里我们通常会在中转站有公网IP的VPS上部署Frps服务端在需要被访问的内网机器上部署Frpc客户端。本文会重点介绍如何在中转站上搭建Frps。Portainer (可选)一个轻量级的Docker图形化管理界面。如果你不习惯全部使用命令行操作DockerPortainer可以让你通过Web界面查看容器状态、日志、镜像甚至执行简单的管理操作适合作为辅助管理工具。为什么不直接用云厂商的现成服务最大的优势是可控性和隐私性。所有数据都经过自己的服务器没有流量和存储限制取决于服务器配置服务配置也完全自定义。对于技术学习者来说搭建过程本身也是一次宝贵的DevOps实践。2. 环境准备与服务器配置在开始部署前你需要准备一台服务器。这里以最常用的**Linux VPSUbuntu 22.04 LTS**为例进行说明。CentOS等系统在命令上略有差异但Docker部分通用。2.1 服务器基础要求与配置服务器一台具有公网IP的云服务器如腾讯云、阿里云、AWS Lightsail等。建议最低配置1核CPU、1GB内存、25GB SSD存储。如果仅用于内网穿透或极轻量使用配置可以更低。域名非必需但推荐一个你拥有的域名。这将用于为各项服务分配子域名如npm.your-domain.com管理NPMfiles.your-domain.com访问文件管理。如果暂时没有后续也可以通过服务器IP端口访问。系统更新与基础工具# 更新软件包列表并升级现有包 sudo apt update sudo apt upgrade -y # 安装常用工具 sudo apt install -y curl wget vim git2.2 安装 Docker 与 Docker Compose这是最关键的一步。我们将使用Docker官方提供的便捷安装脚本。# 1. 下载并执行Docker安装脚本 curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # 2. 将当前用户加入docker组避免每次使用sudo sudo usermod -aG docker $USER # **重要**执行此命令后你需要退出当前SSH会话并重新登录用户组变更才会生效。 # 3. 验证Docker安装 docker --version # 4. 安装Docker Compose插件Docker新版本已将其集成为插件 # 对于Docker Engine 20.10.13及以上版本推荐使用以下命令安装Compose插件 sudo apt update sudo apt install -y docker-compose-plugin # 5. 验证Docker Compose安装 docker compose version注意重新登录后运行docker ps命令不再需要sudo说明配置成功。2.3 防火墙与安全组配置为了服务能正常访问需要在服务器防火墙如ufw和云服务商的安全组中开放相应端口。云服务商安全组登录你的云服务器控制台找到安全组/防火墙设置确保放行以下端口协议均为TCP80HTTP流量用于申请SSL证书。443HTTPS流量服务主要访问端口。22SSH管理端口务必设置强密码或使用密钥对。7000可选Frp服务端默认端口如果你需要内网穿透。9000可选Portainer管理界面端口。8080可选File Browser或其他服务的临时端口。服务器本地防火墙 (ufw)# 安装ufw如果未安装 sudo apt install -y ufw # 设置默认策略拒绝所有入站允许所有出站 sudo ufw default deny incoming sudo ufw default allow outgoing # 放行SSH端口非常重要否则可能锁死自己 sudo ufw allow 22/tcp # 放行Web相关端口 sudo ufw allow 80/tcp sudo ufw allow 443/tcp # 放行其他你可能需要的端口如Frp、Portainer sudo ufw allow 7000/tcp sudo ufw allow 9000/tcp # 启用防火墙 sudo ufw enable # 查看规则状态 sudo ufw status numbered3. 核心服务部署实战我们将使用Docker Compose来统一管理所有服务。首先创建一个项目目录并在其中编写docker-compose.yml文件。# 创建项目目录并进入 mkdir ~/my-transit-station cd ~/my-transit-station3.1 部署 Nginx Proxy Manager (NPM)NPM将作为我们所有Web服务的统一入口和SSL证书管理器。创建NPM数据持久化目录mkdir -p ./data/npm/data mkdir -p ./data/npm/letsencryptdata目录用于存储NPM的数据库和配置letsencrypt目录用于存储SSL证书。编写docker-compose.yml文件# ~/my-transit-station/docker-compose.yml version: 3.8 services: nginx-proxy-manager: image: jc21/nginx-proxy-manager:latest container_name: npm restart: unless-stopped ports: - 80:80 # HTTP 端口 - 81:81 # NPM 管理后台端口 - 443:443 # HTTPS 端口 environment: # 可选的数据库配置默认使用SQLite # DB_SQLITE_FILE: /data/database.sqlite # 设置初始管理员邮箱和密码登录后请立即修改 DISABLE_IPV6: true volumes: - ./data/npm/data:/data - ./data/npm/letsencrypt:/etc/letsencrypt networks: - transit-network # 定义一个自定义网络方便容器间通信如果需要 networks: transit-network: driver: bridge启动NPM服务cd ~/my-transit-station docker compose up -d使用docker ps查看容器状态确认npm容器处于Up状态。访问并初始化NPM在浏览器中访问http://你的服务器IP:81默认登录凭证Email:adminexample.comPassword:changeme首次登录后系统会强制你修改邮箱和密码请务必设置一个强密码配置域名解析可选但推荐 在你的域名DNS管理后台添加一条A记录将npm.your-domain.com指向你的服务器公网IP。在NPM中添加代理主机登录NPM后台点击Hosts-Proxy Hosts-Add Proxy Host。Details 标签页Domain Names: 输入npm.your-domain.com(或你的服务器IP)。Forward Hostname / IP: 填写npm(这是Docker Compose中NPM容器的服务名Docker网络内可通过服务名访问)。Forward Port:81。SSL 标签页SSL Certificate: 选择Request a new SSL Certificate。勾选Force SSL和HTTP/2 Support。点击Save。NPM会自动尝试通过Let‘s Encrypt为你申请SSL证书。成功后你就可以通过https://npm.your-domain.com安全地访问管理后台了。3.2 部署 File Browser 文件管理器接下来部署我们的文件共享服务。创建File Browser数据目录mkdir -p ~/my-transit-station/data/filebrowser # 这个目录将作为文件管理的根目录你可以把要共享的文件放这里在docker-compose.yml中追加File Browser服务# 在现有 services: 块下追加 services: nginx-proxy-manager: # ... 原有配置保持不变 filebrowser: image: filebrowser/filebrowser:latest container_name: filebrowser restart: unless-stopped # 注意我们不直接将端口映射到主机而是通过NPM反向代理访问。 # ports: # - 8080:80 # 如果需要直接通过IP:8080访问可以取消注释 environment: - PUID1000 # 设置容器内运行用户的UID通常与主机非root用户一致 - PGID1000 # 设置GID - TZAsia/Shanghai # 设置时区 volumes: - ./data/filebrowser:/srv # 文件存储目录 - ./data/filebrowser/database.db:/database/filebrowser.db # 数据库文件 - ./data/filebrowser/settings.json:/config/settings.json # 配置文件 command: --noauth # 首次启动时禁用认证方便初始化设置 networks: - transit-network更新并启动File Browsercd ~/my-transit-station docker compose up -d filebrowser初始化File Browser并设置密码首先我们需要进入容器内部设置管理员账户。docker exec -it filebrowser filebrowser users add admin your-strong-password --perm.admin # 将 your-strong-password 替换为你自己的强密码然后修改docker-compose.yml中File Browser的启动命令移除--noauth启用认证。command: # 删除 --noauth重启File Browser服务。docker compose up -d filebrowser在NPM中添加File Browser的代理回到NPM管理后台 (https://npm.your-domain.com)。Add Proxy Host。Domain Names:files.your-domain.com(或自定义子域名)。Forward Hostname / IP:filebrowser(Docker服务名)。Forward Port:80(File Browser容器内部端口)。在SSL标签页申请SSL证书并保存。现在你可以通过https://files.your-domain.com访问你的私有网盘了使用刚才设置的admin用户名和密码登录。3.3 部署 Frp 服务端 (用于内网穿透)如果你需要从公网访问内网机器上的服务如家里的NAS、开发中的Web应用就需要Frp。创建Frp配置目录mkdir -p ~/my-transit-station/data/frps编写Frp服务端配置文件frps.toml# ~/my-transit-station/data/frps/frps.toml bindPort 7000 # 用于Web Dashboard的端口可以在NPM中反向代理 webServer.port 7500 webServer.user admin webServer.password your-dashboard-password # 认证token客户端连接时需要提供相同的token auth.token your-secret-token-here # 允许客户端绑定的端口范围可选用于安全限制 # allowPorts [ # { start 10000, end 20000 } # ]在docker-compose.yml中追加Frps服务services: # ... 之前的服务 frps: image: snowdreamtech/frps:latest container_name: frps restart: unless-stopped ports: - 7000:7000 # Frp客户端连接端口 - 7500:7500 # Dashboard端口可选可通过NPM代理 volumes: - ./data/frps/frps.toml:/etc/frp/frps.toml networks: - transit-network启动Frps并配置NPM代理可选docker compose up -d frps如果需要通过域名访问Frp Dashboard可以在NPM中添加代理Domain:frp.your-domain.comForward to:frps:7500申请SSL。访问https://frp.your-domain.com使用配置文件中设置的admin/your-dashboard-password登录可以查看客户端连接状态和流量统计。内网客户端 (Frpc) 配置示例 在内网机器上你需要运行Frpc客户端。创建一个frpc.toml文件serverAddr 你的中转站公网IP或域名 serverPort 7000 auth.token your-secret-token-here # 必须与服务器端一致 [[proxies]] name ssh-to-internal type tcp localIP 127.0.0.1 localPort 22 remotePort 6000 # 在中转站上暴露的端口 [[proxies]] name web-app type http localIP 127.0.0.1 localPort 8080 customDomains [app.your-domain.com] # 需要在NPM中为此域名添加代理指向 frps:6002假设 # 注意HTTP类型需要配合NPM使用NPM需要将 app.your-domain.com 代理到 frps 容器的特定端口。然后使用Docker或二进制文件启动Frpc客户端。这样你就可以通过ssh -p 6000 user你的中转站IP来SSH连接到内网机器或者通过https://app.your-domain.com访问内网的Web应用了。4. 服务整合与日常使用4.1 统一访问门户现在我们拥有了以下几个核心服务https://npm.your-domain.comNginx Proxy Manager 管理后台。https://files.your-domain.comFile Browser 文件管理器。https://frp.your-domain.com(可选)Frp 服务端监控面板。所有服务都通过NPM提供了HTTPS访问安全且方便记忆。你可以根据需要继续通过NPM添加更多代理例如将你部署的其他Demo应用运行在另一个容器端口上通过新的子域名暴露出去。4.2 文件管理实践将File Browser作为你的临时文件仓库代码片段创建snippets文件夹存放常用的脚本、配置模板。项目传输在本地和服务器间互传项目压缩包。日志查看如果其他应用将日志输出到挂载的卷可以直接在File Browser中在线查看。权限管理可以在File Browser设置中创建多个用户并为不同目录分配只读或读写权限。4.3 通过内网穿透访问家庭服务假设你家中的NAS运行在192.168.1.100:5000Web管理界面。在家中的NAS或一台常开机的电脑上配置Frpc客户端将本地5000端口映射到Frp服务器你的中转站的某个端口例如6001。在NPM中添加一个新的代理主机Domain:nas.your-domain.comForward to:frps:6001(假设Frps容器将6001端口映射给了这个客户端连接)。现在你在任何有网络的地方访问https://nas.your-domain.com就能安全地管理家里的NAS了。5. 常见问题与排查思路在搭建和使用过程中你可能会遇到一些问题。下面是一个快速排查指南。问题现象可能原因排查步骤与解决方案访问NPM管理后台(81端口)超时1. 防火墙/安全组未开放81端口。2. Docker容器未成功启动。3. 端口被其他进程占用。1. 检查sudo ufw status和云平台安全组规则。2. 运行docker ps查看npm容器状态运行docker logs npm查看启动日志。3. 运行sudo netstat -tlnp | grep :81查看81端口占用情况。NPM申请SSL证书失败1. 域名解析未生效或指向错误IP。2. 服务器80/443端口被占用或未开放。3. Let‘s Encrypt速率限制。1. 使用ping或nslookup检查域名解析。2. 确保NPM容器映射了80/443端口且防火墙放行。3. 在NPM的SSL证书详情页查看具体错误信息。如果是速率限制等待一段时间再试。通过域名访问File Browser显示“Bad Gateway”1. NPM代理配置中“Forward Hostname/IP”填写错误。2. File Browser容器未运行或网络不通。3. File Browser容器内部服务异常。1. 检查NPM代理配置Hostname应填Docker服务名filebrowser。2. 运行docker ps确认filebrowser容器状态。在NPM容器内ping filebrowser测试网络。3. 运行docker logs filebrowser查看日志。Frp客户端连接失败1. 中转站安全组/防火墙未开放7000端口。2. Frps服务端配置文件frps.toml有语法错误。3. 客户端与服务端auth.token不一致。4. 客户端配置的serverAddr错误。1. 检查防火墙规则。2. 运行docker logs frps查看服务端日志。3. 核对客户端和服务端配置文件中的token。4. 确认客户端配置的服务器地址和端口正确。磁盘空间不足Docker镜像、容器日志、Volume数据增长。1. 清理无用镜像docker image prune -a。2. 清理停止的容器和卷docker system prune -a --volumes(谨慎使用会删除未使用的卷)。3. 设置Docker日志轮转在/etc/docker/daemon.json中配置log-driver和log-opts。Docker命令需要sudo当前用户未加入docker组。执行sudo usermod -aG docker $USER然后完全退出SSH会话并重新登录。6. 最佳实践与进阶建议一个稳定的个人中转站不仅在于搭建成功更在于长期的维护和安全。6.1 安全加固强密码与密钥为所有服务NPM、File Browser、Frp Dashboard、服务器SSH设置复杂且唯一的密码。SSH优先使用密钥对认证禁用密码登录。最小化暴露仅对外开放必要的端口如80, 443, 22。像Frp Dashboard(7500)、Portainer(9000)等管理界面强烈建议不要直接映射到主机端口而是通过NPM的HTTPS代理访问并设置访问IP白名单NPM高级配置或HTTP Basic Auth。定期更新定期执行docker compose pull和docker compose up -d来更新容器镜像修复安全漏洞。备份配置与数据定期备份~/my-transit-station/data/目录下的所有数据NPM配置、文件、Frp配置。可以将整个目录打包通过File Browser下载或同步到其他安全位置。6.2 配置管理优化使用环境变量文件将docker-compose.yml中的敏感信息如密码、token移入.env文件并在Compose文件中通过${VARIABLE_NAME}引用。确保.env文件不被提交到Git。# .env 文件示例 MYSQL_ROOT_PASSWORDsupersecret FRP_TOKENyour-secret-token-here# docker-compose.yml 引用 environment: - FRP_TOKEN${FRP_TOKEN}日志管理为生产用途的服务配置合理的日志驱动和轮转策略避免日志占满磁盘。可以在docker-compose.yml中为每个服务配置日志选项。资源限制为容器设置内存和CPU限制防止某个服务异常耗尽主机资源。services: filebrowser: # ... deploy: resources: limits: cpus: 0.5 memory: 256M6.3 功能扩展思路你的中转站可以像乐高一样扩展增加数据库服务在docker-compose.yml中添加一个MySQL或PostgreSQL服务用于测试或小型应用。增加监控部署cadvisorprometheusgrafana容器监控服务器和容器的资源使用情况。增加自动化工具部署一个nginx容器用于托管静态页面或作为其他服务的负载均衡部署一个jenkins或drone容器实现简单的CI/CD。集成云存储修改File Browser的配置使其后端存储对接阿里云OSS、腾讯云COS或S3实现文件的双重备份。6.4 日常维护命令备忘# 进入项目目录 cd ~/my-transit-station # 查看所有服务状态 docker compose ps # 查看特定服务日志实时 docker compose logs -f nginx-proxy-manager # 重启所有服务 docker compose restart # 重启单个服务 docker compose restart filebrowser # 停止并删除所有容器、网络不会删除Volume数据 docker compose down # 停止并删除所有容器、网络、Volume数据谨慎 docker compose down -v # 更新所有镜像并重启服务 docker compose pull docker compose up -d # 进入容器内部执行命令如调试 docker exec -it filebrowser sh通过以上步骤你已经成功搭建了一个功能全面、易于管理的个人开发者中转站。这个系统将文件共享、服务代理、内网穿透等常用需求整合在一起通过Docker Compose实现了声明式管理和一键部署。它不仅解决了实际开发中的痛点其搭建过程本身也是对Linux、网络、Docker和DevOps理念的一次深入实践。你可以根据自己的需求随时调整和扩展这个“中转站”让它真正成为你高效开发工作流中得心应手的一环。如果在实践中遇到新的问题不妨多查看官方文档和容器日志解决问题的过程同样是宝贵的经验积累。
返回列表