从零到一:手把手教你用Docker Compose在Linux服务器上部署Jira Data Center(含Nginx反向代理配置)

在当今快节奏的软件开发环境中,一个可靠的项目管理平台已经成为团队协作的基石。Jira Data Center作为Atlassian推出的企业级解决方案,不仅继承了Jira强大的敏捷项目管理功能,更通过集群部署实现了高可用性和水平扩展能力。对于追求稳定性和可控性的技术团队而言,自建Jira Data Center服务无疑是最佳选择。

本文将带你从零开始,使用Docker Compose在Linux服务器上完整部署一套生产级Jira Data Center环境。不同于简单的单机安装教程,我们将重点解决三个核心问题:如何通过容器化技术简化复杂组件的依赖管理、如何配置Nginx实现安全的反向代理和负载均衡、以及如何针对企业级应用进行基础性能调优。整个部署过程基于Ubuntu 20.04 LTS,但同样适用于其他主流Linux发行版。

1. 环境准备与架构设计

在开始部署前,我们需要明确整个系统的架构组成。一个完整的Jira Data Center部署包含以下核心组件:

  • 应用节点集群:运行Jira应用的Docker容器组,至少需要两个节点实现高可用
  • 共享数据库:PostgreSQL数据库服务,建议使用独立服务器
  • 共享文件存储:NFS或云存储,用于存放附件和索引
  • 负载均衡层:Nginx反向代理,处理SSL终止和请求分发

1.1 服务器资源配置建议

根据Atlassian官方推荐的生产环境要求,我们建议以下最低配置:

组件类型CPU核心内存存储空间网络带宽
Jira应用节点4核8GB50GB1Gbps
PostgreSQL数据库4核16GB500GB1Gbps
NFS存储服务器2核4GB1TB1Gbps

注意:以上配置适用于中小型团队(50-100用户)。更大规模的部署需要按比例增加资源,特别是数据库服务器的内存和存储。

1.2 系统依赖安装

在所有节点上执行以下基础环境准备:

# 更新系统并安装基础工具
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y docker.io docker-compose nfs-common

# 配置Docker守护进程(所有节点)
sudo tee /etc/docker/daemon.json <<EOF
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
EOF

# 重启Docker服务
sudo systemctl restart docker

2. PostgreSQL数据库配置

Jira支持多种数据库后端,但PostgreSQL因其性能和可靠性成为生产环境的首选。以下是数据库服务器的专用配置:

2.1 优化PostgreSQL参数

创建自定义配置文件/etc/postgresql/13/main/conf.d/jira.conf

# 连接和认证
max_connections = 300
shared_buffers = 4GB
work_mem = 16MB

# 查询优化
random_page_cost = 1.1
effective_cache_size = 12GB
maintenance_work_mem = 1GB

# WAL和复制
wal_level = replica
synchronous_commit = off

2.2 创建专用数据库和用户

通过Docker Compose部署PostgreSQL服务:

# docker-compose.db.yml
version: '3.8'
services:
  postgres:
    image: postgres:13
    container_name: jira_postgres
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: jira_user
      POSTGRES_DB: jira_db
    volumes:
      - pg_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    restart: unless-stopped
volumes:
  pg_data:

启动数据库服务前,记得在.env文件中设置DB_PASSWORD环境变量:

echo "DB_PASSWORD=your_secure_password" > .env
docker-compose -f docker-compose.db.yml up -d

3. Jira Data Center容器化部署

3.1 准备共享存储

在NFS服务器上创建共享目录并配置权限:

# NFS服务器执行
sudo mkdir -p /data/jira/shared
sudo chown -R 2001:2001 /data/jira/shared

在各应用节点挂载此共享目录:

echo "nfs-server-ip:/data/jira/shared /var/jira/shared nfs defaults 0 0" | sudo tee -a /etc/fstab
sudo mkdir -p /var/jira/shared
sudo mount -a

3.2 Docker Compose编排配置

创建主部署文件docker-compose.jira.yml

version: '3.8'
services:
  jira-node1:
    image: atlassian/jira-software:9.4.0
    container_name: jira_node1
    environment:
      - JIRA_HOME=/var/atlassian/application-data/jira
      - JIRA_PROXY_NAME=jira.yourdomain.com
      - JIRA_PROXY_PORT=443
      - JIRA_PROXY_SCHEME=https
    volumes:
      - /var/jira/shared:/var/atlassian/application-data/jira/shared
      - jira_local1:/var/atlassian/application-data/jira/local
    ports:
      - "8081:8080"
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/status"]
      interval: 30s
      timeout: 10s
      retries: 3

  jira-node2:
    image: atlassian/jira-software:9.4.0
    container_name: jira_node2
    environment:
      - JIRA_HOME=/var/atlassian/application-data/jira
      - JIRA_PROXY_NAME=jira.yourdomain.com
      - JIRA_PROXY_PORT=443
      - JIRA_PROXY_SCHEME=https
    volumes:
      - /var/jira/shared:/var/atlassian/application-data/jira/shared
      - jira_local2:/var/atlassian/application-data/jira/local
    ports:
      - "8082:8080"
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/status"]
      interval: 30s
      timeout: 10s
      retries: 3

volumes:
  jira_local1:
  jira_local2:

3.3 初始化Jira集群

启动服务后,通过浏览器访问任一节点完成初始配置:

  1. 选择"Data Center"部署模式
  2. 配置数据库连接:
    • 数据库类型:PostgreSQL
    • 主机:postgres容器IP或主机名
    • 端口:5432
    • 数据库名:jira_db
    • 用户名:jira_user
    • 密码:your_secure_password
  3. 设置集群名称和共享目录路径(/var/atlassian/application-data/jira/shared)
  4. 完成管理员账户配置

4. Nginx反向代理与SSL配置

4.1 安装Certbot获取SSL证书

sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot certonly --standalone -d jira.yourdomain.com

4.2 Nginx负载均衡配置

创建/etc/nginx/conf.d/jira.conf

upstream jira_backend {
    zone jira 64k;
    server 127.0.0.1:8081 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:8082 max_fails=3 fail_timeout=30s;
    keepalive 32;
}

server {
    listen 443 ssl http2;
    server_name jira.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/jira.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/jira.yourdomain.com/privkey.pem;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256...';
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    location / {
        proxy_pass http://jira_backend;
        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;
        
        # WebSocket支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        # 超时设置
        proxy_connect_timeout 300s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;
        send_timeout 300s;
    }

    # 静态资源缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 1y;
        add_header Cache-Control "public, no-transform";
        proxy_pass http://jira_backend;
    }
}

4.3 性能优化参数

在Nginx主配置/etc/nginx/nginx.conf中添加以下全局优化参数:

worker_processes auto;
worker_rlimit_nofile 65535;

events {
    worker_connections 4096;
    multi_accept on;
    use epoll;
}

http {
    # 其他现有配置...
    client_max_body_size 100M;
    keepalive_timeout 75s;
    keepalive_requests 1000;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
}

5. 生产环境调优与维护

5.1 Jira性能参数调整

修改$JIRA_HOME/jira-config.properties

# 连接池配置
jira.pool.max.size=60
jira.pool.min.idle=10
jira.pool.max.idle=30

# 缓存设置
jira.lucene.optimize.interval=86400
jira.delay.indexing=true

# 异步任务
jira.async.task.thread.pool.size=20
jira.mail.thread.pool.size=10

5.2 定期维护任务

创建维护脚本/usr/local/bin/jira-maintenance.sh

#!/bin/bash
# 数据库备份
docker exec jira_postgres pg_dump -U jira_user -d jira_db -Fc > /backups/jira_db_$(date +%Y%m%d).dump

# 索引优化
curl -u admin:password -X POST "http://localhost:8080/rest/api/2/reindex"

# 日志轮转
find /var/lib/docker/containers -name "*.log" -size +100M -exec truncate -s 50M {} \;

设置cron任务每周执行:

0 2 * * 6 /usr/local/bin/jira-maintenance.sh >> /var/log/jira_maintenance.log 2>&1

5.3 监控与告警配置

推荐使用Prometheus+Grafana监控以下关键指标:

  • 应用层:活跃用户数、请求响应时间、错误率
  • 系统层:CPU/内存使用率、磁盘I/O、网络吞吐量
  • Jira特有:索引延迟、数据库查询时间、缓存命中率

示例Prometheus配置:

scrape_configs:
  - job_name: 'jira'
    metrics_path: '/monitoring/metrics'
    static_configs:
      - targets: ['jira-node1:8080', 'jira-node2:8080']
    basic_auth:
      username: 'monitor_user'
      password: 'secure_password'

更多推荐