RM
Ross Money

Developer

Travelling.RossMoney.Me

Travelling round Southeast Asia in 2016.

This travelling project is the site for my 2016 Southeast Asia trip, built as a separate gallery stack around the photos I brought back from Thailand, Laos, Vietnam, Cambodia, South Korea, Japan, Hong Kong, and Australia.

PhotoPrismSource library
Private APIServer-side URL mapping
CachedService worker and assets

What it is

A visual archive of the 2016 Southeast Asia journey.

PhotoPrism web app provides the image source, PHP and nginx serve a privacy-preserving API and shell, and a client-side gallery renders the final experience.

Story

Round trip through Asia

I went travelling round Southeast Asia in 2016, then continued through South Korea, Japan, Hong Kong, and Australia.

Place

Route-based browsing

The gallery is grouped around the route and the places visited so the memories stay tied to the trip itself.

Format

Photo-first archive

It is closer to a curated image mosaic than a blog, with minimal text and a strong focus on the photos.

Audience

Personal reference

The site is mainly for revisiting the trip myself, while still being polished enough to share publicly.

Travel architecture feed

Architecture for travelling.rossmoney.me.

Topology

Docker + Linux host overview

Updated

Separate Go service exposing live Docker daemon, container, image, and Linux host telemetry.

client
  -> portfolio site
     -> /api/architecture
        -> host Go service

containers
  - archview
  - photoprism
  - photoprism-database
  - socket-proxy
  - trivy
  - monitoring-dashboard-1
  - trivy-docker-api
  - watchtower
  - portainer
  - npm
  - docker-daemon

images
  - ghcr.io/tekkifox/archview
  - ghcr.io/tekkifox/monitoring-dashboard
  - ghcr.io/tekkifox/monitoring-trivy
  - photoprism/photoprism
  - lscr.io/linuxserver/socket-proxy
  - mariadb
  - nickfedor/watchtower
  - portainer/portainer-ee
  - jc21/nginx-proxy-manager
  - hello-world


regions
  - host
  - Ubuntu 26.04.1 LTS
  - aarch64
Raw snapshot
{
  "cluster": "archview",
  "description": "Separate Go service exposing live Docker daemon, container, image, and Linux host telemetry.",
  "diagram": "host linux system\n  -> docker daemon\n     -> container: archview (running)\n     -> container: photoprism (running)\n     -> container: photoprism-database (running)\n     -> container: socket-proxy (running)\n     -> container: trivy (running)\n     -> container: monitoring-dashboard-1 (running)\n     -> container: trivy-docker-api (running)\n     -> container: watchtower (running)\n     -> container: portainer (running)\n     -> container: npm (running)\n",
  "docker": {
    "containers": [
      {
        "created": 1793313442,
        "id": "b14ff36c588b",
        "image": "ghcr.io/tekkifox/archview:latest",
        "name": "archview",
        "state": "running",
        "status": "Up 19 minutes (healthy)"
      },
      {
        "created": 1793309227,
        "id": "fd663168c45f",
        "image": "photoprism/photoprism:preview",
        "name": "photoprism",
        "state": "running",
        "status": "Up About an hour"
      },
      {
        "created": 1793309218,
        "id": "7427b9513e27",
        "image": "mariadb:11",
        "name": "photoprism-database",
        "state": "running",
        "status": "Up About an hour"
      },
      {
        "created": 1793308915,
        "id": "a08fbc47992d",
        "image": "lscr.io/linuxserver/socket-proxy:latest",
        "name": "socket-proxy",
        "state": "running",
        "status": "Up 2 hours (healthy)"
      },
      {
        "created": 1793300890,
        "id": "a01c8036efbb",
        "image": "ghcr.io/tekkifox/monitoring-trivy:latest",
        "name": "trivy",
        "state": "running",
        "status": "Up 4 hours (healthy)"
      },
      {
        "created": 1793300885,
        "id": "080b9d0e5337",
        "image": "ghcr.io/tekkifox/monitoring-dashboard:latest",
        "name": "monitoring-dashboard-1",
        "state": "running",
        "status": "Up 4 hours (healthy)"
      },
      {
        "created": 1793216910,
        "id": "5390411513c7",
        "image": "lscr.io/linuxserver/socket-proxy:latest",
        "name": "trivy-docker-api",
        "state": "running",
        "status": "Up 27 hours (healthy)"
      },
      {
        "created": 1793216484,
        "id": "27c701cfde0a",
        "image": "nickfedor/watchtower",
        "name": "watchtower",
        "state": "running",
        "status": "Up 27 hours (healthy)"
      },
      {
        "created": 1793216383,
        "id": "70c5a91f3d5c",
        "image": "portainer/portainer-ee:latest",
        "name": "portainer",
        "state": "running",
        "status": "Up 27 hours"
      },
      {
        "created": 1793215629,
        "id": "e8a48eaa4968",
        "image": "jc21/nginx-proxy-manager:2.15.1",
        "name": "npm",
        "state": "running",
        "status": "Up 27 hours"
      }
    ],
    "daemon": {
      "architecture": "aarch64",
      "containers": 11,
      "containersRunning": 10,
      "driver": "overlayfs",
      "images": 26,
      "memoryTotalBytes": 6187409408,
      "ncpu": 1,
      "operatingSystem": "Ubuntu 26.04.1 LTS"
    },
    "images": [
      {
        "created": 1793313416,
        "dangling": false,
        "repoTags": [
          "ghcr.io/tekkifox/archview:latest"
        ],
        "sizeBytes": 23728656
      },
      {
        "created": 1793300875,
        "dangling": false,
        "repoTags": [
          "ghcr.io/tekkifox/monitoring-dashboard:latest"
        ],
        "sizeBytes": 93277720
      },
      {
        "created": 1793300858,
        "dangling": false,
        "repoTags": [
          "ghcr.io/tekkifox/monitoring-trivy:latest"
        ],
        "sizeBytes": 248124189
      },
      {
        "created": 1793279018,
        "dangling": false,
        "repoTags": [
          "photoprism/photoprism:preview"
        ],
        "sizeBytes": 3449900020
      },
      {
        "created": 1793059591,
        "dangling": false,
        "repoTags": [
          "lscr.io/linuxserver/socket-proxy:latest"
        ],
        "sizeBytes": 25882804
      },
      {
        "created": 1793057383,
        "dangling": false,
        "repoTags": [
          "mariadb:11"
        ],
        "sizeBytes": 483915698
      },
      {
        "created": 1792640652,
        "dangling": false,
        "repoTags": [
          "nickfedor/watchtower:latest"
        ],
        "sizeBytes": 75669999
      },
      {
        "created": 1792625419,
        "dangling": false,
        "repoTags": [
          "portainer/portainer-ee:latest"
        ],
        "sizeBytes": 272444975
      },
      {
        "created": 1780461197,
        "dangling": false,
        "repoTags": [
          "jc21/nginx-proxy-manager:2.15.1"
        ],
        "sizeBytes": 1807680173
      },
      {
        "created": 1774301640,
        "dangling": false,
        "repoTags": [
          "hello-world:latest"
        ],
        "sizeBytes": 22575
      }
    ]
  },
  "endpoints": [
    {
      "name": "overview",
      "url": "https://archview.photos.rossmoney.me/api/overview"
    },
    {
      "name": "architecture",
      "url": "https://archview.photos.rossmoney.me/api/architecture?project=<name>"
    },
    {
      "name": "docker",
      "url": "https://archview.photos.rossmoney.me/api/docker"
    },
    {
      "name": "system",
      "url": "https://archview.photos.rossmoney.me/api/system"
    },
    {
      "name": "healthz",
      "url": "https://archview.photos.rossmoney.me/healthz"
    },
    {
      "name": "readyz",
      "url": "https://archview.photos.rossmoney.me/readyz"
    },
    {
      "name": "docs",
      "url": "https://archview.photos.rossmoney.me/docs"
    }
  ],
  "environment": "docker",
  "extra": {
    "containerCount": 10,
    "imageCount": 10
  },
  "nodes": [
    {
      "kind": "linux-host",
      "name": "archview",
      "status": "0.09 load average"
    },
    {
      "details": {
        "image": "ghcr.io/tekkifox/archview:latest",
        "state": "running"
      },
      "kind": "container",
      "name": "archview",
      "status": "running"
    },
    {
      "details": {
        "image": "photoprism/photoprism:preview",
        "state": "running"
      },
      "kind": "container",
      "name": "photoprism",
      "status": "running"
    },
    {
      "details": {
        "image": "mariadb:11",
        "state": "running"
      },
      "kind": "container",
      "name": "photoprism-database",
      "status": "running"
    },
    {
      "details": {
        "image": "lscr.io/linuxserver/socket-proxy:latest",
        "state": "running"
      },
      "kind": "container",
      "name": "socket-proxy",
      "status": "running"
    },
    {
      "details": {
        "image": "ghcr.io/tekkifox/monitoring-trivy:latest",
        "state": "running"
      },
      "kind": "container",
      "name": "trivy",
      "status": "running"
    },
    {
      "details": {
        "image": "ghcr.io/tekkifox/monitoring-dashboard:latest",
        "state": "running"
      },
      "kind": "container",
      "name": "monitoring-dashboard-1",
      "status": "running"
    },
    {
      "details": {
        "image": "lscr.io/linuxserver/socket-proxy:latest",
        "state": "running"
      },
      "kind": "container",
      "name": "trivy-docker-api",
      "status": "running"
    },
    {
      "details": {
        "image": "nickfedor/watchtower",
        "state": "running"
      },
      "kind": "container",
      "name": "watchtower",
      "status": "running"
    },
    {
      "details": {
        "image": "portainer/portainer-ee:latest",
        "state": "running"
      },
      "kind": "container",
      "name": "portainer",
      "status": "running"
    },
    {
      "details": {
        "image": "jc21/nginx-proxy-manager:2.15.1",
        "state": "running"
      },
      "kind": "container",
      "name": "npm",
      "status": "running"
    }
  ],
  "region": "Ubuntu 26.04.1 LTS",
  "regions": [
    "host",
    "Ubuntu 26.04.1 LTS",
    "aarch64"
  ],
  "services": [
    {
      "image": "ghcr.io/tekkifox/archview:latest",
      "kind": "container",
      "name": "archview",
      "status": "Up 19 minutes (healthy)"
    },
    {
      "image": "photoprism/photoprism:preview",
      "kind": "container",
      "name": "photoprism",
      "status": "Up About an hour"
    },
    {
      "image": "mariadb:11",
      "kind": "container",
      "name": "photoprism-database",
      "status": "Up About an hour"
    },
    {
      "image": "lscr.io/linuxserver/socket-proxy:latest",
      "kind": "container",
      "name": "socket-proxy",
      "status": "Up 2 hours (healthy)"
    },
    {
      "image": "ghcr.io/tekkifox/monitoring-trivy:latest",
      "kind": "container",
      "name": "trivy",
      "status": "Up 4 hours (healthy)"
    },
    {
      "image": "ghcr.io/tekkifox/monitoring-dashboard:latest",
      "kind": "container",
      "name": "monitoring-dashboard-1",
      "status": "Up 4 hours (healthy)"
    },
    {
      "image": "lscr.io/linuxserver/socket-proxy:latest",
      "kind": "container",
      "name": "trivy-docker-api",
      "status": "Up 27 hours (healthy)"
    },
    {
      "image": "nickfedor/watchtower",
      "kind": "container",
      "name": "watchtower",
      "status": "Up 27 hours (healthy)"
    },
    {
      "image": "portainer/portainer-ee:latest",
      "kind": "container",
      "name": "portainer",
      "status": "Up 27 hours"
    },
    {
      "image": "jc21/nginx-proxy-manager:2.15.1",
      "kind": "container",
      "name": "npm",
      "status": "Up 27 hours"
    },
    {
      "kind": "daemon",
      "name": "docker-daemon",
      "status": "11 containers, 26 images"
    }
  ],
  "status": "healthy",
  "telemetry": {
    "hosts": [
      {
        "cpu": 9,
        "cpuCount": 1,
        "diskPercent": 81.9,
        "diskTotalBytes": 82086711296,
        "diskUsedBytes": 67255967744,
        "loadAverage": [
          0.09,
          0.13,
          0.14
        ],
        "memoryPercent": 24.9,
        "memoryTotalBytes": 6187409408,
        "memoryUsedBytes": 1540100096,
        "name": "archview",
        "networkRxBytes": 113384,
        "networkTxBytes": 43483,
        "os": "Ubuntu 26.04.1 LTS",
        "processes": 221,
        "swapFreeBytes": 0,
        "swapTotalBytes": 0
      }
    ],
    "metrics": {
      "cpuAvg": 9,
      "diskPercent": 81.9,
      "diskTotalBytes": 82086711296,
      "diskUsedBytes": 67255967744,
      "hostCount": 1,
      "loadAvg": 0.09,
      "memoryPercent": 24.9,
      "memoryTotalBytes": 6187409408,
      "memoryUsedBytes": 1540100096,
      "networkRxMB": 0.10813140869140625,
      "networkTxMB": 0.04146862030029297,
      "processCount": 221,
      "swapFreeBytes": 0,
      "swapTotalBytes": 0,
      "topOS": "Ubuntu 26.04.1 LTS"
    }
  },
  "title": "Docker + Linux host overview",
  "updatedAt": "2026-10-29T22:56:54Z"
}

Recent commits

Recent changes in the image-mosaic repo.

GitHub

$ git log --oneline -n 5
4365764 chore(deps): update docker/setup-buildx-action action to v4 (#46)
e5b439b ci(vercel): deploy only from main and dev branches (#47)
e0243be chore(deps): update dependency node to v26.13.0 (#45)
10ef660 chore(deps): update pnpm to v12.16.1 (#43)
4957ea7 ci: resolve pnpm from packageManager instead of hardcoding 12.15.0 (#44)

Contact

Open to platform, DevOps, and development work.

I am available for contract and full-time work, and I enjoy collaborating with teams to improve delivery and reliability.