Skip to content

rConfig V8 Pro Docker Deployment Guide

rConfig V8 Pro Docker Deployment: Containerized Network Management Setup

Section titled “rConfig V8 Pro Docker Deployment: Containerized Network Management Setup”

This guide covers installing, running and updating rConfig V8 Professional with Docker Compose, using the rconfig8docker repository. See also the full Linux installation guide and the update process.

Before proceeding, review the OS Configuration guide and Security Hardening guidelines.

Complete the rConfig Professional Docker deployment with the following steps. Run the docker commands as root on the Docker host. For offline environments, see the V8 Pro Offline Installation instructions.

  1. Clone the repository
  2. Log in to the rConfig registry
  3. Configure environment variables
  4. Start the containers
  5. Complete the installation
  6. Check the container is healthy
  7. Access rConfig V8 Professional
  1. Docker and Docker Compose are installed on the target server.
  2. The contents of the repository’s data directory are in the data directory on your server. Cloning the repository and using its data directory as it is works.
  3. An rConfig Professional subscription, with the registry username and token rConfig sent you.
  4. root on the Docker host.

The examples use the Docker Compose plugin (docker compose). The standalone docker-compose binary works the same way; use whichever is installed, and don’t mix them in scripts.

Terminal window
git clone https://github.com/rconfig/rconfig8docker.git
cd rconfig8docker
Terminal window
docker login reg.rconfig.com:8443
Username: # the robot account username rConfig sent you
Password: # the token rConfig sent you

Edit data/.env:

Terminal window
APP_DEBUG=true/false
APP_URL=http://yourFQDNorIP.domain.com
DB_HOST=db # The database container, or another server if you use an external database
DB_PORT=ENVOY_DB_PORT # 3306 for MariaDB unless customised
DB_DATABASE=ENVOY_DB_DATABASE # Any name for a new database
DB_USERNAME=ENVOY_DB_USERNAME # The database user
DB_PASSWORD=ENVOY_DB_PASSWORD # The database user's password
RCONFIG_API_TOKEN=ENVOY_API_TOKEN # From the rConfig portal

Leave APP_KEY and REDIS_PASSWORD empty. The container generates both on first start and saves them in data/.env.

From the root of the clone:

Terminal window
docker compose up -d

Watch the app container start. It is ready when the log shows Starting services...:

Terminal window
docker compose logs -f app

Run the setup commands. Always run artisan as www-data (-u www-data), never as root, so the files it writes stay owned by the app:

Terminal window
docker compose exec -u www-data app php artisan migrate --force
docker compose exec -u www-data app php artisan rconfig:sync-tasks
docker compose exec -u www-data app php artisan rconfig:update-rbac-data
docker compose exec app supervisorctl restart horizon

From V8.4.1 you don’t need to chown or chmod anything, and you don’t run key:generate. The container sets the owner and permissions of data/storage and data/.env on every start, and creates APP_KEY itself.

Terminal window
docker compose ps

The status column should show (healthy) within about two minutes. If it shows (unhealthy), see Container health.

Open the URL you set as APP_URL and log in with the default credentials:

  • Username: admin@domain.com
  • Password: admin

After first login, follow the security hardening guidance to align the container with enterprise policies.

  1. Change the default account credentials.
  2. Check the version number on the Settings page.
  3. Open External Tools > Queue Manager and check that Horizon shows as active on the dashboard.
  4. Check the services in the container:
Terminal window
docker compose exec app supervisorctl status

Expected output (PIDs and uptimes differ):

Terminal window
apache2 RUNNING pid …, uptime …
cache-rebuild EXITED …
horizon RUNNING pid …, uptime …
redis RUNNING pid …, uptime …
schedule-run RUNNING pid …, uptime …

cache-rebuild rebuilds the config, route and view caches once on start, then exits. schedule-run runs php artisan schedule:work, which takes the place of a cron line. If the SNMP trap receiver is on, rconfig-snmp-trap is also listed as RUNNING.

Next Steps:

From V8.4.1:

  • Horizon, the scheduler and the web server’s workers run as www-data, and Redis runs as redis. Nothing in the app runs as root. The Worker Privilege checks are for bare metal and show “Not applicable in Docker”; the container health check covers the same ground.
  • Redis only listens inside the container and requires the password in REDIS_PASSWORD. Keep that line in data/.env: the container reuses it on every start and upgrade.
  • data/storage and data/.env belong to www-data (uid 1000) with no access for other users: folders 0750, files 0640, stored device configs 0440. On the host they show as owned by whichever user has uid 1000. Host tools that read them as another non-root user lose access.
  • The database is not published on the host. To reach it from the host itself, uncomment the 127.0.0.1:3360:3306 lines in docker-compose.yml. It then listens on 127.0.0.1 only.

Run artisan as www-data:

Terminal window
docker compose exec -u www-data app php artisan <command>

As root, artisan can create root-owned files in storage that the app then cannot write. Restart Horizon with supervisorctl, which runs as root in the container:

Terminal window
docker compose exec app supervisorctl restart horizon

From V8.4.1, Horizon, scheduler, web server and Redis output goes to the container’s output, not to files in storage/logs. There is no horizon.log in Docker.

Terminal window
docker compose logs app # all service output
docker compose logs -f app # follow it
docker compose logs --since 1h app

The app’s own logs (laravel-YYYY-MM-DD.log and the others) stay in data/storage/logs and show in the System Log Viewer. Docker keeps the service output with its logging driver, so set size limits there (for example max-size and max-file for the default json-file driver).

From V8.4.1, the image has a Docker health check. It runs every 60 seconds, after a 120 second start period, and marks the container unhealthy after three failures in a row. It fails if:

  • Horizon or the scheduler is not running as www-data
  • Horizon or the scheduler is running as root
  • the SNMP trap receiver is on but not running as www-data
  • Redis answers without a password, or does not answer
  • the web server returns an error (HTTP 500 or above) for /login

docker compose ps shows the result. To see why the container is unhealthy:

Terminal window
docker inspect --format '{{json .State.Health}}' rconfig8docker-app-1

Use the name docker compose ps shows if yours differs. The Output of each entry in Log lists the problems, for example Horizon is not running as www-data. Check docker compose logs app for the cause.

From V8.4.1, the container can run the SNMP trap receiver:

  1. Set RCONFIG_SNMP_TRAPS=true in data/.env.
  2. Uncomment the - "162:1162/udp" line under ports: in docker-compose.yml.
  3. Run docker compose up -d.

The receiver runs as www-data on UDP 1162 inside the container, and the host’s UDP 162 is mapped to it. rConfig identifies devices by the source address of their traps. Docker keeps that address with its default iptables networking. If your Docker host uses the userland proxy instead, every trap appears to come from the Docker bridge; in that case run the app container with network_mode: host.

See SNMP Traps for filters and actions.

  • xFTP (the TFTP, FTP and SFTP services) runs as separate containers controlled through the host’s Docker socket. Giving the rConfig container that socket would give it root on the host, so the xFTP pages say it is unavailable here. Run xFTP on a bare-metal rConfig install instead.
  • Vector Hub needs systemd and a root helper on the server, which a container does not have. Use a bare-metal rConfig install for Vector Hub.
Terminal window
docker login reg.rconfig.com:8443

Run these from the root of your rconfig8docker clone.

  1. Wait until the queue is empty. Settings > Queue Manager should show no pending jobs. Redis lives inside the app container, so queued jobs, sessions and cache are cleared whenever the container is recreated.

  2. Back up the database and the data directory:

    Terminal window
    docker compose exec db sh -c 'mariadb-dump -uroot -p"$MARIADB_ROOT_PASSWORD" --all-databases' > rconfig-db-backup.sql
    tar czf rconfig-data-backup.tar.gz data/.env data/storage
  3. Check which MariaDB version is running now:

    Terminal window
    docker compose exec db mariadb --version
  4. Update docker-compose.yml from the repository. Then set its db image to your current MariaDB major version or a later one, for example mariadb:12.3 if step 3 shows 12.3 or anything older. If step 3 shows a newer major (for example 13.0), use that one (mariadb:13.0). Never set a lower major than the one in use: MariaDB cannot move data back to an older major. Copy any local changes, such as other ports, from your old file.

  5. If anything on the host connected to the database on port 3360, uncomment the 127.0.0.1:3360:3306 lines. From V8.4.1 the database is no longer published by default, and when enabled it listens on 127.0.0.1 only.

  6. Pull the new image and recreate the containers:

    Terminal window
    docker compose pull
    docker compose up -d
    docker compose logs -f app # wait for "Starting services..."

    On the first start of the V8.4.1 image, the container fixes the owner and permissions of everything in data/storage (this can take a few minutes on a large install), and adds REDIS_PASSWORD to data/.env.

  7. Run the database migrations and restart Horizon. Migrations are not run automatically:

    Terminal window
    docker compose exec -u www-data app php artisan migrate --force
    docker compose exec app supervisorctl restart horizon
  8. Check that docker compose ps shows (healthy), Settings > Queue Manager shows Horizon as active, and the version on the Settings page is the new one.

To go back to the previous image, set the app image: line in docker-compose.yml to the previous version’s tag and run docker compose up -d. You can leave data/.env and data/storage as they are.

An image older than V8.4.1 runs Redis without a password and runs Horizon and the scheduler as root again, so treat it as a short-term step. If the data itself needs restoring, use the backups from step 2.