Redmine เป็นเครื่องมือการจัดการโครงการบนเว็บฟรีและโอเพนซอร์ส มันเขียนใน Ruby on Rails และสนับสนุนเซิร์ฟเวอร์ฐานข้อมูลหลายตัวสำหรับการจัดเก็บฐานข้อมูล มันเป็นแอพพลิเคชั่นที่เต็มไปด้วยคุณสมบัติที่รองรับหลายโครงการ ACL ตามบทบาทและระบบติดตามปัญหา นอกจากนี้ยังมีแผนภูมิแกนต์และการสนับสนุนปฏิทินการจัดการไฟล์ต่อโครงการวิกิและฟอรัมรวมถึงคุณสมบัติอื่น ๆ อีกมากมาย รองรับระบบควบคุมเวอร์ชันเช่น Git, SVN หรือ CVS นอกจากนี้ยังมีหลายภาษารองรับได้มากถึง 49 ภาษา
ข้อกำหนดเบื้องต้น
- อินสแตนซ์ของเซิร์ฟเวอร์ Vultr Ubuntu 16.04
- sudo ผู้ใช้
- ชื่อโดเมนที่ชี้ไปยังเซิร์ฟเวอร์
สำหรับบทช่วยสอนนี้เราจะใช้192.168.1.1
เป็นที่อยู่ IP สาธารณะและ redmine.example.com
เป็นชื่อโดเมนที่ชี้ไปยังอินสแตนซ์ Vultr โปรดตรวจสอบให้แน่ใจว่าได้แทนที่ชื่อโดเมนและที่อยู่ IP ตัวอย่างทั้งหมดด้วยชื่อจริง
ปรับปรุงระบบฐานของคุณใช้คู่มือวิธีการปรับปรุง Ubuntu 16.04 เมื่อระบบของคุณอัปเดตแล้วให้ดำเนินการติดตั้งการอ้างอิงต่อ
ติดตั้ง Apache
Redmine เขียนด้วย Ruby on Rails ดังนั้นเราจะต้องการ Phusion Passenger เพื่อรวมเข้ากับ Apache เว็บเซิร์ฟเวอร์เพื่อให้บริการแอปพลิเคชัน
ติดตั้ง Apache
sudo apt -y install apache2 apache2-dev libcurl4-openssl-dev
ในการสร้างทับทิมและผู้โดยสารเราจะต้องมีเครื่องมือในการพัฒนาเช่นกัน ติดตั้งเครื่องมือที่จำเป็น
sudo apt -y install imagemagick libmagickwand-dev git build-essential automake libgmp-dev
ติดตั้ง PostgreSQL
Redmine รองรับเซิร์ฟเวอร์ฐานข้อมูลหลายประเภทเช่น MySQL, PostgreSQL และ MSSQL ในบทช่วยสอนนี้เราจะใช้ PostgreSQL เพื่อโฮสต์เซิร์ฟเวอร์ฐานข้อมูล Redmine
PostgreSQL เป็นระบบฐานข้อมูลเชิงวัตถุ ที่เก็บเริ่มต้นของ Ubuntu มี PostgreSQL เวอร์ชันเก่าดังนั้นให้เพิ่มที่เก็บ PostgreSQL ไปยังระบบ
echo "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update
ติดตั้งเซิร์ฟเวอร์ฐานข้อมูล PostgreSQL
sudo apt -y install postgresql
เริ่มต้นเซิร์ฟเวอร์ PostgreSQL และเปิดใช้งานให้เริ่มโดยอัตโนมัติเมื่อบูตเครื่อง
sudo systemctl start postgresql
sudo systemctl enable postgresql
เปลี่ยนรหัสผ่านสำหรับผู้ใช้ PostgreSQL เริ่มต้น
sudo passwd postgres
เข้าสู่ระบบในฐานะผู้ใช้ PostgreSQL
sudo su - postgres
สร้างผู้ใช้ PostgreSQL ใหม่สำหรับ Redmine
createuser redmine
redmine
คุณได้รับอนุญาตให้ใช้ชื่อผู้แทนใด ๆ PostgreSQL จัดเตรียม psql
เชลล์เพื่อรันเคียวรีบนฐานข้อมูล สลับไปที่เชลล์ PostgreSQL
psql
ตั้งรหัสผ่านสำหรับผู้ใช้ที่สร้างขึ้นใหม่สำหรับฐานข้อมูล Redmine
ALTER USER redmine WITH ENCRYPTED password 'DBPassword';
แทนที่ DBPassword
ด้วยรหัสผ่านที่ปลอดภัย สร้างฐานข้อมูลใหม่สำหรับการติดตั้ง Redmine
CREATE DATABASE redmine WITH ENCODING='UTF8' OWNER=redmine;
ออกจาก psql
เปลือก
\q
เปลี่ยนเป็น sudo
ผู้ใช้
exit
ติดตั้งการขึ้นต่อกันของ PostgreSQL ที่จำเป็นเพิ่มเติม
sudo apt -y install libpqxx-dev protobuf-compiler
ติดตั้ง Ruby
เราจะติดตั้ง Ruby เวอร์ชั่นล่าสุดโดยใช้ RVM มันถูกใช้เพื่อติดตั้งและจัดการ Ruby หลายเวอร์ชัน
เพิ่มที่เก็บ RVM
sudo apt-add-repository -y ppa:rael-gc/rvm
sudo apt update
ติดตั้ง RVM
sudo apt -y install rvm
เนื่องจากเราจำเป็นต้องติดตั้งระบบทับทิมกว้างเราจะเปลี่ยนไปใช้ผู้ใช้รูทชั่วคราว
sudo -i
อัพเดตตัวแปรสภาวะแวดล้อม
echo "source /etc/profile.d/rvm.sh" | tee -a /etc/profile
source /etc/profile.d/rvm.sh
ติดตั้ง Ruby เวอร์ชันล่าสุด
rvm install 2.5.1
หมายเหตุ: หากคุณใช้ Ruby เวอร์ชันอื่นตรวจสอบให้แน่ใจว่าได้อัพเดตพา ธ Ruby ตามลำดับ
ใช้ Ruby รุ่นที่ติดตั้งไว้
rvm use 2.5.1 --default
คุณสามารถตรวจสอบรุ่นของมัน
ruby -v
คุณจะเห็นผลลัพธ์ที่คล้ายกัน
root@vultr:~# ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
ติดตั้งbundler
ซึ่งเป็นตัวจัดการการพึ่งพาสำหรับแอปพลิเคชัน Ruby
gem install bundler
ติดตั้ง Ruby แล้ว ก่อนที่เราจะติดตั้ง Redmine เราจะต้องติดตั้ง Phusion Passenger
ติดตั้งผู้โดยสาร
รันคำสั่งต่อไปนี้เพื่อติดตั้ง Passenger
gem install passenger
ติดตั้งโมดูล Apache สำหรับผู้โดยสาร
passenger-install-apache2-module
สคริปต์ตัวติดตั้งจะถามคำถามคุณ ก่อนอื่นจะให้ข้อมูลเกี่ยวกับกระบวนการติดตั้ง จากนั้นจะขอให้คุณเลือกภาษาที่คุณจะใช้ เนื่องจากแอปพลิเคชันของเราเขียนด้วย Ruby on Rails ให้เลือก Ruby จากเมนูและกดENTERเพื่อดำเนินการต่อไป
Which languages are you interested in?
Use <space> to select.
If the menu doesn't display correctly, press '!'
‣ ⬢ Ruby
⬢ Python
⬡ Node.js
⬡ Meteor
โปรแกรมติดตั้งจะตรวจสอบข้อกำหนดต่างๆ โปรแกรมติดตั้งจะไม่พบการพึ่งพาที่ขาดหายไปและจะดำเนินการรวบรวมและติดตั้งโมดูลโดยอัตโนมัติ
เมื่อติดตั้งโมดูลแล้วจะแจ้งให้คุณเพิ่มโมดูลลงในไฟล์กำหนดค่า Apache
Almost there!
Please edit your Apache configuration file, and add these lines:
LoadModule passenger_module /usr/share/rvm/gems/ruby-2.5.1/gems/passenger-5.2.3/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
PassengerRoot /usr/share/rvm/gems/ruby-2.5.1/gems/passenger-5.2.3
PassengerDefaultRuby /usr/share/rvm/gems/ruby-2.5.1/wrappers/ruby
</IfModule>
After you restart Apache, you are ready to deploy any number of web
applications on Apache, with a minimum amount of configuration!
Press ENTER when you are done editing.
เราจะข้ามสิ่งนี้ไปก่อนและจะทำให้เสร็จในภายหลังในบทช่วยสอน กดENTERเพื่อข้ามขั้นตอนนี้
สุดท้ายสคริปต์ติดตั้งจะตรวจสอบการติดตั้งและคุณจะเห็นคำเตือนว่าโมดูลผู้โดยสารไม่ได้ระบุในการกำหนดค่า Apache
Validating installation...
* Checking whether this Passenger install is in PATH... ✓
* Checking whether there are no other Passenger installations... ✓
* Checking whether Apache is installed... ✓
* Checking whether the Passenger module is correctly configured in Apache... (!)
You did not specify 'LoadModule passenger_module' in any of your Apache
configuration files. Please paste the configuration snippet that this
installer printed earlier, into one of your Apache configuration files, such
as /etc/apache2/apache2.conf.
Detected 0 error(s), 1 warning(s).
Press ENTER to continue.
ตอนนี้เราได้ติดตั้งโมดูลผู้โดยสารสำหรับ Apache ดำเนินการดาวน์โหลดและติดตั้ง Redmine เปลี่ยนเป็นsudo
ผู้ใช้อีกครั้งเนื่องจากเราไม่จำเป็นต้องเรียกใช้คำสั่งเพิ่มเติมโดยใช้root
ผู้ใช้
exit
ติดตั้ง Redmine
ขอแนะนำให้ใช้ผู้ใช้ที่ไม่มีสิทธิพิเศษเพื่อเรียกใช้แอปพลิเคชันเพื่อป้องกันไม่ให้ระบบหยุดทำงาน สร้างผู้ใช้ใหม่สำหรับ Redmine และเปลี่ยนเป็นผู้ใช้ที่สร้างขึ้นใหม่
sudo adduser --disabled-password --gecos "Redmine User" redmine
sudo su - redmine
ดาวน์โหลดรุ่นล่าสุดของ Redmine อย่างเป็นทางการจากหน้า Redmine ดาวน์โหลด
cd ~
wget http://www.redmine.org/releases/redmine-3.4.4.tar.gz
แตกไฟล์เก็บถาวรและเปลี่ยนชื่อไดเร็กทอรีเพื่อความสะดวก
tar -xf redmine-*.tar.gz
mv redmine-*/ redmine/
คัดลอกไฟล์คอนฟิกูเรชันตัวอย่างไปยังตำแหน่งที่ใช้งานจริง
cd redmine
cp config/configuration.yml.example config/configuration.yml
cp config/database.yml.example config/database.yml
เปิดไฟล์การกำหนดค่าฐานข้อมูลที่เราเพิ่งคัดลอกเพื่อป้อนรายละเอียดฐานข้อมูล
nano config/database.yml
โดยค่าเริ่มต้นไฟล์ฐานข้อมูลจะถูกกำหนดค่าสำหรับ MySQL ค้นหาการกำหนดค่าสำหรับการผลิตและการพัฒนาและทดสอบที่ใช้อะแดปเตอร์ MySQL ใส่เครื่องหมายบรรทัดทั้งหมดเหล่านี้
#production:
# adapter: mysql2
# database: redmine
# host: localhost
# username: root
# password: ""
# encoding: utf8
#development:
# adapter: mysql2
# database: redmine_development
# host: localhost
# username: root
# password: ""
# encoding: utf8
#test:
# adapter: mysql2
# database: redmine_test
# host: localhost
# username: root
# password: ""
# encoding: utf8
อีกต่อไปค้นหาบรรทัดที่ถูกคอมเม้นต์โดยมี production
การกำหนดค่าสำหรับ postgresql
อะแดปเตอร์ ยกเลิกหมายเหตุบรรทัดเหล่านั้นและอัพเดตชื่อฐานข้อมูลและข้อมูลรับรองผู้ใช้ ตรวจสอบให้แน่ใจว่าใช้การเยื้องที่ถูกต้องซึ่งเป็นช่องว่างสองช่อง
production:
adapter: postgresql
database: redmine
host: localhost
username: redmine
password: "DBPassword"
กำหนดค่าแอปพลิเคชันเพื่อใช้การกำหนดค่า PostgreSQL
bundle config build.pg --with-pg-config=/usr/bin/pg_config
ติดตั้งการพึ่งพาที่แอปพลิเคชันต้องการ
bundle install --path vendor/bundle --without development test
คุณจะเห็นข้อความต่อไปนี้ในตอนท้ายของการติดตั้ง
Installing roadie-rails 1.1.1
Bundle complete! 31 Gemfile dependencies, 55 gems now installed.
Gems in the groups development and test were not installed.
Bundled gems are installed into `./vendor/bundle`
คำสั่งต่อไปนี้สร้างโทเค็นลับที่ใช้ในการเข้ารหัสข้อมูลเซสชัน
bundle exec rake generate_secret_token
เขียนฐานข้อมูล PostgreSQL
RAILS_ENV=production bundle exec rake db:migrate
เรียกใช้คำสั่งต่อไปนี้ซึ่งเขียนข้อมูลเริ่มต้นลงในฐานข้อมูล PostgreSQL
RAILS_ENV=production bundle exec rake redmine:load_default_data
คำสั่งด้านบนจะขอให้คุณเลือกภาษาเริ่มต้นที่จะใช้กับแอปพลิเคชัน ตัวเลือกเริ่มต้นคือภาษาอังกฤษ เลือกตามความต้องการของคุณ
[redmine@vultr redmine]$ RAILS_ENV=production bundle exec rake redmine:load_default_data
Select language: ar, az, bg, bs, ca, cs, da, de, el, en, en-GB, es, es-PA, et, eu, fa, fi, fr, gl, he, hr, hu, id, it, ja, ko, lt, lv, mk, mn, nl, no, pl, pt, pt-BR, ro, ru, sk, sl, sq, sr, sr-YU, sv, th, tr, uk, vi, zh, zh-TW [en]
====================================
Default configuration data loaded.
การติดตั้งแอปพลิเคชัน Redmine เสร็จสมบูรณ์แล้ว เปลี่ยนความเป็นเจ้าของและสิทธิ์ของไดเรกทอรีและไฟล์
mkdir -p tmp tmp/pdf public/plugin_assets
chown -R redmine:redmine files log tmp public/plugin_assets
chmod -R 755 files log tmp public/plugin_assets
เราได้กำหนดค่าทุกสิ่งที่เราต้องการจากผู้ใช้ที่ไม่มีสิทธิพิเศษ สลับกลับไปยัง ผู้ใช้โดยการเรียกใช้sudo
su - <username>
เพิ่มโมดูลผู้โดยสารสำหรับ Apache ลงในไฟล์กำหนดค่า Apache นี่จะโหลดโมดูลผู้โดยสารโดยอัตโนมัติ
echo "LoadModule passenger_module /usr/share/rvm/gems/ruby-2.5.1/gems/passenger-5.2.3/buildout/apache2/mod_passenger.so" | sudo tee -a /etc/apache2/apache2.conf
หมายเหตุ: เส้นทางไปยังโมดูลผู้โดยสารอาจเปลี่ยนแปลงได้เมื่อมีผู้โดยสารรุ่นใหม่ ในการค้นหาพา ธ ไปยังโมดูลให้ใช้sudo find / -name mod_passenger.so
คำสั่ง
สร้างไฟล์โฮสต์เสมือนใหม่สำหรับแอปพลิเคชัน Redmine ของคุณ
sudo nano /etc/apache2/sites-available/redmine.conf
เติมไฟล์ด้วยเนื้อหาต่อไปนี้
<VirtualHost *:80>
ServerName redmine.example.com
DocumentRoot /home/redmine/redmine/public
PassengerRoot /usr/share/rvm/gems/ruby-2.5.1/gems/passenger-5.2.3
PassengerDefaultRuby /usr/share/rvm/gems/ruby-2.5.1/wrappers/ruby
PassengerUser redmine
<Directory /home/redmine/redmine/public>
Allow from all
Options -MultiViews
Require all granted
</Directory>
</VirtualHost>
ตรวจสอบให้แน่ใจว่าได้แทนที่ redmine.example.com
ด้วยชื่อโดเมนจริงของคุณ นอกจากนี้ตรวจสอบให้แน่ใจว่าเส้นทางไปยัง PassengerRoot
และ PassengerDefaultRuby
ถูกต้อง เส้นทางไปสู่ไบนารีอาจเปลี่ยนแปลงเมื่อมี Ruby หรือ Passenger รุ่นใหม่ ในการค้นหาพา ธ เหล่านี้ให้รันคำสั่งต่อไปนี้
passenger-config about ruby-command
คุณจะได้รับผลลัพธ์ต่อไปนี้
user@vultr:~$ passenger-config about ruby-command
passenger-config was invoked through the following Ruby interpreter:
Command: /usr/share/rvm/gems/ruby-2.5.1/wrappers/ruby
Version: ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
To use in Apache: PassengerRuby /usr/share/rvm/gems/ruby-2.5.1/wrappers/ruby
To use in Nginx : passenger_ruby /usr/share/rvm/gems/ruby-2.5.1/wrappers/ruby
To use with Standalone: /usr/share/rvm/gems/ruby-2.5.1/wrappers/ruby /usr/share/rvm/gems/ruby-2.5.1/gems/passenger-5.2.3/bin/passenger start
## Notes for RVM users
Do you want to know which command to use for a different Ruby interpreter? 'rvm use' that Ruby interpreter, then re-run 'passenger-config about ruby-command'.
เมื่อไฟล์โฮสต์เสมือนถูกสร้างขึ้น เปิดใช้งานการกำหนดค่า
sudo a2ensite redmine
รีสตาร์ทเว็บเซิร์ฟเวอร์ Apache
sudo systemctl restart apache2
ตอนนี้คุณสามารถเข้าถึงส่วนต่อประสาน Redmine ของคุณ http://redmine.example.com
ได้แล้ว เข้าสู่ระบบด้วยชื่อผู้ใช้ และรหัสผ่านadmin
admin
เมื่อล���ชื่อเข้าใช้ครั้งแรก Redmine จะแจ้งให้คุณอัปเดตรหัสผ่าน
การรักษาความปลอดภัย Apache ด้วย Let's Encrypt SSL
เนื่องจากการติดตั้ง Redmine ของเราอยู่บนเซิร์ฟเวอร์สาธารณะดังนั้นเราขอแนะนำให้ใช้ SSL เพื่อความปลอดภัยในการแลกเปลี่ยนข้อมูลจากเซิร์ฟเวอร์
เพิ่มที่เก็บ Certbot
sudo add-apt-repository --yes ppa:certbot/certbot
sudo apt-get update
ติดตั้ง Certbot ซึ่งเป็นแอปพลิเคชันไคลเอนต์สำหรับ Let's Encrypt CA
sudo apt -y install certbot
หมายเหตุ: ในการรับใบรับรองจาก Let's Encrypt CA โดเมนที่จะสร้างใบรับรองนั้นจะต้องชี้ไปที่เซิร์ฟเวอร์ หากไม่มีให้ทำการเปลี่ยนแปลงที่จำเป็นกับระเบียน DNS ของโดเมนและรอให้ DNS เผยแพร่ก่อนทำการขอใบรับรองอีกครั้ง Certbot ตรวจสอบอำนาจโดเมนก่อนที่จะให้ใบรับรอง
สร้างใบรับรอง SSL
sudo certbot certonly --webroot -w /home/redmine/redmine/public -d redmine.example.com
/etc/letsencrypt/live/redmine.example.com/
ใบรับรองที่สร้างขึ้นมีแนวโน้มที่จะถูกเก็บไว้ใน ใบรับรอง SSL จะถูกเก็บไว้เป็น และคีย์ส่วนตัวจะถูกเก็บไว้เป็นcert.pem
privkey.pem
ลองเข้ารหัสใบรับรองหมดอายุใน 90 วันดังนั้นขอแนะนำให้ตั้งค่าการต่ออายุใบรับรองโดยอัตโนมัติโดยใช้งาน Cron
เปิดไฟล์งาน Cron สำหรับ root
ผู้ใช้
sudo crontab -e
เพิ่มบรรทัดต่อไปนี้ที่ท้ายไฟล์
30 5 * * * /usr/bin/certbot renew --quiet
งาน Cron ด้านบนจะทำงานทุกวันเวลา 5.30 น. หากใบรับรองถึงกำหนดหมดอายุจะมีการต่ออายุโดยอัตโนมัติ
เปิดใช้งานโมดูล SSL สำหรับ Apache
sudo a2enmod ssl
แก้ไขไฟล์โฮสต์เสมือนที่เราสร้างไว้ก่อนหน้านี้สำหรับ Redmine
sudo nano /etc/apache2/sites-available/redmine.conf
แก้ไขไฟล์โฮสต์เสมือนให้เหมือนดังต่อไปนี้
<VirtualHost *:80>
ServerName redmine.example.com
Redirect permanent / https://redmine.example.com/
</VirtualHost>
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName redmine.example.com
DocumentRoot "/home/redmine/redmine/public"
<Directory "/home/redmine/redmine/public">
Options None
Require all granted
</Directory>
PassengerAppEnv production
PassengerRoot /usr/share/rvm/gems/ruby-2.5.1/gems/passenger-5.2.3
PassengerDefaultRuby /usr/share/rvm/gems/ruby-2.5.1/wrappers/ruby
PassengerUser redmine
PassengerHighPerformance on
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/redmine.example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/redmine.example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/redmine.example.com/chain.pem
SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
<IfModule headers_module>
Header always edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains"
</IfModule>
</VirtualHost>
บันทึกไฟล์และออกจากตัวแก้ไข
รีสตาร์ท Apache เพื่อให้การเปลี่ยนแปลงมีผล
sudo systemctl restart apache2
ขณะนี้คุณสามารถเข้าถึง Redmine กว่า ที่HTTPS
https://redmine.example.com
ยินดีด้วยคุณติดตั้ง Redmine บนอินสแตนซ์ Ubuntu 16.04 เรียบร้อยแล้ว เริ่มพัฒนาโครงการของคุณโดยสร้างหรือนำเข้าโครงการของคุณ