[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EF2EQVG8P6BEKP568VPNKA":3,"skill-same:01M6EF2EQVG8P6BEKP568VPNKA":49},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":22,"linkOnly":23,"markdownContent":24,"markdownBody":24,"frontMatter":25,"refName":26,"commitSha":27,"skillDirectory":28,"forksCount":29,"repositoryHtmlUrl":30,"repositoryHomepageUrl":31,"ownerHtmlUrl":32,"ownerBlogUrl":6,"ownerDescription":33,"updatedAt":34,"install":35,"resources":48},"01M6EF2EQVG8P6BEKP568VPNKA","gcp-cloud-storage",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Fgcp-cloud-storage\u002FSKILL.md",[],[18,19,20,21],"storage","cloud","gcp","gcp cloud storage","2026-11-10 10:12:30",false,"# GCP Cloud Storage\n\nGoogle Cloud Storage is a unified object storage service with global edge caching. It offers multiple storage classes (Standard, Nearline, Coldline, Archive) for cost optimization, strong consistency, and integration with all GCP services.\n\n## Core Concepts\n\n- **Bucket** — globally unique container, scoped to a project and location\n- **Object** — a file with metadata, identified by name (path) within a bucket\n- **Storage Class** — Standard, Nearline (30d), Coldline (90d), Archive (365d)\n- **Signed URL** — time-limited URL for authenticated access without credentials\n- **Lifecycle Rule** — automatic actions based on age, class, or conditions\n- **IAM \u002F ACL** — access control at bucket and object level\n\n## Bucket Operations\n\n```bash\n# Create a bucket with location and default storage class\ngcloud storage buckets create gs:\u002F\u002Fmy-app-assets-prod \\\n  --location=us-central1 \\\n  --default-storage-class=STANDARD \\\n  --uniform-bucket-level-access\n```\n\n```bash\n# List buckets\ngcloud storage ls\n```\n\n```bash\n# Set bucket to public read (for static hosting)\ngcloud storage buckets add-iam-policy-binding gs:\u002F\u002Fmy-app-assets-prod \\\n  --member=allUsers \\\n  --role=roles\u002Fstorage.objectViewer\n```\n\n```bash\n# Enable versioning\ngcloud storage buckets update gs:\u002F\u002Fmy-app-assets-prod --versioning\n```\n\n## Object Operations\n\n```bash\n# Upload a file\ngcloud storage cp .\u002Fbuild\u002Fapp.zip gs:\u002F\u002Fmy-app-assets-prod\u002Freleases\u002Fv1.2.0\u002Fapp.zip\n```\n\n```bash\n# Sync a directory\ngcloud storage rsync .\u002Fdist gs:\u002F\u002Fmy-app-assets-prod\u002Fstatic\u002F \\\n  --delete-unmatched-destination-objects \\\n  --cache-control=\"public, max-age=86400\"\n```\n\n```bash\n# Copy between buckets\ngcloud storage cp gs:\u002F\u002Fsource-bucket\u002Fdata.csv gs:\u002F\u002Fdest-bucket\u002Fdata.csv\n```\n\n```bash\n# List objects with prefix\ngcloud storage ls gs:\u002F\u002Fmy-app-assets-prod\u002Freleases\u002F --recursive\n```\n\n```bash\n# Remove objects\ngcloud storage rm gs:\u002F\u002Fmy-app-assets-prod\u002Fold-file.txt\n```\n\n## Signed URLs\n\n```python\n# Generate signed URL for download (1 hour)\nfrom google.cloud import storage\nfrom datetime import timedelta\n\nclient = storage.Client()\nbucket = client.bucket('my-app-assets-prod')\nblob = bucket.blob('reports\u002Fq4.pdf')\n\nurl = blob.generate_signed_url(\n    version='v4',\n    expiration=timedelta(hours=1),\n    method='GET'\n)\nprint(f\"Download URL: {url}\")\n```\n\n```python\n# Generate signed URL for upload\nurl = blob.generate_signed_url(\n    version='v4',\n    expiration=timedelta(minutes=15),\n    method='PUT',\n    content_type='application\u002Foctet-stream'\n)\nprint(f\"Upload URL: {url}\")\n# Client uploads with: curl -X PUT -H \"Content-Type: application\u002Foctet-stream\" --data-binary @file \"$url\"\n```\n\n```bash\n# Generate signed URL with gsutil\ngcloud storage sign-url gs:\u002F\u002Fmy-app-assets-prod\u002Freports\u002Fq4.pdf \\\n  --duration=1h \\\n  --private-key-file=service-account.json\n```\n\n## Lifecycle Rules\n\n```json\n\u002F\u002F lifecycle-config.json — transition and expire objects automatically\n{\n  \"rule\": [\n    {\n      \"action\": {\"type\": \"SetStorageClass\", \"storageClass\": \"NEARLINE\"},\n      \"condition\": {\"age\": 30, \"matchesPrefix\": [\"logs\u002F\"]}\n    },\n    {\n      \"action\": {\"type\": \"SetStorageClass\", \"storageClass\": \"COLDLINE\"},\n      \"condition\": {\"age\": 90, \"matchesPrefix\": [\"logs\u002F\"]}\n    },\n    {\n      \"action\": {\"type\": \"Delete\"},\n      \"condition\": {\"age\": 365, \"matchesPrefix\": [\"logs\u002F\"]}\n    },\n    {\n      \"action\": {\"type\": \"AbortIncompleteMultipartUpload\"},\n      \"condition\": {\"age\": 7}\n    },\n    {\n      \"action\": {\"type\": \"Delete\"},\n      \"condition\": {\"numNewerVersions\": 3, \"isLive\": false}\n    }\n  ]\n}\n```\n\n```bash\n# Apply lifecycle rules\ngcloud storage buckets update gs:\u002F\u002Fmy-app-assets-prod \\\n  --lifecycle-file=lifecycle-config.json\n```\n\n## Static Website Hosting\n\n```bash\n# Configure bucket for static website\ngcloud storage buckets update gs:\u002F\u002Fmy-app-website \\\n  --web-main-page-suffix=index.html \\\n  --web-not-found-page=404.html\n```\n\n```bash\n# Upload website files with appropriate content types\ngcloud storage cp -r .\u002Fbuild\u002F* gs:\u002F\u002Fmy-app-website\u002F \\\n  --cache-control=\"public, max-age=3600\"\n```\n\n## Event Notifications\n\n```bash\n# Notify Pub\u002FSub when objects are created\ngcloud storage buckets notifications create gs:\u002F\u002Fmy-app-assets-prod \\\n  --topic=storage-events \\\n  --event-types=OBJECT_FINALIZE \\\n  --object-prefix=uploads\u002F\n```\n\n## CORS Configuration\n\n```json\n\u002F\u002F cors-config.json — allow browser uploads\n[\n  {\n    \"origin\": [\"https:\u002F\u002Fmyapp.com\"],\n    \"method\": [\"GET\", \"PUT\", \"POST\"],\n    \"responseHeader\": [\"Content-Type\"],\n    \"maxAgeSeconds\": 3600\n  }\n]\n```\n\n```bash\n# Apply CORS\ngcloud storage buckets update gs:\u002F\u002Fmy-app-assets-prod --cors-file=cors-config.json\n```\n\n## Access Control\n\n```bash\n# Grant a service account read access\ngcloud storage buckets add-iam-policy-binding gs:\u002F\u002Fmy-app-assets-prod \\\n  --member=serviceAccount:app@my-project.iam.gserviceaccount.com \\\n  --role=roles\u002Fstorage.objectViewer\n```\n\n```bash\n# Remove public access\ngcloud storage buckets remove-iam-policy-binding gs:\u002F\u002Fmy-app-assets-prod \\\n  --member=allUsers \\\n  --role=roles\u002Fstorage.objectViewer\n```\n\n## Best Practices\n\n- Enable uniform bucket-level access (disable ACLs) for simpler permissions\n- Use lifecycle rules to automatically transition cold data to cheaper classes\n- Generate signed URLs for temporary access instead of making objects public\n- Enable versioning on buckets with critical data\n- Use `gcloud storage rsync` for efficient directory synchronization\n- Set appropriate Cache-Control headers for CDN and browser caching\n- Use Pub\u002FSub notifications for event-driven processing of uploads\n- Enable Object Versioning + lifecycle rules to limit stored versions\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FTerminalSkills\u002Fskills\u002Fgcp-cloud-storage",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":36,"prompt":46,"zipAvailable":47},[37,40,43],{"tool":38,"command":39},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill gcp-cloud-storage",{"tool":41,"command":42},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill gcp-cloud-storage",{"tool":44,"command":45},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill gcp-cloud-storage","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Fgcp-cloud-storage\u002FSKILL.md",true,[],[50,64,74,83,89,96],{"skillNo":51,"name":52,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":53,"categories":54,"keywords":60,"publishedAt":22},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[55],{"categoryNo":56,"categoryName":57,"taxonomyType":58,"taxonomyTypeDesc":59},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[61,62,63],"model","model hierarchy","model hierarchy skill",{"skillNo":65,"name":66,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":70,"publishedAt":22},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[69],{"categoryNo":56,"categoryName":57,"taxonomyType":58,"taxonomyTypeDesc":59},[71,72,73],"MCP","zoom","zoom mcp",{"skillNo":75,"name":76,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":22},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[80,81,82,72],"sdk","zoom apps sdk","apps",{"skillNo":84,"name":85,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":22},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[85],{"skillNo":90,"name":91,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":95,"publishedAt":22},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[94],{"categoryNo":56,"categoryName":57,"taxonomyType":58,"taxonomyTypeDesc":59},[91],{"skillNo":97,"name":98,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":22},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[98]]