Compare commits

..

4 Commits

Author SHA1 Message Date
Gitea Actions Bot 531831e84b chore: bump backend version to 1.0.120 2025-09-09 18:28:39 +00:00
paul 90bb21e38b fix(cors): scope CORS to /api only and avoid throwing on disallowed origins; prevents static asset 500s on native
Mirror to GitHub / mirror (push) Successful in 37s
Test and Lint / backend-test (push) Successful in 1m28s
Test and Lint / frontend-test (push) Successful in 2m9s
Version and Release / version-bump (push) Successful in 52s
Version and Release / trigger-drone (push) Successful in 3s
2025-09-09 20:23:25 +02:00
paul 2f1a137342 ci: make ghcr login non-fatal and gate pushes/scans on login success; build images regardless (supports transient GHCR outages)
Mirror to GitHub / mirror (push) Successful in 45s
Test and Lint / backend-test (push) Successful in 1m31s
Test and Lint / frontend-test (push) Successful in 2m8s
Version and Release / version-bump (push) Successful in 44s
Version and Release / trigger-drone (push) Has been skipped
2025-09-09 20:12:15 +02:00
paul adf576fbe1 fix(setup/update): detect native installs first (/opt/picpeak/app/backend or systemd unit); avoid false docker updates on root
Mirror to GitHub / mirror (push) Successful in 35s
Test and Lint / backend-test (push) Successful in 1m29s
Test and Lint / frontend-test (push) Has been cancelled
Version and Release / version-bump (push) Has been cancelled
Version and Release / trigger-drone (push) Has been cancelled
2025-09-09 20:08:51 +02:00
5 changed files with 46 additions and 23 deletions
+13 -7
View File
@@ -43,6 +43,8 @@ jobs:
- name: Log in to Container Registry - name: Log in to Container Registry
if: github.event_name != 'pull_request' || github.event.inputs.push == 'true' if: github.event_name != 'pull_request' || github.event.inputs.push == 'true'
id: login-ghcr
continue-on-error: true
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
registry: ${{ env.REGISTRY }} registry: ${{ env.REGISTRY }}
@@ -73,7 +75,8 @@ jobs:
with: with:
context: ./backend context: ./backend
file: ./backend/Dockerfile file: ./backend/Dockerfile
push: ${{ github.event_name != 'pull_request' || github.event.inputs.push == 'true' }} # Always build; only push when registry login succeeded
push: ${{ (github.event_name != 'pull_request' || github.event.inputs.push == 'true') && steps.login-ghcr.outcome == 'success' }}
tags: ${{ steps.meta-backend.outputs.tags }} tags: ${{ steps.meta-backend.outputs.tags }}
labels: ${{ steps.meta-backend.outputs.labels }} labels: ${{ steps.meta-backend.outputs.labels }}
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
@@ -86,7 +89,7 @@ jobs:
VERSION=${{ steps.meta-backend.outputs.version }} VERSION=${{ steps.meta-backend.outputs.version }}
- name: Run Trivy vulnerability scanner - name: Run Trivy vulnerability scanner
if: github.event_name != 'pull_request' if: github.event_name != 'pull_request' && steps.login-ghcr.outcome == 'success'
uses: aquasecurity/trivy-action@master uses: aquasecurity/trivy-action@master
with: with:
image-ref: ${{ env.REGISTRY }}/${{ env.BACKEND_IMAGE_NAME }}:${{ steps.meta-backend.outputs.version }} image-ref: ${{ env.REGISTRY }}/${{ env.BACKEND_IMAGE_NAME }}:${{ steps.meta-backend.outputs.version }}
@@ -96,7 +99,7 @@ jobs:
timeout: '10m' timeout: '10m'
- name: Upload Trivy scan results to GitHub Security tab - name: Upload Trivy scan results to GitHub Security tab
if: github.event_name != 'pull_request' if: github.event_name != 'pull_request' && steps.login-ghcr.outcome == 'success'
uses: github/codeql-action/upload-sarif@v3 uses: github/codeql-action/upload-sarif@v3
with: with:
sarif_file: 'trivy-backend.sarif' sarif_file: 'trivy-backend.sarif'
@@ -120,6 +123,8 @@ jobs:
- name: Log in to Container Registry - name: Log in to Container Registry
if: github.event_name != 'pull_request' || github.event.inputs.push == 'true' if: github.event_name != 'pull_request' || github.event.inputs.push == 'true'
id: login-ghcr
continue-on-error: true
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
registry: ${{ env.REGISTRY }} registry: ${{ env.REGISTRY }}
@@ -150,7 +155,8 @@ jobs:
with: with:
context: ./frontend context: ./frontend
file: ./frontend/Dockerfile file: ./frontend/Dockerfile
push: ${{ github.event_name != 'pull_request' || github.event.inputs.push == 'true' }} # Always build; only push when registry login succeeded
push: ${{ (github.event_name != 'pull_request' || github.event.inputs.push == 'true') && steps.login-ghcr.outcome == 'success' }}
tags: ${{ steps.meta-frontend.outputs.tags }} tags: ${{ steps.meta-frontend.outputs.tags }}
labels: ${{ steps.meta-frontend.outputs.labels }} labels: ${{ steps.meta-frontend.outputs.labels }}
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
@@ -163,7 +169,7 @@ jobs:
VERSION=${{ steps.meta-frontend.outputs.version }} VERSION=${{ steps.meta-frontend.outputs.version }}
- name: Run Trivy vulnerability scanner - name: Run Trivy vulnerability scanner
if: github.event_name != 'pull_request' if: github.event_name != 'pull_request' && steps.login-ghcr.outcome == 'success'
uses: aquasecurity/trivy-action@master uses: aquasecurity/trivy-action@master
with: with:
image-ref: ${{ env.REGISTRY }}/${{ env.FRONTEND_IMAGE_NAME }}:${{ steps.meta-frontend.outputs.version }} image-ref: ${{ env.REGISTRY }}/${{ env.FRONTEND_IMAGE_NAME }}:${{ steps.meta-frontend.outputs.version }}
@@ -173,7 +179,7 @@ jobs:
timeout: '10m' timeout: '10m'
- name: Upload Trivy scan results to GitHub Security tab - name: Upload Trivy scan results to GitHub Security tab
if: github.event_name != 'pull_request' if: github.event_name != 'pull_request' && steps.login-ghcr.outcome == 'success'
uses: github/codeql-action/upload-sarif@v3 uses: github/codeql-action/upload-sarif@v3
with: with:
sarif_file: 'trivy-frontend.sarif' sarif_file: 'trivy-frontend.sarif'
@@ -220,4 +226,4 @@ jobs:
echo "- PR number (for pull requests)" >> $GITHUB_STEP_SUMMARY echo "- PR number (for pull requests)" >> $GITHUB_STEP_SUMMARY
echo "- Version tags (for releases)" >> $GITHUB_STEP_SUMMARY echo "- Version tags (for releases)" >> $GITHUB_STEP_SUMMARY
echo "- Short SHA with branch prefix" >> $GITHUB_STEP_SUMMARY echo "- Short SHA with branch prefix" >> $GITHUB_STEP_SUMMARY
echo "- \`latest\` (for main branch)" >> $GITHUB_STEP_SUMMARY echo "- \`latest\` (for main branch)" >> $GITHUB_STEP_SUMMARY
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "picpeak-backend", "name": "picpeak-backend",
"version": "1.0.119", "version": "1.0.120",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "picpeak-backend", "name": "picpeak-backend",
"version": "1.0.119", "version": "1.0.120",
"dependencies": { "dependencies": {
"@aws-sdk/client-s3": "^3.850.0", "@aws-sdk/client-s3": "^3.850.0",
"@aws-sdk/lib-storage": "^3.850.0", "@aws-sdk/lib-storage": "^3.850.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "picpeak-backend", "name": "picpeak-backend",
"version": "1.0.119", "version": "1.0.120",
"description": "Backend for PicPeak event photo sharing platform", "description": "Backend for PicPeak event photo sharing platform",
"main": "server.js", "main": "server.js",
"scripts": { "scripts": {
+8 -6
View File
@@ -84,14 +84,14 @@ app.use((req, res, next) => {
next(); next();
}); });
// CORS configuration // CORS configuration (apply only to API routes)
const corsOptions = { const corsOptions = {
origin: function (origin, callback) { origin: function (origin, callback) {
const allowedOrigins = [ const allowedOrigins = [
process.env.FRONTEND_URL || 'http://localhost:3005', process.env.FRONTEND_URL || 'http://localhost:3005',
process.env.ADMIN_URL || 'http://localhost:3005' process.env.ADMIN_URL || 'http://localhost:3005'
]; ];
// In development, also allow localhost origins // In development, also allow localhost origins
if (process.env.NODE_ENV === 'development') { if (process.env.NODE_ENV === 'development') {
allowedOrigins.push( allowedOrigins.push(
@@ -101,18 +101,20 @@ const corsOptions = {
'http://localhost:3000' // Direct backend access 'http://localhost:3000' // Direct backend access
); );
} }
// Allow requests with no origin (like mobile apps or curl) // Allow requests with no origin (like curl) and allow-listed origins
if (!origin || allowedOrigins.indexOf(origin) !== -1) { if (!origin || allowedOrigins.indexOf(origin) !== -1) {
callback(null, true); callback(null, true);
} else { } else {
callback(new Error('Not allowed by CORS')); // Do not error globally; just omit CORS headers on disallowed origins
callback(null, false);
} }
}, },
credentials: true credentials: true
}; };
app.use(cors(corsOptions)); // Only attach CORS to API endpoints, not static assets
app.use('/api', cors(corsOptions));
// Initialize rate limiters (they will be created dynamically) // Initialize rate limiters (they will be created dynamically)
let generalRateLimiter; let generalRateLimiter;
+22 -7
View File
@@ -944,16 +944,31 @@ print_success_message() {
update_installation() { update_installation() {
print_header "Updating PicPeak" print_header "Updating PicPeak"
# Detect existing installation # Prefer explicit native install detection first
if [[ -d "$DOCKER_APP_DIR" ]] || [[ -d "/home/${SUDO_USER:-}/picpeak" ]]; then native_detected=false
INSTALL_METHOD="docker" docker_detected=false
update_docker_installation
elif [[ -d "$NATIVE_APP_DIR" ]]; then # Native detection: app/backend exists OR systemd unit present
if [[ -d "$NATIVE_APP_DIR/app/backend" ]]; then
native_detected=true
elif command -v systemctl >/dev/null 2>&1 && systemctl list-unit-files | grep -q '^picpeak-backend.service'; then
native_detected=true
fi
# Docker detection: docker app dir or user home picpeak dir exists
if [[ -d "$DOCKER_APP_DIR" ]] || [[ -n "${SUDO_USER:-}" && -d "/home/${SUDO_USER}/picpeak" ]]; then
docker_detected=true
fi
if [[ "$native_detected" == true ]]; then
INSTALL_METHOD="native" INSTALL_METHOD="native"
update_native_installation update_native_installation
elif [[ "$docker_detected" == true ]]; then
INSTALL_METHOD="docker"
update_docker_installation
else else
die "No existing PicPeak installation found" die "No existing PicPeak installation found (native dir $NATIVE_APP_DIR/app/backend or docker dir $DOCKER_APP_DIR not present)"
fi fi
} }