From 598e7237526d2c6f04baa9faa14dadc5911cfab0 Mon Sep 17 00:00:00 2001 From: hadi barzegar <83537317+hdbar@users.noreply.github.com> Date: Sun, 12 Apr 2026 20:33:47 +0330 Subject: [PATCH] feat(Docker): update Dockerfile for production build and add upload script for remote deployment --- Dockerfile | 21 ++++++---------- upload.sh | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 13 deletions(-) create mode 100755 upload.sh diff --git a/Dockerfile b/Dockerfile index f1afc53..5ed69e2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,9 @@ -FROM node:22.19.0 AS builder +FROM node:22.19.0-alpine AS builder WORKDIR /app -# RUN apk add --no-cache libc6-compat - COPY package*.json ./ -RUN npm i - +RUN npm ci COPY . . @@ -14,19 +11,17 @@ RUN npm run build #--- -FROM node:22.19.0 AS runner +FROM node:22.19.0-alpine AS runner WORKDIR /app +ENV NODE_ENV=production -COPY package*.json ./ -RUN npm ci --omit=dev - -COPY --from=builder /app/.next ./.next +COPY --from=builder /app/.next/standalone ./ +COPY --from=builder /app/.next/static ./.next/static COPY --from=builder /app/public ./public -COPY --from=builder /app/node_modules ./node_modules -COPY --from=builder /app/package*.json ./ +ENV HOSTNAME="0.0.0.0" EXPOSE 3000 -CMD ["npm", "start"] +CMD ["node", "server.js"] diff --git a/upload.sh b/upload.sh new file mode 100755 index 0000000..cbac87a --- /dev/null +++ b/upload.sh @@ -0,0 +1,71 @@ +#!/bin/bash +set -euo pipefail + +# Remote server configuration +REMOTE_USER="${REMOTE_USER:-root}" +REMOTE_HOST="${REMOTE_HOST:-}" +REMOTE_PATH="${REMOTE_PATH:-/opt/tm-panel}" +SSH_KEY="${SSH_KEY:-}" +CONTAINER_NAME="tm-panel" +IMAGE_NAME="tm-panel" +HOST_PORT="${HOST_PORT:-3000}" + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" + +usage() { + echo "Usage: $0 --host [--user ] [--path ] [--key ] [--port ]" + echo "" + echo "Options:" + echo " --host Remote server hostname or IP (required)" + echo " --user Remote user (default: root)" + echo " --path Remote destination path (default: /opt/tm-panel)" + echo " --key Path to SSH private key (optional)" + echo " --port Host port to expose (default: 3000)" + echo "" + echo "Environment variables REMOTE_USER, REMOTE_HOST, REMOTE_PATH, SSH_KEY, HOST_PORT can also be used." + exit 1 +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --host) REMOTE_HOST="$2"; shift 2 ;; + --user) REMOTE_USER="$2"; shift 2 ;; + --path) REMOTE_PATH="$2"; shift 2 ;; + --key) SSH_KEY="$2"; shift 2 ;; + --port) HOST_PORT="$2"; shift 2 ;; + -h|--help) usage ;; + *) echo "Unknown option: $1"; usage ;; + esac +done + +if [[ -z "$REMOTE_HOST" ]]; then + echo "Error: --host is required" + usage +fi + +SSH_CMD="ssh" +SCP_SSH="" +if [[ -n "$SSH_KEY" ]]; then + SSH_CMD="ssh -i $SSH_KEY" + SCP_SSH="-e ssh -i $SSH_KEY" +fi + +echo "==> Uploading source code to ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}" + +# Create remote directory +${SSH_CMD} "${REMOTE_USER}@${REMOTE_HOST}" "mkdir -p ${REMOTE_PATH}" + +# Rsync source code, excluding build artifacts and dev files +rsync -avz --progress --delete \ + --exclude 'node_modules/' \ + --exclude '.next/' \ + --exclude '.git/' \ + --exclude '.idea/' \ + --exclude '.vscode/' \ + --exclude 'upload.sh' \ + ${SSH_KEY:+-e "ssh -i $SSH_KEY"} \ + "${SCRIPT_DIR}/" \ + "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/" + +echo "" +echo "==> Upload complete. Building Docker image on remote..." \ No newline at end of file