-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.sh
More file actions
executable file
·307 lines (265 loc) · 9.83 KB
/
Copy pathinstall.sh
File metadata and controls
executable file
·307 lines (265 loc) · 9.83 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
#!/bin/bash
set -e
# ==============================================================================
# DropImg One-Click VPS Deployment Script
# ==============================================================================
echo "==============================================="
echo "🚀 Starting DropImg One-Click Deployment"
echo "==============================================="
# Function to find the next available port
find_available_port() {
local port=$1
while lsof -Pi :$port -sTCP:LISTEN -t >/dev/null 2>&1; do
port=$((port + 1))
done
echo $port
}
# 1. Install Docker and ExifTool if missing
if ! command -v docker &> /dev/null; then
echo "🐳 Docker not found. Installing Docker..."
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
rm get-docker.sh
echo "✅ Docker installed."
else
echo "✅ Docker is already installed."
fi
if ! command -v exiftool &> /dev/null; then
echo "📸 ExifTool not found. Installing ExifTool..."
if command -v apt-get &> /dev/null; then
sudo apt-get update && sudo apt-get install -y libimage-exiftool-perl
elif command -v yum &> /dev/null; then
sudo yum install -y perl-Image-ExifTool
elif command -v dnf &> /dev/null; then
sudo dnf install -y perl-Image-ExifTool
else
echo "⚠️ Could not detect package manager. Please install ExifTool manually if needed."
fi
echo "✅ ExifTool installed."
else
echo "✅ ExifTool is already installed."
fi
# 2. Gather Configuration
echo ""
echo "⚙️ Basic Configuration Setup"
# Try to get Public IPv4 (preferring IPv4)
PUBLIC_IP=$(curl -s -4 --max-time 2 https://ifconfig.me || curl -s -4 --max-time 2 https://api.ipify.org || echo "localhost")
read -p "Enter the App Name [DropImg]: " APP_NAME
APP_NAME=${APP_NAME:-DropImg}
APP_SLUG=$(echo "$APP_NAME" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g')
SUGGESTED_APP_PORT=$(find_available_port 12312)
read -p "Enter the port to expose the app on [$SUGGESTED_APP_PORT]: " APP_PORT
APP_PORT=${APP_PORT:-$SUGGESTED_APP_PORT}
DEFAULT_URL="http://$PUBLIC_IP:$APP_PORT"
read -p "Enter your public domain/URL [$DEFAULT_URL]: " APP_URL
APP_URL=${APP_URL:-$DEFAULT_URL}
read -p "Enter a secure Admin Token (for deleting images) [press Enter to generate]: " ADMIN_TOKEN
if [ -z "$ADMIN_TOKEN" ]; then
ADMIN_TOKEN=$(openssl rand -hex 16)
echo " Generated Admin Token: $ADMIN_TOKEN"
fi
# Auth Configuration
echo ""
echo "🔐 Authentication Setup"
read -p "Do you want to enable User Authentication and Admin Access? (Y/n): " ENABLE_AUTH
ENABLE_AUTH=${ENABLE_AUTH:-y}
if [[ "$ENABLE_AUTH" =~ ^[Yy]$ ]]; then
PUBLIC_MODE=false
BETTER_AUTH_SECRET=$(openssl rand -base64 32)
BETTER_AUTH_URL=$APP_URL
echo " Better Auth Secret generated."
else
PUBLIC_MODE=true
BETTER_AUTH_SECRET=""
BETTER_AUTH_URL=""
fi
# Background Removal Configuration
echo ""
echo "🪄 Background Removal Setup"
read -p "Do you want to enable the 3rd-party background removal service (Photoroom)? (y/N): " ENABLE_BACKGROUND_REMOVAL
ENABLE_BACKGROUND_REMOVAL=${ENABLE_BACKGROUND_REMOVAL:-n}
if [[ "$ENABLE_BACKGROUND_REMOVAL" =~ ^[Yy]$ ]]; then
read -p "Enter your Photoroom API Key: " PHOTOROOM_API_KEY
if [ -n "$PHOTOROOM_API_KEY" ]; then
PHOTOROOM_API_URL="https://sdk.photoroom.com/v1/segment"
PHOTOROOM_OUTPUT_FORMAT="png"
echo " Photoroom background removal enabled."
else
echo " No API key provided. Background removal will be skipped."
PHOTOROOM_API_KEY=""
PHOTOROOM_API_URL=""
PHOTOROOM_OUTPUT_FORMAT=""
ENABLE_BACKGROUND_REMOVAL=n
fi
else
PHOTOROOM_API_KEY=""
PHOTOROOM_API_URL=""
PHOTOROOM_OUTPUT_FORMAT=""
fi
# Video upload configuration
echo ""
echo "🎬 Video Upload Setup"
read -p "Enable video uploads with chunked transfer? (Y/n): " ENABLE_VIDEO
ENABLE_VIDEO=${ENABLE_VIDEO:-y}
if [[ "$ENABLE_VIDEO" =~ ^[Yy]$ ]]; then
VIDEO_UPLOADS_ENABLED=true
read -p "Max video upload size in MB [500]: " MAX_VIDEO_UPLOAD_MB
MAX_VIDEO_UPLOAD_MB=${MAX_VIDEO_UPLOAD_MB:-500}
read -p "Enable FFmpeg H.264 optimize on upload? (y/N): " ENABLE_VIDEO_TRANSCODE
if [[ "$ENABLE_VIDEO_TRANSCODE" =~ ^[Yy]$ ]]; then
VIDEO_TRANSCODE_ENABLED=true
echo " FFmpeg optimize enabled (requires ffmpeg in the container image)."
else
VIDEO_TRANSCODE_ENABLED=false
fi
INTERNAL_UPLOAD_SECRET=$(openssl rand -hex 32)
echo " Generated internal upload secret for uploader ↔ API callbacks."
else
VIDEO_UPLOADS_ENABLED=false
MAX_VIDEO_UPLOAD_MB=500
VIDEO_TRANSCODE_ENABLED=false
INTERNAL_UPLOAD_SECRET=""
fi
# Storage Port Configuration
echo ""
echo "📦 Storage Port Configuration (External mappings)"
SUGGESTED_S3_PORT=$(find_available_port 3900)
read -p "External S3 Port [$SUGGESTED_S3_PORT]: " GARAGE_S3_PORT
GARAGE_S3_PORT=${GARAGE_S3_PORT:-$SUGGESTED_S3_PORT}
SUGGESTED_ADMIN_PORT=$(find_available_port 3903)
read -p "External Garage Admin Port [$SUGGESTED_ADMIN_PORT]: " GARAGE_RPC_PORT
GARAGE_RPC_PORT=${GARAGE_RPC_PORT:-$SUGGESTED_ADMIN_PORT}
# Cloudflare Tunnel Option
echo ""
read -p "Do you want to enable Cloudflare Tunnel? (y/N): " ENABLE_TUNNEL
ENABLE_TUNNEL=${ENABLE_TUNNEL:-n}
# 3. Setup Garage (S3 Backend) Config
echo ""
echo "🔧 Initializing Garage Storage Configuration..."
mkdir -p docker/garage/config
mkdir -p docker/garage/data/meta
mkdir -p docker/garage/data/data
GARAGE_RPC_SECRET=$(openssl rand -hex 32)
GARAGE_ADMIN_TOKEN=$(openssl rand -hex 32)
sed "s/\${GARAGE_RPC_SECRET}/$GARAGE_RPC_SECRET/g; s/\${GARAGE_ADMIN_TOKEN}/$GARAGE_ADMIN_TOKEN/g" \
docker/garage/config/garage.toml.template > docker/garage/config/garage.toml
# 4. Generate Initial .env
echo ""
echo "📝 Writing environment variables to .env..."
cat <<EOF > .env
COMPOSE_PROJECT_NAME=$APP_SLUG
APP_NAME=$APP_NAME
APP_PORT=$APP_PORT
APP_URL=$APP_URL
VITE_API_URL=$APP_URL
ADMIN_TOKEN=$ADMIN_TOKEN
PUBLIC_MODE=$PUBLIC_MODE
VITE_PUBLIC_MODE=$PUBLIC_MODE
EOF
if [[ "$ENABLE_AUTH" =~ ^[Yy]$ ]]; then
cat <<EOF >> .env
BETTER_AUTH_SECRET=$BETTER_AUTH_SECRET
BETTER_AUTH_URL=$BETTER_AUTH_URL
EOF
else
cat <<EOF >> .env
# BETTER_AUTH_SECRET=
# BETTER_AUTH_URL=
EOF
fi
if [[ "$ENABLE_BACKGROUND_REMOVAL" =~ ^[Yy]$ ]]; then
cat <<EOF >> .env
PHOTOROOM_API_KEY=$PHOTOROOM_API_KEY
PHOTOROOM_API_URL=$PHOTOROOM_API_URL
PHOTOROOM_OUTPUT_FORMAT=$PHOTOROOM_OUTPUT_FORMAT
EOF
else
cat <<EOF >> .env
# PHOTOROOM_API_KEY=
# PHOTOROOM_API_URL=https://sdk.photoroom.com/v1/segment
# PHOTOROOM_OUTPUT_FORMAT=png
EOF
fi
cat <<EOF >> .env
VIDEO_UPLOADS_ENABLED=$VIDEO_UPLOADS_ENABLED
MAX_VIDEO_UPLOAD_MB=$MAX_VIDEO_UPLOAD_MB
VIDEO_TRANSCODE_ENABLED=$VIDEO_TRANSCODE_ENABLED
INTERNAL_UPLOAD_SECRET=$INTERNAL_UPLOAD_SECRET
API_INTERNAL_URL=http://dropimg:3000
STORAGE_DRIVER=s3
EOF
cat <<EOF >> .env
GARAGE_S3_PORT=$GARAGE_S3_PORT
GARAGE_RPC_PORT=$GARAGE_RPC_PORT
EOF
# Update cloudflared-config.yaml hostname if needed
DOMAIN_ONLY=$(echo "$APP_URL" | sed -E 's|^.*://||; s|/.*$||; s|\[?([^]]+)\]?(:.*)?|\1|')
if [ -f cloudflared-config.yaml ]; then
echo "☁️ Syncing Cloudflare Tunnel hostname to: $DOMAIN_ONLY"
sed -i "s/hostname: .*/hostname: $DOMAIN_ONLY/" cloudflared-config.yaml
fi
# 5. Start Services (Garage needs to be running to create bucket/keys)
echo ""
echo "🚀 Starting Garage storage engine..."
docker compose up -d garage
GARAGE_BIN="docker compose exec garage /garage"
echo "⏳ Waiting for Garage to initialize..."
until $GARAGE_BIN status | grep -q "HEALTHY NODES"; do
sleep 2
done
NODE_ID=$($GARAGE_BIN status | grep -A 2 "HEALTHY NODES" | tail -n 1 | awk '{print $1}')
echo "🔧 Configuring Garage layout for Node ID: $NODE_ID"
$GARAGE_BIN layout assign -z dc1 -c 10G "$NODE_ID" || true
CURRENT_VERSION=$($GARAGE_BIN layout show | grep "Version" | awk '{print $2}' || echo "0")
NEXT_VERSION=$((CURRENT_VERSION + 1))
$GARAGE_BIN layout apply --version "$NEXT_VERSION" || true
echo "🪣 Creating 'dropimg' S3 bucket..."
$GARAGE_BIN bucket create dropimg || true
echo "🔑 Generating S3 credentials..."
KEY_INFO=$($GARAGE_BIN key create dropimg-app)
S3_ACCESS_KEY_ID=$(echo "$KEY_INFO" | grep "Key ID:" | awk '{print $3}')
S3_SECRET_ACCESS_KEY=$(echo "$KEY_INFO" | grep "Secret key:" | awk '{print $3}')
$GARAGE_BIN bucket allow --read --write --owner dropimg --key dropimg-app
# Append S3 keys to .env
cat <<EOF >> .env
S3_BUCKET=dropimg
S3_ENDPOINT=http://garage:3900
S3_ACCESS_KEY_ID=$S3_ACCESS_KEY_ID
S3_SECRET_ACCESS_KEY=$S3_SECRET_ACCESS_KEY
EOF
echo ""
echo "🚀 Starting application..."
if [[ "$ENABLE_TUNNEL" =~ ^[Yy]$ ]]; then
echo " (Including Cloudflare Tunnel)"
docker compose --profile tunnel up -d dropimg uploader
else
docker compose up -d dropimg uploader
fi
echo ""
echo "==============================================="
echo "✅ $APP_NAME is successfully deployed!"
echo "==============================================="
echo "📍 Application URL: $APP_URL"
echo "🔌 External Port: $APP_PORT"
echo "📦 Garage S3 Port: $GARAGE_S3_PORT"
echo "🛡️ Admin Token: $ADMIN_TOKEN"
if [[ "$ENABLE_BACKGROUND_REMOVAL" =~ ^[Yy]$ ]]; then
echo "🪄 Background Removal: Enabled (Photoroom)"
else
echo "🪄 Background Removal: Skipped"
fi
if [[ "$VIDEO_UPLOADS_ENABLED" == "true" ]]; then
echo "🎬 Video Uploads: Enabled (max ${MAX_VIDEO_UPLOAD_MB} MB, transcode=${VIDEO_TRANSCODE_ENABLED})"
echo " Chunked uploads route through the uploader service on port 8080 (proxy via app port or nginx profile)."
else
echo "🎬 Video Uploads: Disabled"
fi
echo ""
if [[ "$ENABLE_TUNNEL" =~ ^[Yy]$ ]]; then
echo "☁️ Cloudflare Tunnel is enabled."
echo " Ensure your credentials.json and cloudflared-config.yaml are correctly set."
fi
echo ""
echo "To view logs: docker compose logs -f dropimg"
echo "To stop: docker compose down"
echo "==============================================="