---
title: Sunucu
description: >-
  Gitupcms'i systemd ve Caddy ile bir Linux VM üzerinde çalıştırın.
  app.gitupcms.com da bu şekilde çalışıyor.
---
app.gitupcms.com, HTTPS için önünde Caddy bulunan bir AWS Lightsail sunucusunda (4 GB, Ubuntu) çalışıyor. Başka herhangi bir Linux VM'de de kurulum aynı şekilde yapılır.

1. **Install Node, pnpm and Caddy**

    ```bash
    curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
    sudo apt-get install -y nodejs build-essential git rsync
    sudo npm i -g pnpm@10
    # Caddy: see caddyserver.com/docs/install
    ```

2. **Create a service user and folders**

    ```bash
    sudo useradd --system --home /var/lib/gitupcms --shell /usr/sbin/nologin gitupcms
    sudo mkdir -p /opt/gitupcms /var/lib/gitupcms/data /var/lib/gitupcms/previews
    sudo chown -R gitupcms:gitupcms /opt/gitupcms /var/lib/gitupcms
    ```

3. **Write the environment**

    ```ini /etc/gitupcms.env
    BETTER_AUTH_URL=https://cms.example.com
    BETTER_AUTH_SECRET=...
    GITHUB_CLIENT_ID=...
    GITHUB_CLIENT_SECRET=...
    DB_PATH=/var/lib/gitupcms/data/gitupcms.db
    HOST=127.0.0.1
    PORT=4321
    PREVIEW_RUNNER=1
    PREVIEW_DIR=/var/lib/gitupcms/previews
    PREVIEW_DOCKER=node:24-bookworm-slim
    ```
    Dosyayı yalnızca root ve servis okuyabilsin: `chown root:gitupcms`, `chmod 640`.

    `PREVIEW_DOCKER`, her sitenin kurulumunu ve `astro dev` komutunu bir container içinde çalıştırır. Docker'ı kurun, servisin onu kullanmasına izin verin ve container'ların bulut metadata adresine erişmesini engelleyin:
    ```bash
    curl -fsSL https://get.docker.com | sudo sh
    sudo usermod -aG docker gitupcms
    sudo docker pull node:24-bookworm-slim
    sudo iptables -I DOCKER-USER -d 169.254.169.254 -j DROP   # persist with iptables-persistent
    ```
    Docker grubuna üye olmak, servis kullanıcısına fiilen root yetkisi verir. Önizleme çalıştırmıyorsanız `PREVIEW_DOCKER` değerini boş bırakın.

4. **Copy and build**

    ```bash
    rsync -az --exclude node_modules --exclude dist --exclude .env --exclude data ./cms/ server:/opt/gitupcms/
    sudo -u gitupcms sh -c 'cd /opt/gitupcms && pnpm install --frozen-lockfile && pnpm build'
    ```

5. **Run it with systemd**

    ```ini /etc/systemd/system/gitupcms.service
    [Unit]
    Description=Gitupcms
    After=network.target

    [Service]
    User=gitupcms
    Group=gitupcms
    WorkingDirectory=/opt/gitupcms
    EnvironmentFile=/etc/gitupcms.env
    Environment=NODE_ENV=production
    ExecStart=/usr/bin/node ./dist/server/entry.mjs
    Restart=always
    NoNewPrivileges=true
    ProtectSystem=strict
    ProtectHome=true
    PrivateTmp=true
    ReadWritePaths=/var/lib/gitupcms /opt/gitupcms /tmp

    [Install]
    WantedBy=multi-user.target
    ```
    ```bash
    sudo systemctl enable --now gitupcms
    ```

6. **HTTPS with Caddy**

    ```txt /etc/caddy/Caddyfile
    cms.example.com {
      encode zstd gzip
      reverse_proxy 127.0.0.1:4321 {
        flush_interval -1
      }
    }
    ```
    `flush_interval -1`, AI Editor'ün akış halinde gelen yanıtlarının kesintisiz iletilmesini sağlar. Bir DNS A kaydını sunucuya yönlendirin ve Caddy'yi yeniden yükleyin. Caddy sertifikayı kendisi alır.

7. **Canlı önizleme (isteğe bağlı)**

    `PREVIEW_HOST=https://*.preview.cms.example.com` ile AI Editör her sayfanın script'lerini kendi alt alan adında çalıştırır. Bir wildcard A kaydı (`*.preview.cms.example.com`) ve wildcard sertifika gerekir. Wildcard sertifika DNS doğrulaması ister, yani DNS sağlayıcınızın eklentisiyle derlenmiş bir Caddy ([caddy-dns](https://github.com/caddy-dns)). Route 53 örneği:
    ```txt /etc/caddy/Caddyfile
    *.preview.cms.example.com {
      tls {
        dns route53
      }
      reverse_proxy 127.0.0.1:4322 {
        flush_interval -1
      }
    }
    ```
    DNS erişim bilgilerini Caddy'ye systemd `EnvironmentFile` ile verin ve `ExecStart`'tan `--environ`'u kaldırın. Yoksa Caddy bu bilgileri log'a yazar.

## Güncelleme [#updating]

Yeni kaynak kodu kopyalayın, ardından derleyip yeniden başlatın:

```bash
sudo -u gitupcms sh -c 'cd /opt/gitupcms && pnpm install --frozen-lockfile && pnpm build'
sudo systemctl restart gitupcms
```

## Loglar ve yedekler [#logs-and-backups]

- Loglar: `journalctl -u gitupcms -f`. `SMTP_URL` tanımlı değilse e-posta ile giriş kodları burada görünür.
- `DB_PATH` içindeki SQLite dosyasını yedekleyin (örneğin `sqlite3 gitupcms.db ".backup backup.db"` ile). İçerik git'te durur. Veritabanında ise kullanıcılar, workspace'ler, ayarlar, medya metadata'sı, yorumlar ve geri bildirimler tutulur.
