Deployment guide

JBoss EAP 8.0 on Red Hat 8

Overview

Red Hat JBoss EAP 8.0 is the productized release of WildFly, built on Jakarta EE 10. It supports the Jakarta EE 10 Web and Full profiles plus MicroProfile, uses Undertow as its HTTP engine, and offers a browser-based management console and a CLI for deployment and runtime administration.

This SecureAnyCloud image runs EAP 8.0 on Red Hat Enterprise Linux 8 on Microsoft Azure, pre-installed under /opt/jboss-eap-8.0 and managed by systemd. A first-boot service replaces the management admin password with a unique value on each VM.

What you get:

  • Red Hat JBoss EAP 8.0.0 extracted to /opt/jboss-eap-8.0, owned by the jboss system user
  • OpenJDK 17 LTS (java-17-openjdk from the RHEL 8 AppStream). EAP 8.0 supports JDK 11 LTS and JDK 17 LTS, and this image ships 17
  • A jboss-eap.service systemd unit running the standalone-full.xml profile, bound on 0.0.0.0 for both HTTP (8080) and Management (9990)
  • jboss-eap-firstboot.service, which rotates the ManagementRealm admin password per VM on first customer boot
  • firewalld rules that already open TCP 8080 and 9990 on the OS
  • Latest RHEL 8 security patches applied at build time

Platform: Microsoft Azure (Gen2 Hyper-V). Default OS user: azureuser. EAP runtime user: jboss (no shell).

1

Deploy the virtual machine

az vm image terms accept --urn sac1647283583153:jboss-eap-8-0-rhel-8:standard:latest
az vm create -g <resource-group> -n jboss-eap-vm -l eastus \
  --image sac1647283583153:jboss-eap-8-0-rhel-8:standard:latest \
  --size Standard_B2s \
  --admin-username azureuser \
  --ssh-key-values ~/.ssh/id_rsa.pub

Run the commands below to accept the Marketplace terms and create the VM. Standard_B2s (4 GB RAM) is enough for the default standalone-full profile under light load. For production traffic, choose Standard_E4s_v5 (4 vCPU, 32 GB RAM) and tune the JVM heap as in Step 9.

2

Connect over SSH

Connect to the VM as the default OS user:

ssh azureuser@<public-ip>

Confirm the operating system:

cat /etc/redhat-release
3

Confirm the EAP server is running

Check the service state. jboss-eap.service starts automatically at boot.

sudo systemctl is-active jboss-eap.service
sudo systemctl is-enabled jboss-eap.service

Inspect the unit details:

sudo systemctl show jboss-eap.service -p Description -p ActiveState -p SubState -p MainPID -p User
4

Locate the per-VM admin password

On first boot, jboss-eap-firstboot.service rotates the management admin password. It writes the new credentials to /home/azureuser/CREDENTIALS.txt. Read the file:

sudo cat /home/azureuser/CREDENTIALS.txt

Copy the password to a secure location. The file is owned by root:root with mode 0600. Remove it once the password is stored elsewhere.

5

Confirm EAP is listening on 8080 and 9990

List the listening sockets:

sudo ss -tlnp | grep -E ':8080|:9990'

You should see 0.0.0.0:8080 (HTTP for deployed applications) and 0.0.0.0:9990 (the management console and management API). Both are owned by the java process running EAP.

Open the EAP welcome page on port 8080 in a browser to confirm the server is reachable from outside the VM. This page is the default landing for any HTTP request that does not match a deployed application context.

6

Connect to the management console

Open the public IP on port 9990 in a browser. On the standalone-full profile, the management console is served over HTTP by default:

echo "http://<vm-public-ip>:9990/console/"

Sign in with the username admin and the per-VM password from Step 4. EAP uses HTTP digest authentication, so most browsers show a native login dialog the first time you open the URL. The console then opens on the Homepage view.

Open the Deployments tab to see the applications deployed to the server. A fresh image starts empty. Drag a WAR file into the deployment column, or use the CLI in Step 8.

Open the Runtime tab to monitor the live server: log files, JVM metrics, datasource pools and web subsystem statistics. The image registers the VM hostname as the only server entry, with a green health indicator.

Open the Configuration tab for the full subsystem tree: datasources, messaging-activemq, transactions, undertow, infinispan and more. It is the GUI equivalent of the JBoss CLI, so you can make most administrative changes without using the command line.

For production, restrict the management interface to a private VNet subnet (Step 7) and switch the management console to HTTPS (Step 11).

7

Open the Azure NSG for HTTP and management

The OS firewalld already permits 8080 and 9990, but the Azure network security group (NSG) attached to the VM blocks them by default. Open them only from the subnets that need access, and never from 0.0.0.0/0 in production:

az network nsg rule create -g <resource-group> --nsg-name <nsg-name> \
  -n allow-eap-http \
  --priority 200 --direction Inbound --access Allow \
  --protocol Tcp --source-address-prefixes 10.0.0.0/16 \
  --destination-port-ranges 8080
az network nsg rule create -g <resource-group> --nsg-name <nsg-name> \
  -n allow-eap-mgmt \
  --priority 210 --direction Inbound --access Allow \
  --protocol Tcp --source-address-prefixes 10.0.0.0/16 \
  --destination-port-ranges 9990

Replace 10.0.0.0/16 with your application subnet's CIDR for HTTP. Limit the management rule to your operations subnet.

8

Deploy a WAR file with the management CLI

Copy a WAR file to the VM and deploy it with the JBoss CLI. The CLI uses the same ManagementRealm credentials as the console. Substitute the path to your own WAR:

sudo -u jboss /opt/jboss-eap-8.0/bin/jboss-cli.sh \
  --connect \
  --user=admin --password="$(grep '^Admin password:' /home/azureuser/CREDENTIALS.txt | awk '{print $3}')" \
  --command="deploy /home/azureuser/myapp.war"

List active deployments (read-only):

sudo -u jboss /opt/jboss-eap-8.0/bin/jboss-cli.sh \
  --connect \
  --user=admin --password="$(grep '^Admin password:' /home/azureuser/CREDENTIALS.txt | awk '{print $3}')" \
  --command="deployment-info"

Undeploy:

sudo -u jboss /opt/jboss-eap-8.0/bin/jboss-cli.sh \
  --connect \
  --user=admin --password="$(grep '^Admin password:' /home/azureuser/CREDENTIALS.txt | awk '{print $3}')" \
  --command="undeploy myapp.war"
9

Tune the JVM heap for larger VMs

The image uses EAP's default Xms1303m -Xmx1303m (about 1.3 GB heap), which fits the Standard_B2s build target (4 GB RAM total). On a larger size, raise both values to roughly 50 to 70 percent of system RAM.

Edit the systemd drop-in below. Replace <your-min-heap> and <your-max-heap> with values for your VM size, for example 8g and 8g on a Standard_E4s_v5 with 32 GB:

sudo mkdir -p /etc/systemd/system/jboss-eap.service.d
sudo tee /etc/systemd/system/jboss-eap.service.d/heap.conf >/dev/null <<'CONF' [Service] Environment=JAVA_OPTS=-Xms<your-min-heap> -Xmx<your-max-heap> -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true CONF
sudo systemctl daemon-reload
sudo systemctl restart jboss-eap.service

Verify that the JVM picked up the new value:

sudo journalctl -u jboss-eap.service --no-pager -n 20 | grep -E 'Xms|Xmx'
10

Configure datasources

EAP 8.0 ships ExampleDS, an embedded H2 datasource, by default. To add a production datasource such as PostgreSQL, copy the JDBC driver into the modules tree and register the datasource with the CLI. Substitute your own database connection details:

sudo -u jboss /opt/jboss-eap-8.0/bin/jboss-cli.sh \
  --connect \
  --user=admin --password="$(grep '^Admin password:' /home/azureuser/CREDENTIALS.txt | awk '{print $3}')" \
  --command="data-source add --name=AppDS --jndi-name=java:jboss/datasources/AppDS --driver-name=postgresql --connection-url=jdbc:postgresql://<your-db-host>:5432/<your-db-name> --user-name=<your-db-user> --password=<your-db-password> --use-ccm=true --enabled=true"

Test the connection:

sudo -u jboss /opt/jboss-eap-8.0/bin/jboss-cli.sh \
  --connect \
  --user=admin --password="$(grep '^Admin password:' /home/azureuser/CREDENTIALS.txt | awk '{print $3}')" \
  --command="/subsystem=datasources/data-source=AppDS:test-connection-in-pool"
11

SSL/TLS for the management console

For production, serve the management console over HTTPS. Add a key store with the CLI, and replace changeit with a real keystore password from Azure Key Vault:

sudo -u jboss /opt/jboss-eap-8.0/bin/jboss-cli.sh \
  --connect \
  --user=admin --password="$(grep '^Admin password:' /home/azureuser/CREDENTIALS.txt | awk '{print $3}')" \
  --command="/subsystem=elytron/key-store=mgmtKS:add(path=mgmt.keystore,relative-to=jboss.server.config.dir,credential-reference={clear-text=changeit},type=PKCS12)"

Next, create a key-manager and a server-ssl-context. Attach the HTTPS listener to port 9993 and switch the management console to it. The exact CLI sequence is in the Red Hat JBoss EAP 8.0 documentation, under Configuring SSL for the Management Console.

Managing the server

Restart EAP and wait for the management port to come back up:

sudo systemctl restart jboss-eap.service for i in $(seq 1 60); do ss -tln 2>/dev/null | grep -q ':9990 ' && break; sleep 2; done
sudo systemctl is-active jboss-eap.service

Tail the server log:

sudo tail -30 /opt/jboss-eap-8.0/standalone/log/server.log

Trigger a graceful shutdown from the CLI. It is preferred over systemctl stop because in-flight requests can finish:

sudo -u jboss /opt/jboss-eap-8.0/bin/jboss-cli.sh \
  --connect \
  --user=admin --password="$(grep '^Admin password:' /home/azureuser/CREDENTIALS.txt | awk '{print $3}')" \
  --command=":shutdown"

Switching to a different profile

The image runs standalone-full.xml, which includes the messaging, EJB and JCA subsystems. To switch to the lighter standalone.xml (web profile only), edit the systemd unit:

sudo sed -i 's/standalone-full.xml/standalone.xml/' /etc/systemd/system/jboss-eap.service
sudo systemctl daemon-reload
sudo systemctl restart jboss-eap.service

EAP 8.0 also bundles two clustering profiles: standalone-ha.xml (web profile plus clustering) and standalone-full-ha.xml (full profile plus clustering).

Common errors

"Authentication failed for user 'admin'": the first-boot service has rotated the password. Read /home/azureuser/CREDENTIALS.txt again.

"Connection refused (Connection refused)" on port 9990: EAP is bound to 0.0.0.0, but the Azure NSG is blocking the port. See Step 7.

"Address already in use: bind" in the server log: another process on the VM is using 8080 or 9990. Run sudo ss -tlnp | grep -E ':8080|:9990' to find it.

"OutOfMemoryError: Java heap space": raise -Xmx as described in Step 9, or move to a larger VM size.

"java.security.cert.CertificateException" when EAP connects to a TLS endpoint: the JDK truststore at /usr/lib/jvm/jre-17-openjdk/lib/security/cacerts does not include your private CA. Add it with sudo keytool -import -trustcacerts -file <ca>.crt -keystore /usr/lib/jvm/jre-17-openjdk/lib/security/cacerts -alias <name>.

On startup

systemd enables jboss-eap.service at boot:

sudo systemctl is-enabled jboss-eap.service

jboss-eap-firstboot.service runs once on the first customer boot to rotate the admin password. It then stays in active (exited) and does nothing on later reboots.

Support

SecureAnyCloud provides 24/7 expert support for this image. Contact sales@secureanycloud.com.

Licensing note: Red Hat JBoss EAP is a Red Hat product subject to the Red Hat End User License Agreement. SecureAnyCloud packages the developer build for evaluation and development use. Production deployments require a Red Hat subscription. Contact your Red Hat account team for production licensing, or use Red Hat's no-cost developer subscription through developers.redhat.com.

SecureAnyCloud charges a per-vCPU, per-hour fee for packaging, security patching and 24/7 operational support. This fee is separate from any Red Hat subscription you hold.

Deploy on Azure

Launch Red Hat JBoss EAP 8.0 on Red Hat Enterprise Linux 8 on Azure with 24/7 support from SecureAnyCloud.

View this image

Need Help?

Our support team is available 24/7.

sales@secureanycloud.com

Deploy on Azure