Flights: live OpenSky global air traffic as airplane-icon sprites, magenta for heuristically-flagged military aircraft vs. globe-tint violet for civilian, with a military-only filter and hover tooltips. Globe rendering: news clusters and conflict events switch from three-globe's built-in point/ring primitives to a custom Sprite-based objects layer so they render as tinted newspaper/helmet icons respectively, while keeping existing click/hover behavior and the conflict pulsing-ring effect. Economic Incident History: a dedicated view (new top-left "i" button) listing every detected market spike with a full-clock-hour correlation window and the complete list of articles published in it, not just a relevance-capped preview. Also: LXC/Proxmox deployment scripts (deploy/lxc/) driven by a gitignored prebuild-config.json, and three additional RSS sources (CNN, Jacobin, Der Standard). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Um48tTvZDrEgDeweFyhPYC |
||
|---|---|---|
| .. | ||
| README.md | ||
| build.sh | ||
| prebuild-config.json.template | ||
| provision.sh | ||
README.md
NewsAtlas — Proxmox LXC deployment
Builds a Proxmox LXC container running the full NewsAtlas stack (Docker +
docker-compose inside the CT), and packages it as a reusable .tar.zst
template. Supports Debian, Ubuntu, and Alpine base images.
Not executed against a real Proxmox host while writing this — there wasn't one available in that environment. The docker-compose stack itself (
../../docker-compose.yml) has been built and run end-to-end; this LXC layer just automatespct/pveam/vzdumpcalls around it. Run./build.sh <target> --dry-runfirst and read the printed commands before running for real.
Security model — read before using
build.sh writes real secrets (whatever you put in prebuild-config.json)
into /opt/newsatlas/.env inside the container's filesystem, and that
filesystem gets packaged into the .tar.zst template. This was a deliberate
choice — the safer default (inject secrets only into the running container,
never into a distributable template) was offered and explicitly declined in
favor of "clone-and-go" templates that boot with everything already
configured.
The trade-off that comes with that: every copy of the resulting
.tar.zst is a credentials-bearing artifact, for every distro variant you
build. Concretely:
- Keep template files (
local:vztmpl/.../ yourvzdumpdump directory) on storage only trusted operators can read — never a public/shared LXC template store. The whole point of a reusable template is that it gets cloned, and each clone carries the same baked-in credentials. - If a copy of the tarball is ever backed up somewhere less trusted, copied
off-host, or shared, rotate every key in
prebuild-config.json(OpenWeatherMap, ACLED, OpenSky) — there's no way to invalidate just the copy that leaked. prebuild-config.jsonitself is gitignored; don't commit it, don't paste it into issues/chat.
If you'd rather not carry that risk, don't use this path — run
docker compose up --build directly on any host (see the root README) and
manage .env there normally; nothing gets baked into a shareable artifact.
Setup
cp prebuild-config.json.template prebuild-config.json
$EDITOR prebuild-config.json # fill in secrets, LXC sizing, network, etc.
Key fields:
app.repo_url/app.branch— whereprovision.shclones the app from inside the container. Defaults to this repo's own remote.secrets.*— same keys as the root.env.example, baked in as described above.lxc.*— sizing (cores,memory_mb,disk_gb), Proxmox storage IDs (storagefor the rootfs,template_storagefor both the base template and the packaged output), networking (bridge,vlan,ip,gateway), and eitherroot_passwordorssh_public_key_filefor access.distros.*— thepveam availabletemplate-name prefix used to resolve the newest matching template for each distro. Checkpveam availableon your host if these drift.
Building
Run as root on the Proxmox VE host:
./build.sh debian # one distro
./build.sh all # debian + ubuntu + alpine
./build.sh ubuntu --dry-run # print the pct/pveam/vzdump commands, run nothing
./build.sh alpine --no-keep # destroy the scratch CT after packaging (template file only)
./build.sh debian --no-template # deploy and leave the CT running; skip packaging
Each run: allocates the next free CTID, creates the CT with nesting=1
(required to run Docker inside an LXC), installs Docker via provision.sh,
clones the app, pushes the generated .env, runs docker compose up --build, waits for /api/health, then (unless --no-template) stops the
CT and runs vzdump --mode stop --compress zstd to produce the template,
restarting the CT afterward (unless --no-keep).
Redeploying from a packaged template
pct restore <newid> <template_storage>:backup/vzdump-lxc-<ctid>-*.tar.zst --storage <storage>
pct start <newid>
The container comes up with the app already running and .env already in
place — no further provisioning needed (that's the whole point, and also
exactly why the security note above matters).