فصل هشتم: استحکام، امنیت، و انتشار: آماده‌سازی Nextcloud پارسی برای جهان

هدف فصل: استقرار یک شاهکار امن و پایدار

تصور کنید Nextcloud پارسی شما نه‌تنها بی‌نقص کار می‌کند، بلکه با تست‌های جامع، امنیت آهنین، و استقراری روان آماده فتح دنیای دیجیتال است! در این فصل، سیستم Nextcloud ۳۲.۰.۰ را با تست‌های واحد و E2E بررسی می‌کنیم، امنیت را با اسکن API و بهترین روش‌های رمزنگاری تقویت می‌کنیم، و آن را با Docker و مستندات کامل برای استقرار آماده می‌کنیم. آماده‌اید تا پروژه‌تان را به یک محصول حرفه‌ای و قابل اعتماد تبدیل کنید؟


۸.۱ تست: اطمینان از عملکرد بی‌نقص

۸.۱.۱ تست واحد

  1. اجرای تست‌ها:
   cd server
   composer install --dev
   make test-php-unit
  1. نمونه تست واحد: فایل: apps/myapp/tests/Unit/JalaliConverterTest.php
   <?php
   namespace OCA\MyApp\Tests\Unit;

   use OCA\MyApp\Calendar\JalaliConverter;
   use PHPUnit\Framework\TestCase;

   class JalaliConverterTest extends TestCase {
       public function testToJalali() {
           $gregorian = new \DateTime('2025-03-21');
           $jalali = JalaliConverter::toJalali($gregorian);
           $this->assertEquals(['year' => 1404, 'month' => 1, 'day' => 1], $jalali);
       }

       public function testToGregorian() {
           $gregorian = JalaliConverter::toGregorian(1404, 1, 1);
           $this->assertEquals('2025-03-21', $gregorian->format('Y-m-d'));
       }
   }
  1. تست API: فایل: apps/myapp/tests/Integration/UserControllerTest.php
   <?php
   namespace OCA\MyApp\Tests\Integration;

   use OCP\AppFramework\Http\JSONResponse;
   use OCP\IUserManager;
   use OCA\MyApp\Controller\UserController;
   use PHPUnit\Framework\TestCase;

   class UserControllerTest extends TestCase {
       private $controller;
       private $userManager;

       protected function setUp(): void {
           $this->userManager = \OC::$server->getUserManager();
           $this->controller = new UserController('myapp', \OC::$server->getRequest(), $this->userManager);
       }

       public function testBulkUpdate() {
           $response = $this->controller->bulkUpdate(['testuser'], '10GB');
           $this->assertInstanceOf(JSONResponse::class, $response);
           $this->assertEquals('completed', $response->getData()['status']);
       }
   }

۸.۱.۲ تست سرتاسری (E2E)

  1. نصب وابستگی‌ها:
   npm install -g selenium-webdriver chromedriver
  1. ایجاد تست E2E: فایل: tests/e2e/test.js
   const { Builder, By, until } = require('selenium-webdriver');

   async function testNextcloud() {
       let driver = await new Builder().forBrowser('chrome').build();
       try {
           await driver.get('http://localhost:8080');
           await driver.findElement(By.id('user')).sendKeys('admin');
           await driver.findElement(By.id('password')).sendKeys('adminpass');
           await driver.findElement(By.id('submit-form')).click();

           await driver.wait(until.elementLocated(By.xpath("//*[contains(text(), 'فایل‌ها')]")), 5000);
           console.log('رابط کاربری پارسی تأیید شد');

           await driver.get('http://localhost:8080/index.php/apps/calendar');
           await driver.wait(until.elementLocated(By.xpath("//*[contains(text(), 'فروردین')]")), 5000);
           console.log('تقویم جلالی تأیید شد');

           await driver.get('http://localhost:8080/index.php/apps/spreed');
           await driver.wait(until.elementLocated(By.xpath("//*[contains(text(), 'گفت‌وگو')]")), 5000);
           console.log('پیام‌رسان پارسی تأیید شد');
       } catch (error) {
           console.error('خطا در تست E2E:', error);
       } finally {
           await driver.quit();
       }
   }

   testNextcloud();
  1. اجرای تست E2E:
   node tests/e2e/test.js

۸.۲ امنیت: قلعه‌ای نفوذناپذیر

۸.۲.۱ اسکن امنیتی API

docker run -t owasp/zap2docker-stable zap-baseline.py -t http://localhost:8080 \
    --autooff --report-html report.html

۸.۲.۲ هشینگ رمزهای عبور

فایل: apps/myapp/lib/Controller/UserController.php

public function bulkUpdate(array $users, string $quota, ?string $password = null): JSONResponse {
    foreach ($users as $uid) {
        $user = $this->userManager->get($uid);
        if ($user) {
            $user->setQuota($quota);
            if ($password) {
                $hashedPassword = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
                $user->setPassword($hashedPassword);
            }
        }
    }
    return new JSONResponse(['status' => 'success']);
}

۸.۲.۳ سایر اقدامات امنیتی

  • HTTPS:
  certbot --apache -d nextcloud.example.com
  • محدودیت دسترسی API:
  if (!\OC::$server->getUserSession()->getUser()->isAdmin()) {
      throw new \OCP\AppFramework\Http\NotFoundResponse();
  }

۸.۳ استقرار: انتشار پروژه به جهان

۸.۳.۱ تگ‌گذاری نسخه

git add .
git commit -m "نسخه 1.0 پارسی آماده انتشار"
git tag v1.0-persian
git push origin v1.0-persian

۸.۳.۲ ساخت و انتشار Docker Image

  1. ایجاد Dockerfile: فایل: Dockerfile
   FROM nextcloud:32.0.0-apache
   COPY apps/myapp /var/www/html/custom_apps/myapp
   COPY themes/persian-theme /var/www/html/themes/persian-theme
   RUN apt-get update && apt-get install -y php-zip php-gd
   RUN php occ app:enable myapp
   RUN chown -R www-data:www-data /var/www/html
  1. ساخت و انتشار:
   docker build -t mynextcloud:1.0 .
   docker push mynextcloud:1.0
  1. اجرای با Docker Compose: فایل: docker-compose.yml
   version: '3'
   services:
     app:
       image: mynextcloud:1.0
       ports:
         - 8080:80
       volumes:
         - nextcloud_data:/var/www/html
       environment:
         - MYSQL_HOST=db
         - MYSQL_DATABASE=nextcloud
         - MYSQL_USER=nextcloud
         - MYSQL_PASSWORD=secret
     db:
       image: mariadb:10.5
       volumes:
         - db_data:/var/lib/mysql
       environment:
         - MYSQL_ROOT_PASSWORD=secret
         - MYSQL_DATABASE=nextcloud
         - MYSQL_USER=nextcloud
         - MYSQL_PASSWORD=secret
   volumes:
     nextcloud_data:
     db_data:
  1. اجرای سرویس:
   docker-compose up -d

۸.۴ مستندات: راهنمای کاربران پارسی

فایل: README.fa.md

# Nextcloud پارسی: فضای ابری بومی‌شده
این پروژه نسخه‌ای از Nextcloud با پشتیبانی کامل از زبان پارسی، تقویم جلالی، و قابلیت‌های مدیریت کاربران است.

## ویژگی‌ها
- رابط کاربری پارسی با فونت Vazir
- تقویم جلالی در Calendar و Talk
- مدیریت انبوه کاربران و گروه‌ها
- کلاینت دسکتاپ با احراز هویت محلی

## پیش‌نیازها
- PHP 8.2+
- MariaDB 10.5+
- Docker (اختیاری)

## نصب
1. کلون کنید:

```bash
   git clone https://github.com/your-repo/nextcloud-persian.git
  1. نصب وابستگی‌ها:
   composer install
   npm install
  1. اجرا با Docker:
   docker-compose up -d
  1. فعال‌سازی اپلیکیشن:
   php occ app:enable myapp

تست

  • تست واحد:
  make test-php-unit
  • تست E2E:
  node tests/e2e/test.js

استقرار

  • تصویر Docker:
  docker build -t mynextcloud:1.0 .
  docker push mynextcloud:1.0

پشتیبانی

برای گزارش مشکلات، به GitHub Issues مراجعه کنید.

---

## ۸.۵ تست: لحظه اطمینان نهایی

1. **تست واحد**:

```bash:disable-run
   cd server
   make test-php-unit
  1. تست E2E:
   node tests/e2e/test.js
  1. تست امنیتی:
   docker run -t owasp/zap2docker-stable zap-baseline.py -t http://localhost:8080
  1. تست استقرار:
   docker-compose up -d
   curl http://localhost:8080

تست‌های لبه:

  • بارگذاری ۱۰۰۰ کاربر در تست E2E.
  • اجرای API بدون احراز هویت.
  • استقرار روی سرور با منابع محدود.

نکات حرفه‌ای

  • مانیتورینگ:
  services:
    prometheus:
      image: prom/prometheus
      volumes:
        - ./prometheus.yml:/etc/prometheus/prometheus.yml
  • بک‌آپ:
  mysqldump -u nextcloud -p nextcloud > backup.sql
  tar -czf data.tar.gz /var/www/html
  • به‌روزرسانی خودکار:
  docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
  • رابط کاربری تست:
  <template>
      <div v-if="testResults">{{ testResults.status }}</div>
  </template>
  <script>
  export default {
      data() { return { testResults: null }; },
      async mounted() {
          const response = await fetch('/index.php/apps/myapp/api/test-results');
          this.testResults = await response.json();
      }
  }
  </script>