Thanks to visit codestin.com
Credit goes to github.com

Skip to content

XianingY/AllCallAll

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

143 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

AllCallAll

English | ไธญๆ–‡


ไธญๆ–‡

ไธ€ไธชๅŸบไบŽ WebRTC ็š„ๅฎžๆ—ถ้Ÿณ่ง†้ข‘้€šไฟกๅนณๅฐ๏ผŒๆ”ฏๆŒ็‚นๅฏน็‚น่ฏญ้Ÿณ้€š่ฏใ€่”็ณปไบบ็ฎก็†ๅ’Œๅœจ็บฟ็Šถๆ€ๅŒๆญฅใ€‚

โœจ ็‰นๆ€ง

  • ๐ŸŽค ๅฎžๆ—ถ้Ÿณ่ง†้ข‘้€š่ฏ - ๅŸบไบŽ Pion WebRTC ็š„็‚นๅฏน็‚น้Ÿณ้ข‘้€š่ฏ
  • ๐ŸŒ ๅฎžๆ—ถ็ฟป่ฏ‘ - ็ฆป็บฟๆœฌๅœฐ AI ๆจกๅž‹๏ผŒ่ฏญ้Ÿณ่ฏ†ๅˆซ + ๆ–‡ๆœฌ็ฟป่ฏ‘ + ่ฏญ้Ÿณๅˆๆˆ (Whisper + Opus-MT + VITS)
  • ๐Ÿ‘ฅ ่”็ณปไบบ็ฎก็† - ๆทปๅŠ ใ€ๆœ็ดขๅ’Œ็ฎก็†้€š่ฎฏๅฝ•
  • ๐ŸŸข ๅœจ็บฟ็Šถๆ€ - ๅฎžๆ—ถๆ˜พ็คบ็”จๆˆทๅœจ็บฟ็Šถๆ€ๅ’Œๆœ€ๅŽๅœจ็บฟๆ—ถ้—ด
  • ๐Ÿ” ็”จๆˆท่ฎค่ฏ - JWT ไปค็‰Œ่ฎค่ฏๅ’Œไผš่ฏ็ฎก็†
  • ๐Ÿ“ฑ ่ทจๅนณๅฐ - Android ๅŽŸ็”Ÿๅบ”็”จๆ”ฏๆŒ๏ผŒiOS ๅผ€ๅ‘ไธญ
  • ๐Ÿš€ ้ซ˜ๆ€ง่ƒฝ - Redis ็ผ“ๅญ˜ใ€่ฟžๆŽฅๆฑ ไผ˜ๅŒ–ใ€ๅผ‚ๆญฅ WebSocket ไฟกไปค
  • ๐Ÿ”„ ่‡ชๅŠจ้‡่ฟž - ็ฝ‘็ปœๅผ‚ๅธธ่‡ชๅŠจ้‡ๆ–ฐ่ฟžๆŽฅ
  • ๐Ÿ”’ ้š็งไฟๆŠค - ๅฎŒๅ…จ็ฆป็บฟ็ฟป่ฏ‘๏ผŒๆ•ฐๆฎไธไธŠไผ ไบ‘็ซฏ

๐Ÿ›  ๆŠ€ๆœฏๆ ˆ

ๅŽ็ซฏ

  • ่ฏญ่จ€: Go 1.22+
  • ๆก†ๆžถ: Gin๏ผˆHTTP๏ผ‰ใ€Gorilla WebSocket
  • ๆ•ฐๆฎๅบ“: MySQL 8.0
  • ็ผ“ๅญ˜: Redis 7.2
  • WebRTC: Pion v4.0.0
  • ่ฎค่ฏ: JWT (golang-jwt)
  • ้‚ฎไปถ: SMTP (QQ้‚ฎ็ฎฑ smtp.qq.com:587)

็งปๅŠจ็ซฏ

  • ๆก†ๆžถ: React Native 0.74+
  • ๅผ€ๅ‘: Expo 51.0+๏ผˆExpo Development Client๏ผ‰
  • ่ฏญ่จ€: TypeScript
  • UI: React Navigation
  • WebRTC: react-native-webrtc 124.0.0
  • HTTP: Axios
  • ็Šถๆ€็ฎก็†: React Context API
  • ็ฆป็บฟ็ฟป่ฏ‘: Whisper (ASR) + Opus-MT (็ฟป่ฏ‘) + VITS (TTS)
  • ๆจกๅž‹้‡ๅŒ–: INT8 (70% ๅคงๅฐๅ‡ๅฐ‘)
  • ๅŽŸ็”Ÿ้›†ๆˆ: Android JNI + C++

ๅŸบ็ก€่ฎพๆ–ฝ

  • ๅฎนๅ™จๅŒ–: Docker & Docker Compose
  • ๆž„ๅปบ: Metro Bundlerใ€Expo CLI
  • ่ฐƒ่ฏ•: ADB (Android Debug Bridge)
  • ๆœๅŠกไปฃ็†: Cloudflare Tunnel๏ผˆๅฏ้€‰๏ผ‰

๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹

ๅ‰็ฝฎ่ฆๆฑ‚

  • ๅผ€ๅ‘ๆœบ: macOS / Linux
  • Node.js: 18.0 ๆˆ–ๆ›ดๆ–ฐ
  • Go: 1.22 ๆˆ–ๆ›ดๆ–ฐ
  • Docker: 20.10+๏ผˆๅฏ้€‰๏ผŒ็”จไบŽๆ•ฐๆฎๅบ“๏ผ‰
  • Android SDK: API ็บงๅˆซ 31+ ๏ผˆ็œŸๆœบ่ฐƒ่ฏ•๏ผ‰
  • ADB: Android Debug Bridge

ๅฎ‰่ฃ…ไพ่ต–

# ๅ…‹้š†้กน็›ฎ
git clone [email protected]:1victorloui1/AllCallAll.git
cd AllCallAll

# ๅฎ‰่ฃ…ๅŽ็ซฏไพ่ต–
cd backend
go mod download
cd ..

# ๅฎ‰่ฃ…็งปๅŠจ็ซฏไพ่ต–
cd mobile
npm install
cd ..

ๅฏๅŠจๆ•ฐๆฎๅบ“ๆœๅŠก

# ๅฏๅŠจ MySQL ๅ’Œ Redis
./scripts/development/start-services.sh

# ้ชŒ่ฏๆœๅŠก็Šถๆ€
docker compose -f infra/docker-compose.yml ps

ๅฏๅŠจๅŽ็ซฏๆœๅŠก

ๅ‰็ฝฎๆญฅ้ชค๏ผš้…็ฝฎ้‚ฎไปถๆœๅŠก๏ผˆQQ้‚ฎ็ฎฑ๏ผ‰

cd backend

# 1. ๅคๅˆถ็Žฏๅขƒๅ˜้‡็คบไพ‹ๆ–‡ไปถ
cp .env.example .env

# 2. ็ผ–่พ‘ .env๏ผŒๅกซๅ…ฅ QQ ้‚ฎ็ฎฑๆŽˆๆƒ็ 
# MAIL_PASSWORD=xxxx xxxx xxxx xxxx  (็™ปๅฝ•ไฝ ่‡ชๅทฑ็š„ๅฎž้™…ๆŽˆๆƒ็ )

# 3. ้ชŒ่ฏๅŽ็ซฏ้…็ฝฎๆ–‡ไปถไธญ็š„้‚ฎไปถ่ฎพ็ฝฎ
cat configs/config.yaml | grep -A5 mail:
# ๅบ”่ฏฅๆ˜พ็คบ๏ผš
#   host: smtp.qq.com
#   port: 587
#   username: [email protected]

ๅฏๅŠจๅŽ็ซฏๆœๅŠก

cd backend

# ่ฎพ็ฝฎ้…็ฝฎๆ–‡ไปถ่ทฏๅพ„
export CONFIG_PATH=./configs/config.yaml

# ่ฟ่กŒๅŽ็ซฏๆœๅŠก๏ผˆ็›‘ๅฌ 0.0.0.0:8080๏ผ‰
go run cmd/server/main.go

# ้ชŒ่ฏๅŽ็ซฏๆ˜ฏๅฆ่ฟ่กŒ
curl http://localhost:8080/api/v1/health

WebRTC/TURN ้…็ฝฎ๏ผˆ็œŸๆœบ่ฏญ้Ÿณๅฟ…้œ€๏ผ‰

  1. ๅœจๆœๅŠกๅ™จไธŠๅ‡†ๅค‡ TURN๏ผˆ็คบไพ‹๏ผŒ็ซฏๅฃ 3478๏ผ‰๏ผš
    docker run -d --network host --name coturn instrumentisto/coturn \
      -a -f -v -n --log-file=stdout \
      --realm=allcallall --user=allcallall:strongpassword \
      --external-ip=$(curl -s ifconfig.me) \
      --min-port=49152 --max-port=49200
  2. ๆŠŠ TURN/STUN ๅˆ—่กจไธ‹ๅ‘็ป™ๅŽ็ซฏ๏ผˆ็งปๅŠจ็ซฏไผš่‡ชๅŠจๆ‹‰ๅ–๏ผ‰๏ผš

export WEBRTC_ICE_SERVERS_JSON='[ {"urls":["stun:stun.l.google.com:19302"]}, {"urls":["turn:81.68.168.207:3478?transport=udp","turn:81.68.168.207:3478?transport=tcp"],"username":"allcallall","credential":"strongpassword"} ]'

3. ้‡ๅฏๅŽ็ซฏใ€‚APK ไธ้œ€่ฆ้‡ๆ–ฐๆ‰“ๅŒ…๏ผŒ็™ป้™†ๅŽๅฎขๆˆท็ซฏไผš่‡ชๅŠจไปŽ `/api/v1/webrtc/config` ่ฏปๅ–ๆœ€ๆ–ฐ ICE/TURN ้…็ฝฎใ€‚

### ๐ŸŒ ็”Ÿไบง็Žฏๅขƒ๏ผˆๅฝ“ๅ‰้ƒจ็ฝฒ๏ผš81.68.168.207๏ผ‰

- API: `http://81.68.168.207/api/v1`  
- WS: `ws://81.68.168.207/api/v1/ws`

#### ไบ‘ๆœๅŠกๅ™จ่ฟ็ปด

```bash
# ่ฟ›ๅ…ฅ้ƒจ็ฝฒ็›ฎๅฝ•
cd ~/workspace/AllCallAll-deploy-server/infra

# ้ฆ–ๆฌกๆˆ–้‡ๆ–ฐๆž„ๅปบๅฏๅŠจ๏ผˆ็กฎไฟ .env ๅกซๅฅฝ๏ผ‰
docker compose -f docker-compose.production.yml up -d --build

# ๅธธ่ง„้‡ๅฏๅŽ็ซฏ/nginx
docker compose -f docker-compose.production.yml up -d

# ๅ…ณ้—ญๆ‰€ๆœ‰ๆœๅŠก
docker compose -f docker-compose.production.yml down

TURN ๆœๅŠก (coturn)

# ้ฆ–ๆฌกๅฏๅŠจ TURN๏ผˆ็›‘ๅฌ 3478๏ผŒ็ซฏๅฃ่Œƒๅ›ด 49152-49200๏ผ‰
docker run -d --network host --name coturn instrumentisto/coturn \
  -a -f -v -n --log-file=stdout \
  --realm=allcallall --user=allcallall:strongpassword \
  --external-ip=$(curl -s ifconfig.me) \
  --min-port=49152 --max-port=49200

# ไน‹ๅŽๅฏๅŠจ/ๅœๆญข
docker start coturn
docker stop coturn

ๆ•ฐๆฎๆธ…็†๏ผˆๅˆ ้™คๆ‰€ๆœ‰่ดฆๅทๆ•ฐๆฎ๏ผ‰

docker exec -it infra-mysql-1 mysql -uroot -p"$MYSQL_ROOT_PASSWORD" allcallall_db \
  -e "SET FOREIGN_KEY_CHECKS=0;
      TRUNCATE TABLE contacts;
      TRUNCATE TABLE email_verification_codes;
      TRUNCATE TABLE email_send_logs;
      TRUNCATE TABLE users;
      SET FOREIGN_KEY_CHECKS=1;"

๐Ÿ“ฆ ็งปๅŠจ็ซฏ Release APK ๆž„ๅปบ๏ผˆๆœฌๅœฐ๏ผ‰

cd mobile
npm install
cd android
./gradlew assembleRelease
cp app/build/outputs/apk/release/app-release.apk ../AllCallAll.apk
# ๅฏ้€‰๏ผšๅฎ‰่ฃ…ๅˆฐ็œŸๆœบ
adb install -r ../AllCallAll.apk

ๅฏๅŠจ็งปๅŠจๅบ”็”จ

ๆŽจ่ๆ–นๅผ๏ผšExpo Development Client + ADB ๅๅ‘่ฝฌๅ‘๏ผˆๆœ€็จณๅฎš๏ผ‰

cd mobile

# ไฝฟ็”จ่‡ชๅŠจๅŒ–่„šๆœฌๅฏๅŠจ๏ผˆๆŽจ่๏ผ‰
bash scripts/dev-client-debug.sh

# ๆˆ–ๆ‰‹ๅŠจๆญฅ้ชค๏ผš
# 1. ้…็ฝฎ ADB ๅๅ‘่ฝฌๅ‘
adb reverse tcp:8080 tcp:8080
adb reverse tcp:8081 tcp:8081

# 2. ๅฏๅŠจ Metro ๅผ€ๅ‘ๆœๅŠกๅ™จ
npm run start:dev-client

# 3. ๅœจ็œŸๆœบไธŠๆ‰ซๆไบŒ็ปด็ ๆˆ–่พ“ๅ…ฅ Metro ๆ˜พ็คบ็š„ URL

ๆ–นๅผ 2: Wi-Fi ๆ— ็บฟ่ฐƒ่ฏ•๏ผˆLAN ๆจกๅผ - ๅฏ้€‰๏ผ‰

cd mobile

# ๅฏๅŠจ Metro ๆœๅŠกๅ™จ๏ผˆLAN ๆจกๅผ๏ผ‰
npm run start:dev-client:lan

# ๆˆ–ไฝฟ็”จไผ ็ปŸ Expo Go
npm run start:lan

# ๅœจ็œŸๆœบๆ‘‡ไธ€ๆ‘‡่œๅ•ไธญ้€‰ๆ‹ฉ 'Change Bundle URL'๏ผŒ่พ“ๅ…ฅๆ˜พ็คบ็š„ LAN ๅœฐๅ€

ๆ–นๅผ 3: ๆž„ๅปบ่‡ชๅฎšไน‰ๅผ€ๅ‘ๅฎขๆˆท็ซฏ APK

cd mobile

# ้ฆ–ๆฌกๆˆ–้œ€่ฆๆ›ดๆ–ฐๅฎขๆˆท็ซฏๆ—ถ่ฟ่กŒ
npm run android

# ่ฟ™ไผšๆž„ๅปบๅนถๅฎ‰่ฃ… Expo Development Client

๐Ÿ“ ็›ฎๅฝ•็ป“ๆž„

allcall/
โ”œโ”€โ”€ backend/                    # Go ๅŽ็ซฏๆœๅŠก
โ”‚   โ”œโ”€โ”€ cmd/
โ”‚   โ”‚   โ””โ”€โ”€ server/             # ๅบ”็”จๅ…ฅๅฃ็‚น
โ”‚   โ”œโ”€โ”€ internal/
โ”‚   โ”‚   โ”œโ”€โ”€ auth/               # ่ฎค่ฏๅ’Œ JWT
โ”‚   โ”‚   โ”œโ”€โ”€ user/               # ็”จๆˆท็ฎก็†
โ”‚   โ”‚   โ”œโ”€โ”€ contact/            # ่”็ณปไบบ็ฎก็†
โ”‚   โ”‚   โ”œโ”€โ”€ signaling/          # WebRTC ไฟกไปค
โ”‚   โ”‚   โ”œโ”€โ”€ media/              # Pion WebRTC ๅช’ไฝ“ๅผ•ๆ“Ž
โ”‚   โ”‚   โ”œโ”€โ”€ presence/           # ๅœจ็บฟ็Šถๆ€็ฎก็†
โ”‚   โ”‚   โ”œโ”€โ”€ models/             # ๆ•ฐๆฎๆจกๅž‹
โ”‚   โ”‚   โ”œโ”€โ”€ handlers/           # HTTP ๅค„็†ๅ™จ
โ”‚   โ”‚   โ”œโ”€โ”€ database/           # ๆ•ฐๆฎๅบ“่ฟžๆŽฅ
โ”‚   โ”‚   โ””โ”€โ”€ cache/              # Redis ็ผ“ๅญ˜
โ”‚   โ”œโ”€โ”€ configs/                # ้…็ฝฎๆ–‡ไปถ
โ”‚   โ””โ”€โ”€ Dockerfile              # Docker ้•œๅƒ
โ”‚
โ”œโ”€โ”€ mobile/                     # React Native ็งปๅŠจๅบ”็”จ
โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”‚   โ”œโ”€โ”€ screens/            # ๅบ”็”จ้กต้ข
โ”‚   โ”‚   โ”œโ”€โ”€ components/         # UI ็ป„ไปถ
โ”‚   โ”‚   โ”œโ”€โ”€ context/            # ็Šถๆ€็ฎก็†๏ผˆAuthใ€Signaling๏ผ‰
โ”‚   โ”‚   โ”œโ”€โ”€ navigation/         # ่ทฏ็”ฑ้…็ฝฎ
โ”‚   โ”‚   โ”œโ”€โ”€ config/             # ๅบ”็”จ้…็ฝฎ
โ”‚   โ”‚   โ””โ”€โ”€ utils/              # ๅทฅๅ…ทๅ‡ฝๆ•ฐ
โ”‚   โ”œโ”€โ”€ android/                # Android ๅŽŸ็”Ÿไปฃ็ 
โ”‚   โ”œโ”€โ”€ metro.config.js         # Metro ๆ‰“ๅŒ…ๅ™จ้…็ฝฎ
โ”‚   โ”œโ”€โ”€ app.json                # Expo ้…็ฝฎ
โ”‚   โ””โ”€โ”€ package.json
โ”‚
โ”œโ”€โ”€ infra/                      # ๅŸบ็ก€่ฎพๆ–ฝ้…็ฝฎ
โ”‚   โ”œโ”€โ”€ docker-compose.yml      # ๆœฌๅœฐๅผ€ๅ‘็Žฏๅขƒ
โ”‚   โ”œโ”€โ”€ docker-compose.production.yml  # ็”Ÿไบง็Žฏๅขƒ
โ”‚   โ”œโ”€โ”€ cloudflared-config.yml  # Cloudflare Tunnel ้…็ฝฎ
โ”‚   โ””โ”€โ”€ deploy-cloudflare-tunnel.sh  # Cloudflare Tunnel ้ƒจ็ฝฒ่„šๆœฌ
โ”‚
โ””โ”€โ”€ scripts/development/        # ๅผ€ๅ‘่พ…ๅŠฉ่„šๆœฌ
    โ”œโ”€โ”€ start-services.sh       # ๅฏๅŠจๆœฌๅœฐ MySQL/Redis
    โ””โ”€โ”€ restart-services.sh     # ้‡ๅฏๆ•ฐๆฎๅบ“ไธŽๅŽ็ซฏ

๐Ÿ”ง ๅผ€ๅ‘่ฐƒ่ฏ•

Metro ๅผ€ๅ‘ๆœๅŠกๅ™จ

Metro ไผš่‡ชๅŠจๆฃ€ๆต‹ๆœฌๆœบ LAN IP ๅนถๅŠจๆ€็ป‘ๅฎšใ€‚ๆŸฅ็œ‹ๅฏๅŠจๆ—ฅๅฟ—่Žทๅ– URL๏ผš

npm run start

# ่พ“ๅ‡บ็คบไพ‹๏ผš
# ๐Ÿ“ฑ Metroๅผ€ๅ‘ๆœๅŠกๅ™จ้…็ฝฎ๏ผš
#    LAN IP: 192.168.1.36
#    Metro URL: http://192.168.1.36:8081
#    API URL: http://192.168.1.36:8080
#    โœ… ๆ”ฏๆŒUSB่ฟžๆŽฅๅ’ŒWi-Fi่ฟžๆŽฅไธค็งๆจกๅผ

็ฝ‘็ปœ้…็ฝฎ

ๅฝ“ๅ‰้…็ฝฎไฝฟ็”จ ADB ๅๅ‘่ฝฌๅ‘ๆ–นๆกˆ๏ผˆๆŽจ่๏ผ‰๏ผš

# ่‡ชๅŠจ้…็ฝฎ๏ผˆไฝฟ็”จ่„šๆœฌ๏ผ‰
bash scripts/dev-client-debug.sh

# ๆ‰‹ๅŠจ้…็ฝฎ
adb reverse tcp:8080 tcp:8080  # ๅŽ็ซฏ API ๆœๅŠก
adb reverse tcp:8081 tcp:8081  # Metro ๅผ€ๅ‘ๆœๅŠกๅ™จ

ๅ‰็ซฏๅบ”็”จ้…็ฝฎ๏ผˆ่‡ชๅŠจไฝฟ็”จ localhost๏ผ‰๏ผš

// src/config/index.ts
const API_HOST = "http://localhost:8080";  // ้€š่ฟ‡ ADB ่ฝฌๅ‘
const WS_HOST = "ws://localhost:8080";      // WebSocket ไนŸ้€š่ฟ‡่ฝฌๅ‘

ไธบไป€ไนˆไฝฟ็”จ ADB ๅๅ‘่ฝฌๅ‘๏ผŸ

  • โœ… ๆฏ”็›ดๆŽฅไฝฟ็”จ LAN IP ๆ›ด็จณๅฎšๅฏ้ 
  • โœ… ไธŽๆœฌๅœฐๅผ€ๅ‘็Žฏๅขƒไธ€่‡ด
  • โœ… ๆ”ฏๆŒๅคš่ฎพๅค‡ๅŒๆ—ถ่ฐƒ่ฏ•
  • โœ… ็ฝ‘็ปœๆ›ด็จณๅฎš๏ผŒๅปถ่ฟŸๆ›ดไฝŽ

ๅฏ้€‰๏ผšLAN ๆจกๅผ๏ผˆWi-Fi ่ฐƒ่ฏ•๏ผ‰

  • ๅผ€ๅ‘ๆœบ IP๏ผš192.168.31.217
  • ไฝฟ็”จๅœบๆ™ฏ๏ผš้œ€่ฆๆ— ็บฟ่‡ช็”ฑ็งปๅŠจ็š„ๅผ€ๅ‘ๆต‹่ฏ•

ๅธธ็”จๅผ€ๅ‘ๅ‘ฝไปค

cd mobile

# ๅฏๅŠจ Metro ๅผ€ๅ‘ๆœๅŠกๅ™จ
npm run start

# LAN ๆจกๅผๅฏๅŠจ๏ผˆWi-Fi ่ฐƒ่ฏ•๏ผ‰
npm run start:lan

# Tunnel ๆจกๅผ๏ผˆ่ทจ็ฝ‘็ปœ๏ผ‰
npm run start:tunnel

# ๆž„ๅปบ่‡ชๅฎšไน‰ๅผ€ๅ‘ๅฎขๆˆท็ซฏ
npm run android

# ไปฃ็ ๆฃ€ๆŸฅ
npm run lint

่ฐƒ่ฏ•็œŸๆœบๅบ”็”จ

# ๆŸฅ็œ‹่ฎพๅค‡ๆ—ฅๅฟ—
adb logcat

# ๆธ…้™คๅบ”็”จๆ•ฐๆฎๅนถ้‡ๅฏ
adb shell pm clear com.allcallall.mobile
adb shell am start -n com.allcallall.mobile/.MainActivity

# ้…็ฝฎ ADB ๅๅ‘็ซฏๅฃ่ฝฌๅ‘
adb reverse tcp:8080 tcp:8080
adb reverse tcp:8081 tcp:8081

๐Ÿ“ก API ็ซฏ็‚น

่ฎค่ฏ

POST   /api/v1/auth/register     - ็”จๆˆทๆณจๅ†Œ
POST   /api/v1/auth/login        - ็”จๆˆท็™ปๅฝ•

็”จๆˆท

GET    /api/v1/users/contacts    - ่Žทๅ–่”็ณปไบบๅˆ—่กจ
GET    /api/v1/users/presence    - ่Žทๅ–็”จๆˆทๅœจ็บฟ็Šถๆ€
GET    /api/v1/users/search      - ๆœ็ดข็”จๆˆท

ไฟกไปค

GET    /api/v1/ws                - WebSocket ่ฟžๆŽฅ

๐Ÿ› ๅธธ่ง้—ฎ้ข˜

็œŸๆœบๆ— ๆณ•่ฟžๆŽฅๅˆฐๅผ€ๅ‘ๆœๅŠกๅ™จ

้—ฎ้ข˜: AxiosError: Network Error ๆˆ– Network timeout

่งฃๅ†ณๆ–นๆกˆ:

  1. ๆฃ€ๆŸฅ ADB ๅๅ‘่ฝฌๅ‘้…็ฝฎ

    adb reverse --list
    # ๅบ”่ฏฅๆ˜พ็คบ๏ผš
    # tcp:8080 tcp:8080
    # tcp:8081 tcp:8081
    
    # ๅฆ‚ๆžœ็ผบๅฐ‘๏ผŒ้‡ๆ–ฐ้…็ฝฎ
    adb reverse tcp:8080 tcp:8080
    adb reverse tcp:8081 tcp:8081
  2. ้ชŒ่ฏๅŽ็ซฏๆœๅŠกๆ˜ฏๅฆ่ฟ่กŒ

    curl http://localhost:8080/api/v1/health
  3. ๆฃ€ๆŸฅๅ‰็ซฏ้…็ฝฎ

    cat mobile/src/config/index.ts
    # ๅบ”่ฏฅๆ˜พ็คบ API_HOST = "http://localhost:8080"
  4. ๆธ…้™คๅบ”็”จๆ•ฐๆฎๅนถ้‡ๆ–ฐๅฏๅŠจ

    adb shell pm clear com.allcallall.mobile
    # ๅœจ็œŸๆœบไธŠ้‡ๆ–ฐๆ‰ซๆ Metro ไบŒ็ปด็ 
  5. ่ฟ่กŒๅฎŒๆ•ดๅฏๅŠจ่„šๆœฌ

    bash mobile/scripts/dev-client-debug.sh

Metro ็ผ–่ฏ‘ๅคฑ่ดฅๆˆ–่™šๆ‹Ÿๅ…ฅๅฃ็‚น 404 ้”™่ฏฏ

้—ฎ้ข˜: Unable to resolve module ./.expo/.virtual-metro-entry ๆˆ–็ผ–่ฏ‘ๅคฑ่ดฅ

่งฃๅ†ณๆ–นๆกˆ:

  1. ไฝฟ็”จ่‡ชๅŠจๅŒ–่„šๆœฌ๏ผˆๆŽจ่ - ่‡ชๅŠจๅค„็†่™šๆ‹Ÿๅ…ฅๅฃ็‚น๏ผ‰

    bash mobile/scripts/dev-client-debug.sh
  2. ๆ‰‹ๅŠจๆธ…็†ๅ’Œ้‡ๅฏ

    # ๆธ…็†็ผ“ๅญ˜
    rm -rf mobile/node_modules/.cache /tmp/metro-*
    
    # ไฟๆŠค่™šๆ‹Ÿๅ…ฅๅฃ็‚นๆ–‡ไปถ๏ผˆไธ่ฆๅˆ ้™ค๏ผ‰
    ls -la mobile/.expo/.virtual-metro-entry.js
    
    # ๅฆ‚ๆžœ่™šๆ‹Ÿๅ…ฅๅฃ็‚นๆ–‡ไปถไธขๅคฑ๏ผŒ้‡ๅปบๅฎƒ
    mkdir -p mobile/.expo
    cat > mobile/.expo/.virtual-metro-entry.js << 'EOF'

import { registerRootComponent } from 'expo'; import App from '../App'; registerRootComponent(App); EOF

้‡ๆ–ฐๅฎ‰่ฃ…ไพ่ต–ๅ’ŒๅฏๅŠจ

cd mobile npm install npm run start:dev-client


โš ๏ธ **ๅ…ณ้”ฎๆ็คบ**: `.virtual-metro-entry.js` ๆ˜ฏ Metro ๅฟ…้œ€็š„่™šๆ‹Ÿๅ…ฅๅฃ็‚นๆ–‡ไปถ๏ผŒ**็ปไธ่ƒฝๅˆ ้™ค**ใ€‚่ฟ่กŒ่„šๆœฌไผš่‡ชๅŠจไฟๆŠคๅฎƒใ€‚

### ๅŽ็ซฏๆœๅŠกๆ— ๆณ•ๅฏๅŠจๆˆ–้‚ฎไปถๆ— ๆณ•ๅ‘้€

**้—ฎ้ข˜ 1**: `failed to connect mysql`

**่งฃๅ†ณๆ–นๆกˆ**:
```bash
# ็กฎไฟๆ•ฐๆฎๅบ“ๆœๅŠกๅทฒๅฏๅŠจ
./scripts/development/start-services.sh

# ๆฃ€ๆŸฅ MySQL ่ฟžๆŽฅ
mysql -u allcallall -p allcallall_db -h localhost

# ้ชŒ่ฏ Redis ่ฟžๆŽฅ
redis-cli ping

้—ฎ้ข˜ 2: ้‚ฎไปถๆ— ๆณ•ๅ‘้€ๆˆ–้ชŒ่ฏ็ ๆ— ๆณ•ๆŽฅๆ”ถ

่งฃๅ†ณๆ–นๆกˆ:

# ๆฃ€ๆŸฅ QQ ้‚ฎ็ฎฑ SMTP ้…็ฝฎ
cat backend/configs/config.yaml | grep -A5 mail:

# ้ชŒ่ฏ็Žฏๅขƒๅ˜้‡
echo $MAIL_PASSWORD

# ๆต‹่ฏ•้‚ฎไปถๅ‘้€็ซฏ็‚น
curl -X POST http://localhost:8080/api/v1/email/send-verification-code \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]"}'

# ้ข„ๆœŸๅ“ๅบ”: {"message":"verification code sent successfully"}

๐Ÿ“š ๅผ€ๅ‘ๆŒ‡ๅ—

ไปฃ็ ้ฃŽๆ ผ

  • Go: ้ตๅพช Effective Go
  • TypeScript: ESLint ้…็ฝฎ่ง„่Œƒ
  • Kotlin: Android ๅฎ˜ๆ–น้ฃŽๆ ผๆŒ‡ๅ—

ๅˆ†ๆ”ฏ็ญ–็•ฅ

  • main - ็จณๅฎšๅ‘ๅธƒ็‰ˆๆœฌ๏ผˆๅ”ฏไธ€้•ฟๆœŸไธปๅนฒ๏ผ‰
  • feature/* - ๅŠŸ่ƒฝๅˆ†ๆ”ฏ๏ผˆไปŽ main ๅˆ‡ๅ‡บ๏ผ‰
  • hotfix/* - ็ดงๆ€ฅไฟฎๅคๅˆ†ๆ”ฏ๏ผˆไปŽ main ๅˆ‡ๅ‡บ๏ผ‰

PR ๆต็จ‹๏ผšfeature/* / hotfix/* ็›ดๆŽฅๆไบคๅˆฐ main๏ผˆTrunk-based๏ผ‰ใ€‚

๐Ÿค ่ดก็ŒฎๆŒ‡ๅ—

  1. Fork ้กน็›ฎ
  2. ๅˆ›ๅปบ็‰นๆ€งๅˆ†ๆ”ฏ (git checkout -b feature/AmazingFeature)
  3. ๆไบคๆ›ดๆ”น (git commit -m 'Add some AmazingFeature')
  4. ๆŽจ้€ๅˆฐๅˆ†ๆ”ฏ (git push origin feature/AmazingFeature)
  5. ๅผ€ๅฏ Pull Request

๐Ÿ“ ่ฎธๅฏ่ฏ

MIT License - ่ฏฆ่ง LICENSE ๆ–‡ไปถ

๐Ÿ“ง ่”็ณปๆ–นๅผ

๐Ÿ™ ่‡ด่ฐข


English

Real-time audio/video communication platform built with WebRTC and React Native.

โœจ Features

  • ๐ŸŽค Real-time Audio/Video Calls - Peer-to-peer audio calls based on Pion WebRTC
  • ๐Ÿ‘ฅ Contact Management - Add, search, and manage contacts
  • ๐ŸŸข Online Status - Real-time user presence and last seen information
  • ๐Ÿ” User Authentication - JWT token authentication and session management via email
  • ๐Ÿ“ง Email Verification - Secure user registration with QQ SMTP email verification
  • ๐Ÿ“ฑ Cross-Platform - Native Android support, iOS in development
  • ๐Ÿš€ High Performance - Redis caching, connection pooling, async WebSocket signaling
  • ๐Ÿ”„ Auto Reconnection - Automatic reconnection on network failure

๐Ÿ›  Technology Stack

Backend

  • Language: Go 1.22+
  • Framework: Gin (HTTP), Gorilla WebSocket
  • Database: MySQL 8.0
  • Cache: Redis 7.2
  • WebRTC: Pion v4.0.0
  • Authentication: JWT (golang-jwt)
  • Email: SMTP (QQ Mail smtp.qq.com:587)

Mobile

  • Framework: React Native 0.74+
  • Development: Expo 51.0+ (Expo Development Client)
  • Language: TypeScript
  • UI: React Navigation
  • WebRTC: react-native-webrtc 124.0.0
  • HTTP: Axios
  • State Management: React Context API

Infrastructure

  • Containerization: Docker & Docker Compose
  • Build: Metro Bundler, Expo CLI
  • Debug: ADB (Android Debug Bridge)
  • Service Proxy: Cloudflare Tunnel (Optional)

๐Ÿš€ Getting Started

Prerequisites

  • Development Machine: macOS / Linux
  • Node.js: 18.0 or newer
  • Go: 1.22 or newer
  • Docker: 20.10+ (optional, for databases)
  • Android SDK: API level 31+ (physical device debugging)
  • ADB: Android Debug Bridge

Install Dependencies

# Clone the repository
git clone [email protected]:1victorloui1/AllCallAll.git
cd AllCallAll

# Install backend dependencies
cd backend
go mod download
cd ..

# Install mobile dependencies
cd mobile
npm install
cd ..

๐ŸŒ Production Deployment (current server: 81.68.168.207)

  • API: http://81.68.168.207/api/v1
  • WS: ws://81.68.168.207/api/v1/ws

Cloud server ops

cd ~/workspace/AllCallAll-deploy-server/infra

# First time or rebuild/start (ensure .env is filled)
docker compose -f docker-compose.production.yml up -d --build

# Regular restart
docker compose -f docker-compose.production.yml up -d

# Stop all services
docker compose -f docker-compose.production.yml down

TURN (coturn)

# First start (ports: 3478, relay 49152-49200)
docker run -d --network host --name coturn instrumentisto/coturn \
  -a -f -v -n --log-file=stdout \
  --realm=allcallall --user=allcallall:strongpassword \
  --external-ip=$(curl -s ifconfig.me) \
  --min-port=49152 --max-port=49200

# Afterwards
docker start coturn
docker stop coturn

Data reset (wipe all accounts)

docker exec -it infra-mysql-1 mysql -uroot -p"$MYSQL_ROOT_PASSWORD" allcallall_db \
  -e "SET FOREIGN_KEY_CHECKS=0;
      TRUNCATE TABLE contacts;
      TRUNCATE TABLE email_verification_codes;
      TRUNCATE TABLE email_send_logs;
      TRUNCATE TABLE users;
      SET FOREIGN_KEY_CHECKS=1;"

Start Database Services

# Start MySQL and Redis
./scripts/development/start-services.sh

# Verify service status
docker compose -f infra/docker-compose.yml ps

Start Backend Service

Prerequisite: Configure email service (QQ Mail)

cd backend

# 1. Copy environment variable example file
cp .env.example .env

# 2. Edit .env and fill in QQ Mail authorization code
# MAIL_PASSWORD=xxxx xxxx xxxx xxxx  (enter your actual authorization code)

# 3. Verify backend mail config in config.yaml
cat configs/config.yaml | grep -A5 mail:
# Should show:
#   host: smtp.qq.com
#   port: 587
#   username: [email protected]

# 4. Set configuration file path
export CONFIG_PATH=./configs/config.yaml

# 5. Run backend service (listening on 0.0.0.0:8080)
go run cmd/server/main.go

# 6. Verify backend is running
curl http://localhost:8080/api/v1/health

Start Mobile Application

Recommended: Expo Development Client + ADB Reverse Forwarding (Most Stable)

cd mobile

# Using automated script (Recommended)
bash scripts/dev-client-debug.sh

# Or manual steps:
# 1. Configure ADB reverse port forwarding
adb reverse tcp:8080 tcp:8080
adb reverse tcp:8081 tcp:8081

# 2. Start Metro development server
npm run start:dev-client

# 3. Scan QR code on physical device or enter the URL shown by Metro
Method 2: Wireless Debugging over Wi-Fi (LAN Mode - Optional)
cd mobile

# Start Metro server (LAN mode)
npm run start:dev-client:lan

# Or use traditional Expo Go
npm run start:lan

# In the app, shake the device and select 'Change Bundle URL', enter the displayed LAN address
Method 3: Build Custom Development Client APK
cd mobile

# Run when first installing or updating the client
npm run android

# This builds and installs the Expo Development Client

๐Ÿ“ฆ Build Release APK (local)

cd mobile
npm install
cd android
./gradlew assembleRelease
cp app/build/outputs/apk/release/app-release.apk ../AllCallAll.apk
# Optional: install to device
adb install -r ../AllCallAll.apk

๐Ÿ“ Directory Structure

allcall/
โ”œโ”€โ”€ backend/                    # Go backend service
โ”‚   โ”œโ”€โ”€ cmd/
โ”‚   โ”‚   โ””โ”€โ”€ server/             # Application entry point
โ”‚   โ”œโ”€โ”€ internal/
โ”‚   โ”‚   โ”œโ”€โ”€ auth/               # Authentication and JWT
โ”‚   โ”‚   โ”œโ”€โ”€ user/               # User management
โ”‚   โ”‚   โ”œโ”€โ”€ contact/            # Contact management
โ”‚   โ”‚   โ”œโ”€โ”€ signaling/          # WebRTC signaling
โ”‚   โ”‚   โ”œโ”€โ”€ media/              # Pion WebRTC media engine
โ”‚   โ”‚   โ”œโ”€โ”€ presence/           # Online status management
โ”‚   โ”‚   โ”œโ”€โ”€ models/             # Data models
โ”‚   โ”‚   โ”œโ”€โ”€ handlers/           # HTTP handlers
โ”‚   โ”‚   โ”œโ”€โ”€ database/           # Database connection
โ”‚   โ”‚   โ””โ”€โ”€ cache/              # Redis cache
โ”‚   โ”œโ”€โ”€ configs/                # Configuration files
โ”‚   โ””โ”€โ”€ Dockerfile              # Docker image
โ”‚
โ”œโ”€โ”€ mobile/                     # React Native mobile application
โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”‚   โ”œโ”€โ”€ screens/            # Application pages
โ”‚   โ”‚   โ”œโ”€โ”€ components/         # UI components
โ”‚   โ”‚   โ”œโ”€โ”€ context/            # State management (Auth, Signaling)
โ”‚   โ”‚   โ”œโ”€โ”€ navigation/         # Routing configuration
โ”‚   โ”‚   โ”œโ”€โ”€ config/             # Application configuration
โ”‚   โ”‚   โ””โ”€โ”€ utils/              # Utility functions
โ”‚   โ”œโ”€โ”€ android/                # Android native code
โ”‚   โ”œโ”€โ”€ metro.config.js         # Metro bundler configuration
โ”‚   โ”œโ”€โ”€ app.json                # Expo configuration
โ”‚   โ””โ”€โ”€ package.json
โ”‚
โ”œโ”€โ”€ infra/                      # Infrastructure configuration
โ”‚   โ”œโ”€โ”€ docker-compose.yml      # Local development environment
โ”‚   โ”œโ”€โ”€ docker-compose.production.yml  # Production environment
โ”‚   โ”œโ”€โ”€ cloudflared-config.yml  # Cloudflare Tunnel configuration
โ”‚   โ””โ”€โ”€ deploy-cloudflare-tunnel.sh  # Cloudflare Tunnel deployment script
โ”‚
โ””โ”€โ”€ scripts/development/        # Development helper scripts
    โ”œโ”€โ”€ start-services.sh       # Start local MySQL/Redis
    โ””โ”€โ”€ restart-services.sh     # Restart database and backend

๐Ÿ”ง Development & Debugging

Metro Development Server

Metro automatically detects the local LAN IP and binds dynamically. Check the startup log for the URL:

npm run start

# Sample output:
# ๐Ÿ“ฑ Metro Development Server Configuration:
#    LAN IP: 192.168.1.36
#    Metro URL: http://192.168.1.36:8081
#    API URL: http://192.168.1.36:8080
#    โœ… Supports both USB and Wi-Fi connection modes

Network Configuration

Current configuration uses ADB Reverse Forwarding (Recommended):

# Automatic configuration (using script)
bash scripts/dev-client-debug.sh

# Manual configuration
adb reverse tcp:8080 tcp:8080  # Backend API service
adb reverse tcp:8081 tcp:8081  # Metro development server

Frontend app configuration (automatically uses localhost):

// src/config/index.ts
const API_HOST = "http://localhost:8080";  // Forwarded by ADB
const WS_HOST = "ws://localhost:8080";      // WebSocket also forwarded

Why use ADB reverse forwarding?

  • โœ… More stable and reliable than direct LAN IP
  • โœ… Consistent with local development environment
  • โœ… Supports debugging multiple devices simultaneously
  • โœ… More stable network, lower latency

Optional: LAN Mode (Wi-Fi Debugging)

  • Development Machine IP: 192.168.31.217
  • Use Case: Development testing that requires wireless mobility

Common Development Commands

cd mobile

# Start Metro development server
npm run start

# Start in LAN mode (Wi-Fi debugging)
npm run start:lan

# Tunnel mode (cross-network)
npm run start:tunnel

# Build custom development client
npm run android

# Code linting
npm run lint

Debug Physical Device

# View device logs
adb logcat

# Clear app data and restart
adb shell pm clear com.allcallall.mobile
adb shell am start -n com.allcallall.mobile/.MainActivity

# Configure ADB reverse port forwarding
adb reverse tcp:8080 tcp:8080
adb reverse tcp:8081 tcp:8081

๐Ÿ“ก API Endpoints

Authentication

POST   /api/v1/auth/register     - User registration
POST   /api/v1/auth/login        - User login

Users

GET    /api/v1/users/contacts    - Get contacts list
GET    /api/v1/users/presence    - Get user online status
GET    /api/v1/users/search      - Search users

Signaling

GET    /api/v1/ws                - WebSocket connection

๐Ÿ› Troubleshooting

Physical Device Cannot Connect to Development Server

Issue: AxiosError: Network Error or Network timeout

Solution:

  1. Check ADB reverse port forwarding configuration

    adb reverse --list
    # Should show:
    # tcp:8080 tcp:8080
    # tcp:8081 tcp:8081
    
    # If missing, reconfigure
    adb reverse tcp:8080 tcp:8080
    adb reverse tcp:8081 tcp:8081
  2. Verify backend service is running

    curl http://localhost:8080/api/v1/health
  3. Check frontend configuration

    cat mobile/src/config/index.ts
    # Should show API_HOST = "http://localhost:8080"
  4. Clear app data and restart

    adb shell pm clear com.allcallall.mobile
    # Scan Metro QR code again on physical device
  5. Run complete startup script

    bash mobile/scripts/dev-client-debug.sh

Metro Compilation Failed or Virtual Entry Point 404 Error

Issue: Unable to resolve module ./.expo/.virtual-metro-entry or compilation failed

Solution:

  1. Use automated script (Recommended - automatically handles virtual entry point)

    bash mobile/scripts/dev-client-debug.sh
  2. Manual cleanup and restart

    # Clear cache
    rm -rf mobile/node_modules/.cache /tmp/metro-*
    
    # Protect virtual entry point file (do NOT delete)
    ls -la mobile/.expo/.virtual-metro-entry.js
    
    # If virtual entry point file is missing, recreate it
    mkdir -p mobile/.expo
    cat > mobile/.expo/.virtual-metro-entry.js << 'EOF'

import { registerRootComponent } from 'expo'; import App from '../App'; registerRootComponent(App); EOF

Reinstall dependencies and restart

cd mobile npm install npm run start:dev-client


โš ๏ธ **Important**: `.virtual-metro-entry.js` is a required Metro virtual entry point file. **Never delete it**. Running the script will automatically protect it.

#### Backend Service Cannot Start or Email Cannot Be Sent

**Issue 1**: `failed to connect mysql`

**Solution**:
```bash
# Ensure database service is running
./scripts/development/start-services.sh

# Check MySQL connection
mysql -u allcallall -p allcallall_db -h localhost

# Verify Redis connection
redis-cli ping

Issue 2: Email cannot be sent or verification code not received

Solution:

# Check QQ Mail SMTP config
cat backend/configs/config.yaml | grep -A5 mail:

# Verify environment variable
echo $MAIL_PASSWORD

# Test email sending endpoint
curl -X POST http://localhost:8080/api/v1/email/send-verification-code \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]"}'

# Expected response: {"message":"verification code sent successfully"}

๐Ÿ“š Development Guide

Code Style

  • Go: Follow Effective Go
  • TypeScript: ESLint configuration standards
  • Kotlin: Android official style guide

Branch Strategy

  • main - Stable release version (single long-lived trunk)
  • feature/* - Feature branches (branched from main)
  • hotfix/* - Emergency fix branches (branched from main)

PR flow: open PRs from feature/* / hotfix/* directly to main (Trunk-based).

๐ŸŒ Offline Translation Feature

The offline translation feature enables real-time speech translation using local AI models, ensuring complete privacy and zero operational costs.

Key Technologies

  • Whisper-small (INT8): Speech Recognition
  • Opus-MT-en-zh (INT8): Text Translation
  • VITS: Text-to-Speech Synthesis
  • Total Size: ~264MB (INT8 quantized)
  • Performance: <500ms latency, >88% accuracy

Documentation

๐Ÿค Contributing

  1. Fork the project
  2. Create your feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

๐Ÿ“ License

MIT License - See the LICENSE file for details

๐Ÿ“ง Contact

๐Ÿ™ Acknowledgments

  • Pion WebRTC - WebRTC implementation

  • Expo - React Native development framework

  • Gin - Web framework

  • All contributors for their support and help

  • Pion WebRTC - WebRTC ๅฎž็Žฐ

  • Expo - React Native ๅผ€ๅ‘ๆก†ๆžถ

  • Gin - Web ๆก†ๆžถ

  • ๆ‰€ๆœ‰่ดก็Œฎ่€…็š„ๆ”ฏๆŒไธŽๅธฎๅŠฉ

About

Final Year Project

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors