mirror of
https://gitea.com/gitea/docs.git
synced 2026-11-07 02:20:31 +00:00
Compare commits
75
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0ddb9a2071 | ||
|
|
71869c6e24 | ||
|
|
46b5401a81 | ||
|
|
f6e17361fe | ||
|
|
c3cff4ab08 | ||
|
|
aa975da532 | ||
|
|
6632d38fe2 | ||
|
|
ef57d8d2c0 | ||
|
|
ba4abd749d | ||
|
|
8197192134 | ||
|
|
97fa45dabc | ||
|
|
ee9e91cdeb | ||
|
|
d301461648 | ||
|
|
4ea46e6315 | ||
|
|
cb424640a2 | ||
|
|
09bb4cabcf | ||
|
|
9699ec2c87 | ||
|
|
c00af83676 | ||
|
|
c9282b96da | ||
|
|
49d912f7fb | ||
|
|
398f418387 | ||
|
|
be6aefc7e8 | ||
|
|
a874918bb7 | ||
|
|
5304217222 | ||
|
|
88356280ec | ||
|
|
c7dc13cf83 | ||
|
|
bed218d62d | ||
|
|
08aff1bae9 | ||
|
|
8cf8f49a95 | ||
|
|
2af7b60fd9 | ||
|
|
db9e6f9f48 | ||
|
|
b555a247e0 | ||
|
|
2275bef3bd | ||
|
|
1408e4890e | ||
|
|
adaae2f859 | ||
|
|
424c481e19 | ||
|
|
ad95b7776c | ||
|
|
f940b0bc9e | ||
|
|
444879b492 | ||
|
|
bc7e2b3caa | ||
|
|
5823b20e70 | ||
|
|
8c2625b846 | ||
|
|
140915b303 | ||
|
|
e4cad3c2e8 | ||
|
|
784c530a5b | ||
|
|
8d7c0701dc | ||
|
|
7219c0e44d | ||
|
|
8d93c189ac | ||
|
|
9fa74b7323 | ||
|
|
4a0ef0480b | ||
|
|
7d9a82df8d | ||
|
|
6934d56056 | ||
|
|
c28356267d | ||
|
|
c3d9115328 | ||
|
|
ba60edbbda | ||
|
|
deb2f068d4 | ||
|
|
309b26b73f | ||
|
|
fd708d28ed | ||
|
|
470f582e97 | ||
|
|
c4caf767ad | ||
|
|
f9124b16db | ||
|
|
b0b0c5090e | ||
|
|
f95a334777 | ||
|
|
c5fdf2eb18 | ||
|
|
8404944fbb | ||
|
|
9f58fd3d28 | ||
|
|
779acd1cb9 | ||
|
|
5db4089ae6 | ||
|
|
f1553bed2f | ||
|
|
77e495f772 | ||
|
|
3d302e72e2 | ||
|
|
1a284521f1 | ||
|
|
42591cadac | ||
|
|
3258717d62 | ||
|
|
9a6d0d90bf |
No files matched your search
@@ -8,7 +8,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-docs:
|
build-docs:
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-26.04
|
||||||
env:
|
env:
|
||||||
NODE_OPTIONS: --max-old-space-size=8192
|
NODE_OPTIONS: --max-old-space-size=8192
|
||||||
# search only appears once the credentials are set, the build falls back
|
# search only appears once the credentials are set, the build falls back
|
||||||
@@ -19,13 +19,13 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
||||||
- uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6
|
- uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6
|
||||||
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
|
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7
|
||||||
with:
|
with:
|
||||||
node-version: 24
|
node-version: 26
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
- name: prepare awesome list
|
- name: prepare awesome list
|
||||||
run: |
|
run: |
|
||||||
make prepare-awesome-latest prepare-awesome\#27 prepare-awesome\#26 prepare-awesome\#25 prepare-awesome\#24 prepare-awesome\#23 prepare-awesome\#22
|
make prepare-awesome-latest prepare-awesome\#27 prepare-awesome\#26 prepare-awesome\#25 prepare-awesome\#24 prepare-awesome\#23 prepare-awesome\#22 prepare-awesome-v28
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
|
|||||||
@@ -16,13 +16,13 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
||||||
- uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6
|
- uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6
|
||||||
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
|
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7
|
||||||
with:
|
with:
|
||||||
node-version: 24
|
node-version: 26
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
- name: prepare awesome list
|
- name: prepare awesome list
|
||||||
run: |
|
run: |
|
||||||
make prepare-awesome-latest prepare-awesome\#27 prepare-awesome\#26 prepare-awesome\#25 prepare-awesome\#24 prepare-awesome\#23 prepare-awesome\#22
|
make prepare-awesome-latest prepare-awesome\#27 prepare-awesome\#26 prepare-awesome\#25 prepare-awesome\#24 prepare-awesome\#23 prepare-awesome\#22 prepare-awesome-v28
|
||||||
|
|
||||||
- name: install dependencies
|
- name: install dependencies
|
||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
@@ -45,7 +45,7 @@ jobs:
|
|||||||
# pull requests from forks do not get the secrets, the build above is
|
# pull requests from forks do not get the secrets, the build above is
|
||||||
# then the only check and the preview is silently skipped
|
# then the only check and the preview is silently skipped
|
||||||
if [ -z "${CLOUDFLARE_API_TOKEN:-}" ] || [ -z "${CLOUDFLARE_ACCOUNT_ID:-}" ]; then
|
if [ -z "${CLOUDFLARE_API_TOKEN:-}" ] || [ -z "${CLOUDFLARE_ACCOUNT_ID:-}" ]; then
|
||||||
echo "no Cloudflare credentials available, skipping the preview deployment"
|
echo "::notice::no Cloudflare credentials available (pull request from a fork?), skipping the preview deployment"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ name: update api spec files
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 */12 * * *' # every 12 hours on the hour
|
- cron: '0 3 * * 1' # every Monday at 03:00
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ sites/*/dist
|
|||||||
sites/*/.astro
|
sites/*/.astro
|
||||||
sites/*/.cache
|
sites/*/.cache
|
||||||
build/
|
build/
|
||||||
.docusaurus/
|
|
||||||
|
|
||||||
# Misc
|
# Misc
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|||||||
@@ -12,20 +12,30 @@ create_dir:
|
|||||||
clone_awesome: create_dir
|
clone_awesome: create_dir
|
||||||
git clone --branch=$(GITEA_AWESOME_BRANCH) $(GITEA_AWESOME_REMOTE) .tmp/upstream-awesome || true
|
git clone --branch=$(GITEA_AWESOME_BRANCH) $(GITEA_AWESOME_REMOTE) .tmp/upstream-awesome || true
|
||||||
|
|
||||||
|
# the contributing guide moved to the gitea repository, the readme of
|
||||||
|
# awesome-gitea still links to it with a relative path
|
||||||
|
AWESOME_CONTRIBUTING_URL := https://github.com/go-gitea/gitea/blob/main/CONTRIBUTING.md
|
||||||
|
FIX_AWESOME_LINKS := sed 's|](contributing.md)|]($(AWESOME_CONTRIBUTING_URL))|'
|
||||||
|
|
||||||
.PHONY: prepare-awesome-latest
|
.PHONY: prepare-awesome-latest
|
||||||
prepare-awesome-latest: clone_awesome
|
prepare-awesome-latest: clone_awesome
|
||||||
cp .tmp/upstream-awesome/README.md docs/awesome.md
|
$(FIX_AWESOME_LINKS) .tmp/upstream-awesome/README.md > docs/awesome.md
|
||||||
|
|
||||||
.PHONY: prepare-awesome\#%
|
.PHONY: prepare-awesome\#%
|
||||||
prepare-awesome\#%:
|
prepare-awesome\#%:
|
||||||
cp .tmp/upstream-awesome/README.md versioned_docs/version-1.$*/awesome.md
|
$(FIX_AWESOME_LINKS) .tmp/upstream-awesome/README.md > versioned_docs/version-1.$*/awesome.md
|
||||||
|
|
||||||
|
# versions numbered without the 1. prefix, like 28
|
||||||
|
.PHONY: prepare-awesome-v%
|
||||||
|
prepare-awesome-v%:
|
||||||
|
$(FIX_AWESOME_LINKS) .tmp/upstream-awesome/README.md > versioned_docs/version-$*/awesome.md
|
||||||
|
|
||||||
.PHONY: install
|
.PHONY: install
|
||||||
install:
|
install:
|
||||||
pnpm install
|
pnpm install
|
||||||
|
|
||||||
.PHONY: prepare-docs
|
.PHONY: prepare-docs
|
||||||
prepare-docs: install prepare-awesome-latest prepare-awesome\#22 prepare-awesome\#23 prepare-awesome\#24 prepare-awesome\#25 prepare-awesome\#26 prepare-awesome\#27
|
prepare-docs: install prepare-awesome-latest prepare-awesome\#22 prepare-awesome\#23 prepare-awesome\#24 prepare-awesome\#25 prepare-awesome\#26 prepare-awesome\#27 prepare-awesome-v28
|
||||||
|
|
||||||
.PHONY: build
|
.PHONY: build
|
||||||
build:
|
build:
|
||||||
@@ -82,7 +92,7 @@ update-runner-docs:
|
|||||||
update-runner-docs-released:
|
update-runner-docs-released:
|
||||||
./update_runner_docs.sh --released
|
./update_runner_docs.sh --released
|
||||||
|
|
||||||
# freezes the current docs or runner tree as a new version, see
|
# freezes the current docs, runner or cli tree as a new version, see
|
||||||
# scripts/cut-version.mjs
|
# scripts/cut-version.mjs
|
||||||
.PHONY: cut-version
|
.PHONY: cut-version
|
||||||
cut-version:
|
cut-version:
|
||||||
|
|||||||
@@ -3,13 +3,14 @@
|
|||||||
The sources of [docs.gitea.com](https://docs.gitea.com), built with
|
The sources of [docs.gitea.com](https://docs.gitea.com), built with
|
||||||
[Astro](https://astro.build) and [Starlight](https://starlight.astro.build).
|
[Astro](https://astro.build) and [Starlight](https://starlight.astro.build).
|
||||||
|
|
||||||
The site covers three products, all served from this repository:
|
The site covers four products, all served from this repository:
|
||||||
|
|
||||||
| Product | Content | Versions | Languages |
|
| Product | Content | Versions | Languages |
|
||||||
| --- | --- | --- | --- |
|
| --- | --- | --- | --- |
|
||||||
| Docs | `docs/`, `versioned_docs/`, `i18n/` | next, 1.27 … 1.22 | English, 简体中文, 繁體中文 |
|
| Docs | `docs/`, `versioned_docs/`, `i18n/` | next, 28, 1.27 … 1.22 | English, 简体中文, 繁體中文 |
|
||||||
| API | `static/swagger-*.json`, `static/openapi3-*.json` | next, 1.27 … 1.22 | English |
|
| API | `static/swagger-*.json`, `static/openapi3-*.json` | next, 28, 1.27 … 1.22 | English |
|
||||||
| Runner | `runner-docs/`, `runner-docs_versioned_docs/` | develop, 3 … 0 | English |
|
| Runner | `runner-docs/`, `runner-docs_versioned_docs/` | develop, 5 … 0 | English |
|
||||||
|
| CLI | `cli-docs/`, `cli-docs_versioned_docs/` | develop | English |
|
||||||
|
|
||||||
The enterprise documentation is built and deployed from its own repository and
|
The enterprise documentation is built and deployed from its own repository and
|
||||||
reached through `/enterprise/`, which a Cloudflare worker maintained elsewhere
|
reached through `/enterprise/`, which a Cloudflare worker maintained elsewhere
|
||||||
@@ -52,7 +53,8 @@ group from the `_category_.json` of its directory.
|
|||||||
|
|
||||||
```shell
|
```shell
|
||||||
make cut-version PRODUCT=docs VERSION=1.28
|
make cut-version PRODUCT=docs VERSION=1.28
|
||||||
make cut-version PRODUCT=runner VERSION=4
|
make cut-version PRODUCT=runner VERSION=6
|
||||||
|
make cut-version PRODUCT=cli VERSION=0.1
|
||||||
```
|
```
|
||||||
|
|
||||||
This freezes the current tree, its translations and its sidebar. The label of
|
This freezes the current tree, its translations and its sidebar. The label of
|
||||||
@@ -79,7 +81,7 @@ make update-api-docs-latest # refresh only the documents of gitea main
|
|||||||
```
|
```
|
||||||
|
|
||||||
The documents of gitea main are refreshed automatically: the `update api spec
|
The documents of gitea main are refreshed automatically: the `update api spec
|
||||||
files` workflow runs every 12 hours and opens a pull request whenever gitea main
|
files` workflow runs weekly and opens a pull request whenever gitea main
|
||||||
changed. Released versions are updated by hand when a new gitea version is
|
changed. Released versions are updated by hand when a new gitea version is
|
||||||
documented.
|
documented.
|
||||||
|
|
||||||
@@ -88,8 +90,8 @@ documented.
|
|||||||
| Version | Content | URL |
|
| Version | Content | URL |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| develop | `runner-docs/` | `/runner/develop/` |
|
| develop | `runner-docs/` | `/runner/develop/` |
|
||||||
| current series | `runner-docs_versioned_docs/version-3/` | `/runner/` |
|
| current series | `runner-docs_versioned_docs/version-5/` | `/runner/` |
|
||||||
| older series | `runner-docs_versioned_docs/version-2/` | `/runner/2/` |
|
| older series | `runner-docs_versioned_docs/version-4/` | `/runner/4/` |
|
||||||
|
|
||||||
A version directory covers a whole release series (`version-3` documents every
|
A version directory covers a whole release series (`version-3` documents every
|
||||||
`3.x` release), so a patch release only needs a content update, not a new
|
`3.x` release), so a patch release only needs a content update, not a new
|
||||||
@@ -101,7 +103,8 @@ Its sidebar is written by hand: `runner-sidebars.js` for develop, and
|
|||||||
version.
|
version.
|
||||||
|
|
||||||
The pages under `reference/` are generated from the runner sources — the command
|
The pages under `reference/` are generated from the runner sources — the command
|
||||||
line reference from `--help`, the example configuration from `generate-config`:
|
line reference from `--help`, the example configuration from `config generate`
|
||||||
|
(`generate-config` before 3.1):
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
make update-runner-docs # develop docs, from the main branch of gitea/runner
|
make update-runner-docs # develop docs, from the main branch of gitea/runner
|
||||||
@@ -114,6 +117,16 @@ workflow runs weekly and opens a pull request whenever the runner's CLI or
|
|||||||
example configuration changed. Generating them needs Go, since the script builds
|
example configuration changed. Generating them needs Go, since the script builds
|
||||||
the runner binary.
|
the runner binary.
|
||||||
|
|
||||||
|
## CLI docs
|
||||||
|
|
||||||
|
The documentation of `gt`, the Gitea CLI from
|
||||||
|
[gitea/cli](https://gitea.com/gitea/cli), is laid out like the runner docs, with
|
||||||
|
its sidebar in `cli-sidebars.js`. No series is documented yet, so `cli-docs/` is
|
||||||
|
served at `/cli/`. Once a release exists, cut its series and list it in
|
||||||
|
`cliSeries` in `packages/content-loader/src/products.ts`, which moves the develop
|
||||||
|
docs to `/cli/develop/`. The guides leave the flags of each command to
|
||||||
|
`gt <command> --help`.
|
||||||
|
|
||||||
## Deployment
|
## Deployment
|
||||||
|
|
||||||
`main` is built and published by the `Build and Publish Docs site` workflow, to
|
`main` is built and published by the `Build and Publish Docs site` workflow, to
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# Logging in
|
||||||
|
|
||||||
|
On a terminal, `gt auth login` asks for the instance and how to log in. gt never asks for
|
||||||
|
your password.
|
||||||
|
|
||||||
|
## OAuth in a browser
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gt auth login --host https://gitea.example.com --oauth
|
||||||
|
```
|
||||||
|
|
||||||
|
gt opens the instance's authorization page, so single sign-on and two-factor
|
||||||
|
authentication work as on the web. The browser has to run on the same machine as gt.
|
||||||
|
`--scopes` limits the token to fewer [scopes](/development/oauth2-provider#scopes); gt
|
||||||
|
refreshes OAuth tokens on its own.
|
||||||
|
|
||||||
|
## Access token
|
||||||
|
|
||||||
|
Create a token under **Settings > Applications** on the instance and pass it on stdin:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gt auth login --host https://gitea.example.com --with-token < token.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
The token needs `read:user`, and the scopes of what you do with gt, such as
|
||||||
|
`write:repository` and `write:issue` for working on pull requests.
|
||||||
|
|
||||||
|
## SSH key
|
||||||
|
|
||||||
|
gt can sign its requests with an SSH key registered for your account instead of using a
|
||||||
|
token:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gt auth login --host https://gitea.example.com --ssh-key ~/.ssh/id_ed25519
|
||||||
|
```
|
||||||
|
|
||||||
|
## Accounts
|
||||||
|
|
||||||
|
Tokens go to the system keyring, or with `--credential-store file` to gt's configuration
|
||||||
|
directory on machines without one. Run `gt auth login` once per instance and account.
|
||||||
|
gt picks the instance from the repository's remote or `--host`, and the account with
|
||||||
|
`gt auth switch` or `--user`. `gt auth status` lists your accounts and `gt auth logout`
|
||||||
|
removes one.
|
||||||
|
|
||||||
|
For instances behind an access proxy, `--header` and `--client-cert` add headers and a
|
||||||
|
client certificate.
|
||||||
|
|
||||||
|
## Git over HTTPS
|
||||||
|
|
||||||
|
`gt auth setup-git` lets `git push` and `git fetch` over HTTPS use gt's login. gt's own
|
||||||
|
clone and checkout commands need no setup.
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 4
|
||||||
|
---
|
||||||
|
|
||||||
|
# Using gt in CI
|
||||||
|
|
||||||
|
Give gt a token and an instance through the environment, and turn prompts off:
|
||||||
|
|
||||||
|
| Variable | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| `GITEA_TOKEN` | Access token; gt never stores it |
|
||||||
|
| `GITEA_CLI_HOST` or `GITEA_INSTANCE_URL` | URL of the instance |
|
||||||
|
| `GITEA_CLI_REPO` | Repository, like `--repo` |
|
||||||
|
|
||||||
|
`--no-input` makes a command fail instead of prompting, and `--yes` confirms changes in
|
||||||
|
advance.
|
||||||
|
|
||||||
|
## Gitea Actions
|
||||||
|
|
||||||
|
Gitea does not allow secret names that start with `GITEA_`, so store the token as, for
|
||||||
|
example, `GT_TOKEN`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
staging:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: ${{ secrets.GT_TOKEN }}
|
||||||
|
GITEA_CLI_HOST: ${{ gitea.server_url }}
|
||||||
|
GITEA_CLI_REPO: ${{ gitea.repository }}
|
||||||
|
steps:
|
||||||
|
- run: curl -fsSL https://gitea.com/gitea/cli/raw/branch/main/scripts/install.sh | sh
|
||||||
|
- run: gt workflow run deploy.yml --ref main --field env=staging --no-input
|
||||||
|
```
|
||||||
|
|
||||||
|
`gt run watch` and `gt pr checks --watch` wait for runs and checks and fail when one fails.
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 1
|
||||||
|
slug: /
|
||||||
|
---
|
||||||
|
|
||||||
|
# Gitea CLI
|
||||||
|
|
||||||
|
[gt](https://gitea.com/gitea/cli) is the official command line client for Gitea. It works
|
||||||
|
with repositories, issues, pull requests, releases, Actions and the other resources of a
|
||||||
|
Gitea instance, from a terminal or a script.
|
||||||
|
|
||||||
|
:::info Development version
|
||||||
|
These pages describe builds from the `main` branch, published as `nightly` binaries and images.
|
||||||
|
:::
|
||||||
|
|
||||||
|
gt needs Gitea 28 or later, and Git for the commands that clone, check out or push.
|
||||||
|
|
||||||
|
## Getting started
|
||||||
|
|
||||||
|
1. [Install gt](installation.md).
|
||||||
|
2. [Log in](authentication.md):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gt auth login
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Run commands in a clone of a repository on that instance, or select one with `--repo`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gt issue list --label bug
|
||||||
|
gt pr checkout 13
|
||||||
|
gt issue view 42 --repo gitea.com/gitea/cli
|
||||||
|
```
|
||||||
|
|
||||||
|
`gt doctor` checks your setup and suggests a fix for each problem it finds.
|
||||||
|
|
||||||
|
`gt <command> --help` lists the flags of a command, and `gt help environment` the global
|
||||||
|
flags and environment variables.
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 2
|
||||||
|
---
|
||||||
|
|
||||||
|
# Installation
|
||||||
|
|
||||||
|
gt is a single binary for Linux, macOS, Windows and FreeBSD.
|
||||||
|
|
||||||
|
## Install script
|
||||||
|
|
||||||
|
The install script downloads gt from [dl.gitea.com](https://dl.gitea.com/gitea-cli/),
|
||||||
|
verifies its checksum and installs it.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Linux, macOS, FreeBSD
|
||||||
|
curl -fsSL https://gitea.com/gitea/cli/raw/branch/main/scripts/install.sh | sh
|
||||||
|
```
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# Windows
|
||||||
|
irm https://gitea.com/gitea/cli/raw/branch/main/scripts/install.ps1 | iex
|
||||||
|
```
|
||||||
|
|
||||||
|
Set `GITEA_CLI_VERSION` to install a specific version, or `nightly` for the latest build
|
||||||
|
of `main`.
|
||||||
|
|
||||||
|
## Other ways
|
||||||
|
|
||||||
|
- **Binaries:** download them from [dl.gitea.com/gitea-cli](https://dl.gitea.com/gitea-cli/).
|
||||||
|
- **Docker:** the [`gitea/gitea-cli`](https://hub.docker.com/r/gitea/gitea-cli) image runs
|
||||||
|
`gt` as its entry point.
|
||||||
|
- **Go:** `go install gitea.dev/cli/cmd/gt@latest`
|
||||||
|
|
||||||
|
## Shell completion and man pages
|
||||||
|
|
||||||
|
`gt completion <shell>` prints the completion script for bash, zsh, fish or PowerShell;
|
||||||
|
`gt completion <shell> --help` shows how to load it. `gt man` prints the manual.
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
# Output and scripting
|
||||||
|
|
||||||
|
Scripts should read JSON: the text output is meant for people and may change.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gt pr view 123 --json number,title,state
|
||||||
|
gt issue list --json number,title --jq '.[] | "\(.number)\t\(.title)"'
|
||||||
|
```
|
||||||
|
|
||||||
|
`--json` prints all fields or the ones you list; the **JSON FIELDS** section of a command's
|
||||||
|
`--help` names them. `--jq` filters the result without needing jq installed. Piped lists
|
||||||
|
print as tab-separated values.
|
||||||
|
|
||||||
|
gt exits with 0 on success, 1 when a command fails, 2 on a usage error and 4 when
|
||||||
|
authentication is missing or rejected; `gt help exit-codes` lists all codes.
|
||||||
|
|
||||||
|
`gt api` calls any API endpoint with gt's login, and `gt alias set` defines shortcuts for
|
||||||
|
commands you use often.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
// Sidebar of the gt (Gitea CLI) documentation (develop version).
|
||||||
|
// Released versions carry their own copy in
|
||||||
|
// cli-docs_versioned_sidebars/version-<version>-sidebars.json.
|
||||||
|
module.exports = {
|
||||||
|
cli: [
|
||||||
|
{
|
||||||
|
type: 'doc',
|
||||||
|
id: 'index',
|
||||||
|
label: 'What is gt?',
|
||||||
|
},
|
||||||
|
'installation',
|
||||||
|
'authentication',
|
||||||
|
'ci',
|
||||||
|
'scripting',
|
||||||
|
],
|
||||||
|
};
|
||||||
+2
-2
@@ -2,8 +2,8 @@
|
|||||||
# is copied into the build output by the publish workflow, so that it is not
|
# is copied into the build output by the publish workflow, so that it is not
|
||||||
# uploaded to S3/CloudFront where it would be publicly readable at /_headers.
|
# uploaded to S3/CloudFront where it would be publicly readable at /_headers.
|
||||||
#
|
#
|
||||||
# Unlike the docusaurus build, astro emits a single content hashed asset
|
# The build emits a single content hashed asset directory shared by every
|
||||||
# directory shared by every language, so no per locale rules are needed.
|
# language, so no per locale rules are needed.
|
||||||
|
|
||||||
# Content hashed build output (js, css, fonts). The file name changes with the
|
# Content hashed build output (js, css, fonts). The file name changes with the
|
||||||
# content, so these can be cached forever.
|
# content, so these can be cached forever.
|
||||||
|
|||||||
@@ -1,17 +1,19 @@
|
|||||||
# Redirects for legacy URLs and routes the site no longer serves directly.
|
# Redirects for legacy URLs and routes the site no longer serves directly.
|
||||||
|
|
||||||
# The api reference and the runner docs are separate products, published in
|
# The api reference, the runner and the cli docs are separate products,
|
||||||
# english only. Docusaurus served an empty localized copy of them.
|
# published in english only, so they have no localized copy.
|
||||||
/zh-cn/api/* /api/:splat 301
|
/zh-cn/api/* /api/:splat 301
|
||||||
/zh-tw/api/* /api/:splat 301
|
/zh-tw/api/* /api/:splat 301
|
||||||
/zh-cn/runner/* /runner/:splat 301
|
/zh-cn/runner/* /runner/:splat 301
|
||||||
/zh-tw/runner/* /runner/:splat 301
|
/zh-tw/runner/* /runner/:splat 301
|
||||||
|
/zh-cn/cli/* /cli/:splat 301
|
||||||
|
/zh-tw/cli/* /cli/:splat 301
|
||||||
|
|
||||||
# The version served at the root of a product is also reachable under its
|
# The version served at the root of a product is also reachable under its
|
||||||
# number, which is what the release notes and old links use.
|
# number, which is what the release notes and old links use.
|
||||||
/api/1.27/* /api/:splat 301
|
/api/28/* /api/:splat 301
|
||||||
/runner/3/* /runner/:splat 301
|
/runner/3/* /runner/:splat 301
|
||||||
/1.27/* /:splat 301
|
/28/* /:splat 301
|
||||||
|
|
||||||
# The local search plugin had a results page of its own, algolia docsearch is a
|
# The local search plugin had a results page of its own, algolia docsearch is a
|
||||||
# modal opened from any page.
|
# modal opened from any page.
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
"https://docs.gitea.com/zh-cn/",
|
"https://docs.gitea.com/zh-cn/",
|
||||||
"https://docs.gitea.com/zh-tw/",
|
"https://docs.gitea.com/zh-tw/",
|
||||||
"https://docs.gitea.com/runner/",
|
"https://docs.gitea.com/runner/",
|
||||||
|
"https://docs.gitea.com/cli/",
|
||||||
"https://docs.gitea.com/api/",
|
"https://docs.gitea.com/api/",
|
||||||
"https://docs.gitea.com/enterprise/"
|
"https://docs.gitea.com/enterprise/"
|
||||||
],
|
],
|
||||||
@@ -15,7 +16,8 @@
|
|||||||
"https://docs.gitea.com/1.2*/**",
|
"https://docs.gitea.com/1.2*/**",
|
||||||
"https://docs.gitea.com/*/1.2*/**",
|
"https://docs.gitea.com/*/1.2*/**",
|
||||||
"https://docs.gitea.com/api/1.2*/**",
|
"https://docs.gitea.com/api/1.2*/**",
|
||||||
"https://docs.gitea.com/runner/[0-9]/**"
|
"https://docs.gitea.com/runner/[0-9]/**",
|
||||||
|
"https://docs.gitea.com/cli/[0-9]*/**"
|
||||||
],
|
],
|
||||||
"selectors": {
|
"selectors": {
|
||||||
"lvl0": { "selector": "//nav[contains(@aria-labelledby,'starlight__sidebar')]//a[@aria-current='page']/ancestor::details//summary//span", "type": "xpath", "global": true, "default_value": "Documentation" },
|
"lvl0": { "selector": "//nav[contains(@aria-labelledby,'starlight__sidebar')]//a[@aria-current='page']/ancestor::details//summary//span", "type": "xpath", "global": true, "default_value": "Documentation" },
|
||||||
|
|||||||
@@ -0,0 +1,153 @@
|
|||||||
|
---
|
||||||
|
date: "2026-09-12T00:00:00+00:00"
|
||||||
|
slug: "audit-logging"
|
||||||
|
sidebar_position: 41
|
||||||
|
aliases:
|
||||||
|
- /en-us/audit-logging
|
||||||
|
---
|
||||||
|
|
||||||
|
# Audit Logging
|
||||||
|
|
||||||
|
Gitea can record security-relevant events as structured audit records: each
|
||||||
|
event has an `action`, `actor`, `scope`, `origin`, `message` and a JSON
|
||||||
|
`metadata` blob. Recording is **off by default** and does not change request
|
||||||
|
behavior when it is disabled.
|
||||||
|
|
||||||
|
This is separate from the application, router and access logs described in
|
||||||
|
[Logging Configuration](logging-config.md). Those logs are for operations and
|
||||||
|
debugging. The audit log is a durable trail of who changed what.
|
||||||
|
|
||||||
|
## Enable recording
|
||||||
|
|
||||||
|
Set `[audit].RECORD_OUTPUT` to `database` in `app.ini` and restart Gitea:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[audit]
|
||||||
|
RECORD_OUTPUT = database
|
||||||
|
RETENTION_DAYS = 30
|
||||||
|
```
|
||||||
|
|
||||||
|
Invalid values of `RECORD_OUTPUT` fall back to `disabled`. See the
|
||||||
|
[configuration cheat sheet](config-cheat-sheet.md#audit-audit) for every option.
|
||||||
|
|
||||||
|
With Docker, the same settings can be applied as
|
||||||
|
`GITEA__audit__RECORD_OUTPUT=database` and `GITEA__audit__RETENTION_DAYS=30`
|
||||||
|
before Gitea writes them into `app.ini`.
|
||||||
|
|
||||||
|
## View events
|
||||||
|
|
||||||
|
The Audit Log pages are always available and still list any events that were
|
||||||
|
stored earlier. When recording is disabled, the site administration page also
|
||||||
|
shows a warning.
|
||||||
|
|
||||||
|
| Audience | Location | Events shown |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Site administrators | Site administration → Monitoring → Audit Log (`/-/admin/monitor/audit_logs`) | Every event |
|
||||||
|
| Signed-in users | User settings → Audit Log (`/user/settings/audit_logs`) | Events scoped to that user |
|
||||||
|
| Organization owners | Organization settings → Audit Log (`/<org>/settings/audit_logs`) | Events scoped to that organization |
|
||||||
|
| Repository administrators | Repository settings → Audit Log (`/<owner>/<repo>/settings/audit_logs`) | Events scoped to that repository |
|
||||||
|
|
||||||
|
Each listing can be filtered by actor (username), action and origin, and sorted
|
||||||
|
by timestamp. The actor filter does not match the
|
||||||
|
[system actors](#actors-and-origins). Action filters accept an exact action or
|
||||||
|
a family prefix such as `user:impersonation` or `repository:webhook`.
|
||||||
|
|
||||||
|
Site administrators can download the current filtered result as JSONL
|
||||||
|
(newline-delimited JSON) from **Export JSONL**. The file name is
|
||||||
|
`gitea-audit-log-<timestamp>.jsonl`.
|
||||||
|
|
||||||
|
## Event shape
|
||||||
|
|
||||||
|
A recorded event contains:
|
||||||
|
|
||||||
|
- **Action**: a stable, colon-separated identifier such as `repository:archive`
|
||||||
|
or `user:accesstoken:add`.
|
||||||
|
- **Actor**: the user who performed the action. Actions taken while impersonating
|
||||||
|
a user record both the impersonator and the impersonated user.
|
||||||
|
- **Actor credential**: when the request authenticated with a named credential,
|
||||||
|
the event stores its kind and id, never the secret. Typical values:
|
||||||
|
`access-token:<id>`, `oauth2-grant:<id>`, `gitea-actions:<task id>`,
|
||||||
|
`deploy-key:<key id>`.
|
||||||
|
- **Scope**: the affected unit — `user`, `organization`, `repository` or
|
||||||
|
`system` (instance-wide).
|
||||||
|
- **Origin**: how the action was initiated — `ui`, `api`, `cli` or `system`.
|
||||||
|
- **Message**: a human-readable sentence rendered from a per-action template.
|
||||||
|
- **Metadata**: extra fields that fill the message template (token name, new
|
||||||
|
visibility, and so on). Secrets and token values are not stored.
|
||||||
|
- **IP address**: the client address of the request, when one exists. Events
|
||||||
|
triggered by a git push record the SSH client address for SSH pushes and
|
||||||
|
`127.0.0.1` for HTTP pushes.
|
||||||
|
- **Timestamp**: when the event was recorded.
|
||||||
|
|
||||||
|
An exported JSONL line looks like:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{"action":"repository:archive","actor":{"type":"user","id":1,"name":"alice"},"scope":{"type":"repository","id":42,"name":"org/repo"},"message":"Archived repository org/repo.","time":"2026-09-12T11:00:00Z","ip_address":"203.0.113.10","origin":"ui"}
|
||||||
|
```
|
||||||
|
|
||||||
|
The `system:startup` message is kept stable across Gitea versions so operators
|
||||||
|
can parse it: `System started [Gitea {version}]`.
|
||||||
|
|
||||||
|
## Actors and origins
|
||||||
|
|
||||||
|
Most web and API requests pick up the signed-in user automatically.
|
||||||
|
|
||||||
|
Other entry points record a system actor:
|
||||||
|
|
||||||
|
- `gitea:cli` for `gitea admin` commands and the `system:startup` and
|
||||||
|
`system:shutdown` events
|
||||||
|
- `gitea:auth-source` for authentication-source syncs and for users an
|
||||||
|
authentication source creates or updates at sign-in
|
||||||
|
- `gitea-actions` for Gitea Actions tasks
|
||||||
|
- `gitea:deploy-key` for pushes with a deploy key
|
||||||
|
- `(Cron)` for scheduled cron tasks
|
||||||
|
- `Unknown` when no actor can be resolved
|
||||||
|
|
||||||
|
Events of the `gitea:cli` actor use origin `cli`. Cron tasks, git hooks and
|
||||||
|
other background work use origin `system`.
|
||||||
|
|
||||||
|
## What is recorded
|
||||||
|
|
||||||
|
Events cover security-relevant changes, grouped by action family:
|
||||||
|
|
||||||
|
- **User**: create and delete, admin, restricted and active status, name,
|
||||||
|
password and password reset requests, visibility, emails, authentication
|
||||||
|
source, 2FA, WebAuthn, OpenID, external logins, access tokens, OAuth2
|
||||||
|
applications and grants, SSH/GPG/principal keys, secrets, webhooks,
|
||||||
|
impersonation, failed two-factor authentication
|
||||||
|
- **Organization**: create and delete, name, visibility, members, teams,
|
||||||
|
OAuth2 applications, secrets, webhooks
|
||||||
|
- **Repository**: create, fork, archive, delete, rename, visibility, transfer,
|
||||||
|
mirrors, signing verification, collaborators and teams, default branch,
|
||||||
|
branch and tag protection, deploy keys, webhooks, secrets
|
||||||
|
- **Issues and pull requests**: create, delete, comments and merges
|
||||||
|
- **Projects and wiki pages**: create, update and delete
|
||||||
|
- **Actions**: enable, disable and dispatch a workflow
|
||||||
|
- **System**: startup and shutdown, instance-wide webhooks, authentication
|
||||||
|
sources, instance-wide OAuth2 applications
|
||||||
|
|
||||||
|
Recording never fails the request that triggered it. A write error is logged
|
||||||
|
and the original operation continues.
|
||||||
|
|
||||||
|
## What is not recorded
|
||||||
|
|
||||||
|
- Read-only access such as browsing, clone, fetch or API GET requests
|
||||||
|
- Logins, successful or failed, other than failed two-factor authentication
|
||||||
|
(use the [access log](logging-config.md) and
|
||||||
|
[Fail2ban Setup](fail2ban-setup.md) for authentication traffic)
|
||||||
|
- Edits to issues and pull requests
|
||||||
|
- Token or secret values
|
||||||
|
- Which SSH key a real user pushed with (deploy keys are named; ordinary SSH
|
||||||
|
user pushes are not)
|
||||||
|
|
||||||
|
## Retention
|
||||||
|
|
||||||
|
`RETENTION_DAYS` (default **30**) is the age after which recorded events are
|
||||||
|
eligible for deletion. Set it to `0` to keep events forever.
|
||||||
|
|
||||||
|
Cleanup is performed by the `cron.delete_old_audit_events` task (`SCHEDULE`
|
||||||
|
defaults to `@every 24h`, `OLDER_THAN` defaults to `[audit].RETENTION_DAYS`).
|
||||||
|
The task is registered only while `RECORD_OUTPUT` records events **and**
|
||||||
|
`RETENTION_DAYS` is greater than `0`. Turning recording off therefore also
|
||||||
|
stops pruning; existing rows stay until you delete them or turn recording back
|
||||||
|
on.
|
||||||
@@ -337,9 +337,13 @@ The default login user email is `X-WEBAUTH-EMAIL`, you can change it via changin
|
|||||||
|
|
||||||
If set `ENABLE_REVERSE_PROXY_FULL_NAME=true`, a user full name expected in `X-WEBAUTH-FULLNAME` will be assigned to the user when auto creating the user. You can also change the header name with `REVERSE_PROXY_AUTHENTICATION_FULL_NAME`.
|
If set `ENABLE_REVERSE_PROXY_FULL_NAME=true`, a user full name expected in `X-WEBAUTH-FULLNAME` will be assigned to the user when auto creating the user. You can also change the header name with `REVERSE_PROXY_AUTHENTICATION_FULL_NAME`.
|
||||||
|
|
||||||
You can also limit the reverse proxy's IP address range with `REVERSE_PROXY_TRUSTED_PROXIES` which default value is `127.0.0.0/8,::1/128`. By `REVERSE_PROXY_LIMIT`, you can limit trusted proxies level.
|
It applies to the web interface, Git over HTTP, Git LFS and the package registry.
|
||||||
|
|
||||||
You can enable the this authentication method for the API with
|
:::warning
|
||||||
|
Gitea trusts these headers on every request it receives. Make sure Gitea is only reachable through your authenticating proxy, and that the proxy sets or removes these headers on every request, including on paths you exempt from authentication, for example for Git or package clients. `REVERSE_PROXY_TRUSTED_PROXIES` does not restrict them.
|
||||||
|
:::
|
||||||
|
|
||||||
|
To also accept them on the REST API under `/api/v1`, enable:
|
||||||
|
|
||||||
```ini
|
```ini
|
||||||
[service]
|
[service]
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ cd gitea-dump-1610949662
|
|||||||
mv app.ini /etc/gitea/conf/app.ini
|
mv app.ini /etc/gitea/conf/app.ini
|
||||||
mv data/* /var/lib/gitea/data/
|
mv data/* /var/lib/gitea/data/
|
||||||
mv log/* /var/lib/gitea/log/
|
mv log/* /var/lib/gitea/log/
|
||||||
mv repos/* /var/lib/gitea/data/repositories/
|
mv repos/* /var/lib/gitea/data/gitea-repositories/
|
||||||
chown -R gitea:gitea /etc/gitea/conf/app.ini /var/lib/gitea
|
chown -R gitea:gitea /etc/gitea/conf/app.ini /var/lib/gitea
|
||||||
|
|
||||||
# mysql
|
# mysql
|
||||||
|
|||||||
@@ -130,8 +130,8 @@ In addition, there is _`StaticRootPath`_ which can be set as a built-in at build
|
|||||||
HTTP protocol.
|
HTTP protocol.
|
||||||
- `USE_COMPAT_SSH_URI`: **false**: Force ssh:// clone url instead of scp-style uri when
|
- `USE_COMPAT_SSH_URI`: **false**: Force ssh:// clone url instead of scp-style uri when
|
||||||
default SSH port is used.
|
default SSH port is used.
|
||||||
- `GO_GET_CLONE_URL_PROTOCOL`: **https**: Value for the "go get" request returns the repository url as https or ssh
|
- `GO_GET_CLONE_URL_PROTOCOL`: **_empty_**: Scheme of the returned URL for the "go get" response.
|
||||||
default is https.
|
Default is "https" if DISABLE_HTTP_GIT=false or SSH is disabled, otherwise "ssh".
|
||||||
- `ACCESS_CONTROL_ALLOW_ORIGIN`: **_empty_**: Value for Access-Control-Allow-Origin header,
|
- `ACCESS_CONTROL_ALLOW_ORIGIN`: **_empty_**: Value for Access-Control-Allow-Origin header,
|
||||||
default is not to present.
|
default is not to present.
|
||||||
|
|
||||||
@@ -179,7 +179,7 @@ In addition, there is _`StaticRootPath`_ which can be set as a built-in at build
|
|||||||
- `POPULATE_SQUASH_COMMENT_WITH_COMMIT_MESSAGES`: **false**: In default squash-merge messages include the commit message of all commits comprising the pull request.
|
- `POPULATE_SQUASH_COMMENT_WITH_COMMIT_MESSAGES`: **false**: In default squash-merge messages include the commit message of all commits comprising the pull request.
|
||||||
- `ADD_CO_COMMITTER_TRAILERS`: **true**: Add co-authored-by and co-committed-by trailers to merge commit messages if committer does not match author.
|
- `ADD_CO_COMMITTER_TRAILERS`: **true**: Add co-authored-by and co-committed-by trailers to merge commit messages if committer does not match author.
|
||||||
- `RETARGET_CHILDREN_ON_MERGE`: **true**: Retarget child pull requests to the parent pull request branch target on merge of parent pull request. It only works on merged PRs where the head and base branch target the same repo.
|
- `RETARGET_CHILDREN_ON_MERGE`: **true**: Retarget child pull requests to the parent pull request branch target on merge of parent pull request. It only works on merged PRs where the head and base branch target the same repo.
|
||||||
- `DEFAULT_DELETE_BRANCH_AFTER_MERGE`: **false**: Set the default value for "Delete pull request branch after merge by default" for new repositories.
|
- `DEFAULT_DELETE_BRANCH_AFTER_MERGE`: **true**: Set the default value for "Delete pull request branch after merge by default" for new repositories.
|
||||||
- `DEFAULT_TITLE_SOURCE`: **auto**: Default source for the pull request title when opening a new PR. Valid options:
|
- `DEFAULT_TITLE_SOURCE`: **auto**: Default source for the pull request title when opening a new PR. Valid options:
|
||||||
- `first-commit`: Uses the oldest commit's summary as the title. If there are multiple commits, still uses the first commit's message.
|
- `first-commit`: Uses the oldest commit's summary as the title. If there are multiple commits, still uses the first commit's message.
|
||||||
- `auto`: Uses the commit's summary when the PR contains a single commit; when there are multiple commits, converts the branch name into a human-readable title by normalizing separators and casing.
|
- `auto`: Uses the commit's summary when the PR contains a single commit; when there are multiple commits, converts the branch name into a human-readable title by normalizing separators and casing.
|
||||||
@@ -270,9 +270,10 @@ The following configuration set `Content-Type: application/vnd.android.package-a
|
|||||||
- `FOLDER_ICON_THEME`: **basic**: The icon theme for folders (basic/material).
|
- `FOLDER_ICON_THEME`: **basic**: The icon theme for folders (basic/material).
|
||||||
- `MAX_DISPLAY_FILE_SIZE`: **8388608**: Max size of files to be displayed (default is 8MiB)
|
- `MAX_DISPLAY_FILE_SIZE`: **8388608**: Max size of files to be displayed (default is 8MiB)
|
||||||
- `AMBIGUOUS_UNICODE_DETECTION`: **true**: Detect ambiguous unicode characters in file contents and show warnings on the UI
|
- `AMBIGUOUS_UNICODE_DETECTION`: **true**: Detect ambiguous unicode characters in file contents and show warnings on the UI
|
||||||
- `REACTIONS`: All available reactions users can choose on issues/prs and comments
|
- `REACTIONS`: All available reactions users can choose on issues, pull requests and comments.
|
||||||
Values can be emoji alias (:smile:) or a unicode emoji.
|
Values can be emoji alias (:smile:) or a unicode emoji.
|
||||||
For custom reactions, add a tightly cropped square image to public/assets/img/emoji/reaction_name.png
|
For custom reactions, add a tightly cropped square image to public/assets/img/emoji/reaction_name.png
|
||||||
|
- `RELEASE_REACTIONS`: **+1, laugh, hooray, heart, rocket, eyes**: Reactions available for releases, in the same format as `REACTIONS`.
|
||||||
- `REACTION_MAX_USER_NUM`: **10**: Change the number of users that are displayed in reactions tooltip (triggered by mouse hover).
|
- `REACTION_MAX_USER_NUM`: **10**: Change the number of users that are displayed in reactions tooltip (triggered by mouse hover).
|
||||||
- `CUSTOM_EMOJIS`: **gitea, codeberg, gitlab, git, github, gogs**: Additional Emojis not defined in the utf8 standard.
|
- `CUSTOM_EMOJIS`: **gitea, codeberg, gitlab, git, github, gogs**: Additional Emojis not defined in the utf8 standard.
|
||||||
By default, we support Gitea (:gitea:), to add more copy them to public/assets/img/emoji/emoji_name.png and
|
By default, we support Gitea (:gitea:), to add more copy them to public/assets/img/emoji/emoji_name.png and
|
||||||
@@ -348,8 +349,7 @@ The following configuration set `Content-Type: application/vnd.android.package-a
|
|||||||
- `PROXY_PROTOCOL_TLS_BRIDGING`: **false**: When protocol is https, expect PROXY protocol headers after TLS negotiation.
|
- `PROXY_PROTOCOL_TLS_BRIDGING`: **false**: When protocol is https, expect PROXY protocol headers after TLS negotiation.
|
||||||
- `PROXY_PROTOCOL_HEADER_TIMEOUT`: **5s**: Timeout to wait for PROXY protocol header (set to 0 to have no timeout)
|
- `PROXY_PROTOCOL_HEADER_TIMEOUT`: **5s**: Timeout to wait for PROXY protocol header (set to 0 to have no timeout)
|
||||||
- `PROXY_PROTOCOL_ACCEPT_UNKNOWN`: **false**: Accept PROXY protocol headers with Unknown type.
|
- `PROXY_PROTOCOL_ACCEPT_UNKNOWN`: **false**: Accept PROXY protocol headers with Unknown type.
|
||||||
- `DOMAIN`: **localhost**: Domain name of this server.
|
- `ROOT_URL`: **`{PROTOCOL}://localhost:{HTTP_PORT}/`**:
|
||||||
- `ROOT_URL`: **`{PROTOCOL}://{DOMAIN}:{HTTP_PORT}/`**:
|
|
||||||
Overwrite the automatically generated public URL.
|
Overwrite the automatically generated public URL.
|
||||||
This is useful if the internal and the external URL don't match (e.g. behind a reverse proxy).
|
This is useful if the internal and the external URL don't match (e.g. behind a reverse proxy).
|
||||||
- `PUBLIC_URL_DETECTION`: **`auto`**: Controls how to generate the public URL. Most instances should use the "auto" behavior,
|
- `PUBLIC_URL_DETECTION`: **`auto`**: Controls how to generate the public URL. Most instances should use the "auto" behavior,
|
||||||
@@ -404,7 +404,7 @@ The following configuration set `Content-Type: application/vnd.android.package-a
|
|||||||
If it is set to `(DOER_USERNAME)`, it will use current signed-in user's username.
|
If it is set to `(DOER_USERNAME)`, it will use current signed-in user's username.
|
||||||
This option is only for some advanced users who have configured their SSH reverse-proxy and need to use different usernames for git SSH clone.
|
This option is only for some advanced users who have configured their SSH reverse-proxy and need to use different usernames for git SSH clone.
|
||||||
Most users should just leave it blank and/or modify the `BUILTIN_SSH_SERVER_USER`.
|
Most users should just leave it blank and/or modify the `BUILTIN_SSH_SERVER_USER`.
|
||||||
- `SSH_DOMAIN`: **`{DOMAIN}`**: Domain name of this server, used for displayed clone URL.
|
- `SSH_DOMAIN`: **_empty_**: Domain name to be exposed in clone URL, defaults to the domain part of ROOT_URL
|
||||||
- `SSH_PORT`: **22**: SSH port displayed in clone URL. If you need a different "SSH clone port" from the real "SSH listen port", set the SSH_LISTEN_PORT separately.
|
- `SSH_PORT`: **22**: SSH port displayed in clone URL. If you need a different "SSH clone port" from the real "SSH listen port", set the SSH_LISTEN_PORT separately.
|
||||||
- `SSH_LISTEN_HOST`: **0.0.0.0**: Listen address for the built-in SSH server.
|
- `SSH_LISTEN_HOST`: **0.0.0.0**: Listen address for the built-in SSH server.
|
||||||
- `SSH_LISTEN_PORT`: **`{SSH_PORT}`**: Port for the built-in SSH server.
|
- `SSH_LISTEN_PORT`: **`{SSH_PORT}`**: Port for the built-in SSH server.
|
||||||
@@ -420,7 +420,7 @@ The following configuration set `Content-Type: application/vnd.android.package-a
|
|||||||
- `SSH_SERVER_CIPHERS`: **`chacha20-poly1305@openssh.com`, `aes128-ctr`, `aes192-ctr`, `aes256-ctr`, `aes128-gcm@openssh.com`, `aes256-gcm@openssh.com`**: For the built-in SSH server, choose the ciphers to support for SSH connections, for system SSH this setting has no effect.
|
- `SSH_SERVER_CIPHERS`: **`chacha20-poly1305@openssh.com`, `aes128-ctr`, `aes192-ctr`, `aes256-ctr`, `aes128-gcm@openssh.com`, `aes256-gcm@openssh.com`**: For the built-in SSH server, choose the ciphers to support for SSH connections, for system SSH this setting has no effect.
|
||||||
- `SSH_SERVER_KEY_EXCHANGES`: **curve25519-sha256, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, diffie-hellman-group14-sha256, diffie-hellman-group14-sha1**: For the built-in SSH server, choose the key exchange algorithms to support for SSH connections, for system SSH this setting has no effect.
|
- `SSH_SERVER_KEY_EXCHANGES`: **curve25519-sha256, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, diffie-hellman-group14-sha256, diffie-hellman-group14-sha1**: For the built-in SSH server, choose the key exchange algorithms to support for SSH connections, for system SSH this setting has no effect.
|
||||||
- `SSH_SERVER_MACS`: **`hmac-sha2-256-etm@openssh.com`, `hmac-sha2-256`, `hmac-sha1`**: For the built-in SSH server, choose the MACs to support for SSH connections, for system SSH this setting has no effect
|
- `SSH_SERVER_MACS`: **`hmac-sha2-256-etm@openssh.com`, `hmac-sha2-256`, `hmac-sha1`**: For the built-in SSH server, choose the MACs to support for SSH connections, for system SSH this setting has no effect
|
||||||
- `SSH_SERVER_HOST_KEYS`: **ssh/gitea.rsa, ssh/gogs.rsa**: For the built-in SSH server, choose the keypairs to offer as the host key. The private key should be at `SSH_SERVER_HOST_KEY` and the public `SSH_SERVER_HOST_KEY.pub`. Relative paths are made absolute relative to the `APP_DATA_PATH`. If no key exists a 4096 bit RSA key will be created for you.
|
- `SSH_SERVER_HOST_KEYS`: **ssh/gitea.rsa, ssh/gitea.ed25519, ssh/gitea.ecdsa, ssh/gogs.rsa**: For the built-in SSH server, choose the keypairs to offer as the host key. The private key should be at `SSH_SERVER_HOST_KEY` and the public `SSH_SERVER_HOST_KEY.pub`. Relative paths are made absolute relative to the `APP_DATA_PATH`. If none of the keys exist, a 4096 bit RSA, a 256 bit ECDSA and an ED25519 key will be created for you.
|
||||||
- `SSH_KEY_TEST_PATH`: **/tmp**: Directory to create temporary files in when testing public keys using ssh-keygen, default is the system temporary directory.
|
- `SSH_KEY_TEST_PATH`: **/tmp**: Directory to create temporary files in when testing public keys using ssh-keygen, default is the system temporary directory.
|
||||||
- `SSH_KEYGEN_PATH`: **_empty_**: Use `ssh-keygen` to parse public SSH keys. The value is passed to the shell. By default, Gitea does the parsing itself.
|
- `SSH_KEYGEN_PATH`: **_empty_**: Use `ssh-keygen` to parse public SSH keys. The value is passed to the shell. By default, Gitea does the parsing itself.
|
||||||
- `SSH_EXPOSE_ANONYMOUS`: **false**: Enable exposure of SSH clone URL to anonymous visitors, default is false.
|
- `SSH_EXPOSE_ANONYMOUS`: **false**: Enable exposure of SSH clone URL to anonymous visitors, default is false.
|
||||||
@@ -587,8 +587,7 @@ And the following unique queues:
|
|||||||
- `SECRET_KEY`: **\<random at every install\>**: Global secret key. This key is VERY IMPORTANT, if you lost it, the data encrypted by it (like 2FA secret) can't be decrypted anymore.
|
- `SECRET_KEY`: **\<random at every install\>**: Global secret key. This key is VERY IMPORTANT, if you lost it, the data encrypted by it (like 2FA secret) can't be decrypted anymore.
|
||||||
- `SECRET_KEY_URI`: **_empty_**: Instead of defining SECRET_KEY, this option can be used to use the key stored in a file (example value: `file:/etc/gitea/secret_key`). It shouldn't be lost like SECRET_KEY.
|
- `SECRET_KEY_URI`: **_empty_**: Instead of defining SECRET_KEY, this option can be used to use the key stored in a file (example value: `file:/etc/gitea/secret_key`). It shouldn't be lost like SECRET_KEY.
|
||||||
- `LOGIN_REMEMBER_DAYS`: **31**: How long to remember that a user is logged in before requiring relogin (in days).
|
- `LOGIN_REMEMBER_DAYS`: **31**: How long to remember that a user is logged in before requiring relogin (in days).
|
||||||
- `COOKIE_REMEMBER_NAME`: **gitea\_incredible**: Name of cookie used to store authentication
|
- `COOKIE_REMEMBER_NAME`: **gitea\_remember**: Name of cookie used to store authentication information.
|
||||||
information.
|
|
||||||
- `REVERSE_PROXY_LOGOUT_REDIRECT`: **_empty_**: URL or relative path to redirect users to after logout when authentication is handled by a reverse proxy or SSO. For example: `/my-sso/logout?return=/my-sso/home`.
|
- `REVERSE_PROXY_LOGOUT_REDIRECT`: **_empty_**: URL or relative path to redirect users to after logout when authentication is handled by a reverse proxy or SSO. For example: `/my-sso/logout?return=/my-sso/home`.
|
||||||
- `REVERSE_PROXY_AUTHENTICATION_USER`: **X-WEBAUTH-USER**: Header name for reverse proxy
|
- `REVERSE_PROXY_AUTHENTICATION_USER`: **X-WEBAUTH-USER**: Header name for reverse proxy
|
||||||
authentication.
|
authentication.
|
||||||
@@ -596,7 +595,8 @@ And the following unique queues:
|
|||||||
authentication provided email.
|
authentication provided email.
|
||||||
- `REVERSE_PROXY_AUTHENTICATION_FULL_NAME`: **X-WEBAUTH-FULLNAME**: Header name for reverse proxy
|
- `REVERSE_PROXY_AUTHENTICATION_FULL_NAME`: **X-WEBAUTH-FULLNAME**: Header name for reverse proxy
|
||||||
authentication provided full name.
|
authentication provided full name.
|
||||||
- `REVERSE_PROXY_LIMIT`: **1**: Interpret X-Forwarded-For header or the X-Real-IP header and set this as the remote IP for the request.
|
- `REVERSE_PROXY_LIMIT`: **1**: Interpret the X-Real-IP, X-Forwarded-For or Forwarded header, in that order, and set this as the remote IP for the request.
|
||||||
|
The client port is taken from the header value or, with X-Real-IP, from X-Real-Port.
|
||||||
Number of trusted proxy count. Set to zero to not use these headers.
|
Number of trusted proxy count. Set to zero to not use these headers.
|
||||||
- `REVERSE_PROXY_TRUSTED_PROXIES`: **127.0.0.0/8,::1/128**: List of IP addresses and networks separated by comma of trusted proxy servers. Use `*` to trust all.
|
- `REVERSE_PROXY_TRUSTED_PROXIES`: **127.0.0.0/8,::1/128**: List of IP addresses and networks separated by comma of trusted proxy servers. Use `*` to trust all.
|
||||||
- `X_FRAME_OPTIONS`: **SAMEORIGIN**: Set the `X-Frame-Options` header value for all HTTP responses. Set to `unset` to not send the header. Previously located in `[cors]`.
|
- `X_FRAME_OPTIONS`: **SAMEORIGIN**: Set the `X-Frame-Options` header value for all HTTP responses. Set to `unset` to not send the header. Previously located in `[cors]`.
|
||||||
@@ -647,14 +647,30 @@ And the following unique queues:
|
|||||||
- `SUCCESSFUL_TOKENS_CACHE_SIZE`: **20**: Cache successful token hashes. API tokens are stored in the DB as pbkdf2 hashes however, this means that there is a potentially significant hashing load when there are multiple API operations. This cache will store the successfully hashed tokens in a LRU cache as a balance between performance and security.
|
- `SUCCESSFUL_TOKENS_CACHE_SIZE`: **20**: Cache successful token hashes. API tokens are stored in the DB as pbkdf2 hashes however, this means that there is a potentially significant hashing load when there are multiple API operations. This cache will store the successfully hashed tokens in a LRU cache as a balance between performance and security.
|
||||||
- `DISABLE_QUERY_AUTH_TOKEN`: **false**: Reject API tokens sent in URL query string (Accept Header-based API tokens only). This setting will default to `true` in Gitea 1.23 and be deprecated in Gitea 1.24.
|
- `DISABLE_QUERY_AUTH_TOKEN`: **false**: Reject API tokens sent in URL query string (Accept Header-based API tokens only). This setting will default to `true` in Gitea 1.23 and be deprecated in Gitea 1.24.
|
||||||
- `TWO_FACTOR_AUTH`: **_empty_**: set to enforced to enforce two factor authentication. Only available in Gitea 1.24 and later.
|
- `TWO_FACTOR_AUTH`: **_empty_**: set to enforced to enforce two factor authentication. Only available in Gitea 1.24 and later.
|
||||||
- `ALLOWED_HOST_LIST`: **external**: Webhook and oauth2 clients can only call allowed hosts for security reasons. Comma separated list.
|
- `EGRESS_MODE`: **lax**: Egress mode toggles between strictness of outgoing requests:
|
||||||
|
- `lax` non-public targets (private, loopback, link-local, CGNAT and special-use ranges) to be allowed, it allows all public ones
|
||||||
|
- `strict` requires an explicit allow of all addresses
|
||||||
|
- `ALLOWED_HOST_LIST`: **_empty_**: Webhook and oauth2 clients can only call allowed hosts for security reasons. Comma separated list, eg: `192.168.1.0/24:3000`, `[2001:db8::/32]:9090`, `*.mydomain.com:[80|443]`
|
||||||
- Built-in networks:
|
- Built-in networks:
|
||||||
- `loopback`: 127.0.0.0/8 for IPv4 and ::1/128 for IPv6, localhost is included.
|
- `loopback`: 127.0.0.0/8 for IPv4 and ::1/128 for IPv6, localhost is included.
|
||||||
- `private`: RFC 1918 (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) and RFC 4193 (FC00::/7). Also called LAN/Intranet.
|
- `private`: RFC 1918 (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), RFC 4193 (FC00::/7) and RFC 6598 CGNAT (100.64.0.0/10). Also called LAN/Intranet.
|
||||||
- `external`: A valid non-private unicast IP, you can access all hosts on public internet.
|
- CIDR list: `1.2.3.0/8`, `2001:db8::/32`, and with a port `[2001:db8::/32]:9090` (IPv6 addresses and CIDRs need brackets when a port is given)
|
||||||
- `*`: All hosts are allowed.
|
- Host matching: `example.com` matches the host and any subdomain, dot-anchored so `notexample.com` never matches. `*.example.com` and `.example.com` match only subdomains, the apex itself is excluded. IDN names must be given as punycode.
|
||||||
- CIDR list: `1.2.3.0/8` for IPv4 and `2001:db8::/32` for IPv6
|
- All addresses can have ports specified. Accepted port specs:
|
||||||
- Wildcard hosts: `*.mydomain.com`, `192.168.100.*`
|
- a single port: `192.168.1.0/24:3000`
|
||||||
|
- a range, both bounds inclusive: `*.mydomain.com:3000-3010`
|
||||||
|
- a bracketed set of ports and ranges, `|` separated: `*.mydomain.com:[80|443|3000-3010]`
|
||||||
|
- all ports: `*.mydomain.com:*`
|
||||||
|
- A portless entry covers all ports in `lax` mode, only 80 and 443 in `strict` mode
|
||||||
|
- Port specs apply only where the list is consulted: in `lax` mode that is non-public targets alone, public targets are allowed on every port whatever the list says. In `strict` mode every target is checked, so ports restrict public hosts too.
|
||||||
|
- Non-public targets need an IP or built-in entry, a host name entry alone never covers them.
|
||||||
|
- Reserved addresses (the IPv4-embedding NAT64, Teredo and 6to4 ranges, this-network, multicast and broadcast) are denied whatever the list says. To reach them configure an HTTP proxy
|
||||||
|
- This list is enforced on direct connections only. When an HTTP proxy is configured, restricting the proxied target is the proxy server's responsibility.
|
||||||
|
|
||||||
|
## Audit (`audit`)
|
||||||
|
|
||||||
|
- `RECORD_OUTPUT`: **disabled**: Where security-relevant events are recorded. `disabled` records nothing. `database` writes events to the `audit_event` table and shows them in the admin, organization, repository and user settings. Invalid values fall back to `disabled`. See [Audit Logging](audit-logging.md).
|
||||||
|
- `RETENTION_DAYS`: **30**: Days to keep recorded events. `0` keeps them forever. Pruning is done by `cron.delete_old_audit_events`. That task is only registered while `RECORD_OUTPUT` records events and `RETENTION_DAYS` is greater than `0`.
|
||||||
|
|
||||||
## Camo (`camo`)
|
## Camo (`camo`)
|
||||||
|
|
||||||
@@ -665,8 +681,8 @@ And the following unique queues:
|
|||||||
|
|
||||||
## OpenID (`openid`)
|
## OpenID (`openid`)
|
||||||
|
|
||||||
- `ENABLE_OPENID_SIGNIN`: **true**: Allow authentication in via OpenID.
|
- `ENABLE_OPENID_SIGNIN`: **false**: Allow authentication in via OpenID.
|
||||||
- `ENABLE_OPENID_SIGNUP`: **! DISABLE\_REGISTRATION**: Allow registering via OpenID.
|
- `ENABLE_OPENID_SIGNUP`: **false**: Allow registering via OpenID.
|
||||||
- `WHITELISTED_URIS`: **_empty_**: If non-empty, list of POSIX regex patterns matching
|
- `WHITELISTED_URIS`: **_empty_**: If non-empty, list of POSIX regex patterns matching
|
||||||
OpenID URI's to permit.
|
OpenID URI's to permit.
|
||||||
- `BLACKLISTED_URIS`: **_empty_**: If non-empty, list of POSIX regex patterns matching
|
- `BLACKLISTED_URIS`: **_empty_**: If non-empty, list of POSIX regex patterns matching
|
||||||
@@ -701,7 +717,7 @@ And the following unique queues:
|
|||||||
Requires `Mailer` to be enabled.
|
Requires `Mailer` to be enabled.
|
||||||
- `REGISTER_MANUAL_CONFIRM`: **false**: Enable this to manually confirm new registrations.
|
- `REGISTER_MANUAL_CONFIRM`: **false**: Enable this to manually confirm new registrations.
|
||||||
Requires `REGISTER_EMAIL_CONFIRM` to be disabled.
|
Requires `REGISTER_EMAIL_CONFIRM` to be disabled.
|
||||||
- `DISABLE_REGISTRATION`: **false**: Disable registration, after which only admin can create
|
- `DISABLE_REGISTRATION`: **true**: Disable registration, after which only admin can create
|
||||||
accounts for users.
|
accounts for users.
|
||||||
- `REQUIRE_EXTERNAL_REGISTRATION_PASSWORD`: **false**: Enable this to force externally created
|
- `REQUIRE_EXTERNAL_REGISTRATION_PASSWORD`: **false**: Enable this to force externally created
|
||||||
accounts (via GitHub, OpenID Connect, etc) to create a password.
|
accounts (via GitHub, OpenID Connect, etc) to create a password.
|
||||||
@@ -725,8 +741,8 @@ And the following unique queues:
|
|||||||
If you set it to false, maybe it also needs to set `ENABLE_BASIC_AUTHENTICATION` to false to
|
If you set it to false, maybe it also needs to set `ENABLE_BASIC_AUTHENTICATION` to false to
|
||||||
completely disable password-based authentication.
|
completely disable password-based authentication.
|
||||||
- `ENABLE_PASSKEY_AUTHENTICATION`: **true**: Allow users to sign-in with a passkey
|
- `ENABLE_PASSKEY_AUTHENTICATION`: **true**: Allow users to sign-in with a passkey
|
||||||
- `ENABLE_REVERSE_PROXY_AUTHENTICATION`: **false**: Enable this to allow reverse proxy authentication for web requests
|
- `ENABLE_REVERSE_PROXY_AUTHENTICATION`: **false**: Enable reverse proxy authentication for the web interface, Git over HTTP, Git LFS and the package registry. Gitea must only be reachable through the proxy, see [Reverse Proxy](authentication.md#reverse-proxy).
|
||||||
- `ENABLE_REVERSE_PROXY_AUTHENTICATION_API`: **false**: Enable this to allow reverse proxy authentication for API requests, the reverse proxy is responsible for ensuring that no CSRF is possible.
|
- `ENABLE_REVERSE_PROXY_AUTHENTICATION_API`: **false**: Enable reverse proxy authentication for the REST API under `/api/v1`.
|
||||||
- `ENABLE_REVERSE_PROXY_AUTO_REGISTRATION`: **false**: Enable this to allow auto-registration
|
- `ENABLE_REVERSE_PROXY_AUTO_REGISTRATION`: **false**: Enable this to allow auto-registration
|
||||||
for reverse authentication.
|
for reverse authentication.
|
||||||
- `ENABLE_REVERSE_PROXY_EMAIL`: **false**: Enable this to allow to auto-registration with a
|
- `ENABLE_REVERSE_PROXY_EMAIL`: **false**: Enable this to allow to auto-registration with a
|
||||||
@@ -760,7 +776,7 @@ And the following unique queues:
|
|||||||
- `DEFAULT_ALLOW_ONLY_CONTRIBUTORS_TO_TRACK_TIME`: **true**: Only allow users with write permissions to track time.
|
- `DEFAULT_ALLOW_ONLY_CONTRIBUTORS_TO_TRACK_TIME`: **true**: Only allow users with write permissions to track time.
|
||||||
- `EMAIL_DOMAIN_ALLOWLIST`: **_empty_**: If non-empty, comma separated list of domain names that can only be used to register on this instance, wildcard is supported.
|
- `EMAIL_DOMAIN_ALLOWLIST`: **_empty_**: If non-empty, comma separated list of domain names that can only be used to register on this instance, wildcard is supported.
|
||||||
- `EMAIL_DOMAIN_BLOCKLIST`: **_empty_**: If non-empty, comma separated list of domain names that cannot be used to register on this instance, wildcard is supported.
|
- `EMAIL_DOMAIN_BLOCKLIST`: **_empty_**: If non-empty, comma separated list of domain names that cannot be used to register on this instance, wildcard is supported.
|
||||||
- `SHOW_REGISTRATION_BUTTON`: **! DISABLE\_REGISTRATION**: Show Registration Button
|
- `SHOW_REGISTRATION_BUTTON`: **false**: Show Registration button, defaults to true only if both DISABLE_REGISTRATION and ALLOW_ONLY_EXTERNAL_REGISTRATION are false
|
||||||
- `SHOW_MILESTONES_DASHBOARD_PAGE`: **true** Enable this to show the milestones dashboard page - a view of all the user's milestones
|
- `SHOW_MILESTONES_DASHBOARD_PAGE`: **true** Enable this to show the milestones dashboard page - a view of all the user's milestones
|
||||||
- `AUTO_WATCH_NEW_REPOS`: **true**: Enable this to let all organisation users watch new repos when they are created
|
- `AUTO_WATCH_NEW_REPOS`: **true**: Enable this to let all organisation users watch new repos when they are created
|
||||||
- `AUTO_WATCH_ON_CHANGES`: **false**: Enable this to make users watch a repository after their first commit to it
|
- `AUTO_WATCH_ON_CHANGES`: **false**: Enable this to make users watch a repository after their first commit to it
|
||||||
@@ -770,8 +786,7 @@ And the following unique queues:
|
|||||||
- `DEFAULT_ORG_MEMBER_VISIBLE`: **false** True will make the membership of the users visible when added to the organisation.
|
- `DEFAULT_ORG_MEMBER_VISIBLE`: **false** True will make the membership of the users visible when added to the organisation.
|
||||||
- `ALLOW_ONLY_INTERNAL_REGISTRATION`: **false** Set to true to force registration only via Gitea.
|
- `ALLOW_ONLY_INTERNAL_REGISTRATION`: **false** Set to true to force registration only via Gitea.
|
||||||
- `ALLOW_ONLY_EXTERNAL_REGISTRATION`: **false** Set to true to force registration only using third-party services.
|
- `ALLOW_ONLY_EXTERNAL_REGISTRATION`: **false** Set to true to force registration only using third-party services.
|
||||||
- `NO_REPLY_ADDRESS`: **noreply.DOMAIN** Value for the domain part of the user's email address in the Git log if user has set KeepEmailPrivate to true. DOMAIN resolves to the value in server.DOMAIN.
|
- `NO_REPLY_ADDRESS`: **_empty_**: Value for the domain part of the user's email address in the git log if user has set KeepEmailPrivate to true. The user's email will be replaced with a concatenation of the user name in lower case, "@" and NO_REPLY_ADDRESS. Default value is "noreply." + the domain part of ROOT_URL
|
||||||
The user's email will be replaced with a concatenation of the user name in lower case, "@" and NO_REPLY_ADDRESS.
|
|
||||||
- `USER_DELETE_WITH_COMMENTS_MAX_TIME`: **0** Minimum amount of time a user must exist before comments are kept when the user is deleted.
|
- `USER_DELETE_WITH_COMMENTS_MAX_TIME`: **0** Minimum amount of time a user must exist before comments are kept when the user is deleted.
|
||||||
- `VALID_SITE_URL_SCHEMES`: **http, https**: Valid site url schemes for user profiles
|
- `VALID_SITE_URL_SCHEMES`: **http, https**: Valid site url schemes for user profiles
|
||||||
|
|
||||||
@@ -804,9 +819,11 @@ Define allowed algorithms and their minimum key length (use -1 to disable a type
|
|||||||
- `DELIVER_TIMEOUT`: **5**: Delivery timeout (sec) for shooting webhooks.
|
- `DELIVER_TIMEOUT`: **5**: Delivery timeout (sec) for shooting webhooks.
|
||||||
- `SKIP_TLS_VERIFY`: **false**: Allow insecure certification.
|
- `SKIP_TLS_VERIFY`: **false**: Allow insecure certification.
|
||||||
- `PAGING_NUM`: **10**: Number of webhook history events that are shown in one page.
|
- `PAGING_NUM`: **10**: Number of webhook history events that are shown in one page.
|
||||||
- `PROXY_URL`: **_empty_**: Proxy server URL, support http://, https//, socks://, blank will follow environment http_proxy/https_proxy. If not given, will use global proxy setting.
|
- `PROXY_URL`: **_empty_**: Proxy server URL, support http://, https://, socks5://, blank will follow environment http_proxy/https_proxy. If not given, will use global proxy setting.
|
||||||
- `PROXY_HOSTS`: **_empty_`**: Comma separated list of host names requiring proxy. Glob patterns (*) are accepted; use ** to match all hosts. If not given, will use global proxy setting.
|
- `PROXY_HOSTS`: **_empty_`**: Comma separated list of host names requiring proxy. Glob patterns (*) are accepted; use ** to match all hosts. If not given, will use global proxy setting.
|
||||||
|
|
||||||
|
When a proxy is configured, Gitea does not enforce `[security]` `ALLOWED_HOST_LIST` on the proxied target, the proxy server is expected to restrict it.
|
||||||
|
|
||||||
## Mailer (`mailer`)
|
## Mailer (`mailer`)
|
||||||
|
|
||||||
:::warning
|
:::warning
|
||||||
@@ -881,27 +898,27 @@ In-Reply-To =
|
|||||||
|
|
||||||
## Cache (`cache`)
|
## Cache (`cache`)
|
||||||
|
|
||||||
- `ADAPTER`: **memory**: Cache engine adapter, either `memory`, `redis`, `twoqueue` or `memcache`. (`twoqueue` represents a size limited LRU cache.)
|
- `ADAPTER`: **memory**: Either `memory`, `redis`, `memcache`, or `twoqueue`.
|
||||||
- `INTERVAL`: **60**: Garbage Collection interval (sec), for memory and twoqueue cache only.
|
- `INTERVAL`: **60**: For `memory` and `twoqueue`, GC interval in seconds.
|
||||||
- `HOST`: **_empty_**: Connection string for `redis` and `memcache`. For `twoqueue` sets configuration for the queue. If left empty while `ADAPTER` is `redis`, it falls back to [redis/CONN_STR](#redis-redis) when that is set.
|
- `HOST`: **_empty_**: For `redis` and `memcache`, connection host address. For `twoqueue` sets configuration for the queue. If left empty while `ADAPTER` is `redis`, it falls back to [redis/CONN_STR](#redis-redis) when that is set.
|
||||||
- Redis: `redis://:[email protected]:6379/0?pool_size=100&idle_timeout=180s` (See [queue/CONN_STR](#queue-queue-and-queue) for information on additional supported connection types)
|
- Redis: `redis://:[email protected]:6379/0?pool_size=100&idle_timeout=180s` (See [queue/CONN_STR](#queue-queue-and-queue) for information on additional supported connection types)
|
||||||
- For a Redis cluster: `redis+cluster://:[email protected]:6379/0?pool_size=100&idle_timeout=180s`
|
- For a Redis cluster: `redis+cluster://:[email protected]:6379/0?pool_size=100&idle_timeout=180s`
|
||||||
- For a Redis sentinel: `redis+sentinel://:macaron@sentinel0:26379,sentinel1:26379,sentinel2:26379/0?pool_size=100&idle_timeout=180s&master_name=mymaster`
|
- For a Redis sentinel: `redis+sentinel://:macaron@sentinel0:26379,sentinel1:26379,sentinel2:26379/0?pool_size=100&idle_timeout=180s&master_name=mymaster`
|
||||||
- Memcache: `127.0.0.1:9090;127.0.0.1:9091`
|
- Memcache: `127.0.0.1:11211`
|
||||||
- TwoQueue LRU cache: `{"size":50000,"recent_ratio":0.25,"ghost_ratio":0.5}` or `50000` representing the maximum number of objects stored in the cache.
|
- TwoQueue LRU cache: `{"size":50000,"recent_ratio":0.25,"ghost_ratio":0.5}` or `50000` representing the maximum number of objects stored in the cache.
|
||||||
- `ITEM_TTL`: **16h**: Time to keep items in cache if not used, Setting it to -1 disables caching.
|
- `ITEM_TTL`: **16h**: Time to keep items in cache if not used. Setting it to -1 disables caching.
|
||||||
|
|
||||||
## Cache - LastCommitCache settings (`cache.last_commit`)
|
## Cache - LastCommitCache settings (`cache.last_commit`)
|
||||||
|
|
||||||
- `ITEM_TTL`: **8760h**: Time to keep items in cache if not used, Setting it to -1 disables caching.
|
- `ITEM_TTL`: **8760h**: Time to keep items in cache if not used. Setting it to -1 disables caching.
|
||||||
- `COMMITS_COUNT`: **1000**: Only enable the cache when repository's commits count great than.
|
- `COMMITS_COUNT`: **1000**: Only enable the cache when repository's commits count great than.
|
||||||
|
|
||||||
## Session (`session`)
|
## Session (`session`)
|
||||||
|
|
||||||
- `PROVIDER`: **memory**: Session engine provider \[memory, file, redis, db, mysql, couchbase, memcache, postgres\]. Setting `db` will reuse the configuration in `[database]`
|
- `PROVIDER`: **file**: Either "memory", "file", "redis" or "db", default is "file". "db" will reuse the configuration in `[database]`
|
||||||
- `PROVIDER_CONFIG`: **data/sessions**: For file, the root path; for db, empty (database config will be used); for others, the connection string. Relative paths will be made absolute against _`AppWorkPath`_. For the `redis` provider, if left empty it falls back to [redis/CONN_STR](#redis-redis) when that is set.
|
- `PROVIDER_CONFIG`: **data/sessions**: For file, the root path; for db, empty (database config will be used); for others, the connection string. Relative paths will be made absolute against _`AppWorkPath`_. For the `redis` provider, if left empty it falls back to [redis/CONN_STR](#redis-redis) when that is set.
|
||||||
- `COOKIE_SECURE`:**_empty_**: `true` or `false`. Enable this to force using HTTPS for all session access. If not set, it defaults to `true` if the ROOT_URL is an HTTPS URL.
|
- `COOKIE_SECURE`:**_empty_**: `true` or `false`. Enable this to force using HTTPS for all session access. If not set, it defaults to `true` if the ROOT_URL is an HTTPS URL.
|
||||||
- `COOKIE_NAME`: **i\_like\_gitea**: The name of the cookie used for the session ID.
|
- `COOKIE_NAME`: **gitea\_session**: Session cookie name
|
||||||
- `GC_INTERVAL_TIME`: **86400**: GC interval in seconds.
|
- `GC_INTERVAL_TIME`: **86400**: GC interval in seconds.
|
||||||
- `SESSION_LIFE_TIME`: **86400**: Session life time in seconds, default is 86400 (1 day)
|
- `SESSION_LIFE_TIME`: **86400**: Session life time in seconds, default is 86400 (1 day)
|
||||||
- `DOMAIN`: **_empty_**: Sets the cookie Domain
|
- `DOMAIN`: **_empty_**: Sets the cookie Domain
|
||||||
@@ -928,7 +945,7 @@ In-Reply-To =
|
|||||||
- none = no avatar will be displayed
|
- none = no avatar will be displayed
|
||||||
- random = random avatar will be generated
|
- random = random avatar will be generated
|
||||||
- image = default image will be used (which is set in `REPOSITORY_AVATAR_FALLBACK_IMAGE`)
|
- image = default image will be used (which is set in `REPOSITORY_AVATAR_FALLBACK_IMAGE`)
|
||||||
- `REPOSITORY_AVATAR_FALLBACK_IMAGE`: **/img/repo_default.png**: Image used as default repository avatar (if `REPOSITORY_AVATAR_FALLBACK` is set to image and none was uploaded)
|
- `REPOSITORY_AVATAR_FALLBACK_IMAGE`: **_empty_**: Image used as default repository avatar (if `REPOSITORY_AVATAR_FALLBACK` is set to image and none was uploaded). The value is used as-is, without prepending the sub-path of `ROOT_URL`. Empty uses Gitea's builtin repository avatar.
|
||||||
|
|
||||||
## Project (`project`)
|
## Project (`project`)
|
||||||
|
|
||||||
@@ -1047,7 +1064,7 @@ Release attachment has its own config options in `[repository.release]` section.
|
|||||||
- `ENABLED`: **true**: Enable running Update mirrors task periodically.
|
- `ENABLED`: **true**: Enable running Update mirrors task periodically.
|
||||||
- `SCHEDULE`: **@every 10m**: Cron syntax for scheduling update mirrors, e.g. `@every 3h`.
|
- `SCHEDULE`: **@every 10m**: Cron syntax for scheduling update mirrors, e.g. `@every 3h`.
|
||||||
- `RUN_AT_START`: **false**: Run Update mirrors task when Gitea starts.
|
- `RUN_AT_START`: **false**: Run Update mirrors task when Gitea starts.
|
||||||
- `NOTICE_ON_SUCCESS`: **false**: Notice if not success
|
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
|
||||||
- `PULL_LIMIT`: **50**: Limit the number of mirrors added to the queue to this number (negative values mean no limit, 0 will result in no mirrors being queued effectively disabling pull mirror updating).
|
- `PULL_LIMIT`: **50**: Limit the number of mirrors added to the queue to this number (negative values mean no limit, 0 will result in no mirrors being queued effectively disabling pull mirror updating).
|
||||||
- `PUSH_LIMIT`: **50**: Limit the number of mirrors added to the queue to this number (negative values mean no limit, 0 will result in no mirrors being queued effectively disabling push mirror updating).
|
- `PUSH_LIMIT`: **50**: Limit the number of mirrors added to the queue to this number (negative values mean no limit, 0 will result in no mirrors being queued effectively disabling push mirror updating).
|
||||||
|
|
||||||
@@ -1056,7 +1073,7 @@ Release attachment has its own config options in `[repository.release]` section.
|
|||||||
- `ENABLED`: **true**: Enable running repository health check task periodically.
|
- `ENABLED`: **true**: Enable running repository health check task periodically.
|
||||||
- `SCHEDULE`: **@midnight**: Cron syntax for scheduling repository health check.
|
- `SCHEDULE`: **@midnight**: Cron syntax for scheduling repository health check.
|
||||||
- `RUN_AT_START`: **false**: Run repository health check task when Gitea starts.
|
- `RUN_AT_START`: **false**: Run repository health check task when Gitea starts.
|
||||||
- `NOTICE_ON_SUCCESS`: **false**: Notice if not success
|
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
|
||||||
- `TIMEOUT`: **60s**: Time duration syntax for health check execution timeout.
|
- `TIMEOUT`: **60s**: Time duration syntax for health check execution timeout.
|
||||||
- `ARGS`: **_empty_**: Arguments for command `git fsck`, e.g. `--unreachable --tags`. See more on http://git-scm.com/docs/git-fsck
|
- `ARGS`: **_empty_**: Arguments for command `git fsck`, e.g. `--unreachable --tags`. See more on http://git-scm.com/docs/git-fsck
|
||||||
|
|
||||||
@@ -1065,12 +1082,13 @@ Release attachment has its own config options in `[repository.release]` section.
|
|||||||
- `SCHEDULE`: **@midnight**: Cron syntax for scheduling repository statistics check.
|
- `SCHEDULE`: **@midnight**: Cron syntax for scheduling repository statistics check.
|
||||||
- `ENABLED`: **true**: Enable running repository statistics check task periodically.
|
- `ENABLED`: **true**: Enable running repository statistics check task periodically.
|
||||||
- `RUN_AT_START`: **true**: Run repository statistics check task when Gitea starts.
|
- `RUN_AT_START`: **true**: Run repository statistics check task when Gitea starts.
|
||||||
- `NOTICE_ON_SUCCESS`: **false**: Notice if not success
|
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
|
||||||
|
|
||||||
#### Cron - Cleanup hook_task Table (`cron.cleanup_hook_task_table`)
|
#### Cron - Cleanup hook_task Table (`cron.cleanup_hook_task_table`)
|
||||||
|
|
||||||
- `ENABLED`: **true**: Enable cleanup hook_task job.
|
- `ENABLED`: **true**: Enable cleanup hook_task job.
|
||||||
- `RUN_AT_START`: **false**: Run cleanup hook_task at start time (if ENABLED).
|
- `RUN_AT_START`: **false**: Run cleanup hook_task at start time (if ENABLED).
|
||||||
|
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
|
||||||
- `SCHEDULE`: **@midnight**: Cron syntax for cleaning hook_task table.
|
- `SCHEDULE`: **@midnight**: Cron syntax for cleaning hook_task table.
|
||||||
- `CLEANUP_TYPE` **OlderThan** OlderThan or PerWebhook Method to cleanup hook_task, either by age (i.e. how long ago hook_task record was delivered) or by the number to keep per webhook (i.e. keep most recent x deliveries per webhook).
|
- `CLEANUP_TYPE` **OlderThan** OlderThan or PerWebhook Method to cleanup hook_task, either by age (i.e. how long ago hook_task record was delivered) or by the number to keep per webhook (i.e. keep most recent x deliveries per webhook).
|
||||||
- `OLDER_THAN`: **168h**: If CLEANUP_TYPE is set to OlderThan, then any delivered hook_task records older than this expression will be deleted.
|
- `OLDER_THAN`: **168h**: If CLEANUP_TYPE is set to OlderThan, then any delivered hook_task records older than this expression will be deleted.
|
||||||
@@ -1090,7 +1108,7 @@ Update migrated repositories' issues and comments' posterid, it will always atte
|
|||||||
|
|
||||||
- `ENABLED`: **true**: Enable update migration poster id job.
|
- `ENABLED`: **true**: Enable update migration poster id job.
|
||||||
- `RUN_AT_START`: **true**: Update migrated repositories' issues and comments' posterid when starting server
|
- `RUN_AT_START`: **true**: Update migrated repositories' issues and comments' posterid when starting server
|
||||||
- `NOTICE_ON_SUCCESS`: **false**: Notice if not success
|
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
|
||||||
- `SCHEDULE`: **@midnight** : Interval as a duration between each synchronization, it will always attempt synchronization when the instance starts.
|
- `SCHEDULE`: **@midnight** : Interval as a duration between each synchronization, it will always attempt synchronization when the instance starts.
|
||||||
|
|
||||||
#### Cron - Sync External Users (`cron.sync_external_users`)
|
#### Cron - Sync External Users (`cron.sync_external_users`)
|
||||||
@@ -1099,7 +1117,7 @@ Synchronize external user data (only LDAP user synchronization is supported)
|
|||||||
|
|
||||||
- `ENABLED`: **true**: Enable synchronize external user data job
|
- `ENABLED`: **true**: Enable synchronize external user data job
|
||||||
- `RUN_AT_START`: **false**: Synchronize external user data when starting server
|
- `RUN_AT_START`: **false**: Synchronize external user data when starting server
|
||||||
- `NOTICE_ON_SUCCESS`: **false**: Notice if not success
|
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
|
||||||
- `SCHEDULE`: **@midnight** : Interval as a duration between each synchronization, it will always attempt synchronization when the instance starts.
|
- `SCHEDULE`: **@midnight** : Interval as a duration between each synchronization, it will always attempt synchronization when the instance starts.
|
||||||
- `UPDATE_EXISTING`: **true**: Create new users, update existing user data and disable users that are not in external source anymore (default) or only create new users if UPDATE_EXISTING is set to false.
|
- `UPDATE_EXISTING`: **true**: Create new users, update existing user data and disable users that are not in external source anymore (default) or only create new users if UPDATE_EXISTING is set to false.
|
||||||
|
|
||||||
@@ -1107,12 +1125,14 @@ Synchronize external user data (only LDAP user synchronization is supported)
|
|||||||
|
|
||||||
- `ENABLED`: **true**: Enable cleanup expired actions assets job.
|
- `ENABLED`: **true**: Enable cleanup expired actions assets job.
|
||||||
- `RUN_AT_START`: **true**: Run job at start time (if ENABLED).
|
- `RUN_AT_START`: **true**: Run job at start time (if ENABLED).
|
||||||
|
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
|
||||||
- `SCHEDULE`: **@midnight** : Cron syntax for the job.
|
- `SCHEDULE`: **@midnight** : Cron syntax for the job.
|
||||||
|
|
||||||
#### Cron - Delete Old Action Runs (`cron.cleanup_action_runs`)
|
#### Cron - Delete Old Action Runs (`cron.cleanup_action_runs`)
|
||||||
|
|
||||||
- `ENABLED`: **true**: Enable the job deleting action runs older than `RUN_RETENTION_DAYS`. Deletes nothing while that is 0.
|
- `ENABLED`: **true**: Enable the job deleting action runs older than `RUN_RETENTION_DAYS`. Deletes nothing while that is 0.
|
||||||
- `RUN_AT_START`: **false**: Run job at start time (if ENABLED).
|
- `RUN_AT_START`: **false**: Run job at start time (if ENABLED).
|
||||||
|
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
|
||||||
- `SCHEDULE`: **@midnight**: Cron syntax for the job.
|
- `SCHEDULE`: **@midnight**: Cron syntax for the job.
|
||||||
|
|
||||||
#### Cron - Cleanup Deleted Branches (`cron.deleted_branches_cleanup`)
|
#### Cron - Cleanup Deleted Branches (`cron.deleted_branches_cleanup`)
|
||||||
@@ -1198,11 +1218,21 @@ Synchronize external user data (only LDAP user synchronization is supported)
|
|||||||
- `SCHEDULE`: **@every 168h**: Cron syntax to set how often to check.
|
- `SCHEDULE`: **@every 168h**: Cron syntax to set how often to check.
|
||||||
- `OLDER_THAN`: **8760h**: any action older than this expression will be deleted from database, suggest using `8760h` (1 year) because that's the max length of heatmap.
|
- `OLDER_THAN`: **8760h**: any action older than this expression will be deleted from database, suggest using `8760h` (1 year) because that's the max length of heatmap.
|
||||||
|
|
||||||
|
#### Cron - Delete old audit events (`cron.delete_old_audit_events`)
|
||||||
|
|
||||||
|
Deletes audit events older than the retention period. The task is only registered when `[audit].RECORD_OUTPUT` records events and `[audit].RETENTION_DAYS` is greater than `0`. See [Audit Logging](audit-logging.md).
|
||||||
|
|
||||||
|
- `ENABLED`: **true**: Enable service.
|
||||||
|
- `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED).
|
||||||
|
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
|
||||||
|
- `SCHEDULE`: **@every 24h**: Cron syntax to set how often to check.
|
||||||
|
- `OLDER_THAN`: **720h**: any audit event older than this expression will be deleted from the database. Defaults to `[audit].RETENTION_DAYS`.
|
||||||
|
|
||||||
#### Cron - Check for new Gitea versions (`cron.update_checker`)
|
#### Cron - Check for new Gitea versions (`cron.update_checker`)
|
||||||
|
|
||||||
- `ENABLED`: **true**: Enable service.
|
- `ENABLED`: **true**: Enable service.
|
||||||
- `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED).
|
- `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED).
|
||||||
- `ENABLE_SUCCESS_NOTICE`: **true**: Set to false to switch off success notices.
|
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
|
||||||
- `SCHEDULE`: **@every 168h**: Cron syntax for scheduling a work, e.g. `@every 168h`.
|
- `SCHEDULE`: **@every 168h**: Cron syntax for scheduling a work, e.g. `@every 168h`.
|
||||||
- `HTTP_ENDPOINT`: **https://dl.gitea.com/gitea/version.json**: the endpoint that Gitea will check for newer versions
|
- `HTTP_ENDPOINT`: **https://dl.gitea.com/gitea/version.json**: the endpoint that Gitea will check for newer versions
|
||||||
|
|
||||||
@@ -1210,7 +1240,7 @@ Synchronize external user data (only LDAP user synchronization is supported)
|
|||||||
|
|
||||||
- `ENABLED`: **false**: Enable service.
|
- `ENABLED`: **false**: Enable service.
|
||||||
- `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED).
|
- `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED).
|
||||||
- `NO_SUCCESS_NOTICE`: **false**: Set to true to switch off success notices.
|
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
|
||||||
- `SCHEDULE`: **@every 168h**: Cron syntax to set how often to check.
|
- `SCHEDULE`: **@every 168h**: Cron syntax to set how often to check.
|
||||||
- `OLDER_THAN`: **8760h**: any system notice older than this expression will be deleted from database.
|
- `OLDER_THAN`: **8760h**: any system notice older than this expression will be deleted from database.
|
||||||
|
|
||||||
@@ -1218,6 +1248,7 @@ Synchronize external user data (only LDAP user synchronization is supported)
|
|||||||
|
|
||||||
- `ENABLED`: **false**: Enable service.
|
- `ENABLED`: **false**: Enable service.
|
||||||
- `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED).
|
- `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED).
|
||||||
|
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
|
||||||
- `SCHEDULE`: **@every 24h**: Cron syntax to set how often to check.
|
- `SCHEDULE`: **@every 24h**: Cron syntax to set how often to check.
|
||||||
- `OLDER_THAN`: **168h**: Only attempt to garbage collect LFSMetaObjects older than this (default 7 days)
|
- `OLDER_THAN`: **168h**: Only attempt to garbage collect LFSMetaObjects older than this (default 7 days)
|
||||||
- `LAST_UPDATED_MORE_THAN_AGO`: **72h**: Only attempt to garbage collect LFSMetaObjects that have not been attempted to be garbage collected for this long (default 3 days)
|
- `LAST_UPDATED_MORE_THAN_AGO`: **72h**: Only attempt to garbage collect LFSMetaObjects that have not been attempted to be garbage collected for this long (default 3 days)
|
||||||
@@ -1230,35 +1261,35 @@ Synchronize external user data (only LDAP user synchronization is supported)
|
|||||||
|
|
||||||
- `ENABLED`: **true**: Enable service.
|
- `ENABLED`: **true**: Enable service.
|
||||||
- `RUN_AT_START`: **true**: Run tasks at start up time (if ENABLED).
|
- `RUN_AT_START`: **true**: Run tasks at start up time (if ENABLED).
|
||||||
- `NO_SUCCESS_NOTICE`: **false**: Set to true to switch off success notices.
|
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
|
||||||
- `SCHEDULE`: **@annually**: Cron syntax to set how often to rebuild
|
- `SCHEDULE`: **@annually**: Cron syntax to set how often to rebuild
|
||||||
|
|
||||||
#### Cron - Stop running tasks which haven't been updated for a long time (`cron.stop_zombie_tasks`)
|
#### Cron - Stop running tasks which haven't been updated for a long time (`cron.stop_zombie_tasks`)
|
||||||
|
|
||||||
- `ENABLED`: **true**: Enable service.
|
- `ENABLED`: **true**: Enable service.
|
||||||
- `RUN_AT_START`: **true**: Run tasks at start up time (if ENABLED).
|
- `RUN_AT_START`: **true**: Run tasks at start up time (if ENABLED).
|
||||||
- `NO_SUCCESS_NOTICE`: **false**: Set to true to switch off success notices.
|
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
|
||||||
- `SCHEDULE`: **@every 5m**: Cron syntax to set how often tasks to run the check
|
- `SCHEDULE`: **@every 5m**: Cron syntax to set how often tasks to run the check
|
||||||
|
|
||||||
#### Cron - Stop running tasks which have running status and continuous updates but don't end for a long time (`cron.stop_endless_tasks`)
|
#### Cron - Stop running tasks which have running status and continuous updates but don't end for a long time (`cron.stop_endless_tasks`)
|
||||||
|
|
||||||
- `ENABLED`: **true**: Enable service.
|
- `ENABLED`: **true**: Enable service.
|
||||||
- `RUN_AT_START`: **true**: Run tasks at start up time (if ENABLED).
|
- `RUN_AT_START`: **true**: Run tasks at start up time (if ENABLED).
|
||||||
- `NO_SUCCESS_NOTICE`: **false**: Set to true to switch off success notices.
|
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
|
||||||
- `SCHEDULE`: **@every 30m**: Cron syntax to set how often to run the check.
|
- `SCHEDULE`: **@every 30m**: Cron syntax to set how often to run the check.
|
||||||
|
|
||||||
#### Cron - Cancel jobs which haven't been picked up for a long time (`cron.cancel_abandoned_jobs`)
|
#### Cron - Cancel jobs which haven't been picked up for a long time (`cron.cancel_abandoned_jobs`)
|
||||||
|
|
||||||
- `ENABLED`: **true**: Enable service.
|
- `ENABLED`: **true**: Enable service.
|
||||||
- `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED).
|
- `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED).
|
||||||
- `NO_SUCCESS_NOTICE`: **false**: Set to true to switch off success notices.
|
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
|
||||||
- `SCHEDULE`: **@every 6h**: Cron syntax to set how often to run the check.
|
- `SCHEDULE`: **@every 6h**: Cron syntax to set how often to run the check.
|
||||||
|
|
||||||
#### Cron - Start cron based actions (`cron.start_schedule_tasks`)
|
#### Cron - Start cron based actions (`cron.start_schedule_tasks`)
|
||||||
|
|
||||||
- `ENABLED`: **true**: Enable service.
|
- `ENABLED`: **true**: Enable service.
|
||||||
- `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED).
|
- `RUN_AT_START`: **false**: Run tasks at start up time (if ENABLED).
|
||||||
- `NO_SUCCESS_NOTICE`: **false**: Set to true to switch off success notices.
|
- `NOTICE_ON_SUCCESS`: **false**: Set to true to switch on success notices.
|
||||||
- `SCHEDULE`: **@every 1m**: Cron syntax to set how often to schedule tasks
|
- `SCHEDULE`: **@every 1m**: Cron syntax to set how often to schedule tasks
|
||||||
|
|
||||||
## Git (`git`)
|
## Git (`git`)
|
||||||
@@ -1298,7 +1329,6 @@ These options are written into the gitconfig file under `[git] HOME_PATH` when G
|
|||||||
|
|
||||||
- `diff.algorithm`: **histogram**
|
- `diff.algorithm`: **histogram**
|
||||||
- `core.logAllRefUpdates`: **true**
|
- `core.logAllRefUpdates`: **true**
|
||||||
- `gc.reflogExpire`: **90**
|
|
||||||
|
|
||||||
## Metrics (`metrics`)
|
## Metrics (`metrics`)
|
||||||
|
|
||||||
@@ -1326,7 +1356,7 @@ These options are written into the gitconfig file under `[git] HOME_PATH` when G
|
|||||||
- `JWT_SECRET_URI`: **_empty_**: Instead of defining JWT_SECRET in the configuration, this configuration option can be used to give Gitea a path to a file that contains the secret (example value: `file:/etc/gitea/oauth2_jwt_secret`)
|
- `JWT_SECRET_URI`: **_empty_**: Instead of defining JWT_SECRET in the configuration, this configuration option can be used to give Gitea a path to a file that contains the secret (example value: `file:/etc/gitea/oauth2_jwt_secret`)
|
||||||
- `JWT_SIGNING_PRIVATE_KEY_FILE`: **jwt/private.pem**: Private key file path used to sign OAuth2 tokens. The path is relative to `APP_DATA_PATH`. This setting is only needed if `JWT_SIGNING_ALGORITHM` is set to `RS256`, `RS384`, `RS512`, `ES256`, `ES384` or `ES512`. The file must contain a RSA or ECDSA private key in the PKCS8 format. If no key exists a 4096 bit key will be created for you.
|
- `JWT_SIGNING_PRIVATE_KEY_FILE`: **jwt/private.pem**: Private key file path used to sign OAuth2 tokens. The path is relative to `APP_DATA_PATH`. This setting is only needed if `JWT_SIGNING_ALGORITHM` is set to `RS256`, `RS384`, `RS512`, `ES256`, `ES384` or `ES512`. The file must contain a RSA or ECDSA private key in the PKCS8 format. If no key exists a 4096 bit key will be created for you.
|
||||||
- `MAX_TOKEN_LENGTH`: **32767**: Maximum length of token/cookie to accept from OAuth2 provider
|
- `MAX_TOKEN_LENGTH`: **32767**: Maximum length of token/cookie to accept from OAuth2 provider
|
||||||
- `DEFAULT_APPLICATIONS`: **git-credential-oauth, git-credential-manager, tea, gitea-app**: Pre-register OAuth applications for some services on startup. See the [OAuth2 documentation](/development/oauth2-provider.md) for the list of available options.
|
- `DEFAULT_APPLICATIONS`: **git-credential-oauth, git-credential-manager, gitea-cli, gitea-app, gitea-vscode**: Pre-register OAuth applications for some services on startup. See the [OAuth2 documentation](/development/oauth2-provider.md) for the list of available options. `tea` is accepted as an alias of `gitea-cli`.
|
||||||
- `CUSTOM_SCHEMES`: **_empty_**: By default, OAuth2 applications can only use "http" and "https" as their redirect URI schemes.
|
- `CUSTOM_SCHEMES`: **_empty_**: By default, OAuth2 applications can only use "http" and "https" as their redirect URI schemes.
|
||||||
If you need to use other schemes (e.g. for desktop applications), you can specify them here as a comma-separated list.
|
If you need to use other schemes (e.g. for desktop applications), you can specify them here as a comma-separated list.
|
||||||
For example: set "my-scheme, com.example.app" to support "my-scheme://..." and "com.example.app://..." redirect URIs.
|
For example: set "my-scheme, com.example.app" to support "my-scheme://..." and "com.example.app://..." redirect URIs.
|
||||||
@@ -1410,11 +1440,13 @@ in this mapping or the filetype using heuristics.
|
|||||||
|
|
||||||
- `MAX_ATTEMPTS`: **3**: Max attempts per http/https request on migrations.
|
- `MAX_ATTEMPTS`: **3**: Max attempts per http/https request on migrations.
|
||||||
- `RETRY_BACKOFF`: **3**: Backoff time per http/https request retry (seconds)
|
- `RETRY_BACKOFF`: **3**: Backoff time per http/https request retry (seconds)
|
||||||
- `ALLOWED_DOMAINS`: **_empty_**: Domains allowlist for migrating repositories, default is blank. It means external hosts will be allowed. Multiple domains could be separated by commas. Wildcard is supported: `github.com, *.github.com`.
|
- `EGRESS_MODE`: **lax**: Mode toggles between strictness of scanning outgoing requests, same format as `EGRESS_MODE` in [`security`](#security-security).
|
||||||
- `BLOCKED_DOMAINS`: **_empty_**: Domains blocklist for migrating repositories, default is blank. Multiple domains could be separated by commas. When `ALLOWED_DOMAINS` is not blank, this option has a higher priority to deny domains. Wildcard is supported.
|
- `ALLOWED_HOST_LIST`: **_empty_**: Hosts migrations and mirrors may call, same format as `ALLOWED_HOST_LIST` in [`security`](#security-security). Private, loopback and link-local addresses need a builtin or CIDR entry. When unset, the deprecated `ALLOWED_DOMAINS` entries apply on every port with `strict` as the default mode, and the deprecated `ALLOW_LOCALNETWORKS` adds `private, loopback`.
|
||||||
- `ALLOW_LOCALNETWORKS`: **false**: Allow private addresses defined by RFC 1918, RFC 1122, RFC 4632 and RFC 4291. If a domain is allowed by `ALLOWED_DOMAINS`, this option will be ignored.
|
- `BLOCKED_HOST_LIST`: **_empty_**: Hosts migrations and mirrors may never call, portless entries cover all ports.
|
||||||
- `SKIP_TLS_VERIFY`: **false**: Allow skip tls verify
|
- `SKIP_TLS_VERIFY`: **false**: Allow skip tls verify
|
||||||
|
|
||||||
|
These lists are enforced on direct connections only. When a proxy is configured (`[proxy]`, `[git.config]` `http.proxy` or the environment), restricting the proxied target is the proxy server's responsibility.
|
||||||
|
|
||||||
## Federation (`federation`)
|
## Federation (`federation`)
|
||||||
|
|
||||||
- `ENABLED`: **false**: Enable/Disable federation capabilities
|
- `ENABLED`: **false**: Enable/Disable federation capabilities
|
||||||
@@ -1649,14 +1681,16 @@ is `data/repo-archive` and the default of `MINIO_BASE_PATH` is `repo-archive/`.
|
|||||||
## Proxy (`proxy`)
|
## Proxy (`proxy`)
|
||||||
|
|
||||||
- `PROXY_ENABLED`: **false**: Enable the proxy if true, all requests to external via HTTP will be affected, if false, no proxy will be used even environment http_proxy/https_proxy
|
- `PROXY_ENABLED`: **false**: Enable the proxy if true, all requests to external via HTTP will be affected, if false, no proxy will be used even environment http_proxy/https_proxy
|
||||||
- `PROXY_URL`: **_empty_**: Proxy server URL, support http://, https//, socks://, blank will follow environment http_proxy/https_proxy
|
- `PROXY_URL`: **_empty_**: Proxy server URL, support http://, https://, socks5://, blank will follow environment http_proxy/https_proxy
|
||||||
- `PROXY_HOSTS`: **_empty_**: Comma separated list of host names requiring proxy. Glob patterns (*) are accepted; use ** to match all hosts.
|
- `PROXY_HOSTS`: **_empty_**: Comma separated list of host names requiring proxy. Glob patterns (*) are accepted; use ** to match all hosts.
|
||||||
|
|
||||||
|
When a proxy is configured, Gitea does not enforce the egress lists (`[security]`, `[migrations]`) on the proxied target, the proxy server is expected to restrict it.
|
||||||
|
|
||||||
i.e.
|
i.e.
|
||||||
|
|
||||||
```ini
|
```ini
|
||||||
PROXY_ENABLED = true
|
PROXY_ENABLED = true
|
||||||
PROXY_URL = socks://127.0.0.1:1080
|
PROXY_URL = socks5://127.0.0.1:1080
|
||||||
PROXY_HOSTS = *.github.com
|
PROXY_HOSTS = *.github.com
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -1674,7 +1708,8 @@ PROXY_HOSTS = *.github.com
|
|||||||
But it will save storage space and network bandwidth, so it's still recommended to use compression.
|
But it will save storage space and network bandwidth, so it's still recommended to use compression.
|
||||||
- `ARTIFACT_RETENTION_DAYS`: **90**: Days to keep artifacts. Old artifacts will be deleted after this period. 0 means keep forever.
|
- `ARTIFACT_RETENTION_DAYS`: **90**: Days to keep artifacts. Old artifacts will be deleted after this period. 0 means keep forever.
|
||||||
Changes only apply to newly uploaded artifacts, existing ones keep the expiry stored when they were uploaded.
|
Changes only apply to newly uploaded artifacts, existing ones keep the expiry stored when they were uploaded.
|
||||||
Artifacts could have their own retention periods by setting the `retention-days` option in `actions/upload-artifact` step.
|
Workflows can request a shorter retention period, down to 1 day.
|
||||||
|
- `ARTIFACT_PREVIEW_MAX_SIZE`: **10485760**: Maximum total artifact size in bytes that can be browsed or previewed in the web UI. Set to `0` to disable artifact previews or `-1` for no limit. Individual files are also limited by [`MAX_DISPLAY_FILE_SIZE`](#ui-ui).
|
||||||
- `RUN_RETENTION_DAYS`: **400**: Days to keep completed runs. Old runs and everything under them will be deleted after this period. 0 means keep forever.
|
- `RUN_RETENTION_DAYS`: **400**: Days to keep completed runs. Old runs and everything under them will be deleted after this period. 0 means keep forever.
|
||||||
- `ZOMBIE_TASK_TIMEOUT`: **10m**: Timeout to stop the task which have running status, but haven't been updated for a long time
|
- `ZOMBIE_TASK_TIMEOUT`: **10m**: Timeout to stop the task which have running status, but haven't been updated for a long time
|
||||||
- `ENDLESS_TASK_TIMEOUT`: **3h**: Timeout to stop the tasks which have running status and continuous updates, but don't end for a long time
|
- `ENDLESS_TASK_TIMEOUT`: **3h**: Timeout to stop the tasks which have running status and continuous updates, but don't end for a long time
|
||||||
@@ -1684,18 +1719,9 @@ PROXY_HOSTS = *.github.com
|
|||||||
- `SCOPED_WORKFLOW_DIRS`: **.gitea/scoped_workflows**: Comma-separated list of directories holding [scoped workflows](usage/actions/scoped-workflows.md) (workflows defined in a central source repository that run on other repositories). Must not overlap with `WORKFLOW_DIRS`. Leave empty so no directory is scanned for scoped workflows; none are found or run.
|
- `SCOPED_WORKFLOW_DIRS`: **.gitea/scoped_workflows**: Comma-separated list of directories holding [scoped workflows](usage/actions/scoped-workflows.md) (workflows defined in a central source repository that run on other repositories). Must not overlap with `WORKFLOW_DIRS`. Leave empty so no directory is scanned for scoped workflows; none are found or run.
|
||||||
- `MAX_RERUN_ATTEMPTS`: **50**: Maximum number of attempts a single workflow run can have (initial run + reruns). Defaults value is 50. Set any positive value that fits your workflow needs.
|
- `MAX_RERUN_ATTEMPTS`: **50**: Maximum number of attempts a single workflow run can have (initial run + reruns). Defaults value is 50. Set any positive value that fits your workflow needs.
|
||||||
|
|
||||||
`DEFAULT_ACTIONS_URL` indicates where the Gitea Actions runners should find the actions with relative path.
|
`DEFAULT_ACTIONS_URL` sets where runners download actions without a host.
|
||||||
For example, `uses: actions/checkout@v4` means `https://github.com/actions/checkout@v4` since the value of `DEFAULT_ACTIONS_URL` is `github`.
|
With `github`, `uses: actions/checkout@v4` resolves to `https://github.com/actions/checkout@v4`, with `self` to `<ROOT_URL>/actions/checkout@v4`.
|
||||||
And it can be changed to `self` to make it `root_url_of_your_gitea/actions/checkout@v4`.
|
`self` requires mirroring every action you use to your instance, so prefer naming the host per action instead: `uses: self:owner/repo@ref` for your instance, or a full URL like `uses: https://gitea.com/actions/checkout@v4` for any other host.
|
||||||
|
|
||||||
Please note that using `self` is not recommended for most cases, as it could make names globally ambiguous.
|
|
||||||
Additionally, it requires you to mirror all the actions you need to your Gitea instance, which may not be worth it.
|
|
||||||
Therefore, please use `self` only if you understand what you are doing.
|
|
||||||
|
|
||||||
In earlier versions (`<= 1.19`), `DEFAULT_ACTIONS_URL` could be set to any custom URLs like `https://gitea.com` or `http://your-git-server,https://gitea.com`, and the default value was `https://gitea.com`.
|
|
||||||
However, later updates removed those options, and now the only options are `github` and `self`, with the default value being `github`.
|
|
||||||
However, if you want to use actions from other git server, you can use a complete URL in `uses` field, it's supported by Gitea (but not GitHub).
|
|
||||||
Like `uses: https://gitea.com/actions/checkout@v4` or `uses: http://your-git-server/actions/checkout@v4`.
|
|
||||||
|
|
||||||
## Other (`other`)
|
## Other (`other`)
|
||||||
|
|
||||||
|
|||||||
@@ -86,6 +86,21 @@ PROTOCOL = smtps
|
|||||||
Note that you'll need to create and use an [App password](https://support.google.com/accounts/answer/185833?hl=en) by enabling 2FA on your Google
|
Note that you'll need to create and use an [App password](https://support.google.com/accounts/answer/185833?hl=en) by enabling 2FA on your Google
|
||||||
account. You won't be able to use your Google account password directly.
|
account. You won't be able to use your Google account password directly.
|
||||||
|
|
||||||
|
An app password is the only option: Google
|
||||||
|
[turned off access for apps that sign in with a password alone](https://workspaceupdates.googleblog.com/2023/09/winding-down-google-sync-and-less-secure-apps-support.html)
|
||||||
|
in 2024 and asks applications to use OAuth instead, which Gitea's mailer does
|
||||||
|
not implement — it authenticates with `CRAM-MD5`, `PLAIN` or `LOGIN`.
|
||||||
|
|
||||||
|
Two things to keep in mind:
|
||||||
|
|
||||||
|
- app passwords require 2-step verification on the account, and a Google
|
||||||
|
Workspace administrator can switch them off for the whole domain. If they are
|
||||||
|
not available, send through the
|
||||||
|
[Workspace SMTP relay service](https://support.google.com/a/answer/2956491)
|
||||||
|
or through another mail provider.
|
||||||
|
- port `587` works as well, with `SMTP_PORT = 587` and
|
||||||
|
`PROTOCOL = smtp+starttls`.
|
||||||
|
|
||||||
### ProtonMail
|
### ProtonMail
|
||||||
|
|
||||||
This feature is currently only available for select Proton for Business customers and those with Visionary and Family plans with custom domain addresses. See [ProtonMail's SMTP documentation](https://proton.me/support/smtp-submission) for more information. This limitation can be circumvented by using the ProtonMail Bridge application.
|
This feature is currently only available for select Proton for Business customers and those with Visionary and Family plans with custom domain addresses. See [ProtonMail's SMTP documentation](https://proton.me/support/smtp-submission) for more information. This limitation can be circumvented by using the ProtonMail Bridge application.
|
||||||
|
|||||||
@@ -41,3 +41,24 @@ client that causes SSH transfers to hang: https://github.com/git-lfs/git-lfs/pul
|
|||||||
This can be worked around on all the client machines by setting the git config:
|
This can be worked around on all the client machines by setting the git config:
|
||||||
`git config --global lfs.ssh.automultiplex false`
|
`git config --global lfs.ssh.automultiplex false`
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
# Changing LFS files through the API
|
||||||
|
|
||||||
|
The [contents API](https://docs.gitea.com/api/operations/repo-change-files/)
|
||||||
|
works on LFS tracked files as well: send the file content as usual and Gitea
|
||||||
|
stores it as an LFS object and commits a pointer file, as long as the path is
|
||||||
|
matched by a `filter=lfs` rule in `.gitattributes`.
|
||||||
|
|
||||||
|
What is easy to get wrong is the `sha` of the file being changed, which
|
||||||
|
`PUT`/`DELETE /repos/{owner}/{repo}/contents/{filepath}` and
|
||||||
|
`POST /repos/{owner}/{repo}/contents` require for an existing file. Gitea
|
||||||
|
compares it with the ID of the blob the commit has at that path, and for an LFS
|
||||||
|
tracked file that blob is the **pointer file**, not the content:
|
||||||
|
|
||||||
|
- use the `sha` returned by
|
||||||
|
[`GET /repos/{owner}/{repo}/contents/{filepath}`](https://docs.gitea.com/api/operations/repo-get-contents/)
|
||||||
|
- do not use `lfs_oid` from the same response, which identifies the LFS object,
|
||||||
|
and do not use a checksum of the file itself
|
||||||
|
|
||||||
|
Sending anything else fails with `sha does not match`, even though the request
|
||||||
|
looks correct.
|
||||||
@@ -16,6 +16,8 @@ The logging configuration of Gitea mainly consists of 3 types of components:
|
|||||||
|
|
||||||
There is a fully functional log output by default, so it is not necessary to define one.
|
There is a fully functional log output by default, so it is not necessary to define one.
|
||||||
|
|
||||||
|
Security-relevant events (repository transfers, token changes, impersonation, and similar) are recorded separately. See [Audit Logging](audit-logging.md).
|
||||||
|
|
||||||
## Collecting Logs for Help
|
## Collecting Logs for Help
|
||||||
|
|
||||||
To collect logs for help and issue report, see [Support Options](help/support.md).
|
To collect logs for help and issue report, see [Support Options](help/support.md).
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ aliases:
|
|||||||
4. Make sure `Host` and `X-Forwarded-Proto` headers are correctly passed to Gitea to make Gitea see the real URL being visited.
|
4. Make sure `Host` and `X-Forwarded-Proto` headers are correctly passed to Gitea to make Gitea see the real URL being visited.
|
||||||
5. Make sure your webserver has a certificate, including all intermediate and RootCA certificates, for `git clone` and `git pull` to work.
|
5. Make sure your webserver has a certificate, including all intermediate and RootCA certificates, for `git clone` and `git pull` to work.
|
||||||
6. Gitea uses a WebSocket connection at `/-/ws` for real-time updates like the notification counter. Make sure the reverse-proxy talks HTTP/1.1 and forwards the `Upgrade` and `Connection` headers, see the examples below. Without it, Gitea falls back to periodic polling.
|
6. Gitea uses a WebSocket connection at `/-/ws` for real-time updates like the notification counter. Make sure the reverse-proxy talks HTTP/1.1 and forwards the `Upgrade` and `Connection` headers, see the examples below. Without it, Gitea falls back to periodic polling.
|
||||||
|
7. Make sure the reverse-proxy sets the `X-Real-IP` header, otherwise Gitea uses a client-sent value. For example `header_up X-Real-IP {remote_host}` in Caddy's `reverse_proxy`, `RequestHeader set X-Real-IP "expr=%{REMOTE_ADDR}"` in Apache or `http-request set-header X-Real-IP %[src]` in HAProxy. To log the client port, also set `X-Real-Port`, for example `proxy_set_header X-Real-Port $remote_port;` in nginx.
|
||||||
|
|
||||||
### Use a sub-path
|
### Use a sub-path
|
||||||
|
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ By default, this creates a token with very limited permissions. To complete your
|
|||||||
|
|
||||||
- `activitypub`
|
- `activitypub`
|
||||||
- `admin`
|
- `admin`
|
||||||
|
- `commitstatus` (included in `repository`)
|
||||||
- `issue`
|
- `issue`
|
||||||
- `misc`
|
- `misc`
|
||||||
- `notification`
|
- `notification`
|
||||||
|
|||||||
@@ -111,6 +111,9 @@ Gitea token scopes are as follows:
|
|||||||
| **admin** | `/admin/*` API routes: Site-wide administrative operations (hidden for non-admin accounts). |
|
| **admin** | `/admin/*` API routes: Site-wide administrative operations (hidden for non-admin accounts). |
|
||||||
| **read:admin** | Grants read access for admin operations, such as getting cron jobs or registered user emails. |
|
| **read:admin** | Grants read access for admin operations, such as getting cron jobs or registered user emails. |
|
||||||
| **write:admin** | Grants read/write/delete access for admin operations, such as running cron jobs or updating user accounts. |
|
| **write:admin** | Grants read/write/delete access for admin operations, such as running cron jobs or updating user accounts. |
|
||||||
|
| **commitstatus** | `/repos/{owner}/{repo}/statuses/{sha}` and `/repos/{owner}/{repo}/commits/{ref}/status(es)` API routes: Commit status operations. |
|
||||||
|
| **read:commitstatus** | Grants read access to commit statuses. Included in `read:repository`. |
|
||||||
|
| **write:commitstatus** | Grants read/write access to commit statuses, such as reporting CI results. Included in `write:repository`. |
|
||||||
| **issue** | `issues/*`, `labels/*`, `milestones/*` API routes: Issue-related operations. |
|
| **issue** | `issues/*`, `labels/*`, `milestones/*` API routes: Issue-related operations. |
|
||||||
| **read:issue** | Grants read access for issues operations, such as getting issue comments, issue attachments, and milestones. |
|
| **read:issue** | Grants read access for issues operations, such as getting issue comments, issue attachments, and milestones. |
|
||||||
| **write:issue** | Grants read/write/delete access for issues operations, such as posting or editing an issue comment or attachment, and updating milestones. |
|
| **write:issue** | Grants read/write/delete access for issues operations, such as posting or editing an issue comment or attachment, and updating milestones. |
|
||||||
@@ -141,7 +144,9 @@ Gitea creates OAuth applications for the following services by default on startu
|
|||||||
|-----------|-----------|---------|
|
|-----------|-----------|---------|
|
||||||
|[git-credential-oauth](https://github.com/hickford/git-credential-oauth)|Git credential helper|`a4792ccc-144e-407e-86c9-5e7d8d9c3269`|
|
|[git-credential-oauth](https://github.com/hickford/git-credential-oauth)|Git credential helper|`a4792ccc-144e-407e-86c9-5e7d8d9c3269`|
|
||||||
|[Git Credential Manager](https://github.com/git-ecosystem/git-credential-manager)|Git credential helper|`e90ee53c-94e2-48ac-9358-a874fb9e0662`|
|
|[Git Credential Manager](https://github.com/git-ecosystem/git-credential-manager)|Git credential helper|`e90ee53c-94e2-48ac-9358-a874fb9e0662`|
|
||||||
|[tea](https://gitea.com/gitea/tea)|tea|`d57cb8c4-630c-4168-8324-ec79935e18d4`|
|
|[Gitea CLI](https://gitea.com/gitea/cli)|Gitea CLI|`d57cb8c4-630c-4168-8324-ec79935e18d4`|
|
||||||
|
|Gitea App|Official Gitea mobile app|`b757811a-05c8-4c76-8d74-a5ee3d2073f2`|
|
||||||
|
|[gitea-vscode](https://gitea.com/gitea/gitea-vscode)|VS Code extension|`75a9ec3e-42b5-40cb-9144-9ea96ecd56a6`|
|
||||||
|
|
||||||
To prevent unexpected behavior, they are being displayed as locked in the UI and their creation can instead be controlled by the `DEFAULT_APPLICATIONS` parameter in `app.ini`.
|
To prevent unexpected behavior, they are being displayed as locked in the UI and their creation can instead be controlled by the `DEFAULT_APPLICATIONS` parameter in `app.ini`.
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -43,7 +43,7 @@ You can try it out using [the online demo](https://demo.gitea.com).
|
|||||||
|
|
||||||
- **Security**
|
- **Security**
|
||||||
|
|
||||||
Gitea places a strong emphasis on security, offering features such as user permission management, access control lists, and more to ensure the security of code and data.
|
Gitea places a strong emphasis on security, offering features such as user permission management, access control lists, [audit logging](administration/audit-logging.md), and more to ensure the security of code and data.
|
||||||
|
|
||||||
- **Code Review**
|
- **Code Review**
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ _Symbols used in table:_
|
|||||||
| Telemetry | **✘** | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ |
|
| Telemetry | **✘** | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ |
|
||||||
| Third-party render tool support | ✓ | ✘ | ✘ | ✘ | ✓ | ✘ | ✘ |
|
| Third-party render tool support | ✓ | ✘ | ✘ | ✘ | ✓ | ✘ | ✘ |
|
||||||
| WebAuthn (2FA) | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | ✓ |
|
| WebAuthn (2FA) | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | ✓ |
|
||||||
|
| Audit log | ✓ | ✓ | ⁄ | ✓ | ✓ | ? | ? |
|
||||||
| Extensive API | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
| Extensive API | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||||
| Built-in Package/Container Registry | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ | ✘ |
|
| Built-in Package/Container Registry | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ | ✘ |
|
||||||
| Sync commits to an external repo (push mirror) | ✓ | ✘ | ✓ | ✓ | ✘ | ✓ | ✓ |
|
| Sync commits to an external repo (push mirror) | ✓ | ✘ | ✓ | ✓ | ✘ | ✓ | ✓ |
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ aliases:
|
|||||||
|
|
||||||
# Database Preparation
|
# Database Preparation
|
||||||
|
|
||||||
You need a database to use Gitea. Gitea supports PostgreSQL (>= 12), MySQL (>= 8.0), MariaDB (>= 10.4), SQLite (builtin), and MSSQL (>= 2012 SP4). This page will guide into preparing database. Only PostgreSQL and MySQL will be covered here since those database engines are widely-used in production. If you plan to use SQLite, you can ignore this chapter.
|
You need a database to use Gitea. Gitea supports PostgreSQL (>= 12), MySQL (>= 8.0), MariaDB (>= 10.4), SQLite (builtin), and MSSQL (>= 2012 SP4). This page will guide into preparing database. PostgreSQL, MySQL and MSSQL are covered here. If you plan to use SQLite, you can ignore this chapter.
|
||||||
|
|
||||||
:::warning
|
:::warning
|
||||||
Converting one database type to another is not a well-tested process and you may experience issues. It is better to choose the final database type at the type of the first installation. Be aware that SQLite does not scale; if you expect your instance to grow at a later time, you should choose another database type.
|
Converting one database type to another is not a well-tested process and you may experience issues. It is better to choose the final database type at the type of the first installation. Be aware that SQLite does not scale; if you expect your instance to grow at a later time, you should choose another database type.
|
||||||
@@ -177,6 +177,28 @@ All steps below requires that the database engine of your choice is installed on
|
|||||||
|
|
||||||
You should be prompted to enter password for the database user, and connected to the database.
|
You should be prompted to enter password for the database user, and connected to the database.
|
||||||
|
|
||||||
|
## MSSQL
|
||||||
|
|
||||||
|
1. As an administrator, create the login, a database with case-sensitive collation, and its user. Replace the password `'gitea'` with a secure one:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE LOGIN gitea WITH PASSWORD = 'gitea';
|
||||||
|
CREATE DATABASE giteadb COLLATE Latin1_General_CS_AS;
|
||||||
|
GO
|
||||||
|
USE giteadb;
|
||||||
|
CREATE USER gitea FOR LOGIN gitea;
|
||||||
|
ALTER ROLE db_owner ADD MEMBER gitea;
|
||||||
|
GO
|
||||||
|
```
|
||||||
|
|
||||||
|
Upgrades change the database schema, so the user needs `db_owner`, or `db_ddladmin`, `db_datareader` and `db_datawriter`. With the latter, also run `ALTER DATABASE giteadb SET READ_COMMITTED_SNAPSHOT ON;` as administrator.
|
||||||
|
|
||||||
|
2. On your Gitea server, test the connection to the database:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sqlcmd -S 203.0.113.3 -U gitea -d giteadb
|
||||||
|
```
|
||||||
|
|
||||||
## Database Connection over TLS
|
## Database Connection over TLS
|
||||||
|
|
||||||
If the communication between Gitea and your database instance is performed through a private network, or if Gitea and the database are running on the same server, this section can be omitted since the security between Gitea and the database instance is not critically exposed. If instead the database instance is on a public network, use TLS to encrypt the connection to the database, as it is possible for third-parties to intercept the traffic data.
|
If the communication between Gitea and your database instance is performed through a private network, or if Gitea and the database are running on the same server, this section can be omitted since the security between Gitea and the database instance is not critically exposed. If instead the database instance is on a public network, use TLS to encrypt the connection to the database, as it is possible for third-parties to intercept the traffic data.
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ version is @minNodeVersion@ and the latest LTS version is recommended.
|
|||||||
:::note
|
:::note
|
||||||
Go version @minGoVersion@ or higher is required. However, it is recommended to
|
Go version @minGoVersion@ or higher is required. However, it is recommended to
|
||||||
obtain the same version as our continuous integration, see the advice given in
|
obtain the same version as our continuous integration, see the advice given in
|
||||||
[Hacking on Gitea](development/hacking-on-gitea.md)
|
[Hacking on Gitea](https://github.com/go-gitea/gitea/blob/main/docs/build-setup.md)
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## Download
|
## Download
|
||||||
@@ -73,7 +73,7 @@ To build from source, the following programs must be present on the system:
|
|||||||
|
|
||||||
- `go` @minGoVersion@ or higher, see [here](https://go.dev/dl/)
|
- `go` @minGoVersion@ or higher, see [here](https://go.dev/dl/)
|
||||||
- `node` @minNodeVersion@ or higher with `npm`, see [here](https://nodejs.org/en/download/)
|
- `node` @minNodeVersion@ or higher with `npm`, see [here](https://nodejs.org/en/download/)
|
||||||
- `make`, see [here](development/hacking-on-gitea.md#installing-make)
|
- `make`, see [here](https://github.com/go-gitea/gitea/blob/main/docs/build-setup.md#make)
|
||||||
|
|
||||||
Various [make tasks](https://github.com/go-gitea/gitea/blob/main/Makefile)
|
Various [make tasks](https://github.com/go-gitea/gitea/blob/main/Makefile)
|
||||||
are provided to keep the build process as simple as possible.
|
are provided to keep the build process as simple as possible.
|
||||||
|
|||||||
@@ -1,49 +0,0 @@
|
|||||||
---
|
|
||||||
date: "2016-12-01T16:00:00+02:00"
|
|
||||||
slug: "install-on-cloud-provider"
|
|
||||||
sidebar_position: 90
|
|
||||||
aliases:
|
|
||||||
- /en-us/install-on-cloud-provider
|
|
||||||
---
|
|
||||||
|
|
||||||
# Installation on Cloud Provider
|
|
||||||
|
|
||||||
## Cloudron
|
|
||||||
|
|
||||||
Gitea is available as a 1-click install on [Cloudron](https://cloudron.io).
|
|
||||||
Cloudron makes it easy to run apps like Gitea on your server and keep them up-to-date and secure.
|
|
||||||
|
|
||||||
[](https://cloudron.io/button.html?app=io.gitea.cloudronapp)
|
|
||||||
|
|
||||||
The Gitea package is maintained [here](https://git.cloudron.io/cloudron/gitea-app).
|
|
||||||
|
|
||||||
There is a [demo instance](https://my.demo.cloudron.io) (username: cloudron password: cloudron) where
|
|
||||||
you can experiment with running Gitea.
|
|
||||||
|
|
||||||
## Linode
|
|
||||||
|
|
||||||
[Linode](https://www.linode.com/) has Gitea as an app in their marketplace.
|
|
||||||
|
|
||||||
To deploy Gitea to Linode, have a look at the [Linode Marketplace](https://www.linode.com/marketplace/apps/linode/gitea/).
|
|
||||||
|
|
||||||
## alwaysdata
|
|
||||||
|
|
||||||
[alwaysdata](https://www.alwaysdata.com/) has Gitea as an app in their marketplace.
|
|
||||||
|
|
||||||
To deploy Gitea to alwaysdata, have a look at the [alwaysdata Marketplace](https://www.alwaysdata.com/en/marketplace/gitea/).
|
|
||||||
|
|
||||||
## Exoscale
|
|
||||||
|
|
||||||
[Exoscale](https://www.exoscale.com/) provides Gitea managed by [Glasskube](https://glasskube.eu/) in their marketplace.
|
|
||||||
|
|
||||||
Exoscale is a European cloud service provider.
|
|
||||||
|
|
||||||
The package is maintained and update via the open source [Glasskube Kubernetes Operator](https://github.com/glasskube/operator).
|
|
||||||
|
|
||||||
To deploy Gitea to Exoscale, have a look at the [Exoscale Marketplace](https://www.exoscale.com/marketplace/listing/glasskube-gitea/).
|
|
||||||
|
|
||||||
## Sealos
|
|
||||||
|
|
||||||
Gitea is available as a one-click deployment on [Sealos](https://sealos.io/products/app-store/gitea).
|
|
||||||
|
|
||||||
The community-maintained template source is available [here](https://github.com/labring-actions/templates/tree/kb-0.9/template/gitea).
|
|
||||||
@@ -66,7 +66,7 @@ server-1 | 2026-03-11T12:57:50.796198843Z /var/lib/gitea/git is not writable
|
|||||||
server-1 | 2026-03-11T12:57:50.796235667Z docker setup failed
|
server-1 | 2026-03-11T12:57:50.796235667Z docker setup failed
|
||||||
```
|
```
|
||||||
|
|
||||||
For a stable release you could use `:latest-rootless`, `:1-rootless` or specify a certain release like `:@dockerVersion@-rootless`, but if you'd like to use the latest development version then `:nightly-rootless` would be an appropriate tag. If you'd like to run the latest commit from a release branch you can use the `:1.x-nightly-rootless` tag, where x is the minor version of Gitea. (e.g. `:1.16-nightly-rootless`)
|
For a stable release you could use `:latest-rootless`, `:1-rootless` or specify a certain release like `:@dockerVersion@-rootless`, but if you'd like to use the latest development version then `:main-nightly-rootless` would be an appropriate tag. If you'd like to run the latest commit from a release branch you can use the `:1.x-nightly-rootless` tag, where x is the minor version of Gitea. (e.g. `:1.27-nightly-rootless`)
|
||||||
|
|
||||||
## Named volumes
|
## Named volumes
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ image as a service. Since there is no database available, one can be initialized
|
|||||||
Create a directory like `gitea` and paste the following content into a file named `docker-compose.yml`.
|
Create a directory like `gitea` and paste the following content into a file named `docker-compose.yml`.
|
||||||
Note that the volume should be owned by the user/group with the UID/GID specified in the config file.
|
Note that the volume should be owned by the user/group with the UID/GID specified in the config file.
|
||||||
If you don't give the volume correct permissions, the container may not start.
|
If you don't give the volume correct permissions, the container may not start.
|
||||||
For a stable release you can use `:latest`, `:1` or specify a certain release like `:@dockerVersion@`, but if you'd like to use the latest development version of Gitea then you could use the `:nightly` tag. If you'd like to run the latest commit from a release branch you can use the `:1.x-nightly` tag, where x is the minor version of Gitea. (e.g. `:1.16-nightly`)
|
For a stable release you can use `:latest`, `:1` or specify a certain release like `:@dockerVersion@`, but if you'd like to use the latest development version of Gitea then you could use the `:main-nightly` tag. If you'd like to run the latest commit from a release branch you can use the `:1.x-nightly` tag, where x is the minor version of Gitea. (e.g. `:1.27-nightly`)
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
networks:
|
networks:
|
||||||
@@ -191,7 +191,7 @@ services:
|
|||||||
+ networks:
|
+ networks:
|
||||||
+ - gitea
|
+ - gitea
|
||||||
+ volumes:
|
+ volumes:
|
||||||
+ - ./postgres:/var/lib/postgresql/data
|
+ - ./postgres:/var/lib/postgresql
|
||||||
```
|
```
|
||||||
|
|
||||||
## Named volumes
|
## Named volumes
|
||||||
|
|||||||
@@ -0,0 +1,166 @@
|
|||||||
|
---
|
||||||
|
date: "2026-09-03T20:00:00+02:00"
|
||||||
|
slug: "install-with-podman-quadlet"
|
||||||
|
sidebar_position: 65
|
||||||
|
aliases:
|
||||||
|
- /en-us/install-with-podman-quadlet
|
||||||
|
---
|
||||||
|
|
||||||
|
# Installation with Podman Quadlet
|
||||||
|
|
||||||
|
Similarly to [Docker](with-docker.md), [Podman](https://podman.io/) can be used to deploy Gitea.
|
||||||
|
|
||||||
|
This reference setup guides users through the setup based on Podman Quadlet.
|
||||||
|
Podman Quadlet is the native integration of Podman through systemd.
|
||||||
|
|
||||||
|
To learn more about Podman Quadlet, see [systemd units using Podman Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html).
|
||||||
|
|
||||||
|
This setup installs the quadlets in `~/.config/containers/systemd/`, the directory for rootless quadlets, and uses the rootless images.
|
||||||
|
If you install them in a rootful directory such as `/etc/containers/systemd/`, use the rootful images instead.
|
||||||
|
|
||||||
|
## Basics
|
||||||
|
|
||||||
|
Since Podman v6.0 a single `gitea.quadlets` file can hold multiple quadlets separated by the `---` delimiter.
|
||||||
|
|
||||||
|
Paste the following content into a file named `gitea.quadlets`
|
||||||
|
|
||||||
|
```ini
|
||||||
|
# FileName=gitea-data
|
||||||
|
[Volume]
|
||||||
|
VolumeName=gitea-data
|
||||||
|
---
|
||||||
|
# FileName=gitea-config
|
||||||
|
[Volume]
|
||||||
|
VolumeName=gitea-config
|
||||||
|
---
|
||||||
|
# FileName=gitea
|
||||||
|
[Container]
|
||||||
|
PublishPort=2222:2222
|
||||||
|
PublishPort=3000:3000
|
||||||
|
Image=docker.gitea.com/gitea:@dockerVersion@-rootless
|
||||||
|
ContainerName=gitea
|
||||||
|
Mount=type=volume,src=gitea-data.volume,destination=/var/lib/gitea
|
||||||
|
Mount=type=volume,src=gitea-config.volume,destination=/etc/gitea
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
# Start with the user session
|
||||||
|
WantedBy=default.target
|
||||||
|
```
|
||||||
|
|
||||||
|
You can run the installation command
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ podman quadlet install ./gitea.quadlets --application=gitea
|
||||||
|
/home/user/.config/containers/systemd/gitea/gitea-data.volume
|
||||||
|
/home/user/.config/containers/systemd/gitea/gitea-config.volume
|
||||||
|
/home/user/.config/containers/systemd/gitea/gitea.container
|
||||||
|
```
|
||||||
|
|
||||||
|
The `--application=gitea` flag allows us to tell podman to group the quadlets together, this can help for managing and organizing the quadlets files.
|
||||||
|
|
||||||
|
You can validate the quadlets are properly installed by looking at the list command
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ podman quadlet list
|
||||||
|
NAME UNIT NAME PATH ON DISK STATUS APPLICATION POD
|
||||||
|
gitea-config.volume gitea-config-volume.service /home/user/.config/containers/systemd/gitea/gitea-config.volume active/exited gitea
|
||||||
|
gitea-data.volume gitea-data-volume.service /home/user/.config/containers/systemd/gitea/gitea-data.volume active/exited gitea
|
||||||
|
gitea.container gitea.service /home/user/.config/containers/systemd/gitea/gitea.container failed/failed gitea
|
||||||
|
```
|
||||||
|
|
||||||
|
You can start the application by running `systemctl --user start gitea` command.
|
||||||
|
|
||||||
|
`WantedBy=default.target` starts the service when the user session starts.
|
||||||
|
Rootless user services do not run without a session, so to start Gitea at boot, enable lingering for the user with `loginctl enable-linger $USER`.
|
||||||
|
|
||||||
|
## Databases
|
||||||
|
|
||||||
|
### PostgreSQL database
|
||||||
|
|
||||||
|
To start Gitea in combination with a PostgreSQL database, apply these changes to the
|
||||||
|
`gitea.quadlets` file created above.
|
||||||
|
|
||||||
|
To start Gitea with a database, we need to create a network, so the database and Gitea container can communicate.
|
||||||
|
|
||||||
|
```diff
|
||||||
|
# FileName=gitea-data
|
||||||
|
[Volume]
|
||||||
|
VolumeName=gitea-data
|
||||||
|
---
|
||||||
|
# FileName=gitea-config
|
||||||
|
[Volume]
|
||||||
|
VolumeName=gitea-config
|
||||||
|
---
|
||||||
|
+ # FileName=gitea-postgres-data
|
||||||
|
+ [Volume]
|
||||||
|
+ VolumeName=gitea-postgres-data
|
||||||
|
+ ---
|
||||||
|
+ # FileName=gitea
|
||||||
|
+ [Network]
|
||||||
|
+ NetworkName=gitea
|
||||||
|
+ ---
|
||||||
|
+ # FileName=gitea-postgres
|
||||||
|
+ [Container]
|
||||||
|
+ Image=docker.io/library/postgres:18
|
||||||
|
+ ContainerName=gitea-postgres
|
||||||
|
+ Network=gitea.network
|
||||||
|
+ Mount=type=volume,src=gitea-postgres-data.volume,destination=/var/lib/postgresql
|
||||||
|
+ Environment=POSTGRES_USER=gitea
|
||||||
|
+ Environment=POSTGRES_PASSWORD=gitea
|
||||||
|
+ Environment=POSTGRES_DB=gitea
|
||||||
|
+
|
||||||
|
+ [Service]
|
||||||
|
+ Restart=always
|
||||||
|
+
|
||||||
|
+ [Install]
|
||||||
|
+ # Start with the user session
|
||||||
|
+ WantedBy=default.target
|
||||||
|
+ ---
|
||||||
|
# FileName=gitea
|
||||||
|
+ [Unit]
|
||||||
|
+ Requires=gitea-postgres.service
|
||||||
|
+ After=gitea-postgres.service
|
||||||
|
+
|
||||||
|
[Container]
|
||||||
|
PublishPort=2222:2222
|
||||||
|
PublishPort=3000:3000
|
||||||
|
Image=docker.gitea.com/gitea:@dockerVersion@-rootless
|
||||||
|
ContainerName=gitea
|
||||||
|
Mount=type=volume,src=gitea-data.volume,destination=/var/lib/gitea
|
||||||
|
Mount=type=volume,src=gitea-config.volume,destination=/etc/gitea
|
||||||
|
+ Network=gitea.network
|
||||||
|
+ Environment=GITEA__database__DB_TYPE=postgres
|
||||||
|
+ Environment=GITEA__database__HOST=gitea-postgres:5432
|
||||||
|
+ Environment=GITEA__database__NAME=gitea
|
||||||
|
+ Environment=GITEA__database__USER=gitea
|
||||||
|
+ Environment=GITEA__database__PASSWD=gitea
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
# Start with the user session
|
||||||
|
WantedBy=default.target
|
||||||
|
```
|
||||||
|
|
||||||
|
## Logs
|
||||||
|
|
||||||
|
As systemd manages the container we can use `journalctl` to access the logs
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ journalctl --user --follow --unit=gitea.service
|
||||||
|
gitea[5967]: 2026/09/03 14:50:42 cmd/web.go:263:runWeb() [I] Starting Gitea on PID: 2
|
||||||
|
gitea[5967]: 2026/09/03 14:50:42 cmd/web.go:115:showWebStartupMessage() [I] Gitea version: 1.27.3 built with go1.26.7-X:jsonv2 : bindata, timetzdata,
|
||||||
|
gitea[5967]: 2026/09/03 14:50:42 cmd/web.go:116:showWebStartupMessage() [I] * RunMode: prod
|
||||||
|
gitea[5967]: 2026/09/03 14:50:42 cmd/web.go:117:showWebStartupMessage() [I] * AppPath: /usr/local/bin/gitea
|
||||||
|
gitea[5967]: 2026/09/03 14:50:42 cmd/web.go:118:showWebStartupMessage() [I] * WorkPath: /var/lib/gitea
|
||||||
|
gitea[5967]: 2026/09/03 14:50:42 cmd/web.go:119:showWebStartupMessage() [I] * CustomPath: /var/lib/gitea/custom
|
||||||
|
gitea[5967]: 2026/09/03 14:50:42 cmd/web.go:120:showWebStartupMessage() [I] * ConfigFile: /etc/gitea/app.ini
|
||||||
|
gitea[5967]: 2026/09/03 14:50:42 cmd/web.go:121:showWebStartupMessage() [I] Prepare to run install page
|
||||||
|
gitea[5967]: 2026/09/03 14:50:42 cmd/web.go:329:listen() [I] Listen: http://0.0.0.0:3000
|
||||||
|
gitea[5967]: 2026/09/03 14:50:42 cmd/web.go:333:listen() [I] AppURL(ROOT_URL): http://localhost:3000/
|
||||||
|
gitea[5967]: 2026/09/03 14:50:42 modules/graceful/server.go:52:NewServer() [I] Starting new Web server: tcp:0.0.0.0:3000 on PID: 2
|
||||||
|
```
|
||||||
@@ -10,13 +10,13 @@ aliases:
|
|||||||
|
|
||||||
# Protected branches
|
# Protected branches
|
||||||
|
|
||||||
Protected branches prevent unwanted changes by enforcing push and merge policies on selected branches. The rules are enforced for every Git protocol (HTTP(S), SSH), the web editor, the API, and background jobs such as auto-merge. Only repository owners and administrators can manage the rules, and the Branches page is read-only while a repository is archived.
|
Protected branches prevent unwanted changes by enforcing push, deletion, and merge policies on selected branches. The rules are enforced for every Git protocol (HTTP(S), SSH), the web editor, the API, and background jobs such as auto-merge. Only repository owners and administrators can manage the rules, and the Branches page is read-only while a repository is archived.
|
||||||
|
|
||||||
## Creating or editing a rule
|
## Creating or editing a rule
|
||||||
|
|
||||||
1. Open the repository and select **Settings → Branches** (repository admin permission required).
|
1. Open the repository and select **Settings → Branches** (repository admin permission required).
|
||||||
2. Select **Add new rule** or **Edit** next to an existing rule.
|
2. Select **Add new rule** or **Edit** next to an existing rule.
|
||||||
3. Fill in the **Protected branch name pattern** and optional file patterns, then configure the push, merge, and review options described below.
|
3. Fill in the **Protected branch name pattern** and optional file patterns, then configure the push, deletion, merge, and review options described below.
|
||||||
4. Select **Save rule**.
|
4. Select **Save rule**.
|
||||||
|
|
||||||
The rule immediately applies to all matching branches, even if the branches are created in the future.
|
The rule immediately applies to all matching branches, even if the branches are created in the future.
|
||||||
@@ -48,7 +48,9 @@ The **Push** section controls direct pushes (including the web editor and API).
|
|||||||
|
|
||||||
- **Disable push** makes the branch read-only. Any attempt to push directly fails, and changes must be merged through pull requests.
|
- **Disable push** makes the branch read-only. Any attempt to push directly fails, and changes must be merged through pull requests.
|
||||||
- **Enable push** allows anyone with [write access](./permissions.md) to push (force pushes are still blocked unless explicitly allowed).
|
- **Enable push** allows anyone with [write access](./permissions.md) to push (force pushes are still blocked unless explicitly allowed).
|
||||||
- **Allowlist restricted push** requires being on the allowlist. Choose users and, for organization-owned repositories, teams. Deploy keys that already have write access can also be allowlisted.
|
- **Allowlist restricted push** requires being on the allowlist. Choose users and, for organization-owned repositories, teams.
|
||||||
|
|
||||||
|
The user allowlists for push, force-push and deletion can include the **Gitea Actions** and **Deploy Key** system users. They still require write access; **Deploy Key** also covers deploy tokens.
|
||||||
|
|
||||||
When a push is blocked, the server-side hook rejects the update with an explanation.
|
When a push is blocked, the server-side hook rejects the update with an explanation.
|
||||||
|
|
||||||
@@ -58,7 +60,17 @@ Force pushes have their own set of options:
|
|||||||
|
|
||||||
- **Disable force push** completely forbids rewriting history on the branch.
|
- **Disable force push** completely forbids rewriting history on the branch.
|
||||||
- **Enable force push** allows anyone who can push to also force push.
|
- **Enable force push** allows anyone who can push to also force push.
|
||||||
- **Allowlist restricted force push** limits force pushes to a separate allowlist (users, teams, and optionally deploy keys) **and** requires the person to already have regular push access.
|
- **Allowlist restricted force push** limits force pushes to a separate allowlist of users or teams **and** requires regular push access.
|
||||||
|
|
||||||
|
## Branch deletion
|
||||||
|
|
||||||
|
The **Branch Deletion** section controls whether matching protected branches can be deleted:
|
||||||
|
|
||||||
|
- **Disable branch deletion** prevents deletion. This is the default.
|
||||||
|
- **Enable branch deletion** allows anyone who can push to delete the branch.
|
||||||
|
- **Allowlist restricted branch deletion** limits deletion to a separate allowlist of users or teams **and** requires regular push access.
|
||||||
|
|
||||||
|
These rules apply to Git (`git push --delete`), the API, the web interface and post-merge cleanup. The default branch and configured default pull request target branch cannot be deleted.
|
||||||
|
|
||||||
## Pull request merges and approvals
|
## Pull request merges and approvals
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
date: "2026-08-30T00:00:00+02:00"
|
||||||
|
slug: "artifacts"
|
||||||
|
sidebar_position: 70
|
||||||
|
---
|
||||||
|
|
||||||
|
# Artifacts
|
||||||
|
|
||||||
|
Workflow runs can store files such as test results, coverage reports, and build output as artifacts. Artifacts are uploaded by workflows, for example with [`actions/upload-artifact`](https://github.com/actions/upload-artifact), and appear on the run page after the upload completes.
|
||||||
|
|
||||||
|
## Previewing artifacts
|
||||||
|
|
||||||
|
Select an artifact on the run page to open its file browser and preview in the same tab. The preview identifies the originating run and attempt, and provides links back to that run and to download the complete artifact. Selecting files in the browser updates the preview in the same tab.
|
||||||
|
|
||||||
|
Artifact previews:
|
||||||
|
|
||||||
|
- require sign-in and access to the Actions run to open the preview page
|
||||||
|
- render text-based files, images (including SVG), and PDFs
|
||||||
|
- run HTML and JavaScript content in a sandboxed frame
|
||||||
|
|
||||||
|
Preview content is loaded through signed URLs that expire after one hour and do not require a session cookie. Reopen the preview page to obtain a fresh URL after it expires.
|
||||||
|
|
||||||
|
The file browser lists up to 2,000 files per artifact. Larger artifacts show a notice when the list is truncated.
|
||||||
|
|
||||||
|
Unsupported or oversized files can still be downloaded with the complete artifact.
|
||||||
|
|
||||||
|
## Instance configuration
|
||||||
|
|
||||||
|
Site administrators can limit the total artifact size that can be browsed or previewed with `ARTIFACT_PREVIEW_MAX_SIZE` in the `[actions]` section of `app.ini`. The default is 10 MiB. Set it to `0` to disable previews or `-1` to allow artifacts of any size.
|
||||||
|
|
||||||
|
The size of an individual previewed file is also limited by [`MAX_DISPLAY_FILE_SIZE`](../../administration/config-cheat-sheet.md#ui-ui) in the `[ui]` section.
|
||||||
@@ -6,104 +6,94 @@ sidebar_position: 120
|
|||||||
|
|
||||||
# Compared to GitHub Actions
|
# Compared to GitHub Actions
|
||||||
|
|
||||||
Even though Gitea Actions is designed to be compatible with GitHub Actions, there are some differences between them.
|
Gitea Actions is designed to be compatible with GitHub Actions, with the differences below.
|
||||||
|
|
||||||
## Additional features
|
## Additional features
|
||||||
|
|
||||||
### Absolute action URLs
|
### Absolute action URLs
|
||||||
|
|
||||||
Gitea Actions supports defining actions via absolute URL, which means that you can use actions from any git repository.
|
`uses:` accepts an absolute URL to any git host, e.g. `uses: https://gitea.com/actions/checkout@v4`.
|
||||||
Like `uses: https://github.com/actions/checkout@v4` or `uses: http://your_gitea.com/owner/repo@branch`.
|
|
||||||
|
### Action prefixes
|
||||||
|
|
||||||
|
`uses:` accepts these prefixes:
|
||||||
|
|
||||||
|
- `self:` references your own Gitea instance, e.g. `uses: self:owner/repo@v1` or `uses: self:owner/repo/.gitea/workflows/build.yml@v1`
|
||||||
|
- `builtin:` runs an action built into Gitea Runner, which needs no download and no Node in the job image, e.g. `uses: builtin:checkout`
|
||||||
|
|
||||||
|
`builtin:checkout` accepts the `repository`, `ref`, `token`, `path` and `fetch-depth` inputs of `actions/checkout` with the same defaults, and fails on any other input.
|
||||||
|
|
||||||
|
### Workflow-relative actions
|
||||||
|
|
||||||
|
`$/` references the repository and commit of the workflow, or of the enclosing composite action, e.g. `uses: $/.gitea/actions/build`.
|
||||||
|
Unlike `./`, it needs no checkout first.
|
||||||
|
|
||||||
### Actions written in Go
|
### Actions written in Go
|
||||||
|
|
||||||
Gitea Actions supports writing actions in Go.
|
|
||||||
See [Creating Go Actions](https://blog.gitea.com/creating-go-actions/).
|
See [Creating Go Actions](https://blog.gitea.com/creating-go-actions/).
|
||||||
|
|
||||||
### Support the non-standard syntax @yearly, @monthly, @weekly, @daily, @hourly on schedule
|
### Support the non-standard syntax @yearly, @monthly, @weekly, @daily, @hourly on schedule
|
||||||
|
|
||||||
Github Actions doesn't support that. https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule
|
`schedule` also accepts `@yearly`, `@monthly`, `@weekly`, `@daily` and `@hourly`, which [GitHub does not](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule).
|
||||||
|
|
||||||
## Unsupported workflows syntax
|
## Unsupported workflows syntax
|
||||||
|
|
||||||
### `jobs.<job_id>.environment`
|
### `jobs.<job_id>.environment`
|
||||||
|
|
||||||
See [Workflow syntax for GitHub Actions](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idenvironment).
|
[`jobs.<job_id>.environment`](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idenvironment) is ignored.
|
||||||
|
|
||||||
It's ignored by Gitea Actions now.
|
|
||||||
|
|
||||||
### Complex `runs-on`
|
### Complex `runs-on`
|
||||||
|
|
||||||
See [Workflow syntax for GitHub Actions](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idruns-on).
|
[`runs-on`](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idruns-on) supports:
|
||||||
|
|
||||||
Gitea Actions supports:
|
|
||||||
- Static strings: `runs-on: self-hosted`
|
- Static strings: `runs-on: self-hosted`
|
||||||
- Arrays of labels: `runs-on: [linux, self-hosted]`
|
- Arrays of labels: `runs-on: [linux, self-hosted]`
|
||||||
- String expressions: `runs-on: ${{ github.event_name == 'push' && 'ubuntu-latest' || 'self-hosted' }}`
|
- String expressions: `runs-on: ${{ github.event_name == 'push' && 'ubuntu-latest' || 'self-hosted' }}`
|
||||||
- Arrays containing expressions: `runs-on: [linux, "${{ github.event_name == 'push' && 'ubuntu-latest' || 'self-hosted' }}"]`
|
- Arrays containing expressions: `runs-on: [linux, "${{ github.event_name == 'push' && 'ubuntu-latest' || 'self-hosted' }}"]`
|
||||||
|
|
||||||
|
|
||||||
## Missing features
|
## Missing features
|
||||||
|
|
||||||
### Package repository authorization
|
### Package repository authorization
|
||||||
|
|
||||||
The `GITEA_TOKEN` for a job running within a repository should be able to publish to the associated package repository (i.e. to upload OCI images). See the "packages" scope for the "default access" in [Automatic token authentication](https://docs.github.com/en/actions/security-for-github-actions/security-guides/automatic-token-authentication#permissions-for-the-github_token).
|
`GITEA_TOKEN` cannot publish to the package registry of its repository, e.g. to push OCI images.
|
||||||
|
Use a personal access token instead, see [this issue](https://github.com/go-gitea/gitea/issues/23642#issuecomment-2119876692).
|
||||||
This is not implemented in Gitea Actions now. A workaround for Gitea Actions is to use a Personal Access Token (PAT). See this [github issue and comment](https://github.com/go-gitea/gitea/issues/23642#issuecomment-2119876692) for tracking this feature.
|
|
||||||
|
|
||||||
### Problem Matchers
|
### Problem Matchers
|
||||||
|
|
||||||
Problem Matchers are a way to scan the output of actions for a specified regex pattern and surface that information prominently in the UI.
|
[Problem matchers](https://github.com/actions/toolkit/blob/main/docs/problem-matchers.md) are ignored.
|
||||||
See [Problem matchers](https://github.com/actions/toolkit/blob/main/docs/problem-matchers.md).
|
|
||||||
|
|
||||||
It's ignored by Gitea Actions now.
|
|
||||||
|
|
||||||
### Create an error annotation
|
### Create an error annotation
|
||||||
|
|
||||||
See [Creating an annotation for an error](https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#example-creating-an-annotation-for-an-error)
|
[Error annotations](https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#example-creating-an-annotation-for-an-error) are ignored.
|
||||||
|
|
||||||
It's ignored by Gitea Actions now.
|
|
||||||
|
|
||||||
### Expressions
|
### Expressions
|
||||||
|
|
||||||
For [expressions](https://docs.github.com/en/actions/learn-github-actions/expressions), Gitea Actions supports standard GitHub functions (e.g. `success()`, `failure()`, `always()`, `cancelled()`, `format()`, `toJSON()`) and context variables (like `github`, `matrix`, `vars`, `env`).
|
[Expressions](https://docs.github.com/en/actions/learn-github-actions/expressions) support the standard GitHub functions and contexts.
|
||||||
|
|
||||||
## Missing UI features
|
## Missing UI features
|
||||||
|
|
||||||
### Pre and Post steps
|
### Pre and Post steps
|
||||||
|
|
||||||
Pre and Post steps don't have their own section in the job log user interface.
|
Pre and post steps have no section of their own in the job log.
|
||||||
|
|
||||||
### Services steps
|
### Services steps
|
||||||
|
|
||||||
Services steps don't have their own section in the job log user interface.
|
Service steps have no section of their own in the job log.
|
||||||
|
|
||||||
## Different behavior
|
## Different behavior
|
||||||
|
|
||||||
### Job token permissions (`permissions`)
|
### Job token permissions (`permissions`)
|
||||||
|
|
||||||
Gitea supports `permissions` and `jobs.<job_id>.permissions` to control the default `GITEA_TOKEN` permissions.
|
`permissions` and `jobs.<job_id>.permissions` control the `GITEA_TOKEN` permissions, clamped by the repository and owner settings and further restricted for fork pull requests and cross-repository access.
|
||||||
|
GitHub-only scopes like `statuses`, `checks`, `deployments`, `security-events` and `pages` are not supported, while Gitea adds `code`, `releases`, `wiki` and `projects`. `id-token` works like on GitHub, see [OpenID Connect](openid-connect.md).
|
||||||
The effective permissions are clamped by the repository/owner settings and are further restricted for fork pull requests and cross-repository access.
|
|
||||||
GitHub-only scopes such as `statuses`, `checks`, `deployments`, `id-token`, `security-events`, and `pages` are not supported, while Gitea-specific scopes such as `code`, `releases`, `wiki`, and `projects` are available.
|
|
||||||
|
|
||||||
See [Actions job token permissions](token-permissions.md).
|
See [Actions job token permissions](token-permissions.md).
|
||||||
|
|
||||||
### Downloading actions
|
### Downloading actions
|
||||||
|
|
||||||
Previously (Pre 1.21.0), `[actions].DEFAULT_ACTIONS_URL` defaulted to `https://gitea.com`.
|
Actions without a host, like `uses: actions/checkout@v4`, are downloaded from `https://github.com`, or from your own instance when `[actions].DEFAULT_ACTIONS_URL` is `self`.
|
||||||
We have since restricted this option to only allow two values (`github` and `self`).
|
See the [Configuration Cheat Sheet](../../administration/config-cheat-sheet.md#actions-actions).
|
||||||
When set to `github`, the new default, Gitea will download non-fully-qualified actions from `https://github.com`.
|
For other sources, see [Absolute action URLs](#absolute-action-urls), [Action prefixes](#action-prefixes) and [Workflow-relative actions](#workflow-relative-actions).
|
||||||
For example, if you use `uses: actions/checkout@v4`, it will download the checkout repository from `https://github.com/actions/checkout.git`.
|
|
||||||
|
|
||||||
If you want to download an action from another git hoster, you can use an absolute URL, e.g. `uses: https://gitea.com/actions/checkout@v4`.
|
|
||||||
|
|
||||||
If your Gitea instance is in an intranet or a restricted area, you can set the URL to `self` to only download actions from your own instance by default.
|
|
||||||
Of course, you can still use absolute URLs in workflows.
|
|
||||||
|
|
||||||
More details about the `[actions].DEFAULT_ACTIONS_URL` configuration can be found in the [Configuration Cheat Sheet](../../administration/config-cheat-sheet.md#actions-actions)。
|
|
||||||
|
|
||||||
### Context availability
|
### Context availability
|
||||||
|
|
||||||
Context availability is not checked, so you can use the env context on more places.
|
[Context availability](https://docs.github.com/en/actions/learn-github-actions/contexts#context-availability) is not checked, so contexts like `env` work in more places.
|
||||||
See [Context availability](https://docs.github.com/en/actions/learn-github-actions/contexts#context-availability).
|
|
||||||
@@ -19,7 +19,7 @@ Additionally, the runner will introduce itself to Gitea and declare what kind of
|
|||||||
|
|
||||||
Earlier, we mentioned that `runs-on: ubuntu-latest` in a workflow file means that the job will be run on a runner with the `ubuntu-latest` label.
|
Earlier, we mentioned that `runs-on: ubuntu-latest` in a workflow file means that the job will be run on a runner with the `ubuntu-latest` label.
|
||||||
But how does the runner know to run `ubuntu-latest`? The answer lies in mapping the label to an environment.
|
But how does the runner know to run `ubuntu-latest`? The answer lies in mapping the label to an environment.
|
||||||
That's why when you add custom labels during registration, you will need to input some complex content like `my_custom_label:docker://centos:7`.
|
That's why each label of a runner names an environment, like `my_custom_label:docker://centos:7`.
|
||||||
This means that the runner can take the job which needs to run on `my_custom_label`, and it will run it via a docker container with the image `centos:7`.
|
This means that the runner can take the job which needs to run on `my_custom_label`, and it will run it via a docker container with the image `centos:7`.
|
||||||
|
|
||||||
Docker isn't the only option, though.
|
Docker isn't the only option, though.
|
||||||
@@ -34,7 +34,6 @@ So,
|
|||||||
- `my_custom_label:docker://node:18`: Run jobs labeled with `my_custom_label` using the `node:18` Docker image.
|
- `my_custom_label:docker://node:18`: Run jobs labeled with `my_custom_label` using the `node:18` Docker image.
|
||||||
- `my_custom_label:host`: Run jobs labeled with `my_custom_label` directly on the host.
|
- `my_custom_label:host`: Run jobs labeled with `my_custom_label` directly on the host.
|
||||||
- `my_custom_label`: Same as `my_custom_label:host`.
|
- `my_custom_label`: Same as `my_custom_label:host`.
|
||||||
- `my_custom_label:vm:ubuntu-latest`: (Example only, not implemented) Run jobs labeled with `my_custom_label` using a virtual machine with the `ubuntu-latest` ISO.
|
|
||||||
|
|
||||||
## Communication protocol
|
## Communication protocol
|
||||||
|
|
||||||
@@ -43,7 +42,7 @@ However, we did not think it was a good idea to have Gitea listen on a new port.
|
|||||||
Instead, we wanted to reuse the HTTP port, which means we needed a protocol that is compatible with HTTP.
|
Instead, we wanted to reuse the HTTP port, which means we needed a protocol that is compatible with HTTP.
|
||||||
We chose to use gRPC over HTTP.
|
We chose to use gRPC over HTTP.
|
||||||
|
|
||||||
We use [actions-proto-def](https://gitea.com/gitea/actions-proto-def) and [actions-proto-go](https://gitea.com/gitea/actions-proto-go) to wire them up.
|
The protocol is defined in [actions-proto-def](https://gitea.com/gitea/actions-proto-def), its Go code lives in [actionslib](https://gitea.com/gitea/actionslib).
|
||||||
More information about gRPC can be found on [its website](https://grpc.io/).
|
More information about gRPC can be found on [its website](https://grpc.io/).
|
||||||
|
|
||||||
## Network architecture
|
## Network architecture
|
||||||
@@ -71,7 +70,8 @@ However, if a job container tries to fetch code from localhost, it will fail bec
|
|||||||
### Connection 3, runner to internet
|
### Connection 3, runner to internet
|
||||||
|
|
||||||
When you use some actions like `actions/checkout@v4`, the runner downloads the scripts, not the job containers.
|
When you use some actions like `actions/checkout@v4`, the runner downloads the scripts, not the job containers.
|
||||||
By default, it downloads from [github.com](http://github.com/), so it requires access to the internet. If you configure the `DEFAULT_ACTIONS_URL` to `self`, then it will download from your Gitea instance by default. Then it will not connect to internet when downloading the action itself.
|
By default, it downloads them from [github.com](https://github.com/), which requires internet access.
|
||||||
|
With `DEFAULT_ACTIONS_URL` set to `self`, or with `uses: self:owner/repo@ref`, it downloads them from your Gitea instance instead.
|
||||||
It also downloads some docker images from Docker Hub by default, which also requires internet access.
|
It also downloads some docker images from Docker Hub by default, which also requires internet access.
|
||||||
|
|
||||||
However, internet access is not strictly necessary.
|
However, internet access is not strictly necessary.
|
||||||
|
|||||||
+17
-69
@@ -27,50 +27,24 @@ Still, this is completely optional since both options have the same effect at th
|
|||||||
|
|
||||||
## Where will the runner download scripts when using actions such as `actions/checkout@v4`?
|
## Where will the runner download scripts when using actions such as `actions/checkout@v4`?
|
||||||
|
|
||||||
There are tens of thousands of [actions scripts](https://github.com/marketplace?type=actions) in GitHub, and when you write `uses: actions/checkout@v4`, it downloads the scripts from [github.com/actions/checkout](http://github.com/actions/checkout) by default.
|
From `https://github.com` by default, or from your own instance when `[actions].DEFAULT_ACTIONS_URL` is `self`, see the [Configuration Cheat Sheet](../../administration/config-cheat-sheet.md#actions-actions).
|
||||||
But what if you want to use actions from other places such as gitea.com instead of GitHub?
|
|
||||||
|
|
||||||
The good news is that you can specify the URL prefix to use actions from anywhere.
|
To use an action from elsewhere, name its host:
|
||||||
This is an extra syntax in Gitea Actions.
|
|
||||||
For example:
|
|
||||||
|
|
||||||
- `uses: https://gitea.com/xxx/xxx@xxx`
|
- `uses: https://gitea.com/owner/repo@ref`
|
||||||
- `uses: https://github.com/xxx/xxx@xxx`
|
- `uses: http://your_gitea_instance.com/owner/repo@ref`
|
||||||
- `uses: http://your_gitea_instance.com/xxx@xxx`
|
- `uses: self:owner/repo@ref` for your own Gitea instance
|
||||||
|
|
||||||
Be careful, the `https://` or `http://` prefix is necessary!
|
|
||||||
|
|
||||||
This is one of the differences from GitHub Actions which supports actions scripts only from GitHub.
|
|
||||||
But it should allow users much more flexibility in how they run Actions.
|
|
||||||
|
|
||||||
Alternatively, if you want your runners to download actions from your own Gitea instance by default, you can configure it by setting `[actions].DEFAULT_ACTIONS_URL`.
|
|
||||||
See [Configuration Cheat Sheet](../../administration/config-cheat-sheet.md#actions-actions).
|
|
||||||
|
|
||||||
## How to limit the permission of the runners?
|
## How to limit the permission of the runners?
|
||||||
|
|
||||||
Runners have no more permissions than simply connecting to your Gitea instance.
|
Runners only connect to your Gitea instance.
|
||||||
When any runner receives a job to run, it will temporarily gain limited permission to the repository associated with the job.
|
For each job, a runner gets a `GITEA_TOKEN` limited to the job's repository, see [Actions job token permissions](token-permissions.md).
|
||||||
If you want to give more permissions to the runner, allowing it to access more private repositories or external systems, you can pass [secrets](usage/actions/secrets.md) to it.
|
To give a job access to more private repositories or external systems, pass it [secrets](usage/actions/secrets.md).
|
||||||
|
|
||||||
Refined permission control to Actions is a complicated job.
|
|
||||||
In the future, we will add more options to Gitea to make it more configurable, such as allowing more write access to repositories or read access to all repositories in the same organization.
|
|
||||||
|
|
||||||
## Which operating systems are supported by Gitea Runner?
|
## Which operating systems are supported by Gitea Runner?
|
||||||
|
|
||||||
We released official binaries for Linux, macOS, and Windows.
|
Official binaries are released for Linux, macOS and Windows.
|
||||||
While other operating systems are theoretically supported if it is supported by golang and docker(docker mode enabled).
|
Other systems supported by Go and Docker work in theory.
|
||||||
|
|
||||||
One thing to note is that if you choose to run jobs directly on the host instead of in job containers, the environmental differences between operating systems may cause unexpected failures.
|
|
||||||
|
|
||||||
For example, bash is not available on Windows in most cases, while act tries to use bash to run scripts by default.
|
|
||||||
Therefore, you need to specify `powershell` as the default shell in your workflow file, see [defaults.run](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#defaultsrun).
|
|
||||||
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
shell: powershell
|
|
||||||
```
|
|
||||||
|
|
||||||
## How to avoid being hacked?
|
## How to avoid being hacked?
|
||||||
|
|
||||||
@@ -99,42 +73,13 @@ It is exciting to be able to reuse them.
|
|||||||
|
|
||||||
## What if it runs on multiple labels, such as `runs-on: [label_a, label_b]`?
|
## What if it runs on multiple labels, such as `runs-on: [label_a, label_b]`?
|
||||||
|
|
||||||
This is valid syntax.
|
The job runs on a runner that has all of the labels, as on [GitHub](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idruns-on).
|
||||||
It means that it should run on runners that have both the `label_a` **and** `label_b` labels, see [Workflow syntax for GitHub Actions](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idruns-on).
|
The runner uses the environment of the first label it has.
|
||||||
Unfortunately, the runner does not work this way until v0.2.11.
|
|
||||||
As mentioned, we map labels to environments:
|
|
||||||
|
|
||||||
- `ubuntu` → `ubuntu:22.04`
|
|
||||||
- `centos` → `centos:8`
|
|
||||||
|
|
||||||
But we need to map label groups to environments instead, like so:
|
|
||||||
|
|
||||||
- `[ubuntu]` → `ubuntu:22.04`
|
|
||||||
- `[with-gpu]` → `linux:with-gpu`
|
|
||||||
- `[ubuntu, with-gpu]` → `ubuntu:22.04_with-gpu`
|
|
||||||
|
|
||||||
We also need to re-design how tasks are assigned to runners.
|
|
||||||
A runner with `ubuntu`, `centos`, or `with-gpu` does not necessarily indicate that it can accept jobs with `[centos, with-gpu]`.
|
|
||||||
Therefore, the runner should inform the Gitea instance that it can only accept jobs with `[ubuntu]`, `[centos]`, `[with-gpu]`, and `[ubuntu, with-gpu]`.
|
|
||||||
This is not a technical problem, it was just overlooked in the early design.
|
|
||||||
See [runtime.go#L65](https://gitea.com/gitea/runner/src/commit/90b8cc6a7a48f45cc28b5ef9660ebf4061fcb336/runtime/runtime.go#L65).
|
|
||||||
|
|
||||||
Currently, the runner attempts to match everyone in the labels and uses the first match it finds.
|
|
||||||
|
|
||||||
## What is the difference between agent labels and custom labels for a runner?
|
## What is the difference between agent labels and custom labels for a runner?
|
||||||
|
|
||||||

|
Gitea no longer has custom labels.
|
||||||
|
A runner declares its labels every time it starts, from its `runner.labels` configuration or the labels given at registration, so change them there and restart the runner.
|
||||||
Agent labels are reported to the Gitea instance by the runner during registration.
|
|
||||||
Custom labels, on the other hand, are added manually by a Gitea administrator or owners of the organization or repository (depending on the level of the runner).
|
|
||||||
|
|
||||||
However, the design here needs improvement, as it currently has some rough edges.
|
|
||||||
You can add a custom label such as `centos` to a registered runner, which means the runner will receive jobs with `runs-on: centos`.
|
|
||||||
However, the runner may not know which environment to use for this label, resulting in it using a default image or leading to a logical dead end.
|
|
||||||
This default may not match user expectations.
|
|
||||||
See [runtime.go#L71](https://gitea.com/gitea/runner/src/commit/90b8cc6a7a48f45cc28b5ef9660ebf4061fcb336/runtime/runtime.go#L71).
|
|
||||||
|
|
||||||
In the meantime, we suggest that you re-register your runner if you want to change its labels.
|
|
||||||
|
|
||||||
## Will there be more implementations for Gitea Actions runner?
|
## Will there be more implementations for Gitea Actions runner?
|
||||||
|
|
||||||
@@ -177,3 +122,6 @@ For events supported only by GitHub, see GitHub's [documentation](https://docs.g
|
|||||||
|
|
||||||
Go to the repository's **Settings** > **Actions** > **General** page and add collaborative owners.
|
Go to the repository's **Settings** > **Actions** > **General** page and add collaborative owners.
|
||||||
The private repositories of collaborative owners are allowed to access the actions and workflows in the current repository.
|
The private repositories of collaborative owners are allowed to access the actions and workflows in the current repository.
|
||||||
|
|
||||||
|
To share within the same user or organization, add the private repositories under its **Settings** > **Actions** > **General** > **Cross-Repository Access** instead.
|
||||||
|
See [Cross-repository access](token-permissions.md#cross-repository-access).
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
---
|
||||||
|
date: "2026-08-23T00:00:00+00:00"
|
||||||
|
slug: "openid-connect"
|
||||||
|
sidebar_position: 40
|
||||||
|
---
|
||||||
|
|
||||||
|
# OpenID Connect
|
||||||
|
|
||||||
|
Jobs can request short-lived OpenID Connect (OIDC) tokens to sign in to cloud providers and other services without storing long-lived secrets. The tokens use the GitHub Actions format, so actions like `aws-actions/configure-aws-credentials`, `google-github-actions/auth` and `azure/login` work unchanged.
|
||||||
|
|
||||||
|
## Trusting Gitea
|
||||||
|
|
||||||
|
Add Gitea as an OIDC identity provider in the service:
|
||||||
|
|
||||||
|
- Issuer: `<ROOT_URL>/api/actions/oidc`
|
||||||
|
- Audience: `<ROOT_URL>/<owner>`, unless the workflow requests another one
|
||||||
|
|
||||||
|
Then limit which workflows can sign in with a condition on the [`sub` claim](#claims).
|
||||||
|
|
||||||
|
Gitea signs the tokens with a key it creates at `<APP_DATA_PATH>/jwt/actions_oidc.pem`. Instances behind a load balancer must share this file.
|
||||||
|
|
||||||
|
## Requesting a token
|
||||||
|
|
||||||
|
Grant the `id-token` permission to the workflow or job:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
permissions:
|
||||||
|
id-token: write
|
||||||
|
```
|
||||||
|
|
||||||
|
Default permissions never include it, and jobs from fork pull requests never get it. Owners and repositories can disable it with their [maximum token permissions](token-permissions.md#maximum-token-permissions-clamping).
|
||||||
|
|
||||||
|
Actions like the ones above request the token themselves. In a script, use `ACTIONS_ID_TOKEN_REQUEST_URL` and `ACTIONS_ID_TOKEN_REQUEST_TOKEN`:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
curl --fail --silent --show-error \
|
||||||
|
--header "Authorization: Bearer ${ACTIONS_ID_TOKEN_REQUEST_TOKEN}" \
|
||||||
|
"${ACTIONS_ID_TOKEN_REQUEST_URL}&audience=my-service"
|
||||||
|
```
|
||||||
|
|
||||||
|
The token is in the `value` field of the response and expires after five minutes.
|
||||||
|
|
||||||
|
## Claims
|
||||||
|
|
||||||
|
The `sub` claim names the owner and repository with their IDs, so a renamed or recreated repository cannot match an existing trust policy:
|
||||||
|
|
||||||
|
```text
|
||||||
|
repo:<owner>@<owner-id>/<repo>@<repo-id>:ref:<ref>
|
||||||
|
repo:<owner>@<owner-id>/<repo>@<repo-id>:pull_request
|
||||||
|
```
|
||||||
|
|
||||||
|
The `pull_request` event uses the second form, all other events use the first, including `pull_request_target`.
|
||||||
|
|
||||||
|
The other claims match GitHub's, like `repository`, `ref`, `sha`, `workflow_ref` and `job_workflow_ref`. The discovery document at `<ROOT_URL>/api/actions/oidc/.well-known/openid-configuration` lists them all.
|
||||||
|
|
||||||
|
Differences from GitHub Actions:
|
||||||
|
|
||||||
|
- There is no `environment` claim.
|
||||||
|
- Pull request runs use `refs/pull/<index>/head` and its commit, not the merge ref and merge commit.
|
||||||
|
- `run_number` counts runs per repository, not per workflow.
|
||||||
@@ -40,7 +40,7 @@ However, it is recommended to use Docker to run the jobs, because it is more sec
|
|||||||
Before running a runner, you should first register it to your Gitea instance using the following command:
|
Before running a runner, you should first register it to your Gitea instance using the following command:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./runner register --no-interactive --instance <instance> --token <token>
|
gitea-runner register --no-interactive --instance <instance> --token <token>
|
||||||
```
|
```
|
||||||
|
|
||||||
There are two arguments required, `instance` and `token`.
|
There are two arguments required, `instance` and `token`.
|
||||||
@@ -69,7 +69,7 @@ If this file is missing or corrupted, you can simply remove it and register agai
|
|||||||
Finally, it's time to start the runner:
|
Finally, it's time to start the runner:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./runner daemon
|
gitea-runner daemon
|
||||||
```
|
```
|
||||||
|
|
||||||
And you can see the new runner in the management page:
|
And you can see the new runner in the management page:
|
||||||
|
|||||||
@@ -102,8 +102,8 @@ Only a workflow that runs on an event that posts a commit status (`push`, `pull_
|
|||||||
|
|
||||||
Scoped workflows can call reusable workflows:
|
Scoped workflows can call reusable workflows:
|
||||||
|
|
||||||
- A **local** reference (`uses: ./...`) resolves against the **source** repository: the repository the calling workflow's content came from, not the consuming repository.
|
- A **local** reference (`uses: ./...` or `uses: $/...`) resolves against the **source** repository: the repository the calling workflow's content came from, not the consuming repository.
|
||||||
- A **cross-repository** reference (`uses: owner/repo/...@ref`) is resolved with the **consuming repository's** read permission. If it points to a private repository, make sure every consuming repository can read it; otherwise the workflow will fail there.
|
- A **cross-repository** reference (`uses: owner/repo/...@ref` or `uses: self:owner/repo/...@ref`) is resolved with the **consuming repository's** read permission. If it points to a private repository, make sure every consuming repository can read it; otherwise the workflow will fail there.
|
||||||
|
|
||||||
A reusable workflow can live under `SCOPED_WORKFLOW_DIRS` (or `WORKFLOW_DIRS`) of the source repository.
|
A reusable workflow can live under `SCOPED_WORKFLOW_DIRS` (or `WORKFLOW_DIRS`) of the source repository.
|
||||||
|
|
||||||
|
|||||||
@@ -53,13 +53,14 @@ Valid access mode values for each scope are `read`, `write`, and `none`.
|
|||||||
- `wiki`
|
- `wiki`
|
||||||
- `projects`
|
- `projects`
|
||||||
- `packages` (if supported by the target feature)
|
- `packages` (if supported by the target feature)
|
||||||
|
- `id-token` (`write` allows requesting [OpenID Connect tokens](openid-connect.md), `read` grants nothing)
|
||||||
|
|
||||||
If you specify both `contents` and a more granular scope (like `code` or `releases`), the granular scope wins for that unit.
|
If you specify both `contents` and a more granular scope (like `code` or `releases`), the granular scope wins for that unit.
|
||||||
|
|
||||||
### Compatibility notes
|
### Compatibility notes
|
||||||
|
|
||||||
Gitea supports a subset of GitHub Actions permission scopes.
|
Gitea supports a subset of GitHub Actions permission scopes.
|
||||||
GitHub-only scopes such as `statuses`, `checks`, `deployments`, `id-token`, `security-events`, and `pages` are not currently supported by Gitea Actions.
|
GitHub-only scopes such as `statuses`, `checks`, `deployments`, `security-events`, and `pages` are not currently supported by Gitea Actions.
|
||||||
|
|
||||||
Gitea also exposes repository-unit scopes that do not exist as separate scopes in GitHub Actions:
|
Gitea also exposes repository-unit scopes that do not exist as separate scopes in GitHub Actions:
|
||||||
|
|
||||||
@@ -75,15 +76,18 @@ If neither the workflow nor the job defines `permissions:`, Gitea uses the confi
|
|||||||
- **Permissive**: read and write permissions for most units in the job's repository (backwards-compatible default).
|
- **Permissive**: read and write permissions for most units in the job's repository (backwards-compatible default).
|
||||||
- **Restricted**: read-only permissions for `code`, `releases`, and `packages` in the job's repository, and no access to other units by default.
|
- **Restricted**: read-only permissions for `code`, `releases`, and `packages` in the job's repository, and no access to other units by default.
|
||||||
|
|
||||||
|
Neither mode includes `id-token`.
|
||||||
|
|
||||||
## Maximum token permissions (clamping)
|
## Maximum token permissions (clamping)
|
||||||
|
|
||||||
You can configure a maximum permission per repository unit.
|
You can configure a maximum permission per repository unit and for `id-token`.
|
||||||
The job's effective permissions are computed as:
|
The job's effective permissions are computed as:
|
||||||
|
|
||||||
`effective = min(requested, maximum)`
|
`effective = min(requested, maximum)`
|
||||||
|
|
||||||
This means workflows can reduce permissions for a job, but cannot exceed your configured maximum.
|
This means workflows can reduce permissions for a job, but cannot exceed your configured maximum.
|
||||||
If you don't configure a maximum, the maximum defaults to `write` for all scopes.
|
If you don't configure a maximum, the maximum defaults to `write` for all scopes.
|
||||||
|
Maximums saved before Gitea supported `id-token` deny it until you set it to `write`.
|
||||||
|
|
||||||
## Where to configure
|
## Where to configure
|
||||||
|
|
||||||
@@ -95,9 +99,13 @@ You can configure defaults and maximums at:
|
|||||||
|
|
||||||
Note: Repository-level token permission settings are only shown once **Repository Actions** are enabled.
|
Note: Repository-level token permission settings are only shown once **Repository Actions** are enabled.
|
||||||
|
|
||||||
|
## Protected branches
|
||||||
|
|
||||||
|
Actions job tokens must have code write permission and satisfy [branch protection rules](../access-control/protected-branches.md), including any **Gitea Actions** allowlist requirements.
|
||||||
|
|
||||||
## Fork pull requests
|
## Fork pull requests
|
||||||
|
|
||||||
For security reasons, workflows triggered by pull requests from forks are always restricted to read-only permissions for repository contents, regardless of workflow `permissions:` or settings.
|
For security reasons, workflows triggered by pull requests from forks are always restricted to read-only permissions for repository contents, regardless of workflow `permissions:` or settings. They also get no OpenID Connect tokens.
|
||||||
|
|
||||||
## Cross-repository access
|
## Cross-repository access
|
||||||
|
|
||||||
|
|||||||
@@ -9,53 +9,67 @@ sidebar_position: 25
|
|||||||
## Environment variables
|
## Environment variables
|
||||||
|
|
||||||
These environment variables are set automatically in every workflow run and can be accessed directly (e.g. `$CI` in shell scripts).
|
These environment variables are set automatically in every workflow run and can be accessed directly (e.g. `$CI` in shell scripts).
|
||||||
|
A `GITEA_*` name listed with a `GITHUB_*` name holds the same value.
|
||||||
|
|
||||||
| Name | Description | Example |
|
| Name | Description | Example |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
| `ACT` | Always set to `true`, unless the runner is configured with `runner.set_act_env: false`. | `true` |
|
||||||
| `CI` | Always set to `true`. | `true` |
|
| `CI` | Always set to `true`. | `true` |
|
||||||
| `GITEA_ACTIONS` | Always set to `true`. Useful to distinguish Gitea Actions from other CI systems. | `true` |
|
| `GITEA_ACTION`<br/>`GITHUB_ACTION` | The `id` of the current step, or its index when it has none. | `0` |
|
||||||
| `GITEA_ACTIONS_RUNNER_VERSION` | The version of the runner executing the workflow. | `1.0.8` |
|
| `GITEA_ACTION_PATH`<br/>`GITHUB_ACTION_PATH` | The path where the action is located. Only set in composite actions. | `/var/run/act/actions/***` |
|
||||||
| `GITEA_DOCKER_WORKSPACE` | The workspace path as the Docker daemon sees it, for bind mounts into containers a job starts, e.g. `${GITEA_DOCKER_WORKSPACE:-.}/data:/app/data` in a compose file. Only set for jobs running in a container. | `/var/lib/docker/volumes/GITEA-ACTIONS-TASK-42_***/_data` |
|
| `GITEA_ACTION_REF`<br/>`GITHUB_ACTION_REF` | The ref of the action being executed. | `v4` |
|
||||||
| `GITEA_ENV`<br/>`GITHUB_ENV` | Path to the file that sets environment variables for subsequent steps. | `/home/runner/work/_temp/_runner_file_commands/set_env_***` |
|
| `GITEA_ACTION_REPOSITORY`<br/>`GITHUB_ACTION_REPOSITORY` | The owner and repository of the action. | `actions/checkout` |
|
||||||
| `GITEA_OUTPUT`<br/>`GITHUB_OUTPUT` | Path to the file that sets step output parameters. | `/home/runner/work/_temp/_runner_file_commands/set_output_***` |
|
| `GITEA_ACTIONS`<br/>`GITHUB_ACTIONS` | Always set to `true`. `GITEA_ACTIONS` is useful to distinguish Gitea Actions from other CI systems. | `true` |
|
||||||
| `GITEA_PATH`<br/>`GITHUB_PATH` | Path to the file that adds system `PATH` entries for subsequent steps. | `/home/runner/work/_temp/_runner_file_commands/add_path_***` |
|
| `GITEA_ACTIONS_RUNNER_VERSION` | The version of the runner executing the workflow. | `v5.2.4` |
|
||||||
| `GITEA_STATE`<br/>`GITHUB_STATE` | Path to the file that sets step state variables. | `/home/runner/work/_temp/_runner_file_commands/save_state_***` |
|
| `GITEA_ACTOR`<br/>`GITHUB_ACTOR` | The username of the user that triggered the workflow. | `alice` |
|
||||||
| `GITEA_STEP_SUMMARY`<br/>`GITHUB_STEP_SUMMARY` | Path to the file for writing job summaries. | `/home/runner/work/_temp/_runner_file_commands/step_summary_***` |
|
| `GITEA_ACTOR_ID`<br/>`GITHUB_ACTOR_ID` | The ID of the user that triggered the workflow. | `1` |
|
||||||
| `GITHUB_ACTIONS` | Always set to `true`. | `true` |
|
| `GITEA_API_URL`<br/>`GITHUB_API_URL` | The URL of the REST API. | `https://gitea.example.com/api/v1` |
|
||||||
| `GITHUB_ACTION` | The name of the action currently running, or the step `id`. | `__run` |
|
| `GITEA_BASE_REF`<br/>`GITHUB_BASE_REF` | The target branch of a pull request. | `main` |
|
||||||
| `GITHUB_ACTION_PATH` | The path where the action is located. | `/home/runner/work/_actions/actions/checkout/v4` |
|
| `GITEA_DOCKER_WORKSPACE` | The workspace path as the Docker daemon sees it, for bind mounts into containers a job starts, e.g. `${GITEA_DOCKER_WORKSPACE:-.}/data:/app/data` in a compose file. Only set for jobs running in a container. | `/var/lib/docker/volumes/GITEA-ACTIONS-TASK-42-***/_data` |
|
||||||
| `GITHUB_ACTION_REF` | The ref of the action being executed. | `v4` |
|
| `GITEA_ENV`<br/>`GITHUB_ENV` | Path to the file that sets environment variables for subsequent steps. | `/var/run/act/workflow/envs.txt` |
|
||||||
| `GITHUB_ACTION_REPOSITORY` | The owner and repository of the action. | `actions/checkout` |
|
| `GITEA_EVENT_NAME`<br/>`GITHUB_EVENT_NAME` | The name of the event that triggered the workflow. | `push` |
|
||||||
| `GITHUB_ACTOR` | The username of the user that triggered the workflow. | `silverwind` |
|
| `GITEA_EVENT_PATH`<br/>`GITHUB_EVENT_PATH` | Path to the file containing the event webhook payload. | `/var/run/act/workflow/event.json` |
|
||||||
| `GITHUB_API_URL` | The URL of the REST API. | `https://gitea.com/api/v1` |
|
| `GITEA_GRAPHQL_URL`<br/>`GITHUB_GRAPHQL_URL` | Empty in Gitea (GraphQL is not supported). | _(empty)_ |
|
||||||
| `GITHUB_BASE_REF` | The target branch of a pull request. | `main` |
|
| `GITEA_HEAD_REF`<br/>`GITHUB_HEAD_REF` | The source branch of a pull request. | `feature-branch` |
|
||||||
| `GITHUB_EVENT_NAME` | The name of the event that triggered the workflow. | `push` |
|
| `GITEA_JOB`<br/>`GITHUB_JOB` | The `job_id` of the current job. | `build` |
|
||||||
| `GITHUB_EVENT_PATH` | Path to the file containing the event webhook payload. | `/home/runner/work/_temp/_github_workflow/event.json` |
|
| `GITEA_OUTPUT`<br/>`GITHUB_OUTPUT` | Path to the file that sets step output parameters. | `/var/run/act/workflow/outputcmd.txt` |
|
||||||
| `GITHUB_GRAPHQL_URL` | Empty in Gitea (GraphQL is not supported). | _(empty)_ |
|
| `GITEA_PATH`<br/>`GITHUB_PATH` | Path to the file that adds system `PATH` entries for subsequent steps. | `/var/run/act/workflow/pathcmd.txt` |
|
||||||
| `GITHUB_HEAD_REF` | The source branch of a pull request. | `feature-branch` |
|
| `GITEA_REF`<br/>`GITHUB_REF` | The fully-formed ref that triggered the workflow. | `refs/heads/main` |
|
||||||
| `GITHUB_JOB` | The `job_id` of the current job. | `build` |
|
| `GITEA_REF_NAME`<br/>`GITHUB_REF_NAME` | The short ref name. | `main` |
|
||||||
| `GITHUB_REF` | The fully-formed ref that triggered the workflow. | `refs/heads/main` |
|
| `GITEA_REF_PROTECTED`<br/>`GITHUB_REF_PROTECTED` | `true` if branch protections are configured for the ref that triggered the workflow. | `true` |
|
||||||
| `GITHUB_REF_NAME` | The short ref name. | `main` |
|
| `GITEA_REF_TYPE`<br/>`GITHUB_REF_TYPE` | The type of ref: `branch` or `tag`. | `branch` |
|
||||||
| `GITHUB_REF_TYPE` | The type of ref: `branch` or `tag`. | `branch` |
|
| `GITEA_REPOSITORY`<br/>`GITHUB_REPOSITORY` | The owner and repository name. | `owner/repo` |
|
||||||
| `GITHUB_REPOSITORY` | The owner and repository name. | `gitea/docs` |
|
| `GITEA_REPOSITORY_ID`<br/>`GITHUB_REPOSITORY_ID` | The ID of the repository. | `123` |
|
||||||
| `GITHUB_REPOSITORY_OWNER` | The repository owner's username. | `gitea` |
|
| `GITEA_REPOSITORY_OWNER`<br/>`GITHUB_REPOSITORY_OWNER` | The repository owner's username. | `owner` |
|
||||||
| `GITHUB_RETENTION_DAYS` | The number of days that workflow run logs and artifacts are kept. | `90` |
|
| `GITEA_REPOSITORY_OWNER_ID`<br/>`GITHUB_REPOSITORY_OWNER_ID` | The ID of the repository owner. | `45` |
|
||||||
| `GITHUB_RUN_ATTEMPT` | The attempt number of the workflow run. | `1` |
|
| `GITEA_RETENTION_DAYS`<br/>`GITHUB_RETENTION_DAYS` | The number of days that artifacts are kept, empty when kept forever. | `90` |
|
||||||
| `GITHUB_RUN_ID` | A unique number for each workflow run. | `1234` |
|
| `GITEA_RUN_ATTEMPT`<br/>`GITHUB_RUN_ATTEMPT` | The attempt number of the workflow run. | `1` |
|
||||||
| `GITHUB_RUN_NUMBER` | A unique number for each run of a particular workflow. | `42` |
|
| `GITEA_RUN_ID`<br/>`GITHUB_RUN_ID` | A unique number for each workflow run. | `1234` |
|
||||||
| `GITHUB_SERVER_URL` | The URL of the Gitea instance. | `https://gitea.com` |
|
| `GITEA_RUN_NUMBER`<br/>`GITHUB_RUN_NUMBER` | A unique number for each run of a particular workflow. | `42` |
|
||||||
| `GITHUB_SHA` | The commit SHA that triggered the workflow. | `a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2` |
|
| `GITEA_SERVER_URL`<br/>`GITHUB_SERVER_URL` | The URL of the Gitea instance. | `https://gitea.example.com` |
|
||||||
| `GITHUB_WORKFLOW` | The name of the workflow. | `CI` |
|
| `GITEA_SHA`<br/>`GITHUB_SHA` | The commit SHA that triggered the workflow. | `a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2` |
|
||||||
| `GITHUB_WORKSPACE` | The default working directory on the runner. | `/workspace/gitea/docs` |
|
| `GITEA_STATE`<br/>`GITHUB_STATE` | Path to the file that sets step state variables. | `/var/run/act/workflow/statecmd.txt` |
|
||||||
|
| `GITEA_STEP_SUMMARY`<br/>`GITHUB_STEP_SUMMARY` | Path to the file for writing job summaries. | `/var/run/act/workflow/step-summary-0.md` |
|
||||||
|
| `GITEA_TRIGGERING_ACTOR`<br/>`GITHUB_TRIGGERING_ACTOR` | The username of the user that initiated the workflow run. May differ from `GITEA_ACTOR` on re-runs. | `alice` |
|
||||||
|
| `GITEA_WORKFLOW`<br/>`GITHUB_WORKFLOW` | The name of the workflow. | `CI` |
|
||||||
|
| `GITEA_WORKFLOW_SHA`<br/>`GITHUB_WORKFLOW_SHA` | The commit SHA of the workflow file. | `a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2` |
|
||||||
|
| `GITEA_WORKSPACE`<br/>`GITHUB_WORKSPACE` | The default working directory on the runner. | `/workspace/owner/repo` |
|
||||||
|
| `TRACEPARENT` | The W3C trace context of the job's span, so instrumented tools can add spans to the job's trace. Only set when the runner exports traces, see [Monitoring](/runner/monitoring/#opentelemetry). | `00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01` |
|
||||||
|
| `TRACESTATE` | Vendor-specific trace data that accompanies `TRACEPARENT`. Only set when the trace carries any. | `rojo=00f067aa0ba902b7` |
|
||||||
|
|
||||||
### Runner environment variables
|
### Runner environment variables
|
||||||
|
|
||||||
| Name | Description | Example |
|
| Name | Description | Example |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
| `ImageOS` | The OS and release of the job's image, read by `setup-*` actions. | `ubuntu24` |
|
||||||
| `RUNNER_ARCH` | The architecture of the runner. | `X64` |
|
| `RUNNER_ARCH` | The architecture of the runner. | `X64` |
|
||||||
|
| `RUNNER_DEBUG` | Set to `1` when the `ACTIONS_STEP_DEBUG` secret is `true`, unset otherwise. | `1` |
|
||||||
|
| `RUNNER_ENVIRONMENT` | Always set to `self-hosted`. | `self-hosted` |
|
||||||
|
| `RUNNER_NAME` | The name of the runner executing the job. | `my-runner` |
|
||||||
| `RUNNER_OS` | The operating system of the runner. | `Linux` |
|
| `RUNNER_OS` | The operating system of the runner. | `Linux` |
|
||||||
| `RUNNER_TEMP` | Path to a temporary directory on the runner. | `/tmp` |
|
| `RUNNER_TEMP` | Path to a temporary directory on the runner. | `/tmp` |
|
||||||
| `RUNNER_TOOL_CACHE` | Path to the tool cache directory on the runner. | `/opt/hostedtoolcache` |
|
| `RUNNER_TOOL_CACHE` | Path to the tool cache directory on the runner. | `/opt/hostedtoolcache` |
|
||||||
|
| `RUNNER_WORKSPACE` | The parent directory of `GITEA_WORKSPACE`. | `/workspace/owner` |
|
||||||
|
|
||||||
### Internal environment variables
|
### Internal environment variables
|
||||||
|
|
||||||
@@ -64,11 +78,11 @@ These are used internally by the runner and actions. They are typically not need
|
|||||||
| Name | Description | Example |
|
| Name | Description | Example |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `ACTIONS_CACHE_URL` | URL for the actions cache service. | `http://192.168.1.10:8088/` |
|
| `ACTIONS_CACHE_URL` | URL for the actions cache service. | `http://192.168.1.10:8088/` |
|
||||||
| `ACTIONS_ID_TOKEN_REQUEST_TOKEN` | Token for OIDC requests. Only set when configured. | `***` |
|
| `ACTIONS_ID_TOKEN_REQUEST_TOKEN` | Token for OIDC requests. Only set when `id-token: write` is granted. | `***` |
|
||||||
| `ACTIONS_ID_TOKEN_REQUEST_URL` | URL to request OIDC tokens. Only set when configured. | `https://gitea.com/login/oauth/access_token` |
|
| `ACTIONS_ID_TOKEN_REQUEST_URL` | URL to request OIDC tokens. Only set when `id-token: write` is granted. | `https://gitea.example.com/api/actions/oidc/token?` |
|
||||||
| `ACTIONS_RESULTS_URL` | URL for storing artifacts. | `https://gitea.com` |
|
| `ACTIONS_RESULTS_URL` | URL for storing artifacts. | `https://gitea.example.com` |
|
||||||
| `ACTIONS_RUNTIME_TOKEN` | Authentication token for the Actions pipeline API. | `***` |
|
| `ACTIONS_RUNTIME_TOKEN` | Authentication token for the Actions pipeline API. | `***` |
|
||||||
| `ACTIONS_RUNTIME_URL` | URL for the Gitea Actions pipeline API. | `https://gitea.com/api/actions_pipeline/` |
|
| `ACTIONS_RUNTIME_URL` | URL for the Gitea Actions pipeline API. | `https://gitea.example.com/api/actions_pipeline/` |
|
||||||
|
|
||||||
## Context variables
|
## Context variables
|
||||||
|
|
||||||
@@ -76,39 +90,39 @@ These variables are available in workflow expressions via `${{ gitea.<name> }}`.
|
|||||||
|
|
||||||
| Name | Description | Example |
|
| Name | Description | Example |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `gitea.action`<br/>`github.action` | The name of the action currently running, or the `id` of a step. | `__run` |
|
| `gitea.action`<br/>`github.action` | The `id` of the current step, or its index when it has none. | `0` |
|
||||||
| `gitea.action_path`<br/>`github.action_path` | The path where an action is located. Only supported in composite actions. | `/home/runner/work/_actions/actions/checkout/v4` |
|
| `gitea.action_path`<br/>`github.action_path` | The path where an action is located. Only supported in composite actions. | `/var/run/act/actions/***` |
|
||||||
| `gitea.action_ref`<br/>`github.action_ref` | The ref of the action being executed. | `v4` |
|
| `gitea.action_ref`<br/>`github.action_ref` | The ref of the action being executed. | `v4` |
|
||||||
| `gitea.action_repository`<br/>`github.action_repository` | The owner and repository name of the action. | `actions/checkout` |
|
| `gitea.action_repository`<br/>`github.action_repository` | The owner and repository name of the action. | `actions/checkout` |
|
||||||
| `gitea.action_status`<br/>`github.action_status` | The current result of a composite action. | `success` |
|
| `gitea.action_status`<br/>`github.action_status` | The current result of a composite action. | `success` |
|
||||||
| `gitea.actor`<br/>`github.actor` | The username of the user that triggered the initial workflow run. | `silverwind` |
|
| `gitea.actor`<br/>`github.actor` | The username of the user that triggered the initial workflow run. | `alice` |
|
||||||
| `gitea.api_url`<br/>`github.api_url` | The URL of the REST API. | `https://gitea.com/api/v1` |
|
| `gitea.api_url`<br/>`github.api_url` | The URL of the REST API. | `https://gitea.example.com/api/v1` |
|
||||||
| `gitea.base_ref`<br/>`github.base_ref` | The target branch of a pull request. Only set for `pull_request` and `pull_request_target` events. | `main` |
|
| `gitea.base_ref`<br/>`github.base_ref` | The target branch of a pull request. Only set for `pull_request` and `pull_request_target` events. | `main` |
|
||||||
| `gitea.env`<br/>`github.env` | Path on the runner to the file that sets environment variables from workflow commands. Unique to each step. | `/home/runner/work/_temp/_runner_file_commands/set_env_***` |
|
| `gitea.env`<br/>`github.env` | Path on the runner to the file that sets environment variables from workflow commands. | `/var/run/act/workflow/envs.txt` |
|
||||||
| `gitea.event`<br/>`github.event` | The full event webhook payload as an object. See [Event payload](#event-payload). | `{...}` |
|
| `gitea.event`<br/>`github.event` | The full event webhook payload as an object. See [Event payload](#event-payload). | `{...}` |
|
||||||
| `gitea.event_name`<br/>`github.event_name` | The name of the event that triggered the workflow run. | `push` |
|
| `gitea.event_name`<br/>`github.event_name` | The name of the event that triggered the workflow run. | `push` |
|
||||||
| `gitea.event_path`<br/>`github.event_path` | Path on the runner to the file containing the full event webhook payload. | `/home/runner/work/_temp/_github_workflow/event.json` |
|
| `gitea.event_path`<br/>`github.event_path` | Path on the runner to the file containing the full event webhook payload. | `/var/run/act/workflow/event.json` |
|
||||||
| `gitea.head_ref`<br/>`github.head_ref` | The source branch of a pull request. Only set for `pull_request` and `pull_request_target` events. | `feature-branch` |
|
| `gitea.head_ref`<br/>`github.head_ref` | The source branch of a pull request. Only set for `pull_request` and `pull_request_target` events. | `feature-branch` |
|
||||||
| `gitea.job`<br/>`github.job` | The `job_id` of the current job. | `build` |
|
| `gitea.job`<br/>`github.job` | The `job_id` of the current job. | `build` |
|
||||||
| `gitea.ref`<br/>`github.ref` | The fully-formed ref that triggered the workflow. | `refs/heads/main` |
|
| `gitea.ref`<br/>`github.ref` | The fully-formed ref that triggered the workflow. | `refs/heads/main` |
|
||||||
| `gitea.ref_name`<br/>`github.ref_name` | The short ref name. | `main` |
|
| `gitea.ref_name`<br/>`github.ref_name` | The short ref name. | `main` |
|
||||||
| `gitea.ref_protected`<br/>`github.ref_protected` | `true` if branch protections are configured for the ref that triggered the workflow run. | `true` |
|
| `gitea.ref_protected`<br/>`github.ref_protected` | `true` if branch protections are configured for the ref that triggered the workflow run. | `true` |
|
||||||
| `gitea.ref_type`<br/>`github.ref_type` | The type of ref: `branch` or `tag`. | `branch` |
|
| `gitea.ref_type`<br/>`github.ref_type` | The type of ref: `branch` or `tag`. | `branch` |
|
||||||
| `gitea.path`<br/>`github.path` | Path on the runner to the file that sets system `PATH` variables from workflow commands. Unique to each step. | `/home/runner/work/_temp/_runner_file_commands/add_path_***` |
|
| `gitea.path`<br/>`github.path` | Path on the runner to the file that sets system `PATH` variables from workflow commands. | `/var/run/act/workflow/pathcmd.txt` |
|
||||||
| `gitea.repository`<br/>`github.repository` | The owner and repository name. | `gitea/docs` |
|
| `gitea.repository`<br/>`github.repository` | The owner and repository name. | `owner/repo` |
|
||||||
| `gitea.repository_owner`<br/>`github.repository_owner` | The repository owner's username. | `gitea` |
|
| `gitea.repository_owner`<br/>`github.repository_owner` | The repository owner's username. | `owner` |
|
||||||
| `gitea.repositoryUrl`<br/>`github.repositoryUrl` | The HTML URL to the repository. | `https://gitea.com/gitea/docs` |
|
| `gitea.repositoryUrl`<br/>`github.repositoryUrl` | The HTML URL to the repository. | `https://gitea.example.com/owner/repo` |
|
||||||
| `gitea.retention_days`<br/>`github.retention_days` | The number of days that workflow run logs and artifacts are kept. | `90` |
|
| `gitea.retention_days`<br/>`github.retention_days` | The number of days that artifacts are kept, empty when kept forever. | `90` |
|
||||||
| `gitea.run_id`<br/>`github.run_id` | A unique number for each workflow run within a repository. Does not change on re-run. | `1234` |
|
| `gitea.run_id`<br/>`github.run_id` | A unique number for each workflow run within a repository. Does not change on re-run. | `1234` |
|
||||||
| `gitea.run_number`<br/>`github.run_number` | A unique number for each run of a particular workflow. Starts at 1 and increments with each new run. | `42` |
|
| `gitea.run_number`<br/>`github.run_number` | A unique number for each run of a particular workflow. Starts at 1 and increments with each new run. | `42` |
|
||||||
| `gitea.run_attempt`<br/>`github.run_attempt` | A unique number for each re-run attempt. Starts at 1 and increments with each re-run. | `1` |
|
| `gitea.run_attempt`<br/>`github.run_attempt` | A unique number for each re-run attempt. Starts at 1 and increments with each re-run. | `1` |
|
||||||
| `gitea.secret_source`<br/>`github.secret_source` | The source of a secret used in a workflow. Always `Actions` in Gitea. | `Actions` |
|
| `gitea.secret_source`<br/>`github.secret_source` | The source of a secret used in a workflow. Always `Actions` in Gitea. | `Actions` |
|
||||||
| `gitea.server_url`<br/>`github.server_url` | The URL of the Gitea instance. | `https://gitea.com` |
|
| `gitea.server_url`<br/>`github.server_url` | The URL of the Gitea instance. | `https://gitea.example.com` |
|
||||||
| `gitea.sha`<br/>`github.sha` | The commit SHA that triggered the workflow. | `a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2` |
|
| `gitea.sha`<br/>`github.sha` | The commit SHA that triggered the workflow. | `a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2` |
|
||||||
| `gitea.token`<br/>`github.token` | A token to authenticate on behalf of the Gitea App installed on the repository. See [Token permissions](token-permissions.md). | `ghs_***` |
|
| `gitea.token`<br/>`github.token` | A token to authenticate on behalf of the Gitea App installed on the repository. See [Token permissions](token-permissions.md). | `***` |
|
||||||
| `gitea.triggering_actor`<br/>`github.triggering_actor` | The username of the user that initiated the workflow run. May differ from `actor` on re-runs. | `silverwind` |
|
| `gitea.triggering_actor`<br/>`github.triggering_actor` | The username of the user that initiated the workflow run. May differ from `actor` on re-runs. | `alice` |
|
||||||
| `gitea.workflow`<br/>`github.workflow` | The name of the workflow. If unnamed, the full path of the workflow file. | `CI` |
|
| `gitea.workflow`<br/>`github.workflow` | The name of the workflow. If unnamed, the full path of the workflow file. | `CI` |
|
||||||
| `gitea.workspace`<br/>`github.workspace` | The default working directory on the runner and the default location of your repository when using the `checkout` action. | `/workspace/gitea/docs` |
|
| `gitea.workspace`<br/>`github.workspace` | The default working directory on the runner and the default location of your repository when using the `checkout` action. | `/workspace/owner/repo` |
|
||||||
| `gitea.gitea_default_actions_url` | The default URL for downloading actions. Gitea-specific. | `https://github.com` |
|
| `gitea.gitea_default_actions_url` | The default URL for downloading actions. Gitea-specific. | `https://github.com` |
|
||||||
|
|
||||||
### Event payload
|
### Event payload
|
||||||
@@ -124,11 +138,11 @@ These fields exist in almost every payload:
|
|||||||
| Name | Description | Example |
|
| Name | Description | Example |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `gitea.event.action` | The activity type. Only set for events that have activity types, see [supported events](faq.md#what-workflow-trigger-events-does-gitea-support). | `opened` |
|
| `gitea.event.action` | The activity type. Only set for events that have activity types, see [supported events](faq.md#what-workflow-trigger-events-does-gitea-support). | `opened` |
|
||||||
| `gitea.event.repository.full_name` | The owner and name of the repository. | `gitea/docs` |
|
| `gitea.event.repository.full_name` | The owner and name of the repository. | `owner/repo` |
|
||||||
| `gitea.event.repository.default_branch` | The default branch of the repository. | `main` |
|
| `gitea.event.repository.default_branch` | The default branch of the repository. | `main` |
|
||||||
| `gitea.event.repository.private` | Whether the repository is private. | `false` |
|
| `gitea.event.repository.private` | Whether the repository is private. | `false` |
|
||||||
| `gitea.event.repository.html_url` | The HTML URL of the repository. | `https://gitea.com/gitea/docs` |
|
| `gitea.event.repository.html_url` | The HTML URL of the repository. | `https://gitea.example.com/owner/repo` |
|
||||||
| `gitea.event.sender.login` | The username of the user that triggered the event. Also available as `sender.username`. | `silverwind` |
|
| `gitea.event.sender.login` | The username of the user that triggered the event. Also available as `sender.username`. | `alice` |
|
||||||
|
|
||||||
The remaining fields are specific to one or a few events:
|
The remaining fields are specific to one or a few events:
|
||||||
|
|
||||||
@@ -143,12 +157,12 @@ The remaining fields are specific to one or a few events:
|
|||||||
| `gitea.event.commits` | `push` | The commits contained in the push, each with `id`, `message`, `url`, `author`, `added`, `removed` and `modified`. | `[{...}]` |
|
| `gitea.event.commits` | `push` | The commits contained in the push, each with `id`, `message`, `url`, `author`, `added`, `removed` and `modified`. | `[{...}]` |
|
||||||
| `gitea.event.head_commit.message` | `push` | The message of the most recent commit of the push. | `fix: broken link` |
|
| `gitea.event.head_commit.message` | `push` | The message of the most recent commit of the push. | `fix: broken link` |
|
||||||
| `gitea.event.total_commits` | `push` | The number of commits in the push. Gitea-specific. | `3` |
|
| `gitea.event.total_commits` | `push` | The number of commits in the push. Gitea-specific. | `3` |
|
||||||
| `gitea.event.compare_url` | `push` | The URL comparing `before` with `after`. GitHub names this field `compare`. | `https://gitea.com/gitea/docs/compare/a1b2c3d...e5f6a1b` |
|
| `gitea.event.compare_url` | `push` | The URL comparing `before` with `after`. GitHub names this field `compare`. | `https://gitea.example.com/owner/repo/compare/a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2...f6e5d4c3b2a1f6e5d4c3b2a1f6e5d4c3b2a1f6e5` |
|
||||||
| `gitea.event.pusher.login` | `push` | The username of the user that pushed. | `silverwind` |
|
| `gitea.event.pusher.login` | `push` | The username of the user that pushed. | `alice` |
|
||||||
| `gitea.event.forkee.full_name` | `fork` | The owner and name of the new fork. | `silverwind/docs` |
|
| `gitea.event.forkee.full_name` | `fork` | The owner and name of the new fork. | `alice/repo` |
|
||||||
| `gitea.event.page` | `gollum` | The name of the wiki page. | `Home` |
|
| `gitea.event.page` | `gollum` | The name of the wiki page. | `Home` |
|
||||||
| `gitea.event.number` | `issues`, `pull_request`, `pull_request_target`, `pull_request_review`, `pull_request_review_comment` | The index of the issue or pull request. Not set for `issue_comment`, use `gitea.event.issue.number` there. | `386` |
|
| `gitea.event.number` | `issues`, `pull_request`, `pull_request_target`, `pull_request_review`, `pull_request_review_comment` | The index of the issue or pull request. Not set for `issue_comment`, use `gitea.event.issue.number` there. | `386` |
|
||||||
| `gitea.event.issue.number`<br/>`gitea.event.issue.title`<br/>`gitea.event.issue.body`<br/>`gitea.event.issue.state`<br/>`gitea.event.issue.labels`<br/>`gitea.event.issue.user.login` | `issues`, `issue_comment` | The issue the event happened on. | `Expand gitea.event in actions docs` |
|
| `gitea.event.issue.number`<br/>`gitea.event.issue.title`<br/>`gitea.event.issue.body`<br/>`gitea.event.issue.state`<br/>`gitea.event.issue.labels`<br/>`gitea.event.issue.user.login` | `issues`, `issue_comment` | The issue the event happened on. | `Fix typo in README` |
|
||||||
| `gitea.event.comment.body` | `issue_comment` | The body of the comment. | `LGTM` |
|
| `gitea.event.comment.body` | `issue_comment` | The body of the comment. | `LGTM` |
|
||||||
| `gitea.event.is_pull` | `issue_comment` | Whether the comment was made on a pull request. Gitea-specific, GitHub sets `issue.pull_request` on the issue object instead. | `true` |
|
| `gitea.event.is_pull` | `issue_comment` | Whether the comment was made on a pull request. Gitea-specific, GitHub sets `issue.pull_request` on the issue object instead. | `true` |
|
||||||
| `gitea.event.pull_request.number`<br/>`gitea.event.pull_request.title`<br/>`gitea.event.pull_request.body`<br/>`gitea.event.pull_request.draft`<br/>`gitea.event.pull_request.merged`<br/>`gitea.event.pull_request.state`<br/>`gitea.event.pull_request.labels`<br/>`gitea.event.pull_request.user.login` | `pull_request`, `pull_request_target`, `pull_request_review`, `pull_request_review_comment` | The pull request the event happened on. | `Add caching to CI` |
|
| `gitea.event.pull_request.number`<br/>`gitea.event.pull_request.title`<br/>`gitea.event.pull_request.body`<br/>`gitea.event.pull_request.draft`<br/>`gitea.event.pull_request.merged`<br/>`gitea.event.pull_request.state`<br/>`gitea.event.pull_request.labels`<br/>`gitea.event.pull_request.user.login` | `pull_request`, `pull_request_target`, `pull_request_review`, `pull_request_review_comment` | The pull request the event happened on. | `Add caching to CI` |
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ creating issues and pull requests. This will cut down on the initial back and fo
|
|||||||
of getting some clarifying details.
|
of getting some clarifying details.
|
||||||
It is currently not possible to provide generic issue/pull-request templates globally.
|
It is currently not possible to provide generic issue/pull-request templates globally.
|
||||||
|
|
||||||
Additionally, the New Issue page URL can be suffixed with `?title=Issue+Title&body=Issue+Text` and the form will be populated with those strings. Those strings will be used instead of the template if there is one.
|
Additionally, the New Issue page URL can be suffixed with `?title=Issue+Title&body=Issue+Text` and the form will be populated with those strings. Those strings will be used instead of the template if there is one. See [Pre-filling Issues and Pull Requests](prefill-issues-pull-requests.md) for all parameters.
|
||||||
|
|
||||||
## File names
|
## File names
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
---
|
||||||
|
date: "2026-10-17T00:00:00+00:00"
|
||||||
|
slug: "prefill-issues-pull-requests"
|
||||||
|
sidebar_position: 14
|
||||||
|
---
|
||||||
|
|
||||||
|
# Pre-filling Issues and Pull Requests
|
||||||
|
|
||||||
|
Links to the pages for creating issues and pull requests can pre-fill the form with query parameters.
|
||||||
|
This lets you link users from another app, a README or a project board to a form that is already categorized.
|
||||||
|
|
||||||
|
- New issue: `/{owner}/{repo}/issues/new?…`
|
||||||
|
- New pull request: `/{owner}/{repo}/compare/{base}...{head}?…`
|
||||||
|
|
||||||
|
For example, this link opens a new issue with a title, two labels and an assignee:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://gitea.example.com/owner/repo/issues/new?title=Dashboard+crashes&label=kind/bug,area/dashboard&assignee=alice
|
||||||
|
```
|
||||||
|
|
||||||
|
## Parameters
|
||||||
|
|
||||||
|
| Parameter | Value |
|
||||||
|
| ------------- | --------------------------------------------------------------------------- |
|
||||||
|
| `title` | Title |
|
||||||
|
| `body` | Description |
|
||||||
|
| `label` | Comma-separated label IDs or names |
|
||||||
|
| `labels` | Alias of `label` |
|
||||||
|
| `milestone` | Milestone ID or name |
|
||||||
|
| `project` | Comma-separated project IDs or titles |
|
||||||
|
| `assignee` | Comma-separated user IDs or usernames |
|
||||||
|
| `template` | File name of the [template](issue-pull-request-templates.md) to use |
|
||||||
|
| `field:<id>` | Value of the field with this `id` in a YAML template |
|
||||||
|
|
||||||
|
IDs and names can be mixed and names are matched case-insensitively. Values that don't match anything in the repository are ignored.
|
||||||
|
Labels include the organization's labels, and closed milestones and projects can be selected too.
|
||||||
|
Milestones and projects are only offered to users who can write to issues or pull requests, so for other users these parameters have no effect.
|
||||||
|
|
||||||
|
The values from the link take precedence over the title, description, labels and assignees of the template.
|
||||||
|
|
||||||
|
When there are several issue templates to choose from, the parameters are passed through to the chosen one.
|
||||||
|
On the compare page, any of these parameters also opens the pull request form directly, as `expand=1` does.
|
||||||
@@ -55,11 +55,11 @@ and shows a link to the repository on the package site (as well as a link to the
|
|||||||
| Package owner type | User | Organization |
|
| Package owner type | User | Organization |
|
||||||
|--------------------|------|--------------|
|
|--------------------|------|--------------|
|
||||||
| **read** access | public, if user is public too; otherwise for this user only | public, if org is public, otherwise for org members only |
|
| **read** access | public, if user is public too; otherwise for this user only | public, if org is public, otherwise for org members only |
|
||||||
| **write** access | owner only | org members with admin or write access to the org |
|
| **write** access | owner only | members of a team with write access to packages |
|
||||||
|
|
||||||
Please note, that your respective package manager needs to have a [personal access token](development/api-usage.md#authentication) with the permissions `package` set to either Read or Read & Write to download and publish packages respectively.
|
Please note, that your respective package manager needs to have a [personal access token](development/api-usage.md#authentication) with the permissions `package` set to either Read or Read & Write to download and publish packages respectively.
|
||||||
|
|
||||||
N.B.: These access restrictions are [subject to change](https://github.com/go-gitea/gitea/issues/19270), where more finegrained control will be added via a dedicated organization team permission.
|
The packages permission of an organization team applies to all packages of the organization, regardless of the repositories assigned to the team.
|
||||||
|
|
||||||
## Create or upload a package
|
## Create or upload a package
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"label": "Projects",
|
||||||
|
"position": 60,
|
||||||
|
"link": {
|
||||||
|
"type": "generated-index",
|
||||||
|
"slug": "/usage/projects",
|
||||||
|
"description": "Plan and track work with project boards"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
---
|
||||||
|
date: "2025-11-25T18:58:22Z"
|
||||||
|
slug: "project-workflows"
|
||||||
|
sidebar_position: 1
|
||||||
|
description: "Automate project boards with event-driven filters and actions."
|
||||||
|
---
|
||||||
|
|
||||||
|
# Project Workflows
|
||||||
|
|
||||||
|
Project workflows automate a project board. When an issue or pull request in the project triggers an event, each enabled workflow for that event checks its filters and applies its actions. Workflows run in Gitea and need no runner.
|
||||||
|
|
||||||
|
## Edit workflows
|
||||||
|
|
||||||
|
1. Open a project and select **Workflows**.
|
||||||
|
2. Select an event in the sidebar.
|
||||||
|
3. Set filters and actions, then select **Save**. To change an existing workflow, select **Edit** first.
|
||||||
|
|
||||||
|
An event can have several workflows. **Clone** copies the selected workflow so you can adapt it to other items. **Disable** pauses a workflow and keeps its configuration. **Remove** deletes it.
|
||||||
|
|
||||||
|
## Events
|
||||||
|
|
||||||
|
| Event | Runs when | Filters | Actions |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| Item added to project | An item is added to the project or created in it | Apply to, labels | Move to column, labels, issue state |
|
||||||
|
| Item removed from project | An item is removed from the project | Apply to, labels | Labels, issue state |
|
||||||
|
| Item reopened | An item is reopened | Apply to, labels | Move to column, labels |
|
||||||
|
| Item closed | An item is closed | Apply to, labels | Move to column, labels |
|
||||||
|
| Item column changed | An item moves to another column | Apply to, columns, labels | Labels, issue state |
|
||||||
|
| Code changes requested | An official reviewer requests changes on a pull request | Labels | Move to column, labels |
|
||||||
|
| Code review approved | An official reviewer approves a pull request | Labels | Move to column, labels |
|
||||||
|
| Pull request merged | A pull request is merged | Labels | Move to column, labels |
|
||||||
|
|
||||||
|
## Filters
|
||||||
|
|
||||||
|
A workflow without filters runs for every item.
|
||||||
|
|
||||||
|
- **Apply to**: issues, pull requests, or both.
|
||||||
|
- **When moved from column**, **When moved to column**: the column the item left or entered.
|
||||||
|
- **Only if it has labels**: the item must have all selected labels.
|
||||||
|
|
||||||
|
## Actions
|
||||||
|
|
||||||
|
A workflow needs at least one action. Actions run in this order:
|
||||||
|
|
||||||
|
1. **Move to column**: moves the item to a column.
|
||||||
|
2. **Add labels**, **Remove labels**: changes the item's labels.
|
||||||
|
3. **Issue state**: closes or reopens the item. Workflows never reopen pull requests.
|
||||||
|
|
||||||
|
Workflow changes appear in the timeline as "Project workflow" followed by the event, and don't trigger other workflows. Workflows don't run in closed projects or for items in archived repositories.
|
||||||
|
|
||||||
|
## Permissions
|
||||||
|
|
||||||
|
Anyone who can read a project can view its workflows. Managing them requires write access to the project and:
|
||||||
|
|
||||||
|
- Repository project: write access to the repository's issues and pull requests.
|
||||||
|
- Organization project: organization owner or site administrator.
|
||||||
|
- User project: the project's owner.
|
||||||
|
|
||||||
|
Access tokens limited to public repositories can't manage workflows for organization or user projects. Workflows apply their actions regardless of who triggered the event.
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
Manage workflows under the project routes of a repository (`/repos/{owner}/{repo}/projects/{id}`), an organization (`/orgs/{org}/projects/{id}`) or the authenticated user (`/user/projects/{id}`):
|
||||||
|
|
||||||
|
| Method | Path | Purpose |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `GET` | `.../workflows` | List workflows |
|
||||||
|
| `GET` | `.../workflows/{workflow_id}` | Get a workflow |
|
||||||
|
| `POST` | `.../workflows` | Create a workflow |
|
||||||
|
| `PATCH` | `.../workflows/{workflow_id}` | Edit a workflow, omitted fields stay unchanged |
|
||||||
|
| `DELETE` | `.../workflows/{workflow_id}` | Delete a workflow |
|
||||||
|
|
||||||
|
A workflow has an `event` (`item_added_to_project`, `item_removed_from_project`, `item_reopened`, `item_closed`, `item_column_changed`, `code_changes_requested`, `code_review_approved` or `pull_request_merged`), an `enabled` flag, `filters` (`issue_type`, `source_column_id`, `target_column_id`, `label_ids`) and `actions` (`column_id`, `add_label_ids`, `remove_label_ids`, `issue_state`). Each event accepts only the filters and actions listed in [Events](#events).
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
To route new bug reports to triage, create a workflow for **Item added to project**:
|
||||||
|
|
||||||
|
- **Apply to**: Issues only
|
||||||
|
- **Only if it has labels**: `bug`
|
||||||
|
- **Move to column**: Triage
|
||||||
|
- **Add labels**: `needs-triage`
|
||||||
@@ -9,25 +9,36 @@ aliases:
|
|||||||
|
|
||||||
# Code Owners
|
# Code Owners
|
||||||
|
|
||||||
Gitea maintains code owner files. It looks for it in the following locations in this order:
|
Gitea reads the first CODEOWNERS file found at these locations, in order:
|
||||||
|
|
||||||
- `./CODEOWNERS`
|
- `./CODEOWNERS`
|
||||||
- `./docs/CODEOWNERS`
|
- `./docs/CODEOWNERS`
|
||||||
- `./.gitea/CODEOWNERS`
|
- `./.gitea/CODEOWNERS`
|
||||||
|
|
||||||
And stops at the first found file.
|
Pull requests use the base branch's rules. File views show owners from the commit
|
||||||
|
being viewed, including when browsing a branch, tag, or historical commit.
|
||||||
|
|
||||||
File format: `<regexp rule> <@user or @org/team> [@user or @org/team]...`
|
## Patterns and owners
|
||||||
|
|
||||||
Regexp specified in golang Regex format.
|
Each rule contains a pattern followed by users or organization teams.
|
||||||
Regexp can start with `!` for negative rules - match all files except specified.
|
|
||||||
|
Patterns starting with `*` or containing `/*` are parsed as glob expressions.
|
||||||
|
General patterns are parsed as regular expressions.
|
||||||
|
A leading `!` inverts a match.
|
||||||
|
|
||||||
|
Special rule characters like space, backslash and `#` must be escaped with a backslash.
|
||||||
|
When using regexp, since backslash needs to be escaped in rule level, literal dot should be written as `\\.`
|
||||||
|
|
||||||
Example file:
|
Example file:
|
||||||
|
|
||||||
```bash
|
```text
|
||||||
.*\\.go @user1 @user2 # This is comment
|
*.js @alice @bob # This is an inline comment
|
||||||
|
doc/*.md @charles # Patterns starting with "*" or containing "/*" are parsed as glob
|
||||||
|
src/**/db*.py @david # Use "**" to match any-level sub directories
|
||||||
|
|
||||||
|
.*\\.go @user1 @user2 # General patterns are parsed as regexp
|
||||||
|
test\\..*\\.js @user3 # !!! Do remeber: NOT "test.*.js", only regexp can be used for such cases
|
||||||
|
|
||||||
# Comment too
|
|
||||||
# You can assigning code owning for users or teams
|
# You can assigning code owning for users or teams
|
||||||
frontend/src/.*\\.js @org1/team1 @org1/team2 @user3
|
frontend/src/.*\\.js @org1/team1 @org1/team2 @user3
|
||||||
|
|
||||||
@@ -42,24 +53,69 @@ docs/(aws|google|azure)/[^/]*\\.(md|txt) @user8 @org1/team4
|
|||||||
Code owners listed in this file will automatically be requested to review pull requests
|
Code owners listed in this file will automatically be requested to review pull requests
|
||||||
that modify files matching at least one corresponding rule.
|
that modify files matching at least one corresponding rule.
|
||||||
|
|
||||||
### Escaping
|
## Sections
|
||||||
|
|
||||||
You can escape characters `#`, ` ` (space) and `\` with `\`, like:
|
A section heading can supply default owners for the rules that follow it:
|
||||||
|
|
||||||
|
```text
|
||||||
|
[Documentation] @org1/team-doc
|
||||||
|
*.md
|
||||||
|
README.md @alice
|
||||||
|
|
||||||
|
[Frontend] @bob
|
||||||
|
*.js
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Owners on a rule replace the section's default owners. Section names are
|
||||||
|
case-insensitive; repeated headings belong to the same section. For each file, the
|
||||||
|
last matching rule in each named section applies. Matching rules outside named
|
||||||
|
sections retain Gitea's existing behavior: they all apply.
|
||||||
|
|
||||||
|
## Review request annotations
|
||||||
|
|
||||||
|
Use `## review-request=true` or `## review-request=false` to control automatic
|
||||||
|
review requests. A line annotation overrides a section annotation, which overrides
|
||||||
|
the global value. When none is set, individual code owners receive automatic review
|
||||||
|
requests only if they watch the repository and include pull requests in their watch
|
||||||
|
preferences. Team-level requests are enabled by default. An explicit `true` requests
|
||||||
|
a review regardless of the individual owner's watch preferences; `false` disables
|
||||||
|
automatic requests for the rule.
|
||||||
|
|
||||||
|
```text
|
||||||
|
## review-request=false # global default for following rules
|
||||||
|
|
||||||
|
*.js @alice ## review-request=true # only this rule
|
||||||
|
|
||||||
|
[Documentation] @org1/team-doc ## review-request=true
|
||||||
|
*.md
|
||||||
|
private/* @bob ## review-request=false
|
||||||
|
```
|
||||||
|
|
||||||
|
A standalone annotation changes the global default for subsequent rules.
|
||||||
|
Annotations on section headings apply until the next heading. Ordinary comments
|
||||||
|
start with `#`, including comments after annotations.
|
||||||
|
|
||||||
|
Disabling review requests keeps code owners visible when viewing a file and
|
||||||
|
does not waive approvals required by branch protection.
|
||||||
|
|
||||||
|
## Escaping
|
||||||
|
|
||||||
|
You need to escape characters `#`, ` ` (space) and `\` with backslash `\`, e.g.:
|
||||||
|
|
||||||
|
```text
|
||||||
dir/with\#hashtag @user1
|
dir/with\#hashtag @user1
|
||||||
path\ with\ space @user2
|
path\ with\ space @user2
|
||||||
path/with\\backslash @user3
|
path/with\\backslash @user3
|
||||||
```
|
```
|
||||||
|
|
||||||
Some character (`.+*?()|[]{}^$\`) should be escaped with `\\` inside regexp, like:
|
Some regexp characters (`.+*?()|[]{}^$\`) should be escaped with `\\`, e.g.:
|
||||||
|
|
||||||
```
|
```
|
||||||
path/\\.with\\.dots
|
path/\\.with\\.dots
|
||||||
path/with\\+plus
|
path/with\\+plus
|
||||||
```
|
```
|
||||||
|
|
||||||
### Branch Protection Rules
|
## Branch Protection Rules
|
||||||
|
|
||||||
When setting up branch protection rules, you may choose to enforce code owner approval of
|
When setting up branch protection rules, you may choose to enforce code owner approval of
|
||||||
modified files. This will block a PR from being merged until at least one code owner
|
modified files. This will block a PR from being merged until at least one code owner
|
||||||
@@ -67,7 +123,7 @@ has given approval for every applicable rule listed in the `CODEOWNERS` file.
|
|||||||
|
|
||||||
For example, say you have the following `CODEOWNERS` file:
|
For example, say you have the following `CODEOWNERS` file:
|
||||||
|
|
||||||
```bash
|
```text
|
||||||
.*\\.go @Bob
|
.*\\.go @Bob
|
||||||
.*\\.md @Sally @Chris
|
.*\\.md @Sally @Chris
|
||||||
migrations/.* @Alice
|
migrations/.* @Alice
|
||||||
|
|||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+1
-1
@@ -80,7 +80,7 @@ cd gitea-dump-1610949662
|
|||||||
mv app.ini /etc/gitea/conf/app.ini
|
mv app.ini /etc/gitea/conf/app.ini
|
||||||
mv data/* /var/lib/gitea/data/
|
mv data/* /var/lib/gitea/data/
|
||||||
mv log/* /var/lib/gitea/log/
|
mv log/* /var/lib/gitea/log/
|
||||||
mv repos/* /var/lib/gitea/repositories/
|
mv repos/* /var/lib/gitea/data/gitea-repositories/
|
||||||
chown -R gitea:gitea /etc/gitea/conf/app.ini /var/lib/gitea
|
chown -R gitea:gitea /etc/gitea/conf/app.ini /var/lib/gitea
|
||||||
|
|
||||||
# mysql
|
# mysql
|
||||||
File renamed without changes.
File renamed without changes.
File diff suppressed because it is too large.
Load diff
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+81
-18
@@ -14,6 +14,8 @@ aliases:
|
|||||||
2. 将 `https://git.example.com/foo` 反向代理到 `http://gitea:3000/foo`
|
2. 将 `https://git.example.com/foo` 反向代理到 `http://gitea:3000/foo`
|
||||||
3. 确保反向代理不会解码 URI。`https://git.example.com/a%2Fb`的请求应该被传递给 `http://gitea:3000/a%2Fb`。
|
3. 确保反向代理不会解码 URI。`https://git.example.com/a%2Fb`的请求应该被传递给 `http://gitea:3000/a%2Fb`。
|
||||||
4. 确保 `Host` 和 `X-Forwarded-Proto` 头被正确的传递给 Gitea,使 Gitea 可以看到正在访问的真实 URL。
|
4. 确保 `Host` 和 `X-Forwarded-Proto` 头被正确的传递给 Gitea,使 Gitea 可以看到正在访问的真实 URL。
|
||||||
|
5. 确保 Web 服务器有完整的证书(包括所有中间证书和根证书),以便 `git clone` 和 `git pull` 正常工作。
|
||||||
|
6. Gitea 会在 `/-/ws` 使用 WebSocket 连接,用于通知计数等实时更新。请确保反向代理使用 HTTP/1.1,并转发 `Upgrade` 和 `Connection` 头,参见下面的示例。否则 Gitea 会回退为定期轮询。
|
||||||
|
|
||||||
## 使用子路径
|
## 使用子路径
|
||||||
|
|
||||||
@@ -39,6 +41,7 @@ server {
|
|||||||
location / {
|
location / {
|
||||||
client_max_body_size 512M;
|
client_max_body_size 512M;
|
||||||
proxy_pass http://localhost:3000;
|
proxy_pass http://localhost:3000;
|
||||||
|
proxy_http_version 1.1;
|
||||||
proxy_set_header Connection $http_connection;
|
proxy_set_header Connection $http_connection;
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
proxy_set_header Host $host;
|
proxy_set_header Host $host;
|
||||||
@@ -61,8 +64,9 @@ server {
|
|||||||
|
|
||||||
# 确保 nginx 使用未转义 URI, 按原样保持 "%2F"。 确保 nginx 去除 "/gitea" 子路径前缀, 按原样传递 "/v2"。
|
# 确保 nginx 使用未转义 URI, 按原样保持 "%2F"。 确保 nginx 去除 "/gitea" 子路径前缀, 按原样传递 "/v2"。
|
||||||
rewrite ^ $request_uri;
|
rewrite ^ $request_uri;
|
||||||
rewrite ^(/gitea)?(/.*) $2 break;
|
rewrite ^/(gitea($|/))?(.*) /$3 break;
|
||||||
proxy_pass http://127.0.0.1:3000$uri;
|
proxy_pass http://127.0.0.1:3000$uri;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
|
||||||
# 其他的常规 HTTP 表头,见上面“使用 Nginx 作为反向代理服务”小节的配置
|
# 其他的常规 HTTP 表头,见上面“使用 Nginx 作为反向代理服务”小节的配置
|
||||||
proxy_set_header Connection $http_connection;
|
proxy_set_header Connection $http_connection;
|
||||||
@@ -107,6 +111,7 @@ server {
|
|||||||
}
|
}
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
|
# 其他指令见上面「使用 Nginx 作为反向代理服务」小节
|
||||||
proxy_pass http://localhost:3000;
|
proxy_pass http://localhost:3000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -123,6 +128,7 @@ server {
|
|||||||
server_name git.example.com;
|
server_name git.example.com;
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
|
# 其他指令见上面「使用 Nginx 作为反向代理服务」小节
|
||||||
proxy_pass http://localhost:3000;
|
proxy_pass http://localhost:3000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -144,6 +150,20 @@ server {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Nginx Proxy Manager
|
||||||
|
|
||||||
|
如果使用 Nginx Proxy Manager 作为 Gitea 的反向代理,配置与原生 Nginx 略有不同。
|
||||||
|
|
||||||
|
它会[默认给自定义 location 加上一些指令](https://github.com/NginxProxyManager/nginx-proxy-manager/blob/master/docker/rootfs/etc/nginx/conf.d/include/proxy.conf),因此上面 Nginx 配置里对应的指令不要再写一遍。否则会因为指令重复(尤其是 `proxy_set_header Host $host`)出现 `400 bad request`。
|
||||||
|
|
||||||
|
创建 `/` 自定义 location 时,只需在其配置中加入:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
client_max_body_size 512M;
|
||||||
|
```
|
||||||
|
|
||||||
|
在代理主机上启用 `Websockets Support`,Nginx Proxy Manager 会自行加入 WebSocket 相关指令。再额外添加 `proxy_http_version` 会导致 Nginx 拒绝启动。
|
||||||
|
|
||||||
## 使用 Apache HTTPD 作为反向代理服务
|
## 使用 Apache HTTPD 作为反向代理服务
|
||||||
|
|
||||||
如果您想使用 Apache HTTPD 作为 Gitea 的反向代理服务,您可以为您的 Apache HTTPD 作如下配置(在 Ubuntu 中,配置文件通常在 `/etc/apache2/httpd.conf` 目录下):
|
如果您想使用 Apache HTTPD 作为 Gitea 的反向代理服务,您可以为您的 Apache HTTPD 作如下配置(在 Ubuntu 中,配置文件通常在 `/etc/apache2/httpd.conf` 目录下):
|
||||||
@@ -154,30 +174,23 @@ server {
|
|||||||
ProxyPreserveHost On
|
ProxyPreserveHost On
|
||||||
ProxyRequests off
|
ProxyRequests off
|
||||||
AllowEncodedSlashes NoDecode
|
AllowEncodedSlashes NoDecode
|
||||||
ProxyPass / http://localhost:3000/ nocanon
|
ProxyPass / http://localhost:3000/ nocanon upgrade=websocket
|
||||||
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
|
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
|
||||||
</VirtualHost>
|
</VirtualHost>
|
||||||
```
|
```
|
||||||
|
|
||||||
注:必须启用以下 Apache HTTPD 组件:`proxy`, `proxy_http`
|
:::note
|
||||||
|
必须启用以下 Apache HTTPD 组件:`proxy`, `proxy_http`。
|
||||||
|
|
||||||
|
`upgrade=websocket` 需要 Apache HTTPD 2.4.48 或更高版本。更旧的版本**必须**去掉它,否则 Apache HTTPD 将无法启动。
|
||||||
|
:::
|
||||||
|
|
||||||
|
如果希望用 Let's Encrypt 的 webroot 验证,请在 `ProxyPass` 之前加入 `ProxyPass /.well-known !`,避免把这些请求代理到 Gitea。
|
||||||
|
|
||||||
## 使用 Apache HTTPD 作为反向代理服务并将 Gitea 路由至一个子路径
|
## 使用 Apache HTTPD 作为反向代理服务并将 Gitea 路由至一个子路径
|
||||||
|
|
||||||
如果您已经有一个域名并且想与 Gitea 共享该域名,您可以增加以下配置为 Gitea 添加路由规则(在 Ubuntu 中,配置文件通常在 `/etc/apache2/httpd.conf` 目录下):
|
如果您已经有一个域名并且想与 Gitea 共享该域名,您可以增加以下配置为 Gitea 添加路由规则(在 Ubuntu 中,配置文件通常在 `/etc/apache2/httpd.conf` 目录下):
|
||||||
|
|
||||||
```
|
|
||||||
<VirtualHost *:80>
|
|
||||||
...
|
|
||||||
<Proxy *>
|
|
||||||
Order allow,deny
|
|
||||||
Allow from all
|
|
||||||
</Proxy>
|
|
||||||
AllowEncodedSlashes NoDecode
|
|
||||||
# 注意: 路径和 URL 后面都不要写路径符号 '/'
|
|
||||||
ProxyPass /git http://localhost:3000 nocanon
|
|
||||||
</VirtualHost>
|
|
||||||
```
|
|
||||||
|
|
||||||
```apacheconf
|
```apacheconf
|
||||||
<VirtualHost *:80>
|
<VirtualHost *:80>
|
||||||
...
|
...
|
||||||
@@ -187,7 +200,7 @@ server {
|
|||||||
</Proxy>
|
</Proxy>
|
||||||
AllowEncodedSlashes NoDecode
|
AllowEncodedSlashes NoDecode
|
||||||
# 注意: 路径和 URL 后面都不要写路径符号 '/'
|
# 注意: 路径和 URL 后面都不要写路径符号 '/'
|
||||||
ProxyPass /git http://localhost:3000 nocanon
|
ProxyPass /git http://localhost:3000 nocanon upgrade=websocket
|
||||||
ProxyPreserveHost On
|
ProxyPreserveHost On
|
||||||
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
|
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
|
||||||
</VirtualHost>
|
</VirtualHost>
|
||||||
@@ -195,7 +208,55 @@ server {
|
|||||||
|
|
||||||
然后您**必须**在 Gitea 的配置文件中正确的添加类似 `[server] ROOT_URL = http://git.example.com/git/` 的配置项。
|
然后您**必须**在 Gitea 的配置文件中正确的添加类似 `[server] ROOT_URL = http://git.example.com/git/` 的配置项。
|
||||||
|
|
||||||
注:必须启用以下 Apache HTTPD 组件:`proxy`, `proxy_http`
|
:::note
|
||||||
|
必须启用以下 Apache HTTPD 组件:`proxy`, `proxy_http`。`upgrade=websocket` 需要 Apache HTTPD 2.4.48 或更高版本,更旧的版本请去掉它。
|
||||||
|
:::
|
||||||
|
|
||||||
|
## 使用 Apache HTTPD 直接提供静态资源
|
||||||
|
|
||||||
|
我们可以通过将资源分为静态和动态两种类型来调节性能。
|
||||||
|
|
||||||
|
CSS 文件、JavaScript 文件、图片和字体是静态内容。首页、仓库视图和工单列表是动态内容。
|
||||||
|
|
||||||
|
Apache HTTPD 可以直接提供静态资源,并且只代理动态资源请求给 Gitea。
|
||||||
|
|
||||||
|
将 Gitea 源代码仓库的一个快照下载到 `/path/to/gitea/`。
|
||||||
|
在此之后,在本地仓库目录运行 `make frontend` 来生成静态资源。在这个情况下,我们只对 `public/` 目录感兴趣,您可以删除剩下的其他目录。
|
||||||
|
(为了生成静态资源,您需要安装一个[带 npm 的 Node ](https://nodejs.org/en/download/)和 `make`)
|
||||||
|
|
||||||
|
取决于您的用户量的大小,您可以将流量分离到两个不同的服务器,或者为静态资源配置一个 cdn。
|
||||||
|
|
||||||
|
### 单服务器节点,单域名
|
||||||
|
|
||||||
|
将 `[server] STATIC_URL_PREFIX = /_/static` 写入您的 Gitea 配置文件:
|
||||||
|
|
||||||
|
```apacheconf
|
||||||
|
<VirtualHost *:80>
|
||||||
|
...
|
||||||
|
<Proxy *>
|
||||||
|
Order allow,deny
|
||||||
|
Allow from all
|
||||||
|
</Proxy>
|
||||||
|
|
||||||
|
ProxyPass /_/static/ !
|
||||||
|
Alias /_/static/ /path/to/gitea/public/
|
||||||
|
<Directory /path/to/gitea/public/>
|
||||||
|
Options FollowSymlinks
|
||||||
|
AllowOverride None
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
AllowEncodedSlashes NoDecode
|
||||||
|
# 注意: 路径和 URL 后面都不要写路径符号 '/'
|
||||||
|
ProxyPass / http://localhost:3000/ nocanon upgrade=websocket
|
||||||
|
ProxyPreserveHost On
|
||||||
|
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
|
||||||
|
</VirtualHost>
|
||||||
|
```
|
||||||
|
|
||||||
|
:::note
|
||||||
|
必须启用以下 Apache HTTPD 组件:`proxy`, `proxy_http`。`upgrade=websocket` 需要 Apache HTTPD 2.4.48 或更高版本,更旧的版本请去掉它。
|
||||||
|
:::
|
||||||
|
|
||||||
## 使用 Caddy 作为反向代理服务
|
## 使用 Caddy 作为反向代理服务
|
||||||
|
|
||||||
@@ -231,11 +292,13 @@ git.example.com {
|
|||||||
|
|
||||||
- 使用 Microsoft Web Platform Installer 5.1 (WebPI) 安装 Application Request Routing(简称 ARR),或者在 [IIS.net](https://www.iis.net/downloads/microsoft/application-request-routing) 下载这个插件。
|
- 使用 Microsoft Web Platform Installer 5.1 (WebPI) 安装 Application Request Routing(简称 ARR),或者在 [IIS.net](https://www.iis.net/downloads/microsoft/application-request-routing) 下载这个插件。
|
||||||
- 一但这个模块被安装到 IIS 上,你将会在 IIS 管理控制台看到一个叫做 URL Rewrite 的新图标。
|
- 一但这个模块被安装到 IIS 上,你将会在 IIS 管理控制台看到一个叫做 URL Rewrite 的新图标。
|
||||||
|
- 安装 Windows 功能 `WebSocket Protocol`,否则 ARR 无法代理 Gitea 的 WebSocket 端点。
|
||||||
- 打开 IIS 管理控制台,在左边的列表中点击 `Gitea Proxy` 网页。在中间选中并且双击 URL Rewrite 的图标来加载 URL 重写的面板。
|
- 打开 IIS 管理控制台,在左边的列表中点击 `Gitea Proxy` 网页。在中间选中并且双击 URL Rewrite 的图标来加载 URL 重写的面板。
|
||||||
- 在管理控制台的右边选择 `Add Rule` 操作,并且在 `Inbound and Outbound Rules` 分类中选择 `Reverse Proxy Rule`。
|
- 在管理控制台的右边选择 `Add Rule` 操作,并且在 `Inbound and Outbound Rules` 分类中选择 `Reverse Proxy Rule`。
|
||||||
- 在 Inbound Rules 中, 将 server name 设置为 Gitea 正在运行的主机以及对应端口。例如,如果你在 localhost 的 3000 端口上运行 Gitea,则设置为 `127.0.0.1:3000`。
|
- 在 Inbound Rules 中, 将 server name 设置为 Gitea 正在运行的主机以及对应端口。例如,如果你在 localhost 的 3000 端口上运行 Gitea,则设置为 `127.0.0.1:3000`。
|
||||||
- 启用 SSL Offloading
|
- 启用 SSL Offloading
|
||||||
- 在 Outbound Rules 中,确保设置了 `Rewrite the domain names of the links in HTTP response`,并且将 `From:` 设置为上面的 server name,将 `To:` 设置为你的外部访问名称,例如:`git.example.com`
|
- 在 Outbound Rules 中,确保设置了 `Rewrite the domain names of the links in HTTP response`,并且将 `From:` 设置为上面的 server name,将 `To:` 设置为你的外部访问名称,例如:`git.example.com`
|
||||||
|
- 关闭 Application Request Routing 的 `Server Proxy Settings` 中的 `Reverse rewrite host in response headers`(在 IIS 管理器中选择服务器节点,打开 `Application Request Routing Cache`,再打开右侧的 `Server Proxy Settings`)。若保持开启,ARR 会把 `Location` 头里的主机改回内部地址,导致登录或表单提交后的重定向把浏览器送到 `127.0.0.1:3000` 而不是 `git.example.com`。
|
||||||
- 现在,根据下面的内容为您的网页编辑 `web.config`(将 `127.0.0.1:3000` 和 `git.example.com` 改为适当的值)
|
- 现在,根据下面的内容为您的网页编辑 `web.config`(将 `127.0.0.1:3000` 和 `git.example.com` 改为适当的值)
|
||||||
|
|
||||||
```xml
|
```xml
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+1
@@ -12,6 +12,7 @@ aliases:
|
|||||||
|
|
||||||
通常情况下, `ENABLE_SWAGGER` 默认开启并且参数 `MAX_RESPONSE_ITEMS` 默认为 50。您可以从 [Config Cheat Sheet](../administration/config-cheat-sheet.md) 中获取更多配置相关信息。
|
通常情况下, `ENABLE_SWAGGER` 默认开启并且参数 `MAX_RESPONSE_ITEMS` 默认为 50。您可以从 [Config Cheat Sheet](../administration/config-cheat-sheet.md) 中获取更多配置相关信息。
|
||||||
|
|
||||||
|
<a id="authentication"></a>
|
||||||
## 通过 API 认证
|
## 通过 API 认证
|
||||||
|
|
||||||
Gitea 支持以下几种 API 认证方式:
|
Gitea 支持以下几种 API 认证方式:
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+23
-1
@@ -8,7 +8,7 @@ aliases:
|
|||||||
|
|
||||||
# 数据库准备
|
# 数据库准备
|
||||||
|
|
||||||
在使用 Gitea 前,您需要准备一个数据库。Gitea 支持 PostgreSQL(>= 12)、MySQL(>= 8.0)、MariaDB(>= 10.4)、SQLite(内置) 和 MSSQL(>= 2012 SP4)这几种数据库。本页将指导您准备数据库。由于 PostgreSQL 和 MySQL 在生产环境中被广泛使用,因此本文档将仅涵盖这两种数据库。如果您计划使用 SQLite,则可以忽略本章内容。
|
在使用 Gitea 前,您需要准备一个数据库。Gitea 支持 PostgreSQL(>= 12)、MySQL(>= 8.0)、MariaDB(>= 10.4)、SQLite(内置) 和 MSSQL(>= 2012 SP4)这几种数据库。本页将指导您准备数据库。本文档涵盖 PostgreSQL、MySQL 和 MSSQL。如果您计划使用 SQLite,则可以忽略本章内容。
|
||||||
|
|
||||||
如果您使用不受支持的数据库版本,请通过 [联系我们](/help/support) 以获取有关我们的扩展支持的信息。我们可以为旧数据库提供测试和支持,并将这些修复集成到 Gitea 代码库中。
|
如果您使用不受支持的数据库版本,请通过 [联系我们](/help/support) 以获取有关我们的扩展支持的信息。我们可以为旧数据库提供测试和支持,并将这些修复集成到 Gitea 代码库中。
|
||||||
|
|
||||||
@@ -168,6 +168,28 @@ aliases:
|
|||||||
|
|
||||||
您应该会被提示输入数据库用户的密码,并连接到数据库。
|
您应该会被提示输入数据库用户的密码,并连接到数据库。
|
||||||
|
|
||||||
|
## MSSQL
|
||||||
|
|
||||||
|
1. 以管理员身份创建登录名、使用大小写敏感排序规则的数据库及其用户。请将密码 `'gitea'` 替换为安全的密码:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE LOGIN gitea WITH PASSWORD = 'gitea';
|
||||||
|
CREATE DATABASE giteadb COLLATE Latin1_General_CS_AS;
|
||||||
|
GO
|
||||||
|
USE giteadb;
|
||||||
|
CREATE USER gitea FOR LOGIN gitea;
|
||||||
|
ALTER ROLE db_owner ADD MEMBER gitea;
|
||||||
|
GO
|
||||||
|
```
|
||||||
|
|
||||||
|
升级会更改数据库结构,因此该用户需要 `db_owner`,或者 `db_ddladmin`、`db_datareader` 和 `db_datawriter`。使用后者时,还需以管理员身份执行 `ALTER DATABASE giteadb SET READ_COMMITTED_SNAPSHOT ON;`。
|
||||||
|
|
||||||
|
2. 在您的 Gitea 服务器上,测试与数据库的连接:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sqlcmd -S 203.0.113.3 -U gitea -d giteadb
|
||||||
|
```
|
||||||
|
|
||||||
## 使用 TLS 进行数据库连接
|
## 使用 TLS 进行数据库连接
|
||||||
|
|
||||||
如果 Gitea 和您的数据库实例之间的通信是通过私有网络进行的,或者如果 Gitea 和数据库运行在同一台服务器上,那么可以省略本节,因为 Gitea 和数据库实例之间的安全性不会受到严重威胁。但是,如果数据库实例位于公共网络上,请使用 TLS 对数据库连接进行加密,以防止第三方拦截流量数据。
|
如果 Gitea 和您的数据库实例之间的通信是通过私有网络进行的,或者如果 Gitea 和数据库运行在同一台服务器上,那么可以省略本节,因为 Gitea 和数据库实例之间的安全性不会受到严重威胁。但是,如果数据库实例位于公共网络上,请使用 TLS 对数据库连接进行加密,以防止第三方拦截流量数据。
|
||||||
File renamed without changes.
File renamed without changes.
+2
-2
@@ -12,7 +12,7 @@ aliases:
|
|||||||
|
|
||||||
接下来,[安装 Node.js 和 npm](https://nodejs.org/zh-cn/download/), 这是构建 JavaScript 和 CSS 文件所需的。最低支持的 Node.js 版本是 @minNodeVersion@,建议使用最新的 LTS 版本。
|
接下来,[安装 Node.js 和 npm](https://nodejs.org/zh-cn/download/), 这是构建 JavaScript 和 CSS 文件所需的。最低支持的 Node.js 版本是 @minNodeVersion@,建议使用最新的 LTS 版本。
|
||||||
|
|
||||||
**注意**:需要 Go 版本 @minGoVersion@ 或更高版本。不过,建议获取与我们的持续集成(continuous integration, CI)相同的版本,请参阅在 [Hacking on Gitea](development/hacking-on-gitea.md) 中给出的建议。
|
**注意**:需要 Go 版本 @minGoVersion@ 或更高版本。不过,建议获取与我们的持续集成(continuous integration, CI)相同的版本,请参阅在 [Hacking on Gitea](https://github.com/go-gitea/gitea/blob/main/docs/build-setup.md) 中给出的建议。
|
||||||
|
|
||||||
## 下载
|
## 下载
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ git checkout @sourceVersion@ # or git checkout pr-xyz
|
|||||||
|
|
||||||
- `go` @minGoVersion@ 或更高版本,请参阅 [这里](https://go.dev/dl/)
|
- `go` @minGoVersion@ 或更高版本,请参阅 [这里](https://go.dev/dl/)
|
||||||
- `node` @minNodeVersion@ 或更高版本,并且安装 `npm`, 请参阅 [这里](https://nodejs.org/zh-cn/download/)
|
- `node` @minNodeVersion@ 或更高版本,并且安装 `npm`, 请参阅 [这里](https://nodejs.org/zh-cn/download/)
|
||||||
- `make`, 请参阅 [这里](development/hacking-on-gitea.md)
|
- `make`, 请参阅 [这里](https://github.com/go-gitea/gitea/blob/main/docs/build-setup.md)
|
||||||
|
|
||||||
为了尽可能简化编译过程,提供了各种 [make 任务](https://github.com/go-gitea/gitea/blob/main/Makefile)。
|
为了尽可能简化编译过程,提供了各种 [make 任务](https://github.com/go-gitea/gitea/blob/main/Makefile)。
|
||||||
|
|
||||||
File renamed without changes.
Loaded 100 of 1899 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user