Archipelago — open-source initial import
This commit is contained in:
@@ -0,0 +1,129 @@
|
||||
app:
|
||||
id: botfights
|
||||
name: BotFights
|
||||
version: 1.2.11
|
||||
description: Bot competition arena with 2-player arcade fighting mode. AI bots battle in trivia challenges while humans duke it out with controllers. Built for Bitcoiners.
|
||||
category: community
|
||||
|
||||
container:
|
||||
image: 146.59.87.168:3000/lfg2025/botfights:1.2.11
|
||||
pull_policy: always
|
||||
# Auto-generated on first install (random hex, 0600, rootless-owned). The
|
||||
# 1.2.x image's server/src/middleware/jwt.ts throws at module import when
|
||||
# JWT_SECRET is unset and NODE_ENV=production, so a fresh install without
|
||||
# this crash-loops immediately. hex32 (not base64, unlike netbird) because
|
||||
# jwt.ts uses the value directly as an HMAC key with no decode step.
|
||||
generated_secrets:
|
||||
- name: botfights-jwt-secret
|
||||
kind: hex32
|
||||
secret_env:
|
||||
- key: JWT_SECRET
|
||||
secret_file: botfights-jwt-secret
|
||||
# Was missing entirely (found live during a fresh install on a second
|
||||
# node): without it, the orchestrator's bind-dir ownership fixup only
|
||||
# fires via a same-owner-as-anchor fallback that assumes an app with no
|
||||
# data_uid runs as container-internal root — but this app runs as a
|
||||
# non-root system user, so that fallback doesn't apply either. The bind
|
||||
# mount ended up unwritable, crash-looping the container on startup
|
||||
# (SqliteError: unable to open database file). Same pattern as
|
||||
# apps/fedimint-clientd/manifest.yml and apps/barkd/manifest.yml.
|
||||
#
|
||||
# 999, not 1001: the image's Dockerfile does `useradd --system` with no
|
||||
# explicit UID, which lands at 999 (confirmed via `podman exec botfights
|
||||
# id` — uid=999(botfights) gid=999(botfights)), not the security.user
|
||||
# value below. security.user is not currently read by the non-Quadlet
|
||||
# install path this app uses (only quadlet.rs consumes
|
||||
# security.{capabilities,readonly_root,no_new_privileges,network_policy}
|
||||
# for companion containers) — it's descriptive metadata here, not
|
||||
# enforced. A first pass at this fix used 1001 (copying the
|
||||
# fedimint-clientd/barkd pattern without verifying against this image)
|
||||
# and still crash-looped; corrected after inspecting the running
|
||||
# container's actual UID.
|
||||
data_uid: "999:999"
|
||||
|
||||
dependencies:
|
||||
- storage: 500Mi
|
||||
|
||||
resources:
|
||||
cpu_limit: 2
|
||||
memory_limit: 512Mi
|
||||
disk_limit: 500Mi
|
||||
|
||||
security:
|
||||
capabilities: []
|
||||
readonly_root: true
|
||||
no_new_privileges: true
|
||||
user: 999
|
||||
seccomp_profile: default
|
||||
network_policy: bridge
|
||||
apparmor_profile: default
|
||||
|
||||
ports:
|
||||
- host: 9100
|
||||
container: 9100
|
||||
protocol: tcp # Web UI + API
|
||||
|
||||
volumes:
|
||||
# A bare relative source (was "botfights-data", no leading slash) is
|
||||
# inconsistent with every other app's manifest, which uses an absolute
|
||||
# host path — found live during a fresh install on a second node:
|
||||
# resolved to /var/lib/archipelago/botfights on archi-dev-box (by
|
||||
# accident of that node's specific state) but /home/archipelago/
|
||||
# botfights-data on a different node, which doesn't exist there,
|
||||
# crash-looping the container on a real SqliteError: unable to open
|
||||
# database file. Absolute path removes the ambiguity entirely, matching
|
||||
# apps/netbird-server/manifest.yml and every other app's convention.
|
||||
- type: bind
|
||||
source: /var/lib/archipelago/botfights
|
||||
target: /app/server/data
|
||||
- type: tmpfs
|
||||
target: /tmp
|
||||
options: [rw,noexec,nosuid,size=64m]
|
||||
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- PORT=9100
|
||||
# Default-on shared public arena federation (BOT-03/D-03): this node's
|
||||
# BotFights becomes a thin client of the Foundation's well-known arena —
|
||||
# all nodes see all fighters, fights cross nodes. This is a rendezvous,
|
||||
# not an authority: any node can host its own arena (same image, just
|
||||
# without this var set), and an operator can remove this line entirely to
|
||||
# run a fully standalone, node-local arena instead.
|
||||
- ARENA_UPSTREAM_URL=https://botfights.archipelago-foundation.org
|
||||
# Tells the app it is embedded (first-party) in the node dashboard's
|
||||
# iframe, so it can safely disable X-Frame-Options: SAMEORIGIN — see
|
||||
# server/src/app.ts in the botfight repo. Without this the 1.2.x image's
|
||||
# default security headers block the dashboard iframe entirely.
|
||||
- ARCHY_EMBEDDED=1
|
||||
|
||||
health_check:
|
||||
type: http
|
||||
endpoint: http://localhost:9100
|
||||
path: /api/health
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 30s
|
||||
|
||||
interfaces:
|
||||
main:
|
||||
name: Web UI
|
||||
description: Bot arena and arcade fighter with controller support
|
||||
type: ui
|
||||
port: 9100
|
||||
protocol: http
|
||||
path: /
|
||||
|
||||
metadata:
|
||||
author: Dorian
|
||||
repo: https://botfights.net
|
||||
icon: /assets/img/app-icons/botfights.svg
|
||||
license: MIT
|
||||
tags:
|
||||
- bitcoin
|
||||
- gaming
|
||||
- arcade
|
||||
- fighter
|
||||
- bots
|
||||
- competition
|
||||
- controller
|
||||
Reference in New Issue
Block a user