refactor: rename remaining c4 references to games
All checks were successful
CI / Deploy / test (pull_request) Successful in 16s
CI / Deploy / lint (pull_request) Successful in 25s
CI / Deploy / deploy (pull_request) Has been skipped

Update binary name, DB path, session cookie, deploy scripts, systemd
service, Docker config, CI workflow, and .dockerignore. Remove stale
Claude command and settings files.
This commit is contained in:
Ryan Hamamura
2026-03-02 21:16:12 -10:00
parent c6885a069b
commit 6d43bdea16
14 changed files with 64 additions and 109 deletions

View File

@@ -1,45 +0,0 @@
Create a new Gitea release for this project using semantic versioning.
## Current state
Fetch tags and find the latest version:
```
!git fetch --tags && git tag --sort=-v:refname | head -5
```
Commits since the last release (if no tags exist, this shows all commits):
```
!git log $(git describe --tags --abbrev=0 2>/dev/null && echo "$(git describe --tags --abbrev=0)..HEAD" || echo "") --oneline
```
## Instructions
1. **Determine current version** from the tag output above. If no `vX.Y.Z` tags exist, treat current version as `v0.0.0`.
2. **Analyze commits** using conventional commit prefixes to pick the semver bump:
- Breaking changes (`!` after type, or `BREAKING CHANGE` in body) → **major** bump
- `feat:`**minor** bump
- `fix:`, `chore:`, `deps:`, `revert:`, and everything else → **patch** bump
- Use the **highest** applicable bump level across all commits
3. **Generate release notes** — group commits into sections:
- **Features** — `feat:` commits
- **Fixes** — `fix:` commits
- **Other** — everything else (`chore:`, `deps:`, `revert:`, etc.)
- Omit empty sections. Each commit is a bullet point with its short description (strip the prefix).
4. **Present for approval** — show the user:
- Current version → proposed new version
- The full release notes
- The exact `tea` command that will run
- Ask the user to confirm before proceeding
5. **Create the release** — on user approval, run:
```
tea releases create --login gitea --repo ryan/c4 --tag <version> --target main -t "<version>" -n "<release notes>"
```
Do NOT create a local git tag — Gitea creates it server-side.
6. **Verify** — run `tea releases ls --login gitea --repo ryan/c4` to confirm the release was created.

View File

@@ -1,10 +1,10 @@
c4 games
c4.db games.db
data/ data/
deploy/ deploy/
.env .env
.git .git
.gitignore .gitignore
assets/css/output.css assets/css/output.css
c4-deploy-*.tar.gz games-deploy-*.tar.gz
c4-deploy-*_b64*.txt games-deploy-*_b64*.txt

View File

@@ -1,8 +1,8 @@
# Log level (TRACE, DEBUG, INFO, WARN, ERROR). Defaults to INFO. # Log level (TRACE, DEBUG, INFO, WARN, ERROR). Defaults to INFO.
# LOG_LEVEL=DEBUG # LOG_LEVEL=DEBUG
# SQLite database path. Defaults to data/c4.db. # SQLite database path. Defaults to data/games.db.
# DB_PATH=data/c4.db # DB_PATH=data/games.db
# Application URL for invite links. Defaults to https://games.adriatica.io. # Application URL for invite links. Defaults to https://games.adriatica.io.
# APP_URL=http://localhost:7331 # APP_URL=http://localhost:7331
@@ -12,5 +12,5 @@
# Goose CLI migration config (only needed for running goose manually) # Goose CLI migration config (only needed for running goose manually)
GOOSE_DRIVER=sqlite3 GOOSE_DRIVER=sqlite3
GOOSE_DBSTRING=data/c4.db?_pragma=foreign_keys(1)&_pragma=journal_mode(WAL) GOOSE_DBSTRING=data/games.db?_pragma=foreign_keys(1)&_pragma=journal_mode(WAL)
GOOSE_MIGRATION_DIR=db/migrations GOOSE_MIGRATION_DIR=db/migrations

View File

@@ -6,7 +6,7 @@ on:
pull_request: pull_request:
env: env:
DEPLOY_DIR: /home/ryan/c4 DEPLOY_DIR: /home/ryan/games
jobs: jobs:
test: test:

View File

@@ -9,10 +9,10 @@ RUN go mod download
COPY . . COPY . .
RUN go tool gotailwind -i assets/css/input.css -o assets/css/output.css --minify RUN go tool gotailwind -i assets/css/input.css -o assets/css/output.css --minify
RUN --mount=type=cache,target=/root/.cache/go-build \ RUN --mount=type=cache,target=/root/.cache/go-build \
CGO_ENABLED=0 go build -ldflags="-s" -o /bin/c4 . CGO_ENABLED=0 go build -ldflags="-s" -o /bin/games .
RUN upx -9 -k /bin/c4 RUN upx -9 -k /bin/games
FROM scratch FROM scratch
ENV PORT=8080 ENV PORT=8080
COPY --from=build /bin/c4 / COPY --from=build /bin/games /
ENTRYPOINT ["/c4"] ENTRYPOINT ["/games"]

View File

@@ -27,9 +27,9 @@ tasks:
- "assets/css/output.css" - "assets/css/output.css"
build: build:
desc: Production build to bin/c4 desc: Production build to bin/games
cmds: cmds:
- go build -o bin/c4 . - go build -o bin/games .
deps: deps:
- build:templ - build:templ
- build:styles - build:styles
@@ -49,8 +49,8 @@ tasks:
cmds: cmds:
- | - |
go tool air \ go tool air \
-build.cmd "go build -tags=dev -o tmp/bin/c4 ." \ -build.cmd "go build -tags=dev -o tmp/bin/games ." \
-build.bin "tmp/bin/c4" \ -build.bin "tmp/bin/games" \
-build.exclude_dir "data,bin,tmp,deploy" \ -build.exclude_dir "data,bin,tmp,deploy" \
-build.include_ext "go,templ" \ -build.include_ext "go,templ" \
-misc.clean_on_exit "true" -misc.clean_on_exit "true"
@@ -75,7 +75,7 @@ tasks:
run: run:
desc: Build and run the server desc: Build and run the server
cmds: cmds:
- ./bin/c4 - ./bin/games
deps: deps:
- build - build

View File

@@ -71,6 +71,6 @@ func loadBase() *Config {
} }
}(), }(),
AppURL: getEnv("APP_URL", "https://games.adriatica.io"), AppURL: getEnv("APP_URL", "https://games.adriatica.io"),
DBPath: getEnv("DB_PATH", "data/c4.db"), DBPath: getEnv("DB_PATH", "data/games.db"),
} }
} }

View File

@@ -1,11 +1,11 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Deploy the c4 binary to /opt/c4, then restart the service. # Deploy the games binary to /opt/games, then restart the service.
# Works from the repo (builds first) or from an extracted tarball (pre-built binary). # Works from the repo (builds first) or from an extracted tarball (pre-built binary).
set -euo pipefail set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
INSTALL_DIR="/opt/c4" INSTALL_DIR="/opt/games"
BINARY="$ROOT_DIR/c4" BINARY="$ROOT_DIR/games"
# If Go is available and we have source, build fresh # If Go is available and we have source, build fresh
if [[ -f "$ROOT_DIR/go.mod" ]] && command -v go &>/dev/null; then if [[ -f "$ROOT_DIR/go.mod" ]] && command -v go &>/dev/null; then
@@ -13,7 +13,7 @@ if [[ -f "$ROOT_DIR/go.mod" ]] && command -v go &>/dev/null; then
(cd "$ROOT_DIR" && go tool gotailwind -i assets/css/input.css -o assets/css/output.css --minify) (cd "$ROOT_DIR" && go tool gotailwind -i assets/css/input.css -o assets/css/output.css --minify)
echo "Building binary..." echo "Building binary..."
(cd "$ROOT_DIR" && CGO_ENABLED=0 go build -o c4 .) (cd "$ROOT_DIR" && CGO_ENABLED=0 go build -o games .)
fi fi
if [[ ! -f "$BINARY" ]]; then if [[ ! -f "$BINARY" ]]; then
@@ -22,10 +22,10 @@ if [[ ! -f "$BINARY" ]]; then
fi fi
echo "Installing to $INSTALL_DIR..." echo "Installing to $INSTALL_DIR..."
install -o games -g games -m 755 "$BINARY" "$INSTALL_DIR/c4" install -o games -g games -m 755 "$BINARY" "$INSTALL_DIR/games"
echo "Restarting service..." echo "Restarting service..."
systemctl restart c4.service systemctl restart games.service
echo "Done. Status:" echo "Done. Status:"
systemctl status c4.service --no-pager systemctl status games.service --no-pager

View File

@@ -1,13 +1,13 @@
[Unit] [Unit]
Description=C4 Game Lobby Description=Games Lobby
After=network.target After=network.target
[Service] [Service]
Type=simple Type=simple
User=games User=games
Group=games Group=games
WorkingDirectory=/opt/c4 WorkingDirectory=/opt/games
ExecStart=/opt/c4/c4 ExecStart=/opt/games/games
Restart=on-failure Restart=on-failure
RestartSec=5 RestartSec=5
@@ -17,7 +17,7 @@ Environment=PORT=8080
NoNewPrivileges=true NoNewPrivileges=true
ProtectSystem=strict ProtectSystem=strict
ProtectHome=true ProtectHome=true
ReadWritePaths=/opt/c4 ReadWritePaths=/opt/games
PrivateTmp=true PrivateTmp=true
[Install] [Install]

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Build the c4 binary, bundle it with deploy files into a tarball, # Build the games binary, bundle it with deploy files into a tarball,
# base64-encode it, and split into 25MB chunks for transfer. # base64-encode it, and split into 25MB chunks for transfer.
set -euo pipefail set -euo pipefail
@@ -7,14 +7,14 @@ REPO_DIR="$(cd "$(dirname "$0")/.." && pwd)"
cd "$REPO_DIR" cd "$REPO_DIR"
TIMESTAMP=$(date +%Y%m%d-%H%M%S) TIMESTAMP=$(date +%Y%m%d-%H%M%S)
TARBALL="c4-deploy-${TIMESTAMP}.tar.gz" TARBALL="games-deploy-${TIMESTAMP}.tar.gz"
BASE64_FILE="c4-deploy-${TIMESTAMP}_b64.txt" BASE64_FILE="games-deploy-${TIMESTAMP}_b64.txt"
#============================================================================== #==============================================================================
# Clean previous artifacts # Clean previous artifacts
#============================================================================== #==============================================================================
echo "--- Cleaning old artifacts ---" echo "--- Cleaning old artifacts ---"
rm -f ./c4 c4-deploy-*.tar.gz c4-deploy-*_b64*.txt rm -f ./games games-deploy-*.tar.gz games-deploy-*_b64*.txt
#============================================================================== #==============================================================================
# Build # Build
@@ -23,18 +23,18 @@ echo "--- Building CSS ---"
go tool gotailwind -i assets/css/input.css -o assets/css/output.css --minify go tool gotailwind -i assets/css/input.css -o assets/css/output.css --minify
echo "--- Building binary (linux/amd64) ---" echo "--- Building binary (linux/amd64) ---"
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o c4 . CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o games .
#============================================================================== #==============================================================================
# Verify required files # Verify required files
#============================================================================== #==============================================================================
echo "--- Verifying files ---" echo "--- Verifying files ---"
REQUIRED_FILES=( REQUIRED_FILES=(
c4 games
deploy/setup.sh deploy/setup.sh
deploy/deploy.sh deploy/deploy.sh
deploy/reassemble.sh deploy/reassemble.sh
deploy/c4.service deploy/games.service
) )
for f in "${REQUIRED_FILES[@]}"; do for f in "${REQUIRED_FILES[@]}"; do
if [[ ! -f "$f" ]]; then if [[ ! -f "$f" ]]; then
@@ -48,12 +48,12 @@ done
# Create tarball # Create tarball
#============================================================================== #==============================================================================
echo "--- Creating tarball ---" echo "--- Creating tarball ---"
tar -czf "/tmp/${TARBALL}" --transform 's,^,c4/,' \ tar -czf "/tmp/${TARBALL}" --transform 's,^,games/,' \
c4 \ games \
deploy/setup.sh \ deploy/setup.sh \
deploy/deploy.sh \ deploy/deploy.sh \
deploy/reassemble.sh \ deploy/reassemble.sh \
deploy/c4.service deploy/games.service
mv "/tmp/${TARBALL}" . mv "/tmp/${TARBALL}" .
echo " -> ${TARBALL} ($(du -h "${TARBALL}" | cut -f1))" echo " -> ${TARBALL} ($(du -h "${TARBALL}" | cut -f1))"
@@ -66,10 +66,10 @@ base64 "${TARBALL}" > "${BASE64_FILE}"
echo " -> ${BASE64_FILE} ($(du -h "${BASE64_FILE}" | cut -f1))" echo " -> ${BASE64_FILE} ($(du -h "${BASE64_FILE}" | cut -f1))"
echo "--- Splitting into 25MB chunks ---" echo "--- Splitting into 25MB chunks ---"
split -b 25M -d --additional-suffix=.txt "${BASE64_FILE}" "c4-deploy-${TIMESTAMP}_b64_part" split -b 25M -d --additional-suffix=.txt "${BASE64_FILE}" "games-deploy-${TIMESTAMP}_b64_part"
rm -f "${BASE64_FILE}" rm -f "${BASE64_FILE}"
CHUNKS=(c4-deploy-${TIMESTAMP}_b64_part*.txt) CHUNKS=(games-deploy-${TIMESTAMP}_b64_part*.txt)
echo " -> ${#CHUNKS[@]} chunk(s):" echo " -> ${#CHUNKS[@]} chunk(s):"
for chunk in "${CHUNKS[@]}"; do for chunk in "${CHUNKS[@]}"; do
echo " $chunk ($(du -h "$chunk" | cut -f1))" echo " $chunk ($(du -h "$chunk" | cut -f1))"
@@ -83,5 +83,5 @@ echo "=== Package Complete ==="
echo "" echo ""
echo "Transfer the chunk files to the target server, then run:" echo "Transfer the chunk files to the target server, then run:"
echo " ./reassemble.sh" echo " ./reassemble.sh"
echo " cd ~/c4 && sudo ./deploy/setup.sh # first time only" echo " cd ~/games && sudo ./deploy/setup.sh # first time only"
echo " cd ~/c4 && sudo ./deploy/deploy.sh" echo " cd ~/games && sudo ./deploy/deploy.sh"

View File

@@ -1,11 +1,11 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Reassembles base64 chunks and extracts the c4 deployment tarball. # Reassembles base64 chunks and extracts the games deployment tarball.
# Expects chunk files in the current directory. # Expects chunk files in the current directory.
set -euo pipefail set -euo pipefail
cd "$HOME" cd "$HOME"
echo "=== C4 Deployment Reassembler ===" echo "=== Games Deployment Reassembler ==="
echo "Working directory: $HOME" echo "Working directory: $HOME"
echo "" echo ""
@@ -14,10 +14,10 @@ echo ""
#============================================================================== #==============================================================================
echo "--- Finding chunk files ---" echo "--- Finding chunk files ---"
CHUNKS=($(ls -1 c4-deploy-*_b64_part*.txt 2>/dev/null | sort)) CHUNKS=($(ls -1 games-deploy-*_b64_part*.txt 2>/dev/null | sort))
if [[ ${#CHUNKS[@]} -eq 0 ]]; then if [[ ${#CHUNKS[@]} -eq 0 ]]; then
echo "ERROR: No chunk files found matching c4-deploy-*_b64_part*.txt" echo "ERROR: No chunk files found matching games-deploy-*_b64_part*.txt"
exit 1 exit 1
fi fi
@@ -32,8 +32,8 @@ done
echo "" echo ""
echo "--- Reassembling chunks ---" echo "--- Reassembling chunks ---"
TIMESTAMP=$(echo "${CHUNKS[0]}" | sed -E 's/c4-deploy-([0-9]+-[0-9]+)_b64_part.*/\1/') TIMESTAMP=$(echo "${CHUNKS[0]}" | sed -E 's/games-deploy-([0-9]+-[0-9]+)_b64_part.*/\1/')
TARBALL="c4-deploy-${TIMESTAMP}.tar.gz" TARBALL="games-deploy-${TIMESTAMP}.tar.gz"
COMBINED="combined_b64.txt" COMBINED="combined_b64.txt"
echo "Concatenating chunks..." echo "Concatenating chunks..."
@@ -58,12 +58,12 @@ fi
echo "" echo ""
echo "--- Archiving existing source ---" echo "--- Archiving existing source ---"
if [[ -d c4 ]]; then if [[ -d games ]]; then
rm -rf c4.bak rm -rf games.bak
mv c4 c4.bak mv games games.bak
echo " -> Moved c4 -> c4.bak" echo " -> Moved games -> games.bak"
else else
echo " -> No existing c4 directory" echo " -> No existing games directory"
fi fi
#============================================================================== #==============================================================================
@@ -73,7 +73,7 @@ echo ""
echo "--- Extracting tarball ---" echo "--- Extracting tarball ---"
tar -xzf "$TARBALL" tar -xzf "$TARBALL"
echo " -> Extracted to ~/c4" echo " -> Extracted to ~/games"
#============================================================================== #==============================================================================
# Cleanup # Cleanup
@@ -91,6 +91,6 @@ echo ""
echo "=== Reassembly Complete ===" echo "=== Reassembly Complete ==="
echo "" echo ""
echo "Next steps:" echo "Next steps:"
echo " cd ~/c4" echo " cd ~/games"
echo " sudo ./deploy/setup.sh # first time only" echo " sudo ./deploy/setup.sh # first time only"
echo " sudo ./deploy/deploy.sh" echo " sudo ./deploy/deploy.sh"

View File

@@ -10,20 +10,20 @@ fi
# Create system user if it doesn't exist # Create system user if it doesn't exist
if ! id -u games &>/dev/null; then if ! id -u games &>/dev/null; then
useradd --system --shell /usr/sbin/nologin --home-dir /opt/c4 --create-home games useradd --system --shell /usr/sbin/nologin --home-dir /opt/games --create-home games
echo "Created system user: games" echo "Created system user: games"
else else
echo "User 'games' already exists" echo "User 'games' already exists"
fi fi
# Ensure install directory exists with correct ownership # Ensure install directory exists with correct ownership
install -d -o games -g games -m 755 /opt/c4 install -d -o games -g games -m 755 /opt/games
install -d -o games -g games -m 755 /opt/c4/data install -d -o games -g games -m 755 /opt/games/data
# Install systemd unit # Install systemd unit
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
cp "$SCRIPT_DIR/c4.service" /etc/systemd/system/c4.service cp "$SCRIPT_DIR/games.service" /etc/systemd/system/games.service
systemctl daemon-reload systemctl daemon-reload
systemctl enable c4.service systemctl enable games.service
echo "Setup complete. Run deploy.sh to build and start the service." echo "Setup complete. Run deploy.sh to build and start the service."

View File

@@ -1,7 +1,7 @@
services: services:
c4: games:
build: . build: .
container_name: c4 container_name: games
restart: unless-stopped restart: unless-stopped
ports: ports:
- "8080:8080" - "8080:8080"

View File

@@ -23,7 +23,7 @@ func SetupSessionManager(db *sql.DB) (*scs.SessionManager, func()) {
sessionManager := scs.New() sessionManager := scs.New()
sessionManager.Store = store sessionManager.Store = store
sessionManager.Lifetime = 30 * 24 * time.Hour sessionManager.Lifetime = 30 * 24 * time.Hour
sessionManager.Cookie.Name = "c4_session" sessionManager.Cookie.Name = "games_session"
sessionManager.Cookie.Path = "/" sessionManager.Cookie.Path = "/"
sessionManager.Cookie.HttpOnly = true sessionManager.Cookie.HttpOnly = true
sessionManager.Cookie.Secure = true sessionManager.Cookie.Secure = true