Deploying on Ubuntu 22.04
Version 4.1 by D Tim Cummings on 2023/09/28 05:15
Set environment variables for your configuration to be used in following scripts
For example
export SERVER_NAME=woserver.example.com
export SERVER_IP=172.5.4.3
export WEBOBJECTS_GROUP=webobjects
export WEBOBJECTS_USER=webobjects
export NEXT_ROOT=/opt/webobjects
export URL_PART=apps
export SERVER_IP=172.5.4.3
export WEBOBJECTS_GROUP=webobjects
export WEBOBJECTS_USER=webobjects
export NEXT_ROOT=/opt/webobjects
export URL_PART=apps
The default URL_PART is "cgi-bin". I prefer to use "apps" in my WebObjects URLs.
Install Java 17
sudo apt install openjdk-17-jdk-headless
At time of writing this was build 17.0.8.1+1-Ubuntu-0ubuntu122.04.
Add user and group
sudo groupadd $WEBOBJECTS_GROUP
sudo useradd -m -g $WEBOBJECTS_GROUP -s /bin/bash $WEBOBJECTS_USER
echo -e "export NEXT_ROOT=$NEXT_ROOT" | sudo tee /home/$WEBOBJECTS_USER/.bash_profile
sudo useradd -m -g $WEBOBJECTS_GROUP -s /bin/bash $WEBOBJECTS_USER
echo -e "export NEXT_ROOT=$NEXT_ROOT" | sudo tee /home/$WEBOBJECTS_USER/.bash_profile
Create directories
sudo mkdir -p /var/log/webobjects
sudo mkdir -p /etc/WebObjects/wotaskd
sudo mkdir -p /etc/WebObjects/JavaMonitor
sudo mkdir -p /etc/WebObjects/wotaskd
sudo mkdir -p /etc/WebObjects/JavaMonitor
Create configuration files
echo -e "\
WEBOBJECTS_GROUP=$WEBOBJECTS_GROUP\n\
WEBOBJECTS_USER=$WEBOBJECTS_USER\n\
NEXT_ROOT=$NEXT_ROOT\n\
JAVA_MONITOR_ARGS=\"-WOPort 56789\"\n\
WEBOBJECTS_URL=\n\
" | sudo tee /etc/default/webobjects
echo -e "\
er.extensions.WOHostUtilities.localhostips=($SERVER_IP)\n\
WOHost=$SERVER_IP\n\
" | sudo tee /etc/WebObjects/Properties
echo -e "WOHost=$SERVER_IP" | sudo tee /etc/WebObjects/wotaskd
echo -e "WOHost=$SERVER_IP" | sudo tee /etc/WebObjects/JavaMonitor
WEBOBJECTS_GROUP=$WEBOBJECTS_GROUP\n\
WEBOBJECTS_USER=$WEBOBJECTS_USER\n\
NEXT_ROOT=$NEXT_ROOT\n\
JAVA_MONITOR_ARGS=\"-WOPort 56789\"\n\
WEBOBJECTS_URL=\n\
" | sudo tee /etc/default/webobjects
echo -e "\
er.extensions.WOHostUtilities.localhostips=($SERVER_IP)\n\
WOHost=$SERVER_IP\n\
" | sudo tee /etc/WebObjects/Properties
echo -e "WOHost=$SERVER_IP" | sudo tee /etc/WebObjects/wotaskd
echo -e "WOHost=$SERVER_IP" | sudo tee /etc/WebObjects/JavaMonitor
Set permissions
sudo chown -R $WEBOBJECTS_USER:$WEBOBJECTS_GROUP /var/log/webobjects
sudo chown -R $WEBOBJECTS_USER:$WEBOBJECTS_GROUP /etc/WebObjects
sudo chown -R $WEBOBJECTS_USER:$WEBOBJECTS_GROUP /etc/WebObjects
Install wotaskd and javamonitor
sudo mkdir -p $NEXT_ROOT/Local/Library/WebObjects/JavaApplications
cd $NEXT_ROOT/Local/Library/WebObjects/JavaApplications
sudo wget https://jenkins.wocommunity.org/job/Wonder7/lastSuccessfulBuild/artifact/Root/Roots/wotaskd.tar.gz
sudo tar zpxf wotaskd.tar.gz
sudo rm wotaskd.tar.gz
sudo wget https://jenkins.wocommunity.org/job/Wonder7/lastSuccessfulBuild/artifact/Root/Roots/JavaMonitor.tar.gz
sudo tar zpxf JavaMonitor.tar.gz
sudo rm JavaMonitor.tar.gz
sudo chown -R $WEBOBJECTS_USER:$WEBOBJECTS_GROUP $NEXT_ROOT/Local
sudo mkdir -p $NEXT_ROOT/bin
cd $NEXT_ROOT/bin
sudo ln -s $NEXT_ROOT/Local/Library/WebObjects/JavaApplications/wotaskd.woa/wotaskd
sudo ln -s $NEXT_ROOT/Local/Library/WebObjects/JavaApplications/JavaMonitor.woa/JavaMonitor javamonitor
# Fix wotaskd and javamonitor to work with Java 17 if not already
sudo sed -i '2s/= $/= --add-exports=java.base/sun.security.action=ALL-UNNAMED/' $NEXT_ROOT/Local/Library/WebObjects/JavaApplications/wotaskd.woa/Contents/UNIX/UNIXClassPath.txt
sudo sed -i '2s/= $/= --add-exports=java.base/sun.security.action=ALL-UNNAMED/' $NEXT_ROOT/Local/Library/WebObjects/JavaApplications/javamonitor.woa/Contents/UNIX/UNIXClassPath.txt
cd $NEXT_ROOT/Local/Library/WebObjects/JavaApplications
sudo wget https://jenkins.wocommunity.org/job/Wonder7/lastSuccessfulBuild/artifact/Root/Roots/wotaskd.tar.gz
sudo tar zpxf wotaskd.tar.gz
sudo rm wotaskd.tar.gz
sudo wget https://jenkins.wocommunity.org/job/Wonder7/lastSuccessfulBuild/artifact/Root/Roots/JavaMonitor.tar.gz
sudo tar zpxf JavaMonitor.tar.gz
sudo rm JavaMonitor.tar.gz
sudo chown -R $WEBOBJECTS_USER:$WEBOBJECTS_GROUP $NEXT_ROOT/Local
sudo mkdir -p $NEXT_ROOT/bin
cd $NEXT_ROOT/bin
sudo ln -s $NEXT_ROOT/Local/Library/WebObjects/JavaApplications/wotaskd.woa/wotaskd
sudo ln -s $NEXT_ROOT/Local/Library/WebObjects/JavaApplications/JavaMonitor.woa/JavaMonitor javamonitor
# Fix wotaskd and javamonitor to work with Java 17 if not already
sudo sed -i '2s/= $/= --add-exports=java.base/sun.security.action=ALL-UNNAMED/' $NEXT_ROOT/Local/Library/WebObjects/JavaApplications/wotaskd.woa/Contents/UNIX/UNIXClassPath.txt
sudo sed -i '2s/= $/= --add-exports=java.base/sun.security.action=ALL-UNNAMED/' $NEXT_ROOT/Local/Library/WebObjects/JavaApplications/javamonitor.woa/Contents/UNIX/UNIXClassPath.txt
Create services for wotaskd and javamonitor
echo -e "\
[Unit]\n\
Description=WebObjects/Wonder wotaskd\n\
Documentation=https://wiki.wocommunity.org/display/documentation/Wonder+JavaMonitor+and+wotaskd\n\
AssertPathExists=/var/log/webobjects\n\
AssertPathExists=$NEXT_ROOT/Local/Library/WebObjects/JavaApplications/wotaskd.woa\n\
After=network.target\n\
[Service]\n\
User=$WEBOBJECTS_USER\n\
Group=$WEBOBJECTS_GROUP\n\
Environment=NEXT_ROOT=$NEXT_ROOT\n\
Environment="JVM_OPTIONS=-Xms32m -Xmx64m -XX:NewSize=2m"\n\
ExecStart=$NEXT_ROOT/Local/Library/WebObjects/JavaApplications/wotaskd.woa/wotaskd -WOPort 1085 -Xms32m -Xmx64m >> /var/log/webobjects/wotaskd.log 2>&1\n\
Restart=on-failure\n\
RestartSec=5\n\
[Install]\n\
WantedBy=multi-user.target\n\
" | sudo tee /lib/systemd/system/wotaskd.service
echo -e "\
[Unit]\n\
Description=WebObjects/Wonder JavaMonitor\n\
Documentation=https://wiki.wocommunity.org/display/documentation/Wonder+JavaMonitor+and+wotaskd\n\
AssertPathExists=/var/log/webobjects\n\
AssertPathExists=$NEXT_ROOT/Local/Library/WebObjects/JavaApplications/JavaMonitor.woa\n\
After=wotaskd.service\n\
[Service]\n\
User=$WEBOBJECTS_USER\n\
Group=$WEBOBJECTS_GROUP\n\
Environment=NEXT_ROOT=$NEXT_ROOT\n\
Environment="JVM_OPTIONS=-Xms32m -Xmx64m -XX:NewSize=2m"\n\
ExecStart=$NEXT_ROOT/Local/Library/WebObjects/JavaApplications/JavaMonitor.woa/JavaMonitor -WOPort 56789 -Xms32m -Xmx64m >> /var/log/webobjects/javamonitor.log 2>&1\n\
Restart=on-failure\n\
RestartSec=5\n\
[Install]\n\
WantedBy=multi-user.target\n\
" | sudo tee /lib/systemd/system/javamonitor.service
sudo systemctl daemon-reload
sudo systemctl enable wotaskd
sudo systemctl start wotaskd
sudo systemctl status wotaskd
sudo systemctl start javamonitor
sudo systemctl status javamonitor
[Unit]\n\
Description=WebObjects/Wonder wotaskd\n\
Documentation=https://wiki.wocommunity.org/display/documentation/Wonder+JavaMonitor+and+wotaskd\n\
AssertPathExists=/var/log/webobjects\n\
AssertPathExists=$NEXT_ROOT/Local/Library/WebObjects/JavaApplications/wotaskd.woa\n\
After=network.target\n\
[Service]\n\
User=$WEBOBJECTS_USER\n\
Group=$WEBOBJECTS_GROUP\n\
Environment=NEXT_ROOT=$NEXT_ROOT\n\
Environment="JVM_OPTIONS=-Xms32m -Xmx64m -XX:NewSize=2m"\n\
ExecStart=$NEXT_ROOT/Local/Library/WebObjects/JavaApplications/wotaskd.woa/wotaskd -WOPort 1085 -Xms32m -Xmx64m >> /var/log/webobjects/wotaskd.log 2>&1\n\
Restart=on-failure\n\
RestartSec=5\n\
[Install]\n\
WantedBy=multi-user.target\n\
" | sudo tee /lib/systemd/system/wotaskd.service
echo -e "\
[Unit]\n\
Description=WebObjects/Wonder JavaMonitor\n\
Documentation=https://wiki.wocommunity.org/display/documentation/Wonder+JavaMonitor+and+wotaskd\n\
AssertPathExists=/var/log/webobjects\n\
AssertPathExists=$NEXT_ROOT/Local/Library/WebObjects/JavaApplications/JavaMonitor.woa\n\
After=wotaskd.service\n\
[Service]\n\
User=$WEBOBJECTS_USER\n\
Group=$WEBOBJECTS_GROUP\n\
Environment=NEXT_ROOT=$NEXT_ROOT\n\
Environment="JVM_OPTIONS=-Xms32m -Xmx64m -XX:NewSize=2m"\n\
ExecStart=$NEXT_ROOT/Local/Library/WebObjects/JavaApplications/JavaMonitor.woa/JavaMonitor -WOPort 56789 -Xms32m -Xmx64m >> /var/log/webobjects/javamonitor.log 2>&1\n\
Restart=on-failure\n\
RestartSec=5\n\
[Install]\n\
WantedBy=multi-user.target\n\
" | sudo tee /lib/systemd/system/javamonitor.service
sudo systemctl daemon-reload
sudo systemctl enable wotaskd
sudo systemctl start wotaskd
sudo systemctl status wotaskd
sudo systemctl start javamonitor
sudo systemctl status javamonitor
Install Apache HTTP Server (MPM prefork)
sudo apt install apache2 make apache2-dev
sudo a2dismod mpm_event
sudo a2enmod mpm_prefork
sudo a2enmod expires
sudo a2enmod ssl
sudo a2enmod rewrite
# Add ServerName to conf to avoid configtest errors
echo "ServerName $SERVER_NAME" | sudo tee /etc/apache2/conf-available/server-name.conf
sudo a2enconf server-name
# Install WebObjects adaptor
git clone https://github.com/wocommunity/wonder.git
cd wonder/Utilities/Adaptors
sed -i '107s/CGI Apache2.2/Apache2.4/' make.config
sed -i '9s/MACOS/LINUX/' make.config
make
cd Apache2.4
sudo apxs -i -a -n WebObjects mod_WebObjects.la
sudo cp apache.conf /etc/apache2/mods-available/WebObjects.conf
sudo sed -i "7s/^LoadModule/# LoadModule/" /etc/apache2/mods-available/WebObjects.conf
sudo sed -i "15,18s/cgi-bin/$URL_PART/" /etc/apache2/mods-available/WebObjects.conf
sudo sed -i "38s/cgi-bin/$URL_PART/" /etc/apache2/mods-available/WebObjects.conf
sudo a2enmod WebObjects
# Create Apache virtual host
sudo mkdir -p /var/www/$SERVER_NAME
sudo ln -s $NEXT_ROOT/Local/Library/WebServer/Documents/WebObjects /var/www/$SERVER_NAME/WebObjects
echo -e "\
<VirtualHost *:80>\n\
ServerName $SERVER_NAME\n\
DocumentRoot /var/www/$SERVER_NAME\n\
<Directory />\n\
Require all denied\n\
</Directory>\n\
<Directory /var/www/$SERVER_NAME/>\n\
Options Indexes FollowSymLinks MultiViews\n\
AllowOverride None\n\
Require all granted\n\
</Directory>\n\
<IfModule mod_expires.c>\n\
ExpiresActive On\n\
ExpiresByType text/html "access 5 minutes"\n\
</IfModule>\n\
ErrorLog ${APACHE_LOG_DIR}/error_apps_$SERVER_NAME.log\n\
CustomLog ${APACHE_LOG_DIR}/access_apps_$SERVER_NAME.log combined\n\
</VirtualHost>\n\
" | sudo tee /etc/apache2/sites-available/$SERVER_NAME.conf
sudo a2ensite $SERVER_NAME.conf
sudo apachectl configtest
sudo systemctl restart apache2
sudo a2dismod mpm_event
sudo a2enmod mpm_prefork
sudo a2enmod expires
sudo a2enmod ssl
sudo a2enmod rewrite
# Add ServerName to conf to avoid configtest errors
echo "ServerName $SERVER_NAME" | sudo tee /etc/apache2/conf-available/server-name.conf
sudo a2enconf server-name
# Install WebObjects adaptor
git clone https://github.com/wocommunity/wonder.git
cd wonder/Utilities/Adaptors
sed -i '107s/CGI Apache2.2/Apache2.4/' make.config
sed -i '9s/MACOS/LINUX/' make.config
make
cd Apache2.4
sudo apxs -i -a -n WebObjects mod_WebObjects.la
sudo cp apache.conf /etc/apache2/mods-available/WebObjects.conf
sudo sed -i "7s/^LoadModule/# LoadModule/" /etc/apache2/mods-available/WebObjects.conf
sudo sed -i "15,18s/cgi-bin/$URL_PART/" /etc/apache2/mods-available/WebObjects.conf
sudo sed -i "38s/cgi-bin/$URL_PART/" /etc/apache2/mods-available/WebObjects.conf
sudo a2enmod WebObjects
# Create Apache virtual host
sudo mkdir -p /var/www/$SERVER_NAME
sudo ln -s $NEXT_ROOT/Local/Library/WebServer/Documents/WebObjects /var/www/$SERVER_NAME/WebObjects
echo -e "\
<VirtualHost *:80>\n\
ServerName $SERVER_NAME\n\
DocumentRoot /var/www/$SERVER_NAME\n\
<Directory />\n\
Require all denied\n\
</Directory>\n\
<Directory /var/www/$SERVER_NAME/>\n\
Options Indexes FollowSymLinks MultiViews\n\
AllowOverride None\n\
Require all granted\n\
</Directory>\n\
<IfModule mod_expires.c>\n\
ExpiresActive On\n\
ExpiresByType text/html "access 5 minutes"\n\
</IfModule>\n\
ErrorLog ${APACHE_LOG_DIR}/error_apps_$SERVER_NAME.log\n\
CustomLog ${APACHE_LOG_DIR}/access_apps_$SERVER_NAME.log combined\n\
</VirtualHost>\n\
" | sudo tee /etc/apache2/sites-available/$SERVER_NAME.conf
sudo a2ensite $SERVER_NAME.conf
sudo apachectl configtest
sudo systemctl restart apache2
Troubleshooting
# To test WOAdaptorInfo edit /etc/apache2/mods-available/WebObjects.conf and uncomment
WebObjectsAdminUsername public
#restart apache2
sudo systemctl restart apache2
#check in browser
http://woserver.example.com/apps/WebObjects/WOAdaptorInfo
#to turn on woadaptor logging
touch /tmp/logWebObjects
#might need to mkdir for adaptor logging
mkdir /Library
chown $WEBOBJECTS_USER:$WEBOBJECTS_GROUP /Library
WebObjectsAdminUsername public
#restart apache2
sudo systemctl restart apache2
#check in browser
http://woserver.example.com/apps/WebObjects/WOAdaptorInfo
#to turn on woadaptor logging
touch /tmp/logWebObjects
#might need to mkdir for adaptor logging
mkdir /Library
chown $WEBOBJECTS_USER:$WEBOBJECTS_GROUP /Library