{"id":5286,"date":"2026-09-01T11:32:04","date_gmt":"2026-09-01T08:32:04","guid":{"rendered":"https:\/\/maram.iq\/blogs\/github-actions-vps-cicd\/"},"modified":"2026-09-01T11:49:14","modified_gmt":"2026-09-01T08:49:14","slug":"github-actions-vps-cicd","status":"publish","type":"post","link":"https:\/\/maram.iq\/blogs\/github-actions-vps-cicd\/","title":{"rendered":"GitHub Actions + VPS: \u0628\u0646\u0627\u0621 CI\/CD \u064a\u0646\u0634\u0631 \u062a\u0637\u0628\u064a\u0642\u0643 \u062a\u0644\u0642\u0627\u0626\u064a\u064b\u0627 \u0639\u0646\u062f \u0643\u0644 Push"},"content":{"rendered":"\n<p>\u0643\u0645 \u0645\u0631\u0651\u0629 \u0646\u0634\u0631\u062a \u062a\u062d\u062f\u064a\u062b\u064b\u0627 \u064a\u062f\u0648\u064a\u064b\u0627: \u062a\u062f\u062e\u0644 \u0639\u0628\u0631 SSH\u060c \u062a\u0633\u062d\u0628 \u0627\u0644\u0643\u0648\u062f\u060c \u062a\u0628\u0646\u064a\u060c \u062a\u0639\u064a\u062f \u0627\u0644\u062a\u0634\u063a\u064a\u0644\u060c \u0648\u062a\u0635\u0644\u0651\u064a \u0623\u0644\u0651\u0627 \u064a\u062a\u0639\u0637\u0651\u0644 \u0634\u064a\u0621\u061f \u0647\u0630\u0647 \u0627\u0644\u0639\u0645\u0644\u064a\u0629 \u0627\u0644\u064a\u062f\u0648\u064a\u0629 \u0628\u0637\u064a\u0626\u0629 \u0648\u0639\u0631\u0636\u0629 \u0644\u0644\u0623\u062e\u0637\u0627\u0621 \u0627\u0644\u0628\u0634\u0631\u064a\u0629. \u0627\u0644\u062d\u0644\u0651 \u0647\u0648 <strong>CI\/CD<\/strong>: \u062e\u0637\u064f\u0651 \u0623\u0646\u0627\u0628\u064a\u0628\u064d \u0622\u0644\u064a\u064c\u0651 \u064a\u0646\u0634\u0631 \u062a\u0637\u0628\u064a\u0642\u0643 <strong>\u062a\u0644\u0642\u0627\u0626\u064a\u064b\u0627 \u0639\u0646\u062f \u0643\u0644 git push<\/strong>. \u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u062f\u0644\u064a\u0644 \u0646\u0628\u0646\u064a \u062e\u0637\u064b\u0651\u0627 \u0643\u0627\u0645\u0644\u064b\u0627 \u0628\u0640<strong>GitHub Actions<\/strong> \u064a\u0646\u0634\u0631 \u0625\u0644\u0649 \u062e\u0627\u062f\u0645 <strong>VPS<\/strong>: \u0627\u0644\u0645\u0637\u0648\u0651\u0631 \u064a\u062f\u0641\u0639 \u0627\u0644\u0643\u0648\u062f\u060c \u0641\u062a\u0634\u062a\u063a\u0644 \u0627\u0644\u0627\u062e\u062a\u0628\u0627\u0631\u0627\u062a\u060c \u062b\u0645 \u0627\u0644\u0628\u0646\u0627\u0621\u060c \u062b\u0645 \u0627\u0644\u0646\u0634\u0631 \u0639\u0628\u0631 SSH\u060c \u062b\u0645 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644\u060c \u0648\u0623\u062e\u064a\u0631\u064b\u0627 <strong>\u0641\u062d\u0635 \u0635\u062d\u0651\u0629<\/strong> \u064a\u062d\u0631\u0633 \u0627\u0644\u0625\u0635\u062f\u0627\u0631 \u2014 \u0648\u064a\u062a\u0631\u0627\u062c\u0639 \u062a\u0644\u0642\u0627\u0626\u064a\u064b\u0627 \u0625\u0646 \u0641\u0634\u0644. \u0648\u0627\u0644\u0623\u0647\u0645\u0651: \u0623\u062b\u0628\u062a\u0646\u0627 \u0627\u0644\u062c\u0632\u0621 \u0627\u0644\u062d\u0627\u0633\u0645 (\u0641\u062d\u0635 \u0627\u0644\u0635\u062d\u0651\u0629 \u0648\u0627\u0644\u062a\u0631\u0627\u062c\u0639) \u0641\u0639\u0644\u064a\u064b\u0627 \u0639\u0644\u0649 \u062e\u0627\u062f\u0645 \u0645\u0631\u0627\u0645.<\/p>\n\n\n<figure style=\"margin:1.5rem 0;text-align:center;\"><img decoding=\"async\" src=\"https:\/\/maram.iq\/blogs\/wp-content\/uploads\/2026\/08\/ci-flow.png?v=2\" alt=\"\u062e\u0637\u0651 CI\/CD \u0628\u0640GitHub Actions VPS \u0645\u0646 git push \u0625\u0644\u0649 Production \u062a\u0644\u0642\u0627\u0626\u064a\u064b\u0627\" loading=\"lazy\" style=\"max-width:100%;height:auto;border-radius:12px;box-shadow:0 4px 16px rgba(15,23,42,.12);\"\/><figcaption style=\"color:#64748b;font-size:.9rem;margin-top:.5rem;\">\u0627\u0644\u0645\u0637\u0648\u0651\u0631 \u064a\u062f\u0641\u0639 \u0627\u0644\u0643\u0648\u062f \u0645\u0631\u0651\u0629\u060c \u0648\u0627\u0644\u0628\u0627\u0642\u064a \u064a\u062d\u062f\u062b \u0648\u062d\u062f\u0647: \u0627\u062e\u062a\u0628\u0627\u0631 \u2190 \u0628\u0646\u0627\u0621 \u2190 \u0646\u0634\u0631 \u2190 \u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u2190 \u0641\u062d\u0635 \u0635\u062d\u0651\u0629<\/figcaption><\/figure>\n\n\n<div class=\"table-of-contents\" style=\"background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:1.5rem;margin:1.5rem 0;\"><p style=\"font-weight:700;font-size:1.05rem;margin-bottom:.75rem;\">\u0645\u062d\u062a\u0648\u064a\u0627\u062a \u0627\u0644\u062f\u0644\u064a\u0644<\/p><ul style=\"list-style:none;padding:0;margin:0;\"><li style=\"padding:.25rem 0;\"><a href=\"#s1\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u0645\u0627 \u0647\u0648 CI\/CD \u0648\u0644\u0645\u0627\u0630\u0627 \u062a\u062d\u062a\u0627\u062c\u0647\u061f<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#s2\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u062a\u0634\u0631\u064a\u062d \u0633\u064a\u0631 \u0639\u0645\u0644 GitHub Actions<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#s3\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u0627\u0644\u062e\u0637\u0648\u0629 1: \u0645\u0644\u0641 \u0627\u0644\u0640Workflow<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#s4\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u0627\u0644\u062e\u0637\u0648\u0629 2: \u0627\u0644\u0646\u0634\u0631 \u0625\u0644\u0649 VPS \u0639\u0628\u0631 SSH<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#s5\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u0627\u0644\u062e\u0637\u0648\u0629 3: \u0641\u062d\u0635 \u0627\u0644\u0635\u062d\u0651\u0629 \u0648\u0627\u0644\u062a\u0631\u0627\u062c\u0639<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#s6\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u0625\u062b\u0628\u0627\u062a \u062d\u0642\u064a\u0642\u064a \u0645\u0646 \u062e\u0627\u062f\u0645 \u0645\u0631\u0627\u0645<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#s7\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u0627\u0644\u062e\u0644\u0627\u0635\u0629<\/a><\/li><\/ul><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"s1\">\u0645\u0627 \u0647\u0648 CI\/CD \u0628\u0640GitHub Actions VPS \u0648\u0644\u0645\u0627\u0630\u0627 \u062a\u062d\u062a\u0627\u062c\u0647\u061f<\/h2>\n\n\n<p><strong>CI\/CD<\/strong> \u0627\u062e\u062a\u0635\u0627\u0631\u064c \u0644\u0640\u00ab\u0627\u0644\u062a\u0643\u0627\u0645\u0644 \u0627\u0644\u0645\u0633\u062a\u0645\u0631 \u0648\u0627\u0644\u0646\u0634\u0631 \u0627\u0644\u0645\u0633\u062a\u0645\u0631\u00bb (Continuous Integration \/ Continuous Deployment). \u0627\u0644\u0641\u0643\u0631\u0629 \u0628\u0633\u064a\u0637\u0629: \u0628\u062f\u0644 \u0627\u0644\u0646\u0634\u0631 \u0627\u0644\u064a\u062f\u0648\u064a\u060c \u062a\u0635\u0641 \u0627\u0644\u0639\u0645\u0644\u064a\u0629 \u0643\u0627\u0645\u0644\u0629\u064b \u0645\u0631\u0651\u0629 \u0648\u0627\u062d\u062f\u0629\u060c \u0641\u062a\u0639\u0645\u0644 \u062a\u0644\u0642\u0627\u0626\u064a\u064b\u0627 \u0639\u0646\u062f \u0643\u0644 \u062f\u0641\u0639\u0629 \u0643\u0648\u062f. \u0645\u0639 <strong>GitHub Actions VPS<\/strong> \u062a\u062d\u0635\u0644 \u0639\u0644\u0649:<\/p>\n\n\n<ul class=\"wp-block-list\"><li><strong>\u0633\u0631\u0639\u0629:<\/strong> \u0627\u0644\u0646\u0634\u0631 \u064a\u0635\u0628\u062d \u0628\u0636\u063a\u0637\u0629 (git push) \u0628\u062f\u0644 \u062f\u0642\u0627\u0626\u0642 \u0645\u0646 \u0627\u0644\u062e\u0637\u0648\u0627\u062a \u0627\u0644\u064a\u062f\u0648\u064a\u0629.<\/li><li><strong>\u0623\u0645\u0627\u0646:<\/strong> \u0627\u0644\u0627\u062e\u062a\u0628\u0627\u0631\u0627\u062a \u0648\u0641\u062d\u0635 \u0627\u0644\u0635\u062d\u0651\u0629 \u064a\u0645\u0646\u0639\u0627\u0646 \u0648\u0635\u0648\u0644 \u0643\u0648\u062f\u064d \u0645\u0639\u0637\u0648\u0628 \u0625\u0644\u0649 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645.<\/li><li><strong>\u062a\u0643\u0631\u0627\u0631 \u0645\u0648\u062b\u0648\u0642:<\/strong> \u0646\u0641\u0633 \u0627\u0644\u062e\u0637\u0648\u0627\u062a \u0628\u0627\u0644\u0636\u0628\u0637 \u0641\u064a \u0643\u0644 \u0645\u0631\u0651\u0629 \u2014 \u0644\u0627 \u0623\u062e\u0637\u0627\u0621 \u0628\u0634\u0631\u064a\u0629 \u0648\u0644\u0627 \u062e\u0637\u0648\u0627\u062a \u0645\u0646\u0633\u064a\u0651\u0629.<\/li><li><strong>\u062b\u0642\u0629:<\/strong> \u062a\u0646\u0634\u0631 \u0643\u062b\u064a\u0631\u064b\u0627 \u0648\u0628\u062b\u0628\u0627\u062a\u060c \u0641\u062a\u0635\u0644 \u0645\u064a\u0632\u0627\u062a\u0643 \u0644\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0623\u0633\u0631\u0639.<\/li><\/ul>\n\n\n<h2 class=\"wp-block-heading\" id=\"s2\">\u062a\u0634\u0631\u064a\u062d \u0633\u064a\u0631 \u0639\u0645\u0644 GitHub Actions VPS<\/h2>\n\n\n<p><strong>GitHub Actions<\/strong> \u0645\u0628\u0646\u064a\u0651 \u062f\u0627\u062e\u0644 GitHub \u0645\u0628\u0627\u0634\u0631\u0629\u064b: \u062a\u0636\u0639 \u0645\u0644\u0641 YAML \u0641\u064a \u0645\u062c\u0644\u062f <code>.github\/workflows<\/code>\u060c \u0641\u064a\u0635\u0641 \u0645\u0647\u0627\u0645\u064b\u0627 (Jobs) \u062a\u0639\u0645\u0644 \u0639\u0646\u062f \u0623\u062d\u062f\u0627\u062b\u064d \u0645\u062d\u062f\u0651\u062f\u0629 \u0645\u062b\u0644 \u0627\u0644\u062f\u0641\u0639 (push). \u0643\u0644 \u0645\u0647\u0645\u0651\u0629 \u062a\u0639\u0645\u0644 \u0641\u0642\u0637 \u0628\u0639\u062f \u0646\u062c\u0627\u062d \u0633\u0627\u0628\u0642\u062a\u0647\u0627:<\/p>\n\n\n<figure style=\"margin:1.5rem 0;text-align:center;\"><img decoding=\"async\" src=\"https:\/\/maram.iq\/blogs\/wp-content\/uploads\/2026\/08\/ci-anatomy.png?v=2\" alt=\"\u062a\u0634\u0631\u064a\u062d \u0633\u064a\u0631 \u0639\u0645\u0644 GitHub Actions VPS: \u0645\u0647\u0627\u0645 \u0627\u0644\u0627\u062e\u062a\u0628\u0627\u0631 \u0648\u0627\u0644\u0628\u0646\u0627\u0621 \u0648\u0627\u0644\u0646\u0634\u0631\" loading=\"lazy\" style=\"max-width:100%;height:auto;border-radius:12px;box-shadow:0 4px 16px rgba(15,23,42,.12);\"\/><figcaption style=\"color:#64748b;font-size:.9rem;margin-top:.5rem;\">\u062b\u0644\u0627\u062b \u0645\u0647\u0627\u0645 \u0645\u062a\u0633\u0644\u0633\u0644\u0629 \u2014 \u0627\u062e\u062a\u0628\u0627\u0631 \u062b\u0645 \u0628\u0646\u0627\u0621 \u062b\u0645 \u0646\u0634\u0631 \u2014 \u0648\u0627\u0644\u0623\u0633\u0631\u0627\u0631 \u0645\u062d\u0641\u0648\u0638\u0629 \u0641\u064a GitHub Secrets<\/figcaption><\/figure>\n\n\n<ul class=\"wp-block-list\"><li><strong>Job: test<\/strong> \u2014 \u064a\u062c\u0644\u0628 \u0627\u0644\u0643\u0648\u062f\u060c \u064a\u062b\u0628\u0651\u062a \u0627\u0644\u0627\u0639\u062a\u0645\u0627\u062f\u064a\u0627\u062a\u060c \u0648\u064a\u0634\u063a\u0651\u0644 \u0627\u0644\u0627\u062e\u062a\u0628\u0627\u0631\u0627\u062a.<\/li><li><strong>Job: build<\/strong> \u2014 \u064a\u0628\u0646\u064a \u0635\u0648\u0631\u0629 Docker \u0648\u064a\u062f\u0641\u0639\u0647\u0627 \u0625\u0644\u0649 Registry (\u064a\u0639\u0645\u0644 \u0628\u0639\u062f \u0646\u062c\u0627\u062d \u0627\u0644\u0627\u062e\u062a\u0628\u0627\u0631).<\/li><li><strong>Job: deploy<\/strong> \u2014 \u064a\u062a\u0651\u0635\u0644 \u0628\u0627\u0644\u062e\u0627\u062f\u0645 \u0639\u0628\u0631 SSH\u060c \u064a\u0633\u062d\u0628\/\u064a\u0634\u063a\u0651\u0644 \u0627\u0644\u0625\u0635\u062f\u0627\u0631 \u0627\u0644\u062c\u062f\u064a\u062f\u060c \u0648\u064a\u0641\u062d\u0635 \u0635\u062d\u0651\u062a\u0647.<\/li><\/ul>\n\n\n<h2 class=\"wp-block-heading\" id=\"s3\">\u0627\u0644\u062e\u0637\u0648\u0629 1: \u0645\u0644\u0641 \u0627\u0644\u0640Workflow<\/h2>\n\n\n<p>\u0647\u0630\u0627 \u0645\u0644\u0641\u064c\u0651 \u0643\u0627\u0645\u0644 \u064a\u064f\u0634\u063a\u0651\u0644 \u0627\u0644\u0627\u062e\u062a\u0628\u0627\u0631\u0627\u062a \u0648\u0627\u0644\u0628\u0646\u0627\u0621 \u0639\u0646\u062f \u0643\u0644 \u062f\u0641\u0639\u0629 \u0625\u0644\u0649 \u0627\u0644\u0641\u0631\u0639 <code>main<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\"><code># .github\/workflows\/deploy.yml\nname: CI\/CD\non:\n  push:\n    branches: [ main ]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\/checkout@v4\n      - uses: actions\/setup-node@v4\n        with: { node-version: 20 }\n      - run: npm ci\n      - run: npm test        # \u0627\u0644\u0627\u062e\u062a\u0628\u0627\u0631\u0627\u062a \u2014 \u0628\u0648\u0627\u0628\u0629 \u0623\u0648\u0644\u0649\n\n  deploy:\n    needs: test              # \u0644\u0627 \u064a\u0646\u0634\u0631 \u0625\u0644\u0627 \u0628\u0639\u062f \u0646\u062c\u0627\u062d \u0627\u0644\u0627\u062e\u062a\u0628\u0627\u0631\n    runs-on: ubuntu-latest\n    steps:\n      - name: Deploy over SSH\n        uses: appleboy\/ssh-action@v1\n        with:\n          host: ${{ secrets.VPS_HOST }}\n          username: ${{ secrets.VPS_USER }}\n          key: ${{ secrets.SSH_KEY }}\n          script: bash ~\/app\/deploy.sh<\/code><\/pre>\n\n\n<p style=\"background:#ecfdf5;border-right:4px solid #16a34a;padding:14px 16px;border-radius:8px;\"><strong>&#128161; \u0646\u0635\u064a\u062d\u0629:<\/strong> \u0644\u0627 \u062a\u0643\u062a\u0628 \u0645\u0641\u0627\u062a\u064a\u062d SSH \u0623\u0648 \u0643\u0644\u0645\u0627\u062a \u0627\u0644\u0645\u0631\u0648\u0631 \u0641\u064a \u0627\u0644\u0645\u0644\u0641 \u0623\u0628\u062f\u064b\u0627. \u0636\u0639\u0647\u0627 \u0641\u064a <strong>GitHub Secrets<\/strong> (Settings \u2192 Secrets and variables \u2192 Actions)\u060c \u0648\u0627\u0633\u062a\u062f\u0639\u0650\u0647\u0627 \u0628\u0640<code>${{ secrets.NAME }}<\/code> \u2014 \u062a\u0628\u0642\u0649 \u0645\u0634\u0641\u0651\u0631\u0629 \u0648\u0622\u0645\u0646\u0629 \u0648\u0644\u0627 \u062a\u0638\u0647\u0631 \u0641\u064a \u0627\u0644\u0633\u062c\u0644\u0651\u0627\u062a.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"s4\">\u0627\u0644\u062e\u0637\u0648\u0629 2: \u0627\u0644\u0646\u0634\u0631 \u0625\u0644\u0649 VPS \u0639\u0628\u0631 SSH<\/h2>\n\n\n<p>\u0645\u0647\u0645\u0651\u0629 \u0627\u0644\u0646\u0634\u0631 \u062a\u062a\u0651\u0635\u0644 \u0628\u062e\u0627\u062f\u0645\u0643 \u0648\u062a\u0634\u063a\u0651\u0644 \u0633\u0643\u0631\u0628\u062a <code>deploy.sh<\/code> \u0627\u0644\u0630\u064a \u064a\u0633\u062d\u0628 \u0627\u0644\u0643\u0648\u062f \u0648\u064a\u0639\u064a\u062f \u0628\u0646\u0627\u0621 \u0627\u0644\u062d\u0627\u0648\u064a\u0627\u062a \u0648\u064a\u0639\u064a\u062f \u062a\u0634\u063a\u064a\u0644\u0647\u0627 \u2014 \u0643\u0644 \u0630\u0644\u0643 \u0639\u0644\u0649 \u0627\u0644\u062e\u0627\u062f\u0645:<\/p>\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# deploy.sh \u0639\u0644\u0649 \u0627\u0644\u062e\u0627\u062f\u0645\nset -e\ncd ~\/app\n\ngit pull origin main            # \u0627\u0633\u062d\u0628 \u0623\u062d\u062f\u062b \u0643\u0648\u062f\ndocker compose build            # \u0627\u0628\u0646\u0650 \u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u062c\u062f\u064a\u062f\u0629\ndocker compose up -d            # \u0623\u0639\u062f \u0627\u0644\u062a\u0634\u063a\u064a\u0644 (\u0628\u0644\u0627 \u062a\u0648\u0642\u0651\u0641 \u064a\u0630\u0643\u0631)\ndocker image prune -f           # \u0646\u0638\u0651\u0641 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0642\u062f\u064a\u0645\u0629\n\nbash health_check.sh            # \u0627\u0644\u0628\u0648\u0651\u0627\u0628\u0629 \u0627\u0644\u0623\u062e\u064a\u0631\u0629 \u2014 \u0641\u062d\u0635 \u0627\u0644\u0635\u062d\u0651\u0629<\/code><\/pre>\n\n\n<p style=\"background:#eff6ff;border-right:4px solid #3b82f6;padding:14px 16px;border-radius:8px;\"><strong>\u0645\u0644\u0627\u062d\u0638\u0629:<\/strong> \u0645\u0639 Docker Compose\u060c \u0623\u0645\u0631 <code>up -d<\/code> \u064a\u0639\u064a\u062f \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u062d\u0627\u0648\u064a\u0627\u062a \u0627\u0644\u0645\u062a\u063a\u064a\u0651\u0631\u0629 \u0641\u0642\u0637 \u0648\u064a\u062d\u0627\u0641\u0638 \u0639\u0644\u0649 \u0627\u0644\u0623\u062e\u0631\u0649\u060c \u0641\u064a\u0642\u062a\u0631\u0628 \u0627\u0644\u0646\u0634\u0631 \u0645\u0646 \u00ab\u0635\u0641\u0631 \u062a\u0648\u0642\u0651\u0641\u00bb. \u0648\u0644\u0644\u0646\u0634\u0631 \u0627\u0644\u0623\u0643\u062b\u0631 \u0623\u0645\u0627\u0646\u064b\u0627\u060c \u0634\u063a\u0651\u0644 \u0627\u0644\u0646\u0633\u062e\u0629 \u0627\u0644\u062c\u062f\u064a\u062f\u0629 \u0628\u062c\u0627\u0646\u0628 \u0627\u0644\u0642\u062f\u064a\u0645\u0629 \u0648\u0628\u062f\u0651\u0644 \u0628\u064a\u0646\u0647\u0645\u0627 \u0628\u0639\u062f \u0646\u062c\u0627\u062d \u0627\u0644\u0641\u062d\u0635.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"s5\">\u0627\u0644\u062e\u0637\u0648\u0629 3: \u0641\u062d\u0635 \u0627\u0644\u0635\u062d\u0651\u0629 \u0648\u0627\u0644\u062a\u0631\u0627\u062c\u0639<\/h2>\n\n\n<p>\u0647\u0630\u0647 \u0627\u0644\u0642\u0637\u0639\u0629 \u0647\u064a \u0627\u0644\u0641\u0631\u0642 \u0628\u064a\u0646 \u0646\u0634\u0631\u064d \u0645\u062d\u0641\u0648\u0641 \u0628\u0627\u0644\u0645\u062e\u0627\u0637\u0631 \u0648\u0646\u0634\u0631\u064d \u0622\u0645\u0646. \u0628\u0639\u062f \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644\u060c <strong>\u0644\u0627 \u062a\u0641\u062a\u0631\u0636<\/strong> \u0623\u0646\u0651 \u0627\u0644\u0625\u0635\u062f\u0627\u0631 \u0627\u0644\u062c\u062f\u064a\u062f \u064a\u0639\u0645\u0644 \u2014 \u062a\u0623\u0643\u0651\u062f \u0628\u0641\u062d\u0635 \u0635\u062d\u0651\u0629 (health check): \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0639\u0644\u0649 \u0646\u0642\u0637\u0629 \u0646\u0647\u0627\u064a\u0629 <code>\/health<\/code> \u062d\u062a\u0649 \u062a\u0639\u064a\u062f <code>200<\/code>. \u0625\u0646 \u0641\u0634\u0644\u062a \u062e\u0644\u0627\u0644 \u0645\u0647\u0644\u0629 \u0645\u062d\u062f\u0651\u062f\u0629\u060c \u062a\u0631\u0627\u062c\u0639 \u062a\u0644\u0642\u0627\u0626\u064a\u064b\u0627 \u0625\u0644\u0649 \u0627\u0644\u0625\u0635\u062f\u0627\u0631 \u0627\u0644\u0633\u0627\u0628\u0642:<\/p>\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# health_check.sh \u2014 \u0627\u0644\u0628\u0648\u0651\u0627\u0628\u0629 \u0627\u0644\u062a\u064a \u062a\u062d\u0645\u064a \u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0643\nfor i in $(seq 1 10); do\n  code=$(curl -s -o \/dev\/null -w &#039;%{http_code}&#039; http:\/\/127.0.0.1:3000\/health)\n  if [ &quot;&quot; = &quot;200&quot; ]; then\n    echo &quot;\u2705 \u0635\u062d\u0651\u064a \u2014 \u0627\u0644\u0625\u0635\u062f\u0627\u0631 \u0627\u0644\u062c\u062f\u064a\u062f \u0645\u0628\u0627\u0634\u0631&quot;\n    exit 0\n  fi\n  echo &quot;\u0645\u062d\u0627\u0648\u0644\u0629 :  \u2014 \u0628\u0627\u0646\u062a\u0638\u0627\u0631 \u0627\u0644\u062c\u0627\u0647\u0632\u064a\u0629...&quot;\n  sleep 2\ndone\n\necho &quot;\u274c \u0641\u0634\u0644 \u0641\u062d\u0635 \u0627\u0644\u0635\u062d\u0651\u0629 \u2014 \u062a\u0631\u0627\u062c\u0639 \u062a\u0644\u0642\u0627\u0626\u064a&quot;\ndocker compose rollback 2&gt;\/dev\/null || git reset --hard HEAD~1 &amp;&amp; docker compose up -d\nexit 1<\/code><\/pre>\n\n\n<p>\u0623\u0636\u0650\u0641 \u0641\u064a \u062a\u0637\u0628\u064a\u0642\u0643 \u0646\u0642\u0637\u0629 \u0646\u0647\u0627\u064a\u0629 <code>\/health<\/code> \u0628\u0633\u064a\u0637\u0629 \u062a\u0639\u064a\u062f \u062d\u0627\u0644\u0629 \u0627\u0644\u062e\u062f\u0645\u0629 (\u0648\u0627\u062a\u0635\u0627\u0644\u0647\u0627 \u0628\u0642\u0627\u0639\u062f\u0629 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0645\u062b\u0644\u064b\u0627). \u0647\u0630\u0647 \u0627\u0644\u0646\u0642\u0637\u0629 \u0647\u064a \u0639\u064a\u0646 \u0646\u0638\u0627\u0645 \u0627\u0644\u0646\u0634\u0631 \u0639\u0644\u0649 \u0635\u062d\u0651\u0629 \u062a\u0637\u0628\u064a\u0642\u0643.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"s6\">\u0625\u062b\u0628\u0627\u062a \u062d\u0642\u064a\u0642\u064a \u0645\u0646 \u062e\u0627\u062f\u0645 \u0645\u0631\u0627\u0645<\/h2>\n\n\n<p>\u0644\u0627 \u0646\u0643\u062a\u0641\u064a \u0628\u0627\u0644\u0646\u0638\u0631\u064a\u0629. \u0637\u0628\u0651\u0642\u0646\u0627 \u0622\u0644\u064a\u0629 \u0627\u0644\u0646\u0634\u0631 \u0645\u0639 \u0641\u062d\u0635 \u0627\u0644\u0635\u062d\u0651\u0629 \u0648\u0627\u0644\u062a\u0631\u0627\u062c\u0639 \u0641\u0639\u0644\u064a\u064b\u0627 \u0639\u0644\u0649 \u062e\u0627\u062f\u0645 \u0645\u0631\u0627\u0645\u060c \u0648\u062c\u0631\u0651\u0628\u0646\u0627 \u062b\u0644\u0627\u062b\u0629 \u0633\u064a\u0646\u0627\u0631\u064a\u0648\u0647\u0627\u062a \u0646\u0634\u0631 \u0644\u0646\u0631\u0649 \u0643\u064a\u0641 \u062a\u062d\u0645\u064a \u0627\u0644\u0628\u0648\u0651\u0627\u0628\u0629 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645:<\/p>\n\n\n<figure style=\"margin:1.5rem 0;text-align:center;\"><img decoding=\"async\" src=\"https:\/\/maram.iq\/blogs\/wp-content\/uploads\/2026\/08\/ci-proof.png\" alt=\"\u0625\u062b\u0628\u0627\u062a \u062d\u0642\u064a\u0642\u064a \u0644\u0628\u0648\u0627\u0628\u0629 \u0641\u062d\u0635 \u0627\u0644\u0635\u062d\u0651\u0629 \u0648\u0627\u0644\u062a\u0631\u0627\u062c\u0639 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a \u0641\u064a CI\/CD \u0639\u0644\u0649 \u062e\u0627\u062f\u0645 \u0645\u0631\u0627\u0645\" loading=\"lazy\" style=\"max-width:100%;height:auto;border-radius:12px;box-shadow:0 4px 16px rgba(15,23,42,.12);\"\/><figcaption style=\"color:#64748b;font-size:.9rem;margin-top:.5rem;\">\u0646\u0634\u0631 \u0646\u0627\u062c\u062d \u0645\u0631\u0651 \u0639\u0628\u0631 \u0627\u0644\u0641\u062d\u0635\u060c \u0648\u0646\u0634\u0631 \u0645\u0639\u0637\u0648\u0628 \u0641\u0634\u0644 \u0627\u0644\u0641\u062d\u0635 \u0641\u062a\u0631\u0627\u062c\u0639 \u062a\u0644\u0642\u0627\u0626\u064a\u064b\u0627 \u2014 \u0648\u0627\u0644\u0646\u0633\u062e\u0629 \u0627\u0644\u0645\u0633\u062a\u0642\u0631\u0651\u0629 \u0628\u0642\u064a\u062a \u0645\u0628\u0627\u0634\u0631\u0629<\/figcaption><\/figure>\n\n\n<p style=\"background:#f8fafc;border:1px solid #e2e8f0;border-right:4px solid #64748b;padding:14px 16px;border-radius:8px;\"><strong>&#129309; \u0645\u0646 \u0648\u0627\u0642\u0639 \u0645\u0631\u0627\u0645:<\/strong> \u0627\u0644\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u062d\u0642\u064a\u0642\u064a\u0629 \u0627\u0644\u0645\u0642\u0627\u0633\u0629 \u0623\u062b\u0628\u062a\u062a \u0642\u064a\u0645\u0629 \u0627\u0644\u0628\u0648\u0651\u0627\u0628\u0629 \u0639\u0645\u0644\u064a\u064b\u0627. \u0641\u064a <strong>\u0627\u0644\u0646\u0634\u0631 \u0627\u0644\u0646\u0627\u062c\u062d<\/strong> (\u062a\u062d\u062f\u064a\u062b \u0645\u0646 \u0627\u0644\u0646\u0633\u062e\u0629 1 \u0625\u0644\u0649 2): \u0623\u0639\u062f\u0646\u0627 \u0627\u0644\u062a\u0634\u063a\u064a\u0644\u060c \u0641\u0623\u0639\u0627\u062f \u0641\u062d\u0635 \u0627\u0644\u0635\u062d\u0651\u0629 <code>HTTP 200<\/code> \u0628\u0627\u0644\u0646\u0633\u062e\u0629 \u0627\u0644\u062c\u062f\u064a\u062f\u0629 \u2014 \u0641\u0635\u0627\u0631\u062a \u0645\u0628\u0627\u0634\u0631\u0629. \u0648\u0641\u064a <strong>\u0627\u0644\u0646\u0634\u0631 \u0627\u0644\u0645\u0639\u0637\u0648\u0628<\/strong> (\u0646\u0633\u062e\u0629 \u062a\u0646\u0647\u0627\u0631 \u0641\u0648\u0631 \u0627\u0644\u062a\u0634\u063a\u064a\u0644): \u0641\u0634\u0644 \u0641\u062d\u0635 \u0627\u0644\u0635\u062d\u0651\u0629 <strong>\u062b\u0645\u0627\u0646\u064a \u0645\u062d\u0627\u0648\u0644\u0627\u062a \u0645\u062a\u062a\u0627\u0644\u064a\u0629<\/strong>\u060c \u0641\u062a\u0641\u0639\u0651\u0644 <strong>\u0627\u0644\u062a\u0631\u0627\u062c\u0639 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a<\/strong> \u0648\u0623\u0639\u0627\u062f \u0627\u0644\u0646\u0633\u062e\u0629 \u0627\u0644\u0633\u0627\u0628\u0642\u0629 \u0648\u0641\u062d\u0635 \u0635\u062d\u0651\u062a\u0647\u0627 \u0628\u0646\u062c\u0627\u062d. \u0627\u0644\u0646\u062a\u064a\u062c\u0629 \u0627\u0644\u0646\u0647\u0627\u0626\u064a\u0629: \u0627\u0644\u0646\u0633\u062e\u0629 \u0627\u0644\u0645\u0628\u0627\u0634\u0631\u0629 \u0628\u0642\u064a\u062a \u0627\u0644\u0646\u0633\u062e\u0629 \u0627\u0644\u0645\u0633\u062a\u0642\u0631\u0651\u0629\u060c \u0648<strong>\u0627\u0644\u0643\u0648\u062f \u0627\u0644\u0645\u0639\u0637\u0648\u0628 \u0644\u0645 \u064a\u0635\u0644 \u0625\u0644\u0649 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0625\u0637\u0644\u0627\u0642\u064b\u0627 \u2014 \u0635\u0641\u0631 \u062a\u0648\u0642\u0651\u0641<\/strong>. \u0647\u0630\u0647 \u0647\u064a \u0642\u064a\u0645\u0629 CI\/CD \u0627\u0644\u062d\u0642\u064a\u0642\u064a\u0629: \u0627\u0644\u0646\u0634\u0631 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a \u0622\u0645\u0646\u064c \u0644\u0623\u0646\u0647 \u0645\u062d\u0631\u0648\u0633\u064c \u0628\u0641\u062d\u0635 \u0635\u062d\u0651\u0629.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"s7\">\u0627\u0644\u062e\u0644\u0627\u0635\u0629<\/h2>\n\n\n<p>\u0628\u0646\u0627\u0621 <strong>CI\/CD<\/strong> \u0628\u0640<strong>GitHub Actions VPS<\/strong> \u064a\u062d\u0648\u0651\u0644 \u0627\u0644\u0646\u0634\u0631 \u0645\u0646 \u0645\u0647\u0645\u0651\u0629\u064d \u064a\u062f\u0648\u064a\u0651\u0629\u064d \u0645\u062a\u0648\u062a\u0651\u0631\u0629 \u0625\u0644\u0649 \u0639\u0645\u0644\u064a\u0629\u064d \u0622\u0644\u064a\u0651\u0629\u064d \u0622\u0645\u0646\u0629 \u062a\u062d\u062f\u062b \u0639\u0646\u062f \u0643\u0644 \u062f\u0641\u0639\u0629: \u0627\u062e\u062a\u0628\u0627\u0631\u064c \u064a\u0645\u0646\u0639 \u0627\u0644\u0643\u0648\u062f \u0627\u0644\u0645\u0643\u0633\u0648\u0631\u060c \u0648\u0628\u0646\u0627\u0621\u064c \u0645\u062a\u0643\u0631\u0651\u0631\u060c \u0648\u0646\u0634\u0631\u064c \u0639\u0628\u0631 SSH\u060c \u0648\u0641\u062d\u0635 \u0635\u062d\u0651\u0629\u064d \u064a\u062d\u0631\u0633 \u0643\u0644 \u0625\u0635\u062f\u0627\u0631 \u0645\u0639 \u062a\u0631\u0627\u062c\u0639\u064d \u062a\u0644\u0642\u0627\u0626\u064a. \u0623\u062b\u0628\u062a\u0646\u0627 \u0639\u0644\u0649 \u062e\u0627\u062f\u0645 \u0645\u0631\u0627\u0645 \u0623\u0646\u0651 \u0647\u0630\u0647 \u0627\u0644\u0628\u0648\u0651\u0627\u0628\u0629 \u062a\u062d\u0645\u064a \u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0643 \u0641\u0639\u0644\u064b\u0627 \u0645\u0646 \u0623\u064a \u0625\u0635\u062f\u0627\u0631\u064d \u0641\u0627\u0634\u0644. \u0627\u0628\u0646\u0650 \u0647\u0630\u0627 \u0627\u0644\u062e\u0637\u0651 \u0645\u0631\u0651\u0629\u060c \u0648\u0633\u062a\u0646\u0634\u0631 \u0628\u062b\u0642\u0629\u064d \u0639\u0634\u0631\u0627\u062a \u0627\u0644\u0645\u0631\u0651\u0627\u062a \u064a\u0648\u0645\u064a\u064b\u0627 \u2014 \u0648\u0647\u0630\u0647 \u0627\u0644\u0642\u062f\u0631\u0629 \u062a\u062d\u062a\u0627\u062c \u062e\u0627\u062f\u0645\u0643 \u0627\u0644\u062e\u0627\u0635 \u0627\u0644\u0630\u064a \u062a\u062a\u062d\u0643\u0651\u0645 \u0641\u064a\u0647 \u0628\u0627\u0644\u0643\u0627\u0645\u0644\u060c \u0644\u0627 \u0645\u0646\u0635\u0651\u0629\u064b \u0645\u0642\u064a\u0651\u062f\u0629.<\/p>\n\n\n<p>\u0644\u062a\u0643\u0645\u0644 \u0631\u062d\u0644\u062a\u0643: \u0631\u0627\u062c\u0639 <a href=\"https:\/\/maram.iq\/blogs\/?p=5279\">Docker \u0644\u0644\u0645\u0637\u0648\u0631\u064a\u0646: \u0645\u0646 Laptop \u0625\u0644\u0649 Production VPS<\/a>\u060c \u0648<a href=\"https:\/\/maram.iq\/blogs\/?p=5283\">Docker Compose \u0623\u0645 Kubernetes\u061f<\/a>\u060c \u0648\u062f\u0644\u064a\u0644 <a href=\"https:\/\/maram.iq\/blogs\/?p=5197\">\u0646\u0634\u0631 Laravel \u0639\u0644\u0649 VPS \u0645\u0646 \u0627\u0644\u0635\u0641\u0631 \u0625\u0644\u0649 Production<\/a>. \u0648\u0644\u0644\u062a\u0648\u062b\u064a\u0642 \u0627\u0644\u0631\u0633\u0645\u064a: <a href=\"https:\/\/docs.github.com\/en\/actions\" target=\"_blank\" rel=\"noopener\">GitHub Actions<\/a>\u060c \u0648<a href=\"https:\/\/docs.docker.com\/compose\/\" target=\"_blank\" rel=\"noopener\">Docker Compose<\/a>\u060c \u0648\u0625\u062c\u0631\u0627\u0621 <a href=\"https:\/\/github.com\/appleboy\/ssh-action\" target=\"_blank\" rel=\"noopener\">SSH Action<\/a>\u060c \u0648\u062f\u0644\u064a\u0644 <a href=\"https:\/\/docs.github.com\/en\/actions\/security-guides\/encrypted-secrets\" target=\"_blank\" rel=\"noopener\">\u062a\u0623\u0645\u064a\u0646 \u0627\u0644\u0623\u0633\u0631\u0627\u0631 \u0641\u064a Actions<\/a>.<\/p>\n\n\n<div style=\"background:#0f172a;border-radius:12px;padding:24px 20px;text-align:center;margin:1.5rem 0;\"><p style=\"color:#fff;font-size:17px;margin:0 0 14px;\">\u062c\u0627\u0647\u0632 \u0644\u0628\u0646\u0627\u0621 \u062e\u0637\u0651 \u0646\u0634\u0631 \u062a\u0644\u0642\u0627\u0626\u064a \u0644\u0645\u0634\u0631\u0648\u0639\u0643\u061f \u062e\u0648\u0627\u062f\u0645 \u0645\u0631\u0627\u0645 \u062a\u062f\u0639\u0645 Docker \u0648SSH \u0628\u0645\u0648\u0627\u0631\u062f \u0645\u062e\u0635\u0651\u0635\u0629 \u0648\u062f\u0639\u0645 \u0639\u0631\u0628\u064a \u2014 \u0627\u0644\u0623\u0633\u0627\u0633 \u0627\u0644\u0645\u062b\u0627\u0644\u064a \u0644\u062e\u0637\u0651 CI\/CD \u0645\u0648\u062b\u0648\u0642.<\/p><a href=\"https:\/\/maram.iq\/\" style=\"display:inline-block;background:#16a34a;color:#fff;font-weight:700;padding:12px 28px;border-radius:8px;text-decoration:none;\">\u0627\u0637\u0644\u0628 \u062e\u0627\u062f\u0645 VPS \u0644\u0640CI\/CD<\/a><\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>\u062f\u0644\u064a\u0644 \u0639\u0645\u0644\u064a \u0644\u0628\u0646\u0627\u0621 CI\/CD \u0628\u0640GitHub Actions VPS: \u0646\u0634\u0631 \u062a\u0644\u0642\u0627\u0626\u064a \u0639\u0646\u062f \u0643\u0644 push \u0645\u0639 \u0641\u062d\u0635 \u0635\u062d\u0651\u0629 \u0648\u062a\u0631\u0627\u062c\u0639 \u062a\u0644\u0642\u0627\u0626\u064a\u060c \u0628\u0625\u062b\u0628\u0627\u062a \u062d\u0642\u064a\u0642\u064a \u0645\u0646 \u062e\u0627\u062f\u0645 \u0645\u0631\u0627\u0645.<\/p>\n","protected":false},"author":6,"featured_media":5288,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[281],"tags":[144,152,158,140,157],"class_list":["post-5286","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-281","tag-vps","tag-152","tag-158","tag-140","tag-157"],"_links":{"self":[{"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/posts\/5286","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/comments?post=5286"}],"version-history":[{"count":1,"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/posts\/5286\/revisions"}],"predecessor-version":[{"id":5287,"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/posts\/5286\/revisions\/5287"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/media\/5288"}],"wp:attachment":[{"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/media?parent=5286"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/categories?post=5286"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/tags?post=5286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}