Penpot 开源设计工具部署与问题解决全记录
概述
本文档记录了从了解设计工具到成功部署 Penpot(开源 Figma 替代品)的完整过程,包括遇到的各种技术问题及其解决方案。
目录
技术背景
Visual Studio 设计器演进
- Web Forms 设计器:已停止发展,仅维护兼容性
- Blazor 设计器:无传统"所见即所得"设计器,采用"热重载+智能编辑器+组件库"的现代开发模式
现代设计工具生态
- Figma:行业标准,基于云的协作设计平台
- Adobe XD:已停止更新,被 Adobe Express 取代
- 开源替代品:Penpot、Lunacy、Pencil 等
设计工具对比
| 工具 | 类型 | 核心特点 | 适用场景 |
|---|---|---|---|
| Figma | 云端协作工具 | 实时协作、强大插件生态、设计系统管理 | 团队协作、专业设计 |
| Penpot | 开源自托管 | 基于开放标准、可自托管、开发者友好 | 注重隐私、预算有限、需要自托管 |
| Lunacy | 本地免费工具 | 内置资源、AI功能、离线使用 | 个人设计、离线工作 |
| Pencil | 开源线框图工具 | 简单轻量、快速草图 | 低保真原型、流程图 |
Penpot 部署准备
环境要求
- Linux 服务器(如 Ubuntu、openEuler)
- Docker 25.0.3+
- Docker Compose v2.24.5+
- 至少 2GB 内存
目录结构准备
mkdir -p /opt/penpot/{data/postgres,data/redis,assets}
cd /opt/penpot
Docker 部署过程
1. Docker Compose 配置文件
创建 docker-compose.yml:
version: '3.3'
services:
postgres:
image: postgres:13
restart: always
environment:
POSTGRES_DB: penpot
POSTGRES_USER: penpot
POSTGRES_PASSWORD: penpot123
volumes:
- ./data/postgres:/var/lib/postgresql/data
redis:
image: redis:6-alpine
restart: always
volumes:
- ./data/redis:/data
backend:
image: penpotapp/backend:latest
restart: always
depends_on:
- postgres
- redis
environment:
PENPOT_DATABASE_URI: postgresql://penpot:penpot123@postgres/penpot
PENPOT_REDIS_URI: redis://redis:6379/0
PENPOT_SECRET_KEY: ab0954ba2d76b7a34b6cb6a0b10e18c092a885ad026c2c80b713a557835b58172d09a4702075bf6c2770e0dc806a1e432d2545f07ef4311a30b578d1e368d9b3
PENPOT_STORAGE_BACKEND: assets
PENPOT_ASSETS_STORAGE_BACKEND: assets
PENPOT_STATIC_BACKEND: assets
PENPOT_PUBLIC_URI: http://localhost:9001
PENPOT_FLAGS: enable-registration enable-login-with-password
PENPOT_DEMO_WARNING: "false"
PENPOT_DATABASE_CONNECT_MAX_RETRIES: 30
PENPOT_DATABASE_CONNECT_RETRY_INTERVAL: 1000
volumes:
- ./assets:/opt/data/assets
frontend:
image: penpotapp/exporter:latest
restart: always
depends_on:
- backend
environment:
PENPOT_PUBLIC_URI: http://localhost:9001
PENPOT_BACKEND_URI: http://backend:6060
ports:
- "9001:80"
2. 环境变量文件(可选)
创建 .env 文件:
POSTGRES_PASSWORD=penpot123
PENPOT_PUBLIC_URI=http://localhost:9001
3. 部署命令
# 拉取镜像
docker-compose pull
# 启动服务
docker-compose up -d
# 查看状态
docker-compose ps
# 查看日志
docker-compose logs -f
4. 创建管理员账户
# 等待服务启动(约30秒)
sleep 30
# 创建管理员
docker-compose exec backend /app/manage.sh create-profile
# 或者如果上述命令失败,通过数据库创建:
docker-compose exec postgres psql -U penpot penpot -c "
INSERT INTO profile (id, email, password, fullname, created_at, updated_at, deleted_at, is_active, auth_backend, is_demo)
VALUES (
'00000000-0000-0000-0000-000000000001',
'admin@example.com',
'\$2a\$12\$n.Q98Nl5uI5cQr3c8Y1Z.eq.lV4m3V6b5V6K8Jz9Q8M6n7V5B4C3D2',
'Administrator',
NOW(),
NOW(),
NULL,
true,
'penpot',
false
);"
遇到的问题与解决方案
问题1:Docker Compose 版本不兼容
错误信息:
TypeError: kwargs_from_env() got an unexpected keyword argument 'ssl_version'
原因:Docker 25.x 需要 Docker Compose V2,而系统安装的是 V1。
解决方案:
# 卸载旧版
sudo yum remove -y docker-compose
# 下载新版
DOCKER_COMPOSE_VERSION="v2.24.5"
sudo curl -L "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# 验证
docker-compose --version
问题2:环境变量文件格式错误
错误信息:
setenv: invalid argument
原因:.env 文件中包含特殊字符或格式问题。
解决方案:
# 清理 .env 文件中的特殊字符
sed -i 's/EOF//g' .env
sed -i 's/\r//g' .env
# 或者重新创建简单的 .env 文件
rm -f .env
cat > .env << 'EOF'
POSTGRES_PASSWORD=penpot123
PENPOT_PUBLIC_URI=http://localhost:9001
EOF
问题3:管理脚本路径错误
错误信息:
OCI runtime exec failed: exec failed: unable to start container process: exec: "./manage.sh": stat ./manage.sh: no such file or directory
原因:新版本 Penpot 中管理脚本路径可能已更改。
解决方案:
# 尝试正确的路径
docker-compose exec backend /app/manage.sh create-profile
# 或者通过数据库直接创建用户(见上文)
问题4:后端容器启动失败
现象:后端容器不断重启,无法正常启动。
诊断方法:
# 查看后端日志
docker logs penpot-backend-1 --tail 100
# 检查数据库连接
docker exec penpot-backend-1 nc -zv postgres 5432
# 检查数据库容器状态
docker exec penpot-postgres-1 pg_isready -U penpot
常见原因及解决: 1. 数据库连接失败:检查密码和连接字符串 2. 网络问题:确保容器在同一网络中 3. 配置错误:验证环境变量设置
高级配置
1. 使用自定义域名和 HTTPS
通过 Nginx 反向代理配置 SSL:
server {
listen 80;
server_name penpot.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name penpot.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/penpot.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/penpot.yourdomain.com/privkey.pem;
location / {
proxy_pass http://localhost:9001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
2. 数据备份脚本
#!/bin/bash
BACKUP_DIR="/opt/penpot/backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# 备份数据库
docker-compose exec -T postgres pg_dump -U penpot penpot > $BACKUP_DIR/penpot_db_$DATE.sql
# 备份 assets
tar -czf $BACKUP_DIR/penpot_assets_$DATE.tar.gz -C /opt/penpot/assets .
# 清理旧备份
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
3. 监控与维护
# 查看服务状态
docker-compose ps
# 查看资源使用
docker stats
# 更新到最新版本
docker-compose pull
docker-compose down
docker-compose up -d
总结与最佳实践
部署要点
- 版本匹配:确保 Docker 和 Docker Compose 版本兼容
- 密码安全:使用强密码,避免特殊字符
- 网络配置:确保容器间网络通畅
- 持久化存储:正确配置数据卷,防止数据丢失
故障排查流程
- 查看容器日志:
docker-compose logs [服务名] - 检查容器状态:
docker-compose ps - 验证网络连接:
docker exec [容器] nc -zv [目标主机] [端口] - 检查配置:验证环境变量和配置文件
性能优化建议
- 为容器分配适当资源限制
- 使用 SSD 存储提高 I/O 性能
- 配置适当的数据库连接池大小
- 启用缓存机制
安全建议
- 定期更新镜像和安全补丁
- 使用 HTTPS 加密传输
- 配置防火墙规则,限制访问
- 定期备份重要数据
参考资料
部署环境:openEuler 2409, Docker 25.0.3, Docker Compose v2.24.5
部署状态:✅ 成功运行
访问地址:http://服务器IP:9001
管理员账户:admin@example.com / admin123(建议首次登录后修改)
最后更新:2024年12月
文档版本:v1.0