Point the stage checkout at Gitea and keep its host ports off prod Reverb.
CI / test (push) Successful in 34s
CI / build-and-push (push) Successful in 6s
CI / deploy-stage (push) Skipped
CI / deploy (push) Successful in 12s

Cloning from the prod directory made SHA fetches fail, and APP_HOST_PORT 18180 collided with production Reverb.
This commit is contained in:
ben
2026-08-13 18:40:06 +02:00
parent 3601ce8b6f
commit 1898be4def
4 changed files with 42 additions and 11 deletions
+1 -1
View File
@@ -181,7 +181,7 @@ One-time server bootstrap (secrets + registry login):
./scripts/setup-stage.sh ./scripts/setup-stage.sh
``` ```
`setup-stage.sh` clones `$HOME/andyTranscibe-stage`, writes a unique `.env`, creates `andytranscribe-stage-caddy`, and attaches Caddy Proxy Manager to that network. You still need DNS for `stage.transcribe.z00.nu` and `reverb.stage.transcribe.z00.nu`, plus Proxy Manager hosts: `setup-stage.sh` clones `$HOME/andyTranscibe-stage` from Gitea (not the prod checkout), writes a unique `.env`, creates `andytranscribe-stage-caddy`, and attaches Caddy Proxy Manager to that network. You still need DNS for `stage.transcribe.z00.nu` and `reverb.stage.transcribe.z00.nu`, plus Proxy Manager hosts:
- `stage.transcribe.z00.nu``andytranscribe-stage-app:80` - `stage.transcribe.z00.nu``andytranscribe-stage-app:80`
- `reverb.stage.transcribe.z00.nu``andytranscribe-stage-reverb:8080` - `reverb.stage.transcribe.z00.nu``andytranscribe-stage-reverb:8080`
+3
View File
@@ -44,7 +44,10 @@ for dir in "${DIRS[@]}"; do
if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
if [[ -n "${DEPLOY_SHA}" ]]; then if [[ -n "${DEPLOY_SHA}" ]]; then
git fetch --force origin '+refs/heads/*:refs/remotes/origin/*'
if ! git cat-file -e "${DEPLOY_SHA}^{commit}" 2>/dev/null; then
git fetch --force origin "${DEPLOY_SHA}" git fetch --force origin "${DEPLOY_SHA}"
fi
git checkout --force --detach "${DEPLOY_SHA}" git checkout --force --detach "${DEPLOY_SHA}"
git reset --hard "${DEPLOY_SHA}" git reset --hard "${DEPLOY_SHA}"
# Drop local edits/hot-patches; keep runtime data and secrets. # Drop local edits/hot-patches; keep runtime data and secrets.
+8 -9
View File
@@ -8,8 +8,8 @@ GITEA_DIR="${GITEA_DIR:-${HOME}/gitea}"
REPO_OWNER="${REPO_OWNER:-ben}" REPO_OWNER="${REPO_OWNER:-ben}"
REPO_NAME="${REPO_NAME:-AndyTranscribe}" REPO_NAME="${REPO_NAME:-AndyTranscribe}"
REGISTRY_HOST="${REGISTRY_HOST:-gitea.z00.nu}" REGISTRY_HOST="${REGISTRY_HOST:-gitea.z00.nu}"
PROD_PATH="${PROD_PATH:-${HOME}/andyTranscibe}"
STAGE_PATH="${STAGE_PATH:-${HOME}/andyTranscibe-stage}" STAGE_PATH="${STAGE_PATH:-${HOME}/andyTranscibe-stage}"
GITEA_REPO_URL="https://${REGISTRY_HOST}/${REPO_OWNER}/${REPO_NAME}.git"
STAGE_URL="${STAGE_URL:-https://stage.transcribe.z00.nu}" STAGE_URL="${STAGE_URL:-https://stage.transcribe.z00.nu}"
REVERB_PUBLIC_HOST="${REVERB_PUBLIC_HOST:-reverb.stage.transcribe.z00.nu}" REVERB_PUBLIC_HOST="${REVERB_PUBLIC_HOST:-reverb.stage.transcribe.z00.nu}"
CONTAINER_PREFIX="${CONTAINER_PREFIX:-andytranscribe-stage}" CONTAINER_PREFIX="${CONTAINER_PREFIX:-andytranscribe-stage}"
@@ -59,15 +59,13 @@ fi
if [[ ! -d "${STAGE_PATH}/.git" ]]; then if [[ ! -d "${STAGE_PATH}/.git" ]]; then
mkdir -p "$(dirname "${STAGE_PATH}")" mkdir -p "$(dirname "${STAGE_PATH}")"
if [[ -d "${PROD_PATH}/.git" ]]; then git clone "${GITEA_REPO_URL}" "${STAGE_PATH}"
git clone "${PROD_PATH}" "${STAGE_PATH}"
else
git clone "https://${REGISTRY_HOST}/${REPO_OWNER}/${REPO_NAME}.git" "${STAGE_PATH}"
fi
fi fi
( (
cd "${STAGE_PATH}" cd "${STAGE_PATH}"
# Never fetch from the prod checkout; CI deploys by SHA against this origin.
git remote set-url origin "${GITEA_REPO_URL}"
git fetch origin || true git fetch origin || true
if git rev-parse --verify origin/stage >/dev/null 2>&1; then if git rev-parse --verify origin/stage >/dev/null 2>&1; then
git checkout stage git checkout stage
@@ -103,9 +101,10 @@ if [[ ! -f "${STAGE_PATH}/.env" ]]; then
upsert_env "${STAGE_PATH}/.env" "APP_KEY" "base64:$(openssl rand -base64 32)" upsert_env "${STAGE_PATH}/.env" "APP_KEY" "base64:$(openssl rand -base64 32)"
upsert_env "${STAGE_PATH}/.env" "APP_URL" "${STAGE_URL}" upsert_env "${STAGE_PATH}/.env" "APP_URL" "${STAGE_URL}"
upsert_env "${STAGE_PATH}/.env" "PUBLIC_APP_URL" "${STAGE_URL}" upsert_env "${STAGE_PATH}/.env" "PUBLIC_APP_URL" "${STAGE_URL}"
upsert_env "${STAGE_PATH}/.env" "APP_HOST_PORT" "18180" # Prod already binds 18080 (app), 18180 (reverb), and 18090 (whisper).
upsert_env "${STAGE_PATH}/.env" "REVERB_HOST_PORT" "18181" upsert_env "${STAGE_PATH}/.env" "APP_HOST_PORT" "18280"
upsert_env "${STAGE_PATH}/.env" "WHISPER_HOST_PORT" "18190" upsert_env "${STAGE_PATH}/.env" "REVERB_HOST_PORT" "18281"
upsert_env "${STAGE_PATH}/.env" "WHISPER_HOST_PORT" "18290"
upsert_env "${STAGE_PATH}/.env" "REVERB_APP_ID" "$(openssl rand -hex 8)" upsert_env "${STAGE_PATH}/.env" "REVERB_APP_ID" "$(openssl rand -hex 8)"
upsert_env "${STAGE_PATH}/.env" "REVERB_APP_KEY" "$(openssl rand -hex 16)" upsert_env "${STAGE_PATH}/.env" "REVERB_APP_KEY" "$(openssl rand -hex 16)"
upsert_env "${STAGE_PATH}/.env" "REVERB_APP_SECRET" "$(openssl rand -hex 20)" upsert_env "${STAGE_PATH}/.env" "REVERB_APP_SECRET" "$(openssl rand -hex 20)"
+29
View File
@@ -0,0 +1,29 @@
<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
class SetupStageScriptTest extends TestCase
{
public function test_clones_from_gitea_and_retargets_origin(): void
{
$script = file_get_contents(dirname(__DIR__, 2).'/scripts/setup-stage.sh');
$this->assertIsString($script);
$this->assertStringContainsString('git clone "${GITEA_REPO_URL}" "${STAGE_PATH}"', $script);
$this->assertStringContainsString('git remote set-url origin "${GITEA_REPO_URL}"', $script);
$this->assertStringNotContainsString('git clone "${PROD_PATH}"', $script);
$this->assertStringContainsString('APP_HOST_PORT" "18280"', $script);
$this->assertStringNotContainsString('APP_HOST_PORT" "18180"', $script);
}
public function test_deploy_fetches_advertised_refs_before_sha(): void
{
$script = file_get_contents(dirname(__DIR__, 2).'/scripts/deploy-production.sh');
$this->assertIsString($script);
$this->assertStringContainsString("git fetch --force origin '+refs/heads/*:refs/remotes/origin/*'", $script);
$this->assertStringContainsString('git checkout --force --detach "${DEPLOY_SHA}"', $script);
}
}