4
0
Files
mranderson/infra.md
2026-01-17 22:26:34 +01:00

290 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Server
```mermaid
graph TD
Internet --> Nginx
Nginx --> Traefik
Traefik --> Gitea
Gitea --> GiteaDB[(Gitea data / SQLite)]
Traefik --> WoodpeckerServer
WoodpeckerServer --> WoodpeckerDB[(Woodpecker data / SQLite)]
WoodpeckerServer --> WoodpeckerAgent
WoodpeckerAgent --> DockerSocket[(Docker)]
Traefik --> WebApp
WebApp --> MySQL[(MySQL)]
WebApp --> Softwares[(Volume)]
Droparea --> Softwares
Nginx --> Discourse
Discourse --> ForumDB[(Postgres)]
Discourse --> Redis[(Redis)]
Nginx --> Wiki
Wiki --> WikiDB[(Postgres)]
```
# TIC-80 Pipeline
This document describes the Woodpecker CI pipeline used to build, export, upload, and publish a TIC-80 game project.
---
## Overview
The pipeline performs the following steps:
1. **Build** the TIC-80 project using a custom Docker image
2. **Export** the game to `.tic` and HTML formats
3. **Upload artifacts** to a remote server via SCP
4. **Notify an update server** to publish the new version
The pipeline is driven by environment variables so it can be reused across projects.
---
## Global Environment
```yaml
environment: &environment
GAME_NAME: mranderson
GAME_LANG: lua
```
- **GAME_NAME**: Project name (used for all outputs)
- **GAME_LANG**: Source language used by TIC-80 (Lua)
The anchor (`&environment`) allows reuse across steps.
---
## Step 1: Build & Export
```yaml
- name: build
image: git.teletype.hu/internal/tic80pro:latest
environment:
<<: *environment
XDG_RUNTIME_DIR: /tmp
commands:
- make build
- make export
```
**What it does:**
- Uses a custom TIC-80 Pro Docker image hosted in Gitea
- Runs the Makefile `build` target to assemble source files
- Runs the `export` target to generate:
- `.tic` cartridge
- `.html.zip` web build
---
## Step 2: Artifact Upload
```yaml
- name: artifact
image: alpine
environment:
<<: *environment
DROPAREA_HOST: vps.teletype.hu
DROPAREA_PORT: 2223
DROPAREA_TARGET_PATH: /home/drop
DROPAREA_USER: drop
DROPAREA_SSH_PASSWORD:
from_secret: droparea_ssh_password
commands:
- apk add --no-cache openssh-client sshpass
- mkdir -p /root/.ssh
- sshpass -p $DROPAREA_SSH_PASSWORD scp -o StrictHostKeyChecking=no -P $DROPAREA_PORT \
$GAME_NAME.$GAME_LANG \
$GAME_NAME.tic \
$GAME_NAME.html.zip \
$DROPAREA_USER@$DROPAREA_HOST:$DROPAREA_TARGET_PATH
```
**What it does:**
- Installs SCP tooling in a minimal Alpine container
- Uploads:
- Source file
- TIC-80 cartridge
- HTML export ZIP
- Uses secrets for SSH authentication
---
## Step 3: Update Notification
```yaml
- name: update
image: alpine
environment:
<<: *environment
UPDATE_SERVER: https://games.vps.teletype.hu
UPDATE_SECRET:
from_secret: update_secret_key
commands:
- apk add --no-cache curl
- curl "$UPDATE_SERVER/update?secret=$UPDATE_SECRET&name=$GAME_NAME&platform=tic80"
```
**What it does:**
- Sends an HTTP request to the update server
- Notifies that a new TIC-80 build is available
- Uses a secret key to authorize the update
---
## Result
After a successful run:
- The game is built and exported
- Artifacts are uploaded to the server
- The public game index is updated automatically
This pipeline enables **fully automated TIC-80 releases** using open tools and infrastructure.
# TIC-80 Makefile Project Builder
This Makefile provides a simple, reproducible workflow for building **TIC-80 Lua projects** from multiple source files. It is designed for small indie or experimental projects where the source code is split into logical parts and then merged into a single `.lua` cartridge.
---
## Overview
The workflow is based on four core ideas:
- Source code is split into multiple Lua files inside an `inc/` directory
- A project-specific `.inc` file defines the **build order**
- All source files are concatenated into one final `.lua` file
- TIC-80 is used in CLI mode to export runnable artifacts
This approach keeps the codebase modular while remaining compatible with TIC-80s single-file cartridge model.
---
## Project Structure
```text
project-root/
├── inc/
│ ├── core.lua
│ ├── player.lua
│ └── world.lua
├── mranderson.inc
├── Makefile
└── README.md
```
- `inc/` contains all Lua source fragments
- `<project>.inc` defines the order in which files are merged
- `<project>.lua` is generated automatically
---
## The `.inc` File
The `.inc` file is a **plain text file** listing Lua source files in build order:
```text
core.lua
player.lua
world.lua
```
The order matters. Files listed earlier are concatenated first and must define any globals used later.
---
## Usage
### Build (default)
```sh
make build
```
- Reads `mranderson.inc`
- Concatenates files from `inc/`
- Produces `mranderson.lua`
### Export (TIC-80)
```sh
make export
```
- Loads the generated Lua file into TIC-80 (CLI mode)
- Saves a `.tic` cartridge
- Exports an HTML build
### Export Assets
```sh
make export_assets
```
- **Purpose**: Extracts asset sections (PALETTE, TILES, SPRITES, MAP, SFX, MUSIC) from the compiled `<project>.lua` file.
- **Mechanism**: Uses `sed` to directly parse the generated `<project>.lua` and saves the extracted data into `inc/meta/meta.assets.lua`. This file can then be used to embed the asset data directly into other parts of the project or for version control of visual assets.
### Import Assets
The `import_assets` target was considered during development but is currently not part of the build workflow. Asset handling for TIC-80 projects within this Makefile relies solely on direct extraction (`export_assets`) from the built Lua cartridge, rather than importing external asset definitions. This target may be implemented in the future if a need for pre-build asset injection arises.
### Watch Mode
```sh
make watch
```
- Performs an initial build
- Watches the `inc/` directory and `.inc` file
- Rebuilds automatically on any change
Requires `fswatch` to be installed.
---
## Generated Artifacts
| File | Description |
|-----|-------------|
| `<project>.lua` | Merged Lua source (input for TIC-80) |
| `<project>.tic` | TIC-80 cartridge |
| `<project>.html` | Web export |
| `<project>.html.zip` | Packaged HTML build |
---
## Design Goals
- Keep TIC-80 projects modular
- Avoid manual copy-paste between files
- Enable fast iteration and experimentation
- Remain fully compatible with open-source tooling
This Makefile is intentionally minimal and transparent, favoring simplicity over abstraction.
---
## Requirements
- `make`
- `tic80` available in PATH
- `fswatch` (only for watch mode)
---
## License
MIT License — free to use, modify, and redistribute.