Penpot 开源设计工具自建教程:飞牛 NAS Docker Compose 部署官方镜像,Figma 的开源替代,内网穿透出门手机也能改稿
作者
小编
发布时间

项目介绍
Penpot 是一个开源的在线设计工具,做界面、画原型、管设计系统、团队协作都行,可以理解成 Figma 的开源替代。装在自己的 NAS 上,设计稿全在自己家,不用把文件放到别人的云上;浏览器打开就能用,不用装客户端。
本文部署的是官方的 Docker Compose 方案:frontend、backend、exporter 三个 Penpot 自己的镜像,加 PostgreSQL 和 Valkey,一共五个容器一起起。
项目地址:点我跳转
部署安装
Penpot 的编排里有一项 PENPOT_PUBLIC_URI,要填「用户访问它的地址」——所以这一期的顺序反过来:先用 帕斯内网穿透 把端口开放到公网、拿到公网地址,再把地址填进编排里起容器。不需要公网 IP,也不用改路由器。
一、先建隧道,拿到公网地址
飞牛的应用中心里直接能搜到 PassNAT 插件,装上,用账号登录一次。
在插件里点「创建隧道」:隧道名称随便起一个(比如 penpot),接入节点和传输协议都留默认;「本地IP」这一栏留空不用填,默认就是 127.0.0.1,插件跑在 NAS 上,回环地址天然指向本机;本地端口填 9001(下面编排里给 Penpot 开的端口)。
建好之后回到隧道列表,点开这条隧道的详情,按一下最左边的电源图标,隧道就连上了,面板里会显示分配到的公网地址,形如 http://IP:端口。把它记下来,下一步要填。
二、用 Docker Compose 部署
飞牛 NAS 打开 Docker 应用,切到 Compose 标签,点「新增项目」。项目名称填 penpot;路径选一个空文件夹。
「来源」选「创建 docker-compose.yml」,把下面这段贴进去(三处 PENPOT_PUBLIC_URI 换成你自己隧道给的公网地址;PENPOT_SECRET_KEY 两处换成同一串随机字符):
1services:2 penpot-frontend:3 image: penpotapp/frontend:2.174 ports:5 - "9001:8080"6 environment:7 PENPOT_PUBLIC_URI: http://你的公网地址:端口8 PENPOT_FLAGS: disable-email-verification disable-secure-session-cookies disable-onboarding9 volumes:10 - penpot-assets:/opt/data/assets11 depends_on:12 - penpot-backend13 - penpot-exporter14 restart: always1516 penpot-backend:17 image: penpotapp/backend:2.1718 environment:19 PENPOT_PUBLIC_URI: http://你的公网地址:端口20 PENPOT_FLAGS: disable-email-verification disable-secure-session-cookies disable-onboarding21 PENPOT_SECRET_KEY: 换成一长串随机字符22 PENPOT_DATABASE_URI: postgresql://penpot-postgres/penpot23 PENPOT_DATABASE_USERNAME: penpot24 PENPOT_DATABASE_PASSWORD: penpot25 PENPOT_REDIS_URI: redis://penpot-valkey/026 PENPOT_OBJECTS_STORAGE_BACKEND: fs27 PENPOT_OBJECTS_STORAGE_FS_DIRECTORY: /opt/data/assets28 PENPOT_TELEMETRY_ENABLED: "false"29 volumes:30 - penpot-assets:/opt/data/assets31 depends_on:32 penpot-postgres:33 condition: service_healthy34 penpot-valkey:35 condition: service_healthy36 restart: always3738 penpot-exporter:39 image: penpotapp/exporter:2.1740 environment:41 PENPOT_PUBLIC_URI: http://你的公网地址:端口42 PENPOT_INTERNAL_URI: http://penpot-frontend:808043 PENPOT_SECRET_KEY: 换成一长串随机字符44 PENPOT_REDIS_URI: redis://penpot-valkey/045 restart: always4647 penpot-postgres:48 image: postgres:1549 environment:50 POSTGRES_DB: penpot51 POSTGRES_USER: penpot52 POSTGRES_PASSWORD: penpot53 volumes:54 - penpot-postgres:/var/lib/postgresql/data55 healthcheck:56 test: ["CMD-SHELL", "pg_isready -U penpot"]57 interval: 5s58 retries: 1059 restart: always6061 penpot-valkey:62 image: valkey/valkey:8.163 healthcheck:64 test: ["CMD-SHELL", "valkey-cli ping | grep PONG"]65 interval: 5s66 retries: 1067 restart: always6869volumes:70 penpot-assets:71 penpot-postgres:
从上往下要认几处:ports 里左边的 9001 是浏览器要敲的端口,也是上面隧道里填的那个;PENPOT_PUBLIC_URI 填隧道给的公网地址,frontend、backend、exporter 三个服务都要填一样的,分享链接、导出图片都按它生成;PENPOT_FLAGS 里三个开关:disable-email-verification 是注册不用邮箱验证(家里没有邮件服务器),disable-secure-session-cookies 是隧道走的是 http 而不是 https、不关掉的话登录态存不下来,disable-onboarding 是跳过注册后的新手问卷;PENPOT_SECRET_KEY 是它派生各种密钥的种子,自己随便生成一长串,不设的话每次重启都会把所有人踢下线;两个命名卷 penpot-assets 和 penpot-postgres 分别放上传的素材和数据库,备份就备份它们。
勾上「创建项目后立即启动」,点确认。五个镜像加起来一个多 G,拉起来要等一会儿,列表里看到「运行中」就好了。backend 是 Java 写的,起来之后还要初始化数据库,再等半分钟。
三、在公网地址上注册、画第一张图
浏览器打开刚才那个公网地址,落在登录页,点「创建账号」,填全名、邮箱、密码,再点「创建账号」——隧道一开就先把账号建好,别让它空着挂在公网上。没有邮箱验证,注册完直接进面板。
进来是面板,左边是「项目」和「草稿」,点中间的「创建新文件」就进画板了。按 R 拖一个矩形,按 T 打几个字,右边的属性面板改颜色、改尺寸;文件自动保存。
做好之后点右上角的「共享」,生成一个链接,链接就是公网地址开头的,手机上打开一样能看;人在外面登录进去也能接着改。
几个提醒
一、注册默认是开着的,公网上谁都能建账号。自己用的话,录完 / 建完账号可以在 PENPOT_FLAGS 里加一个 disable-registration,停掉项目改一下编排再构建就行。
二、隧道是 http,浏览器的剪贴板 API 在非 https 页面上会受限,画板里复制粘贴偶尔不灵是浏览器的限制,不是 Penpot 的问题。
三、如果以后重建隧道、公网端口变了,记得把编排里三处 PENPOT_PUBLIC_URI 一起改掉再重启,不然分享链接还是旧地址。