{"id":542,"date":"2026-03-10T03:51:15","date_gmt":"2026-03-10T03:51:15","guid":{"rendered":"https:\/\/iotnoob.com\/wordpress\/?p=542"},"modified":"2026-03-14T16:18:13","modified_gmt":"2026-03-14T16:18:13","slug":"%e0%b8%95%e0%b8%b4%e0%b8%94%e0%b8%95%e0%b8%b1%e0%b9%89%e0%b8%87-local-github-%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-forgejo-%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-docker","status":"publish","type":"post","link":"https:\/\/iotnoob.com\/wordpress\/2026\/03\/10\/%e0%b8%95%e0%b8%b4%e0%b8%94%e0%b8%95%e0%b8%b1%e0%b9%89%e0%b8%87-local-github-%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-forgejo-%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-docker\/","title":{"rendered":"\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07 Local Github \u0e14\u0e49\u0e27\u0e22 Forgejo \u0e14\u0e49\u0e27\u0e22 Docker"},"content":{"rendered":"\n<p>\u0e40\u0e2b\u0e47\u0e19\u0e27\u0e48\u0e32\u0e21\u0e31\u0e19\u0e43\u0e0a\u0e49\u0e1f\u0e23\u0e35 100% <\/p>\n\n\n\n<p>\u0e17\u0e33\u0e07\u0e32\u0e19\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e40\u0e23\u0e32\u0e15\u0e48\u0e2d\u0e01\u0e31\u0e1a Github \u0e40\u0e25\u0e22 \u0e40\u0e1e\u0e35\u0e22\u0e07\u0e41\u0e15\u0e48 run \u0e1a\u0e19 local computer \u0e44\u0e14\u0e49<\/p>\n\n\n\n<p>\u0e41\u0e15\u0e48\u0e40\u0e23\u0e32\u0e01\u0e47\u0e15\u0e49\u0e2d\u0e07 backup \u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e40\u0e23\u0e32\u0e40\u0e2d\u0e07 \u0e40\u0e01\u0e34\u0e14\u0e21\u0e31\u0e19\u0e1e\u0e31\u0e07\u0e44\u0e1b\u0e2d\u0e30\u0e44\u0e23\u0e44\u0e1b<\/p>\n\n\n\n<p>\u0e02\u0e31\u0e49\u0e19\u0e15\u0e2d\u0e19\u0e15\u0e23\u0e07\u0e19\u0e35\u0e49\u0e44\u0e14\u0e49\u0e21\u0e32\u0e08\u0e32\u0e01 Gemini<\/p>\n\n\n\n<p>\u0e41\u0e15\u0e48\u0e25\u0e2d\u0e07\u0e41\u0e25\u0e49\u0e27 \u0e17\u0e33\u0e07\u0e32\u0e19\u0e44\u0e14\u0e49\u0e2d\u0e22\u0e39\u0e48<\/p>\n\n\n\n<p>\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e41\u0e15\u0e48\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49\u0e21\u0e31\u0e19\u0e17\u0e33\u0e07\u0e32\u0e19\u0e14\u0e49\u0e27\u0e22 SQLite \u0e21\u0e31\u0e49\u0e07 \u0e2d\u0e32\u0e08\u0e08\u0e30\u0e22\u0e31\u0e07\u0e23\u0e31\u0e1a\u0e01\u0e31\u0e1a project \u0e43\u0e2b\u0e0d\u0e48\u0e46\u0e44\u0e21\u0e48\u0e14\u0e35 (\u0e2b\u0e23\u0e37\u0e2d\u0e40\u0e1b\u0e25\u0e48\u0e32)<\/p>\n\n\n\n<p>\u0e40\u0e2d\u0e32\u0e44\u0e27\u0e49\u0e17\u0e14\u0e25\u0e2d\u0e07\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e01\u0e31\u0e1a Database \u0e15\u0e31\u0e27\u0e2d\u0e37\u0e48\u0e19<\/p>\n\n\n\n<p>\u0e08\u0e32\u0e01\u0e23\u0e39\u0e1b\u0e19\u0e35\u0e49\u0e04\u0e37\u0e2d\u0e17\u0e14\u0e25\u0e2d\u0e07 access \u0e1c\u0e48\u0e32\u0e19\u0e08\u0e32\u0e01\u0e2d\u0e35\u0e01\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e43\u0e19 network \u0e21\u0e32\u0e44\u0e14\u0e49\u0e40\u0e25\u0e22<br>\u0e41\u0e15\u0e48\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e25\u0e2d\u0e07\u0e17\u0e32\u0e07 cmd line \u0e1c\u0e48\u0e32\u0e19\u0e17\u0e32\u0e07 SSH<\/p>\n\n\n\n<p class=\"has-vivid-red-color has-text-color has-link-color has-medium-font-size wp-elements-0d6e49db2f6601e70d0e986b11ae9ee6\">\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49 \u0e14\u0e39\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e27\u0e48\u0e32 *** \u0e16\u0e49\u0e32 restart *** repository \u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32\u0e21\u0e31\u0e19\u0e08\u0e30\u0e2b\u0e32\u0e22\u0e44\u0e1b *** \u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e27\u0e48\u0e32 volume data \u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32\u0e08\u0e30 reset<\/p>\n\n\n\n<p class=\"has-vivid-red-color has-text-color has-link-color has-medium-font-size wp-elements-e7d37c746af9af2157c2b7836cd5768f\">\u0e40\u0e14\u0e35\u0e4b\u0e22\u0e27\u0e15\u0e49\u0e2d\u0e07\u0e25\u0e2d\u0e07\u0e2b\u0e32\u0e17\u0e32\u0e07\u0e41\u0e01\u0e49\u0e44\u0e02\u0e01\u0e48\u0e2d\u0e19<\/p>\n\n\n\n<p class=\"has-vivid-red-color has-text-color has-link-color has-medium-font-size wp-elements-7c11e1dd6cf0e0a1545066519774dd7d\">\u0e41\u0e15\u0e48\u0e04\u0e23\u0e48\u0e32\u0e27\u0e46 \u0e01\u0e47\u0e17\u0e33\u0e07\u0e32\u0e19\u0e44\u0e14\u0e49\u0e14\u0e35\u0e44\u0e21\u0e48\u0e40\u0e25\u0e27\u0e40\u0e25\u0e22<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"583\" src=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-8-1024x583.png\" alt=\"\" class=\"wp-image-546\" srcset=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-8-1024x583.png 1024w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-8-300x171.png 300w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-8-768x437.png 768w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-8.png 1287w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">1. \u0e40\u0e15\u0e23\u0e35\u0e22\u0e21\u0e44\u0e1f\u0e25\u0e4c <code>docker-compose.yml<\/code><\/h2>\n\n\n\n<p>\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e40\u0e01\u0e47\u0e1a\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 (\u0e40\u0e0a\u0e48\u0e19 <code>forgejo<\/code>) \u0e41\u0e25\u0e49\u0e27\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e44\u0e1f\u0e25\u0e4c\u0e0a\u0e37\u0e48\u0e2d <code>docker-compose.yml<\/code> \u0e44\u0e27\u0e49\u0e02\u0e49\u0e32\u0e07\u0e43\u0e19 \u0e42\u0e14\u0e22\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e19\u0e35\u0e49\u0e44\u0e1b\u0e27\u0e32\u0e07:<\/p>\n\n\n\n<p>YAML<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  server:\n    image: codeberg.org\/forgejo\/forgejo:10 # \u0e41\u0e19\u0e30\u0e19\u0e33\u0e43\u0e2b\u0e49\u0e23\u0e30\u0e1a\u0e38\u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e0a\u0e31\u0e19 \u0e2b\u0e23\u0e37\u0e2d\u0e43\u0e0a\u0e49 :latest\n    container_name: forgejo\n    environment:\n      - USER_UID=1000\n      - USER_GID=1000\n    restart: always\n    networks:\n      - forgejo\n    volumes:\n      - .\/forgejo-data:\/data\n      - \/etc\/localtime:\/etc\/localtime:ro\n    ports:\n      - \"3000:3000\" # \u0e1e\u0e2d\u0e23\u0e4c\u0e15\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e2b\u0e19\u0e49\u0e32\u0e40\u0e27\u0e47\u0e1a (HTTP)\n      - \"222:22\"    # \u0e1e\u0e2d\u0e23\u0e4c\u0e15\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a SSH (Git clone)\n\nnetworks:\n  forgejo:\n    external: false\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">2. \u0e40\u0e23\u0e34\u0e48\u0e21\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19 (Startup)<\/h2>\n\n\n\n<p>\u0e40\u0e1b\u0e34\u0e14 Terminal \u0e43\u0e19\u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c\u0e17\u0e35\u0e48\u0e21\u0e35\u0e44\u0e1f\u0e25\u0e4c\u0e19\u0e31\u0e49\u0e19\u0e2d\u0e22\u0e39\u0e48 \u0e41\u0e25\u0e49\u0e27\u0e23\u0e31\u0e19\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07:<\/p>\n\n\n\n<p>Bash<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose up -d<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">3. \u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e04\u0e23\u0e31\u0e49\u0e07\u0e41\u0e23\u0e01 (Initial Setup)<\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>\u0e40\u0e1b\u0e34\u0e14\u0e40\u0e1a\u0e23\u0e32\u0e27\u0e4c\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e44\u0e1b\u0e17\u0e35\u0e48 <code>http:\/\/localhost:3000<\/code><\/li>\n\n\n\n<li>\u0e04\u0e38\u0e13\u0e08\u0e30\u0e1e\u0e1a\u0e01\u0e31\u0e1a\u0e2b\u0e19\u0e49\u0e32 <strong>Install Page<\/strong>:\n<ul class=\"wp-block-list\">\n<li><strong>Database Type<\/strong>: \u0e2b\u0e32\u0e01\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e2d\u0e30\u0e44\u0e23\u0e07\u0e48\u0e32\u0e22\u0e46 \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e43\u0e0a\u0e49\u0e2a\u0e48\u0e27\u0e19\u0e15\u0e31\u0e27 \u0e43\u0e2b\u0e49\u0e40\u0e25\u0e37\u0e2d\u0e01 <strong>SQLite3<\/strong> (\u0e44\u0e21\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e10\u0e32\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e1e\u0e34\u0e48\u0e21) \u0e41\u0e15\u0e48\u0e16\u0e49\u0e32\u0e43\u0e0a\u0e49\u0e08\u0e23\u0e34\u0e07\u0e08\u0e31\u0e07\u0e41\u0e19\u0e30\u0e19\u0e33\u0e43\u0e2b\u0e49\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23 PostgreSQL \u0e43\u0e19 Docker Compose \u0e04\u0e23\u0e31\u0e1a<\/li>\n\n\n\n<li><strong>SSH Port<\/strong>: \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e08\u0e32\u0e01 <code>22<\/code> \u0e40\u0e1b\u0e47\u0e19 <code>222<\/code> (\u0e15\u0e32\u0e21\u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e15\u0e31\u0e49\u0e07\u0e44\u0e27\u0e49\u0e43\u0e19\u0e44\u0e1f\u0e25\u0e4c Compose)<\/li>\n\n\n\n<li><strong>HTTP Port<\/strong>: \u0e22\u0e31\u0e07\u0e04\u0e07\u0e40\u0e1b\u0e47\u0e19 <code>3000<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u0e40\u0e25\u0e37\u0e48\u0e2d\u0e19\u0e25\u0e07\u0e21\u0e32\u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07\u0e2a\u0e38\u0e14\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e2a\u0e23\u0e49\u0e32\u0e07 <strong>Admin Account<\/strong> (\u0e2a\u0e33\u0e04\u0e31\u0e0d\u0e21\u0e32\u0e01) \u0e41\u0e25\u0e49\u0e27\u0e01\u0e14 <strong>Install Forgejo<\/strong><\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"741\" src=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-9-1024x741.png\" alt=\"\" class=\"wp-image-551\" srcset=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-9-1024x741.png 1024w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-9-300x217.png 300w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-9-768x555.png 768w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-9.png 1185w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"708\" src=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-10-1024x708.png\" alt=\"\" class=\"wp-image-552\" srcset=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-10-1024x708.png 1024w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-10-300x207.png 300w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-10-768x531.png 768w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-10.png 1231w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"734\" src=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-11-1024x734.png\" alt=\"\" class=\"wp-image-553\" srcset=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-11-1024x734.png 1024w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-11-300x215.png 300w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-11-768x550.png 768w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-11.png 1192w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"731\" src=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-12-1024x731.png\" alt=\"\" class=\"wp-image-554\" srcset=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-12-1024x731.png 1024w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-12-300x214.png 300w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-12-768x548.png 768w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-12.png 1194w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07\u0e43\u0e0a\u0e49\u0e40\u0e27\u0e25\u0e32\u0e44\u0e21\u0e48\u0e19\u0e32\u0e19 \u0e21\u0e31\u0e19\u0e01\u0e47\u0e08\u0e30 redirect \u0e44\u0e1b\u0e2b\u0e19\u0e49\u0e32\u0e41\u0e23\u0e01<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"488\" src=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-13-1024x488.png\" alt=\"\" class=\"wp-image-556\" srcset=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-13-1024x488.png 1024w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-13-300x143.png 300w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-13-768x366.png 768w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-13.png 1354w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e23\u0e17\u0e23\u0e32\u0e1a\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e10\u0e32\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e20\u0e32\u0e22\u0e19\u0e2d\u0e01<\/strong>: \u0e2b\u0e32\u0e01\u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 PostgreSQL \u0e2b\u0e23\u0e37\u0e2d MariaDB \u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e40\u0e1e\u0e34\u0e48\u0e21 Service \u0e19\u0e31\u0e49\u0e19\u0e46 \u0e25\u0e07\u0e43\u0e19 <code>docker-compose.yml<\/code> \u0e41\u0e25\u0e30\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e1c\u0e48\u0e32\u0e19 Network \u0e40\u0e14\u0e35\u0e22\u0e27\u0e01\u0e31\u0e19<\/li>\n\n\n\n<li><strong>Environment Variables<\/strong>: \u0e04\u0e38\u0e13\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e04\u0e2d\u0e19\u0e1f\u0e34\u0e01\u0e40\u0e01\u0e2d\u0e23\u0e4c\u0e25\u0e48\u0e27\u0e07\u0e2b\u0e19\u0e49\u0e32\u0e44\u0e14\u0e49\u0e1c\u0e48\u0e32\u0e19 Env \u0e40\u0e0a\u0e48\u0e19 <code>FORGEJO__database__DB_TYPE=sqlite3<\/code> \u0e40\u0e1b\u0e47\u0e19\u0e15\u0e49\u0e19<\/li>\n\n\n\n<li><strong>Forgejo Runner<\/strong>: \u0e2b\u0e32\u0e01\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e23\u0e30\u0e1a\u0e1a CI\/CD (Actions) \u0e04\u0e38\u0e13\u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07 <code>forgejo-runner<\/code> \u0e41\u0e22\u0e01\u0e15\u0e48\u0e32\u0e07\u0e2b\u0e32\u0e01\u0e40\u0e1b\u0e47\u0e19\u0e2d\u0e35\u0e01\u0e2b\u0e19\u0e36\u0e48\u0e07 Container \u0e04\u0e23\u0e31\u0e1a<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e04\u0e38\u0e13\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07 Forgejo \u0e40\u0e23\u0e35\u0e22\u0e1a\u0e23\u0e49\u0e2d\u0e22\u0e41\u0e25\u0e49\u0e27 \u0e02\u0e31\u0e49\u0e19\u0e15\u0e2d\u0e19\u0e15\u0e48\u0e2d\u0e44\u0e1b\u0e04\u0e37\u0e2d\u0e01\u0e32\u0e23\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e42\u0e1b\u0e23\u0e40\u0e08\u0e01\u0e15\u0e4c\u0e41\u0e25\u0e30\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e42\u0e22\u0e07\u0e42\u0e04\u0e49\u0e14\u0e43\u0e19\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 (Local) \u0e40\u0e02\u0e49\u0e32\u0e01\u0e31\u0e1a Server \u0e04\u0e23\u0e31\u0e1a<\/p>\n\n\n\n<p>\u0e19\u0e35\u0e48\u0e04\u0e37\u0e2d\u0e02\u0e31\u0e49\u0e19\u0e15\u0e2d\u0e19\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e41\u0e1a\u0e1a Step-by-Step:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. \u0e2a\u0e23\u0e49\u0e32\u0e07 Repository \u0e1a\u0e19 Forgejo<\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>\u0e40\u0e02\u0e49\u0e32\u0e44\u0e1b\u0e17\u0e35\u0e48\u0e2b\u0e19\u0e49\u0e32\u0e40\u0e27\u0e47\u0e1a Forgejo \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 (\u0e40\u0e0a\u0e48\u0e19 <code>http:\/\/localhost:3000<\/code>)<\/li>\n\n\n\n<li>\u0e01\u0e14\u0e1b\u0e38\u0e48\u0e21 <strong>+<\/strong> \u0e17\u0e35\u0e48\u0e21\u0e38\u0e21\u0e02\u0e27\u0e32\u0e1a\u0e19 \u0e41\u0e25\u0e49\u0e27\u0e40\u0e25\u0e37\u0e2d\u0e01 <strong>New Repository<\/strong><\/li>\n\n\n\n<li>\u0e15\u0e31\u0e49\u0e07\u0e0a\u0e37\u0e48\u0e2d\u0e42\u0e1b\u0e23\u0e40\u0e08\u0e01\u0e15\u0e4c (\u0e40\u0e0a\u0e48\u0e19 <code>my-awesome-app<\/code>) \u0e41\u0e25\u0e30\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e04\u0e27\u0e32\u0e21\u0e40\u0e1b\u0e47\u0e19\u0e2a\u0e48\u0e27\u0e19\u0e15\u0e31\u0e27 (Public\/Private)<\/li>\n\n\n\n<li>\u0e01\u0e14\u0e1b\u0e38\u0e48\u0e21 <strong>Create Repository<\/strong><\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"358\" src=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-14.png\" alt=\"\" class=\"wp-image-558\" srcset=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-14.png 678w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-14-300x158.png 300w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"640\" src=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-15-1024x640.png\" alt=\"\" class=\"wp-image-559\" srcset=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-15-1024x640.png 1024w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-15-300x188.png 300w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-15-768x480.png 768w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-15.png 1356w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"467\" src=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-16-1024x467.png\" alt=\"\" class=\"wp-image-560\" srcset=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-16-1024x467.png 1024w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-16-300x137.png 300w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-16-768x351.png 768w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-16.png 1354w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"290\" src=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-17-1024x290.png\" alt=\"\" class=\"wp-image-561\" srcset=\"https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-17-1024x290.png 1024w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-17-300x85.png 300w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-17-768x218.png 768w, https:\/\/iotnoob.com\/wordpress\/wp-content\/uploads\/2026\/03\/image-17.png 1351w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. \u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e08\u0e32\u0e01\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 (Local)<\/h2>\n\n\n\n<p>\u0e2b\u0e25\u0e31\u0e07\u0e08\u0e32\u0e01\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e43\u0e19\u0e40\u0e27\u0e47\u0e1a\u0e41\u0e25\u0e49\u0e27 \u0e04\u0e38\u0e13\u0e08\u0e30\u0e44\u0e14\u0e49 URL \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d (\u0e40\u0e0a\u0e48\u0e19 <code>http:\/\/localhost:3000\/username\/my-awesome-app.git<\/code>) \u0e43\u0e2b\u0e49\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e17\u0e33\u0e15\u0e32\u0e21\u0e2a\u0e16\u0e32\u0e19\u0e01\u0e32\u0e23\u0e13\u0e4c\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e14\u0e31\u0e07\u0e19\u0e35\u0e49:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0e01\u0e23\u0e13\u0e35\u0e17\u0e35\u0e48 1: \u0e21\u0e35\u0e42\u0e04\u0e49\u0e14\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2d\u0e22\u0e39\u0e48\u0e41\u0e25\u0e49\u0e27<\/h3>\n\n\n\n<p>\u0e40\u0e1b\u0e34\u0e14 Terminal \u0e43\u0e19\u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c\u0e42\u0e1b\u0e23\u0e40\u0e08\u0e01\u0e15\u0e4c\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e41\u0e25\u0e49\u0e27\u0e23\u0e31\u0e19\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07:<\/p>\n\n\n\n<p>Bash<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u0e40\u0e23\u0e34\u0e48\u0e21\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 Git \u0e43\u0e19\u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c\ngit init\n\n# \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e44\u0e1f\u0e25\u0e4c\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e40\u0e02\u0e49\u0e32\u0e2a\u0e39\u0e48\u0e01\u0e32\u0e23\u0e15\u0e34\u0e14\u0e15\u0e32\u0e21\ngit add .\n\n# \u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e41\u0e1b\u0e25\u0e07\u0e04\u0e23\u0e31\u0e49\u0e07\u0e41\u0e23\u0e01\ngit commit -m \"Initial commit\"\n\n# \u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e01\u0e31\u0e1a Forgejo Server (\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19 URL \u0e40\u0e1b\u0e47\u0e19\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13)\ngit remote add origin http:\/\/localhost:3000\/username\/my-awesome-app.git\n\n# \u0e2a\u0e48\u0e07\u0e42\u0e04\u0e49\u0e14\u0e02\u0e36\u0e49\u0e19\u0e44\u0e1b\u0e1a\u0e19 Server\ngit push -u origin main\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u0e01\u0e23\u0e13\u0e35\u0e17\u0e35\u0e48 2: \u0e40\u0e23\u0e34\u0e48\u0e21\u0e08\u0e32\u0e01\u0e28\u0e39\u0e19\u0e22\u0e4c (Clone \u0e25\u0e07\u0e21\u0e32)<\/h3>\n\n\n\n<p>\u0e2b\u0e32\u0e01\u0e04\u0e38\u0e13\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e44\u0e1f\u0e25\u0e4c README \u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e1f\u0e25\u0e4c\u0e2d\u0e37\u0e48\u0e19\u0e46 \u0e1a\u0e19\u0e40\u0e27\u0e47\u0e1a\u0e44\u0e27\u0e49\u0e01\u0e48\u0e2d\u0e19\u0e41\u0e25\u0e49\u0e27 \u0e43\u0e2b\u0e49\u0e43\u0e0a\u0e49\u0e27\u0e34\u0e18\u0e35 Clone \u0e25\u0e07\u0e21\u0e32\u0e17\u0e35\u0e48\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07:<\/p>\n\n\n\n<p>Bash<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">git clone http:\/\/localhost:3000\/username\/my-awesome-app.git\ncd my-awesome-app\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. \u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e43\u0e19\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e40\u0e02\u0e35\u0e22\u0e19\u0e42\u0e04\u0e49\u0e14 (VS Code)<\/h2>\n\n\n\n<p>\u0e2b\u0e32\u0e01\u0e04\u0e38\u0e13\u0e43\u0e0a\u0e49 VS Code \u0e08\u0e30\u0e17\u0e33\u0e07\u0e32\u0e19\u0e44\u0e14\u0e49\u0e07\u0e48\u0e32\u0e22\u0e02\u0e36\u0e49\u0e19\u0e21\u0e32\u0e01:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>\u0e40\u0e1b\u0e34\u0e14\u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c\u0e42\u0e1b\u0e23\u0e40\u0e08\u0e01\u0e15\u0e4c\u0e14\u0e49\u0e27\u0e22 VS Code<\/li>\n\n\n\n<li>\u0e44\u0e1b\u0e17\u0e35\u0e48\u0e41\u0e16\u0e1a <strong>Source Control<\/strong> (\u0e44\u0e2d\u0e04\u0e2d\u0e19\u0e23\u0e39\u0e1b\u0e07\u0e48\u0e32\u0e21\u0e17\u0e32\u0e07\u0e0b\u0e49\u0e32\u0e22 \u0e2b\u0e23\u0e37\u0e2d\u0e01\u0e14 <code>Ctrl+Shift+G<\/code>)<\/li>\n\n\n\n<li>\u0e04\u0e38\u0e13\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e01\u0e14\u0e1b\u0e38\u0e48\u0e21 <strong>Commit<\/strong> \u0e41\u0e25\u0e30 <strong>Push\/Pull<\/strong> \u0e44\u0e14\u0e49\u0e1c\u0e48\u0e32\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e08\u0e2d UI \u0e42\u0e14\u0e22\u0e44\u0e21\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udca1 \u0e17\u0e23\u0e34\u0e04\u0e41\u0e19\u0e30\u0e19\u0e33: \u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 SSH Key<\/h2>\n\n\n\n<p>\u0e16\u0e49\u0e32\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e2d\u0e22\u0e32\u0e01\u0e01\u0e23\u0e2d\u0e01 Username\/Password \u0e17\u0e38\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07\u0e17\u0e35\u0e48 Push \u0e42\u0e04\u0e49\u0e14 \u0e41\u0e19\u0e30\u0e19\u0e33\u0e43\u0e2b\u0e49\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 <strong>SSH Key<\/strong>:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>\u0e2a\u0e23\u0e49\u0e32\u0e07 Key \u0e43\u0e19\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e14\u0e49\u0e27\u0e22\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 <code>ssh-keygen<\/code><\/li>\n\n\n\n<li>\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01\u0e40\u0e19\u0e37\u0e49\u0e2d\u0e2b\u0e32\u0e43\u0e19\u0e44\u0e1f\u0e25\u0e4c <code>.pub<\/code> (\u0e1b\u0e01\u0e15\u0e34\u0e2d\u0e22\u0e39\u0e48\u0e17\u0e35\u0e48 <code>~\/.ssh\/id_rsa.pub<\/code>)<\/li>\n\n\n\n<li>\u0e44\u0e1b\u0e17\u0e35\u0e48 Forgejo: <strong>Settings &gt; SSH \/ GPG Keys &gt; Add Key<\/strong> \u0e41\u0e25\u0e49\u0e27\u0e27\u0e32\u0e07\u0e25\u0e07\u0e44\u0e1b<\/li>\n\n\n\n<li>\u0e40\u0e27\u0e25\u0e32 Clone \u0e43\u0e2b\u0e49\u0e43\u0e0a\u0e49 URL \u0e41\u0e1a\u0e1a SSH (\u0e40\u0e0a\u0e48\u0e19 <code>git@localhost:222:username\/my-awesome-app.git<\/code>)<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","protected":false},"excerpt":{"rendered":"<p>\u0e40\u0e2b\u0e47\u0e19\u0e27\u0e48\u0e32\u0e21\u0e31\u0e19\u0e43\u0e0a\u0e49\u0e1f\u0e23\u0e35 100% \u0e17\u0e33\u0e07\u0e32\u0e19\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e40\u0e23\u0e32\u0e15\u0e48\u0e2d\u0e01\u0e31\u0e1a Github \u0e40\u0e25\u0e22 \u0e40\u0e1e\u0e35\u0e22\u0e07\u0e41\u0e15\u0e48 run \u0e1a\u0e19 local computer \u0e44\u0e14\u0e49 \u0e41\u0e15\u0e48\u0e40\u0e23\u0e32\u0e01\u0e47\u0e15\u0e49\u0e2d\u0e07 backup \u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e40\u0e23\u0e32\u0e40\u0e2d\u0e07 \u0e40\u0e01\u0e34\u0e14\u0e21\u0e31\u0e19\u0e1e\u0e31\u0e07\u0e44\u0e1b\u0e2d\u0e30\u0e44\u0e23\u0e44\u0e1b&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-542","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/iotnoob.com\/wordpress\/wp-json\/wp\/v2\/posts\/542","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/iotnoob.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/iotnoob.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/iotnoob.com\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/iotnoob.com\/wordpress\/wp-json\/wp\/v2\/comments?post=542"}],"version-history":[{"count":7,"href":"https:\/\/iotnoob.com\/wordpress\/wp-json\/wp\/v2\/posts\/542\/revisions"}],"predecessor-version":[{"id":564,"href":"https:\/\/iotnoob.com\/wordpress\/wp-json\/wp\/v2\/posts\/542\/revisions\/564"}],"wp:attachment":[{"href":"https:\/\/iotnoob.com\/wordpress\/wp-json\/wp\/v2\/media?parent=542"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/iotnoob.com\/wordpress\/wp-json\/wp\/v2\/categories?post=542"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/iotnoob.com\/wordpress\/wp-json\/wp\/v2\/tags?post=542"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}