Add Gitea Actions CI/CD and deploy descriptor
CI / test (pull_request) Successful in 1m20s
CI / deploy (pull_request) Has been skipped

- .gitea/workflows/ci.yaml: test on PR/push to master, deploy on push to master
- deploy/docker-compose.yml: 15-puzzle container on the edge network with a persistent data volume
- Dockerfile: create /data owned by app for the DATA_FILE volume
- README: document deployment, required Actions secrets/variables, and persistence
This commit is contained in:
Ilia Denisov
2026-06-02 11:45:28 +02:00
parent 0910691e3c
commit 0e3e3b6c90
4 changed files with 165 additions and 0 deletions
+34
View File
@@ -37,6 +37,40 @@ Certain environment variables should be set for the server to start:
| `CONTEXT_ROOT` | Server requests URI root path, defaulting to `/` if not set. |
| `STATIC_DIR` | Directory where static files are located, defaulting to the current directory if not set. |
## Deployment
The repository ships a [Gitea Actions](https://docs.gitea.com/usage/actions/overview)
workflow ([`.gitea/workflows/ci.yaml`](.gitea/workflows/ci.yaml)) that runs the
server test suite on every pull request to `master`, and on every push to
`master` additionally rebuilds the Docker image and (re)deploys the container on
the host Docker daemon through [`deploy/docker-compose.yml`](deploy/docker-compose.yml).
The deploy job runs in host mode: it builds the image locally (no registry) and
recreates the `15-puzzle` container attached to the external `edge` Docker
network, so a host reverse proxy can route to `15-puzzle:8080`.
### Required Actions secrets and variables
Configure these under the repository's *Settings → Actions*:
| Kind | Name | Example / note |
| - | - | - |
| Secret | `BOT_TOKEN` | Telegram Bot API token. |
| Secret | `ACCESS_CODE` | Pin-code for the Statistics Screen. |
| Variable | `PROJECT_LINK` | URL to the project's source code. |
| Variable | `DATA_FILE` | `/data/data.json` (lives on the persistent volume). |
| Variable | `SERVER_PORT` | `8080`. |
| Variable | `CONTEXT_ROOT` | `/`. |
`STATIC_DIR` is intentionally left unset: the static assets (HTML, `game.wasm`,
`wasm_exec.js`) are baked into the image and served from the working directory.
### Persistence
Game data is stored on the named Docker volume `15-puzzle-data` mounted at
`/data`, so player ratings survive container recreation. The image creates
`/data` owned by the unprivileged `app` user so the volume is writable.
## Credits
- [Ebitengine](https://github.com/hajimehoshi/ebiten) game engine by Hajime Hoshi.