Compare commits
7 Commits
6848baae5f
...
feature/do
| Author | SHA1 | Date | |
|---|---|---|---|
| 84d35c1409 | |||
| 07eb48f27c | |||
| fb45c38107 | |||
| 6c21e4816e | |||
| e208e52ed9 | |||
| 5dbf69e963 | |||
| d771b28d88 |
@@ -71,6 +71,11 @@ jobs:
|
|||||||
PROD_DEPLOY_PATH: ${{ vars.PROD_DEPLOY_PATH }}
|
PROD_DEPLOY_PATH: ${{ vars.PROD_DEPLOY_PATH }}
|
||||||
PROD_BACKUP_ROOT: ${{ vars.PROD_BACKUP_ROOT }}
|
PROD_BACKUP_ROOT: ${{ vars.PROD_BACKUP_ROOT }}
|
||||||
PROD_GIT_URL: ${{ vars.PROD_GIT_URL }}
|
PROD_GIT_URL: ${{ vars.PROD_GIT_URL }}
|
||||||
|
DB_HOST: ${{ vars.PROD_DB_HOST }}
|
||||||
|
DB_PORT: ${{ vars.PROD_DB_PORT }}
|
||||||
|
DB_USER: ${{ vars.PROD_DB_USER }}
|
||||||
|
DB_PASS: ${{ secrets.PROD_DB_PASS }}
|
||||||
|
DB_NAME: ${{ vars.PROD_DB_NAME }}
|
||||||
TARGET_BRANCH: ${{ github.event.inputs.target_branch }}
|
TARGET_BRANCH: ${{ github.event.inputs.target_branch }}
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
@@ -78,7 +83,7 @@ jobs:
|
|||||||
|
|
||||||
ssh "${PROD_USER}@${PROD_HOST}" "mkdir -p '${PROD_DEPLOY_PATH}'"
|
ssh "${PROD_USER}@${PROD_HOST}" "mkdir -p '${PROD_DEPLOY_PATH}'"
|
||||||
|
|
||||||
EFFECTIVE_BACKUP_ROOT="${PROD_BACKUP_ROOT:-${PROD_DEPLOY_PATH%/}_backups}"
|
EFFECTIVE_BACKUP_ROOT="${PROD_BACKUP_ROOT:-/home/user/dachs_backups}"
|
||||||
|
|
||||||
ssh "${PROD_USER}@${PROD_HOST}" "export DEPLOY_PATH='${PROD_DEPLOY_PATH}' BACKUP_ROOT='${EFFECTIVE_BACKUP_ROOT}'; sh -eu -s" <<'REMOTE_BACKUP'
|
ssh "${PROD_USER}@${PROD_HOST}" "export DEPLOY_PATH='${PROD_DEPLOY_PATH}' BACKUP_ROOT='${EFFECTIVE_BACKUP_ROOT}'; sh -eu -s" <<'REMOTE_BACKUP'
|
||||||
case "$BACKUP_ROOT" in
|
case "$BACKUP_ROOT" in
|
||||||
@@ -90,12 +95,12 @@ jobs:
|
|||||||
|
|
||||||
if [ -d "$DEPLOY_PATH/.git" ]; then
|
if [ -d "$DEPLOY_PATH/.git" ]; then
|
||||||
mkdir -p "$BACKUP_ROOT"
|
mkdir -p "$BACKUP_ROOT"
|
||||||
|
echo "Starting pre-deploy backup..."
|
||||||
cd "$DEPLOY_PATH"
|
cd "$DEPLOY_PATH"
|
||||||
|
|
||||||
if [ -f Makefile ] && [ -f scripts/backup.sh ]; then
|
if [ -f Makefile ] && [ -f scripts/backup.sh ]; then
|
||||||
make predeploy-backup BACKUP_ROOT="$BACKUP_ROOT"
|
make predeploy-backup ENV_FILE=.env BACKUP_ROOT="$BACKUP_ROOT"
|
||||||
else
|
else
|
||||||
echo "Skipping pre-deploy backup because current deployed revision does not contain Makefile backup tooling."
|
echo "Skipping pre-deploy backup because current deployed revision does not contain backup tooling."
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "Skipping pre-deploy backup because no existing deployment was found."
|
echo "Skipping pre-deploy backup because no existing deployment was found."
|
||||||
@@ -128,9 +133,8 @@ jobs:
|
|||||||
PROD_DEPLOY_PATH: ${{ vars.PROD_DEPLOY_PATH }}
|
PROD_DEPLOY_PATH: ${{ vars.PROD_DEPLOY_PATH }}
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
ssh "${PROD_USER}@${PROD_HOST}" "curl -fsS http://localhost/health"
|
ssh "${PROD_USER}@${PROD_HOST}" "curl -fsS http://localhost:9090/health"
|
||||||
ssh "${PROD_USER}@${PROD_HOST}" "curl -fsS http://localhost/ > /dev/null"
|
ssh "${PROD_USER}@${PROD_HOST}" "cd '${PROD_DEPLOY_PATH}' && docker compose -f docker-compose.prod.yaml exec -T backend curl -fsS http://localhost:3000/health"
|
||||||
ssh "${PROD_USER}@${PROD_HOST}" "cd '${PROD_DEPLOY_PATH}' && docker compose -f docker-compose.prod.yaml exec -T backend curl -fsS http://localhost:3000/ready"
|
|
||||||
|
|
||||||
- name: Cleanup generated env file
|
- name: Cleanup generated env file
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ ENV NODE_ENV=production
|
|||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Install curl for health checks and dumb-init for proper signal handling
|
# Install curl for health checks and dumb-init for proper signal handling
|
||||||
RUN apk add --no-cache curl dumb-init
|
RUN apk add --no-cache curl dumb-init mysql-client
|
||||||
|
|
||||||
# Copy package files
|
# Copy package files
|
||||||
COPY package*.json ./
|
COPY package*.json ./
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ services:
|
|||||||
image: nginx:stable-alpine
|
image: nginx:stable-alpine
|
||||||
container_name: itam-nginx
|
container_name: itam-nginx
|
||||||
ports:
|
ports:
|
||||||
- "80:80"
|
- "9090:80"
|
||||||
volumes:
|
volumes:
|
||||||
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
|
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
|
||||||
- ./logs/nginx:/var/log/nginx
|
- ./logs/nginx:/var/log/nginx
|
||||||
|
|||||||
@@ -21,6 +21,10 @@ require_command() {
|
|||||||
command -v "$1" >/dev/null 2>&1 || fail "Required command not found: $1"
|
command -v "$1" >/dev/null 2>&1 || fail "Required command not found: $1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
has_command() {
|
||||||
|
command -v "$1" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
load_env() {
|
load_env() {
|
||||||
[ -f "$ENV_FILE" ] || fail "Env file not found: $ENV_FILE"
|
[ -f "$ENV_FILE" ] || fail "Env file not found: $ENV_FILE"
|
||||||
|
|
||||||
@@ -37,7 +41,6 @@ load_env() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
db_dump() {
|
db_dump() {
|
||||||
require_command mysqldump
|
|
||||||
require_command gzip
|
require_command gzip
|
||||||
load_env
|
load_env
|
||||||
|
|
||||||
@@ -45,15 +48,22 @@ db_dump() {
|
|||||||
output_path="$BACKUP_ROOT/db/${DB_NAME}_${TIMESTAMP}.sql.gz"
|
output_path="$BACKUP_ROOT/db/${DB_NAME}_${TIMESTAMP}.sql.gz"
|
||||||
|
|
||||||
log "Creating DB dump: $output_path"
|
log "Creating DB dump: $output_path"
|
||||||
MYSQL_PWD="$DB_PASS" mysqldump \
|
|
||||||
--host="$DB_HOST" \
|
if has_command mysqldump; then
|
||||||
--port="$DB_PORT" \
|
MYSQL_PWD="$DB_PASS" mysqldump \
|
||||||
--user="$DB_USER" \
|
--host="$DB_HOST" \
|
||||||
--single-transaction \
|
--port="$DB_PORT" \
|
||||||
--quick \
|
--user="$DB_USER" \
|
||||||
--routines \
|
--single-transaction \
|
||||||
--triggers \
|
--quick \
|
||||||
"$DB_NAME" | gzip > "$output_path"
|
--routines \
|
||||||
|
--triggers \
|
||||||
|
"$DB_NAME" | gzip > "$output_path"
|
||||||
|
elif has_command docker; then
|
||||||
|
docker exec itam-backend sh -lc "MYSQL_PWD=\"$DB_PASS\" exec mysqldump --host=\"$DB_HOST\" --port=\"$DB_PORT\" --user=\"$DB_USER\" --single-transaction --quick --routines --triggers \"$DB_NAME\"" | gzip > "$output_path"
|
||||||
|
else
|
||||||
|
fail "Required command not found: mysqldump (and docker fallback unavailable)"
|
||||||
|
fi
|
||||||
|
|
||||||
log "DB dump completed: $output_path"
|
log "DB dump completed: $output_path"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user