initial commit

This commit is contained in:
2026-03-22 23:06:41 +08:00
commit 978a4a085b
7 changed files with 452 additions and 0 deletions

34
.env.sample Normal file
View File

@@ -0,0 +1,34 @@
# GITEA CORE CONFIGURATION
GITEA_EXTERNAL_URL=https://git.example.com # http://<SERVER_IP_OR_DOMAIN>
GITEA_ROOT_USER=admin
GITEA_ROOT_PASSWORD=ChangeMe123 # Initial admin password
GITEA_ROOT_EMAIL=admin@example.com
GITEA_DATA_PATH=./gitea-data # Persisted data directory
# DATABASE
GITEA_DB_TYPE=postgres
GITEA_DB_HOST=db:5432
GITEA_DB_NAME=gitea
GITEA_DB_USER=gitea
GITEA_DB_PASSWORD=ChangeDbPass123
# PORTS
HTTP_PORT=3000 # internal Gitea HTTP (inside container)
SSH_PORT=2222 # exposed SSH from host -> container
# SMTP / EMAIL SETTINGS
SMTP_ENABLE=false
SMTP_HOST=smtp.mailgun.org
SMTP_PORT=587
SMTP_USER=
SMTP_PASS=
SMTP_FROM=git@example.com
SMTP_SKIP_VERIFY=true
# OPTIONAL: LETSENCRYPT / REVERSE PROXY (if you mimic GitLab style)
LETSENCRYPT_ENABLE=false
LETSENCRYPT_EMAIL=admin@example.com
# OPTIONAL: Custom SSL Configuration
SSL_CERT_PATH=/etc/letsencrypt/live/git.example.com/fullchain.pem
SSL_KEY_PATH=/etc/letsencrypt/live/git.example.com/privkey.pem

12
.gitignore vendored Normal file
View File

@@ -0,0 +1,12 @@
.env
gitea-data/
*.log
*.tmp
*.bak
.DS_Store
Thumbs.db
custom-ssl/

163
README.md Normal file
View File

@@ -0,0 +1,163 @@
# Gitea SelfHosted Deployment
This repository provides a **simple automated deployment for a selfhosted Gitea server** using Docker Compose.
It is designed to make deploying a productionready Git server easy with:
- Docker Compose deployment
- PostgreSQL database
- Optional SMTP email
- Optional HTTPS support
- Automated bootstrap script
- Persistent data storage
# Requirements
Minimum recommended:
- Linux server (Ubuntu / Debian)
- Docker
- Docker Compose
- 2 CPU cores
- 24GB RAM
- 10GB disk space
# Quick Start
Clone the repository:
```
git clone <repo>
cd gitea-deployment
```
Run the bootstrap script:
```
chmod +x run.sh
./run.sh
```
On first run the script will:
- Create `.env` from `.env.sample`
- Ask you to configure settings
Edit `.env`:
```
nano .env
```
Set at minimum:
```
GITEA_EXTERNAL_URL
GITEA_ROOT_USER
GITEA_ROOT_PASSWORD
GITEA_ROOT_EMAIL
```
Then run again:
```
./run.sh
```
# Access Gitea
After deployment:
```
http://YOUR_SERVER_IP
```
or
```
https://your-domain.com
```
# Data Persistence
All persistent data is stored in:
```
./gitea-data
```
Structure:
```
gitea-data/
├─ gitea/
└─ postgres/
```
Back up this directory to preserve:
- repositories
- database
- attachments
- configuration
# Enabling HTTPS
Set in `.env`:
```
GITEA_EXTERNAL_URL=https://git.example.com
SSL_CERT_PATH=/etc/letsencrypt/live/git.example.com/fullchain.pem
SSL_KEY_PATH=/etc/letsencrypt/live/git.example.com/privkey.pem
```
During deployment the `setup-ssl.sh` script will copy certificates to:
```
/data/https/cert.pem
/data/https/key.pem
```
Gitea will automatically use them for HTTPS.
# Managing the Server
View logs:
```
docker compose logs -f
```
Stop services:
```
docker compose down
```
Restart:
```
docker compose restart
```
Update Gitea:
```
docker compose pull
docker compose up -d
```
# Repository Structure
```
gitea-deployment
├─ docker-compose.yml
├─ run.sh
├─ .env.sample
├─ README.md
└─ scripts
├─ setup-swap.sh
└─ setup-ssl.sh
```
# Notes
- The first time Gitea starts it will initialize the database automatically.
- Admin credentials are configured through `.env`.
- SMTP is optional but recommended for production.
# License
MIT

63
docker-compose.yml Normal file
View File

@@ -0,0 +1,63 @@
version: "3.9"
services:
db:
image: postgres:15
container_name: gitea-db
restart: always
environment:
POSTGRES_DB: ${GITEA_DB_NAME}
POSTGRES_USER: ${GITEA_DB_USER}
POSTGRES_PASSWORD: ${GITEA_DB_PASSWORD}
volumes:
- ${GITEA_DATA_PATH}/postgres:/var/lib/postgresql/data
networks:
- gitea_net
gitea:
image: gitea/gitea:latest
container_name: gitea-server
restart: always
depends_on:
- db
environment:
USER_UID: 1000
USER_GID: 1000
GITEA__server__ROOT_URL: ${GITEA_EXTERNAL_URL}
GITEA__server__DOMAIN: ${GITEA_DOMAIN}
GITEA__server__SSH_DOMAIN: ${GITEA_DOMAIN}
GITEA__server__SSH_PORT: ${SSH_PORT}
GITEA__database__DB_TYPE: ${GITEA_DB_TYPE}
GITEA__database__HOST: ${GITEA_DB_HOST}
GITEA__database__NAME: ${GITEA_DB_NAME}
GITEA__database__USER: ${GITEA_DB_USER}
GITEA__database__PASSWD: ${GITEA_DB_PASSWORD}
GITEA__security__INSTALL_LOCK: true
GITEA__mailer__ENABLED: ${SMTP_ENABLE}
GITEA__mailer__HOST: ${SMTP_HOST}:${SMTP_PORT}
GITEA__mailer__USER: ${SMTP_USER}
GITEA__mailer__PASSWD: ${SMTP_PASS}
GITEA__mailer__FROM: ${SMTP_FROM}
GITEA__mailer__SKIP_VERIFY: ${SMTP_SKIP_VERIFY}
volumes:
- ${GITEA_DATA_PATH}/gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "${HTTP_PORT}:3000"
- "${SSH_PORT}:22"
networks:
- gitea_net
networks:
gitea_net:
driver: bridge

68
run.sh Normal file
View File

@@ -0,0 +1,68 @@
#!/usr/bin/env bash
set -e
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
echo ""
echo "========================================"
echo " Gitea Deployment Bootstrapper"
echo "========================================"
echo ""
if [ ! -f ".env" ]; then
echo -e "${YELLOW}[INFO] .env file not found.${NC}"
echo "Creating .env from template..."
cp .env.sample .env
echo ""
echo -e "${YELLOW}Please edit .env and rerun this script.${NC}"
exit 1
fi
source .env
if [[ -z "$GITEA_EXTERNAL_URL" || "$GITEA_EXTERNAL_URL" == *"example.com"* ]]; then
echo -e "${RED}[ERROR] Invalid GITEA_EXTERNAL_URL in .env${NC}"
exit 1
fi
if [[ -z "$GITEA_ROOT_PASSWORD" || ${#GITEA_ROOT_PASSWORD} -lt 8 ]]; then
echo -e "${RED}[ERROR] GITEA_ROOT_PASSWORD must be at least 8 characters.${NC}"
exit 1
fi
echo -e "${GREEN}[INFO] Configuration validated.${NC}"
echo ""
echo "[STEP] Checking swap configuration..."
./scripts/setup-swap.sh || true
echo ""
echo "[STEP] Preparing SSL certificates (if HTTPS enabled)..."
./scripts/setup-ssl.sh || true
echo ""
echo "[STEP] Creating data directories..."
mkdir -p ${GITEA_DATA_PATH}/gitea
mkdir -p ${GITEA_DATA_PATH}/postgres
echo ""
echo "[STEP] Starting containers..."
docker compose up -d
echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}Gitea deployment started successfully${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
echo "Access your instance at:"
echo " $GITEA_EXTERNAL_URL"
echo ""
echo "Container status:"
docker compose ps

47
scripts/setup-ssl.sh Normal file
View File

@@ -0,0 +1,47 @@
#!/usr/bin/env bash
set -e
if [ ! -f ".env" ]; then
echo "[ERROR] .env file not found. Skipping SSL setup."
exit 1
fi
source .env
if [[ ! "$GITEA_EXTERNAL_URL" == https://* ]]; then
echo "[INFO] HTTPS not enabled in GITEA_EXTERNAL_URL. Skipping SSL setup."
exit 0
fi
if [[ -z "$SSL_CERT_PATH" || -z "$SSL_KEY_PATH" ]]; then
echo "[INFO] SSL_CERT_PATH or SSL_KEY_PATH not set. Skipping SSL copy."
exit 0
fi
if [ ! -f "$SSL_CERT_PATH" ]; then
echo "[ERROR] Certificate file not found: $SSL_CERT_PATH"
exit 1
fi
if [ ! -f "$SSL_KEY_PATH" ]; then
echo "[ERROR] Key file not found: $SSL_KEY_PATH"
exit 1
fi
echo "[INFO] Preparing Gitea SSL directory..."
mkdir -p ${GITEA_DATA_PATH}/gitea/https
echo "[INFO] Copying SSL certificates..."
cp "$SSL_CERT_PATH" ${GITEA_DATA_PATH}/gitea/https/cert.pem
cp "$SSL_KEY_PATH" ${GITEA_DATA_PATH}/gitea/https/key.pem
chmod 600 ${GITEA_DATA_PATH}/gitea/https/key.pem
echo "[SUCCESS] SSL certificates copied."
echo "Gitea will load them from:"
echo " /data/https/cert.pem"
echo " /data/https/key.pem"

65
scripts/setup-swap.sh Normal file
View File

@@ -0,0 +1,65 @@
#!/bin/bash
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
echo -e "${CYAN}--- System Swap Space Check ---${NC}"
SWAP_SIZE=$(free -m | awk '/^Swap:/ {print $2}')
if [ "$SWAP_SIZE" -gt "0" ]; then
echo -e "${GREEN}[OK] Swap space is already configured ($SWAP_SIZE MB). Skipping creation.${NC}"
exit 0
fi
RAM_SIZE=$(free -m | awk '/^Mem:/ {print $2}')
echo -e "${YELLOW}[WARNING] No swap space detected on this server!${NC}"
if [ "$RAM_SIZE" -le "4500" ]; then
echo -e "${RED}[CRITICAL] Your server has ~4GB RAM ($RAM_SIZE MB). A 4GB swap file is HIGHLY recommended.${NC}"
else
echo -e "${CYAN}Your server has plenty of RAM ($RAM_SIZE MB), but adding a swap file is still a safe fallback.${NC}"
fi
echo ""
read -p "Do you want to automatically create a 4GB swap file now? (Requires sudo password) (y/n): " -n 1 -r
echo ""
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo -e "${YELLOW}Skipping swap creation. If Gitea crashes, please create swap manually.${NC}"
exit 0
fi
echo -e "${CYAN}Allocating 4GB swap file... This may take a moment.${NC}"
sudo fallocate -l 4G /swapfile
if [ $? -ne 0 ]; then
echo -e "${RED}[ERROR] Failed to allocate space. Your disk might be full.${NC}"
exit 1
fi
echo -e "${CYAN}Securing file permissions...${NC}"
sudo chmod 600 /swapfile
echo -e "${CYAN}Formatting as swap...${NC}"
sudo mkswap /swapfile
echo -e "${CYAN}Enabling swap...${NC}"
sudo swapon /swapfile
if grep -q "/swapfile" /etc/fstab; then
echo -e "${YELLOW}[INFO] /swapfile entry already exists in /etc/fstab.${NC}"
else
echo -e "${CYAN}Adding swap to /etc/fstab to survive reboots...${NC}"
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab > /dev/null
fi
NEW_SWAP=$(free -m | awk '/^Swap:/ {print $2}')
if [ "$NEW_SWAP" -gt "0" ]; then
echo -e "${GREEN}[SUCCESS] 4GB Swap space successfully created and enabled!${NC}"
else
echo -e "${RED}[ERROR] Something went wrong. Swap is still reporting 0 MB.${NC}"
fi