@@ -175,7 +175,7 @@ jobs:
175175 # Rollbar
176176 ROLLBAR_SCRIPT_TOKEN : ${{ secrets.ROLLBAR_SCRIPT_TOKEN }}
177177 ROLLBAR_SERVER_TOKEN : ${{ secrets.ROLLBAR_SERVER_TOKEN }}
178- API_URL : ${{ vars.STAGING_API_URL }}
178+ API_PUBLIC_URL : ${{ vars.STAGING_API_PUBLIC_URL }}
179179 # S3 Configuration
180180 SCRIPTS_S3_BUCKET : ${{ vars.SCRIPTS_S3_BUCKET }}
181181 SCRIPTS_S3_PREFIX : ${{ vars.STAGING_SCRIPTS_S3_PREFIX || 'api-files/scripts/staging' }}
@@ -213,91 +213,92 @@ jobs:
213213 run : |
214214 # Generate staging.env with secrets from GitHub
215215 # This file is included in the deployment package and copied to the server
216+ # All values are single-quoted to prevent shell interpretation of special characters
216217 {
217218 echo "# Generated by GitHub Actions"
218219 echo "# Commit: ${{ github.sha }}"
219220 echo ""
220221 echo "# ECR Images (pre-built in CI)"
221- echo "ECR_REGISTRY=$ECR_REGISTRY"
222- echo "API_IMAGE=$API_IMAGE"
222+ echo "ECR_REGISTRY=' $ECR_REGISTRY' "
223+ echo "API_IMAGE=' $API_IMAGE' "
223224 echo ""
224225 echo "# Environment"
225- echo "ENVIRONMENT=staging"
226- echo "DEBUG=False"
227- echo "TESTING=false"
226+ echo "ENVIRONMENT=' staging' "
227+ echo "DEBUG=' False' "
228+ echo "TESTING=' false' "
228229 echo ""
229230 echo "# Flask/API Configuration"
230- echo "SECRET_KEY=$SECRET_KEY"
231- echo "JWT_SECRET_KEY=$JWT_SECRET_KEY"
232- echo "API_ENVIRONMENT_USER=$API_ENVIRONMENT_USER"
233- echo "API_ENVIRONMENT_USER_PASSWORD=$API_ENVIRONMENT_USER_PASSWORD"
231+ echo "SECRET_KEY=' $SECRET_KEY' "
232+ echo "JWT_SECRET_KEY=' $JWT_SECRET_KEY' "
233+ echo "API_ENVIRONMENT_USER=' $API_ENVIRONMENT_USER' "
234+ echo "API_ENVIRONMENT_USER_PASSWORD=' $API_ENVIRONMENT_USER_PASSWORD' "
234235 echo ""
235236 echo "# Database Configuration"
236- echo "DATABASE_URL=$DATABASE_URL"
237+ echo "DATABASE_URL=' $DATABASE_URL' "
237238 echo ""
238239 echo "# Redis Configuration (uses stack Redis service)"
239- echo "REDIS_URL=redis://redis:6379/0"
240+ echo "REDIS_URL=' redis://redis:6379/0' "
240241 echo ""
241242 echo "# Rate Limiting"
242- echo "RATE_LIMITING_ENABLED=$RATE_LIMITING_ENABLED"
243- echo "RATE_LIMIT_STORAGE_URI=redis://redis:6379/1"
244- echo "DEFAULT_LIMITS=$RATE_LIMIT_DEFAULT_LIMITS"
245- echo "API_LIMITS=$RATE_LIMIT_API_LIMITS"
246- echo "AUTH_LIMITS=$RATE_LIMIT_AUTH_LIMITS"
247- echo "PASSWORD_RESET_LIMITS=$RATE_LIMIT_PASSWORD_RESET_LIMITS"
248- echo "USER_CREATION_LIMITS=$RATE_LIMIT_USER_CREATION_LIMITS"
249- echo "EXECUTION_RUN_LIMITS=$RATE_LIMIT_EXECUTION_RUN_LIMITS"
250- echo "TRUSTED_PROXY_COUNT=$RATE_LIMIT_TRUSTED_PROXY_COUNT"
251- echo "INTERNAL_NETWORKS=$RATE_LIMIT_INTERNAL_NETWORKS"
243+ echo "RATE_LIMITING_ENABLED=' $RATE_LIMITING_ENABLED' "
244+ echo "RATE_LIMIT_STORAGE_URI=' redis://redis:6379/1' "
245+ echo "DEFAULT_LIMITS=' $RATE_LIMIT_DEFAULT_LIMITS' "
246+ echo "API_LIMITS=' $RATE_LIMIT_API_LIMITS' "
247+ echo "AUTH_LIMITS=' $RATE_LIMIT_AUTH_LIMITS' "
248+ echo "PASSWORD_RESET_LIMITS=' $RATE_LIMIT_PASSWORD_RESET_LIMITS' "
249+ echo "USER_CREATION_LIMITS=' $RATE_LIMIT_USER_CREATION_LIMITS' "
250+ echo "EXECUTION_RUN_LIMITS=' $RATE_LIMIT_EXECUTION_RUN_LIMITS' "
251+ echo "TRUSTED_PROXY_COUNT=' $RATE_LIMIT_TRUSTED_PROXY_COUNT' "
252+ echo "INTERNAL_NETWORKS=' $RATE_LIMIT_INTERNAL_NETWORKS' "
252253 echo ""
253254 echo "# Google Earth Engine"
254- echo "EE_SERVICE_ACCOUNT_JSON=$EE_SERVICE_ACCOUNT_JSON"
255- echo "GOOGLE_PROJECT_ID=$GOOGLE_PROJECT_ID"
256- echo "GEE_ENDPOINT=$GEE_ENDPOINT"
257- echo "GOOGLE_OAUTH_CLIENT_ID=$GOOGLE_OAUTH_CLIENT_ID"
258- echo "GOOGLE_OAUTH_CLIENT_SECRET=$GOOGLE_OAUTH_CLIENT_SECRET"
259- echo "GOOGLE_OAUTH_REDIRECT_URI=$GOOGLE_OAUTH_REDIRECT_URI"
255+ echo "EE_SERVICE_ACCOUNT_JSON=' $EE_SERVICE_ACCOUNT_JSON' "
256+ echo "GOOGLE_PROJECT_ID=' $GOOGLE_PROJECT_ID' "
257+ echo "GEE_ENDPOINT=' $GEE_ENDPOINT' "
258+ echo "GOOGLE_OAUTH_CLIENT_ID=' $GOOGLE_OAUTH_CLIENT_ID' "
259+ echo "GOOGLE_OAUTH_CLIENT_SECRET=' $GOOGLE_OAUTH_CLIENT_SECRET' "
260+ echo "GOOGLE_OAUTH_REDIRECT_URI=' $GOOGLE_OAUTH_REDIRECT_URI' "
260261 echo ""
261262 echo "# Rollbar Error Tracking"
262- echo "ROLLBAR_SCRIPT_TOKEN=$ROLLBAR_SCRIPT_TOKEN"
263- echo "ROLLBAR_SERVER_TOKEN=$ROLLBAR_SERVER_TOKEN"
263+ echo "ROLLBAR_SCRIPT_TOKEN=' $ROLLBAR_SCRIPT_TOKEN' "
264+ echo "ROLLBAR_SERVER_TOKEN=' $ROLLBAR_SERVER_TOKEN' "
264265 echo ""
265266 echo "# API URLs"
266- echo "API_URL=$API_URL "
267- echo "API_INTERNAL_URL=http://api:3000"
267+ echo "API_PUBLIC_URL='$API_PUBLIC_URL' "
268+ echo "API_INTERNAL_URL=' http://api:3000' "
268269 echo ""
269270 echo "# S3 Configuration (uses EC2 instance role for credentials)"
270- echo "SCRIPTS_S3_BUCKET=$SCRIPTS_S3_BUCKET"
271- echo "SCRIPTS_S3_PREFIX=$SCRIPTS_S3_PREFIX"
272- echo "PARAMS_S3_BUCKET=$PARAMS_S3_BUCKET"
273- echo "PARAMS_S3_PREFIX=$PARAMS_S3_PREFIX"
271+ echo "SCRIPTS_S3_BUCKET=' $SCRIPTS_S3_BUCKET' "
272+ echo "SCRIPTS_S3_PREFIX=' $SCRIPTS_S3_PREFIX' "
273+ echo "PARAMS_S3_BUCKET=' $PARAMS_S3_BUCKET' "
274+ echo "PARAMS_S3_PREFIX=' $PARAMS_S3_PREFIX' "
274275 echo ""
275276 echo "# Docker Configuration"
276- echo "REGISTRY_URL=$REGISTRY_URL"
277- echo "DOCKER_SUBNET=$DOCKER_SUBNET"
278- echo "EXECUTION_SUBNET=$EXECUTION_SUBNET"
277+ echo "REGISTRY_URL=' $REGISTRY_URL' "
278+ echo "DOCKER_SUBNET=' $DOCKER_SUBNET' "
279+ echo "EXECUTION_SUBNET=' $EXECUTION_SUBNET' "
279280 echo ""
280281 echo "# Email Configuration (SparkPost)"
281- echo "SPARKPOST_API_KEY=$SPARKPOST_API_KEY"
282+ echo "SPARKPOST_API_KEY=' $SPARKPOST_API_KEY' "
282283 echo ""
283284 echo "# CORS Configuration"
284- echo "CORS_ORIGINS=$CORS_ORIGINS"
285+ echo "CORS_ORIGINS=' $CORS_ORIGINS' "
285286 echo ""
286287 echo "# Staging Database Setup (for migrate service)"
287288 echo "# Production database URL for copying scripts/data to staging"
288- echo "PRODUCTION_DATABASE_URL=$PRODUCTION_DATABASE_URL"
289+ echo "PRODUCTION_DATABASE_URL=' $PRODUCTION_DATABASE_URL' "
289290 echo "# Test user credentials"
290- echo "TEST_SUPERADMIN_EMAIL=$TEST_SUPERADMIN_EMAIL"
291- echo "TEST_SUPERADMIN_PASSWORD=$TEST_SUPERADMIN_PASSWORD"
292- echo "TEST_ADMIN_EMAIL=$TEST_ADMIN_EMAIL"
293- echo "TEST_ADMIN_PASSWORD=$TEST_ADMIN_PASSWORD"
294- echo "TEST_USER_EMAIL=$TEST_USER_EMAIL"
295- echo "TEST_USER_PASSWORD=$TEST_USER_PASSWORD"
291+ echo "TEST_SUPERADMIN_EMAIL=' $TEST_SUPERADMIN_EMAIL' "
292+ echo "TEST_SUPERADMIN_PASSWORD=' $TEST_SUPERADMIN_PASSWORD' "
293+ echo "TEST_ADMIN_EMAIL=' $TEST_ADMIN_EMAIL' "
294+ echo "TEST_ADMIN_PASSWORD=' $TEST_ADMIN_PASSWORD' "
295+ echo "TEST_USER_EMAIL=' $TEST_USER_EMAIL' "
296+ echo "TEST_USER_PASSWORD=' $TEST_USER_PASSWORD' "
296297 echo ""
297298 echo "# Deployment info"
298- echo "GIT_REVISION=${{ github.sha }}"
299- echo "GIT_BRANCH=${{ github.ref_name }}"
300- echo "DEPLOYMENT_ENVIRONMENT=staging"
299+ echo "GIT_REVISION=' ${{ github.sha }}' "
300+ echo "GIT_BRANCH=' ${{ github.ref_name }}' "
301+ echo "DEPLOYMENT_ENVIRONMENT=' staging' "
301302 } > staging.env
302303 echo "✅ Created staging.env with $(wc -l < staging.env) lines"
303304
0 commit comments