BESTNET Tech Blog
BESTNET-CLOUD पर Redmine बनाने के स्टेप्स #
Redmine 6.1 सीरीज़ लॉन्च करने के लिए
Ubuntu 24.04 / Apache + Passenger / PostgreSQL / HTTPS सर्वर सेटअप गाइड
यह लेख BESTNET-CLOUD पर प्रोविज़न की गई Ubuntu 24.04 LTS वर्चुअल मशीन पर Redmine बनाने के स्टेप्स बताता है,
उस बिंदु तक जहाँ आप पहली बार ब्राउज़र से लॉगिन कर सकते हैं।
LDAP/LDAPS इंटीग्रेशन, external SMTP और Zabbix इंटीग्रेशन आगे आने वाले अलग लेखों में कवर किए जाएँगे।
यह गाइड एक स्थिर Redmine सर्वर पूरा करने पर केंद्रित है जो लॉगिन स्क्रीन भरोसेमंद ढंग से दिखा सके।
इस गाइड का लक्ष्य #
एंडपॉइंट #
Redmine लॉगिन स्क्रीन HTTPS पर दिखती है और आप पहली बार एडमिनिस्ट्रेटर के रूप में लॉगिन कर पाते हैं।
इस बार का स्कोप #
OS का शुरुआती सेटअप, Redmine डिप्लॉयमेंट, DB इनिशियलाइज़ेशन, Apache + Passenger और self-signed SSL।
अगले कदम #
AD / LDAPS, external SMTP, Zabbix agent डिप्लॉयमेंट और मॉनिटरिंग इंटीग्रेशन अलग से किए जाएँगे।
आर्किटेक्चर ओवरव्यू #
| OS | Ubuntu Server 24.04 LTS |
|---|---|
| Web/AP | Apache + Passenger |
| DB | PostgreSQL |
| Redmine | 6.1.1 |
| Ruby | Ubuntu 24.04 में शामिल Ruby 3.2 सीरीज़ |
| पब्लिकेशन का तरीका | 80 → 443 रीडायरेक्ट, 443 self-signed सर्टिफिकेट के साथ listen करता है |
| डिप्लॉयमेंट लोकेशन | /opt/redmine/releases/redmine-6.1.1 |
वेरिफिकेशन की आसानी के लिए यह लेख self-signed सर्टिफिकेट इस्तेमाल करता है।
प्रोडक्शन एनवायरनमेंट के लिए हम कमर्शियल या internal CA सर्टिफिकेट से बदलने की सिफारिश करते हैं।
Step 1. OS अपडेट और आवश्यक पैकेजों का इंस्टॉलेशन #
सबसे पहले, OS को लेटेस्ट वर्शन में अपडेट करें और Redmine बिल्ड तथा PostgreSQL कनेक्शन के लिए जरूरी पैकेज एक साथ इंस्टॉल करें।libyaml-dev को शामिल करना न भूलें।
sudo apt update
sudo apt full-upgrade -y
sudo apt install -y \
build-essential \
ruby-full ruby-dev bundler \
zlib1g-dev libpq-dev libyaml-dev pkg-config \
postgresql postgresql-contrib \
apache2 apache2-dev \
imagemagick ghostscript \
curl ca-certificates gnupg dirmngr apt-transport-https \
ldap-utils tar
Step 2. Passenger इंस्टॉलेशन #
ऑफिशियल Passenger रिपॉज़िटरी जोड़ें और उसे Apache मॉड्यूल के रूप में इंस्टॉल करें।
curl https://oss-binaries.phusionpassenger.com/auto-software-signing-gpg-key-2025.txt \
| gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/phusion.gpg >/dev/null
echo "deb https://oss-binaries.phusionpassenger.com/apt/passenger noble main" \
| sudo tee /etc/apt/sources.list.d/passenger.list
sudo apt update
sudo apt install -y passenger libapache2-mod-passenger
sudo a2enmod passenger
sudo a2enconf servername
echo "ServerName rdm.bestnetllc.co.jp" | sudo tee /etc/apache2/conf-available/servername.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
निम्न से ऑपरेशन वेरिफाई करें:
sudo /usr/bin/passenger-config validate-install
sudo /usr/sbin/passenger-memory-stats
Step 3. Redmine यूज़र और डिप्लॉयमेंट डायरेक्टरी की तैयारी #
अपग्रेड आसान बनाने के लिए releases डायरेक्टरी वाले तरीके से डिप्लॉय करें।
sudo adduser --system --group --home /opt/redmine --shell /bin/bash redmine
sudo mkdir -p /opt/redmine/releases
sudo chown -R redmine:redmine /opt/redmine
Step 4. PostgreSQL सेटअप #
Redmine के लिए एक डेडिकेटेड role और database बनाएँ।
sudo -u postgres psql
CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD '<DB_PASSWORD>' NOINHERIT VALID UNTIL 'infinity';
CREATE DATABASE redmine WITH ENCODING='UTF8' OWNER=redmine;
\q
Step 5. Redmine सोर्स कोड डिप्लॉयमेंट #
यह उदाहरण वर्शन 6.1.1 इस्तेमाल करता है। मेंटेनेंस रिलीज़ के हिसाब से जरूरत अनुसार बदलें।
cd /tmp
curl -L -o redmine-6.1.1.tar.gz https://www.redmine.org/releases/redmine-6.1.1.tar.gz
sudo -u redmine tar xzf redmine-6.1.1.tar.gz -C /opt/redmine/releases
sudo ln -sfn /opt/redmine/releases/redmine-6.1.1 /opt/redmine/current
Step 6. database.yml कॉन्फ़िगरेशन #
यह एक आम pitfall है। केवल PostgreSQL डेफिनिशन रखें और MySQL सैंपल हटा दें।
cd /opt/redmine/releases/redmine-6.1.1
sudo tee config/database.yml > /dev/null <<'EOF'
production:
adapter: postgresql
database: redmine
host: localhost
username: redmine
password: "<DB_PASSWORD>"
encoding: utf8
schema_search_path: public
EOF
एन्क्रिप्शन keys के लिए configuration.yml भी तैयार करें।
sudo -u redmine cp config/configuration.yml.example config/configuration.yml
default:
database_cipher_key: "<LONG_RANDOM_STRING>"
production:
Step 7. bundle install और डेटाबेस इनिशियलाइज़ेशन #
gem इंस्टॉलेशन, secret जनरेशन, डेटाबेस माइग्रेशन और शुरुआती डेटा लोडिंग एक्सीक्यूट करें।
sudo chown -R redmine:redmine /opt/redmine
sudo -u redmine -H bash -lc '
cd /opt/redmine/releases/redmine-6.1.1
rm -rf vendor/bundle
bundle config set --local path vendor/bundle
bundle config set --local without "development test"
bundle install
bundle exec rake generate_secret_token
RAILS_ENV=production bundle exec rake db:migrate
RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data
'
अगर
yaml.h not found दिखे, तो libyaml-dev मौजूद नहीं है।अगर bundle टार्गेट्स में
mysql2 दिखे, तो संभवतः MySQL कॉन्फ़िगरेशनconfig/database.yml में बचा रह गया है।Step 8. Self-Signed सर्टिफिकेट बनाना #
यह उदाहरण CA:FALSE और SAN के साथ self-signed सर्टिफिकेट बनाता है।
पुराने तरीकों की तुलना में यह तरीका ब्राउज़र और Apache की ज्यादा वार्निंग से बचाता है।
sudo mkdir -p /etc/apache2/ssl
sudo tee /tmp/rdm-openssl.cnf > /dev/null <<'EOF'
[req]
default_bits = 4096
prompt = no
default_md = sha256
x509_extensions = v3_req
distinguished_name = dn
[dn]
C = JP
ST = Tokyo
L = Tokyo
O = BestNetLLC
OU = IT
CN = rdm.bestnetllc.co.jp
[v3_req]
basicConstraints = critical,CA:FALSE
keyUsage = critical,digitalSignature,keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = rdm.bestnetllc.co.jp
EOF
sudo openssl req -x509 -nodes -newkey rsa:4096 -sha256 -days 3650 \
-keyout /etc/apache2/ssl/rdm.bestnetllc.co.jp.key \
-out /etc/apache2/ssl/rdm.bestnetllc.co.jp.crt \
-config /tmp/rdm-openssl.cnf
sudo chmod 600 /etc/apache2/ssl/rdm.bestnetllc.co.jp.key
sudo chmod 644 /etc/apache2/ssl/rdm.bestnetllc.co.jp.crt
Step 9. Apache VirtualHost कॉन्फ़िगरेशन #
पोर्ट 80, 443 पर रीडायरेक्ट करता है, और पोर्ट 443 Redmine की public डायरेक्टरी को DocumentRoot के रूप में सेट करता है।
वास्तविक path सीधे इस्तेमाल करने से symlink से होने वाले 403 एरर से बचाव होता है।
sudo a2enmod ssl rewrite headers
sudo tee /etc/apache2/sites-available/redmine.conf > /dev/null <<'EOF'
<VirtualHost *:80>
ServerName rdm.bestnetllc.co.jp
RewriteEngine On
RewriteRule ^/(.*)$ https://rdm.bestnetllc.co.jp/$1 [R=301,L]
</VirtualHost>
<VirtualHost *:443>
ServerName rdm.bestnetllc.co.jp
DocumentRoot /opt/redmine/releases/redmine-6.1.1/public
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/rdm.bestnetllc.co.jp.crt
SSLCertificateKeyFile /etc/apache2/ssl/rdm.bestnetllc.co.jp.key
PassengerRuby /usr/bin/ruby
PassengerAppEnv production
<Directory /opt/redmine/releases/redmine-6.1.1/public>
Options FollowSymLinks
AllowOverride all
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/redmine_ssl_error.log
CustomLog ${APACHE_LOG_DIR}/redmine_ssl_access.log combined
</VirtualHost>
EOF
sudo a2ensite redmine
sudo a2dissite 000-default
sudo a2dissite default-ssl
sudo apache2ctl configtest
sudo systemctl reload apache2
Step 10. परमिशन एडजस्टमेंट और रीस्टार्ट #
Apache से Redmine के अंतर्गत आने वाली डायरेक्टरीज़ तक पहुँचा जा सके, इसके लिए पैरेंट डायरेक्टरीज़ को भी एक्सीक्यूट परमिशन दें।
sudo chmod 755 /opt
sudo chmod 755 /opt/redmine
sudo chmod 755 /opt/redmine/releases
sudo chmod 755 /opt/redmine/releases/redmine-6.1.1
sudo chmod 755 /opt/redmine/releases/redmine-6.1.1/public
sudo -u redmine mkdir -p /opt/redmine/releases/redmine-6.1.1/tmp/pdf
sudo -u redmine mkdir -p /opt/redmine/releases/redmine-6.1.1/public/assets
sudo touch /opt/redmine/releases/redmine-6.1.1/tmp/restart.txt
sudo systemctl restart apache2
Step 11. पहली बार एक्सेस की जाँच #
सबसे पहले, लोकल कनेक्टिविटी वेरिफाई करें।
curl -kI https://127.0.0.1/
openssl s_client -connect 127.0.0.1:443 -servername rdm.bestnetllc.co.jp </dev/null
ब्राउज़र में https://rdm.bestnetllc.co.jp एक्सेस करें।
self-signed सर्टिफिकेट होने के कारण ब्राउज़र वार्निंग दिखेगी, लेकिन अगर Redmine की लॉगिन स्क्रीन दिखाई दे, तो सेटअप सफल है।
यूज़रनेम
admin / पासवर्ड adminपहली बार लॉगिन करने के बाद, एडमिनिस्ट्रेटर पासवर्ड तुरंत बदलें और
Redmine के “Administration → Settings → General” में होस्टनेम और प्रोटोकॉल को https के अनुरूप सेट करें।
सेटअप के दौरान आने वाले आम pitfalls #
1. Passenger रिपॉज़िटरी की GPG एरर #
पुराना key URL इस्तेमाल करने पर यह NO_PUBKEY के साथ फ़ेल हो सकता है।
हर जगह सिर्फ़ ऑफिशियल नई key फ़ाइल इस्तेमाल करने पर यह समस्या आमतौर पर हल हो जाती है।
2. yaml.h not found के कारण Psych का बिल्ड फ़ेल होता है #
ऐसे में अक्सर इसका कारण libyaml-dev का मौजूद न होना होता है।
OS पैकेज जोड़ने के बाद bundle install दोबारा चलाएँ।
3. mysql2 bundle टार्गेट्स में दिखाई देता है #
config/database.yml में MySQL की सैंपल डेफिनिशन बची रह जाने पर ऐसा होने की संभावना रहती है।
केवल PostgreSQL के लिए production डेफिनिशन रखकर फ़ाइल को व्यवस्थित करने से यह हल हो जाता है।
4. ERR_SSL_PROTOCOL_ERROR दिखाई देता है #
कुछ मामलों में 443 का VirtualHost सक्रिय नहीं होता, या कोई दूसरी साइट अब भी सक्रिय बनी रहती है।apache2ctl -S से सक्रिय vhost जाँचने पर समस्या का कारण पहचानना आसान हो जाता है।
5. 403 Forbidden आता है #
current symlink के ज़रिए एक्सेस करने पर परमिशन की समस्या आ सकती है।
वास्तविक path को सीधे DocumentRoot के रूप में सेट करें और /opt तथा उसके नीचे की डायरेक्टरीज़ को सर्च परमिशन दें; इससे समस्या आमतौर पर आसानी से सुधर जाती है।
सारांश #
इन स्टेप्स के साथ, आप BESTNET-CLOUD पर Ubuntu 24.04 / Apache + Passenger / PostgreSQL कॉन्फ़िगरेशन वाला
Redmine सर्वर बनाकर उस बिंदु तक पहुँच सकते हैं जहाँ HTTPS के ज़रिए पहली बार लॉगिन किया जा सके।
- Redmine सोर्स कोड का डिप्लॉयमेंट पूरा हो चुका है
- PostgreSQL से कनेक्ट किया जा सकता है
- Apache + Passenger पर ऐप्लिकेशन स्टार्ट होता है
- self-signed सर्टिफिकेट के साथ 443 पर listen किया जा सकता है
- ब्राउज़र से लॉगिन स्क्रीन दिखाई देती है
अगले लेख में हम AD / LDAPS ऑथेंटिकेशन, external SMTP और Zabbix के ज़रिए मॉनिटरिंग इंटीग्रेशन की ओर बढ़ेंगे।