Petunjuk konfigurasi

Memasang Weblate

Bergantung pada pengaturan dan pengalaman Anda, pilih metode pemasangan yang tepat untuk Anda:

Ikhtisar arsitektur

digraph architecture { graph [fontname="sans-serif", fontsize=10, newrank=true, rankdir=LR, splines=ortho ]; node [fontname="sans-serif", fontsize=10, height=0, margin=.15, shape=box ]; edge [fontname="sans-serif", fontsize=10 ]; subgraph cluster_thirdparty { graph [color=lightgrey, label="Third-party services", style=filled ]; mt [label="Machine translation", style=dotted]; sentry [label="Sentry\nError collection", style=dotted]; graylog [label="Graylog\nLog collection", style=dotted]; mail [label="E-mail server"]; auth [label="SSO\nAuthentication provider", style=dotted]; } subgraph cluster_ingress { graph [color=lightgrey, label=Ingress, style=filled ]; web [label="Web server", shape=hexagon]; } subgraph cluster_weblate { graph [color=lightgrey, label="Weblate code-base", style=filled ]; celery [fillcolor="#144d3f", fontcolor=white, label="Celery workers", style=filled]; wsgi [fillcolor="#144d3f", fontcolor=white, label="WSGI server", style=filled]; } subgraph cluster_services { graph [color=lightgrey, label=Services, style=filled ]; redis [label="Datastore\nTask queue\nCache", shape=cylinder]; db [label="PostgreSQL\nDatabase", shape=cylinder]; fs [label=Filesystem, shape=cylinder]; } web -> wsgi; web -> fs; celery -> mt [style=dotted]; celery -> sentry [style=dotted]; celery -> graylog [style=dotted]; celery -> mail; celery -> redis; celery -> db; celery -> fs; wsgi -> mt [style=dotted]; wsgi -> sentry [style=dotted]; wsgi -> graylog [style=dotted]; wsgi -> auth [style=dotted]; wsgi -> redis; wsgi -> db; wsgi -> fs; }

Server web

Menangani permintaan HTTP yang masuk, Menyajikan berkas statis.

Pekerja Celery

Tugas latar belakang menggunakan Celery dieksekusi di sini.

Tergantung pada beban kerja Anda, Anda mungkin ingin menyesuaikan jumlah pekerja.

Gunakan simpul khusus saat menskalakan Weblate secara horizontal.

Server WSGI

Server WSGI yang menyajikan halaman web kepada pengguna.

Gunakan simpul khusus saat menskalakan Weblate secara horizontal.

Basis data

Server basis data PostgreSQL untuk menyimpan semua konten, lihat Pengaturan basis data untuk Weblate.

Gunakan simpul basis data khusus untuk situs dengan ratusan juta kata yang dihos.

Penyimpanan data

Penyimpanan data kunci/nilai seperti Valkey atau server Redis untuk simpanan dan antrian tugas, lihat Tugas latar belakang menggunakan Celery.

Gunakan simpul khusus saat menskalakan Weblate secara horizontal.

Sistem berkas

Penyimpanan sistem berkas untuk menyimpan repositori VCS dan data pengguna yang diunggah. Ini digunakan bersama oleh semua proses.

Gunakan penyimpanan jaringan saat menskalakan Weblate secara horizontal.

Server surel

Server SMTP untuk surel keluar, lihat Mengkonfigurasikan surel keluar. Server ini dapat disediakan secara eksternal.

Petunjuk

Memasang menggunakan Docker menyertakan PostgreSQL dan Valkey, membuat pemasangan lebih mudah.

Persyaratan perangkat lunak

Sistem operasi

Weblate diketahui dapat digunakan di Linux, FreeBSD, dan macOS. Sistem serupa Unix lainnya kemungkinan besar juga dapat digunakan.

Weblate tidak didukung di Windows. Namun, mungkin masih berfungsi dan patchnya diterima dengan senang hati.

Lihat juga

Ikhtisar arsitektur menggambarkan arsitektur Weblate secara keseluruhan dan layanan yang dibutuhkan.

Dependensi Python

Weblate ditulis dalam Python dan mendukung Python 3.12 atau yang lebih baru. Anda dapat memasang dependensi menggunakan pip atau dari paket distribusi Anda, daftar lengkap tersedia di requirements.txt.

Dependensi yang paling menonjol:

Django

https://www.djangoproject.com/

Celery

https://docs.celeryq.dev/

Translate Toolkit

https://toolkit.translatehouse.org/

translation-finder

https://github.com/WeblateOrg/translation-finder

Auth Sosial Python

https://python-social-auth.readthedocs.io/

Kerangka Kerja Django REST

https://www.django-rest-framework.org/

Dependensi opsional

Penspesifikasian dependensi opsional

Paket Python

Fitur Weblate

amazon

Amazon Translate

gelf

Pengelolaan catatan Graylog

gerrit

Gerrit review requests

google

Google Cloud Translation Lanjutan dengan dukungan glosarium

google-errors

Mengumpulkan laporan galat dan memantau kinerja

ldap

Autentikasi LDAP

mercurial

Mercurial

postgres

PostgreSQL, lihat Pengaturan basis data untuk Weblate

rollbar

Mengumpulkan laporan galat dan memantau kinerja

saml

Autentikasi SAML

saml2idp

Mengintegrasikan SAML 2 IDP ke Weblate

sphinx

Diperlukan untuk Perbarui berkas POT (Sphinx)

wllegal

Integrasi Hosted Weblate

wsgi

server wsgi untuk Weblate

zxcvbn

Autentikasi kata sandi

Saat memasang menggunakan pip, Anda dapat langsung menentukan fitur yang diinginkan saat memasang:

uv pip install "weblate[Postgres,Amazon,SAML]"

Atau Anda dapat memasang Weblate dengan semua fitur opsional:

uv pip install "weblate[all]"

Atau Anda dapat memasang Weblate tanpa fitur opsional apa pun:

uv pip install weblate

Pemecahan masalah pemasangan pip

ERROR: Dependency 'gobject-introspection-2.0' is required but not found.

Paket PyGobject yang terpasang tidak dapat menemukan pustaka Introspeksi GObject yang sesuai - gobject-introspection-2.0.

Versi lama tidak lagi didukung oleh Weblate.

ffi_prep_closure(): bad user_data (it seems that the version of the libffi library seen at runtime is different from the 'ffi.h' file seen at compile-time)

Hal ini disebabkan oleh ketidakcocokan paket biner yang didistribusikan melalui PyPI dengan distribusinya. Untuk mengatasi hal ini, Anda perlu membangun ulang paket tersebut di sistem Anda:

uv pip install --force-reinstall --no-binary :all: cffi
error: ‘xmlSecKeyDataFormatEngine’ undeclared (first use in this function); did you mean ‘xmlSecKeyDataFormat’?

Ini adalah isu yang diketahui dari paket xmlsec, silakan lihat https://github.com/xmlsec/python-xmlsec/issues/314.

lxml & xmlsec libxml2 library version mismatch

Paket lxml dan xmlsec harus dibangun berdasarkan libxml2 yang sama. Anda harus membangunnya secara lokal untuk menghindari isu ini:

uv pip install --force-reinstall --no-binary xmlsec --no-binary lxml lxml xmlsec

Persyaratan sistem lainnya

Dependensi berikut harus dipasang pada sistem:

Git

https://git-scm.com/

Pango, Cairo dan berkas kepala terkait, dan data introspeksi GObject

https://cairographics.org/, https://www.gtk.org/docs/architecture/pango, lihat Pango dan Cairo

git-review (opsional untuk dukungan Gerrit)

git-review

git-svn (opsional untuk dukungan Subversion)

https://git-scm.com/docs/git-svn

tesseract (hanya diperlukan jika tesserocr wheels biner tidak tersedia untuk sistem Anda)

https://github.com/tesseract-ocr/tesseract

Dependensi waktu pembangunan

Untuk membangun beberapa Dependensi Python, Anda mungkin perlu memasang dependensinya. Hal ini bergantung pada cara Anda memasangnya, jadi silakan lihat paket individual untuk dokumentasi. Anda tidak akan memerlukannya jika menggunakan Wheels bawaan saat memasang menggunakan pip atau saat Anda menggunakan paket distribusi.

Pango dan Cairo

Weblate menggunakan Pango dan Cairo untuk merender widget bitmap (lihat Membangun komunitas terjemahan) dan pemeriksaan rendering (lihat Mengelola huruf). Untuk memasang binding Python dengan benar, Anda perlu memasang pustaka sistem terlebih dahulu - Anda memerlukan Cairo dan Pango, yang juga memerlukan GLib. Semua itu harus dipasang bersama berkas pengembangan dan data introspeksi GObject.

Persyaratan perangkat keras

Weblate seharusnya dapat berjalan pada perangkat keras apa pun saat ini tanpa masalah, berikut ini adalah konfigurasi minimal yang diperlukan untuk menjalankan Weblate pada hos tunggal (Weblate, basis data, dan server web):

  • RAM 3 GB

  • 2 inti CPU

  • Ruang penyimpanan 1 GB

Catatan

Persyaratan sebenarnya untuk pemasangan Weblate Anda sangat bervariasi berdasarkan ukuran terjemahan yang dikelola di dalamnya.

Penggunaan memori

Semakin besar memori, semakin baik - memori tersebut digunakan untuk penyimpanan di semua tingkatan (sistem berkas, basis data, dan Weblate). Untuk ratusan komponen terjemahan, RAM minimal 4 GB direkomendasikan.

Petunjuk

Untuk sistem dengan memori lebih sedikit dari yang direkomendasikan, Pengaturan Celery proses tunggal direkomendasikan.

Penggunaan CPU

Banyak pengguna bersamaan meningkatkan jumlah inti CPU yang diperlukan.

Penggunaan penyimpanan

Penggunaan penyimpanan basis data pada umumnya adalah sekitar 300 MB per 1 juta kata yang dihos.

Ruang penyimpanan yang dibutuhkan untuk repositori kloning bervariasi, tetapi Weblate mencoba menjaga ukurannya tetap minimal dengan melakukan kloning dangkal.

Simpul

Untuk situs berukuran kecil dan menengah (jutaan kata yang dihos), semua komponen Weblate (lihat Ikhtisar arsitektur) dapat dijalankan pada satu simpul.

Saat jumlah kata yang dihos mencapai ratusan juta, sebaiknya miliki simpul khusus untuk basis data (lihat Pengaturan basis data untuk Weblate).

Verifying release artifacts

Release archives can be verified using the signatures, attestations, and SBOMs published with GitHub release assets. See Verifying release artifacts.

Izin sistem berkas

Proses Weblate harus dapat membaca dan menulis ke direktori tempat data disimpan - DATA_DIR. Semua berkas di dalam direktori ini harus dimiliki dan dapat ditulis oleh pengguna yang menjalankan semua proses Weblate (biasanya WSGI dan Celery, lihat Menjalankan server dan Tugas latar belakang menggunakan Celery).

Konfigurasi bawaan menempatkannya di pohon yang sama dengan sumber Weblate, namun Anda mungkin lebih suka memindahkannya ke lokasi yang lebih baik seperti: /var/lib/weblate.

Weblate mencoba membuat direktori ini secara otomatis, tetapi akan gagal jika tidak memiliki izin untuk melakukannya.

The configured CACHE_DIR also has to be writable by the Weblate process and has to allow executing generated helper files. Do not mount CACHE_DIR with the noexec option.

Anda juga harus berhati-hati saat menjalankan Perintah pengelolaan, karena file tersebut harus dijalankan di bawah pengguna yang sama dengan tempat Weblate itu berjalan, jika tidak, izin pada beberapa berkas mungkin salah.

Dalam kontainer Docker, semua berkas dalam volume /app/data harus dimiliki oleh pengguna weblate di dalam kontainer (UID 1000).

Pengaturan basis data untuk Weblate

Disarankan untuk menjalankan Weblate dengan server basis data PostgreSQL.

PostgreSQL 13 dan yang lebih baru didukung. PostgreSQL 15 atau yang lebih baru direkomendasikan.

Sambungan basis data

Dalam konfigurasi bawaan, setiap proses Weblate menyimpan sambungan persisten ke basis data. Sambungan persisten meningkatkan respons Weblate, tetapi mungkin memerlukan lebih banyak sumber daya untuk server basis data. Silakan lihat CONN_MAX_AGE dan Hubungan tetap untuk info selengkapnya.

Weblate memerlukan setidaknya sejumlah sambungan berikut:

  • \((4 \times \mathit{nCPUs}) + 2\) untuk proses Celery

  • \(\mathit{nCPUs} + 1\) untuk pekerja WSGI

Hal ini berlaku untuk konfigurasi bawaan kontainer Docker dan contoh yang disediakan dalam dokumentasi ini, tetapi jumlahnya akan berubah setelah Anda menyesuaikan jumlah pekerja WSGI atau menyesuaikan paralelisme Celery.

Batasan sebenarnya untuk jumlah sambungan basis data perlu lebih tinggi untuk memperhitungkan situasi berikut:

  • Perintah pengelolaan memerlukan sambungannya juga.

  • Jika proses kasus dihentikan (misalnya oleh pembunuh OOM), ia mungkin memblokir sambungan yang ada hingga batas waktu.

PostgreSQL

PostgreSQL biasanya merupakan pilihan terbaik untuk situs berbasis Django. Ini adalah basis data referensi yang digunakan untuk mengimplementasikan lapisan basis data Django.

Catatan

Weblate menggunakan ekstensi trigram yang terkadang harus dipasang secara terpisah. Cari postgresql-contrib atau paket dengan nama serupa.

Lihat juga

Catatan PostgreSQL

Membuat basis data di PostgreSQL

Biasanya merupakan ide yang bagus untuk menjalankan Weblate dalam basis data terpisah, dan akun pengguna terpisah:

# If PostgreSQL was not installed before, set the main password
sudo -u postgres psql postgres -c "\password postgres"

# Create a database user called "weblate"
sudo -u postgres createuser --superuser --pwprompt weblate

# Create the database "weblate" owned by "weblate"
sudo -u postgres createdb -E UTF8 -O weblate weblate

Petunjuk

Jika Anda tidak ingin menjadikan pengguna Weblate sebagai pengguna super di PostgreSQL, Anda dapat menghilangkannya. Dalam hal ini, Anda harus melakukan beberapa langkah migrasi secara manual karena pengguna super PostgreSQL dalam skema Weblate akan menggunakan:

CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE EXTENSION IF NOT EXISTS btree_gin;

Mengkonfigurasikan Weblate untuk menggunakan PostgreSQL

Cuplikan settings.py untuk PostgreSQL:

DATABASES = {
    "default": {
        # Database engine
        "ENGINE": "django.db.backends.postgresql",
        # Database name
        "NAME": "weblate",
        # Database user
        "USER": "weblate",
        # Configures name of the PostgreSQL role to alter during the database migration
        # "ALTER_ROLE": "weblate",
        # Database password
        "PASSWORD": "password",
        # Set to empty string for localhost
        "HOST": "database.example.com",
        # Set to empty string for default
        "PORT": "",
        # Persistent connections
        "CONN_MAX_AGE": None,
        "CONN_HEALTH_CHECKS": True,
    }
}

Migrasi basis data melakukan ALTER ROLE pada peran basis data yang digunakan oleh Weblate. Umumnya, nama peran sama dengan nama pengguna. Pada pengaturan yang lebih kompleks, nama peran berbeda dari nama pengguna, dan Anda akan mendapatkan pesan galat tentang peran yang tidak ada selama migrasi basis data (psycopg2.errors.UndefinedObject: role "weblate@hostname" does not exist). Hal ini diketahui terjadi pada Azure Database for PostgreSQL, tetapi tidak terbatas pada lingkungan ini. Silakan atur ALTER_ROLE untuk mengubah nama peran yang harus diubah Weblate selama migrasi basis data.

Konfigurasi lainnya

Mengkonfigurasikan surel keluar

Weblate mengirimkan surel pada berbagai kesempatan - untuk aktivasi akun dan berbagai notifikasi yang dikonfigurasi oleh pengguna. Untuk itu, Weblate memerlukan akses ke server SMTP.

Pengaturan server surat dikonfigurasikan menggunakan pengaturan berikut: EMAIL_HOST, EMAIL_HOST_PASSWORD, EMAIL_USE_TLS, EMAIL_USE_SSL, EMAIL_HOST_USER, dan EMAIL_PORT. Namanya cukup jelas, tetapi Anda dapat menemukan informasi lebih lanjut dalam dokumentasi Django.

Petunjuk

Jika Anda mendapatkan galat tentang autentikasi yang tidak didukung (misalnya SMTP AUTH extension not supported by server), kemungkinan besar hal ini disebabkan oleh penggunaan sambungan yang tidak aman dan server menolak untuk mengautentikasikan dengan cara ini. Coba aktifkan EMAIL_USE_TLS untuk kasus tersebut.

Berjalan di belakang proksi terbalik

Beberapa fitur di Weblate bergantung pada kepala HTTP yang benar yang diteruskan ke Weblate. Saat menggunakan proksi terbalik, pastikan informasi yang diperlukan diteruskan dengan benar.

Untuk mengawakutu konfigurasi ini, Anda dapat melihat Lingkungan HTTP di Laporan kinerja.

Alamat IP klien

Ini diperlukan untuk Pembatasan akses atau Catatan audit.

Weblate mengurai alamat IP dari REMOTE_ADDR, yang diatur oleh pengendali WSGI. Alamat ini mungkin kosong (ketika menggunakan soket untuk WSGI) atau berisi alamat proksi terbalik, sehingga Weblate memerlukan kepala HTTP tambahan dengan alamat IP klien.

Mengaktifkan IP_BEHIND_REVERSE_PROXY seharusnya cukup untuk pengaturan paling umum, tetapi Anda mungkin perlu menyesuaikan IP_PROXY_HEADER dan IP_PROXY_OFFSET juga (gunakan WEBLATE_IP_PROXY_HEADER dan WEBLATE_IP_PROXY_OFFSET dalam kontainer Docker).

Petunjuk

Konfigurasi ini tidak dapat diaktifkan secara bawaan, karena akan memungkinkan pemalsuan alamat IP pada pemasangan yang tidak memiliki proksi terbalik yang dikonfigurasi dengan benar.

Nama hos server

Kepala Host harus sesuai dengan konfigurasi yang didefinisikan sebagai SITE_DOMAIN. Konfigurasi tambahan mungkin diperlukan di proksi terbalik Anda (misalnya, gunakan ProxyPreserveHost On untuk Apache atau proxy_set_header Host $host; dengan nginx).

Petunjuk

Galat verifikasi CSRF yang gagal sering kali disebabkan oleh ketidakcocokan antara kepala Host dan SITE_DOMAIN yang dikonfigurasikan.

Protokol klien

Tidak melewati protokol yang benar dapat menyebabkan Weblate terjebak dalam loop pengalihan saat mencoba meningkatkan klien ke HTTPS. Pastikan protokol tersebut diekspos dengan benar oleh proksi terbalik sebagai X-Forwarded-Proto.

Kepala ini kemudian perlu dikonfigurasikan dalam SECURE_PROXY_SSL_HEADER (settings.py) atau WEBLATE_SECURE_PROXY_SSL_HEADER (lingkungan Docker).

Penting

Nilai kepala peka huruf kapital dalam konfigurasi, jadi WEBLATE_SECURE_PROXY_SSL_HEADER=HTTP_X_FORWARDED_PROTO,https dan WEBLATE_SECURE_PROXY_SSL_HEADER=HTTP_X_FORWARDED_PROTO,HTTPS tidak dapat dipertukarkan.

Petunjuk

Jika Anda mendapatkan galat "Terlalu banyak pengalihan" dari peramban, kemungkinan besar ini disebabkan oleh ketidakcocokan antara protokol aktual (HTTPS) dan apa yang diamati oleh Weblate.

Berubah pada versi 5.13: Kepala proksi protokol secara otomatis ditangani oleh gunicorn dalam konfigurasi bawaan, tetapi server WSGI lainnya memiliki konfigurasi yang lebih aman dan memerlukan pengaturan eksplisit ini.

Sejak Weblate 5.13 kontainer Docker menggunakan granian dan sekarang memerlukan konfigurasi eksplisit WEBLATE_SECURE_PROXY_SSL_HEADER.

Proksi HTTP

Weblate memang menjalankan perintah VCS dan perintah tersebut menerima konfigurasi proksi dari lingkungan. Pendekatan yang disarankan adalah menentukan pengaturan proksi di settings.py:

import os

os.environ["http_proxy"] = "http://proxy.example.com:8080"
os.environ["HTTPS_PROXY"] = "http://proxy.example.com:8080"

Menyesuaikan konfigurasi

Lihat juga

Contoh konfigurasi

Salin weblate/settings_example.py ke weblate/settings.py dan sesuaikan agar sesuai dengan pengaturan Anda. Mungkin Anda ingin menyesuaikan opsi berikut:

ADMINS

Daftar administrator situs yang menerima notifikasi saat terjadi kesalahan, misalnya notifikasi tentang penggabungan yang gagal, atau galat Django.

Formulir kontak juga mengirimkan surel pada ini kecuali ADMINS_CONTACT dikonfigurasikan.

ALLOWED_HOSTS

Anda perlu mengatur ini agar mencantumkan hos yang seharusnya dilayani oleh situs Anda. Misalnya:

ALLOWED_HOSTS = ["demo.weblate.org"]

Alternatifnya Anda dapat menyertakan wildcard:

ALLOWED_HOSTS = ["*"]

SESSION_ENGINE

Konfigurasikan cara penyimpanan sesi Anda. Jika Anda tetap menggunakan mesin backend basis data bawaan, Anda harus menjadwalkan: weblate clearsessions untuk menghapus data sesi yang lawas dari basis data.

Jika Anda menggunakan Valkey atau Redis sebagai simpanan (lihat Konfigurasi simpanan) disarankan untuk menggunakannya untuk sesi juga:

SESSION_ENGINE = "django.contrib.sessions.backends.cache"

DATABASES

Konektivitas ke server basis data, silakan periksa dokumentasi Django untuk rincian lebih lanjut.

DEBUG

Nonaktifkan ini untuk semua server produksi. Dengan mode awakutu diaktifkan, Django akan menampilkan backtrace jika terjadi galat kepada pengguna. Saat Anda menonaktifkannya, galat akan dikirim melalui surel ke ADMIN (lihat di atas).

Mode awakutu juga memperlambat Weblate, karena Django menyimpan lebih banyak informasi secara internal dalam kasus ini.

DEFAULT_FROM_EMAIL

Alamat pengirim surel untuk surel keluar, misalnya surel pendaftaran.

Lihat juga

DEFAULT_FROM_EMAIL

SECRET_KEY

Kunci yang digunakan oleh Django untuk menandatangani beberapa info dalam kuki, lihat Kunci rahasia Django untuk info lebih lanjut.

Lihat juga

SECRET_KEY

SERVER_EMAIL

Surel digunakan sebagai alamat pengirim untuk mengirim surel ke administrator, misalnya notifikasi tentang penggabungan yang gagal.

Lihat juga

SERVER_EMAIL

Mengisi basis data

Setelah konfigurasi Anda siap, Anda dapat menjalankan migrate untuk membuat struktur basis data. Sekarang Anda seharusnya dapat membuat proyek terjemahan menggunakan antarmuka admin.

Setelah selesai, Anda juga harus memeriksa Laporan kinerja di antarmuka admin, yang akan memberi Anda petunjuk tentang potensi konfigurasi yang tidak optimal di situs Anda.

Pengaturan produksi

Untuk pengaturan produksi, Anda harus melakukan penyesuaian yang dijelaskan di bagian berikut. Pengaturan paling kritis akan memicu peringatan yang ditunjukkan dengan tanda seru di bilah atas jika masuk sebagai pengguna super:

../_images/admin-wrench.webp

Disarankan juga untuk memeriksa pemeriksaan yang dipicu oleh Django (meskipun Anda mungkin tidak perlu memperbaiki semuanya):

weblate check --deploy

Anda juga dapat meninjau daftar periksa yang sama di Laporan kinerja di Antarmuka pengelolaan.

Nonaktifkan mode awakutu

Nonaktifkan mode awakutu Django (DEBUG) dengan:

DEBUG = False

Dengan mode awakutu aktif, Django menyimpan semua kueri yang dieksekusi dan menunjukkan kepada pengguna jejak balik galat, yang tidak diinginkan dalam pengaturan produksi.

Konfigurasikan admin dengan benar

Atur alamat admin yang benar ke pengaturan ADMINS untuk menentukan siapa yang akan menerima surel jika terjadi kesalahan pada server, misalnya:

ADMINS = ("Your Name <your_email@example.com>",)

Atur domain situs yang benar

Sesuaikan nama situs dan domain di antarmuka admin. Jika tidak, tautan di RSS atau surel pendaftaran tidak akan berfungsi. Konfigurasi ini menggunakan SITE_DOMAIN yang seharusnya berisi nama domain situs.

Berubah pada versi 4.2: Sebelum rilis 4.2 kerangka kerja situs Django digunakan sebagai gantinya, silakan lihat Kerangka kerja "sites".

Konfigurasikan HTTPS dengan benar

Sangat disarankan untuk menjalankan Weblate menggunakan protokol HTTPS terenkripsi. Setelah mengaktifkannya, Anda harus mengatur ENABLE_HTTPS di pengaturan:

ENABLE_HTTPS = True

Petunjuk

Anda mungkin ingin menyiapkan HSTS juga, lihat SSL/HTTPS untuk rincian lebih lanjut.

Atur SECURE_HSTS_SECONDS dengan benar

Jika situs Anda dilayani melalui SSL, pertimbangkan untuk mengatur nilai untuk SECURE_HSTS_SECONDS di settings.py untuk mengaktifkan Keamanan Transportasi Ketat HTTP. Secara bawaan, nilai tersebut diatur ke 0 seperti yang ditunjukkan di bawah ini.

SECURE_HSTS_SECONDS = 0

Jika diatur ke nilai integer non-nol, django.middleware.security.SecurityMiddleware akan mengatur header HTTP Strict Transport Security pada semua respons yang belum memilikinya.

Peringatan

Pengaturan yang salah dapat merusak situs Anda secara permanen (untuk sementara waktu). Baca dokumentasi HTTP Strict Transport Security terlebih dahulu.

Gunakan mesin basis data yang kuat

  • Silakan gunakan PostgreSQL untuk lingkungan produksi, lihat Pengaturan basis data untuk Weblate untuk info lebih lanjut.

  • Gunakan lokasi yang berdekatan untuk menjalankan server basis data, jika tidak, kinerja atau keandalan jaringan dapat merusak pengalaman Weblate Anda.

  • Periksa kinerja server basis data atau ubah konfigurasinya, misalnya menggunakan PGTune.

Konfigurasi simpanan

Jika memungkinkan, gunakan Valkey atau Redis dari Django dengan menyesuaikan variabel konfigurasi CACHES, misalnya:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/0",
        # If redis is running on same host as Weblate, you might
        # want to use unix sockets instead:
        # 'LOCATION': 'unix:///var/run/redis/redis.sock?db=0',
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "PARSER_CLASS": "redis.connection.HiredisParser",
        },
    }
}

Petunjuk

Jika Anda mengubah pengaturan untuk simpanan, Anda mungkin perlu menyesuaikannya untuk Celery juga, lihat Tugas latar belakang menggunakan Celery.

Simpanan avatar

Selain melakukan menyimpan Django, Weblate juga melakukan menyimpan avatar. Disarankan untuk menggunakan simpanan terpisah yang didukung berkas untuk tujuan ini:

CACHES = {
    "default": {
        # Default caching backend setup, see above
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "unix:///var/run/redis/redis.sock?db=0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "PARSER_CLASS": "redis.connection.HiredisParser",
        },
    },
    "avatar": {
        "BACKEND": "django.core.cache.backends.filebased.FileBasedCache",
        "LOCATION": os.path.join(DATA_DIR, "avatar-cache"),
        "TIMEOUT": 604800,
        "OPTIONS": {
            "MAX_ENTRIES": 1000,
        },
    },
}

Konfigurasikan pengiriman surel

Weblate perlu mengirimkan surel beberapa kali, dan surel ini harus memiliki alamat pengirim yang benar, silakan konfigurasikan SERVER_EMAIL dan DEFAULT_FROM_EMAIL agar cocok dengan lingkungan Anda, misalnya:

SERVER_EMAIL = "admin@example.org"
DEFAULT_FROM_EMAIL = "weblate@example.org"

Catatan

Untuk menonaktifkan pengiriman surel melalui Weblate, atur EMAIL_BACKEND ke django.core.mail.backends.dummy.EmailBackend.

Ini akan menonaktifkan semua pengiriman surel termasuk surel pendaftaran atau pengaturan ulang kata sandi.

Pengaturan hos yang diizinkan

Django memerlukan ALLOWED_HOSTS untuk menampung daftar nama domain yang boleh dilayani oleh situs Anda, membiarkannya kosong akan memblokir permintaan apa pun.

Jika ini tidak dikonfigurasikan untuk mencocokkan server HTTP, Anda akan mendapatkan galat seperti Invalid HTTP_HOST header: '1.1.1.1'. You may need to add '1.1.1.1' to ALLOWED_HOSTS.

Petunjuk

Pada kontainer Docker, ini tersedia sebagai WEBLATE_ALLOWED_HOSTS.

Kunci rahasia Django

Pengaturan SECRET_KEY digunakan oleh Django untuk menandatangani kuki, dan Anda sebaiknya benar-benar menghasilkan nilai Anda sendiri daripada menggunakan nilai yang ada pada contoh pengaturan.

Anda dapat menghasilkan kunci baru menggunakan weblate-generate-secret-key yang dikirimkan dengan Weblate.

Lihat juga

SECRET_KEY

Menjalankan tugas pemeliharaan

Untuk kinerja optimal, sebaiknya jalankan beberapa tugas pemeliharaan di latar belakang. Tugas ini dilakukan secara otomatis oleh Tugas latar belakang menggunakan Celery dan mencakup tugas berikut:

  • Pemeriksaan kesehatan konfigurasi (setiap jam).

  • Mengkomit perubahan yang tertunda (setiap jam), lihat Komit malas dan commit_pending.

  • Memperbarui peringatan komponen (harian).

  • Perbarui cabang jarak jauh (setiap malam), lihat AUTO_UPDATE.

  • Pencadangan memori terjemahan ke JSON (harian), lihat dump_memory.

  • Tugas pemeliharaan teks lengkap dan basis data (tugas harian dan mingguan), lihat cleanuptrans.

Lokalisasi dan pengenkodean sistem

Lokalisasi sistem harus dikonfigurasikan agar mendukung UTF-8. Pada sebagian besar distribusi Linux, ini adalah pengaturan bawaan. Jika tidak demikian pada sistem Anda, silakan ubah lokalisasi ke varian UTF-8.

Misalnya dengan menyunting /etc/default/locale dan mengaturnya LANG="C.UTF-8".

Dalam beberapa kasus, layanan individual memiliki konfigurasi terpisah untuk lokalisasi. Hal ini bervariasi antara distribusi dan server web, jadi periksa dokumentasi paket server web Anda untuk itu.

Apache di Ubuntu menggunakan /etc/apache2/envvars:

export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'

Apache di CentOS menggunakan /etc/sysconfig/httpd (atau /opt/rh/httpd24/root/etc/sysconfig/httpd):

LANG='en_US.UTF-8'

Menggunakan otoritas sertifikat kustom

Weblate memang memverifikasikan sertifikat SSL selama proses permintaan HTTP. Jika Anda menggunakan otoritas sertifikat khusus yang tidak dipercaya dalam bundel bawaan, Anda harus menambahkan sertifikatnya sebagai sertifikat tepercaya.

Pendekatan yang lebih disukai adalah melakukan ini di tingkat sistem, silakan periksa dokumentasi distro Anda untuk rincian lebih lanjut (misalnya pada Debian dapat dilakukan dengan menempatkan sertifikat CA ke dalam /usr/local/share/ca-certificates/ dan menjalankan update-ca-certificates).

Petunjuk

Kontainer Weblate tidak menyertakannya di jalur pencarian, Anda perlu menentukan jalur lengkap untuk menjalankannya. Misalnya:

docker compose exec -u root weblate /usr/sbin/update-ca-certificates

Setelah ini selesai, peralatan sistem akan mempercayai sertifikat tersebut dan ini termasuk Git.

Untuk kode Python, Anda perlu mengkonfigurasikan permintaan agar menggunakan bundel CA sistem, bukan yang disertakan. Hal ini dapat dilakukan dengan menempatkan cuplikan kode berikut ke settings.py (jalurnya spesifik Debian):

import os

os.environ["REQUESTS_CA_BUNDLE"] = "/etc/ssl/certs/ca-certificates.crt"

Mengompres aset klien

Weblate dilengkapi dengan banyak berkas JavaScript dan CSS. Demi kinerja, sebaiknya berkas-berkas tersebut dikompres sebelum dikirim ke klien. Dalam konfigurasi bawaan, hal ini dilakukan secara otomatis dengan biaya overhead yang kecil. Pada instalasi besar, disarankan untuk mengaktifkan mode kompresi luring. Hal ini perlu dilakukan dalam konfigurasi dan kompresi harus dipicu pada setiap peningkatan Weblate.

Peralihan konfigurasinya sederhana dengan mengaktifkan django.conf.settings.COMPRESS_OFFLINE dan mengkonfigurasikan django.conf.settings.COMPRESS_OFFLINE_CONTEXT (yang terakhir sudah termasuk dalam konfigurasi contoh):

COMPRESS_OFFLINE = True

Pada setiap penyebaran, Anda perlu mengompres berkas agar cocok dengan versi saat ini:

weblate compress

Petunjuk

Gambar Docker resmi telah mengaktifkan fitur ini.

Menjalankan server

Petunjuk

Jika Anda tidak berpengalaman dengan layanan yang dijelaskan di bawah ini, Anda mungkin ingin mencoba Memasang menggunakan Docker.

Anda akan memerlukan beberapa layanan untuk menjalankan Weblate, pengaturan yang direkomendasikan terdiri dari:

Catatan

Ada beberapa ketergantungan antara layanan, misalnya simpanan dan basis data harus dijalankan saat memulai proses Celery atau uwsgi.

Umumnya, Anda akan menjalankan semua layanan pada satu server (virtual), tetapi jika pemasangan Anda sangat padat, Anda dapat membagi layanan tersebut. Satu-satunya batasannya adalah server Celery dan Wsgi memerlukan akses ke DATA_DIR.

Catatan

Proses WSGI harus dijalankan di bawah pengguna yang sama dengan proses Celery, jika tidak, berkas dalam DATA_DIR akan disimpan dengan kepemilikan campuran, yang akan menyebabkan isu runtime.

Lihat juga Izin sistem berkas dan Tugas latar belakang menggunakan Celery.

Menjalankan server web

Menjalankan Weblate tidak berbeda dengan menjalankan program berbasis Django lainnya. Django biasanya dijalankan sebagai WSGI atau fcgi (lihat contoh untuk berbagai webserver di bawah).

Catatan

The sample configuration files shown below are maintained in the Weblate source tree under weblate/examples/. They are included in source distributions and in this documentation, but Python wheels only install runtime files. When installing Weblate from PyPI, get the matching source distribution or source checkout before copying these examples.

Untuk tujuan pengujian, Anda dapat menggunakan server web bawaan di Django:

weblate runserver

Peringatan

JANGAN GUNAKAN SERVER INI DALAM PENGATURAN PRODUKSI. Server ini belum melalui audit keamanan atau uji kinerja. Lihat juga dokumentasi Django tentang runserver.

Petunjuk

Server bawaan Django hanya menyajikan berkas statis dengan DEBUG diaktifkan karena ditujukan hanya untuk pengembangan. Untuk penggunaan produksi, silakan lihat pengaturan WSGI:

Menyajikan berkas statis

Berubah pada versi 5.15.2: /media/ tidak lagi digunakan untuk menyajikan tangkapan layar.

Django perlu mengumpulkan berkas statisnya dalam satu direktori. Untuk melakukannya, jalankan weblate collectstatic --noinput. Ini akan menyalin berkas statis ke direktori yang ditentukan oleh pengaturan STATIC_ROOT (secara bawaan, direktori static di dalam CACHE_DIR).

Disarankan untuk menyajikan berkas statis langsung dari server web Anda, Anda harus menggunakannya untuk jalur berikut:

/static/

Menyajikan berkas statis untuk Weblate dan antarmuka admin (dari yang didefinisikan oleh STATIC_ROOT).

/favicon.ico

Harus ditulis ulang untuk menulis ulang aturan untuk melayani /static/favicon.ico.

Kebijakan keamanan konten

Konfigurasi Weblate bawaan mengaktifkan alat tengah weblate.middleware.SecurityMiddleware yang mengatur kepala HTTP terkait keamanan seperti Content-Security-Policy atau X-XSS-Protection. Kepala HTTP ini secara bawaan dikonfigurasikan untuk bekerja dengan Weblate dan konfigurasinya, tetapi mungkin perlu disesuaikan dengan lingkungan Anda.

Contoh konfigurasi untuk NGINX dan Granian

Konfigurasi berikut menjalankan Weblate menggunakan Granian, server web NGINX:

weblate/examples/weblate.nginx.granian.conf
#
# nginx configuration for Weblate
#
# You will want to change:
#
# - server_name
# - change /home/weblate/weblate-env to location where Weblate Python environment is placed
# - change /home/weblate/data to match your DATA_DIR
# - change /home/weblate/data/cache to match your CACHE_DIR
# - change python3.12 to match your Python version
# - change weblate user to match your Weblate user
#
server {
    listen 80;
    server_name weblate;
    # Not used
    root /var/www/html;

    location ~ ^/favicon.ico$ {
        # CACHE_DIR/static/favicon.ico
        alias /home/weblate/data/cache/static/favicon.ico;
        expires 30d;
    }

    location /static/ {
        # CACHE_DIR/static/
        alias /home/weblate/data/cache/static/;
        expires 30d;
    }

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:8888;
        proxy_read_timeout 3600;
    }
}

Contoh konfigurasi untuk NGINX dan Gunicorn

The following configuration runs Weblate using Gunicorn under the NGINX webserver (weblate/examples/weblate.nginx.gunicorn.conf in the source tree):

#
# nginx configuration for Weblate
#
# You will want to change:
#
# - server_name
# - change /home/weblate/weblate-env to location where Weblate Python environment is placed
# - change /home/weblate/data to match your DATA_DIR
# - change /home/weblate/data/cache to match your CACHE_DIR
# - change python3.12 to match your Python version
# - change weblate user to match your Weblate user
#
server {
    listen 80;
    server_name weblate;
    # Not used
    root /var/www/html;

    location ~ ^/favicon.ico$ {
        # CACHE_DIR/static/favicon.ico
        alias /home/weblate/data/cache/static/favicon.ico;
        expires 30d;
    }

    location /static/ {
        # CACHE_DIR/static/
        alias /home/weblate/data/cache/static/;
        expires 30d;
    }

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_pass http://unix:/run/gunicorn.sock;
        proxy_read_timeout 3600;
    }
}

Contoh konfigurasi untuk NGINX dan uWSGI

To run production webserver, use the WSGI wrapper installed with Weblate (when using a Python environment it is installed as ~/weblate-env/lib/python3.14/site-packages/weblate/wsgi.py). Don't forget to set the Python search path to your Python environment as well (for example using virtualenv = /home/user/weblate-env in uWSGI).

Konfigurasi berikut menjalankan Weblate sebagai uWSGI di bawah server web NGINX.

Configuration for NGINX (weblate/examples/weblate.nginx.conf in the source tree):

#
# nginx configuration for Weblate
#
# You will want to change:
#
# - server_name
# - change /home/weblate/weblate-env to location where Weblate Python environment is placed
# - change /home/weblate/data to match your DATA_DIR
# - change /home/weblate/data/cache to match your CACHE_DIR
# - change python3.12 to match your Python version
# - change weblate user to match your Weblate user
#
server {
    listen 80;
    server_name weblate;
    # Not used
    root /var/www/html;

    location ~ ^/favicon.ico$ {
        # CACHE_DIR/static/favicon.ico
        alias /home/weblate/data/cache/static/favicon.ico;
        expires 30d;
    }

    location /static/ {
        # CACHE_DIR/static/
        alias /home/weblate/data/cache/static/;
        expires 30d;
    }

    location / {
        include uwsgi_params;
        # Needed for long running operations in admin interface
        uwsgi_read_timeout 3600;
        # Adjust based to uwsgi configuration:
        uwsgi_pass unix:///run/uwsgi/app/weblate/socket;
        # uwsgi_pass 127.0.0.1:8080;
    }
}

Configuration for uWSGI (weblate/examples/weblate.uwsgi.ini in the source tree):

#
# uWSGI configuration for Weblate
#
# You will want to change:
#
# - change /home/weblate/weblate-env to location where Weblate Python environment is placed
# - change /home/weblate/data to match your DATA_DIR
# - change python3.12 to match your Python version
# - change weblate user to match your Weblate user
#
[uwsgi]
plugins       = python3
master        = true
protocol      = uwsgi
socket        = 127.0.0.1:8080
wsgi-file     = /home/weblate/weblate-env/lib/python3.12/site-packages/weblate/wsgi.py

# Add path to Weblate checkout if you did not install
# Weblate by pip
# python-path   = /path/to/weblate

# Path to the Python environment
virtualenv = /home/weblate/weblate-env

# Needed for OAuth/OpenID
buffer-size   = 8192

# Reload when consuming too much of memory
reload-on-rss = 250

# Increase number of workers for heavily loaded sites
workers       = 8

# Enable threads for Sentry error submission
enable-threads = true

# Child processes do not need file descriptors
close-on-exec = true

# Avoid default 0000 umask
umask = 0022

# Run as weblate user
uid = weblate
gid = weblate

# Enable harakiri mode (kill requests after some time)
# harakiri = 3600
# harakiri-verbose = true

# Enable uWSGI stats server
# stats = :1717
# stats-http = true

# Do not log some errors caused by client disconnects
ignore-sigpipe = true
ignore-write-errors = true
disable-write-exception = true

Contoh konfigurasi untuk Apache

Disarankan untuk menggunakan prefork MPM saat menggunakan WSGI dengan Weblate.

The following configuration runs Weblate as WSGI, you need to have enabled mod_wsgi (weblate/examples/apache.conf in the source tree):

#
# VirtualHost for Weblate
#
# You will want to change:
#
# - ServerAdmin and ServerName
# - change /home/weblate/weblate-env to location where Weblate Python environment is placed
# - change /home/weblate/data to match your DATA_DIR
# - change /home/weblate/data/cache to match your CACHE_DIR
# - change python3.12 to match Python version mod-wsgi is compiled for
# - change weblate user to match your Weblate user
#
<VirtualHost *:80>
    ServerAdmin admin@weblate.example.org
    ServerName weblate.example.org

    # CACHE_DIR/static/favicon.ico
    Alias /favicon.ico /home/weblate/data/cache/static/favicon.ico

    # CACHE_DIR/static/
    Alias /static/ /home/weblate/data/cache/static/
    <Directory /home/weblate/data/cache/static/>
        Require all granted
    </Directory>

    # Path to your Weblate Python environment
    WSGIDaemonProcess weblate python-home=/home/weblate/weblate-env user=weblate request-timeout=600
    WSGIProcessGroup weblate
    WSGIApplicationGroup %{GLOBAL}

    WSGIScriptAlias / /home/weblate/weblate-env/lib/python3.12/site-packages/weblate/wsgi.py process-group=weblate
    WSGIPassAuthorization On

    <Directory /home/weblate/weblate-env/lib/python3.12/site-packages/weblate/>
        <Files wsgi.py>
        Require all granted
        </Files>
    </Directory>

</VirtualHost>

Catatan

Weblate membutuhkan Python 3, jadi pastikan Anda menjalankan varian Python 3 dari modwsgi. Biasanya tersedia sebagai paket terpisah, misalnya libapache2-mod-wsgi-py3.

Gunakan versi Python yang cocok untuk memasang Weblate.

Contoh konfigurasi untuk Apache dan Gunicorn

The following configuration runs Weblate in Gunicorn and Apache 2.4 (weblate/examples/apache.gunicorn.conf in the source tree):

#
# VirtualHost for Weblate using gunicorn on localhost:8000
#
# You will want to change:
#
# - ServerAdmin and ServerName
# - change /home/weblate/weblate-env to location where Weblate Python environment is placed
# - change /home/weblate/data to match your DATA_DIR
# - change /home/weblate/data/cache to match your CACHE_DIR
# - change weblate user to match your Weblate user
#
<VirtualHost *:443>
    ServerAdmin admin@weblate.example.org
    ServerName weblate.example.org

    # CACHE_DIR/static/favicon.ico
    Alias /favicon.ico /home/weblate/data/cache/static/favicon.ico

    # CACHE_DIR/static/
    Alias /static/ /home/weblate/data/cache/static/
    <Directory /home/weblate/data/cache/static/>
        Require all granted
    </Directory>

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/https_cert.cert
    SSLCertificateKeyFile /etc/apache2/ssl/https_key.pem
    SSLProxyEngine On

    ProxyPass /favicon.ico !
    ProxyPass /static/ !

    ProxyPass / http://localhost:8000/
    ProxyPassReverse / http://localhost:8000/
    ProxyPreserveHost On
</VirtualHost>

Contoh konfigurasi untuk memulai Granian

Weblate memiliki dependensi opsional wsgi (lihat Dependensi Python) yang akan memasang semua yang Anda butuhkan untuk menjalankan Granian. Saat memasang Weblate, Anda dapat menentukannya sebagai berikut:

uv pip install Weblate[all,wsgi]

Setelah Granian terpasang, Anda dapat menjalankannya. Proses ini biasanya dilakukan di tingkat sistem. Contoh berikut menunjukkan cara memulai melalui systemd:

/etc/systemd/system/granian.service
[Unit]
Description=granian daemon
After=network.target

[Service]
User=weblate
Group=weblate
WorkingDirectory=/home/weblate/weblate-env/
Environment="DJANGO_SETTINGS_MODULE=weblate.settings"
RuntimeDirectory=granian
ExecStart=/home/weblate/weblate-env/bin/granian \
    --no-ws \
    --workers-max-rss 350 \
    --interface wsgi \
    --workers 2 \
    --backpressure 16 \
    --runtime-threads 8 \
    --runtime-mode mt \
    --port 8888 \
    weblate.wsgi:application

[Install]
WantedBy=multi-user.target
~

Contoh konfigurasi untuk memulai Gunicorn

Gunicorn harus dipasang secara terpisah:

uv pip install gunicorn

Setelah Gunicorn terpasang, Anda dapat menjalankannya. Proses ini biasanya dilakukan di tingkat sistem. Contoh berikut menunjukkan proses memulai melalui systemd:

/etc/systemd/system/gunicorn.socket
[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target
/etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=weblate
Group=weblate
WorkingDirectory=/home/weblate/weblate-env/
Environment="DJANGO_SETTINGS_MODULE=weblate.settings"
ExecStart=/home/weblate/weblate-env/bin/gunicorn \
    --preload \
    --timeout 3600 \
    --graceful-timeout 3600 \
    --worker-class=gthread \
    --workers=2 \
    --threads=16 \
    --bind unix:/run/gunicorn.sock \
    weblate.wsgi:application

[Install]
WantedBy=multi-user.target

Menjalankan Weblate di bawah jalur

Disarankan untuk menggunakan prefork MPM saat menggunakan WSGI dengan Weblate.

A sample Apache configuration to serve Weblate under /weblate. Again using mod_wsgi (weblate/examples/apache-path.conf in the source tree):

#
# VirtualHost for Weblate, running under /weblate path
#
# You will want to change:
#
# - ServerAdmin and ServerName
# - change /home/weblate/weblate-env to location where Weblate Python environment is placed
# - change /home/weblate/data to match your DATA_DIR
# - change /home/weblate/data/cache to match your CACHE_DIR
# - change python3.12 to match Python version mod-wsgi is compiled for
# - change weblate user to match your Weblate user
#
<VirtualHost *:80>
    ServerAdmin admin@weblate.example.org
    ServerName weblate.example.org

    # CACHE_DIR/static/favicon.ico
    Alias /weblate/favicon.ico /home/weblate/data/cache/static/favicon.ico

    # CACHE_DIR/static/
    Alias /weblate/static/ /home/weblate/data/cache/static/
    <Directory /home/weblate/data/cache/static/>
        Require all granted
    </Directory>

    # Path to your Weblate Python environment
    WSGIDaemonProcess weblate python-home=/home/weblate/weblate-env user=weblate request-timeout=600
    WSGIProcessGroup weblate
    WSGIApplicationGroup %{GLOBAL}

    WSGIScriptAlias /weblate /home/weblate/weblate-env/lib/python3.12/site-packages/weblate/wsgi.py process-group=weblate
    WSGIPassAuthorization On

    <Directory /home/weblate/weblate-env/lib/python3.12/site-packages/weblate/>
        <Files wsgi.py>
        Require all granted
        </Files>
    </Directory>

</VirtualHost>

Selain itu, Anda harus menyesuaikan weblate/settings.py:

URL_PREFIX = "/weblate"

Tugas latar belakang menggunakan Celery

Weblate menggunakan Celery untuk menjalankan tugas reguler dan latar belakang. Anda seharusnya menjalankan layanan Celery yang akan menjalankan tugas ini. Misalnya, layanan ini bertanggung jawab untuk menangani operasi berikut (daftar ini belum lengkap):

Pengaturan umum menggunakan Valkey atau Redis sebagai backend terlihat seperti ini:

CELERY_TASK_ALWAYS_EAGER = False
CELERY_BROKER_URL = "redis://localhost:6379"
CELERY_RESULT_BACKEND = CELERY_BROKER_URL

You should also start the Celery worker to process the tasks and start scheduled tasks. For debugging or development, this can be done directly on the command-line:

celery --app=weblate.utils worker --beat --queues=celery,notify,memory,translate,backup

Catatan

Proses Celery harus dijalankan di bawah pengguna yang sama dengan proses WSGI, jika tidak, berkas dalam DATA_DIR akan disimpan dengan kepemilikan campuran, yang akan menyebabkan isu runtime.

Lihat juga Izin sistem berkas dan Menjalankan server.

Menjalankan tugas Celery di WSGI menggunakan mode eager

Catatan

Hal ini akan berdampak parah pada kinerja antarmuka web dan akan merusak fitur yang bergantung pada pemicu reguler (misalnya melakukan perubahan yang tertunda, notifikasi intisari, atau pencadangan).

Untuk pengembangan, Anda mungkin ingin menggunakan konfigurasi eager, yang memproses semua tugas di tempatnya:

CELERY_TASK_ALWAYS_EAGER = True
CELERY_BROKER_URL = "memory://"
CELERY_TASK_EAGER_PROPAGATES = True

Menjalankan Celery sebagai layanan sistem

Most likely you will want to run Celery as a daemon and that is covered by Daemonization. For the most common Linux setup using systemd, adapt the example files listed below. These examples are maintained in the Weblate source tree under weblate/examples/; Python wheels do not install these deployment samples.

Unit Systemd akan ditempatkan sebagai /etc/systemd/system/celery-weblate.service:

[Unit]
Description=Celery Service (Weblate)
After=network.target

[Service]
Type=forking
User=weblate
Group=weblate
EnvironmentFile=/etc/default/celery-weblate
WorkingDirectory=/home/weblate
RuntimeDirectory=celery
RuntimeDirectoryPreserve=restart
LogsDirectory=celery
ExecStart=/bin/sh -c '${CELERY_BIN} multi start ${CELERYD_NODES} \
  -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
  --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}'
ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait ${CELERYD_NODES} \
  --pidfile=${CELERYD_PID_FILE}'
ExecReload=/bin/sh -c '${CELERY_BIN} multi restart ${CELERYD_NODES} \
  -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
  --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}'

[Install]
WantedBy=multi-user.target

Konfigurasi lingkungan akan ditempatkan sebagai /etc/default/celery-weblate:

# Name of nodes to start
CELERYD_NODES="celery notify memory backup translate"

# Absolute or relative path to the 'celery' command:
CELERY_BIN="/home/weblate/weblate-env/bin/celery"

# App instance to use
# comment out this line if you don't use an app
CELERY_APP="weblate.utils"

# Extra command-line arguments to the worker. You might need to customize
# concurrency depending on the available resources and Weblate usage. Increase
# the concurrency if you get weblate.E019 error, decrease it if you are on a
# low-resource system.
CELERYD_OPTS="--beat:celery --queues:celery=celery --concurrency:celery=2 --prefetch-multiplier:celery=4 \
    --queues:notify=notify --concurrency:notify=2 --prefetch-multiplier:notify=10 \
    --queues:memory=memory --concurrency:memory=2 --prefetch-multiplier:memory=10 \
    --queues:translate=translate --concurrency:translate=4 --prefetch-multiplier:translate=4 \
    --queues:backup=backup  --concurrency:backup=1 --prefetch-multiplier:backup=2"

# Logging configuration
# - %n will be replaced with the first part of the nodename.
# - %I will be replaced with the current child process index
#   and is important when using the prefork pool to avoid race conditions.
CELERYD_PID_FILE="/run/celery/weblate-%n.pid"
CELERYD_LOG_FILE="/var/log/celery/weblate-%n%I.log"
CELERYD_LOG_LEVEL="INFO"

Konfigurasi tambahan untuk memutar catatan Celery menggunakan logrotate untuk ditempatkan sebagai /etc/logrotate.d/celery:

/var/log/celery/*.log {
        weekly
        missingok
        rotate 12
        compress
        notifempty
}

Tugas berkala menggunakan Celery beat

Weblate dilengkapi dengan pengaturan bawaan untuk tugas terjadwal. Jadwal tugas disimpan dalam basis data dan tugas dieksekusi oleh daemon Celery beat.

Petunjuk

Anda dapat mendefinisikan tugas tambahan di settings.py, misalnya lihat Komit malas.

Memantau status Celery

Anda dapat menemukan panjang antrian tugas Celery saat ini di Antarmuka pengelolaan atau menggunakan celery_queues di baris perintah. Jika antrian terlalu panjang, Anda juga akan mendapatkan galat konfigurasi di antarmuka admin.

Peringatan

Galat Celery secara bawaan hanya dicatat ke dalam catatan Celery dan tidak terlihat oleh pengguna. Jika Anda ingin melihat ikhtisar kegagalan tersebut, disarankan untuk mengkonfigurasikan Mengumpulkan laporan galat dan memantau kinerja.

Pengaturan Celery proses tunggal

Jika memori Anda sangat terbatas, Anda mungkin ingin mengurangi jumlah proses Weblate. Semua tugas Celery dapat dieksekusi dalam satu proses menggunakan:

celery --app=weblate.utils worker --beat --queues=celery,notify,memory,translate,backup --pool=solo

Pemasangan yang menggunakan Docker dapat dikonfiguraskani untuk menggunakan pengaturan Celery proses tunggal dengan mengatur CELERY_SINGLE_PROCESS.

Peringatan

Ini akan memiliki dampak kinerja yang nyata pada Weblate.

Pemantauan Weblate

Weblate menyediakan URL /healthz/ untuk digunakan dalam pemeriksaan kesehatan sederhana, misalnya menggunakan Kubernetes. Kontainer Docker memiliki pemeriksaan kesehatan bawaan menggunakan URL ini.

Untuk memantau metrik Weblate, Anda dapat menggunakan titik akhir API GET /api/metrics/.

Mengumpulkan laporan galat dan memantau kinerja

Weblate, seperti perangkat lunak lainnya, dapat gagal. Untuk mengumpulkan status kegagalan yang bermanfaat, kami sarankan untuk menggunakan layanan pihak ketiga untuk mengumpulkan informasi tersebut. Ini sangat berguna jika terjadi kegagalan tugas Celery, yang jika tidak, hanya akan melaporkan galat ke log dan Anda tidak akan mendapatkan notifikasi. Weblate mendukung layanan berikut:

Surel

Konfigurasi Weblate bawaan menginstrumentasikan Django untuk mengirim surel saat galat server melalui django.utils.log.AdminEmailHandler. Ini adalah pengaturan yang paling mudah, tetapi Anda harus mempertimbangkan opsi lain karena alasan privasi, karena surel galat mungkin berisi data sensitif. Anda dapat membaca lebih lanjut tentang hal itu di Implikasi keamanan.

Untuk menonaktifkan perilaku ini, hapus mail_admins dari LOGGING di pengaturan Weblate, atau nonaktifkan WEBLATE_ADMIN_NOTIFY_ERROR di lingkungan Docker.

Sentry

Weblate memiliki dukungan bawaan untuk Sentry. Untuk menggunakannya, cukup atur SENTRY_DSN di settings.py:

SENTRY_DSN = "https://id@your.sentry.example.com/"

Sentry juga dapat digunakan untuk memantau kinerja Weblate dengan mengumpulkan jejak dan profil untuk persentase operasi yang ditentukan. Hal ini dapat dikonfigurasikan menggunakan SENTRY_TRACES_SAMPLE_RATE dan SENTRY_PROFILES_SAMPLE_RATE.

Google Cloud Error Reporting

Weblate can report handled server errors to Google Cloud Error Reporting. Install Weblate with the google-errors extra and configure GOOGLE_CLOUD_ERROR_REPORTING in settings.py:

GOOGLE_CLOUD_ERROR_REPORTING = {
    "project": "your-google-cloud-project",
}

Weblate automatically reports errors under the weblate service and uses the current Weblate version or Git revision as the reported version. These values can be overridden by setting service or version in GOOGLE_CLOUD_ERROR_REPORTING.

OpenTelemetry

Weblate can export backend traces using OpenTelemetry. It uses OTLP over HTTP and can send traces to an OpenTelemetry Collector or a compatible vendor endpoint.

OPENTELEMETRY_ENABLED = True
OPENTELEMETRY_EXPORTER_OTLP_ENDPOINT = "https://collector.example.com/v1/traces"
OPENTELEMETRY_TRACES_SAMPLE_RATE = 0.1

The integration traces Django requests, Celery tasks, Redis, outgoing HTTP requests, database calls, and Weblate-specific spans. Configure it using OPENTELEMETRY_ENABLED, OPENTELEMETRY_EXPORTER_OTLP_ENDPOINT, and OPENTELEMETRY_TRACES_SAMPLE_RATE.

Rollbar

Weblate memiliki dukungan bawaan untuk Rollbar. Untuk menggunakannya, cukup ikuti petunjuk untuk Rollbar pemberitahu untuk Python.

Singkatnya, Anda perlu menyesuaikan settings.py:

# Add rollbar as last middleware:
MIDDLEWARE = [
    # … other middleware classes …
    "rollbar.contrib.django.middleware.RollbarNotifierMiddleware",
]

# Configure client access
ROLLBAR = {
    "access_token": "POST_SERVER_ITEM_ACCESS_TOKEN",
    "environment": "development" if DEBUG else "production",
    "branch": "main",
    "root": "/absolute/path/to/code/root",
}

Segala sesuatu lainnya terintegrasi secara otomatis, Anda sekarang akan mengumpulkan galat sisi server dan klien.

Catatan

Pencatatan galat juga mencakup pengecualian yang ditangani dengan baik, tetapi mungkin menunjukkan adanya masalah - seperti kegagalan penguraian berkas yang diunggah.

Pengelolaan catatan Graylog

Added in version 5.9.

Weblate dapat dikonfigurasikan untuk melakukan pencatatan menggunakan protokol TCP GELF. Ini dikembangkan untuk integrasi Graylog, tetapi dapat digunakan dengan platform pencatatan apa pun yang kompatibel.

Boilerplate konfigurasi disertakan dalam Contoh konfigurasi, untuk Docker ini dapat dikonfigurasikan menggunakan WEBLATE_LOG_GELF_HOST.

Memigrasikan Weblate ke server lain

Memigrasikan Weblate ke server lain seharusnya cukup mudah, tetapi data disimpan di beberapa lokasi yang perlu Anda migrasikan dengan hati-hati. Pendekatan terbaik adalah menghentikan Weblate untuk migrasi.

Memigrasikan basis data

The most straightforward approach is to use database native tools, as they are usually the most effective (e.g. pg_dump). Alternatively you can use replication if your database supports it.

Lihat juga

Memigrasikan antar basis data dijelaskan dalam Memigrasikan dari basis data lain ke PostgreSQL.

Memigrasikan repositori VCS

Repositori VCS yang disimpan di bawah DATA_DIR juga perlu dimigrasikan. Anda cukup menyalinnya atau menggunakan rsync untuk melakukan migrasi dengan lebih efektif.

Catatan lainnya

Jangan lupa untuk memindahkan layanan lain yang mungkin digunakan Weblate seperti Valkey, Redis, pekerjaan Cron atau backend autentikasi kustom.