news 2026/4/15 7:49:02

Linux安装OpenProject

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux安装OpenProject

1. 参考

  1. 官方安装文档
  2. OpenProject服务的备份与恢复

2. 环境

设备

  • 虚拟机 16C/32G/300G/千兆

系统

  • Ubuntu24.04 192.168.15.96

3. 安装OpenProject

采用官方推荐:Docker compose方式安装
官方安装文档

安装Docker

安装步骤,参见Ubuntu24.04 安装Docker

安装OpenProject

  1. 创建目录
mkdir-p /public/application
  1. 下载源码
cd/public/applicationgitclone https://github.com/opf/openproject-docker-compose.git --depth=1--branch=stable/16 openproject
  1. 配置环境变量
cp.env.example .envvim.env
# All environment variables defined here will only apply if you pass them# to the OpenProject container in docker-compose.yml under x-op-app -> environment.# For the examples here this is already the case.## Please refer to our documentation to see all possible variables:# https://www.openproject.org/docs/installation-and-operations/configuration/environment/#TAG=16-slim# 因为前端使用了nginx做代理,配置了SSL域名证书,所以需要启用HTTPSOPENPROJECT_HTTPS=true# 必须配置与访问域名一致,且只能配置一个(域名示例,自行修改)OPENPROJECT_HOST__NAME="openproject.xk.com:8899"#以下是无效配置#OPENPROJECT_HOST__NAME="openproject.xk.com:8899,192.168.7.28:8899"#OPENPROJECT_HOST__NAME="*"# 关闭强制浏览器使用httpsOPENPROJECT_HSTS=false# 定义监听端口需要与OPENPROJECT_HOST__NAME保持一致PORT=8899OPENPROJECT_RAILS__RELATIVE__URL__ROOT=IMAP_ENABLED=false# 定义pg的密码#POSTGRES_PASSWORD=yourpassword#如果定义上述密码,需要修改以下的默认密码p4ssw0rdDATABASE_URL=postgres://postgres:p4ssw0rd@db/openproject?pool=20&encoding=unicode&reconnect=trueRAILS_MIN_THREADS=4RAILS_MAX_THREADS=16# postgresql数据库目录PGDATA="/public/application/openproject/postgresql/data"# 文件存储目录OPDATA="/public/application/openproject/assets"
  1. 创建服务对应目录
mkdir-p /public/application/openproject/postgresql/datamkdir-p /public/application/openproject/assets
  1. 修改docker-compose.yml
  • 修改 postgres:17 (默认版本是13,升级为17)
vim/public/application/openproject/docker-compose.yml
......services: db: image: postgres:17<<: *restart_policy stop_grace_period:"3s"volumes: -"${PGDATA:-pgdata}:/var/lib/postgresql/data"environment: POSTGRES_PASSWORD:${POSTGRES_PASSWORD:-p4ssw0rd}POSTGRES_DB: openproject networks: - backend......

导入Docker镜像

  1. 查看images目录下提前导出的镜像(如果可以访问Docker Hub直接拉取镜像,可以跳过导入步骤)
tree.├── autoheal_1.2.0.tar ├── memcached_latest.tar ├── openproject_16-slim.tar ├── postgres_17.tar └── proxy_latest.tar
  1. 导入Docker镜像
docker load -i autoheal_1.2.0.tar docker load -i memcached_latest.tar docker load -i openproject_16-slim.tar docker load -i postgres_17.tar docker load -i proxy_latest.tar
  1. 查看Docker镜像
docker images
# 输出结果 i Info → U In UseIMAGE ID DISK USAGE CONTENT SIZE EXTRA memcached:latest 462fa779babc 127MB34.2MB U openproject/openproject:16-slim 1d26165952bb5.58GB2.72GB U openproject/proxy:latest 390ce999ea0b74.3MB20.1MB U postgres:17 dca7512acaa1 640MB 167MB U willfarrell/autoheal:1.2.0 31f580ef027913.8MB4.31MB U

说明:如果使用代理软件拉取的镜像,需要使用docker tag 命令修改镜像名称,名称需要与docker-compose.yml保持一致

修改工作目录权限

  • 容器需要有操作外部挂载操作系统目录的权限(如果希望使用专用账号运行,可以修改docker compose指定专用账号运行,或修改1000:1000对应的账号)
sudochown1000:1000 -R /public/application/openproject

4. 测试启动OpenProject

测试启动

  • 指定OPENPROJECT_HTTPS=false,临时关闭HTTPS,然后启动服务。关闭是为了测试直接访问服务是否正常
OPENPROJECT_HOST__NAME="192.168.15.96:8899"OPENPROJECT_HTTPS=false docker compose up -d --build
[+]Building23.6s(10/10)FINISHED=>[internal]loadlocalbake definitions0.0s=>=>reading from stdin 581B0.0s=>[internal]load build definition from Dockerfile0.0s=>=>transferring dockerfile: 281B0.0s=>[internal]load metadatafordocker.io/library/caddy:223.1s=>[internal]load .dockerignore0.0s=>=>transferring context: 2B0.0s=>[internal]load build context0.0s=>=>transferring context: 40B0.0s=>[1/3]FROM docker.io/library/caddy:2@sha256:dedfbbeb703b2ce9ff4a98fc06aa9c7c7d9a42f0b7d778738c1dd3ef11dcc7670.0s=>=>resolve docker.io/library/caddy:2@sha256:dedfbbeb703b2ce9ff4a98fc06aa9c7c7d9a42f0b7d778738c1dd3ef11dcc7670.0s=>CACHED[2/3]COPY ./Caddyfile.template /etc/caddy/Caddyfile.template0.0s=>CACHED[3/3]RUNsed's|${APP_HOST}|'"web"'|g'/etc/caddy/Caddyfile.template>/etc/caddy/Caddyfile0.0s=>exporting to image0.1s=>=>exporting layers0.0s=>=>exporting manifest sha256:7babeb6acbfe81a6a07df370523f0e1817d11e741094634ecd8ce8259d1cb88f0.0s=>=>exporting config sha256:34cad2f332c1768c38b39a05bc89838410d369b1566cf929e9c7ec87d7162fd90.0s=>=>exporting attestation manifest sha256:cbd46b34bd570fe7c8a3718f1545fd15510665e958f770cb7375011abddad8b30.0s=>=>exporting manifest list sha256:9eef94d095922b62961dee07148e26a6ac791d353462eb55378a3756816ee9d60.0s=>=>naming to docker.io/openproject/proxy:latest0.0s=>=>unpacking to docker.io/openproject/proxy:latest0.0s=>resolving provenanceformetadatafile0.0s[+]up12/12 ✔ Image openproject/proxy Built23.8s ✔ Network openproject_backend Created0.1s ✔ Network openproject_frontend Created0.1s ✔ Network openproject_default Created0.1s ✔ Container openproject-seeder-1 Created0.1s ✔ Container openproject-cache-1 Created0.1s ✔ Container openproject-autoheal-1 Created0.1s ✔ Container openproject-db-1 Created0.1s ✔ Container openproject-web-1 Created0.0s ✔ Container openproject-worker-1 Created0.0s ✔ Container openproject-cron-1 Created0.0s ✔ Container openproject-proxy-1 Created0.1s
  • 查看容器运行状态
docker composeps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS openproject-cache-1 memcached"docker-entrypoint.s…"cache3days ago Up31hours11211/tcp openproject-cron-1 openproject/openproject:16-slim"./docker/prod/entry…"cron3days ago Up31hours8080/tcp openproject-db-1 postgres:17"docker-entrypoint.s…"db3days ago Up31hours5432/tcp openproject-proxy-1 openproject/proxy"caddy run --config …"proxy3days ago Up31hours443/tcp,2019/tcp,443/udp,0.0.0.0:8899->80/tcp,[::]:8899->80/tcp openproject-web-1 openproject/openproject:16-slim"./docker/prod/entry…"web3days ago Up31hours(healthy)8080/tcp openproject-worker-1 openproject/openproject:16-slim"./docker/prod/entry…"worker3days ago Up31hours8080/tcp
  • 查看容器运行日志
# -n1 查看最后一行日志(可根据需要自行修改)docker compose logs -n1
# 日志中没有错误信息......worker-1|I,[2025-12-16T09:15:00.069321#7] INFO -- : [GoodJob] [7] [GoodJob::Scheduler(queues=* max_threads=20)-thread-33] Executed GoodJob fdd6c446-c40a-43fe-a5ed-56bfe2e3e2fb

访问Web

  • 默认账号 admin
  • 默认密码 admin

5. 配置Nginx代理

配置Nginx代理

  • 编辑虚拟配置文件,负责接收HTTPS请求,并向上游(OpenProject服务)转发HTTP请求
# 定义upstreamupstream proxy_project{# server指令指定后端服务器的IP地址和端口server192.168.15.96:8899;}# HTTPS Serverserver{# 监听端口listen8899ssl;server_name project.xk.com;#return 301 http://$host$request_uri;ssl_certificate /usr/local/nginx/conf/xk-com/xk.com.pem;ssl_certificate_key /usr/local/nginx/conf/xk-com/xk.com.key;ssl_session_cache shared:SSL:30m;ssl_session_timeout 5m;#ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!3DES;ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;ssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers on;add_header Cache-Control no-cache;location /{# 代理转发,服务转发proxy_pass http://proxy_project;client_max_body_size 1000m;#proxy_set_header Host $host;# 设置Host $http_host,向上游服务传递域名:端口proxy_set_header Host$http_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;proxy_set_header Upgrade$http_upgrade;proxy_http_version1.1;proxy_connect_timeout300;proxy_read_timeout300;proxy_send_timeout300;}}

加载配置生效

  • 加载Nginx配置
systemctl reload nginx
  • 查看Nginx服务状态
systemctl status nginx
● nginx.service - nginx - high performance web server Loaded: loaded(/usr/local/nginx1.26.1/nginx.service;linked;vendor preset: disabled)Active: active(running)since 四2025-09-2515:01:04 CST;2months21days ago Docs: http://nginx.org/en/docs/ Process:68645ExecStop=/usr/local/nginx1.26.1/sbin/nginx -s stop(code=exited,status=0/SUCCESS)Process:1454ExecReload=/usr/local/nginx1.26.1/sbin/nginx -s reload -c /usr/local/nginx1.26.1/conf/nginx.conf(code=exited,status=0/SUCCESS)Process:68658ExecStartPost=/bin/sleep0.1(code=exited,status=0/SUCCESS)Process:68653ExecStart=/usr/local/nginx1.26.1/sbin/nginx -c /usr/local/nginx1.26.1/conf/nginx.conf(code=exited,status=0/SUCCESS)Process:68650ExecStartPre=/usr/local/nginx1.26.1/sbin/nginx -t -c /usr/local/nginx1.26.1/conf/nginx.conf(code=exited,status=0/SUCCESS)Main PID:68654(nginx)Tasks:9Memory:35.7M CGroup: /system.slice/nginx.service ├─68654 nginx: master process /usr/local/nginx1.26.1/sbin/nginx -c /usr/local/nginx1.26.1/conf/nginx.conf ├─68655 nginx: worker process ├─68656 nginx: worker process ├─68657 nginx: worker process ├─68659 nginx: worker process ├─68660 nginx: worker process ├─68661 nginx: worker process ├─68662 nginx: worker process └─68663 nginx: worker process

6. 正式启动OpenProject

重启OpenProject服务

  • 停止之前启动的测试服务
cd/public/application/openproject/ docker compose down
  • 使用.env中环境变量启动正式服务(支持域名,支持HTTPS)
cd/public/application/openproject/ docker compose up -d

访问正式OpenProject

  • 访问 https://project.xk.com:8899
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/5 21:20:18

用于氧化石墨烯的多模态表征与激光还原图案化的共聚焦显微技术

氧化石墨烯&#xff08;GO&#xff09;是制备导电还原氧化石墨烯&#xff08;rGO&#xff09;的重要前驱体&#xff0c;在柔性电子、储能等领域应用广泛。激光还原因无掩模、局部精准的优势成为 GO 图案化关键技术&#xff0c;但传统方法难以实时观察还原过程&#xff0c;制约机…

作者头像 李华
网站建设 2026/4/11 16:29:16

3CTEST解析8/20μs冲击电流测试的多样性挑战与冲击电流发生器选型策略

一、冲击电流波简述冲击电流波主要分为两类&#xff1a;第一类为指数波&#xff0c;包括1/20μs、4/10μs、8/20μs、30/80μs、10/350μs、10/1000μs等。第二类为矩形方波&#xff0c;常见冲击方波的峰值持续时间在500μs至3200μs之间。冲击电流发生器是能够产生上述冲击电流…

作者头像 李华
网站建设 2026/4/11 17:46:46

Java计算机毕设之基于javaweb的在线图书借阅管理系统:图书查询、借阅信息、借阅历史(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/3 6:19:28

排序-堆排序

一、堆排序 1.1、堆的基本概念 堆结构是用数组实现的完全二叉树完全二叉树中如果每棵子树的最大值都在顶部就是大根堆—升序完全二叉树中如果每棵子树的最小值都在顶部就是小根堆—降序优先级队列的实现就是堆结构 1.2、完全二叉树的数组表示 每层都是满的或者每层都是从左到右…

作者头像 李华