I tried to install the OpenNMS docker version on a Debian 12 based on the steps in the official documentation at https://github.com/OpenNMS/opennms/blob/develop/docs/modules/deployment/pages/core/docker/ (core -> postgresql -> initialize). Everything went well on initializing until the opennms failed to valitdate database verion:
08:38:39.864 [Main] INFO org.opennms.core.schema.Migrator - validating database version
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.opennms.bootstrap.Bootstrap$4.run(Bootstrap.java:524)
at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: org.opennms.core.schema.MigrationException: an error occurred getting the version from the database
at org.opennms.core.schema.Migrator.getDatabaseVersion(Migrator.java:296)
at org.opennms.core.schema.Migrator.validateDatabaseVersion(Migrator.java:324)
at org.opennms.core.schema.Migrator.setupDatabase(Migrator.java:1008)
at org.opennms.install.Installer.install(Installer.java:248)
at org.opennms.install.Installer.main(Installer.java:1009)
... 6 more
Caused by: org.postgresql.util.PSQLException: Connection to 127.0.0.1:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:342)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:54)
at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:253)
at org.postgresql.Driver.makeConnection(Driver.java:434)
at org.postgresql.Driver.connect(Driver.java:291)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:681)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:190)
at org.opennms.core.db.install.SimpleDataSource.getConnection(SimpleDataSource.java:106)
at org.opennms.core.schema.Migrator.getDatabaseVersion(Migrator.java:284)
... 10 more
Caused by: java.net.ConnectException: Connection refused
at java.base/sun.nio.ch.Net.pollConnect(Native Method)
at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672)
at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:547)
at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:602)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
at java.base/java.net.Socket.connect(Socket.java:633)
at org.postgresql.core.PGStream.createSocket(PGStream.java:243)
at org.postgresql.core.PGStream.<init>(PGStream.java:98)
at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:132)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:258)
... 18 more
+ exit 127
ERROR: 127
I have checked iptables rules and everything seems fine:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER-USER 0 -- * * 0.0.0.0/0 0.0.0.0/0
0 0 DOCKER-ISOLATION-STAGE-1 0 -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT 0 -- * br-3b1a06639d96 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 DOCKER 0 -- * br-3b1a06639d96 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT 0 -- br-3b1a06639d96 !br-3b1a06639d96 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT 0 -- br-3b1a06639d96 br-3b1a06639d96 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT 0 -- * br-a71aec85e9c3 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 DOCKER 0 -- * br-a71aec85e9c3 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT 0 -- br-a71aec85e9c3 !br-a71aec85e9c3 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT 0 -- br-a71aec85e9c3 br-a71aec85e9c3 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT 0 -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 DOCKER 0 -- * docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT 0 -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT 0 -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain DOCKER (3 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT 6 -- !br-3b1a06639d96 br-3b1a06639d96 0.0.0.0/0 172.20.0.2 tcp dpt:5432
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
pkts bytes target prot opt in out source destination
0 0 DOCKER-ISOLATION-STAGE-2 0 -- br-3b1a06639d96 !br-3b1a06639d96 0.0.0.0/0 0.0.0.0/0
8 480 DOCKER-ISOLATION-STAGE-2 0 -- br-a71aec85e9c3 !br-a71aec85e9c3 0.0.0.0/0 0.0.0.0/0
0 0 DOCKER-ISOLATION-STAGE-2 0 -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
15 629 RETURN 0 -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-ISOLATION-STAGE-2 (3 references)
pkts bytes target prot opt in out source destination
0 0 DROP 0 -- * br-3b1a06639d96 0.0.0.0/0 0.0.0.0/0
0 0 DROP 0 -- * br-a71aec85e9c3 0.0.0.0/0 0.0.0.0/0
0 0 DROP 0 -- * docker0 0.0.0.0/0 0.0.0.0/0
7 292 RETURN 0 -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-USER (1 references)
pkts bytes target prot opt in out source destination
23 1109 RETURN 0 -- * * 0.0.0.0/0 0.0.0.0/0
Postgresql username/password is also checked:
~/horizon/docker-compose.yml
version: '3'
volumes:
data-opennms: {}
data-config: {}
services:
horizon:
image: opennms/horizon:latest
container_name: horizon
environment:
TZ: 'Asia/Shanghai'
POSTGRES_HOST: '127.0.0.1'
POSTGRES_PORT: 5432
POSTGRES_USER: 'postgres'
POSTGRES_PASSWORD: 'MY.POSTGRES.PASSWORD'
OPENNMS_DBNAME: 'opennms-core-db'
OPENNMS_DBUSER: 'opennms'
OPENNMS_DBPASS: 'MY.OPENNMS-DB.PASSWORD'
volumes:
- data-opennms:/opennms-data
- data-config:/opt/opennms/etc
command: ["-s"]
ports:
- '8980:8980/tcp'
- '8101:8101/tcp'
healthcheck:
test: [ 'CMD', 'curl', '-f', '-I', 'http://localhost:8980/opennms/login.jsp' ]
interval: 1m
timeout: 5s
retries: 3
~/postgres/docker-compose.yml
version: '3'
volumes:
data-postgres: {}
services:
database:
image: postgres:latest
container_name: database
environment:
TZ: 'Asia/Shanghai'
POSTGRES_USER: 'postgres'
POSTGRES_PASSWORD: 'MY.POSTGRES.PASSWORD'
volumes:
- 'data-postgres:/var/lib/postgresql/data'
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U postgres" ]
interval: 10s
timeout: 3s
retries: 3
ports:
- '5432:5432/tcp'
You can't use 127.0.0.1 as a PostgreSQL host in a container service. The container horizon
runs isolated in a network namespace different from the database
service. If you want to keep the services in separate docker services, you need to publish the PostgreSQL port and use the IP address from the host system instead.