1. 参考
- 官方安装文档
- OpenProject服务的备份与恢复
2. 环境
设备
- 虚拟机 16C/32G/300G/千兆
系统
- Ubuntu24.04 192.168.15.96
3. 安装OpenProject
采用官方推荐:Docker compose方式安装
官方安装文档
安装Docker
安装步骤,参见Ubuntu24.04 安装Docker
安装OpenProject
- 创建目录
mkdir-p /public/application- 下载源码
cd/public/applicationgitclone https://github.com/opf/openproject-docker-compose.git --depth=1--branch=stable/16 openproject- 配置环境变量
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"- 创建服务对应目录
mkdir-p /public/application/openproject/postgresql/datamkdir-p /public/application/openproject/assets- 修改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镜像
- 查看images目录下提前导出的镜像(如果可以访问Docker Hub直接拉取镜像,可以跳过导入步骤)
tree.├── autoheal_1.2.0.tar ├── memcached_latest.tar ├── openproject_16-slim.tar ├── postgres_17.tar └── proxy_latest.tar- 导入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- 查看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/openproject4. 测试启动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 composepsNAME 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 process6. 正式启动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