-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmakefile
More file actions
342 lines (293 loc) · 14.3 KB
/
makefile
File metadata and controls
342 lines (293 loc) · 14.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
# ==============================================================================
# Shell & Formatting
# ==============================================================================
.PHONY: help start install clean ._remote_deploy_flow docker-build-and-run docker-run
.DEFAULT_GOAL := help
BLUE := \033[1;34m
NC := \033[0m # No Color
# ==============================================================================
# Generic Project Configuration
# ==============================================================================
# Variables for deployment
ENV ?= dev
EXT ?= io
PROJECT_NAME ?= dataclouder
PROJECT_ID ?= $(PROJECT_NAME)-$(ENV) #Firebase/Google project ID
APP_ID ?= $(EXT).$(PROJECT_NAME).$(ENV) # User for mobile apps. example com.my-startup.app
DISPLAY_NAME ?= $(PROJECT_NAME)
APP_ENV ?= $(ENV)
# Versioning Strategy
VERSION := $(shell node -p "require('./package.json').version")
GIT_HASH := $(shell git rev-parse --short HEAD 2>/dev/null || echo "no-git")
# Docker Configuration
DOCKER_IMAGE_NAME ?= $(PROJECT_NAME)-front
IMAGE_FILENAME := $(DOCKER_IMAGE_NAME).tar
CONTAINER_NAME ?= $(PROJECT_NAME)-front-app
HOST_PORT ?= 7990
# GHCR Configuration
GHCR_USER ?= adamofig
GHCR_REPO ?= ghcr.io/$(GHCR_USER)/$(DOCKER_IMAGE_NAME)
# If your remote user needs a password for ssh/sudo, set it here or in your .env file.
# For ssh, it will be used with sshpass. For sudo, it will be piped to sudo -S.
# Leave empty to use passwordless sudo.
REMOTE_SUDO_PASSWORD ?= **
# If REMOTE_SUDO_PASSWORD is set, configure commands to use it for SSH authentication.
# This requires the `sshpass` utility to be installed on your local machine.
# On macOS: brew install sshpass
# On Debian/Ubuntu: sudo apt-get install sshpass
SSH_CMD = ssh
SCP_CMD = scp
ifneq ($(strip $(REMOTE_SUDO_PASSWORD)),)
SSH_CMD = sshpass -p '$(REMOTE_SUDO_PASSWORD)' ssh
SCP_CMD = sshpass -p '$(REMOTE_SUDO_PASSWORD)' scp
endif
# ==============================================================================
# Target-Specific Variables
# ==============================================================================
# These are set by the main deploy targets below
TARGET_USER ?= local
TARGET_HOST ?= localhost
REMOTE_DEPLOY_PATH ?= /tmp/$(PROJECT_NAME)
PLATFORM ?= linux/amd64 # Default platform
REMOTE_TAR_FILEPATH = $(REMOTE_DEPLOY_PATH)/$(IMAGE_FILENAME)
REMOTE_CONFIG_FILENAME = config.json
REMOTE_CONFIG_PATH = $(REMOTE_DEPLOY_PATH)/$(REMOTE_CONFIG_FILENAME)
LOCAL_CONFIG_PATH = public/config.$(APP_ENV).json
# ==============================================================================
# USER-FACING DEPLOYMENT TARGETS
# ==============================================================================
# Deploy to Local Docker (ARM64)
deploy-local: PLATFORM = linux/arm64
deploy-local: ._build-docker ._deploy-local
@echo "✅ Deployment to local Docker completed successfully."
# Deploy to Homelab Server (ARM64)
deploy-homelab: TARGET_USER = adamo
deploy-homelab: TARGET_HOST = 192.168.2.5
deploy-homelab: REMOTE_DEPLOY_PATH = /home/adamo/Documents
deploy-homelab: PLATFORM = linux/arm64
deploy-homelab: APP_ENV = homelab
deploy-homelab: ._remote_deploy_flow
@echo "✅ Deployment to Homelab on http://$(TARGET_HOST):$(HOST_PORT) completed successfully."
# Deploy to AI Lab Server (AMD64)
deploy-ailab: TARGET_USER = adamo
deploy-ailab: TARGET_HOST = 192.168.2.2
deploy-ailab: REMOTE_DEPLOY_PATH = /home/adamo/Documents
deploy-ailab: PLATFORM = linux/amd64
deploy-ailab: APP_ENV = ailab
deploy-ailab: ._remote_deploy_flow
@echo "✅ Deployment to AI Lab on http://$(TARGET_HOST):$(HOST_PORT)completed successfully."
# Deploy to GitHub Container Registry (GHCR)
push-ghcr: PLATFORM = linux/amd64
push-ghcr: ._build-and-push-ghcr
@echo "✅ Deployment to GHCR ($(GHCR_REPO)) completed successfully."
# Build Docker Image Locally
docker-build: PLATFORM = linux/amd64
docker-build: ._build-docker
@echo "✅ Docker image [$(DOCKER_IMAGE_NAME):latest] built successfully."
# Run existing Local Docker Container (without building)
docker-run: PLATFORM = linux/arm64
docker-run: ._deploy-local
@echo "✅ Container [$(CONTAINER_NAME)] is running on http://localhost:$(HOST_PORT)"
# Build and Run Local Docker Container
docker-build-and-run: PLATFORM = linux/arm64
docker-build-and-run: ._build-docker ._deploy-local
@echo "✅ Container [$(CONTAINER_NAME)] is running on http://localhost:$(HOST_PORT)"
# Deploy to Firebase Hosting
deploy:
npm run build
firebase deploy --project $(PROJECT_ID) --only hosting:$(PROJECT_ID)
# Deploy to Firebase Hosting
deploy-firebase:
@echo "🚀 Building and deploying to Firebase..."
npm run prebuild
npm run build
firebase deploy --only hosting --project $(PROJECT_ID)
@echo "✅ Deployment to Firebase completed successfully."
# Deploy to Cloudflare
deploy-cloudflare:
@echo "🚀 Preparing production configuration for Cloudflare..."
npm run prebuild
npm run config:prod
@echo "🚀 Building and deploying to Cloudflare..."
npm run build:prod
npx wrangler deploy
npm run config:dev
@echo "✅ Deployment to Cloudflare completed successfully."
# Common remote deployment flow (internal)
._remote_deploy_flow: ._build-docker ._transfer ._deploy-remote ._local-cleanup
# ==============================================================================
# INTERNAL HELPER TARGETS (not meant to be called directly)
# ==============================================================================
._build-docker:
@echo "1) 🚀 Preparing configuration for [$(APP_ENV)]..."
-@npm run config:$(APP_ENV) || npm run config:dev
@echo "2) 🚀 Building Angular app for production..."
@npm run build:prod
@echo "3) 🐳 Building Docker image [$(DOCKER_IMAGE_NAME):$(VERSION)] for [$(PLATFORM)]..."
@docker build --platform $(PLATFORM) \
--build-arg APP_ENV=$(APP_ENV) \
--build-arg VERSION=$(VERSION) \
--build-arg GIT_HASH=$(GIT_HASH) \
-t $(DOCKER_IMAGE_NAME):$(VERSION) \
-t $(DOCKER_IMAGE_NAME):latest .
._transfer:
@echo "3) 💾 Saving Docker image to [$(IMAGE_FILENAME)]..."
@docker save $(DOCKER_IMAGE_NAME):$(VERSION) -o $(IMAGE_FILENAME)
@echo "4) 🚚 Transferring files to [$(TARGET_USER)@$(TARGET_HOST)]..."
@echo " -> Transferring Docker image [$(IMAGE_FILENAME)] to [$(REMOTE_TAR_FILEPATH)]"
@$(SSH_CMD) $(TARGET_USER)@$(TARGET_HOST) "mkdir -p $(REMOTE_DEPLOY_PATH)"
@$(SCP_CMD) $(IMAGE_FILENAME) $(TARGET_USER)@$(TARGET_HOST):$(REMOTE_TAR_FILEPATH)
@echo " -> Transferring config file [$(LOCAL_CONFIG_PATH)] to [$(REMOTE_CONFIG_PATH)]"
@$(SCP_CMD) $(LOCAL_CONFIG_PATH) $(TARGET_USER)@$(TARGET_HOST):$(REMOTE_CONFIG_PATH)
._deploy-remote:
@echo "5) ⚙️ Deploying on remote host [$(TARGET_HOST)]..."
@$(SSH_CMD) -t $(TARGET_USER)@$(TARGET_HOST) '\
set -e; \
if [ -n "$(REMOTE_SUDO_PASSWORD)" ]; then \
SUDO_CMD="echo \"$(REMOTE_SUDO_PASSWORD)\" | sudo -S"; \
else \
SUDO_CMD="sudo"; \
fi; \
echo " -> 🐳 Loading Docker image..."; \
eval $$SUDO_CMD docker load -i $(REMOTE_TAR_FILEPATH); \
echo " -> 🛑 Stopping existing container [$(CONTAINER_NAME)]..."; \
eval $$SUDO_CMD docker stop $(CONTAINER_NAME) || true; \
echo " -> 🗑️ Removing existing container [$(CONTAINER_NAME)]..."; \
eval $$SUDO_CMD docker rm $(CONTAINER_NAME) || true; \
echo " -> 🚀 Starting new container [$(CONTAINER_NAME)]..."; \
eval $$SUDO_CMD docker run -d \
--name $(CONTAINER_NAME) \
-p $(HOST_PORT):80 \
-v $(REMOTE_CONFIG_PATH):/usr/share/nginx/html/assets/config.json:ro \
--restart unless-stopped \
$(DOCKER_IMAGE_NAME):$(VERSION); \
echo " -> 🧹 Cleaning up remote tarball..."; \
rm $(REMOTE_TAR_FILEPATH); \
echo " -> ✅ Remote deployment finished." '
._deploy-local:
@echo "3) 🚀 Deploying on local Docker..."
@echo " -> 🛑 Stopping and removing existing container [$(CONTAINER_NAME)]..."
-@docker stop $(CONTAINER_NAME)
-@docker rm $(CONTAINER_NAME)
@echo " -> 🚀 Starting new container [$(CONTAINER_NAME)]..."
@CONFIG_FILE=$(LOCAL_CONFIG_PATH); \
if [ ! -f "$$CONFIG_FILE" ]; then \
echo " -> ⚠️ Warning: $$CONFIG_FILE not found, falling back to public/config.json"; \
CONFIG_FILE=public/config.json; \
fi; \
docker run -d --name $(CONTAINER_NAME) -p $(HOST_PORT):80 -v $$(pwd)/$$CONFIG_FILE:/usr/share/nginx/html/assets/config.json --restart unless-stopped $(DOCKER_IMAGE_NAME):$(VERSION)
._local-cleanup:
@echo "6) 🧹 Cleaning up local tarball [$(IMAGE_FILENAME)]..."
@rm -f $(IMAGE_FILENAME)
._ghcr-login-check:
@echo "🔑 Checking GHCR login status..."
@echo "🚨 If the next step fails, please run: echo \$$CR_PAT | docker login ghcr.io -u $(GHCR_USER) --password-stdin"
._build-and-push-ghcr: ._ghcr-login-check ._build-docker
@echo "1) 🐳 Tagging and Pushing to GHCR [$(GHCR_REPO):$(VERSION)]..."
@docker tag $(DOCKER_IMAGE_NAME):$(VERSION) $(GHCR_REPO):$(VERSION)
@docker tag $(DOCKER_IMAGE_NAME):latest $(GHCR_REPO):latest
@echo "2) 🚀 Pushing to GHCR..."
@docker push $(GHCR_REPO):$(VERSION)
@docker push $(GHCR_REPO):latest
# ==============================================================================
# DEVELOPMENT & UTILITY TARGETS
# ==============================================================================
patch:
npm version patch
@echo "Bumped to version $(shell node -p "require('./package.json').version")"
minor:
npm version minor
@echo "Bumped to version $(shell node -p "require('./package.json').version")"
major:
npm version major
@echo "Bumped to version $(shell node -p "require('./package.json').version")"
rename-project:
python3 scripts/rename_project.py "$(PROJECT_NAME)" "$(APP_ID)"
update-dc:
npm run update:dc
check-deps:
@command -v firebase >/dev/null 2>&1 || { echo "Firebase CLI not found. Run 'make install-deps'"; exit 1; }
@command -v node >/dev/null 2>&1 || { echo "Node.js not found. Please install Node.js"; exit 1; }
@command -v npm >/dev/null 2>&1 || { echo "npm not found. Please install npm"; exit 1; }
install-deps:
@echo "Installing dependencies..."
npm install -g firebase-tools
npm install
init-firebase: check-deps
@echo " 🚀 Initializing Firebase project $(PROJECT_ID), lets login first 🧎♂️ and Hope none one has taken this name 🙏 ... "
firebase login
@echo "Creating Firebase project... firebase projects:create $(PROJECT_ID) --display-name "$(DISPLAY_NAME)""
firebase projects:create $(PROJECT_ID) --display-name "$(DISPLAY_NAME)"
make create-firebase-app
@echo "Installing project dependencies..."
npm install --force
@echo "Project initialized successfully!"
@echo "IMPORTANT: Please manually enable authentication and email, google and apple providers in https://console.firebase.google.com/project/$(PROJECT_ID)/authentication"
create-firebase-app:
@echo "Configuring Firebase SDK..."
@echo "Creating Firebase App and Printing new firebase keys"
$(eval SDK_CONFIG := $(shell firebase apps:create WEB $(PROJECT_ID) --project=$(PROJECT_ID) | grep "firebase apps:sdkconfig"))
@echo "SDK_CONFIG value: $(SDK_CONFIG)"
@$(SDK_CONFIG) > temp_config.txt
node scripts/update-firebase-config.js
@rm temp_config.txt
merge-upstream:
@echo "Fetching and merging updates from upstream repository..."
@if ! git config remote.upstream.url > /dev/null; then \
echo "Adding upstream remote..."; \
git remote add upstream https://github.com/dataclouder-dev/dataclouder-template-angular.git; \
fi
git fetch upstream
git checkout main
@echo "Merging upstream/main into local main branch..."
git merge upstream/main --allow-unrelated-histories || { \
echo "Merge conflicts detected. Please resolve conflicts and complete the merge manually."; \
echo "After resolving conflicts, commit changes and push to origin."; \
exit 1; \
}
deploy-release:
npm run prebuild
npm run config:prod
npm run build:prod
firebase deploy --project $(PROJECT_ID) --only hosting:$(PROJECT_ID)
start:
npm run start
# ==============================================================================
# HELP
# ==============================================================================
help:
@echo "Usage: make [target]"
@echo ""
@echo "----------------------------------------------------------------------"
@echo " Deployment Targets"
@echo "----------------------------------------------------------------------"
@echo " $(BLUE)make deploy-local$(NC) - Build and deploy the app to your local Docker."
@echo " $(BLUE)make deploy-homelab$(NC) - Build and deploy the app to the Homelab server."
@echo " $(BLUE)make deploy-ailab$(NC) - Build and deploy the app to the AI Lab server."
@echo " $(BLUE)make deploy$(NC) - Build and deploy the app to Firebase Hosting."
@echo " $(BLUE)make deploy-release$(NC) - Build and deploy a production release to Firebase."
@echo " $(BLUE)make push-ghcr$(NC) - Build and push the Docker image to GHCR."
@echo " $(BLUE)make build-docker$(NC) - Build the Docker image locally."
@echo " $(BLUE)make docker-build-and-run$(NC) - Build and run the app locally."
@echo " $(BLUE)make docker-run$(NC) - Run the already built Docker image locally."
@echo ""
@echo "----------------------------------------------------------------------"
@echo " Versioning Targets"
@echo "----------------------------------------------------------------------"
@echo " $(BLUE)make patch$(NC) - Bump version (patch: 0.0.x) and create git tag."
@echo " $(BLUE)make minor$(NC) - Bump version (minor: 0.x.0) and create git tag."
@echo " $(BLUE)make major$(NC) - Bump version (major: x.0.0) and create git tag."
@echo ""
@echo " You can override variables like this: make deploy-homelab HOST_PORT=8081"
@echo ""
@echo "----------------------------------------------------------------------"
@echo " Development & Setup"
@echo "----------------------------------------------------------------------"
@echo " $(BLUE)make start$(NC) - Run the Angular dev server."
@echo " $(BLUE)make install$(NC) - Install npm dependencies."
@echo " $(BLUE)make install-deps$(NC) - Install global dependencies like Firebase CLI."
@echo " $(BLUE)make clean$(NC) - Remove node_modules."
@echo " $(BLUE)make rename-project$(NC) - Rename project using PROJECT_NAME and APP_ID."
@echo " $(BLUE)make init-firebase$(NC) - Initialize a new Firebase project."
@echo " $(BLUE)make merge-upstream$(NC) - Merge updates from the template repository."
@echo ""