Commit graph

26 commits

Author SHA1 Message Date
8d1ef17314
Merge Renovate: deps: Update actions/cache action to v6 2026-11-13 02:09:22 +04:00
cc3da0af9c
Merge Renovate: deps: Update CI actions 2026-11-13 02:09:21 +04:00
3ab8ebcf3a
ci: stop using FORGEJO_* secret names
Some checks failed
Build and Deploy to Production / test (push) Successful in 22s
Build and Deploy to Production / build (push) Failing after 1s
Build and Deploy to Production / deploy (push) Has been skipped
Forgejo reserves names starting with FORGEJO_, and since runner v13
secrets.FORGEJO_TOKEN, _USER and _REGISTRY no longer reach the job as
the values set on the repository: Kaniko logged in with the wrong
credentials and every image push failed with UNAUTHORIZED.

The registry host and user are not secret (they are in every image
name), so write them in the workflow; the token comes from FJ_TOKEN,
as in datacenterbingo.

Assisted-by: Claude:opus-5-5
2026-11-13 01:47:28 +04:00
280c961b25 deps: Update actions/cache action to v6
All checks were successful
Tests / test (push) Successful in 24s
2026-11-12 21:46:40 +00:00
98ceda5648 deps: Update CI actions
All checks were successful
Tests / test (push) Successful in 22s
2026-11-12 21:45:17 +00:00
4c10221727
admin: publish files to the public bucket
All checks were successful
Build and Deploy to Production / test (push) Successful in 27s
Build and Deploy to Production / build (push) Successful in 1m3s
Build and Deploy to Production / deploy (push) Successful in 40s
There was no way to put a file up for public use short of running an
S3 client with the uploader key. Add a "files" area to the admin:
upload one or more files, copy the link, edit the note, replace the
contents under the same link, delete. It has its own read/write/delete
permission flags like the other areas, and every action is audited.

The objects go to the storage stack's public bucket and are served by
Garage at s3.asxp.io/public/<key>, not by this app. The app's key can
only put and delete there, so a public_files table is the record of
what was published. Keys get a random prefix: links are not guessable
and names never collide.

That host is same-site with the admin, so a file that can carry script
must not render there. Only a fixed list of types (images, PDF, plain
text, audio, video) is served inline; the rest, HTML and SVG included,
is stored as an attachment. Image metadata is stripped by default, as
for the bingo photos, because of GPS tags.

A per-file limit and a total quota keep the small disk on asxpio-ops
from filling up.

Assisted-by: Claude:fable-5-2
2026-11-12 05:52:10 +04:00
dd31c20cc7
deploy: use Garage for object storage
All checks were successful
Build and Deploy to Production / test (push) Successful in 1m59s
Build and Deploy to Production / build (push) Successful in 1m15s
Build and Deploy to Production / deploy (push) Successful in 38s
The storage stack replaces MinIO, abandoned upstream, with Garage. Point
the app at garage:3900.

Garage only accepts keys in its own format, so hash the existing
ASXPIO_S3_* secrets into it the way storage's bootstrap does. The
secrets stay as they are; a pair already in Garage's format is used
unchanged.

Assisted-by: Claude:fable-5-2
2026-11-11 03:44:37 +04:00
642bec845a
ci: set nix options through NIX_CONFIG
Some checks failed
Build and Deploy to Production / test (push) Failing after 15s
Build and Deploy to Production / build (push) Has been skipped
Build and Deploy to Production / deploy (push) Has been skipped
The runner mounts a persistent nix-store volume over /nix. The current
nixos/nix image makes /etc/nix/nix.conf a symlink into /nix/store, and
the volume does not hold that path, so the link dangles and appending
to it fails before checkout: "/etc/nix/nix.conf: No such file or
directory".

Pass the settings in NIX_CONFIG instead. Without a config file Nix also
falls back to build-users-group = nixbld, which the container lacks, so
set it empty and turn the sandbox off, as the image config does.

Assisted-by: Claude:opus-5-5
2026-10-18 09:34:44 +04:00
f1ceb4efc7
bingo: store photos in their own bucket
All checks were successful
Build and Deploy to Production / test (push) Successful in 23s
Build and Deploy to Production / build (push) Successful in 1m8s
Build and Deploy to Production / deploy (push) Successful in 37s
The bingo photos sat under bingo/ in the invoice bucket. Store them in
BINGO_S3_BUCKET (datacenterbingo-photos in prod, created and pre-filled
by the storage repo with the same keys) and fall back to S3_BUCKET when
unset, so dev and tests need nothing new.

Assisted-by: Claude:opus-5
2026-10-12 04:09:08 +04:00
26e862ff04
bingo: ping IndexNow when the card changes
A newly recorded incident only showed up in search once a crawler
happened to come back. IndexNow lets Bing, Yandex and the other
participating engines know about changed URLs right away.

Bingo::IndexNow posts the card URLs plus the affected datacenter pages
to api.indexnow.org, in a background thread so admin saves don't wait.
Incidents ping their datacenter. Edits ping the datacenter, or every
page when positions move (create, delete, reorder, sort). A deleted
datacenter's pages are included so the engines see the 404. BingoWeb
serves the key at /<key>.txt.

The key comes from the INDEXNOW Forgejo secret, written to .env as
INDEXNOW_KEY. With no key set this does nothing.

Assisted-by: Claude:opus-5
2026-10-10 09:42:46 +04:00
70f1734c5d
bingo: stop serving bingo.asxp.io
All checks were successful
Build and Deploy to Production / test (push) Successful in 21s
Build and Deploy to Production / build (push) Successful in 52s
Build and Deploy to Production / deploy (push) Successful in 36s
datacenterbingo.xyz resolves now, so the stopgap second hostname is no
longer needed. Drop it from the Traefik rule and the deploy env; the
app-side BINGO_ALT_HOST support stays but is unset.

Assisted-by: Claude:opus-5
2026-10-10 06:07:37 +04:00
cd04b01e57
bingo: serve bingo.asxp.io too, credit asxp.io in footer
datacenterbingo.xyz is not in the .xyz zone yet, while bingo.asxp.io
already resolves. Serve the card on both (BINGO_ALT_HOST) so it is
reachable now; canonical and hreflang links keep pointing at the .xyz
domain. Footer gets a copyright line linking back to asxp.io.

Assisted-by: Claude:opus-5
2026-10-10 06:00:39 +04:00
90e1bbc9c5
bingo: move to datacenterbingo.xyz
All checks were successful
Build and Deploy to Production / test (push) Successful in 21s
Build and Deploy to Production / build (push) Successful in 52s
Build and Deploy to Production / deploy (push) Successful in 39s
The card gets its own domain instead of a subdomain of the IE site.
www. is routed to the same container and 301-redirected to the apex in
config.ru, so there is one canonical host for links and the cert.

Assisted-by: Claude:opus-5
2026-10-10 05:19:50 +04:00
7820f138f6
ci: read registry token from FJ_TOKEN
All checks were successful
Build and Deploy to Production / test (push) Successful in 19s
Build and Deploy to Production / build (push) Successful in 52s
Build and Deploy to Production / deploy (push) Successful in 1m0s
Forgejo no longer allows creating secrets prefixed FORGEJO_, so the
regenerated registry token (the old one got 401 reqPackageAccess on
push) has to live under a new name.

Assisted-by: Claude:opus-5
2026-10-10 04:56:55 +04:00
bdb3682e18
bingo: serve datacenter bingo on bingo.asxp.io
Some checks failed
Tests / test (push) Successful in 18s
Build and Deploy to Production / test (push) Successful in 18s
Build and Deploy to Production / build (push) Failing after 2s
Build and Deploy to Production / deploy (push) Has been skipped
Add a second public site to the same process: a 5x5 card of the 25
largest Russian datacenters where a cell is crossed out once an incident
with a public source is recorded (Yandex Sasovo and Kaluga drone strikes
on 2026-10-08/09 are seeded). config.ru dispatches by Host, so it rides
the existing container, DB and bucket instead of a new deploy.

The card is localized ru/en/uk with per-locale columns falling back to
ru. Content is managed from /admin/bingo on asxp.io, reusing AdminAuth
and CSRF. Photos go to the existing bucket under bingo/ and are proxied
by the app, so the bucket stays private and storage needs no change.

The seed data was fact-checked against operator sites and press on
2026-10-10; several entries in the original list were wrong or vague.

Assisted-by: Claude:opus-5
2026-10-10 04:51:26 +04:00
0fbb6ee809
invoices: multi-crypto payment support
All checks were successful
Build and Deploy to Production / test (push) Successful in 18s
Build and Deploy to Production / build (push) Successful in 49s
Build and Deploy to Production / deploy (push) Successful in 31s
One asset per invoice from a registry (lib/crypto_asset.rb): BTC, LTC,
ETH, XMR, SOL, ALGO, USDT/USDC on ERC-20/TRC-20/BEP-20/Solana/Algorand.
Migration 003 generalizes the ltc_* columns to crypto_* + crypto_coin
(existing LTC invoices backfilled). QR payload adapts per asset: BIP21
amount URIs where supported, bare address for tokens with a network
hint on the PDF. Default addresses come from the CRYPTO_ADDRESSES
secret (JSON code=>address); LTC_ADDRESS still works as legacy.
2026-07-03 02:01:57 +04:00
15cff895af
ci: cache gems and persist nix store between runs 2026-07-02 18:39:37 +04:00
67263cb75c
ci: gate build on tests, deploy waits for container health
Some checks failed
Build and Deploy to Production / build (push) Blocked by required conditions
Build and Deploy to Production / deploy (push) Blocked by required conditions
Build and Deploy to Production / test (push) Failing after 11m37s
2026-07-02 18:32:53 +04:00
9485b6b72a
ci: drop git install — image ships git-minimal, full git conflicts
All checks were successful
Build and Deploy to Production / build (push) Successful in 1m2s
Tests / test (push) Successful in 1m1s
Build and Deploy to Production / deploy (push) Successful in 26s
2026-07-02 18:09:39 +04:00
5dbd1d4dc8
ci: use service hostname — runner networking fixed to per-workflow bridge
Some checks failed
Tests / test (push) Failing after 18s
Build and Deploy to Production / build (push) Successful in 51s
Build and Deploy to Production / deploy (push) Successful in 24s
2026-07-02 18:02:02 +04:00
6807d41aa4
ci: publish postgres service port — job containers use host network
Some checks failed
Tests / test (push) Failing after 1s
Build and Deploy to Production / build (push) Successful in 53s
Build and Deploy to Production / deploy (push) Successful in 25s
2026-07-02 17:57:25 +04:00
9ff394c75f
ci: run test suite on push
Some checks failed
Build and Deploy to Production / build (push) Successful in 1m0s
Build and Deploy to Production / deploy (push) Successful in 43s
Tests / test (push) Failing after 1s
2026-07-02 17:38:35 +04:00
d37f1d5dfe
ltc address secret
All checks were successful
Build and Deploy to Production / build (push) Successful in 49s
Build and Deploy to Production / deploy (push) Successful in 26s
2026-06-08 18:47:58 +03:00
dc40faf5df
deploy: write invoicing env vars to .env
All checks were successful
Build and Deploy to Production / build (push) Successful in 46s
Build and Deploy to Production / deploy (push) Successful in 24s
Extends the .env heredoc the workflow drops on the prod host with:

- ADMIN_USER / ADMIN_PASSWORD     — gate /admin/*
- DATABASE_URL                    — points at the storage stack's Postgres
- S3_* (endpoint, bucket, creds)  — MinIO; S3_PUBLIC_ENDPOINT is the
                                    s3.asxp.io hostname used only for
                                    presigning so browser-facing URLs
                                    resolve over Traefik+TLS.

Non-secret values stay hardcoded in the workflow; secrets come from
Forgejo. ASXPIO_DB_PASSWORD / S3 creds must match the corresponding
secrets on the storage repo or the app can't authenticate.
2026-05-26 18:07:15 +03:00
1ab09043ee
ruby rework with contact form
All checks were successful
Build and Deploy to Production / build (push) Successful in 51s
Build and Deploy to Production / deploy (push) Successful in 34s
2026-05-05 00:45:27 +04:00
13f6db18f2
ci/cd 2025-11-25 05:24:04 +02:00