Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 05ebaaeedb | |||
| 84d0f63d36 | |||
| 6a4b549d9f | |||
| f3604b438b |
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "picpeak-backend",
|
||||
"version": "1.0.120",
|
||||
"version": "1.0.122",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "picpeak-backend",
|
||||
"version": "1.0.120",
|
||||
"version": "1.0.122",
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-s3": "^3.850.0",
|
||||
"@aws-sdk/lib-storage": "^3.850.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "picpeak-backend",
|
||||
"version": "1.0.120",
|
||||
"version": "1.0.122",
|
||||
"description": "Backend for PicPeak event photo sharing platform",
|
||||
"main": "server.js",
|
||||
"scripts": {
|
||||
|
||||
@@ -115,6 +115,8 @@ const corsOptions = {
|
||||
|
||||
// Only attach CORS to API endpoints, not static assets
|
||||
app.use('/api', cors(corsOptions));
|
||||
// Handle preflight explicitly for API paths
|
||||
app.options('/api/*', cors(corsOptions));
|
||||
|
||||
// Initialize rate limiters (they will be created dynamically)
|
||||
let generalRateLimiter;
|
||||
@@ -138,6 +140,22 @@ async function initializeRateLimiters() {
|
||||
app.use(express.json({ limit: '100mb' }));
|
||||
app.use(express.urlencoded({ extended: true, limit: '100mb' }));
|
||||
|
||||
// Request logging for API routes (with timestamps)
|
||||
const apiRequestLogger = (req, res, next) => {
|
||||
try {
|
||||
const started = Date.now();
|
||||
const ts = new Date().toISOString();
|
||||
logger.info(`[${ts}] ${req.method} ${req.originalUrl}`);
|
||||
res.on('finish', () => {
|
||||
const ms = Date.now() - started;
|
||||
const tsDone = new Date().toISOString();
|
||||
logger.info(`[${tsDone}] ${req.method} ${req.originalUrl} -> ${res.statusCode} (${ms}ms)`);
|
||||
});
|
||||
} catch (_) {}
|
||||
next();
|
||||
};
|
||||
app.use('/api', apiRequestLogger);
|
||||
|
||||
// Maintenance mode middleware - add after body parsing but before routes
|
||||
app.use(maintenanceMiddleware);
|
||||
|
||||
|
||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "picpeak-frontend",
|
||||
"version": "1.0.117",
|
||||
"version": "1.0.122",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "picpeak-frontend",
|
||||
"version": "1.0.117",
|
||||
"version": "1.0.122",
|
||||
"dependencies": {
|
||||
"@tanstack/react-query": "^5.0.0",
|
||||
"@tiptap/extension-character-count": "^2.26.1",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "picpeak-frontend",
|
||||
"private": true,
|
||||
"version": "1.0.117",
|
||||
"version": "1.0.122",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
+45
-21
@@ -44,7 +44,6 @@ INSTALL_METHOD="" # docker or native
|
||||
OS_TYPE=""
|
||||
OS_VERSION=""
|
||||
PACKAGE_MANAGER=""
|
||||
ADMIN_PASSWORD=""
|
||||
ADMIN_EMAIL="admin@example.com"
|
||||
DOMAIN_NAME=""
|
||||
SMTP_HOST=""
|
||||
@@ -353,7 +352,6 @@ setup_docker_installation() {
|
||||
local jwt_secret=$(generate_jwt_secret)
|
||||
local db_password=$(generate_password)
|
||||
local redis_password=$(generate_password)
|
||||
[[ -z "$ADMIN_PASSWORD" ]] && ADMIN_PASSWORD=$(generate_password)
|
||||
|
||||
# Create .env file
|
||||
log_step "Creating configuration..."
|
||||
@@ -368,7 +366,6 @@ JWT_SECRET=$jwt_secret
|
||||
|
||||
# Admin
|
||||
ADMIN_EMAIL=$ADMIN_EMAIL
|
||||
ADMIN_PASSWORD=$ADMIN_PASSWORD
|
||||
|
||||
# Database
|
||||
DB_HOST=postgres
|
||||
@@ -395,7 +392,7 @@ SMTP_FROM=${SMTP_USER:-noreply@localhost}
|
||||
|
||||
# URLs
|
||||
FRONTEND_URL=${DOMAIN_NAME:+https://$DOMAIN_NAME}
|
||||
ADMIN_URL=${DOMAIN_NAME:+https://$DOMAIN_NAME/admin}
|
||||
ADMIN_URL=${DOMAIN_NAME:+https://$DOMAIN_NAME}
|
||||
|
||||
# Features
|
||||
ENABLE_FILE_WATCHER=true
|
||||
@@ -618,7 +615,6 @@ setup_native_installation() {
|
||||
|
||||
# Generate secrets
|
||||
local jwt_secret=$(generate_jwt_secret)
|
||||
[[ -z "$ADMIN_PASSWORD" ]] && ADMIN_PASSWORD=$(generate_password)
|
||||
|
||||
# Create .env file
|
||||
log_step "Creating configuration..."
|
||||
@@ -633,7 +629,6 @@ JWT_SECRET=$jwt_secret
|
||||
|
||||
# Admin
|
||||
ADMIN_USERNAME=admin
|
||||
ADMIN_PASSWORD=$ADMIN_PASSWORD
|
||||
ADMIN_EMAIL=$ADMIN_EMAIL
|
||||
|
||||
# Database (native uses SQLite by default)
|
||||
@@ -653,7 +648,7 @@ SMTP_FROM=${SMTP_USER:-noreply@localhost}
|
||||
|
||||
# URLs
|
||||
FRONTEND_URL=${DOMAIN_NAME:+https://$DOMAIN_NAME}
|
||||
ADMIN_URL=${DOMAIN_NAME:+https://$DOMAIN_NAME/admin}
|
||||
ADMIN_URL=${DOMAIN_NAME:+https://$DOMAIN_NAME}
|
||||
|
||||
# Features
|
||||
ENABLE_FILE_WATCHER=true
|
||||
@@ -690,8 +685,15 @@ EOF
|
||||
# Start services
|
||||
log_step "Starting services..."
|
||||
systemctl daemon-reload
|
||||
systemctl enable picpeak-backend picpeak-workers
|
||||
systemctl start picpeak-backend picpeak-workers
|
||||
systemctl enable picpeak-backend
|
||||
# Stop/remove legacy workers service if present
|
||||
if systemctl list-unit-files | grep -q '^picpeak-workers.service'; then
|
||||
systemctl disable picpeak-workers || true
|
||||
systemctl stop picpeak-workers || true
|
||||
rm -f /etc/systemd/system/picpeak-workers.service
|
||||
systemctl daemon-reload
|
||||
fi
|
||||
systemctl start picpeak-backend
|
||||
|
||||
log_success "Native installation completed!"
|
||||
}
|
||||
@@ -899,8 +901,32 @@ print_success_message() {
|
||||
echo
|
||||
echo "🔐 Admin Credentials:"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo -e "Email: ${CYAN}$ADMIN_EMAIL${NC}"
|
||||
echo -e "Password: ${CYAN}$ADMIN_PASSWORD${NC}"
|
||||
# Read from ADMIN_CREDENTIALS.txt when available
|
||||
local cred_file email_line pass_line admin_email_val admin_pass_val
|
||||
if [[ "$INSTALL_METHOD" == "docker" ]]; then
|
||||
cred_file="$app_dir/data/ADMIN_CREDENTIALS.txt"
|
||||
else
|
||||
cred_file="$NATIVE_APP_DIR/app/backend/data/ADMIN_CREDENTIALS.txt"
|
||||
fi
|
||||
if [[ -f "$cred_file" ]]; then
|
||||
email_line=$(grep -m1 '^Email:' "$cred_file" || true)
|
||||
pass_line=$(grep -m1 '^Password:' "$cred_file" || true)
|
||||
admin_email_val=${email_line#Email: }
|
||||
admin_pass_val=${pass_line#Password: }
|
||||
if [[ -n "$admin_email_val" ]]; then
|
||||
echo -e "Email: ${CYAN}$admin_email_val${NC}"
|
||||
else
|
||||
echo -e "Email: ${CYAN}$ADMIN_EMAIL${NC}"
|
||||
fi
|
||||
if [[ -n "$admin_pass_val" ]]; then
|
||||
echo -e "Password: ${CYAN}$admin_pass_val${NC}"
|
||||
else
|
||||
echo -e "Password: ${YELLOW}(see $cred_file)${NC}"
|
||||
fi
|
||||
else
|
||||
echo -e "Email: ${CYAN}$ADMIN_EMAIL${NC}"
|
||||
echo -e "Password: ${YELLOW}(credentials file not found)${NC}"
|
||||
fi
|
||||
echo
|
||||
echo -e "${YELLOW}⚠️ IMPORTANT: Change the admin password on first login!${NC}"
|
||||
|
||||
@@ -924,8 +950,8 @@ print_success_message() {
|
||||
echo "🔧 Service Commands:"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "View logs: sudo journalctl -u picpeak-backend -f"
|
||||
echo "Stop: sudo systemctl stop picpeak-backend picpeak-workers"
|
||||
echo "Start: sudo systemctl start picpeak-backend picpeak-workers"
|
||||
echo "Stop: sudo systemctl stop picpeak-backend"
|
||||
echo "Start: sudo systemctl start picpeak-backend"
|
||||
echo "Status: sudo systemctl status picpeak-backend"
|
||||
fi
|
||||
|
||||
@@ -1001,7 +1027,10 @@ update_native_installation() {
|
||||
log_step "Updating native installation..."
|
||||
|
||||
# Stop services
|
||||
systemctl stop picpeak-backend picpeak-workers
|
||||
systemctl stop picpeak-backend || true
|
||||
if systemctl list-unit-files | grep -q '^picpeak-workers.service'; then
|
||||
systemctl stop picpeak-workers || true
|
||||
fi
|
||||
|
||||
# Backup current configuration
|
||||
if [[ -f "$NATIVE_APP_DIR/app/backend/.env" ]]; then
|
||||
@@ -1042,7 +1071,7 @@ update_native_installation() {
|
||||
fi
|
||||
|
||||
# Restart services
|
||||
systemctl restart picpeak-backend picpeak-workers
|
||||
systemctl restart picpeak-backend
|
||||
|
||||
log_success "Native installation updated successfully!"
|
||||
}
|
||||
@@ -1136,10 +1165,6 @@ parse_arguments() {
|
||||
ADMIN_EMAIL="$2"
|
||||
shift 2
|
||||
;;
|
||||
--admin-password)
|
||||
ADMIN_PASSWORD="$2"
|
||||
shift 2
|
||||
;;
|
||||
--smtp-host)
|
||||
SMTP_HOST="$2"
|
||||
shift 2
|
||||
@@ -1197,7 +1222,6 @@ Options:
|
||||
--unattended Run without prompts
|
||||
--domain DOMAIN Set domain name for HTTPS
|
||||
--email EMAIL Admin email address
|
||||
--admin-password Admin password (auto-generated if not set)
|
||||
--smtp-host HOST SMTP server hostname
|
||||
--smtp-port PORT SMTP server port
|
||||
--smtp-user USER SMTP username
|
||||
@@ -1220,7 +1244,7 @@ Examples:
|
||||
|
||||
# Fully automated Docker setup
|
||||
sudo $0 --docker --unattended --domain photos.example.com \\
|
||||
--email admin@example.com --admin-password SecurePass123 \\
|
||||
--email admin@example.com \\
|
||||
--smtp-host smtp.gmail.com --smtp-port 587 \\
|
||||
--smtp-user user@gmail.com --smtp-pass app-password \\
|
||||
--enable-ssl
|
||||
|
||||
Reference in New Issue
Block a user