Skip to main content

Installation

Prerequisites

System Requirements

  • Operating System: Ubuntu 22.04 LTS, CentOS 8+, RHEL 8+, Debian 11+

  • Memory: Minimum 4GB RAM (8GB+ recommended for production)

  • Storage: Minimum 10GB free space (SSD recommended)

  • CPU: 2+ cores (4+ cores recommended)

  • Network: HTTP/HTTPS access

Software Dependencies

bash

# Update system
sudo apt update && sudo apt upgrade -y
# Install required packages
sudo apt install -y curl wget gnupg2 software-properties-common \
build-essential git postgresql postgresql-contrib \
redis-server nginx certbot python3-certbot-nginx
# Install Node.js (for frontend build)
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
# Install Ruby (via rbenv)
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-installer | bash
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc
rbenv install 3.2.0
rbenv global 3.2.0

Installation Methods

bash

# Add OpenProject repository
wget -qO- https://dl.packager.io/srv/opf/openproject/key | sudo apt-key add -
echo "deb https://dl.packager.io/srv/opf/openproject/stable/15/ubuntu/22.04 ./" | sudo tee /etc/apt/sources.list.d/openproject.list
# Update package list
sudo apt update
# Install OpenProject
sudo apt install openproject
# Run configuration wizard
sudo openproject configure

Docker Installation

bash


# Create docker-compose.yml
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
openproject:
image: openproject/openproject:15.0.0
container_name: openproject
restart: unless-stopped
ports:
- "8080:80"
environment:
- OPENPROJECT_SECRET_KEY_BASE=$(openssl rand -hex 32)
- OPENPROJECT_HOST__NAME=localhost:8080
- OPENPROJECT_HTTPS=false
- DATABASE_URL=postgresql://openproject:openproject@db:5432/openproject
- REDIS_URL=redis://redis:6379
volumes:
- ./data/openproject:/var/openproject/assets
- ./data/logs:/var/log/openproject
depends_on:
- db
- redis
db:
image: postgres:15
container_name: openproject-db
restart: unless-stopped
environment:
- POSTGRES_DB=openproject
- POSTGRES_USER=openproject
- POSTGRES_PASSWORD=openproject
volumes:
- ./data/postgresql:/var/lib/postgresql/data
redis:
image: redis:7-alpine
container_name: openproject-redis
restart: unless-stopped
volumes:
- ./data/redis:/data
volumes:
openproject_data:
postgresql_data:
redis_data:
EOF
# Start services
docker-compose up -d

Manual Installation

bash


# Create openproject user
sudo useradd -m -d /home/openproject -s /bin/bash openproject
# Switch to openproject user
sudo su - openproject
# Clone repository
git clone https://github.com/opf/openproject.git --branch v15.0.0 --depth 1
cd openproject
# Install Ruby dependencies
gem install bundler
bundle install --deployment --without development test
# Install Node.js dependencies
npm install
# Setup database
sudo -u postgres createuser -d openproject
sudo -u postgres createdb openproject -O openproject
# Configure database
cp config/database.yml.example config/database.yml
# Edit database configuration
# Run database migrations
RAILS_ENV=production bundle exec rake db:create db:migrate db:seed
# Precompile assets
RAILS_ENV=production bundle exec rake assets:precompile
# Create systemd service
sudo tee /etc/systemd/system/openproject.service << 'EOF'
[Unit]
Description=OpenProject
After=network.target
[Service]
Type=simple
User=openproject
Group=openproject
WorkingDirectory=/home/openproject/openproject
Environment=RAILS_ENV=production
Environment=PORT=3000
ExecStart=/home/openproject/.rbenv/shims/bundle exec puma -C config/puma.rb
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
# Enable and start service
sudo systemctl daemon-reload
sudo systemctl enable openproject
sudo systemctl start openproject

Post-Installation Configuration

Database Setup

bash


# PostgreSQL configuration
sudo -u postgres psql
CREATE DATABASE openproject;
CREATE USER openproject WITH ENCRYPTED PASSWORD 'secure_password';
GRANT ALL PRIVILEGES ON DATABASE openproject TO openproject;
ALTER USER openproject CREATEDB;
\q
# Optimize PostgreSQL for OpenProject
sudo tee -a /etc/postgresql/15/main/postgresql.conf << 'EOF'
# OpenProject optimizations
shared_buffers = 256MB
effective_cache_size = 1GB
work_mem = 16MB
maintenance_work_mem = 128MB
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 100
random_page_cost = 1.1
effective_io_concurrency = 200
EOF
sudo systemctl restart postgresql

Web Server Configuration

bash



# Nginx configuration
sudo tee /etc/nginx/sites-available/openproject << 'EOF'
upstream openproject {
server 127.0.0.1:3000;
}
server {
listen 80;
server_name your-domain.com;
client_max_body_size 100M;
location / {
proxy_pass http://openproject;
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;
proxy_read_timeout 600s;
proxy_connect_timeout 600s;
proxy_send_timeout 600s;
}
location ~ /\.well-known {
allow all;
}
}
EOF
# Enable site
sudo ln -s /etc/nginx/sites-available/openproject /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

SSL Certificate Setup

bash



# Install Let's Encrypt certificate
sudo certbot --nginx -d your-domain.com
# Auto-renewal
sudo crontab -e
# Add: 0 12 * * * /usr/bin/certbot renew --quiet