Prepare Alpine artifact deploy workflow
This commit is contained in:
24
deploy/openrc/abelbirdnest-web
Normal file
24
deploy/openrc/abelbirdnest-web
Normal file
@ -0,0 +1,24 @@
|
||||
#!/sbin/openrc-run
|
||||
|
||||
name="AbelBirdnest Stock"
|
||||
description="AbelBirdnest Stock Next.js standalone server"
|
||||
|
||||
directory="/var/www/abelbirdnest-web/AbelBirdNest-Stock/current"
|
||||
env_file="/var/www/abelbirdnest-web/AbelBirdNest-Stock/.env.production"
|
||||
command="/bin/sh"
|
||||
command_args="-lc 'set -a; . \"${env_file}\"; set +a; exec /usr/bin/node server.js'"
|
||||
command_user="abelbirdnest:abelbirdnest"
|
||||
command_background="yes"
|
||||
pidfile="/run/${RC_SVCNAME}.pid"
|
||||
|
||||
output_log="/var/log/abelbirdnest-web.log"
|
||||
error_log="/var/log/abelbirdnest-web.err"
|
||||
|
||||
export NODE_ENV="production"
|
||||
export PORT="3007"
|
||||
export NODE_OPTIONS="--max-old-space-size=512"
|
||||
|
||||
depend() {
|
||||
need net
|
||||
after postgresql
|
||||
}
|
||||
@ -2,21 +2,26 @@
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
IMAGE="${DOCKER_IMAGE:-node:20-bookworm-slim}"
|
||||
ARTIFACT_NAME="${ARTIFACT_NAME:-abelbirdnest-release.tar.gz}"
|
||||
IMAGE="${DOCKER_IMAGE:-node:20-alpine}"
|
||||
RELEASE_STAMP="${RELEASE_STAMP:-$(date +%Y%m%d-%H%M%S)}"
|
||||
ARTIFACT_NAME="${ARTIFACT_NAME:-abelbirdnest-release-${RELEASE_STAMP}.tar.gz}"
|
||||
NODE_MEMORY_MB="${NODE_MEMORY_MB:-4096}"
|
||||
|
||||
cd "$ROOT_DIR"
|
||||
|
||||
if ! command -v docker >/dev/null 2>&1; then
|
||||
echo "Docker is required to build the Alpine Linux release artifact." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
docker run --rm \
|
||||
-v "$ROOT_DIR":/src:ro \
|
||||
-v "$ROOT_DIR":/out \
|
||||
-w / \
|
||||
"$IMAGE" \
|
||||
bash -lc '
|
||||
set -euo pipefail
|
||||
apt-get update >/dev/null
|
||||
apt-get install -y --no-install-recommends openssl >/dev/null
|
||||
sh -lc '
|
||||
set -eu
|
||||
apk add --no-cache openssl >/dev/null
|
||||
rm -rf /work
|
||||
mkdir -p /work
|
||||
cp -R /src/. /work/
|
||||
|
||||
@ -7,11 +7,22 @@ if [ "$#" -lt 1 ]; then
|
||||
fi
|
||||
|
||||
TARGET="$1"
|
||||
REMOTE_BASE_DIR="${2:-/var/www/abelbirdnest-web}"
|
||||
ARTIFACT_NAME="${ARTIFACT_NAME:-abelbirdnest-release.tar.gz}"
|
||||
REMOTE_BASE_DIR="${2:-/var/www/abelbirdnest-web/AbelBirdNest-Stock}"
|
||||
ARTIFACT_NAME="${ARTIFACT_NAME:-$(ls -t abelbirdnest-release-*.tar.gz 2>/dev/null | head -n 1)}"
|
||||
RELEASE_NAME="${RELEASE_NAME:-$(date +%Y%m%d-%H%M%S)}"
|
||||
REMOTE_RELEASE_DIR="$REMOTE_BASE_DIR/releases/$RELEASE_NAME"
|
||||
|
||||
if [ -z "$ARTIFACT_NAME" ]; then
|
||||
echo "No artifact found. Run ./deploy/scripts/build-linux-release.sh first." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$ARTIFACT_NAME" ]; then
|
||||
echo "Artifact not found: $ARTIFACT_NAME" >&2
|
||||
echo "Run ./deploy/scripts/build-linux-release.sh first." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
scp "$ARTIFACT_NAME" "$TARGET:$REMOTE_BASE_DIR/"
|
||||
|
||||
ssh "$TARGET" "mkdir -p '$REMOTE_RELEASE_DIR' && tar -xzf '$REMOTE_BASE_DIR/$ARTIFACT_NAME' -C '$REMOTE_RELEASE_DIR' && ln -sfn '$REMOTE_RELEASE_DIR' '$REMOTE_BASE_DIR/current'"
|
||||
|
||||
@ -4,11 +4,12 @@ After=network.target postgresql.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=/var/www/abelbirdnest-web/AbelBirdNest-Stock
|
||||
WorkingDirectory=/var/www/abelbirdnest-web/AbelBirdNest-Stock/current
|
||||
Environment=NODE_ENV=production
|
||||
Environment=PORT=3007
|
||||
Environment=NODE_OPTIONS=--max-old-space-size=512
|
||||
EnvironmentFile=/var/www/abelbirdnest-web/AbelBirdNest-Stock/.env.production
|
||||
ExecStart=/usr/bin/npm run start
|
||||
ExecStart=/usr/bin/node server.js
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
User=abelbirdnest
|
||||
|
||||
Reference in New Issue
Block a user