Create your own dyndns for your home computer

Setup

Some people want to reach their home computer from the internet but find themselves in the following setup:

  • A home computer with a public IP address that can change/is unreliable.
  • A host reachable by a reliable public IP address or even better: a domain name.
  • A router at home that supports port forwarding.
  • No want to register or pay for a dyndns providers.

In such scenarios, we can make the home computer accessible through the public host:

  1. Setup port forwarding on public host so traffic of a port goes to the home computers.
  2. Configure home router to forward traffic of one port to the home computer in the LAN.
  3. Ensure that the system is aware of a public IP address change of the home computer.

Home computer setup

This script is stored on the home computer we want to reach from the public internet, it will update the IP address on the remote computer (which performs the port forwarding).

/home/andre/bin/update-my-ip.sh

#!/bin/bash

# ensures a remote computer gets to know this computer's ip
# to implement an ip forwarding.
#
# this script determines this computer's public ip and compate it
# to an ip address stored in a file on a remote computer.
# if the stored ip is different to the current public ip,
# the new ip will be written into the file on the remote computer.

# configuration of ssh connections to remote host
REMOTE_SSH_USER="remoteUsername"
REMOTE_SSH_PORT="22"
REMOTE_SSH_HOST="example.com"

REMOTE_IP_FILE="ssh-forwarding-ip.txt" # assuming file is in home directory
REMOTE_EXEC="ssh $REMOTE_SSH_USER@$REMOTE_SSH_HOST -p $REMOTE_SSH_PORT"

check_ip() {
    if (echo "$1" | grep -qE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'); then
        return 0
    fi
    echo "ERROR: invalid ip: '$1'"
    return 1
}

# resolve public ip and see what is configured on the remote host:
current_ip="$( dig +short myip.opendns.com @resolver1.opendns.com )"
remote_ip="$( $REMOTE_EXEC "cat ~/$REMOTE_IP_FILE" )"
echo -n "$(date '+%F %T') current_ip: $current_ip remote_ip: $remote_ip "
check_ip $current_ip || exit 10 # quit if ip does not look valid
check_ip $remote_ip || exit 20 # quit if ip does not look valid

# compare ips, quit if no change is necessary:
if [ "$current_ip" = "$remote_ip" ]; then
    echo "Nothing to do, remote IP matches current."
    exit 0
fi

# writing new ip to remote file:
$REMOTE_EXEC "
    cp -v $REMOTE_IP_FILE .$REMOTE_IP_FILE-until-$(date +%F_%T) \
    && echo $current_ip > $REMOTE_IP_FILE \
    && echo $REMOTE_IP_FILE written"

To make sure the IP stored on the remote computer is always up to date,
create a cronjob that invokes the script above once a minute on the home computer:

andre@nairobi ~ % crontab -e
# once per minute: maintain the IP of this computer on bytesare.us, for the port forwarding:
* * * * * bash /home/andre/bin/update-my-ip.sh 2>&1 >> /home/andre/log/update-my-ip.log

Public computer setup

3.174MBMemory Usage47.31msRequest Duration
Joomla! Version5.2.5
PHP Version8.3.8
Identityguest
Response200
Templatecassiopeia
Database
Server
mysql
Version
10.11.11-MariaDB-0+deb12u1
Collation
utf8mb4_general_ci
Conn Collation
utf8mb4_general_ci
$_GET
[]
$_POST
[]
$_SESSION
array:1 [ "joomla" => "***redacted***" ]
$_COOKIE
[]
$_SERVER
array:42 [ "HTTPS" => "on" "SSL_TLS_SNI" => "bytesare.us" "HTTP_HOST" => "bytesare.us" "HTTP...
session
array:3 [ "counter" => 1 "timer" => array:3 [ "start" => 1743725970 "last" => 1743725970...
registry
array:3 [ "data" => [] "initialized" => false "separator" => "." ]
user
array:21 [ "id" => 0 "name" => null "username" => null "email" => null "password" => "***r...
  • afterLoad (84.92KB) (1.4ms)
  • afterInitialise (1.09MB) (10.12ms)
  • afterRoute (85.64KB) (1.29ms)
  • beforeRenderComponent com_content (74.74KB) (1.77ms)
  • Before Access::preloadComponents (all components) (104.59KB) (886μs)
  • After Access::preloadComponents (all components) (119.43KB) (702μs)
  • Before Access::preloadPermissions (com_content) (1.63KB) (15μs)
  • After Access::preloadPermissions (com_content) (3.24KB) (499μs)
  • Before Access::getAssetRules (id:408 name:com_content.article.37) (104B) (15μs)
  • After Access::getAssetRules (id:408 name:com_content.article.37) (7.38KB) (69μs)
  • afterRenderComponent com_content (365.59KB) (13.27ms)
  • afterDispatch (2.28KB) (83μs)
  • beforeRenderRawModule mod_menu (Main Menu) (351.07KB) (2.94ms)
  • afterRenderRawModule mod_menu (Main Menu) (284.52KB) (4.39ms)
  • beforeRenderRawModule mod_breadcrumbs (Breadcrumbs) (7.9KB) (295μs)
  • afterRenderRawModule mod_breadcrumbs (Breadcrumbs) (9.06KB) (469μs)
  • beforeRenderModule mod_breadcrumbs (Breadcrumbs) (704B) (6μs)
  • afterRenderModule mod_breadcrumbs (Breadcrumbs) (4.67KB) (126μs)
  • beforeRenderModule mod_menu (Main Menu) (1.15KB) (41μs)
  • afterRenderModule mod_menu (Main Menu) (10.42KB) (34μs)
  • afterRender (248.26KB) (8.29ms)
  • 1 x afterRenderComponent com_content (365.59KB) (28.06%)
    13.27ms
    1 x afterInitialise (1.09MB) (21.4%)
    10.12ms
    1 x afterRender (248.26KB) (17.52%)
    8.29ms
    1 x afterRenderRawModule mod_menu (Main Menu) (284.52KB) (9.28%)
    4.39ms
    1 x beforeRenderRawModule mod_menu (Main Menu) (351.07KB) (6.22%)
    2.94ms
    1 x beforeRenderComponent com_content (74.74KB) (3.75%)
    1.77ms
    1 x afterLoad (84.92KB) (2.97%)
    1.40ms
    1 x afterRoute (85.64KB) (2.72%)
    1.29ms
    1 x Before Access::preloadComponents (all components) (104.59KB) (1.87%)
    886μs
    1 x After Access::preloadComponents (all components) (119.43KB) (1.48%)
    702μs
    1 x After Access::preloadPermissions (com_content) (3.24KB) (1.05%)
    499μs
    1 x afterRenderRawModule mod_breadcrumbs (Breadcrumbs) (9.06KB) (0.99%)
    469μs
    1 x beforeRenderRawModule mod_breadcrumbs (Breadcrumbs) (7.9KB) (0.62%)
    295μs
    1 x afterRenderModule mod_breadcrumbs (Breadcrumbs) (4.67KB) (0.27%)
    126μs
    1 x afterDispatch (2.28KB) (0.18%)
    83μs
    1 x After Access::getAssetRules (id:408 name:com_content.article.37) (7.38KB) (0.15%)
    69μs
    1 x beforeRenderModule mod_menu (Main Menu) (1.15KB) (0.09%)
    41μs
    1 x afterRenderModule mod_menu (Main Menu) (10.42KB) (0.07%)
    34μs
    1 x Before Access::preloadPermissions (com_content) (1.63KB) (0.03%)
    15μs
    1 x Before Access::getAssetRules (id:408 name:com_content.article.37) (104B) (0.03%)
    15μs
    1 x beforeRenderModule mod_breadcrumbs (Breadcrumbs) (704B) (0.01%)
    6μs
28 statements were executed, 5 of which were duplicates, 23 unique8.75ms113.85KB
  • SELECT @@SESSION.sql_mode;90μs968B/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:308Copy
  • SELECT `data` FROM `cms_session` WHERE `session_id` = ?122μs1008BParams/libraries/vendor/joomla/session/src/Handler/DatabaseHandler.php:250Copy
  • SELECT `session_id` FROM `cms_session` WHERE `session_id` = :session_id LIMIT 181μs1.3KBParams/libraries/src/Session/MetadataManager.php:187Copy
  • INSERT INTO `cms_session` (`session_id`,`guest`,`time`,`userid`,`username`,`client_id`) VALUES (:session_id, :guest, :time, :user_id, :username, :client_id)515μs944BParams/libraries/src/Session/MetadataManager.php:260Copy
  • SELECT `extension_id` AS `id`,`element` AS `option`,`params`,`enabled` FROM `cms_extensions` WHERE `type` = 'component' AND `state` = 0 AND `enabled` = 1238μs1.61KB/libraries/src/Component/ComponentHelper.php:399Copy
  • SELECT `id`,`rules` FROM `cms_viewlevels`73μs624B/libraries/src/Access/Access.php:955Copy
  • SELECT `b`.`id` FROM `cms_usergroups` AS `a` LEFT JOIN `cms_usergroups` AS `b` ON `b`.`lft` <= `a`.`lft` AND `b`.`rgt` >= `a`.`rgt` WHERE `a`.`id` = :guest132μs1.31KBParams/libraries/src/Access/Access.php:868Copy
  • SELECT `folder` AS `type`,`element` AS `name`,`params` AS `params`,`extension_id` AS `id` FROM `cms_extensions` WHERE `enabled` = 1 AND `type` = 'plugin' AND `state` IN (0,1) AND `access` IN (:preparedArray1) ORDER BY `ordering`472μs3.96KBParams/libraries/src/Plugin/PluginHelper.php:294Copy
  • SELECT `m`.`id`,`m`.`menutype`,`m`.`title`,`m`.`alias`,`m`.`note`,`m`.`link`,`m`.`type`,`m`.`level`,`m`.`language`,`m`.`browserNav`,`m`.`access`,`m`.`params`,`m`.`home`,`m`.`img`,`m`.`template_style_id`,`m`.`component_id`,`m`.`parent_id`,`m`.`path` AS `route`,`e`.`element` AS `component` FROM `cms_menu` AS `m` LEFT JOIN `cms_extensions` AS `e` ON `m`.`component_id` = `e`.`extension_id` WHERE ( (`m`.`published` = 1 AND `m`.`parent_id` > 0 AND `m`.`client_id` = 0) AND (`m`.`publish_up` IS NULL OR `m`.`publish_up` <= :currentDate1)) AND (`m`.`publish_down` IS NULL OR `m`.`publish_down` >= :currentDate2) ORDER BY `m`.`lft`415μs36.55KBParams/libraries/src/Menu/SiteMenu.php:166Copy
  • SELECT * FROM `cms_languages` WHERE `published` = 1 ORDER BY `ordering` ASC138μs1.59KB/libraries/src/Language/LanguageHelper.php:177Copy
  • SELECT `id`,`home`,`template`,`s`.`params`,`inheritable`,`parent` FROM `cms_template_styles` AS `s` LEFT JOIN `cms_extensions` AS `e` ON `e`.`element` = `s`.`template` AND `e`.`type` = 'template' AND `e`.`client_id` = `s`.`client_id` WHERE `s`.`client_id` = 0 AND `e`.`enabled` = 1179μs832B/administrator/components/com_templates/src/Model/StyleModel.php:775Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `cms_assets` WHERE `name` IN (:preparedArray1,:preparedArray2,:preparedArray3,:preparedArray4,:preparedArray5,:preparedArray6,:preparedArray7,:preparedArray8,:preparedArray9,:preparedArray10,:preparedArray11,:preparedArray12,:preparedArray13,:preparedArray14,:preparedArray15,:preparedArray16,:preparedArray17,:preparedArray18,:preparedArray19,:preparedArray20,:preparedArray21,:preparedArray22,:preparedArray23,:preparedArray24,:preparedArray25,:preparedArray26,:preparedArray27,:preparedArray28,:preparedArray29,:preparedArray30,:preparedArray31,:preparedArray32,:preparedArray33,:preparedArray34,:preparedArray35,:preparedArray36,:preparedArray37,:preparedArray38,:preparedArray39,:preparedArray40,:preparedArray41)410μs7.44KBParams/libraries/src/Access/Access.php:357Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `cms_assets` WHERE `name` LIKE :asset OR `name` = :extension OR `parent_id` = 0309μs2.23KBParams/libraries/src/Access/Access.php:301Copy
  • SHOW FULL COLUMNS FROM `cms_content`525μs1.77KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • UPDATE `cms_content` SET `hits` = (`hits` + 1) WHERE `id` = '37'424μs48B/libraries/src/Table/Table.php:1348Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `cms_content` AS `a` INNER JOIN `cms_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `cms_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `cms_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `cms_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `cms_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)413μs6.12KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `cms_categories` AS `s` INNER JOIN `cms_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`310μs5.14KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `m`.`tag_id`,`t`.* FROM `cms_contentitem_tag_map` AS `m` INNER JOIN `cms_tags` AS `t` ON `m`.`tag_id` = `t`.`id` WHERE `m`.`type_alias` = :contentType AND `m`.`content_item_id` = :id AND `t`.`published` = 1 AND `t`.`access` IN (:preparedArray1)230μs11.95KBParams/libraries/src/Helper/TagsHelper.php:388Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `cms_categories` AS `s` INNER JOIN `cms_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`250μs3.89KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT DISTINCT a.id, a.title, a.name, a.checked_out, a.checked_out_time, a.note, a.state, a.access, a.created_time, a.created_user_id, a.ordering, a.language, a.fieldparams, a.params, a.type, a.default_value, a.context, a.group_id, a.label, a.description, a.required, a.only_use_in_subform,l.title AS language_title, l.image AS language_image,uc.name AS editor,ag.title AS access_level,ua.name AS author_name,g.title AS group_title, g.access as group_access, g.state AS group_state, g.note as group_note FROM cms_fields AS a LEFT JOIN `cms_languages` AS l ON l.lang_code = a.language LEFT JOIN cms_users AS uc ON uc.id=a.checked_out LEFT JOIN cms_viewlevels AS ag ON ag.id = a.access LEFT JOIN cms_users AS ua ON ua.id = a.created_user_id LEFT JOIN cms_fields_groups AS g ON g.id = a.group_id LEFT JOIN `cms_fields_categories` AS fc ON fc.field_id = a.id WHERE ( (`a`.`context` = :context AND (`fc`.`category_id` IS NULL OR `fc`.`category_id` IN (:preparedArray1,:preparedArray2)) AND `a`.`access` IN (:preparedArray3)) AND (`a`.`group_id` = 0 OR `g`.`access` IN (:preparedArray4)) AND `a`.`state` = :state) AND (`a`.`group_id` = 0 OR `g`.`state` = :gstate) AND `a`.`only_use_in_subform` = :only_use_in_subform ORDER BY a.ordering ASC683μs4.06KBParams/libraries/src/MVC/Model/BaseDatabaseModel.php:164Copy
  • SELECT `a`.`id`,`a`.`title`,`a`.`catid`,`a`.`language`, CASE WHEN CHAR_LENGTH(`a`.`alias`) != 0 THEN CONCAT_WS(':', `a`.`id`, `a`.`alias`) ELSE a.id END AS `slug`, CASE WHEN CHAR_LENGTH(`cc`.`alias`) != 0 THEN CONCAT_WS(':', `cc`.`id`, `cc`.`alias`) ELSE cc.id END AS `catslug` FROM `cms_content` AS `a` LEFT JOIN `cms_categories` AS `cc` ON `cc`.`id` = `a`.`catid` WHERE `a`.`catid` = :catid AND `a`.`state` = :state AND `a`.`access` IN (:preparedArray1) AND (`publish_up` IS NULL OR `publish_up` <= :nowDate1) AND (`publish_down` IS NULL OR `publish_down` >= :nowDate2) ORDER BY CASE WHEN `a`.`publish_up` IS NULL THEN `a`.`created` ELSE `a`.`publish_up` END DESC287μs1.94KBParams/plugins/content/pagenavigation/src/Extension/PageNavigation.php:188Copy
  • SELECT `m`.`id`,`m`.`title`,`m`.`module`,`m`.`position`,`m`.`content`,`m`.`showtitle`,`m`.`params`,`mm`.`menuid` FROM `cms_modules` AS `m` LEFT JOIN `cms_modules_menu` AS `mm` ON `mm`.`moduleid` = `m`.`id` LEFT JOIN `cms_extensions` AS `e` ON `e`.`element` = `m`.`module` AND `e`.`client_id` = `m`.`client_id` WHERE ( ( (`m`.`published` = 1 AND `e`.`enabled` = 1 AND `m`.`client_id` = :clientId AND `m`.`access` IN (:preparedArray1)) AND (`m`.`publish_up` IS NULL OR `m`.`publish_up` <= :publishUp)) AND (`m`.`publish_down` IS NULL OR `m`.`publish_down` >= :publishDown)) AND (`mm`.`menuid` = :itemId OR `mm`.`menuid` <= 0) ORDER BY `m`.`position`,`m`.`ordering`304μs1.83KBParams/libraries/src/Cache/Controller/CallbackController.php:51Copy
  • SELECT * FROM `cms_schemaorg` WHERE `itemId` = :itemId AND `context` = :context140μs1.55KBParams/plugins/system/schemaorg/src/Extension/Schemaorg.php:403Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `cms_content` AS `a` INNER JOIN `cms_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `cms_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `cms_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `cms_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `cms_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)313μs6.17KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `cms_content` AS `a` INNER JOIN `cms_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `cms_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `cms_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `cms_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `cms_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)1.02ms6.17KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT SUM(CASE WHEN `a`.`next_execution` <= :now THEN 1 ELSE 0 END) AS due_count,SUM(CASE WHEN `a`.`locked` IS NULL THEN 0 ELSE 1 END) AS locked_count FROM `cms_scheduler_tasks` AS `a` WHERE `a`.`state` = 1158μs1.37KBParams/administrator/components/com_scheduler/src/Model/TasksModel.php:517Copy
  • SELECT `session_id` FROM `cms_session` WHERE `session_id` = ?126μs1KBParams/libraries/vendor/joomla/session/src/Handler/DatabaseHandler.php:277Copy
  • UPDATE `cms_session` SET `data` = ? , `time` = ? WHERE `session_id` = ?393μs592BParams/libraries/vendor/joomla/session/src/Handler/DatabaseHandler.php:301Copy